瀏覽代碼

pgraph pgui

David Rose 24 年之前
父節點
當前提交
ac8ab3b258

+ 10 - 2
direct/src/ffi/FFIRename.py

@@ -104,7 +104,6 @@ pgraphClassRenameDictionary = {
     'DataNode'                  : 'SpDataNode',
     'DataNode'                  : 'SpDataNode',
     'DialNode'                  : 'SpDialNode',
     'DialNode'                  : 'SpDialNode',
     'DriveInterface'            : 'SpDriveInterface',
     'DriveInterface'            : 'SpDriveInterface',
-    'DriverInterface'           : 'SpDriveInterface',
     'GeomNode'                  : 'SpGeomNode',
     'GeomNode'                  : 'SpGeomNode',
     'LODNode'                   : 'SpLODNode',
     'LODNode'                   : 'SpLODNode',
     'LensNode'                  : 'SpLensNode',
     'LensNode'                  : 'SpLensNode',
@@ -113,6 +112,11 @@ pgraphClassRenameDictionary = {
     'MouseWatcher'              : 'SpMouseWatcher',
     'MouseWatcher'              : 'SpMouseWatcher',
     'NodePath'                  : 'SpNodePath',
     'NodePath'                  : 'SpNodePath',
     'NodePathCollection'        : 'SpNodePathCollection',
     'NodePathCollection'        : 'SpNodePathCollection',
+    'PGTop'                     : 'SpPGTop',
+    'PGItem'                    : 'SpPGItem',
+    'PGButton'                  : 'SpPGButton',
+    'PGEntry'                   : 'SpPGEntry',
+    'PGWaitBar'                 : 'SpPGWaitBar',
     'PartBundleNode'            : 'SpPartBundleNode',
     'PartBundleNode'            : 'SpPartBundleNode',
     'SequenceNode'              : 'SpSequenceNode',
     'SequenceNode'              : 'SpSequenceNode',
     'TextNode'                  : 'SpTextNode',
     'TextNode'                  : 'SpTextNode',
@@ -132,7 +136,6 @@ pgraphClassRenameDictionary = {
     'QpDataNode'                : 'DataNode',
     'QpDataNode'                : 'DataNode',
     'QpDialNode'                : 'DialNode',
     'QpDialNode'                : 'DialNode',
     'QpDriveInterface'          : 'DriveInterface',
     'QpDriveInterface'          : 'DriveInterface',
-    'QpDriverInterface'         : 'DriveInterface',
     'QpGeomNode'                : 'GeomNode',
     'QpGeomNode'                : 'GeomNode',
     'QpLODNode'                 : 'LODNode',
     'QpLODNode'                 : 'LODNode',
     'QpLensNode'                : 'LensNode',
     'QpLensNode'                : 'LensNode',
@@ -141,6 +144,11 @@ pgraphClassRenameDictionary = {
     'QpMouseWatcher'            : 'MouseWatcher',
     'QpMouseWatcher'            : 'MouseWatcher',
     'QpNodePath'                : 'NodePath',
     'QpNodePath'                : 'NodePath',
     'QpNodePathCollection'      : 'NodePathCollection',
     'QpNodePathCollection'      : 'NodePathCollection',
+    'QpPGTop'                   : 'PGTop',
+    'QpPGItem'                  : 'PGItem',
+    'QpPGButton'                : 'PGButton',
+    'QpPGEntry'                 : 'PGEntry',
+    'QpPGWaitBar'               : 'PGWaitBar',
     'QpPartBundleNode'          : 'PartBundleNode',
     'QpPartBundleNode'          : 'PartBundleNode',
     'QpSequenceNode'            : 'SequenceNode',
     'QpSequenceNode'            : 'SequenceNode',
     'QpTextNode'                : 'TextNode',
     'QpTextNode'                : 'TextNode',

+ 3 - 4
direct/src/showbase/qpShowBase.py

@@ -255,8 +255,7 @@ class ShowBase:
         # matching that of a traditional PC screen (w / h) = (4 / 3)
         # matching that of a traditional PC screen (w / h) = (4 / 3)
         self.aspectRatio = self.config.GetFloat('aspect-ratio', (4.0 / 3.0))
         self.aspectRatio = self.config.GetFloat('aspect-ratio', (4.0 / 3.0))
 
 
-        #self.aspect2d = self.render2d.attachNewNode(PGTop("aspect2d"))
-        self.aspect2d = self.render2d.attachNewNode("aspect2d")
+        self.aspect2d = self.render2d.attachNewNode(PGTop("aspect2d"))
         self.aspect2d.setScale(1.0 / self.aspectRatio, 1.0, 1.0)
         self.aspect2d.setScale(1.0 / self.aspectRatio, 1.0, 1.0)
 
 
         # It's important to know the bounds of the aspect2d screen.
         # It's important to know the bounds of the aspect2d screen.
@@ -359,8 +358,8 @@ class ShowBase:
         self.buttonThrower.node().setModifierButtons(mods)
         self.buttonThrower.node().setModifierButtons(mods)
 
 
         # Tell the gui system about our new mouse watcher.
         # Tell the gui system about our new mouse watcher.
-        #self.aspect2d.node().setMouseWatcher(self.mouseWatcherNode)
-        #self.mouseWatcherNode.addRegion(PGMouseWatcherBackground())
+        self.aspect2d.node().setMouseWatcher(self.mouseWatcherNode)
+        self.mouseWatcherNode.addRegion(PGMouseWatcherBackground())
 
 
     def enableSoftwareMousePointer(self):
     def enableSoftwareMousePointer(self):
         """enableSoftwareMousePointer(self)
         """enableSoftwareMousePointer(self)

+ 1 - 1
panda/src/char/qpcharacter.cxx

@@ -142,7 +142,7 @@ has_cull_callback() const {
 //               visible, or false if it should be culled.
 //               visible, or false if it should be culled.
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 bool qpCharacter::
 bool qpCharacter::
-cull_callback(CullTraverserData &) {
+cull_callback(qpCullTraverser *, CullTraverserData &) {
   // For now, we update the character during the cull traversal; this
   // For now, we update the character during the cull traversal; this
   // prevents us from needlessly updating characters that aren't in
   // prevents us from needlessly updating characters that aren't in
   // the view frustum.  We may need a better way to do this
   // the view frustum.  We may need a better way to do this

+ 1 - 1
panda/src/char/qpcharacter.h

@@ -49,7 +49,7 @@ public:
 
 
   virtual bool safe_to_transform() const;
   virtual bool safe_to_transform() const;
   virtual bool has_cull_callback() const;
   virtual bool has_cull_callback() const;
-  virtual bool cull_callback(CullTraverserData &data);
+  virtual bool cull_callback(qpCullTraverser *trav, CullTraverserData &data);
 
 
 PUBLISHED:
 PUBLISHED:
   INLINE CharacterJointBundle *get_bundle() const;
   INLINE CharacterJointBundle *get_bundle() const;

+ 2 - 0
panda/src/pgraph/config_pgraph.cxx

@@ -27,6 +27,7 @@
 #include "cullBinAttrib.h"
 #include "cullBinAttrib.h"
 #include "cullBinBackToFront.h"
 #include "cullBinBackToFront.h"
 #include "cullBinUnsorted.h"
 #include "cullBinUnsorted.h"
+#include "qpcullTraverser.h"
 #include "cullableObject.h"
 #include "cullableObject.h"
 #include "decalAttrib.h"
 #include "decalAttrib.h"
 #include "depthTestAttrib.h"
 #include "depthTestAttrib.h"
@@ -87,6 +88,7 @@ init_libpgraph() {
   CullBinAttrib::init_type();
   CullBinAttrib::init_type();
   CullBinBackToFront::init_type();
   CullBinBackToFront::init_type();
   CullBinUnsorted::init_type();
   CullBinUnsorted::init_type();
+  qpCullTraverser::init_type();
   CullableObject::init_type();
   CullableObject::init_type();
   DecalAttrib::init_type();
   DecalAttrib::init_type();
   DepthTestAttrib::init_type();
   DepthTestAttrib::init_type();

+ 3 - 7
panda/src/pgraph/cullTraverserData.I

@@ -27,14 +27,12 @@ CullTraverserData(const TransformState *render_transform,
                   const TransformState *net_transform,
                   const TransformState *net_transform,
                   const RenderState *state,
                   const RenderState *state,
                   GeometricBoundingVolume *view_frustum,
                   GeometricBoundingVolume *view_frustum,
-                  GeometricBoundingVolume *guard_band,
-                  const TransformState *camera_transform) :
+                  GeometricBoundingVolume *guard_band) :
   _render_transform(render_transform),
   _render_transform(render_transform),
   _net_transform(net_transform),
   _net_transform(net_transform),
   _state(state),
   _state(state),
   _view_frustum(view_frustum),
   _view_frustum(view_frustum),
-  _guard_band(guard_band),
-  _camera_transform(camera_transform)
+  _guard_band(guard_band)
 {
 {
 }
 }
 
 
@@ -49,8 +47,7 @@ CullTraverserData(const CullTraverserData &copy) :
   _net_transform(copy._net_transform),
   _net_transform(copy._net_transform),
   _state(copy._state),
   _state(copy._state),
   _view_frustum(copy._view_frustum),
   _view_frustum(copy._view_frustum),
-  _guard_band(copy._guard_band),
-  _camera_transform(copy._camera_transform)
+  _guard_band(copy._guard_band)
 {
 {
 }
 }
 
 
@@ -66,7 +63,6 @@ operator = (const CullTraverserData &copy) {
   _state = copy._state;
   _state = copy._state;
   _view_frustum = copy._view_frustum;
   _view_frustum = copy._view_frustum;
   _guard_band = copy._guard_band;
   _guard_band = copy._guard_band;
-  _camera_transform = copy._camera_transform;
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////

+ 3 - 2
panda/src/pgraph/cullTraverserData.cxx

@@ -17,6 +17,7 @@
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 
 
 #include "cullTraverserData.h"
 #include "cullTraverserData.h"
+#include "qpcullTraverser.h"
 #include "config_pgraph.h"
 #include "config_pgraph.h"
 #include "pandaNode.h"
 #include "pandaNode.h"
 #include "colorAttrib.h"
 #include "colorAttrib.h"
@@ -30,7 +31,7 @@
 //               billboards, etc.
 //               billboards, etc.
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 void CullTraverserData::
 void CullTraverserData::
-apply_transform_and_state(PandaNode *node) {
+apply_transform_and_state(qpCullTraverser *trav, PandaNode *node) {
   const TransformState *node_transform = node->get_transform();
   const TransformState *node_transform = node->get_transform();
   if (!node_transform->is_identity()) {
   if (!node_transform->is_identity()) {
     _render_transform = _render_transform->compose(node_transform);
     _render_transform = _render_transform->compose(node_transform);
@@ -73,7 +74,7 @@ apply_transform_and_state(PandaNode *node) {
   if (billboard != (const BillboardAttrib *)NULL) {
   if (billboard != (const BillboardAttrib *)NULL) {
     // Got to apply a billboard transform here.
     // Got to apply a billboard transform here.
     CPT(TransformState) billboard_transform = 
     CPT(TransformState) billboard_transform = 
-      billboard->do_billboard(_net_transform, _camera_transform);
+      billboard->do_billboard(_net_transform, trav->get_camera_transform());
     _render_transform = _render_transform->compose(billboard_transform);
     _render_transform = _render_transform->compose(billboard_transform);
     _net_transform = _net_transform->compose(billboard_transform);
     _net_transform = _net_transform->compose(billboard_transform);
 
 

+ 3 - 9
panda/src/pgraph/cullTraverserData.h

@@ -28,6 +28,7 @@
 #include "drawMask.h"
 #include "drawMask.h"
 
 
 class PandaNode;
 class PandaNode;
+class qpCullTraverser;
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //       Class : CullTraverserData
 //       Class : CullTraverserData
@@ -49,14 +50,13 @@ public:
                            const TransformState *net_transform,
                            const TransformState *net_transform,
                            const RenderState *state,
                            const RenderState *state,
                            GeometricBoundingVolume *view_frustum,
                            GeometricBoundingVolume *view_frustum,
-                           GeometricBoundingVolume *guard_band,
-                           const TransformState *camera_transform);
+                           GeometricBoundingVolume *guard_band);
   INLINE CullTraverserData(const CullTraverserData &copy);
   INLINE CullTraverserData(const CullTraverserData &copy);
   INLINE void operator = (const CullTraverserData &copy);
   INLINE void operator = (const CullTraverserData &copy);
   INLINE ~CullTraverserData();
   INLINE ~CullTraverserData();
 
 
   INLINE bool is_in_view(PandaNode *node, const DrawMask &camera_mask);
   INLINE bool is_in_view(PandaNode *node, const DrawMask &camera_mask);
-  void apply_transform_and_state(PandaNode *node);
+  void apply_transform_and_state(qpCullTraverser *trav, PandaNode *node);
 
 
   CPT(TransformState) _render_transform;
   CPT(TransformState) _render_transform;
   CPT(TransformState) _net_transform;
   CPT(TransformState) _net_transform;
@@ -64,12 +64,6 @@ public:
   PT(GeometricBoundingVolume) _view_frustum;
   PT(GeometricBoundingVolume) _view_frustum;
   PT(GeometricBoundingVolume) _guard_band;
   PT(GeometricBoundingVolume) _guard_band;
 
 
-  // This one is not modified during traversal, so it doesn't need to
-  // be reference counted (we trust the original owner of this pointer
-  // to reference count it and hold it during the lifetime of the
-  // traversal).
-  const TransformState *_camera_transform;
-
 private:
 private:
   bool is_in_view_impl(PandaNode *node);
   bool is_in_view_impl(PandaNode *node);
   static CPT(RenderState) get_fake_view_frustum_cull_effect();
   static CPT(RenderState) get_fake_view_frustum_cull_effect();

+ 1 - 1
panda/src/pgraph/pandaNode.cxx

@@ -470,7 +470,7 @@ has_cull_callback() const {
 //               visible, or false if it should be culled.
 //               visible, or false if it should be culled.
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 bool PandaNode::
 bool PandaNode::
-cull_callback(CullTraverserData &) {
+cull_callback(qpCullTraverser *, CullTraverserData &) {
   return true;
   return true;
 }
 }
 
 

+ 2 - 1
panda/src/pgraph/pandaNode.h

@@ -38,6 +38,7 @@
 #include "notify.h"
 #include "notify.h"
 
 
 class qpNodePathComponent;
 class qpNodePathComponent;
+class qpCullTraverser;
 class CullTraverserData;
 class CullTraverserData;
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -69,7 +70,7 @@ public:
   virtual PandaNode *combine_with(PandaNode *other); 
   virtual PandaNode *combine_with(PandaNode *other); 
 
 
   virtual bool has_cull_callback() const;
   virtual bool has_cull_callback() const;
-  virtual bool cull_callback(CullTraverserData &data);
+  virtual bool cull_callback(qpCullTraverser *trav, CullTraverserData &data);
   virtual bool has_selective_visibility() const;
   virtual bool has_selective_visibility() const;
   virtual int get_first_visible_child() const;
   virtual int get_first_visible_child() const;
   virtual int get_next_visible_child(int n) const;
   virtual int get_next_visible_child(int n) const;

+ 104 - 1
panda/src/pgraph/qpcullTraverser.I

@@ -29,6 +29,18 @@ set_initial_state(const RenderState *initial_state) {
   _initial_state = initial_state;
   _initial_state = initial_state;
 }
 }
 
 
+////////////////////////////////////////////////////////////////////
+//     Function: qpCullTraverser::get_initial_state
+//       Access: Public
+//  Description: Returns the initial RenderState at the top of the
+//               scene graph we are traversing, or the empty state if
+//               the initial state was never set.
+////////////////////////////////////////////////////////////////////
+INLINE const RenderState *qpCullTraverser::
+get_initial_state() const {
+  return _initial_state;
+}
+
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: qpCullTraverser::set_camera_mask
 //     Function: qpCullTraverser::set_camera_mask
 //       Access: Public
 //       Access: Public
@@ -41,6 +53,17 @@ set_camera_mask(const DrawMask &camera_mask) {
   _camera_mask = camera_mask;
   _camera_mask = camera_mask;
 }
 }
 
 
+////////////////////////////////////////////////////////////////////
+//     Function: qpCullTraverser::get_camera_mask
+//       Access: Public
+//  Description: Returns the visibility mask from the camera viewing
+//               the scene.
+////////////////////////////////////////////////////////////////////
+INLINE const DrawMask &qpCullTraverser::
+get_camera_mask() const {
+  return _camera_mask;
+}
+
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: qpCullTraverser::set_camera_transform
 //     Function: qpCullTraverser::set_camera_transform
 //       Access: Public
 //       Access: Public
@@ -54,6 +77,19 @@ set_camera_transform(const TransformState *camera_transform) {
   _camera_transform = camera_transform;
   _camera_transform = camera_transform;
 }
 }
 
 
+////////////////////////////////////////////////////////////////////
+//     Function: qpCullTraverser::get_camera_transform
+//       Access: Public
+//  Description: Returns the position of the camera relative to the
+//               starting node, without any compensating
+//               coordinate-system transforms that might have been
+//               introduced for the purposes of rendering.
+////////////////////////////////////////////////////////////////////
+INLINE const TransformState *qpCullTraverser::
+get_camera_transform() const {
+  return _camera_transform;
+}
+
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: qpCullTraverser::set_render_transform
 //     Function: qpCullTraverser::set_render_transform
 //       Access: Public
 //       Access: Public
@@ -66,11 +102,29 @@ set_render_transform(const TransformState *render_transform) {
   _render_transform = render_transform;
   _render_transform = render_transform;
 }
 }
 
 
+////////////////////////////////////////////////////////////////////
+//     Function: qpCullTraverser::get_render_transform
+//       Access: Public
+//  Description: Returns the position of the starting node relative
+//               to the camera, pretransformed as appropriate for
+//               rendering.
+//
+//               Note that this value is always the position of the
+//               starting node, not the current node, even if it is
+//               sampled during a traversal.  To get the render
+//               transform of the current node check in the current
+//               CullTraverserData.
+////////////////////////////////////////////////////////////////////
+INLINE const TransformState *qpCullTraverser::
+get_render_transform() const {
+  return _render_transform;
+}
+
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: qpCullTraverser::set_view_frustum
 //     Function: qpCullTraverser::set_view_frustum
 //       Access: Public
 //       Access: Public
 //  Description: Specifies the bounding volume that corresponds to the
 //  Description: Specifies the bounding volume that corresponds to the
-//               viewing frustum.  Any primitives that fall entirely
+//               view frustum.  Any primitives that fall entirely
 //               outside of this volume are not drawn.
 //               outside of this volume are not drawn.
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 INLINE void qpCullTraverser::
 INLINE void qpCullTraverser::
@@ -78,6 +132,25 @@ set_view_frustum(GeometricBoundingVolume *view_frustum) {
   _view_frustum = view_frustum;
   _view_frustum = view_frustum;
 }
 }
 
 
+////////////////////////////////////////////////////////////////////
+//     Function: qpCullTraverser::get_view_frustum
+//       Access: Public
+//  Description: Returns the bounding volume that corresponds to the
+//               view frustum, or NULL if the view frustum is not in
+//               use or has not been set.
+//
+//               Note that the view frustum returned here is always in
+//               the coordinate space of the starting node, not the
+//               current node, even if it is sampled during a
+//               traversal.  To get the view frustum in the current
+//               node's coordinate space, check in the current
+//               CullTraverserData.
+////////////////////////////////////////////////////////////////////
+INLINE GeometricBoundingVolume *qpCullTraverser::
+get_view_frustum() const {
+  return _view_frustum;
+}
+
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: qpCullTraverser::set_guard_band
 //     Function: qpCullTraverser::set_guard_band
 //       Access: Public
 //       Access: Public
@@ -99,6 +172,25 @@ set_guard_band(GeometricBoundingVolume *guard_band) {
   _guard_band = guard_band;
   _guard_band = guard_band;
 }
 }
 
 
+////////////////////////////////////////////////////////////////////
+//     Function: qpCullTraverser::get_guard_band
+//       Access: Public
+//  Description: Returns the bounding volume that corresponds to the
+//               guard band, or NULL if the guard band is not in
+//               use or has not been set.
+//
+//               Note that the guard band returned here is always in
+//               the coordinate space of the starting node, not the
+//               current node, even if it is sampled during a
+//               traversal.  To get the guard band in the current
+//               node's coordinate space, check in the current
+//               CullTraverserData.
+////////////////////////////////////////////////////////////////////
+INLINE GeometricBoundingVolume *qpCullTraverser::
+get_guard_band() const {
+  return _guard_band;
+}
+
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: qpCullTraverser::set_cull_handler
 //     Function: qpCullTraverser::set_cull_handler
 //       Access: Public
 //       Access: Public
@@ -109,3 +201,14 @@ INLINE void qpCullTraverser::
 set_cull_handler(CullHandler *cull_handler) {
 set_cull_handler(CullHandler *cull_handler) {
   _cull_handler = cull_handler;
   _cull_handler = cull_handler;
 }
 }
+
+////////////////////////////////////////////////////////////////////
+//     Function: qpCullTraverser::get_cull_handler
+//       Access: Public
+//  Description: Returns the object that will receive the culled
+//               Geoms.
+////////////////////////////////////////////////////////////////////
+INLINE CullHandler *qpCullTraverser::
+get_cull_handler() const {
+  return _cull_handler;
+}

+ 73 - 42
panda/src/pgraph/qpcullTraverser.cxx

@@ -26,6 +26,9 @@
 #include "qpgeomNode.h"
 #include "qpgeomNode.h"
 #include "config_pgraph.h"
 #include "config_pgraph.h"
 
 
+
+TypeHandle qpCullTraverser::_type_handle;
+
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: qpCullTraverser::Constructor
 //     Function: qpCullTraverser::Constructor
 //       Access: Public
 //       Access: Public
@@ -40,6 +43,23 @@ qpCullTraverser() {
   _cull_handler = (CullHandler *)NULL;
   _cull_handler = (CullHandler *)NULL;
 }
 }
 
 
+////////////////////////////////////////////////////////////////////
+//     Function: qpCullTraverser::Copy Constructor
+//       Access: Public
+//  Description: 
+////////////////////////////////////////////////////////////////////
+qpCullTraverser::
+qpCullTraverser(const qpCullTraverser &copy) :
+  _initial_state(copy._initial_state),
+  _camera_mask(copy._camera_mask),
+  _camera_transform(copy._camera_transform),
+  _render_transform(copy._render_transform),
+  _view_frustum(copy._view_frustum),
+  _guard_band(copy._guard_band),
+  _cull_handler(copy._cull_handler)
+{
+}
+
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: qpCullTraverser::traverse
 //     Function: qpCullTraverser::traverse
 //       Access: Public
 //       Access: Public
@@ -50,20 +70,19 @@ traverse(PandaNode *root) {
   nassertv(_cull_handler != (CullHandler *)NULL);
   nassertv(_cull_handler != (CullHandler *)NULL);
 
 
   CullTraverserData data(_render_transform, TransformState::make_identity(),
   CullTraverserData data(_render_transform, TransformState::make_identity(),
-                         _initial_state, _view_frustum, _guard_band,
-                         _camera_transform);
-  r_traverse(root, data);
+                         _initial_state, _view_frustum, _guard_band);
+  traverse(root, data);
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: qpCullTraverser::r_traverse
-//       Access: Private
-//  Description: The recursive traversal implementation.
+//     Function: qpCullTraverser::traverse
+//       Access: Public
+//  Description: Traverses from the indicated node with the given
+//               data, which has not yet been converted into the
+//               node's space.
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 void qpCullTraverser::
 void qpCullTraverser::
-r_traverse(PandaNode *node, const CullTraverserData &data) {
-  CullTraverserData next_data(data);
-
+traverse(PandaNode *node, const CullTraverserData &data) {
   // Most nodes will have no transform or state, and will not
   // Most nodes will have no transform or state, and will not
   // contain decals or require a special cull callback.  As an
   // contain decals or require a special cull callback.  As an
   // optimization, we should tag nodes with these properties as
   // optimization, we should tag nodes with these properties as
@@ -74,45 +93,58 @@ r_traverse(PandaNode *node, const CullTraverserData &data) {
     return;
     return;
   }
   }
 
 
+  CullTraverserData next_data(data);
   if (next_data.is_in_view(node, _camera_mask)) {
   if (next_data.is_in_view(node, _camera_mask)) {
-    next_data.apply_transform_and_state(node);
+    next_data.apply_transform_and_state(this, node);
 
 
     if (node->has_cull_callback()) {
     if (node->has_cull_callback()) {
-      if (!node->cull_callback(next_data)) {
+      if (!node->cull_callback(this, next_data)) {
         return;
         return;
       }
       }
     }
     }
 
 
-    const RenderState *node_state = node->get_state();
-    if (node_state->has_decal()) {
-      start_decal(node, next_data);
+    traverse_below(node, next_data);
+  }
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: qpCullTraverser::traverse_below
+//       Access: Public
+//  Description: Traverses all the children of the indicated node,
+//               with the given data, which been converted into the
+//               node's space.
+////////////////////////////////////////////////////////////////////
+void qpCullTraverser::
+traverse_below(PandaNode *node, const CullTraverserData &data) {
+  const RenderState *node_state = node->get_state();
+  if (node_state->has_decal()) {
+    start_decal(node, data);
+    
+  } else {
+    if (node->is_geom_node()) {
+      qpGeomNode *geom_node = DCAST(qpGeomNode, node);
       
       
-    } else {
-      if (node->is_geom_node()) {
-        qpGeomNode *geom_node = DCAST(qpGeomNode, node);
-        
-        // Get all the Geoms, with no decalling.
-        int num_geoms = geom_node->get_num_geoms();
-        for (int i = 0; i < num_geoms; i++) {
-          CullableObject *object = new CullableObject(next_data, geom_node, i);
-          _cull_handler->record_object(object);
-        }
+      // Get all the Geoms, with no decalling.
+      int num_geoms = geom_node->get_num_geoms();
+      for (int i = 0; i < num_geoms; i++) {
+        CullableObject *object = new CullableObject(data, geom_node, i);
+        _cull_handler->record_object(object);
       }
       }
-
-      // Now visit all the node's children.
-      PandaNode::Children cr = node->get_children();
-      int num_children = cr.get_num_children();
-      if (node->has_selective_visibility()) {
-        int i = node->get_first_visible_child();
-        while (i < num_children) {
-          r_traverse(cr.get_child(i), next_data);
-          i = node->get_next_visible_child(i);
-        }
-
-      } else {
-        for (int i = 0; i < num_children; i++) {
-          r_traverse(cr.get_child(i), next_data);
-        }
+    }
+    
+    // Now visit all the node's children.
+    PandaNode::Children cr = node->get_children();
+    int num_children = cr.get_num_children();
+    if (node->has_selective_visibility()) {
+      int i = node->get_first_visible_child();
+      while (i < num_children) {
+        traverse(cr.get_child(i), data);
+        i = node->get_next_visible_child(i);
+      }
+      
+    } else {
+      for (int i = 0; i < num_children; i++) {
+        traverse(cr.get_child(i), data);
       }
       }
     }
     }
   }
   }
@@ -188,15 +220,14 @@ start_decal(PandaNode *node, const CullTraverserData &data) {
 CullableObject *qpCullTraverser::
 CullableObject *qpCullTraverser::
 r_get_decals(PandaNode *node, const CullTraverserData &data,
 r_get_decals(PandaNode *node, const CullTraverserData &data,
              CullableObject *decals) {
              CullableObject *decals) {
-  CullTraverserData next_data(data);
-
   if (node->get_transform()->is_invalid()) {
   if (node->get_transform()->is_invalid()) {
     // If the transform is invalid, forget it.
     // If the transform is invalid, forget it.
     return decals;
     return decals;
   }
   }
 
 
+  CullTraverserData next_data(data);
   if (next_data.is_in_view(node, _camera_mask)) {
   if (next_data.is_in_view(node, _camera_mask)) {
-    next_data.apply_transform_and_state(node);
+    next_data.apply_transform_and_state(this, node);
 
 
     // First, visit all of the node's children.
     // First, visit all of the node's children.
     PandaNode::Children cr = node->get_children();
     PandaNode::Children cr = node->get_children();

+ 35 - 2
panda/src/pgraph/qpcullTraverser.h

@@ -26,6 +26,7 @@
 #include "geometricBoundingVolume.h"
 #include "geometricBoundingVolume.h"
 #include "pointerTo.h"
 #include "pointerTo.h"
 #include "drawMask.h"
 #include "drawMask.h"
+#include "typedObject.h"
 
 
 class PandaNode;
 class PandaNode;
 class CullHandler;
 class CullHandler;
@@ -40,22 +41,37 @@ class CullableObject;
 //               Each renderable Geom encountered is passed along with
 //               Each renderable Geom encountered is passed along with
 //               its associated RenderState to the CullHandler object.
 //               its associated RenderState to the CullHandler object.
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-class EXPCL_PANDA qpCullTraverser {
+class EXPCL_PANDA qpCullTraverser : public TypedObject {
 public:
 public:
   qpCullTraverser();
   qpCullTraverser();
+  qpCullTraverser(const qpCullTraverser &copy);
 
 
   INLINE void set_initial_state(const RenderState *initial_state);
   INLINE void set_initial_state(const RenderState *initial_state);
+  INLINE const RenderState *get_initial_state() const;
+
   INLINE void set_camera_mask(const DrawMask &draw_mask);
   INLINE void set_camera_mask(const DrawMask &draw_mask);
+  INLINE const DrawMask &get_camera_mask() const;
+
   INLINE void set_camera_transform(const TransformState *camera_transform);
   INLINE void set_camera_transform(const TransformState *camera_transform);
+  INLINE const TransformState *get_camera_transform() const;
+
   INLINE void set_render_transform(const TransformState *render_transform);
   INLINE void set_render_transform(const TransformState *render_transform);
+  INLINE const TransformState *get_render_transform() const;
+
   INLINE void set_view_frustum(GeometricBoundingVolume *view_frustum);
   INLINE void set_view_frustum(GeometricBoundingVolume *view_frustum);
+  INLINE GeometricBoundingVolume *get_view_frustum() const;
+
   INLINE void set_guard_band(GeometricBoundingVolume *guard_band);
   INLINE void set_guard_band(GeometricBoundingVolume *guard_band);
+  INLINE GeometricBoundingVolume *get_guard_band() const;
+
   INLINE void set_cull_handler(CullHandler *cull_handler);
   INLINE void set_cull_handler(CullHandler *cull_handler);
+  INLINE CullHandler *get_cull_handler() const;
 
 
   void traverse(PandaNode *root);
   void traverse(PandaNode *root);
+  void traverse(PandaNode *node, const CullTraverserData &data);
+  void traverse_below(PandaNode *node, const CullTraverserData &data);
 
 
 private:
 private:
-  void r_traverse(PandaNode *node, const CullTraverserData &data);
   void start_decal(PandaNode *node, const CullTraverserData &data);
   void start_decal(PandaNode *node, const CullTraverserData &data);
   CullableObject *r_get_decals(PandaNode *node,
   CullableObject *r_get_decals(PandaNode *node,
                                const CullTraverserData &data,
                                const CullTraverserData &data,
@@ -68,6 +84,23 @@ private:
   PT(GeometricBoundingVolume) _view_frustum;
   PT(GeometricBoundingVolume) _view_frustum;
   PT(GeometricBoundingVolume) _guard_band;
   PT(GeometricBoundingVolume) _guard_band;
   CullHandler *_cull_handler;
   CullHandler *_cull_handler;
+  
+public:
+  static TypeHandle get_class_type() {
+    return _type_handle;
+  }
+  static void init_type() {
+    TypedObject::init_type();
+    register_type(_type_handle, "qpCullTraverser",
+                  TypedObject::get_class_type());
+  }
+  virtual TypeHandle get_type() const {
+    return get_class_type();
+  }
+  virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
+
+private:
+  static TypeHandle _type_handle;
 };
 };
 
 
 #include "qpcullTraverser.I"
 #include "qpcullTraverser.I"

+ 3 - 2
panda/src/pgraph/qplodNode.cxx

@@ -18,6 +18,7 @@
 
 
 #include "qplodNode.h"
 #include "qplodNode.h"
 #include "cullTraverserData.h"
 #include "cullTraverserData.h"
+#include "qpcullTraverser.h"
 
 
 TypeHandle qpLODNode::_type_handle;
 TypeHandle qpLODNode::_type_handle;
 
 
@@ -114,7 +115,7 @@ has_cull_callback() const {
 //               visible, or false if it should be culled.
 //               visible, or false if it should be culled.
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 bool qpLODNode::
 bool qpLODNode::
-cull_callback(CullTraverserData &data) {
+cull_callback(qpCullTraverser *trav, CullTraverserData &data) {
   if (data._net_transform->is_singular()) {
   if (data._net_transform->is_singular()) {
     // If we're under a singular transform, we can't compute the LOD;
     // If we're under a singular transform, we can't compute the LOD;
     // select none of them instead.
     // select none of them instead.
@@ -126,7 +127,7 @@ cull_callback(CullTraverserData &data) {
 
 
     // Get the LOD center in camera space
     // Get the LOD center in camera space
     CPT(TransformState) rel_transform =
     CPT(TransformState) rel_transform =
-      data._net_transform->invert_compose(data._camera_transform);
+      data._net_transform->invert_compose(trav->get_camera_transform());
     LPoint3f center = cdata->_lod._center * rel_transform->get_mat();
     LPoint3f center = cdata->_lod._center * rel_transform->get_mat();
     
     
     // Determine which child to traverse
     // Determine which child to traverse

+ 1 - 1
panda/src/pgraph/qplodNode.h

@@ -42,7 +42,7 @@ public:
   virtual PandaNode *make_copy() const;
   virtual PandaNode *make_copy() const;
   virtual void xform(const LMatrix4f &mat);
   virtual void xform(const LMatrix4f &mat);
   virtual bool has_cull_callback() const;
   virtual bool has_cull_callback() const;
-  virtual bool cull_callback(CullTraverserData &data);
+  virtual bool cull_callback(qpCullTraverser *trav, CullTraverserData &data);
 
 
   virtual void output(ostream &out) const;
   virtual void output(ostream &out) const;
 
 

+ 2 - 1
panda/src/pgraph/qpsequenceNode.cxx

@@ -18,6 +18,7 @@
 
 
 #include "pandabase.h"
 #include "pandabase.h"
 #include "qpsequenceNode.h"
 #include "qpsequenceNode.h"
+#include "qpcullTraverser.h"
 
 
 TypeHandle qpSequenceNode::_type_handle;
 TypeHandle qpSequenceNode::_type_handle;
 
 
@@ -121,7 +122,7 @@ has_cull_callback() const {
 //               visible, or false if it should be culled.
 //               visible, or false if it should be culled.
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 bool qpSequenceNode::
 bool qpSequenceNode::
-cull_callback(CullTraverserData &) {
+cull_callback(qpCullTraverser *, CullTraverserData &) {
   select_child(get_visible_child());
   select_child(get_visible_child());
   return true;
   return true;
 }
 }

+ 1 - 1
panda/src/pgraph/qpsequenceNode.h

@@ -39,7 +39,7 @@ public:
   virtual PandaNode *make_copy() const;
   virtual PandaNode *make_copy() const;
 
 
   virtual bool has_cull_callback() const;
   virtual bool has_cull_callback() const;
-  virtual bool cull_callback(CullTraverserData &data);
+  virtual bool cull_callback(qpCullTraverser *trav, CullTraverserData &data);
 
 
 PUBLISHED:
 PUBLISHED:
   INLINE void set_cycle_rate(float cycle_rate);
   INLINE void set_cycle_rate(float cycle_rate);

+ 21 - 3
panda/src/pgui/Sources.pp

@@ -12,40 +12,58 @@
   #define SOURCES  \
   #define SOURCES  \
     config_pgui.h \
     config_pgui.h \
     pgButton.I pgButton.h \
     pgButton.I pgButton.h \
+    qppgButton.I qppgButton.h \
+    pgCullTraverser.I pgCullTraverser.h \
     pgEntry.I pgEntry.h \
     pgEntry.I pgEntry.h \
+    qppgEntry.I qppgEntry.h \
     pgMouseWatcherGroup.I pgMouseWatcherGroup.h \
     pgMouseWatcherGroup.I pgMouseWatcherGroup.h \
     pgMouseWatcherParameter.I pgMouseWatcherParameter.h \
     pgMouseWatcherParameter.I pgMouseWatcherParameter.h \
     pgFrameStyle.I pgFrameStyle.h \
     pgFrameStyle.I pgFrameStyle.h \
     pgItem.I pgItem.h \
     pgItem.I pgItem.h \
+    qppgItem.I qppgItem.h \
     pgMouseWatcherBackground.h \
     pgMouseWatcherBackground.h \
     pgMouseWatcherRegion.I pgMouseWatcherRegion.h \
     pgMouseWatcherRegion.I pgMouseWatcherRegion.h \
     pgTop.I pgTop.h \
     pgTop.I pgTop.h \
-    pgWaitBar.I pgWaitBar.h
+    qppgTop.I qppgTop.h \
+    pgWaitBar.I pgWaitBar.h \
+    qppgWaitBar.I qppgWaitBar.h
     
     
   #define INCLUDED_SOURCES  \
   #define INCLUDED_SOURCES  \
     config_pgui.cxx \
     config_pgui.cxx \
     pgButton.cxx \
     pgButton.cxx \
+    qppgButton.cxx \
+    pgCullTraverser.cxx \
     pgEntry.cxx \
     pgEntry.cxx \
+    qppgEntry.cxx \
     pgMouseWatcherGroup.cxx \
     pgMouseWatcherGroup.cxx \
     pgMouseWatcherParameter.cxx \
     pgMouseWatcherParameter.cxx \
     pgFrameStyle.cxx \
     pgFrameStyle.cxx \
     pgItem.cxx \
     pgItem.cxx \
+    qppgItem.cxx \
     pgMouseWatcherBackground.cxx \
     pgMouseWatcherBackground.cxx \
     pgMouseWatcherRegion.cxx \
     pgMouseWatcherRegion.cxx \
     pgTop.cxx \
     pgTop.cxx \
-    pgWaitBar.cxx
+    qppgTop.cxx \
+    pgWaitBar.cxx \
+    qppgWaitBar.cxx
 
 
   #define INSTALL_HEADERS \
   #define INSTALL_HEADERS \
     pgButton.I pgButton.h \
     pgButton.I pgButton.h \
+    qppgButton.I qppgButton.h \
+    pgCullTraverser.I pgCullTraverser.h \
     pgEntry.I pgEntry.h \
     pgEntry.I pgEntry.h \
+    qppgEntry.I qppgEntry.h \
     pgMouseWatcherGroup.I pgMouseWatcherGroup.h \
     pgMouseWatcherGroup.I pgMouseWatcherGroup.h \
     pgMouseWatcherParameter.I pgMouseWatcherParameter.h \
     pgMouseWatcherParameter.I pgMouseWatcherParameter.h \
     pgFrameStyle.I pgFrameStyle.h \
     pgFrameStyle.I pgFrameStyle.h \
     pgItem.I pgItem.h \
     pgItem.I pgItem.h \
+    qppgItem.I qppgItem.h \
     pgMouseWatcherBackground.h \
     pgMouseWatcherBackground.h \
     pgMouseWatcherRegion.I pgMouseWatcherRegion.h \
     pgMouseWatcherRegion.I pgMouseWatcherRegion.h \
     pgTop.I pgTop.h \
     pgTop.I pgTop.h \
-    pgWaitBar.I pgWaitBar.h
+    qppgTop.I qppgTop.h \
+    pgWaitBar.I pgWaitBar.h \
+    qppgWaitBar.I qppgWaitBar.h
     
     
 
 
   #define IGATESCAN all
   #define IGATESCAN all

+ 12 - 0
panda/src/pgui/config_pgui.cxx

@@ -18,14 +18,20 @@
 
 
 #include "config_pgui.h"
 #include "config_pgui.h"
 #include "pgButton.h"
 #include "pgButton.h"
+#include "qppgButton.h"
+#include "pgCullTraverser.h"
 #include "pgEntry.h"
 #include "pgEntry.h"
+#include "qppgEntry.h"
 #include "pgMouseWatcherParameter.h"
 #include "pgMouseWatcherParameter.h"
 #include "pgMouseWatcherGroup.h"
 #include "pgMouseWatcherGroup.h"
 #include "pgItem.h"
 #include "pgItem.h"
+#include "qppgItem.h"
 #include "pgMouseWatcherBackground.h"
 #include "pgMouseWatcherBackground.h"
 #include "pgMouseWatcherRegion.h"
 #include "pgMouseWatcherRegion.h"
 #include "pgTop.h"
 #include "pgTop.h"
+#include "qppgTop.h"
 #include "pgWaitBar.h"
 #include "pgWaitBar.h"
+#include "qppgWaitBar.h"
 
 
 #include "dconfig.h"
 #include "dconfig.h"
 
 
@@ -63,12 +69,18 @@ init_libpgui() {
   initialized = true;
   initialized = true;
 
 
   PGButton::init_type();
   PGButton::init_type();
+  qpPGButton::init_type();
+  PGCullTraverser::init_type();
   PGEntry::init_type();
   PGEntry::init_type();
+  qpPGEntry::init_type();
   PGMouseWatcherParameter::init_type();
   PGMouseWatcherParameter::init_type();
   PGMouseWatcherGroup::init_type();
   PGMouseWatcherGroup::init_type();
   PGItem::init_type();
   PGItem::init_type();
+  qpPGItem::init_type();
   PGMouseWatcherBackground::init_type();
   PGMouseWatcherBackground::init_type();
   PGMouseWatcherRegion::init_type();
   PGMouseWatcherRegion::init_type();
   PGTop::init_type();
   PGTop::init_type();
+  qpPGTop::init_type();
   PGWaitBar::init_type();
   PGWaitBar::init_type();
+  qpPGWaitBar::init_type();
 }
 }

+ 484 - 1
panda/src/pgui/pgFrameStyle.cxx

@@ -19,11 +19,15 @@
 #include "pgFrameStyle.h"
 #include "pgFrameStyle.h"
 #include "geomTristrip.h"
 #include "geomTristrip.h"
 #include "geomTrifan.h"
 #include "geomTrifan.h"
+#include "qpgeomNode.h"
+#include "pandaNode.h"
+#include "transparencyAttrib.h"
+#include "pointerTo.h"
+
 #include "geomNode.h"
 #include "geomNode.h"
 #include "transparencyProperty.h"
 #include "transparencyProperty.h"
 #include "transparencyTransition.h"
 #include "transparencyTransition.h"
 #include "renderRelation.h"
 #include "renderRelation.h"
-#include "pointerTo.h"
 
 
 ostream &
 ostream &
 operator << (ostream &out, PGFrameStyle::Type type) {
 operator << (ostream &out, PGFrameStyle::Type type) {
@@ -157,6 +161,58 @@ generate_into(Node *node, const LVecBase4f &frame) {
   return arc;
   return arc;
 }
 }
 
 
+////////////////////////////////////////////////////////////////////
+//     Function: PGFrameStyle::generate_into
+//       Access: Public
+//  Description: Generates geometry representing a frame of the
+//               indicated size, and parents it to the indicated node,
+//               with a scene graph sort order of -1.
+//
+//               The return value is the generated node, if any, or
+//               NULL if nothing is generated.
+////////////////////////////////////////////////////////////////////
+PandaNode *PGFrameStyle::
+generate_into(PandaNode *node, const LVecBase4f &frame) {
+  PT(PandaNode) new_node;
+
+  switch (_type) {
+  case T_none:
+    return (PandaNode *)NULL;
+
+  case T_flat:
+    new_node = qpgenerate_flat_geom(frame);
+    break;
+
+  case T_bevel_out:
+    new_node = qpgenerate_bevel_geom(frame, false);
+    break;
+
+  case T_bevel_in:
+    new_node = qpgenerate_bevel_geom(frame, true);
+    break;
+
+  case T_groove:
+    new_node = qpgenerate_groove_geom(frame, true);
+    break;
+
+  case T_ridge:
+    new_node = qpgenerate_groove_geom(frame, false);
+    break;
+
+  default:
+    break;
+  }
+
+  if (new_node != (PandaNode *)NULL && _color[3] != 1.0f) {
+    // We've got some alpha on the color; we need transparency.
+    new_node->set_attrib(TransparencyAttrib::make(TransparencyAttrib::M_alpha));
+  }
+
+  // Adding the node to the parent keeps the reference count.
+  node->add_child(new_node);
+  return new_node;
+}
+
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: PGFrameStyle::generate_flat_geom
 //     Function: PGFrameStyle::generate_flat_geom
 //       Access: Private
 //       Access: Private
@@ -583,3 +639,430 @@ generate_groove_geom(const LVecBase4f &frame, bool in) {
   
   
   return gnode.p();
   return gnode.p();
 }
 }
+
+////////////////////////////////////////////////////////////////////
+//     Function: PGFrameStyle::qpgenerate_flat_geom
+//       Access: Private
+//  Description: Generates the qpGeomNode appropriate to a T_flat
+//               frame.
+////////////////////////////////////////////////////////////////////
+PT(PandaNode) PGFrameStyle::
+qpgenerate_flat_geom(const LVecBase4f &frame) {
+  PT(qpGeomNode) gnode = new qpGeomNode("flat");
+  Geom *geom = new GeomTristrip;
+  gnode->add_geom(geom);
+
+  float left = frame[0];
+  float right = frame[1];
+  float bottom = frame[2];
+  float top = frame[3];
+
+  PTA_int lengths=PTA_int::empty_array(0);
+  lengths.push_back(4);
+
+  PTA_Vertexf verts;
+  verts.push_back(Vertexf(left, 0.0f, top));
+  verts.push_back(Vertexf(left, 0.0f, bottom));
+  verts.push_back(Vertexf(right, 0.0f, top));
+  verts.push_back(Vertexf(right, 0.0f, bottom));
+
+  geom->set_num_prims(1);
+  geom->set_lengths(lengths);
+
+  geom->set_coords(verts);
+
+  PTA_Colorf colors;
+  colors.push_back(_color);
+  geom->set_colors(colors, G_OVERALL);
+  
+  return gnode.p();
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: PGFrameStyle::qpgenerate_bevel_geom
+//       Access: Private
+//  Description: Generates the qpGeomNode appropriate to a T_bevel_in or
+//               T_bevel_out frame.
+////////////////////////////////////////////////////////////////////
+PT(PandaNode) PGFrameStyle::
+qpgenerate_bevel_geom(const LVecBase4f &frame, bool in) {
+  //
+  // Colors:
+  //
+  // 
+  //  * * * * * * * * * * * * * * * * * * * * * * *
+  //  * *                                       * *
+  //  *   *               ctop                *   *
+  //  *     *                               *     *
+  //  *       * * * * * * * * * * * * * * *       *
+  //  *       *                           *       *
+  //  *       *                           *       *
+  //  * cleft *          _color           * cright*
+  //  *       *                           *       *
+  //  *       *                           *       *
+  //  *       * * * * * * * * * * * * * * *       *
+  //  *     *                               *     *
+  //  *   *              cbottom              *   *
+  //  * *                                       * *
+  //  * * * * * * * * * * * * * * * * * * * * * * *
+  //
+  //
+  // Vertices:
+  //
+  //  tristrip 1:
+  //  4 * * * * * * * * * * * * * * * * * * * * * 6
+  //  * *                                       *
+  //  *   *                                   *
+  //  *     *                               *
+  //  *       5 * * * * * * * * * * * * * 7
+  //  *       *
+  //  *       *
+  //  *       *
+  //  *       *
+  //  *       *
+  //  *       3 * * * * * * * * * * * * * 1
+  //  *     *                               *
+  //  *   *                                   *
+  //  * *                                       *
+  //  2 * * * * * * * * * * * * * * * * * * * * * 0
+  // 
+  //  tristrip 2:
+  //                                              1
+  //                                            * *
+  //                                          *   *
+  //                                        *     *
+  //          5 * * * * * * * * * * * * * 3       *
+  //          *                           *       *
+  //          *                           *       *
+  //          *                           *       *
+  //          *                           *       *
+  //          *                           *       *
+  //          4 * * * * * * * * * * * * * 2       *
+  //                                        *     *
+  //                                          *   *
+  //                                            * *
+  //                                              0
+
+  PT(qpGeomNode) gnode = new qpGeomNode("bevel");
+
+  float left = frame[0];
+  float right = frame[1];
+  float bottom = frame[2];
+  float top = frame[3];
+
+  float inner_left = left + _width[0];
+  float inner_right = right - _width[0];
+  float inner_bottom = bottom + _width[1];
+  float inner_top = top - _width[1];
+
+  float left_color_scale = 1.2;
+  float right_color_scale = 0.8;
+  float bottom_color_scale = 0.7;
+  float top_color_scale = 1.3;
+
+  if (in) {
+    right_color_scale = 1.2;
+    left_color_scale = 0.8;
+    top_color_scale = 0.7;
+    bottom_color_scale = 1.3;
+  }
+
+  // Clamp all colors at white, and don't scale the alpha.
+  Colorf cleft(min(_color[0] * left_color_scale, 1.0f),
+               min(_color[1] * left_color_scale, 1.0f),
+               min(_color[2] * left_color_scale, 1.0f),
+               _color[3]);
+
+  Colorf cright(min(_color[0] * right_color_scale, 1.0f),
+                min(_color[1] * right_color_scale, 1.0f),
+                min(_color[2] * right_color_scale, 1.0f),
+                _color[3]);
+
+  Colorf cbottom(min(_color[0] * bottom_color_scale, 1.0f),
+                 min(_color[1] * bottom_color_scale, 1.0f),
+                 min(_color[2] * bottom_color_scale, 1.0f),
+                 _color[3]);
+
+  Colorf ctop(min(_color[0] * top_color_scale, 1.0f),
+              min(_color[1] * top_color_scale, 1.0f),
+              min(_color[2] * top_color_scale, 1.0f),
+              _color[3]);
+
+  // Now make the tristrips.
+  Geom *geom = new GeomTristrip;
+  gnode->add_geom(geom);
+    
+  PTA_int lengths;
+  PTA_Vertexf verts;
+  PTA_Colorf colors;
+
+  // Tristrip 1.
+  lengths.push_back(8);
+    
+  verts.push_back(Vertexf(right, 0.0f, bottom));
+  verts.push_back(Vertexf(inner_right, 0.0f, inner_bottom));
+  verts.push_back(Vertexf(left, 0.0f, bottom));
+  verts.push_back(Vertexf(inner_left, 0.0f, inner_bottom));
+  verts.push_back(Vertexf(left, 0.0f, top));
+  verts.push_back(Vertexf(inner_left, 0.0f, inner_top));
+  verts.push_back(Vertexf(right, 0.0f, top));
+  verts.push_back(Vertexf(inner_right, 0.0f, inner_top));
+  
+  colors.push_back(cbottom);
+  colors.push_back(cbottom);
+  colors.push_back(cleft);
+  colors.push_back(cleft);
+  colors.push_back(ctop);
+  colors.push_back(ctop);
+
+  // Tristrip 2.
+  lengths.push_back(6);
+
+  verts.push_back(Vertexf(right, 0.0f, bottom));
+  verts.push_back(Vertexf(right, 0.0f, top));
+  verts.push_back(Vertexf(inner_right, 0.0f, inner_bottom));
+  verts.push_back(Vertexf(inner_right, 0.0f, inner_top));
+  verts.push_back(Vertexf(inner_left, 0.0f, inner_bottom));
+  verts.push_back(Vertexf(inner_left, 0.0f, inner_top));
+
+  colors.push_back(cright);
+  colors.push_back(cright);
+  colors.push_back(_color);
+  colors.push_back(_color);
+
+  geom->set_num_prims(2);
+  geom->set_lengths(lengths);
+  geom->set_coords(verts);
+  geom->set_colors(colors, G_PER_COMPONENT);
+  
+  return gnode.p();
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: PGFrameStyle::qpgenerate_groove_geom
+//       Access: Private
+//  Description: Generates the qpGeomNode appropriate to a T_groove or
+//               T_ridge frame.
+////////////////////////////////////////////////////////////////////
+PT(PandaNode) PGFrameStyle::
+qpgenerate_groove_geom(const LVecBase4f &frame, bool in) {
+  //
+  // Colors:
+  //
+  // 
+  //  * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  //  * *                                               * *
+  //  *   *                   ctop                    *   *
+  //  *     *                                       *     *
+  //  *       * * * * * * * * * * * * * * * * * * *       *
+  //  *       * *                               * *       *
+  //  *       *   *          cbottom          *   *       *
+  //  *       *     *                       *     *       *
+  //  *       *       * * * * * * * * * * *       *       *
+  //  *       *       *                   *       *       *
+  //  *       *       *                   *       *       *
+  //  * cleft * cright*      _color       * cleft * cright*
+  //  *       *       *                   *       *       *
+  //  *       *       *                   *       *       *
+  //  *       *       * * * * * * * * * * *       *       *
+  //  *       *     *                       *     *       *
+  //  *       *   *           ctop            *   *       *
+  //  *       * *                               * *       *
+  //  *       * * * * * * * * * * * * * * * * * * *       *
+  //  *     *                                       *     *
+  //  *   *                  cbottom                  *   *
+  //  * *                                               * *
+  //  * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  //
+  //
+  // Vertices:
+  //
+  //  tristrip 1:
+  //  4 * * * * * * * * * * * * * * * * * * * * * * * * * 6
+  //  * *                                               *
+  //  *   *                                           *
+  //  *     *                                       *
+  //  *       5 * * * * * * * * * * * * * * * * * 7
+  //  *       *
+  //  *       *
+  //  *       *
+  //  *       *
+  //  *       *
+  //  *       *
+  //  *       *
+  //  *       *
+  //  *       *
+  //  *       *
+  //  *       *
+  //  *       *
+  //  *       *
+  //  *       3 * * * * * * * * * * * * * * * * * 1
+  //  *     *                                       *
+  //  *   *                                           *
+  //  * *                                               *
+  //  2 * * * * * * * * * * * * * * * * * * * * * * * * * 0
+  //
+  //  tristrip 2:
+  //          4 * * * * * * * * * * * * * * * * * 6
+  //          * *                               *
+  //          *   *                           *
+  //          *     *                       *
+  //          *       5 * * * * * * * * * 7
+  //          *       *
+  //          *       *
+  //          *       *
+  //          *       *
+  //          *       *
+  //          *       3 * * * * * * * * * 1
+  //          *     *                       *
+  //          *   *                           *
+  //          * *                               *
+  //          2 * * * * * * * * * * * * * * * * * 0
+  // 
+  //  tristrip 3:
+  //                                                      1
+  //                                                    * *
+  //                                                  *   *
+  //                                                *     *
+  //                                              3       *
+  //                                            * *       *
+  //                                          *   *       *
+  //                                        *     *       *
+  //                  7 * * * * * * * * * 5       *       *
+  //                  *                   *       *       *
+  //                  *                   *       *       *
+  //                  *                   *       *       *
+  //                  *                   *       *       *
+  //                  *                   *       *       *
+  //                  6 * * * * * * * * * 4       *       *
+  //                                        *     *       *
+  //                                          *   *       *
+  //                                            * *       *
+  //                                              2       *
+  //                                                *     *
+  //                                                  *   *
+  //                                                    * *
+  //                                                      0
+
+  PT(qpGeomNode) gnode = new qpGeomNode("groove");
+
+  float left = frame[0];
+  float right = frame[1];
+  float bottom = frame[2];
+  float top = frame[3];
+
+  float mid_left = left + 0.5f * _width[0];
+  float mid_right = right - 0.5f * _width[0];
+  float mid_bottom = bottom + 0.5f * _width[1];
+  float mid_top = top - 0.5f * _width[1];
+
+  float inner_left = left + _width[0];
+  float inner_right = right - _width[0];
+  float inner_bottom = bottom + _width[1];
+  float inner_top = top - _width[1];
+
+  float left_color_scale = 1.2f;
+  float right_color_scale = 0.8f;
+  float bottom_color_scale = 0.7f;
+  float top_color_scale = 1.3f;
+
+  if (in) {
+    right_color_scale = 1.2f;
+    left_color_scale = 0.8f;
+    top_color_scale = 0.7f;
+    bottom_color_scale = 1.3f;
+  }
+
+  // Clamp all colors at white, and don't scale the alpha.
+  Colorf cleft(min(_color[0] * left_color_scale, 1.0f),
+               min(_color[1] * left_color_scale, 1.0f),
+               min(_color[2] * left_color_scale, 1.0f),
+               _color[3]);
+
+  Colorf cright(min(_color[0] * right_color_scale, 1.0f),
+                min(_color[1] * right_color_scale, 1.0f),
+                min(_color[2] * right_color_scale, 1.0f),
+                _color[3]);
+
+  Colorf cbottom(min(_color[0] * bottom_color_scale, 1.0f),
+                 min(_color[1] * bottom_color_scale, 1.0f),
+                 min(_color[2] * bottom_color_scale, 1.0f),
+                 _color[3]);
+
+  Colorf ctop(min(_color[0] * top_color_scale, 1.0f),
+              min(_color[1] * top_color_scale, 1.0f),
+              min(_color[2] * top_color_scale, 1.0f),
+              _color[3]);
+
+  // Now make the tristrips.
+  Geom *geom = new GeomTristrip;
+  gnode->add_geom(geom);
+    
+  PTA_int lengths;
+  PTA_Vertexf verts;
+  PTA_Colorf colors;
+
+  // Tristrip 1.
+  lengths.push_back(8);
+    
+  verts.push_back(Vertexf(right, 0.0f, bottom));
+  verts.push_back(Vertexf(mid_right, 0.0f, mid_bottom));
+  verts.push_back(Vertexf(left, 0.0f, bottom));
+  verts.push_back(Vertexf(mid_left, 0.0f, mid_bottom));
+  verts.push_back(Vertexf(left, 0.0f, top));
+  verts.push_back(Vertexf(mid_left, 0.0f, mid_top));
+  verts.push_back(Vertexf(right, 0.0f, top));
+  verts.push_back(Vertexf(mid_right, 0.0f, mid_top));
+  
+  colors.push_back(cbottom);
+  colors.push_back(cbottom);
+  colors.push_back(cleft);
+  colors.push_back(cleft);
+  colors.push_back(ctop);
+  colors.push_back(ctop);
+
+  // Tristrip 2.
+  lengths.push_back(8);
+    
+  verts.push_back(Vertexf(mid_right, 0.0f, mid_bottom));
+  verts.push_back(Vertexf(inner_right, 0.0f, inner_bottom));
+  verts.push_back(Vertexf(mid_left, 0.0f, mid_bottom));
+  verts.push_back(Vertexf(inner_left, 0.0f, inner_bottom));
+  verts.push_back(Vertexf(mid_left, 0.0f, mid_top));
+  verts.push_back(Vertexf(inner_left, 0.0f, inner_top));
+  verts.push_back(Vertexf(mid_right, 0.0f, mid_top));
+  verts.push_back(Vertexf(inner_right, 0.0f, inner_top));
+  
+  colors.push_back(ctop);
+  colors.push_back(ctop);
+  colors.push_back(cright);
+  colors.push_back(cright);
+  colors.push_back(cbottom);
+  colors.push_back(cbottom);
+
+  // Tristrip 3.
+  lengths.push_back(8);
+
+  verts.push_back(Vertexf(right, 0.0f, bottom));
+  verts.push_back(Vertexf(right, 0.0f, top));
+  verts.push_back(Vertexf(mid_right, 0.0f, mid_bottom));
+  verts.push_back(Vertexf(mid_right, 0.0f, mid_top));
+  verts.push_back(Vertexf(inner_right, 0.0f, inner_bottom));
+  verts.push_back(Vertexf(inner_right, 0.0f, inner_top));
+  verts.push_back(Vertexf(inner_left, 0.0f, inner_bottom));
+  verts.push_back(Vertexf(inner_left, 0.0f, inner_top));
+
+  colors.push_back(cright);
+  colors.push_back(cright);
+  colors.push_back(cleft);
+  colors.push_back(cleft);
+  colors.push_back(_color);
+  colors.push_back(_color);
+
+  geom->set_num_prims(3);
+  geom->set_lengths(lengths);
+  geom->set_coords(verts);
+  geom->set_colors(colors, G_PER_COMPONENT);
+  
+  return gnode.p();
+}

+ 5 - 0
panda/src/pgui/pgFrameStyle.h

@@ -26,6 +26,7 @@
 
 
 class NodeRelation;
 class NodeRelation;
 class Node;
 class Node;
+class PandaNode;
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //       Class : PGFrameStyle
 //       Class : PGFrameStyle
@@ -64,11 +65,15 @@ PUBLISHED:
 public:
 public:
   bool xform(const LMatrix4f &mat);
   bool xform(const LMatrix4f &mat);
   NodeRelation *generate_into(Node *node, const LVecBase4f &frame);
   NodeRelation *generate_into(Node *node, const LVecBase4f &frame);
+  PandaNode *generate_into(PandaNode *node, const LVecBase4f &frame);
 
 
 private:
 private:
   PT_Node generate_flat_geom(const LVecBase4f &frame);
   PT_Node generate_flat_geom(const LVecBase4f &frame);
   PT_Node generate_bevel_geom(const LVecBase4f &frame, bool in);
   PT_Node generate_bevel_geom(const LVecBase4f &frame, bool in);
   PT_Node generate_groove_geom(const LVecBase4f &frame, bool in);
   PT_Node generate_groove_geom(const LVecBase4f &frame, bool in);
+  PT(PandaNode) qpgenerate_flat_geom(const LVecBase4f &frame);
+  PT(PandaNode) qpgenerate_bevel_geom(const LVecBase4f &frame, bool in);
+  PT(PandaNode) qpgenerate_groove_geom(const LVecBase4f &frame, bool in);
 
 
 private:
 private:
   Type _type;
   Type _type;

+ 24 - 0
panda/src/pgui/pgMouseWatcherGroup.I

@@ -24,6 +24,17 @@
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 INLINE PGMouseWatcherGroup::
 INLINE PGMouseWatcherGroup::
 PGMouseWatcherGroup(PGTop *top) : _top(top) {
 PGMouseWatcherGroup(PGTop *top) : _top(top) {
+  _qptop = (qpPGTop *)NULL;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: PGMouseWatcherGroup::Constructor
+//       Access: Public
+//  Description: 
+////////////////////////////////////////////////////////////////////
+INLINE PGMouseWatcherGroup::
+PGMouseWatcherGroup(qpPGTop *top) : _qptop(top) {
+  _top = (PGTop *)NULL;
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -38,3 +49,16 @@ clear_top(PGTop *top) {
   nassertv(_top == top);
   nassertv(_top == top);
   _top = (PGTop *)NULL;
   _top = (PGTop *)NULL;
 }
 }
+
+////////////////////////////////////////////////////////////////////
+//     Function: PGMouseWatcherGroup::clear_top
+//       Access: Public
+//  Description: Called by the PGTop object to indicate that it is no
+//               longer keeping the pointer to the PGMouseWatcherGroup
+//               object.
+////////////////////////////////////////////////////////////////////
+INLINE void PGMouseWatcherGroup::
+clear_top(qpPGTop *top) {
+  nassertv(_qptop == top);
+  _qptop = (qpPGTop *)NULL;
+}

+ 4 - 0
panda/src/pgui/pgMouseWatcherGroup.h

@@ -25,6 +25,7 @@
 #include "pointerTo.h"
 #include "pointerTo.h"
 
 
 class PGTop;
 class PGTop;
+class qpPGTop;
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //       Class : PGMouseWatcherGroup
 //       Class : PGMouseWatcherGroup
@@ -37,12 +38,15 @@ class PGTop;
 class EXPCL_PANDA PGMouseWatcherGroup : public MouseWatcherGroup {
 class EXPCL_PANDA PGMouseWatcherGroup : public MouseWatcherGroup {
 public:
 public:
   INLINE PGMouseWatcherGroup(PGTop *top);
   INLINE PGMouseWatcherGroup(PGTop *top);
+  INLINE PGMouseWatcherGroup(qpPGTop *top);
   virtual ~PGMouseWatcherGroup();
   virtual ~PGMouseWatcherGroup();
 
 
   INLINE void clear_top(PGTop *top);
   INLINE void clear_top(PGTop *top);
+  INLINE void clear_top(qpPGTop *top);
 
 
 private:
 private:
   PGTop *_top;
   PGTop *_top;
+  qpPGTop *_qptop;
 
 
 public:
 public:
   static TypeHandle get_class_type() {
   static TypeHandle get_class_type() {

+ 38 - 0
panda/src/pgui/pgMouseWatcherRegion.cxx

@@ -18,6 +18,7 @@
 
 
 #include "pgMouseWatcherRegion.h"
 #include "pgMouseWatcherRegion.h"
 #include "pgItem.h"
 #include "pgItem.h"
+#include "qppgItem.h"
 
 
 #include "string_utils.h"
 #include "string_utils.h"
 
 
@@ -36,6 +37,22 @@ PGMouseWatcherRegion(PGItem *item) :
 #endif
 #endif
   _item(item)
   _item(item)
 {
 {
+  _qpitem = (qpPGItem *)NULL;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: PGMouseWatcherRegion::Constructor
+//       Access: Public
+//  Description: 
+////////////////////////////////////////////////////////////////////
+PGMouseWatcherRegion::
+PGMouseWatcherRegion(qpPGItem *item) :
+#ifndef CPPPARSER
+  MouseWatcherRegion("pg" + format_string(_next_index++), 0, 0, 0, 0),
+#endif
+  _qpitem(item)
+{
+  _item = (PGItem *)NULL;
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -62,6 +79,9 @@ enter(const MouseWatcherParameter &param) {
   if (_item != (PGItem *)NULL) {
   if (_item != (PGItem *)NULL) {
     _item->enter(param);
     _item->enter(param);
   }
   }
+  if (_qpitem != (qpPGItem *)NULL) {
+    _qpitem->enter(param);
+  }
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -78,6 +98,9 @@ exit(const MouseWatcherParameter &param) {
   if (_item != (PGItem *)NULL) {
   if (_item != (PGItem *)NULL) {
     _item->exit(param);
     _item->exit(param);
   }
   }
+  if (_qpitem != (qpPGItem *)NULL) {
+    _qpitem->exit(param);
+  }
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -95,6 +118,9 @@ within(const MouseWatcherParameter &param) {
   if (_item != (PGItem *)NULL) {
   if (_item != (PGItem *)NULL) {
     _item->within(param);
     _item->within(param);
   }
   }
+  if (_qpitem != (qpPGItem *)NULL) {
+    _qpitem->within(param);
+  }
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -109,6 +135,9 @@ without(const MouseWatcherParameter &param) {
   if (_item != (PGItem *)NULL) {
   if (_item != (PGItem *)NULL) {
     _item->without(param);
     _item->without(param);
   }
   }
+  if (_qpitem != (qpPGItem *)NULL) {
+    _qpitem->without(param);
+  }
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -123,6 +152,9 @@ press(const MouseWatcherParameter &param) {
   if (_item != (PGItem *)NULL) {
   if (_item != (PGItem *)NULL) {
     _item->press(param, false);
     _item->press(param, false);
   }
   }
+  if (_qpitem != (qpPGItem *)NULL) {
+    _qpitem->press(param, false);
+  }
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -137,6 +169,9 @@ release(const MouseWatcherParameter &param) {
   if (_item != (PGItem *)NULL) {
   if (_item != (PGItem *)NULL) {
     _item->release(param, false);
     _item->release(param, false);
   }
   }
+  if (_qpitem != (qpPGItem *)NULL) {
+    _qpitem->release(param, false);
+  }
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -150,4 +185,7 @@ keystroke(const MouseWatcherParameter &param) {
   if (_item != (PGItem *)NULL) {
   if (_item != (PGItem *)NULL) {
     _item->keystroke(param, false);
     _item->keystroke(param, false);
   }
   }
+  if (_qpitem != (qpPGItem *)NULL) {
+    _qpitem->keystroke(param, false);
+  }
 }
 }

+ 4 - 0
panda/src/pgui/pgMouseWatcherRegion.h

@@ -24,6 +24,7 @@
 #include "mouseWatcherRegion.h"
 #include "mouseWatcherRegion.h"
 
 
 class PGItem;
 class PGItem;
+class qpPGItem;
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //       Class : PGMouseWatcherRegion
 //       Class : PGMouseWatcherRegion
@@ -35,6 +36,7 @@ class PGItem;
 class EXPCL_PANDA PGMouseWatcherRegion : public MouseWatcherRegion {
 class EXPCL_PANDA PGMouseWatcherRegion : public MouseWatcherRegion {
 public:
 public:
   PGMouseWatcherRegion(PGItem *item);
   PGMouseWatcherRegion(PGItem *item);
+  PGMouseWatcherRegion(qpPGItem *item);
   virtual ~PGMouseWatcherRegion();
   virtual ~PGMouseWatcherRegion();
 
 
   virtual void enter(const MouseWatcherParameter &param);
   virtual void enter(const MouseWatcherParameter &param);
@@ -47,6 +49,7 @@ public:
 
 
 private:
 private:
   PGItem *_item;
   PGItem *_item;
+  qpPGItem *_qpitem;
   static int _next_index;
   static int _next_index;
 
 
 public:
 public:
@@ -67,6 +70,7 @@ private:
   static TypeHandle _type_handle;
   static TypeHandle _type_handle;
 
 
   friend class PGItem;
   friend class PGItem;
+  friend class qpPGItem;
 };
 };
 
 
 #include "pgMouseWatcherRegion.I"
 #include "pgMouseWatcherRegion.I"

+ 3 - 0
panda/src/pgui/pgui_composite1.cxx

@@ -1,7 +1,10 @@
     
     
 #include "config_pgui.cxx"
 #include "config_pgui.cxx"
 #include "pgButton.cxx"
 #include "pgButton.cxx"
+#include "qppgButton.cxx"
+#include "pgCullTraverser.cxx"
 #include "pgEntry.cxx"
 #include "pgEntry.cxx"
+#include "qppgEntry.cxx"
 #include "pgMouseWatcherGroup.cxx"
 #include "pgMouseWatcherGroup.cxx"
 #include "pgMouseWatcherParameter.cxx"
 #include "pgMouseWatcherParameter.cxx"
 
 

+ 3 - 0
panda/src/pgui/pgui_composite2.cxx

@@ -1,8 +1,11 @@
 
 
 #include "pgFrameStyle.cxx"
 #include "pgFrameStyle.cxx"
 #include "pgItem.cxx"
 #include "pgItem.cxx"
+#include "qppgItem.cxx"
 #include "pgMouseWatcherBackground.cxx"
 #include "pgMouseWatcherBackground.cxx"
 #include "pgMouseWatcherRegion.cxx"
 #include "pgMouseWatcherRegion.cxx"
 #include "pgTop.cxx"
 #include "pgTop.cxx"
+#include "qppgTop.cxx"
 #include "pgWaitBar.cxx"
 #include "pgWaitBar.cxx"
+#include "qppgWaitBar.cxx"
 
 

+ 4 - 4
panda/src/tform/qpmouseWatcher.cxx

@@ -845,7 +845,7 @@ exit_region(MouseWatcherRegion *region, const MouseWatcherParameter &param) {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 void qpMouseWatcher::
 void qpMouseWatcher::
 do_transmit_data(const DataNodeTransmit &input, DataNodeTransmit &output) {
 do_transmit_data(const DataNodeTransmit &input, DataNodeTransmit &output) {
-  if (!input.has_data(_pixel_xy_input)) {
+  if (!input.has_data(_xy_input)) {
     // No mouse in the window.
     // No mouse in the window.
 
 
     if (_has_mouse) {
     if (_has_mouse) {
@@ -863,9 +863,9 @@ do_transmit_data(const DataNodeTransmit &input, DataNodeTransmit &output) {
   }
   }
 
 
   // The mouse is within the window.  Get the current mouse position.
   // The mouse is within the window.  Get the current mouse position.
-  const EventStoreVec2 *pixel_xy;
-  DCAST_INTO_V(pixel_xy, input.get_data(_pixel_xy_input).get_ptr());
-  const LVecBase2f &p = pixel_xy->get_value();
+  const EventStoreVec2 *xy;
+  DCAST_INTO_V(xy, input.get_data(_xy_input).get_ptr());
+  const LVecBase2f &p = xy->get_value();
   _mouse.set(p[0], p[1]);
   _mouse.set(p[0], p[1]);
 
 
   if (!_geometry.is_null()) {
   if (!_geometry.is_null()) {