From 032f773b53e453288fa8c00b807c5e449cc42b24 Mon Sep 17 00:00:00 2001 From: David Rose Date: Fri, 16 Feb 2001 05:08:43 +0000 Subject: [PATCH] *** empty log message *** --- panda/src/egg2sg/eggLoader.cxx | 6 ++- panda/src/putil/bam.h | 3 +- panda/src/sgattrib/decalTransition.h | 5 ++- panda/src/sgraph/modelNode.I | 31 +++++++++++++- panda/src/sgraph/modelNode.cxx | 61 ++++++++++++++++++++++++++++ panda/src/sgraph/modelNode.h | 11 +++++ 6 files changed, 111 insertions(+), 6 deletions(-) diff --git a/panda/src/egg2sg/eggLoader.cxx b/panda/src/egg2sg/eggLoader.cxx index 4d9821c4ff..ffc3266069 100644 --- a/panda/src/egg2sg/eggLoader.cxx +++ b/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) { diff --git a/panda/src/putil/bam.h b/panda/src/putil/bam.h index 6e161b0983..ad2eb1e107 100644 --- a/panda/src/putil/bam.h +++ b/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 diff --git a/panda/src/sgattrib/decalTransition.h b/panda/src/sgattrib/decalTransition.h index 16b3705c5a..fde618e5f6 100644 --- a/panda/src/sgattrib/decalTransition.h +++ b/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; diff --git a/panda/src/sgraph/modelNode.I b/panda/src/sgraph/modelNode.I index 1cedb66e6b..6fc63e2b17 100644 --- a/panda/src/sgraph/modelNode.I +++ b/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 ©) : - NamedNode(copy) + NamedNode(copy), + _preserve_transform(copy._preserve_transform) { } @@ -33,4 +61,5 @@ ModelNode(const ModelNode ©) : INLINE void ModelNode:: operator = (const ModelNode ©) { NamedNode::operator = (copy); + _preserve_transform = copy._preserve_transform; } diff --git a/panda/src/sgraph/modelNode.cxx b/panda/src/sgraph/modelNode.cxx index 7d26499a75..6d8e8183b8 100644 --- a/panda/src/sgraph/modelNode.cxx +++ b/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 ¶ms) { 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(); + } + +} diff --git a/panda/src/sgraph/modelNode.h b/panda/src/sgraph/modelNode.h index 9fc9e16965..877bbb6099 100644 --- a/panda/src/sgraph/modelNode.h +++ b/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 ©); INLINE void operator = (const ModelNode ©); 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 ¶ms); +private: + bool _preserve_transform; + public: static TypeHandle get_class_type() { return _type_handle;