Browse Source

more pgraph refinements

David Rose 24 years ago
parent
commit
3559ab5380
1 changed files with 30 additions and 21 deletions
  1. 30 21
      panda/src/pgraph/pandaNode.cxx

+ 30 - 21
panda/src/pgraph/pandaNode.cxx

@@ -32,29 +32,33 @@ TypeHandle PandaNode::_type_handle;
 // NodePaths are kept consistent as we attach and detach nodes.  We
 // NodePaths are kept consistent as we attach and detach nodes.  We
 // must enforce the following rules:
 // must enforce the following rules:
 //
 //
-// 1) Each NodePath (i.e. chain of NodePathComponents) represents a
-// complete unbroken chain from a PandaNode to the root of the graph.
+//   1) Each NodePath (i.e. chain of NodePathComponents) represents a
+//   complete unbroken chain from a PandaNode to the root of the
+//   graph.
 //
 //
-// 2) Each NodePathComponent chain is unique.  There are no two
-// different NodePathComponents that reference the same path to the
-// root.
+//   2) Each NodePathComponent chain is unique.  There are no two
+//   different NodePathComponents that reference the same path to the
+//   root.
 //
 //
-// 3) If a PandaNode with no parents is attached to a new parent, all
-// NodePaths that previously indicated this node as the root of graph
-// must now be updated to include the complete chain to the new root.
+// The following rules all follow from rules (1) and (2):
 //
 //
-// 4) If a PandaNode with other parents is attached to a new parent,
-// any previously existing NodePaths are not affected.
+//   3) If a PandaNode with no parents is attached to a new parent,
+//   all NodePaths that previously indicated this node as the root of
+//   graph must now be updated to include the complete chain to the
+//   new root.
 //
 //
-// 5) If a PandaNode is disconnected from its parent, and it has no
-// other parents, all NodePaths that previously passed through this
-// node to the old parent must now be updated to indicate this node is
-// now the root.
+//   4) If a PandaNode with other parents is attached to a new parent,
+//   any previously existing NodePaths are not affected.
 //
 //
-// 6) If a PandaNode is disconnected from its parent, and it has at
-// least one other parent, all NodePaths that previously passed
-// through this node to the old parent must now be updated to pass
-// through one of the other parents instead.
+//   5) If a PandaNode is disconnected from its parent, and it has no
+//   other parents, all NodePaths that previously passed through this
+//   node to the old parent must now be updated to indicate this node
+//   is now the root.
+//
+//   6) If a PandaNode is disconnected from its parent, and it has at
+//   least one other parent, all NodePaths that previously passed
+//   through this node to the old parent must now be updated to pass
+//   through one of the other parents instead.
 //
 //
 // Rules (5) and (6) can especially complicate things because they
 // Rules (5) and (6) can especially complicate things because they
 // introduce the possibility that two formerly distinct NodePaths are
 // introduce the possibility that two formerly distinct NodePaths are
@@ -89,7 +93,7 @@ TypeHandle PandaNode::_type_handle;
 // The NodePath support interface functions are strictly called from
 // The NodePath support interface functions are strictly called from
 // within the NodePath class, and are used to implement
 // within the NodePath class, and are used to implement
 // NodePath::reparent_to() and NodePath::remove_node(), etc.  The
 // NodePath::reparent_to() and NodePath::remove_node(), etc.  The
-// fundamental interface, on the other hand, is designed to be called
+// fundamental interface, on the other hand, is intended to be called
 // directly by the user.
 // directly by the user.
 //
 //
 // The fundamental interface has a slightly lower overhead because it
 // The fundamental interface has a slightly lower overhead because it
@@ -1354,8 +1358,13 @@ detach(qpNodePathComponent *child) {
   nassertv(child != (qpNodePathComponent *)NULL);
   nassertv(child != (qpNodePathComponent *)NULL);
   nassertv(!child->is_top_node());
   nassertv(!child->is_top_node());
 
 
-  PandaNode *child_node = child->get_node();
-  PandaNode *parent_node = child->get_next()->get_node();
+  PT(PandaNode) child_node = child->get_node();
+  PT(PandaNode) parent_node = child->get_next()->get_node();
+  
+  // We should actually have a parent-child relationship, since this
+  // came from a qpNodePathComponent that ought to know about this
+  // sort of thing.
+  nassertv(child_node->find_parent(parent_node) >= 0);
   
   
   // Break the qpNodePathComponent connection.
   // Break the qpNodePathComponent connection.
   child->set_top_node();
   child->set_top_node();