Ver código fonte

*** empty log message ***

David Rose 25 anos atrás
pai
commit
032f773b53

+ 4 - 2
panda/src/egg2sg/eggLoader.cxx

@@ -1347,10 +1347,12 @@ make_node(EggGroup *egg_group, NamedNode *parent) {
       make_node(*ci, node);
     }
 
-  } else if (egg_group->get_model_flag()) {
-    // A model flag; create a model node.
+  } else if (egg_group->get_model_flag() || egg_group->get_dcs_flag()) {
+    // A model or DCS flag; create a model node.
     node = new ModelNode;
     node->set_name(egg_group->get_name());
+
+    DCAST(ModelNode, node)->set_preserve_transform(egg_group->get_dcs_flag());
     
     EggGroup::const_iterator ci;
     for (ci = egg_group->begin(); ci != egg_group->end(); ++ci) {

+ 2 - 1
panda/src/putil/bam.h

@@ -19,9 +19,10 @@ static const unsigned short _bam_major_ver = 3;
 // Bumped to major version 2 on 7/6/00 due to major changes in Character.
 // Bumped to major version 3 on 12/8/00 to change float64's to float32's.
 
-static const unsigned short _bam_minor_ver = 1;
+static const unsigned short _bam_minor_ver = 2;
 // Bumped to minor version 1 on 12/15/00 to add FFT-style channel
 // compression.
+// Bumped to minor version 2 on 2/15/01 to add ModelNode::_preserve_transform.
 
 
 #endif

+ 3 - 2
panda/src/sgattrib/decalTransition.h

@@ -28,10 +28,11 @@
 //               geometry is *not* coplanar with the base geometry.
 ////////////////////////////////////////////////////////////////////
 class EXPCL_PANDA DecalTransition : public OnOffTransition {
-public:
+PUBLISHED:
   INLINE DecalTransition();
   INLINE static DecalTransition off();
-  
+
+public:  
   virtual NodeTransition *make_copy() const;
   virtual NodeAttribute *make_attrib() const;
 

+ 30 - 1
panda/src/sgraph/modelNode.I

@@ -3,6 +3,7 @@
 // 
 ////////////////////////////////////////////////////////////////////
 
+
 ////////////////////////////////////////////////////////////////////
 //     Function: ModelNode::Constructor
 //       Access: Public
@@ -12,6 +13,32 @@ INLINE ModelNode::
 ModelNode(const string &name) : 
   NamedNode(name) 
 { 
+  _preserve_transform = false;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: ModelNode::set_preserve_transform
+//       Access: Public
+//  Description: Sets the preserve_transform flag.  When this flag is
+//               true, flattening the scene graph will not flatten out
+//               any transformation assigned above this node;
+//               otherwise, any transforms applying to this node may
+//               or may not be flattened.
+////////////////////////////////////////////////////////////////////
+INLINE void ModelNode::
+set_preserve_transform(bool preserve_transform) {
+  _preserve_transform = preserve_transform;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: ModelNode::get_preserve_transform
+//       Access: Public
+//  Description: Returns the current setting of the preserve_transform
+//               flag.  See set_preserve_transform().
+////////////////////////////////////////////////////////////////////
+INLINE bool ModelNode::
+get_preserve_transform() const {
+  return _preserve_transform;
 }
 
 ////////////////////////////////////////////////////////////////////
@@ -21,7 +48,8 @@ ModelNode(const string &name) :
 ////////////////////////////////////////////////////////////////////
 INLINE ModelNode::
 ModelNode(const ModelNode &copy) :
-  NamedNode(copy)
+  NamedNode(copy),
+  _preserve_transform(copy._preserve_transform)
 {
 }
 
@@ -33,4 +61,5 @@ ModelNode(const ModelNode &copy) :
 INLINE void ModelNode::
 operator = (const ModelNode &copy) {
   NamedNode::operator = (copy);
+  _preserve_transform = copy._preserve_transform;
 }

+ 61 - 0
panda/src/sgraph/modelNode.cxx

@@ -25,6 +25,33 @@ make_copy() const {
   return new ModelNode(*this);
 }
 
+////////////////////////////////////////////////////////////////////
+//     Function: ModelNode::safe_to_flatten
+//       Access: Public, Virtual
+//  Description: Returns true if it is generally safe to flatten out
+//               this particular kind of Node by duplicating
+//               instances, false otherwise (for instance, a Camera
+//               cannot be safely flattened, because the Camera
+//               pointer itself is meaningful).
+////////////////////////////////////////////////////////////////////
+bool ModelNode::
+safe_to_flatten() const {
+  return false;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: ModelNode::safe_to_transform
+//       Access: Public, Virtual
+//  Description: Returns true if it is generally safe to transform
+//               this particular kind of Node by calling the xform()
+//               method, false otherwise.  For instance, it's usually
+//               a bad idea to attempt to xform a Character.
+////////////////////////////////////////////////////////////////////
+bool ModelNode::
+safe_to_transform() const {
+  return !_preserve_transform;
+}
+
 ////////////////////////////////////////////////////////////////////
 //     Function: ModelNode::register_with_factory
 //       Access: Public, Static
@@ -52,3 +79,37 @@ make_ModelNode(const FactoryParams &params) {
   me->fillin(scan, manager);
   return me;
 }
+
+////////////////////////////////////////////////////////////////////
+//     Function: ModelNode::write_datagram
+//       Access: Public, Virtual
+//  Description: Function to write the important information in
+//               the particular object to a Datagram
+////////////////////////////////////////////////////////////////////
+void ModelNode::
+write_datagram(BamWriter *manager, Datagram &me) {
+  NamedNode::write_datagram(manager, me);
+
+  me.add_bool(_preserve_transform);
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: ModelNode::fillin
+//       Access: Protected
+//  Description: Function that reads out of the datagram (or asks
+//               manager to read) all of the data that is needed to
+//               re-create this object and stores it in the appropiate
+//               place
+////////////////////////////////////////////////////////////////////
+void ModelNode::
+fillin(DatagramIterator &scan, BamReader *manager) {
+  NamedNode::fillin(scan, manager);
+
+  if (manager->get_file_minor_ver() < 2) {
+    // No _preserve_transform before bams 3.2.
+    _preserve_transform = false;
+  } else {
+    _preserve_transform = scan.get_bool();
+  }
+  
+}

+ 11 - 0
panda/src/sgraph/modelNode.h

@@ -26,18 +26,29 @@ class EXPCL_PANDA ModelNode : public NamedNode {
 PUBLISHED:
   INLINE ModelNode(const string &name = "");
 
+  INLINE void set_preserve_transform(bool preserve_transform);
+  INLINE bool get_preserve_transform() const;
+
 public:
   INLINE ModelNode(const ModelNode &copy);
   INLINE void operator = (const ModelNode &copy);
   
   virtual Node *make_copy() const;
 
+  virtual bool safe_to_flatten() const;
+  virtual bool safe_to_transform() const;
+
 public:
   static void register_with_read_factory(void);
 
 protected:
+  virtual void write_datagram(BamWriter *manager, Datagram &me);  
+  void fillin(DatagramIterator &scan, BamReader *manager);
   static TypedWriteable *make_ModelNode(const FactoryParams &params);
 
+private:
+  bool _preserve_transform;
+
 public:
   static TypeHandle get_class_type() {
     return _type_handle;