From 9345f29bc0d0d4558f275e1705b40f60562a1efe Mon Sep 17 00:00:00 2001 From: David Rose Date: Tue, 25 Jun 2002 23:44:12 +0000 Subject: [PATCH] workaround strange treatment of scale's center --- pandatool/src/flt/fltTransformScale.cxx | 32 +++++++++++++++++---- pandatool/src/flt/fltTransformScale.h | 1 + pandatool/src/fltegg/fltToEggLevelState.cxx | 6 ++-- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/pandatool/src/flt/fltTransformScale.cxx b/pandatool/src/flt/fltTransformScale.cxx index bef9714697..afc3e939dc 100644 --- a/pandatool/src/flt/fltTransformScale.cxx +++ b/pandatool/src/flt/fltTransformScale.cxx @@ -46,6 +46,23 @@ set(const LPoint3d ¢er, 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(); diff --git a/pandatool/src/flt/fltTransformScale.h b/pandatool/src/flt/fltTransformScale.h index 621f87735e..c3c6204a4f 100644 --- a/pandatool/src/flt/fltTransformScale.h +++ b/pandatool/src/flt/fltTransformScale.h @@ -34,6 +34,7 @@ public: void set(const LPoint3d ¢er, const LVecBase3f &scale); + bool has_center() const; const LPoint3d &get_center() const; const LVecBase3f &get_scale() const; diff --git a/pandatool/src/fltegg/fltToEggLevelState.cxx b/pandatool/src/fltegg/fltToEggLevelState.cxx index 92cf7bab3a..b6613ed8a6 100644 --- a/pandatool/src/fltegg/fltToEggLevelState.cxx +++ b/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()); } }