From 2536cf4492737ee0eaf120c6839efd272cdc7b89 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Thu, 11 Apr 2024 07:25:38 -0400 Subject: [PATCH] Fixes and match --- CMakeLists.txt | 1 - LEGO1/lego/legoomni/include/legopathactor.h | 8 +-- LEGO1/lego/legoomni/src/actors/helicopter.cpp | 4 +- .../lego/legoomni/src/paths/legopathactor.cpp | 72 ++++++++++--------- LEGO1/lego/sources/geom/legounkown100db7f4.h | 6 +- LEGO1/lego/sources/geom/legoweedge.h | 1 + LEGO1/mxgeometry/mxgeometry3d.h | 2 - LEGO1/realtime/vector.h | 2 + 8 files changed, 52 insertions(+), 44 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d2556961..1882ba76 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -154,7 +154,6 @@ add_library(geom STATIC LEGO1/lego/sources/geom/legovertex.cpp LEGO1/lego/sources/geom/legoweedge.cpp LEGO1/lego/sources/geom/legowegedge.cpp - ) register_lego1_target(geom) set_property(TARGET geom PROPERTY ARCHIVE_OUTPUT_NAME "geom$<$:d>") diff --git a/LEGO1/lego/legoomni/include/legopathactor.h b/LEGO1/lego/legoomni/include/legopathactor.h index 22d0fb1b..176a7278 100644 --- a/LEGO1/lego/legoomni/include/legopathactor.h +++ b/LEGO1/lego/legoomni/include/legopathactor.h @@ -52,10 +52,10 @@ class LegoPathActor : public LegoActor { virtual MxResult VTable0x88( LegoPathBoundary* p_boundary, float p_time, - LegoEdge& p_edge1, - float p_scale1, - LegoUnknown100db7f4& p_edge2, - float p_scale2 + LegoEdge& p_srcEdge, + float p_srcScale, + LegoUnknown100db7f4& p_destEdge, + float p_destScale ); // vtable+0x88 virtual void VTable0x8c(); // vtable+0x8c diff --git a/LEGO1/lego/legoomni/src/actors/helicopter.cpp b/LEGO1/lego/legoomni/src/actors/helicopter.cpp index dacb7f82..ca3a5c98 100644 --- a/LEGO1/lego/legoomni/src/actors/helicopter.cpp +++ b/LEGO1/lego/legoomni/src/actors/helicopter.cpp @@ -217,8 +217,8 @@ MxU32 Helicopter::VTable0xd4(LegoControlManagerEvent& p_param) lookat.Add(&loc); Mx3DPointFloat v68, v7c, v90(0, 1, 0), va4; v68 = m_world->GetCamera()->GetWorldUp(); - va4.EqualsCross(v68, dir); - v7c.EqualsCross(va4, v90); + va4.EqualsCross(&v68, &dir); + v7c.EqualsCross(&va4, &v90); if (ret) { if (((Act3*) m_world)->FUN_100727e0(m_controller, loc, dir, v7c)) { break; diff --git a/LEGO1/lego/legoomni/src/paths/legopathactor.cpp b/LEGO1/lego/legoomni/src/paths/legopathactor.cpp index 43f15ef8..74f6ffee 100644 --- a/LEGO1/lego/legoomni/src/paths/legopathactor.cpp +++ b/LEGO1/lego/legoomni/src/paths/legopathactor.cpp @@ -58,71 +58,77 @@ MxResult LegoPathActor::VTable0x88( float p_time, LegoEdge& p_srcEdge, float p_srcScale, - LegoUnknown100db7f4& p_dstEdge, - float p_dstScale + LegoUnknown100db7f4& p_destEdge, + float p_destScale ) { Vector3* v1 = p_srcEdge.GetOpposingPoint(p_boundary); Vector3* v2 = p_srcEdge.GetPoint(p_boundary); - Vector3* v3 = p_dstEdge.GetOpposingPoint(p_boundary); - Vector3* v4 = p_dstEdge.GetPoint(p_boundary); - Mx3DPointFloat p1, p2, p3, p4, p5; + Vector3* v3 = p_destEdge.GetOpposingPoint(p_boundary); + Vector3* v4 = p_destEdge.GetPoint(p_boundary); + + Mx3DPointFloat p1; + Mx3DPointFloat p2; + Mx3DPointFloat p3; + Mx3DPointFloat p4; + Mx3DPointFloat p5; + p1 = *v2; ((Vector3&) p1).Sub(v1); ((Vector3&) p1).Mul(p_srcScale); ((Vector3&) p1).Add(v1); + p2 = *v4; ((Vector3&) p2).Sub(v3); - ((Vector3&) p2).Mul(p_dstScale); + ((Vector3&) p2).Mul(p_destScale); ((Vector3&) p2).Add(v3); + m_boundary = p_boundary; - m_destEdge = &p_dstEdge; - m_unk0xe4 = p_dstScale; + m_destEdge = &p_destEdge; + m_unk0xe4 = p_destScale; + m_unk0x7c = 0; m_lastTime = p_time; m_actorTime = p_time; - m_unk0x7c = 0; - p_dstEdge.FUN_1002ddc0(m_boundary, p3); + p_destEdge.FUN_1002ddc0(*p_boundary, p3); + p4 = p2; ((Vector3&) p4).Sub(&p1); - float len = ((Vector3&) p4).LenSquared(); - if (len > 0) { - len = sqrtf(len); - if (len > 0) { - p4.Div(len); - } - } + p4.Unitize(); + MxMatrix matrix; Vector3 pos(matrix[3]); Vector3 dir(matrix[2]); Vector3 up(matrix[1]); Vector3 right(matrix[0]); + matrix.SetIdentity(); pos = p1; dir = p4; - up = *m_boundary->GetUnknown0x14(); + up = *m_boundary->GetUnknown0x14(); // TODO + if (!m_cameraFlag || !m_userNavFlag) { ((Vector3&) dir).Mul(-1.0f); } + right.EqualsCross(&up, &dir); m_roi->FUN_100a46b0(matrix); - if (m_cameraFlag && m_userNavFlag) { + + if (!m_cameraFlag || !m_userNavFlag) { + p5.EqualsCross(p_boundary->GetUnknown0x14(), &p3); + p5.Unitize(); + + if (VTable0x80(p1, p4, p2, p5) == SUCCESS) { + m_boundary->AddActor(this); + } + else { + return FAILURE; + } + } + else { m_boundary->AddActor(this); FUN_10010c30(); } - else { - ((Vector3&) p5).EqualsCrossImpl(p_boundary->GetUnknown0x14()->GetData(), p3.GetData()); - float len2 = ((Vector3&) p5).LenSquared(); - if (len2 > 0) { - len2 = sqrtf(len2); - if (len2 > 0) { - p5.Div(len2); - } - } - if (VTable0x80(p1, p4, p2, p5) != SUCCESS) { - return FAILURE; - } - m_boundary->AddActor(this); - } + m_unk0xec = m_roi->GetLocal2World(); return SUCCESS; } diff --git a/LEGO1/lego/sources/geom/legounkown100db7f4.h b/LEGO1/lego/sources/geom/legounkown100db7f4.h index bb5e6116..d1cfa324 100644 --- a/LEGO1/lego/sources/geom/legounkown100db7f4.h +++ b/LEGO1/lego/sources/geom/legounkown100db7f4.h @@ -2,6 +2,7 @@ #define __LEGOUNKNOWN100DB7F4_H #include "legoedge.h" +#include "legoweedge.h" #include "mxgeometry/mxgeometry3d.h" // VTABLE: LEGO1 0x100db7f4 @@ -9,9 +10,9 @@ class LegoUnknown100db7f4 : public LegoEdge { public: // FUNCTION: LEGO1 0x1002ddc0 - LegoResult FUN_1002ddc0(LegoWEEdge* p_face, Vector3& p_point) + LegoResult FUN_1002ddc0(LegoWEEdge& p_f, Vector3& p_point) { - if (p_face == m_faceA) { + if (p_f.IsEqual(*m_faceA)) { p_point[0] = -m_unk0x28[0]; p_point[1] = -m_unk0x28[1]; p_point[2] = -m_unk0x28[2]; @@ -19,6 +20,7 @@ class LegoUnknown100db7f4 : public LegoEdge { else { p_point = m_unk0x28; } + return SUCCESS; } diff --git a/LEGO1/lego/sources/geom/legoweedge.h b/LEGO1/lego/sources/geom/legoweedge.h index 9320db74..f02b0cac 100644 --- a/LEGO1/lego/sources/geom/legoweedge.h +++ b/LEGO1/lego/sources/geom/legoweedge.h @@ -15,6 +15,7 @@ class LegoWEEdge { virtual LegoResult VTable0x04(); // vtable+0x04 inline LegoU8 GetNumEdges() { return m_numEdges; } + inline LegoU32 IsEqual(LegoWEEdge& p_other) { return this == &p_other; } // SYNTHETIC: LEGO1 0x1009a570 // LegoWEEdge::`scalar deleting destructor' diff --git a/LEGO1/mxgeometry/mxgeometry3d.h b/LEGO1/mxgeometry/mxgeometry3d.h index 6b822ae0..5d6d3acc 100644 --- a/LEGO1/mxgeometry/mxgeometry3d.h +++ b/LEGO1/mxgeometry/mxgeometry3d.h @@ -38,8 +38,6 @@ class Mx3DPointFloat : public Vector3 { // SYNTHETIC: LEGO1 0x10010c00 // Mx3DPointFloat::operator= - inline void EqualsCross(Mx3DPointFloat& p_a, Mx3DPointFloat& p_b) { EqualsCrossImpl(p_a.m_data, p_b.m_data); } - private: float m_elements[3]; // 0x08 }; diff --git a/LEGO1/realtime/vector.h b/LEGO1/realtime/vector.h index 746008f2..84060d3b 100644 --- a/LEGO1/realtime/vector.h +++ b/LEGO1/realtime/vector.h @@ -101,6 +101,7 @@ class Vector2 { virtual int Unitize() { float sq = LenSquared(); + if (sq > 0.0f) { float root = sqrt(sq); if (root > 0) { @@ -108,6 +109,7 @@ class Vector2 { return 0; } } + return -1; } // vtable+0x44