mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 10:22:45 -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();
|
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() {
|
||||||
_matrix =
|
if (has_center()) {
|
||||||
LMatrix4d::translate_mat(-_center) *
|
_matrix =
|
||||||
LMatrix4d::scale_mat(LCAST(double, _scale)) *
|
LMatrix4d::translate_mat(-_center) *
|
||||||
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);
|
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();
|
||||||
|
@ -34,6 +34,7 @@ public:
|
|||||||
|
|
||||||
void set(const LPoint3d ¢er, const LVecBase3f &scale);
|
void set(const LPoint3d ¢er, 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;
|
||||||
|
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user