diff --git a/LEGO1/lego/legoomni/include/legoentity.h b/LEGO1/lego/legoomni/include/legoentity.h index 5d290472..527c555d 100644 --- a/LEGO1/lego/legoomni/include/legoentity.h +++ b/LEGO1/lego/legoomni/include/legoentity.h @@ -57,7 +57,7 @@ class LegoEntity : public MxEntity { void FUN_10010c30(); void FUN_100114e0(MxU8 p_unk0x59); - void SetLocation(const Vector3& p_location, const Vector3& p_direction, const Vector3& p_up, MxBool); + void SetLocation(const Vector3& p_location, const Vector3& p_direction, const Vector3& p_up, MxBool p_und); inline LegoROI* GetROI() { return m_roi; } inline MxU8 GetFlags() { return m_flags; } diff --git a/LEGO1/lego/legoomni/src/build/helicopter.cpp b/LEGO1/lego/legoomni/src/build/helicopter.cpp index c4d610a6..2432f1c3 100644 --- a/LEGO1/lego/legoomni/src/build/helicopter.cpp +++ b/LEGO1/lego/legoomni/src/build/helicopter.cpp @@ -205,14 +205,14 @@ MxU32 Helicopter::VTable0xd4(LegoControlManagerEvent& p_param) } if (m_world && m_world->GetCamera()) { Mx3DPointFloat loc, dir, lookat; - loc.CopyFrom(m_world->GetCamera()->GetWorldLocation()); - dir.CopyFrom(m_world->GetCamera()->GetWorldDirection()); + loc = m_world->GetCamera()->GetWorldLocation(); + dir = m_world->GetCamera()->GetWorldDirection(); lookat = dir; float scale = 3; lookat.Mul(scale); lookat.Add(&loc); Mx3DPointFloat v68, v7c, v90(0, 1, 0), va4; - v68.CopyFrom(m_world->GetCamera()->GetWorldUp()); + v68 = m_world->GetCamera()->GetWorldUp(); va4.EqualsCross(v68, dir); v7c.EqualsCross(va4, v90); if (ret) { diff --git a/LEGO1/lego/legoomni/src/entity/legoentity.cpp b/LEGO1/lego/legoomni/src/entity/legoentity.cpp index ddc98266..0d4892a4 100644 --- a/LEGO1/lego/legoomni/src/entity/legoentity.cpp +++ b/LEGO1/lego/legoomni/src/entity/legoentity.cpp @@ -85,9 +85,9 @@ void LegoEntity::SetROI(LegoROI* p_roi, MxBool p_bool1, MxBool p_bool2) if (p_bool2) { MxMatrix mat; CalcLocalTransform( - Mx3DPointFloat(m_worldLocation.GetX(), m_worldLocation.GetY(), m_worldLocation.GetZ()), - Mx3DPointFloat(m_worldDirection.GetX(), m_worldDirection.GetY(), m_worldDirection.GetZ()), - Mx3DPointFloat(m_worldUp.GetX(), m_worldUp.GetY(), m_worldUp.GetZ()), + Mx3DPointFloat(m_worldLocation[0], m_worldLocation[1], m_worldLocation[2]), + Mx3DPointFloat(m_worldDirection[0], m_worldDirection[1], m_worldDirection[2]), + Mx3DPointFloat(m_worldUp[0], m_worldUp[1], m_worldUp[2]), mat ); @@ -106,10 +106,38 @@ void LegoEntity::SetROI(LegoROI* p_roi, MxBool p_bool1, MxBool p_bool2) } } -// STUB: LEGO1 0x100109b0 -void LegoEntity::SetLocation(const Vector3& p_location, const Vector3& p_direction, const Vector3& p_up, MxBool) +// FUNCTION: LEGO1 0x100109b0 +void LegoEntity::SetLocation(const Vector3& p_location, const Vector3& p_direction, const Vector3& p_up, MxBool p_und) { - // TODO + Mx3DPointFloat direction; + Mx3DPointFloat up; + + direction = p_direction; + direction.Unitize(); + + up = p_up; + up.Unitize(); + + m_worldLocation = p_location; + m_worldDirection = direction; + m_worldUp = up; + + if (m_roi != NULL) { + MxMatrix mat; + CalcLocalTransform( + Mx3DPointFloat(p_location[0], p_location[1], p_location[2]), + Mx3DPointFloat(direction[0], direction[1], direction[2]), + Mx3DPointFloat(up[0], up[1], up[2]), + mat + ); + + m_roi->FUN_100a46b0(mat); + VideoManager()->Get3DManager()->GetLego3DView()->Moved(*m_roi); + + if (p_und) { + FUN_10010c30(); + } + } } // FUNCTION: LEGO1 0x10010c30 diff --git a/LEGO1/mxgeometry/mxgeometry3d.h b/LEGO1/mxgeometry/mxgeometry3d.h index feec88f4..0bbe1ba8 100644 --- a/LEGO1/mxgeometry/mxgeometry3d.h +++ b/LEGO1/mxgeometry/mxgeometry3d.h @@ -31,16 +31,16 @@ class Mx3DPointFloat : public Vector3 { // FUNCTION: LEGO1 0x10003c10 virtual void operator=(const Vector3& p_impl) { EqualsImpl(p_impl.m_data); } // vtable+0x88 - inline void CopyFrom(const Mx3DPointFloat& p_other) + // FUNCTION: LEGO1 0x10010c00 + inline Mx3DPointFloat& operator=(const Mx3DPointFloat& p_other) { - // ALPHA: 0x10010860, multiple indirections to this call - EqualsImpl(p_other.m_data); + ((Vector3&) *this).operator=(p_other); - float* dest = m_elements; - const float* src = p_other.m_elements; - for (size_t i = sizeof(m_elements) / sizeof(float); i > 0; --i) { - *dest++ = *src++; + for (size_t i = 0; i < sizeof(m_elements) / sizeof(float); i++) { + m_elements[i] = p_other.m_elements[i]; } + + return *this; } inline void EqualsCross(Mx3DPointFloat& p_a, Mx3DPointFloat& p_b) { EqualsCrossImpl(p_a.m_data, p_b.m_data); } diff --git a/LEGO1/omni/src/action/mxdsaction.cpp b/LEGO1/omni/src/action/mxdsaction.cpp index 49f40561..fde95329 100644 --- a/LEGO1/omni/src/action/mxdsaction.cpp +++ b/LEGO1/omni/src/action/mxdsaction.cpp @@ -76,11 +76,9 @@ void MxDSAction::CopyFrom(MxDSAction& p_dsAction) this->m_startTime = p_dsAction.m_startTime; this->m_duration = p_dsAction.m_duration; this->m_loopCount = p_dsAction.m_loopCount; - - this->m_location.CopyFrom(p_dsAction.m_location); - this->m_direction.CopyFrom(p_dsAction.m_direction); - this->m_up.CopyFrom(p_dsAction.m_up); - + this->m_location = p_dsAction.m_location; + this->m_direction = p_dsAction.m_direction; + this->m_up = p_dsAction.m_up; AppendData(p_dsAction.m_extraLength, p_dsAction.m_extraData); this->m_unk0x84 = p_dsAction.m_unk0x84; this->m_unk0x88 = p_dsAction.m_unk0x88; diff --git a/LEGO1/realtime/vector.h b/LEGO1/realtime/vector.h index 8b41cc13..4ca77620 100644 --- a/LEGO1/realtime/vector.h +++ b/LEGO1/realtime/vector.h @@ -139,8 +139,16 @@ class Vector2 { virtual void SetVector(float* p_other) { EqualsImpl(p_other); } // vtable+0x70 // FUNCTION: LEGO1 0x10002260 - virtual void SetVector(Vector2* p_other) { EqualsImpl(p_other->m_data); } // vtable+0x6c + virtual void SetVector(const Vector2* p_other) { EqualsImpl(p_other->m_data); } // vtable+0x6c + // SYNTHETIC: LEGO1 0x10010be0 + // Vector3::operator= + + inline Vector2& operator=(const Vector2& p_other) + { + Vector2::SetVector(&p_other); + return *this; + } inline float& operator[](size_t idx) { return m_data[idx]; } inline const float& operator[](size_t idx) const { return m_data[idx]; }