workaround strange treatment of scale's center

This commit is contained in:
David Rose 2002-06-25 23:44:12 +00:00
parent 08592a90a7
commit 9345f29bc0
3 changed files with 32 additions and 7 deletions

View File

@ -46,6 +46,23 @@ set(const LPoint3d &center, const LVecBase3f &scale) {
recompute_matrix(); 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 // Function: FltTransformScale::get_center
// Access: Public // Access: Public
@ -73,10 +90,15 @@ get_scale() const {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
void FltTransformScale:: void FltTransformScale::
recompute_matrix() { recompute_matrix() {
if (has_center()) {
_matrix = _matrix =
LMatrix4d::translate_mat(-_center) * LMatrix4d::translate_mat(-_center) *
LMatrix4d::scale_mat(LCAST(double, _scale)) * LMatrix4d::scale_mat(LCAST(double, _scale)) *
LMatrix4d::translate_mat(_center); 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); nassertr(reader.get_opcode() == FO_scale, false);
DatagramIterator &iterator = reader.get_iterator(); DatagramIterator &iterator = reader.get_iterator();
iterator.skip_bytes(4); // Undocumented additional padding. iterator.skip_bytes(4);
_center[0] = iterator.get_be_float64(); _center[0] = iterator.get_be_float64();
_center[1] = iterator.get_be_float64(); _center[1] = iterator.get_be_float64();

View File

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

View File

@ -196,11 +196,13 @@ set_transform(const FltBead *flt_bead, EggGroup *egg_group) {
const FltTransformScale *scale; const FltTransformScale *scale;
DCAST_INTO_V(scale, step); DCAST_INTO_V(scale, step);
if (!scale->get_scale().almost_equal(LVecBase3f(1.0f, 1.0f, 1.0f))) { 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_translate(-scale->get_center());
} }
egg_group->add_scale(LCAST(double, scale->get_scale())); 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()); egg_group->add_translate(scale->get_center());
} }
} }