瀏覽代碼

better pipelined animation (still needs work)

David Rose 20 年之前
父節點
當前提交
11337e4c20

+ 2 - 0
panda/src/gobj/config_gobj.cxx

@@ -42,6 +42,7 @@
 #include "textureContext.h"
 #include "shaderExpansion.h"
 #include "shaderContext.h"
+#include "transformBlend.h"
 #include "transformBlendTable.h"
 #include "transformTable.h"
 #include "userVertexSlider.h"
@@ -255,6 +256,7 @@ ConfigureFn(config_gobj) {
   TextureStage::init_type();
   ShaderExpansion::init_type();
   ShaderContext::init_type();
+  TransformBlend::init_type();
   TransformBlendTable::init_type();
   TransformTable::init_type();
   UserVertexSlider::init_type();

+ 2 - 2
panda/src/gobj/transformBlend.I

@@ -212,7 +212,7 @@ INLINE void TransformBlend::
 update_blend() const {
   CDReader cdata(_cycler);
   if (cdata->_global_modified != VertexTransform::get_global_modified()) {
-    CDWriter cdataw(((TransformBlend *)this)->_cycler, cdata);
+    CDWriter cdataw(((TransformBlend *)this)->_cycler, cdata, false);
     ((TransformBlend *)this)->recompute_result(cdataw);
   }
 }
@@ -295,7 +295,7 @@ INLINE UpdateSeq TransformBlend::
 get_modified() const {
   CDReader cdata(_cycler);
   if (cdata->_global_modified != VertexTransform::get_global_modified()) {
-    CDWriter cdataw(((TransformBlend *)this)->_cycler, cdata);
+    CDWriter cdataw(((TransformBlend *)this)->_cycler, cdata, false);
     ((TransformBlend *)this)->recompute_result(cdataw);
     return cdataw->_modified;
   } else {

+ 3 - 2
panda/src/gobj/transformBlend.cxx

@@ -21,6 +21,7 @@
 #include "bamReader.h"
 #include "bamWriter.h"
 
+TypeHandle TransformBlend::_type_handle;
 
 ////////////////////////////////////////////////////////////////////
 //     Function: TransformBlend::compare_to
@@ -201,7 +202,7 @@ write(ostream &out, int indent_level) const {
 //               VertexTransform objects, if necessary.
 ////////////////////////////////////////////////////////////////////
 void TransformBlend::
-recompute_result(TransformBlend::CDWriter &cdata) {
+recompute_result(CData *cdata) {
   // Update the global_modified sequence number first, to prevent race
   // conditions.
   cdata->_global_modified = VertexTransform::get_global_modified();
@@ -235,7 +236,7 @@ recompute_result(TransformBlend::CDWriter &cdata) {
 ////////////////////////////////////////////////////////////////////
 void TransformBlend::
 clear_result() {
-  CDWriter cdata(_cycler);
+  CDWriter cdata(_cycler, true);
   cdata->_global_modified = UpdateSeq();
   if (cdata->_modified != UpdateSeq()) {
     cdata->_modified = UpdateSeq();

+ 19 - 3
panda/src/gobj/transformBlend.h

@@ -82,6 +82,11 @@ PUBLISHED:
   void write(ostream &out, int indent_level) const;
 
 private:
+  class CData;
+
+  void recompute_result(CData *cdata);
+  void clear_result();
+
   class TransformEntry {
   public:
     INLINE bool operator < (const TransformEntry &other) const;
@@ -99,6 +104,9 @@ private:
     INLINE CData();
     INLINE CData(const CData &copy);
     virtual CycleData *make_copy() const;
+    virtual TypeHandle get_parent_type() const {
+      return TransformBlend::get_class_type();
+    }
 
     LMatrix4f _result;
     UpdateSeq _modified;
@@ -109,15 +117,23 @@ private:
   typedef CycleDataReader<CData> CDReader;
   typedef CycleDataWriter<CData> CDWriter;
 
-  void recompute_result(CDWriter &cdata);
-  void clear_result();
-
 public:
   void write_datagram(BamWriter *manager, Datagram &dg) const;
   int complete_pointers(TypedWritable **plist, BamReader *manager);
   void fillin(DatagramIterator &scan, BamReader *manager);
 
   friend class VertexTransform;
+
+public:
+  static TypeHandle get_class_type() {
+    return _type_handle;
+  }
+  static void init_type() {
+    register_type(_type_handle, "TransformBlend");
+  }
+
+private:
+  static TypeHandle _type_handle;
 };
 
 INLINE ostream &operator << (ostream &out, const TransformBlend &obj);