Browse Source

*** empty log message ***

David Rose 25 years ago
parent
commit
15fe1b8cf1
2 changed files with 74 additions and 104 deletions
  1. 4 4
      panda/src/graph/boundedObject.h
  2. 70 100
      panda/src/testbed/demo.cxx

+ 4 - 4
panda/src/graph/boundedObject.h

@@ -23,15 +23,15 @@
 ////////////////////////////////////////////////////////////////////
 class EXPCL_PANDA BoundedObject {
 public:
+  INLINE BoundedObject();
+  virtual ~BoundedObject();
+
+PUBLISHED:
   enum BoundingVolumeType {
     BVT_static,
     BVT_dynamic_sphere,
   };
 
-  INLINE BoundedObject();
-  virtual ~BoundedObject();
-
-PUBLISHED:
   INLINE void set_bound(BoundingVolumeType type);
   INLINE void set_bound(const BoundingVolume &volume);
   INLINE const BoundingVolume &get_bound() const;

+ 70 - 100
panda/src/testbed/demo.cxx

@@ -70,11 +70,8 @@ extern RenderRelation* first_arc;
 RenderRelation *highlight_arc = NULL;
 PT_NamedNode highlight_render_node;
 RenderRelation *current_arc = NULL;
-Node *current_node;
 
-// bounds_arc just keeps a pointer to the current arc whose bounding
-// volumes has been highlighted.
-NodeRelation *bounds_arc = NULL;
+NodePath selected_node;
 
 PT_NamedNode render2d_top;
 RenderRelation *render2d_arc = NULL;
@@ -87,8 +84,6 @@ PT_NamedNode sky = (NamedNode *)NULL;
 RenderRelation *sky_arc = (RenderRelation *)NULL;
 RenderRelation *flare_arc = (RenderRelation *)NULL;
 
-DownRelationPointers *current_siblings;
-DownRelationPointers::iterator current_sib;
 
 /*
 void 
@@ -205,104 +200,76 @@ event_out_label2d(CPT_Event) {
 }
 */
 
-
 static void
-set_highlight(Node *node) {
-  if (bounds_arc != NULL) {
-    bounds_arc->clear_transition(DrawBoundsTransition::get_class_type());
-    bounds_arc = NULL;
+clear_highlight() {
+  if (selected_node.has_arcs()) {
+    selected_node.hide_bounds();
   }
+
   if (current_arc != NULL) {
     remove_arc(current_arc);
     current_arc = NULL;
   }
+}
 
-  LMatrix4f mat;
-
+static void
+set_highlight() {
   // Transform the highlight to the coordinate space of the node.
-  get_rel_mat(node, render, mat);
+  LMatrix4f mat = selected_node.get_mat(NodePath(render));
   highlight_arc->set_transition(new TransformTransition(mat));
 
-  nout << "Highlighting " << *node << "\n";
+  nout << "Highlighting " << selected_node.as_string(1) << "\n";
 
-  const UpRelationPointers &urp = 
-    node->_parents[RenderRelation::get_class_type()];
-  nout << "Bounding volume of node is " << node->get_bound() << "\n";
-  if (!urp.empty()) {
-    NodeRelation *arc = (*urp.begin());
-    const BoundingVolume &vol = arc->get_bound();
-    nout << "Bounding volume of arc is " << vol << "\n";
+  nout << "Bounding volume of node is " << selected_node.node()->get_bound() << "\n";
 
+  if (selected_node.has_arcs()) {
+    nout << "Bounding volume of arc is " << *selected_node.get_bounds() << "\n";
+    
     nout << "Transitions on arc:\n";
-    arc->write_transitions(nout, 2);
-
-    arc->set_transition(new DrawBoundsTransition);
-    bounds_arc = arc;
+    selected_node.get_bottom_arc()->write_transitions(nout, 2);
+    selected_node.show_bounds();
   }
 
-  current_arc = new RenderRelation(highlight_render_node, node);
-  //current_arc = NULL;
-  current_node = node;
+  current_arc = new RenderRelation(highlight_render_node, selected_node.node());
 }
 
 static void
 event_up(CPT_Event) {
-  if (current_node != NULL) {
-    if (current_node != root) {
-      // First, break the connection to the current node so we won't
-      // be confused by it.
-      if (current_arc != NULL) {
-	remove_arc(current_arc);
-	current_arc = NULL;
-      }
-
-      // Now walk up from the current node to its first parent.
-      UpRelations::iterator uri = 
-	current_node->_parents.find(RenderRelation::get_class_type());
-      if (uri == current_node->_parents.end() || (*uri).second.empty()) {
-	// There is no parent.  Weird.
-	return;
-      }
-
-      UpRelationPointers &parent_siblings = (*uri).second;
-      UpRelationPointers::iterator pi = parent_siblings.begin();
-      assert(pi != parent_siblings.end());
-
-      Node *node = (*pi)->get_parent();
-      set_highlight(node);
-      current_siblings = NULL;
-    }
+  if (selected_node.has_arcs() && selected_node.get_node(1) != root) {
+    clear_highlight();
+    selected_node.shorten(1);
+    set_highlight();
   }
 }
 
 static void
 event_down(CPT_Event) {
-  if (current_node != NULL) {
-    // Walk down from the current node to its first child.
-    DownRelations::iterator dri = 
-      current_node->_children.find(RenderRelation::get_class_type());
-    if (dri == current_node->_children.end() || (*dri).second.empty()) {
-      // There are no children.
-      return;
-    }
-
-    current_siblings = &(*dri).second;
-    current_sib = current_siblings->begin();
-    assert(current_sib != current_siblings->end());
-
-    Node *node = (*current_sib)->get_child();
-    set_highlight(node);
+  if (!selected_node.is_empty() && 
+      selected_node.get_num_children() != 0) {
+    clear_highlight();
+    selected_node = selected_node.get_child(0);
+    set_highlight();
   }
 }
 
 static void
 event_left(CPT_Event) {
   // Go to the previous child in the sibling list, if there is one.
-  if (current_node != NULL && current_siblings != NULL) {
-    if (current_sib != current_siblings->begin()) {
-      --current_sib;
-      Node *node = (*current_sib)->get_child();
-      set_highlight(node);
+  if (selected_node.has_arcs()) {
+    NodePath parent = selected_node;
+    parent.shorten(1);
+    int num_children = parent.get_num_children();
+
+    for (int i = 0; i < num_children; i++) {
+      if (parent.get_child(i) == selected_node) {
+	// We've currently got child i; now select child i-1.
+	if (i - 1 >=  0) {
+	  clear_highlight();
+	  selected_node = parent.get_child(i - 1);
+	  set_highlight();
+	}
+	return;
+      }
     }
   }
 }
@@ -310,23 +277,30 @@ event_left(CPT_Event) {
 static void
 event_right(CPT_Event) {
   // Go to the next child in the sibling list, if there is one.
-  if (current_node != NULL && current_siblings != NULL) {
-    DownRelationPointers::iterator next_sib = current_sib;
-    ++next_sib;
-    if (next_sib != current_siblings->end()) {
-      current_sib = next_sib;
-      Node *node = (*current_sib)->get_child();
-      set_highlight(node);
+  if (selected_node.has_arcs()) {
+    NodePath parent = selected_node;
+    parent.shorten(1);
+    int num_children = parent.get_num_children();
+
+    for (int i = 0; i < num_children; i++) {
+      if (parent.get_child(i) == selected_node) {
+	// We've currently got child i; now select child i + 11.
+	if (i + 1 < num_children) {
+	  clear_highlight();
+	  selected_node = parent.get_child(i + 1);
+	  set_highlight();
+	}
+	return;
+      }
     }
   }
 }
 
 static void
 event_fkey(CPT_Event event) {
-  if (current_node != NULL) {
+  if (selected_node.has_arcs()) {
     // Apply a color to the selected node.
-    NodeRelation *arc = 
-      current_node->get_parent(RenderRelation::get_class_type(), 0);
+    NodeRelation *arc = selected_node.get_bottom_arc();
     nassertv(arc != (NodeRelation *)NULL);
 
     if (event->get_name() == "f9") {
@@ -362,7 +336,6 @@ event_fkey(CPT_Event event) {
 static void
 enable_highlight() {
   if (highlight_render_node == NULL) {
-    nout << "Creating highlight render node\n";
     highlight_render_node = new NamedNode("highlight");
     highlight_arc = new RenderRelation(render, highlight_render_node);
 
@@ -394,30 +367,27 @@ enable_highlight() {
 
   // Add a temporary arc from the highlight render node to the node we
   // are highlighting.
-  nout << "Enabling highlight\n";
-  assert(current_node == NULL);
-  set_highlight(root);
-  current_siblings = NULL;
+  selected_node = NodePath(root);
+  if (selected_node.get_num_children() == 0) {
+    nout << "No nodes.\n";
+    selected_node.clear();
+
+  } else {
+    selected_node = selected_node.get_child(0);
+    set_highlight();
+  }
 }
 
 static void
 disable_highlight() {
   nout << "Disabling highlight\n";
-  assert(current_node != NULL);
-  if (bounds_arc != NULL) {
-    bounds_arc->clear_transition(DrawBoundsTransition::get_class_type());
-    bounds_arc = NULL;
-  }
-  if (current_arc != NULL) {
-    remove_arc(current_arc);
-    current_arc = NULL;
-  }
-  current_node = NULL;
+  clear_highlight();
+  selected_node.clear();
 }
 
 static void
 event_h(CPT_Event) {
-  if (current_node == NULL) {
+  if (selected_node.is_empty()) {
     enable_highlight();
   } else {
     disable_highlight();