00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "pgTop.h"
00016 #include "pgMouseWatcherGroup.h"
00017 #include "pgCullTraverser.h"
00018 #include "cullBinAttrib.h"
00019
00020 #include "omniBoundingVolume.h"
00021
00022 TypeHandle PGTop::_type_handle;
00023
00024
00025
00026
00027
00028
00029 PGTop::
00030 PGTop(const string &name) :
00031 PandaNode(name)
00032 {
00033 set_cull_callback();
00034
00035 _start_sort = 0;
00036
00037
00038
00039 set_internal_bounds(new OmniBoundingVolume());
00040 set_final(true);
00041
00042
00043
00044
00045
00046 set_attrib(CullBinAttrib::make("unsorted", 0));
00047 }
00048
00049
00050
00051
00052
00053
00054 PGTop::
00055 ~PGTop() {
00056 set_mouse_watcher((MouseWatcher *)NULL);
00057 }
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 PandaNode *PGTop::
00068 make_copy() const {
00069 return new PGTop(*this);
00070 }
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097 bool PGTop::
00098 cull_callback(CullTraverser *trav, CullTraverserData &data) {
00099
00100
00101 PT(PGMouseWatcherGroup) old_watcher_group;
00102 if (_watcher_group != (PGMouseWatcherGroup *)NULL) {
00103 _watcher_group->clear_top(this);
00104 old_watcher_group = _watcher_group;
00105 _watcher_group = new PGMouseWatcherGroup(this);
00106 }
00107
00108
00109
00110
00111
00112 PGCullTraverser pg_trav(this, trav);
00113 pg_trav.local_object();
00114 pg_trav._sort_index = _start_sort;
00115 pg_trav.traverse_below(data);
00116 pg_trav.end_traverse();
00117
00118
00119
00120
00121
00122
00123 if (_watcher_group != (PGMouseWatcherGroup *)NULL) {
00124 nassertr(_watcher != (MouseWatcher *)NULL, false);
00125 _watcher->replace_group(old_watcher_group, _watcher_group);
00126 }
00127
00128
00129 return false;
00130 }
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142 bool PGTop::
00143 is_renderable() const {
00144
00145
00146
00147 return true;
00148 }
00149
00150
00151
00152
00153
00154
00155
00156
00157 void PGTop::
00158 set_mouse_watcher(MouseWatcher *watcher) {
00159 if (_watcher_group != (PGMouseWatcherGroup *)NULL) {
00160 _watcher_group->clear_top(this);
00161 }
00162 if (_watcher != (MouseWatcher *)NULL) {
00163 _watcher->remove_group(_watcher_group);
00164 }
00165
00166 _watcher = watcher;
00167 _watcher_group = (PGMouseWatcherGroup *)NULL;
00168
00169 if (_watcher != (MouseWatcher *)NULL) {
00170 _watcher_group = new PGMouseWatcherGroup(this);
00171 _watcher->add_group(_watcher_group);
00172 }
00173 }