Browse Source

workaround strange treatment of scale's center

David Rose 23 years ago
parent
commit
9345f29bc0

+ 27 - 5
pandatool/src/flt/fltTransformScale.cxx

@@ -46,6 +46,23 @@ set(const LPoint3d &center, const LVecBase3f &scale) {
   recompute_matrix();
 }
 
+////////////////////////////////////////////////////////////////////
+//     Function: FltTransformScale::has_center
+//       Access: Public
+//  Description: Returns true if the center is specified, false if it
+//               is not.  For some reason, MultiGen stores large
+//               negative numbers in for the center if it is not
+//               specified.  It is unclear what the purpose of this
+//               is.
+////////////////////////////////////////////////////////////////////
+bool FltTransformScale::
+has_center() const {
+  return 
+    _center[0] > -1e+08 && 
+    _center[1] > -1e+08 && 
+    _center[2] > -1e+08;
+}
+
 ////////////////////////////////////////////////////////////////////
 //     Function: FltTransformScale::get_center
 //       Access: Public
@@ -73,10 +90,15 @@ get_scale() const {
 ////////////////////////////////////////////////////////////////////
 void FltTransformScale::
 recompute_matrix() {
-  _matrix =
-    LMatrix4d::translate_mat(-_center) *
-    LMatrix4d::scale_mat(LCAST(double, _scale)) *
-    LMatrix4d::translate_mat(_center);
+  if (has_center()) {
+    _matrix =
+      LMatrix4d::translate_mat(-_center) *
+      LMatrix4d::scale_mat(LCAST(double, _scale)) *
+      LMatrix4d::translate_mat(_center);
+  } else {
+    _matrix =
+      LMatrix4d::scale_mat(LCAST(double, _scale));
+  }
 }
 
 ////////////////////////////////////////////////////////////////////
@@ -96,7 +118,7 @@ extract_record(FltRecordReader &reader) {
   nassertr(reader.get_opcode() == FO_scale, false);
   DatagramIterator &iterator = reader.get_iterator();
 
-  iterator.skip_bytes(4);   // Undocumented additional padding.
+  iterator.skip_bytes(4);
 
   _center[0] = iterator.get_be_float64();
   _center[1] = iterator.get_be_float64();

+ 1 - 0
pandatool/src/flt/fltTransformScale.h

@@ -34,6 +34,7 @@ public:
 
   void set(const LPoint3d &center, const LVecBase3f &scale);
 
+  bool has_center() const;
   const LPoint3d &get_center() const;
   const LVecBase3f &get_scale() const;
 

+ 4 - 2
pandatool/src/fltegg/fltToEggLevelState.cxx

@@ -196,11 +196,13 @@ set_transform(const FltBead *flt_bead, EggGroup *egg_group) {
           const FltTransformScale *scale;
           DCAST_INTO_V(scale, step);
           if (!scale->get_scale().almost_equal(LVecBase3f(1.0f, 1.0f, 1.0f))) {
-            if (!scale->get_center().almost_equal(LVector3d::zero())) {
+            if (scale->has_center() && 
+                !scale->get_center().almost_equal(LVector3d::zero())) {
               egg_group->add_translate(-scale->get_center());
             }
             egg_group->add_scale(LCAST(double, scale->get_scale()));
-            if (!scale->get_center().almost_equal(LVector3d::zero())) {
+            if (scale->has_center() && 
+                !scale->get_center().almost_equal(LVector3d::zero())) {
               egg_group->add_translate(scale->get_center());
             }
           }