mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 02:15:43 -04:00
workaround strange treatment of scale's center
This commit is contained in:
parent
08592a90a7
commit
9345f29bc0
@ -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();
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user