From 929263b36515128e7f2b899af7db8e9bf032f8c1 Mon Sep 17 00:00:00 2001 From: jsenior10 Date: Tue, 21 Apr 2026 15:46:55 +0100 Subject: [PATCH 01/18] addcollidable --- src/system/world/DefaultPhysicsManager.cpp | 15 +++++++++++++++ src/system/world/DefaultPhysicsManager.h | 6 ++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/system/world/DefaultPhysicsManager.cpp b/src/system/world/DefaultPhysicsManager.cpp index dea88042a..b04b26bdd 100644 --- a/src/system/world/DefaultPhysicsManager.cpp +++ b/src/system/world/DefaultPhysicsManager.cpp @@ -143,3 +143,18 @@ void DefaultPhysicsManager::RemoveAll() { mInactiveCollidables.clear(); unk40.clear(); } + +void DefaultPhysicsManager::AddCollidable(Hmx::Object *o, ObjectDir *dir, bool isActive) { + RndMesh *mesh = dynamic_cast(o); + if (mesh) { + if (unk54.find(mesh) == unk54.end()) { + unk54[mesh] = dir; + if (isActive) { + mActiveCollidables.push_front(mesh); + } else { + mInactiveCollidables.push_front(mesh); + } + unk40.insert(unk40.begin(), o); + } + } +} \ No newline at end of file diff --git a/src/system/world/DefaultPhysicsManager.h b/src/system/world/DefaultPhysicsManager.h index eb67fbf25..1797e9b5d 100644 --- a/src/system/world/DefaultPhysicsManager.h +++ b/src/system/world/DefaultPhysicsManager.h @@ -25,14 +25,16 @@ class DefaultPhysicsManager : public PhysicsManager { virtual void RemoveCollidable(Hmx::Object *); ObjPtrList unk40; // 0x40 - std::map unk54; // 0x54 + std::map unk54; // 0x54 - mCollidableMap? std::list mActiveCollidables; // 0x6c std::list mInactiveCollidables; // 0x74 }; class RayCastDefaultContainer : public RayCastContainer { public: - RayCastDefaultContainer(const Box &, std::list, std::map &); + RayCastDefaultContainer( + const Box &, std::list, std::map & + ); virtual ~RayCastDefaultContainer() {} virtual Hmx::Object *FindNearest(const Segment &, float &, Vector3 &, Hmx::Object *&); virtual void SetFilter(int); From 2982cc39a34cbba0d52e3e43cdbbbaf8619b29e6 Mon Sep 17 00:00:00 2001 From: jsenior10 Date: Thu, 23 Apr 2026 13:35:04 +0100 Subject: [PATCH 02/18] removecollidable --- src/system/world/DefaultPhysicsManager.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/system/world/DefaultPhysicsManager.cpp b/src/system/world/DefaultPhysicsManager.cpp index b04b26bdd..4ae535b19 100644 --- a/src/system/world/DefaultPhysicsManager.cpp +++ b/src/system/world/DefaultPhysicsManager.cpp @@ -157,4 +157,24 @@ void DefaultPhysicsManager::AddCollidable(Hmx::Object *o, ObjectDir *dir, bool i unk40.insert(unk40.begin(), o); } } +} + +void DefaultPhysicsManager::RemoveCollidable(Hmx::Object *o) { + std::map::iterator mapIt = unk54.find(o); + if (mapIt != unk54.end()) { + std::list::iterator activeIt = + std::find(mActiveCollidables.begin(), mActiveCollidables.end(), o); + + if (activeIt != mActiveCollidables.end()) { + mActiveCollidables.erase(activeIt); + } else { + std::list::iterator inactiveIt = + std::find(mInactiveCollidables.begin(), mInactiveCollidables.end(), o); + if (inactiveIt != mInactiveCollidables.end()) { + mInactiveCollidables.erase(inactiveIt); + } + } + unk54.erase(mapIt); + unk40.remove(o); + } } \ No newline at end of file From 7070059d3ff3afbb60e4ce0d65d086d7cc0eb631 Mon Sep 17 00:00:00 2001 From: jsenior10 Date: Thu, 23 Apr 2026 13:39:10 +0100 Subject: [PATCH 03/18] activatecollidable --- src/system/world/DefaultPhysicsManager.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/system/world/DefaultPhysicsManager.cpp b/src/system/world/DefaultPhysicsManager.cpp index 4ae535b19..4d22f49fb 100644 --- a/src/system/world/DefaultPhysicsManager.cpp +++ b/src/system/world/DefaultPhysicsManager.cpp @@ -132,8 +132,9 @@ void DefaultPhysicsManager::CastRays( void DefaultPhysicsManager::ActivateCollidable(Hmx::Object *o) { auto it = std::find(mInactiveCollidables.begin(), mInactiveCollidables.end(), o); if (it != mInactiveCollidables.end()) { + RndMesh *mesh = *it; mInactiveCollidables.erase(it); - mActiveCollidables.push_back(*it); + mActiveCollidables.push_front(mesh); } } From 9de6a7a82911a607262af117bf278c7565c5dca5 Mon Sep 17 00:00:00 2001 From: jsenior10 Date: Thu, 23 Apr 2026 13:41:53 +0100 Subject: [PATCH 04/18] deactivatecollidable --- src/system/world/DefaultPhysicsManager.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/system/world/DefaultPhysicsManager.cpp b/src/system/world/DefaultPhysicsManager.cpp index 4d22f49fb..98e0361d2 100644 --- a/src/system/world/DefaultPhysicsManager.cpp +++ b/src/system/world/DefaultPhysicsManager.cpp @@ -138,6 +138,15 @@ void DefaultPhysicsManager::ActivateCollidable(Hmx::Object *o) { } } +void DefaultPhysicsManager::DeactivateCollidable(Hmx::Object *o) { + auto it = std::find(mInactiveCollidables.begin(), mInactiveCollidables.end(), o); + if (it != mInactiveCollidables.end()) { + RndMesh *mesh = *it; + mActiveCollidables.erase(it); + mInactiveCollidables.push_front(mesh); + } +} + void DefaultPhysicsManager::RemoveAll() { unk54.clear(); mActiveCollidables.clear(); From 9851a6db4ee92933a118952c4e9e87457145e04b Mon Sep 17 00:00:00 2001 From: jsenior10 Date: Thu, 23 Apr 2026 14:10:41 +0100 Subject: [PATCH 05/18] defaultphysicsmanager::poll --- src/system/world/DefaultPhysicsManager.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/system/world/DefaultPhysicsManager.cpp b/src/system/world/DefaultPhysicsManager.cpp index 98e0361d2..22c829789 100644 --- a/src/system/world/DefaultPhysicsManager.cpp +++ b/src/system/world/DefaultPhysicsManager.cpp @@ -83,9 +83,11 @@ void DefaultPhysicsManager::Poll() { for (auto it = mActiveCollidables.begin(); it != mActiveCollidables.end();) { RndMesh *d = *it; if (!IsShowing(d)) { - mActiveCollidables.erase(it); + auto cur = it; + ++it; + mActiveCollidables.erase(cur); MILO_ASSERT(std::find( mInactiveCollidables.begin(), mInactiveCollidables.end(), d) == mInactiveCollidables.end(), 0x41); - mInactiveCollidables.push_back(d); + mInactiveCollidables.push_front(d); } else { ++it; } @@ -93,9 +95,11 @@ void DefaultPhysicsManager::Poll() { for (auto it = mInactiveCollidables.begin(); it != mInactiveCollidables.end();) { RndMesh *d = *it; if (IsShowing(d)) { - mActiveCollidables.erase(it); + auto cur = it; + ++it; + mInactiveCollidables.erase(cur); MILO_ASSERT(std::find( mActiveCollidables.begin(), mActiveCollidables.end(), d) == mActiveCollidables.end(), 0x55); - mInactiveCollidables.push_back(d); + mActiveCollidables.push_front(d); } else { ++it; } @@ -170,15 +174,15 @@ void DefaultPhysicsManager::AddCollidable(Hmx::Object *o, ObjectDir *dir, bool i } void DefaultPhysicsManager::RemoveCollidable(Hmx::Object *o) { - std::map::iterator mapIt = unk54.find(o); + auto mapIt = unk54.find(o); if (mapIt != unk54.end()) { - std::list::iterator activeIt = + auto activeIt = std::find(mActiveCollidables.begin(), mActiveCollidables.end(), o); if (activeIt != mActiveCollidables.end()) { mActiveCollidables.erase(activeIt); } else { - std::list::iterator inactiveIt = + auto inactiveIt = std::find(mInactiveCollidables.begin(), mInactiveCollidables.end(), o); if (inactiveIt != mInactiveCollidables.end()) { mInactiveCollidables.erase(inactiveIt); From d1e1008df9dfa8a70685b5334432f3471533bd44 Mon Sep 17 00:00:00 2001 From: jsenior10 Date: Thu, 23 Apr 2026 17:51:22 +0100 Subject: [PATCH 06/18] dirloader::getdirclass --- src/system/obj/DirLoader.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/system/obj/DirLoader.cpp b/src/system/obj/DirLoader.cpp index 406ebcadd..be0d1767b 100644 --- a/src/system/obj/DirLoader.cpp +++ b/src/system/obj/DirLoader.cpp @@ -571,3 +571,19 @@ ObjectDir *DirLoader::LoadObjects(const FilePath &fp, Callback *cb, BinStream *b } return dirLoader.GetDir(); } + +Symbol DirLoader::GetDirClass(const char *name) { + ChunkStream stream(name, ChunkStream::kRead, 0x10000, true, kPlatformNone, false); + if (stream.Fail()) { + return ""; + } + + while (EofType t = stream.Eof()) { + MILO_ASSERT(t == TempEof, 0xc3); + } + int rev; + stream.ReadEndian(&rev, 4); + Symbol dirClass; + stream >> dirClass; + return dirClass; +} \ No newline at end of file From 861539f1d89a8af82416ce5c97741fbcaa126329 Mon Sep 17 00:00:00 2001 From: jsenior10 Date: Thu, 23 Apr 2026 17:57:17 +0100 Subject: [PATCH 07/18] dirloader::shouldblocksubdirload --- src/system/obj/DirLoader.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/system/obj/DirLoader.cpp b/src/system/obj/DirLoader.cpp index be0d1767b..ce7c72050 100644 --- a/src/system/obj/DirLoader.cpp +++ b/src/system/obj/DirLoader.cpp @@ -160,7 +160,11 @@ const char *DirLoader::CachedPath(const char *cc, bool b) { } bool DirLoader::ShouldBlockSubdirLoad(const FilePath &fp) { - return fp.c_str() && sPathEval ? sPathEval(fp.c_str()) : false; + if (!fp.c_str()) + return false; + if (!sPathEval) + return false; + return sPathEval(fp.c_str()); } // I am WELL aware that this is terrible From 0989d2dad4493f63d54ba9c764ecf964489b67fd Mon Sep 17 00:00:00 2001 From: jsenior10 Date: Thu, 23 Apr 2026 18:20:36 +0100 Subject: [PATCH 08/18] dirloader::readeditordirdead a bit better --- src/system/obj/DirLoader.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/system/obj/DirLoader.cpp b/src/system/obj/DirLoader.cpp index ce7c72050..865c01108 100644 --- a/src/system/obj/DirLoader.cpp +++ b/src/system/obj/DirLoader.cpp @@ -317,15 +317,18 @@ void ReadDead(BinStream &bs) { void ReadEditorDirDead(BinStream &bs) { unsigned char buf; - for (int i = 0; i < 20; i++) { + for (int i = 0; i < 20;) { while (true) { EofType t; while ((t = bs.Eof()) != NotEof) { MILO_ASSERT(t == TempEof, 0x470); } bs >> buf; - if ("%#@EndOfEditorDir@#%"[i] == buf) - break; + if (((const unsigned char *)"%#@EndOfEditorDir@#%")[i] == buf) { + i++; + } else { + i = 0; + } } } } From 0ea6af3e6ae0607e7984d0feefa266283366fdc9 Mon Sep 17 00:00:00 2001 From: jsenior10 Date: Thu, 23 Apr 2026 18:32:07 +0100 Subject: [PATCH 09/18] dirloader::writetypememdump --- src/system/obj/DirLoader.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/system/obj/DirLoader.cpp b/src/system/obj/DirLoader.cpp index 865c01108..afee0e834 100644 --- a/src/system/obj/DirLoader.cpp +++ b/src/system/obj/DirLoader.cpp @@ -409,7 +409,9 @@ void DirLoader::WriteTypeMemDump(TextFileStream *file) { it != sMemPointMap.end(); ++it) { MemPointDelta pt = it->second; - file->Print(it->first.c_str()); + char *first = (char *)&it->first; + const char **ptr = first ? (const char **)(first + 4) : nullptr; + file->Print(*ptr); *file << "," << pt.ToString(1) << "\n"; } file->File().Flush(); From 1ca8526280042261a96b19fa926f0fb58b74a7dc Mon Sep 17 00:00:00 2001 From: jsenior10 Date: Thu, 23 Apr 2026 19:28:40 +0100 Subject: [PATCH 10/18] debuggraph::draw sooooo close --- src/system/utl/DebugGraph.cpp | 91 ++++++++++++++++++++++++++++++++++- 1 file changed, 90 insertions(+), 1 deletion(-) diff --git a/src/system/utl/DebugGraph.cpp b/src/system/utl/DebugGraph.cpp index 0f890ba27..860de6e9e 100644 --- a/src/system/utl/DebugGraph.cpp +++ b/src/system/utl/DebugGraph.cpp @@ -1,6 +1,7 @@ #include "DebugGraph.h" +#include "rndobj/Graph.h" -void DebugGraph::AddData(float data, bool b) { +void DebugGraph::AddData(float data, bool b) { Sample sample; sample.data = data; sample.b = b; @@ -9,4 +10,92 @@ void DebugGraph::AddData(float data, bool b) { if (mSamples.size() == unk38 + 1) { mSamples.pop_back(); } +} + +inline float clamp(float val) { + float c = -val >= 0.0f ? 0.0f : val; + return c - 1.0f >= 0.0f ? 1.0f : c; +} + +void DebugGraph::Draw() { + RndGraph *rnd = RndGraph::GetOneFrame(); + + Hmx::Rect rect(mRect.x, mRect.y, mRect.w, mRect.h); + rnd->AddRectFilled2D(rect, mColorB); + + if (unk50) { + Vector2 minPos; + minPos.x = mRect.x; + minPos.y = mRect.y + mRect.h - 0.02f; + rnd->AddScreenString(MakeString("%.3f", unk3c), minPos, mColorA); + + Vector2 maxPos; + maxPos.x = mRect.x; + maxPos.y = mRect.y; + rnd->AddScreenString(MakeString("%.3f", unk40), maxPos, mColorA); + } + + if (unk44 != FLT_MAX) { + Vector2 p1; + p1.x = mRect.x; + p1.y = mRect.y + mRect.h * (1.0f - clamp((unk44 - unk3c) / (unk40 - unk3c))); + + Vector2 p2; + p2.x = mRect.x + mRect.w; + p2.y = mRect.y + mRect.h * (1.0f - clamp((unk44 - unk3c) / (unk40 - unk3c))); + + rnd->AddScreenLine(p1, p2, Hmx::Color(1.0f, 1.0f, 1.0f, 1.0f), false); + + Vector2 textPos; + textPos.x = mRect.x; + textPos.y = mRect.y + mRect.h * (1.0f - clamp((unk44 - unk3c) / (unk40 - unk3c))); + + rnd->AddScreenString( + MakeString("%.3f", unk44), textPos, Hmx::Color(1.0f, 1.0f, 1.0f, 1.0f) + ); + } + + Vector2 titlePos; + titlePos.x = mRect.x + 0.1f; + titlePos.y = mRect.y; + rnd->AddScreenString(unk48.c_str(), titlePos, Hmx::Color(1.0f, 1.0f, 1.0f, 1.0f)); + + if (!mSamples.empty()) { + auto it = mSamples.begin(); + int idx = 1; + Vector2 prevPos; + prevPos.y = + mRect.y + mRect.h * (1.0f - clamp((it->data - unk3c) / (unk40 - unk3c))); + prevPos.x = mRect.x + mRect.w * (1.0f - clamp(0.0f / (float)(unk38 - 1))); + + ++it; + + for (; it != mSamples.end(); ++it) { + Vector2 curPos; + curPos.y = + mRect.y + mRect.h * (1.0f - clamp((it->data - unk3c) / (unk40 - unk3c))); + curPos.x = + mRect.x + mRect.w * (1.0f - clamp((float)idx / (float)(unk38 - 1))); + + if (it->b) { + Vector2 hl_p1; + hl_p1.y = mRect.y + mRect.h; + + Vector2 hl_p2; + hl_p2.y = mRect.y; + + hl_p1.x = + mRect.x + mRect.w * (1.0f - clamp((float)idx / (float)(unk38 - 1))); + hl_p2.x = + mRect.x + mRect.w * (1.0f - clamp((float)idx / (float)(unk38 - 1))); + + rnd->AddScreenLine( + hl_p2, hl_p1, Hmx::Color(1.0f, 1.0f, 1.0f, 1.0f), false + ); + } + rnd->AddScreenLine(curPos, prevPos, mColorA, false); + prevPos = curPos; + idx++; + } + } } \ No newline at end of file From 5c8274d06a3375de6666a4f6ca6d5f9430b99b41 Mon Sep 17 00:00:00 2001 From: jsenior10 Date: Fri, 24 Apr 2026 17:35:30 +0100 Subject: [PATCH 11/18] bloomtextureset ctor --- src/system/rndobj/PostProc_NG.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/system/rndobj/PostProc_NG.cpp b/src/system/rndobj/PostProc_NG.cpp index 1175c67ed..a3f184586 100644 --- a/src/system/rndobj/PostProc_NG.cpp +++ b/src/system/rndobj/PostProc_NG.cpp @@ -19,7 +19,11 @@ Hmx::Color NgPostProc::s_prevBloomColor(-1, -1, -1, -1); float NgPostProc::s_prevBloomIntensity = -1; NgPostProc::BloomTextures<3> NgPostProc::sBloom; -NgPostProc::BloomTextureSet::BloomTextureSet() : mBloomTexture() {} +NgPostProc::BloomTextureSet::BloomTextureSet() { + for (int i = 0; i < 2; i++) { + mBloomTexture[i] = nullptr; + } +} NgPostProc::BloomTextureSet::~BloomTextureSet() { FreeTextures(); } From 363b1c26442dbf7db5c0465fae6005761285ba3d Mon Sep 17 00:00:00 2001 From: jsenior10 Date: Fri, 24 Apr 2026 17:56:52 +0100 Subject: [PATCH 12/18] ngpostproc::checkhalloftime --- src/system/rndobj/PostProc_NG.cpp | 14 ++++++++++++++ src/system/rndobj/PostProc_NG.h | 2 ++ src/system/rndobj/ShaderMgr.h | 1 + 3 files changed, 17 insertions(+) diff --git a/src/system/rndobj/PostProc_NG.cpp b/src/system/rndobj/PostProc_NG.cpp index a3f184586..87392dbd5 100644 --- a/src/system/rndobj/PostProc_NG.cpp +++ b/src/system/rndobj/PostProc_NG.cpp @@ -176,4 +176,18 @@ void NgPostProc::CheckNoise() { TheRenderState.SetTextureFilter(13, (RndRenderState::FilterMode)1, false); TheRenderState.SetTextureClamp(13, (RndRenderState::ClampMode)0); } +} + +void NgPostProc::CheckHallOfTime() { + if (HallOfTime() && !unk250) { + Vector4 c1(mHallOfTimeRate, mHallOfTimeMix, 0.0f, 0.0f); + TheShaderMgr.SetPConstant((PShaderConstant)0x73, c1); + + Vector4 c2( + mHallOfTimeColor.red, mHallOfTimeColor.green, mHallOfTimeColor.blue, 1.0f + ); + TheShaderMgr.SetPConstant((PShaderConstant)0x74, c2); + + TheShaderMgr.SetUnk34(mHallOfTimeType + 1); + } } \ No newline at end of file diff --git a/src/system/rndobj/PostProc_NG.h b/src/system/rndobj/PostProc_NG.h index 091dc6c57..12b172685 100644 --- a/src/system/rndobj/PostProc_NG.h +++ b/src/system/rndobj/PostProc_NG.h @@ -72,6 +72,8 @@ class NgPostProc : public RndPostProc { void CheckBlendPrevious(); void DoVelocity(); void CheckNoise(); + void CheckHueConverge(); + void CheckHallOfTime(); float unk22c; // 0x22c float unk230; // 0x230 diff --git a/src/system/rndobj/ShaderMgr.h b/src/system/rndobj/ShaderMgr.h index 074f6ef7a..370eb64e3 100644 --- a/src/system/rndobj/ShaderMgr.h +++ b/src/system/rndobj/ShaderMgr.h @@ -77,6 +77,7 @@ class RndShaderMgr { void SetUnk3e(bool b) { unk3e = b; } void SetUnk38(bool b) { unk38 = b; } void SetUnk39(bool b) { unk39 = b; } + void SetUnk34(int i) { unk34 = i; } protected: virtual void LoadShaders(const char *); From 572a4dbdf59c5974d9ce30f6050afc312c53618c Mon Sep 17 00:00:00 2001 From: jsenior10 Date: Sat, 25 Apr 2026 09:54:42 +0100 Subject: [PATCH 13/18] dopost, queuemotionblurobject & findinlist inline helper --- src/system/rndobj/PostProc_NG.cpp | 26 ++++++++++++++++++++++++++ src/system/rndobj/PostProc_NG.h | 15 +++++++++++++++ src/system/rndobj/ShaderMgr.h | 2 ++ 3 files changed, 43 insertions(+) diff --git a/src/system/rndobj/PostProc_NG.cpp b/src/system/rndobj/PostProc_NG.cpp index 87392dbd5..7bb1cc124 100644 --- a/src/system/rndobj/PostProc_NG.cpp +++ b/src/system/rndobj/PostProc_NG.cpp @@ -190,4 +190,30 @@ void NgPostProc::CheckHallOfTime() { TheShaderMgr.SetUnk34(mHallOfTimeType + 1); } +} + +void NgPostProc::DoPost() { + RndPostProc::DoPost(); + DoVelocity(); + DoBloom(); + ModulateColorXfm(); + CheckNoise(); + CheckBlendPrevious(); + CheckHallOfTime(); + CheckMotionBlur(); + CheckGradientMap(); + CheckHueConverge(); + CheckRefract(); + CheckChromaticAberration(); + CheckPosterizeAndKaleidoscope(); + CheckVignette(); + TheShaderMgr.SetUnk29(ColorXfmEnabled()); + TheShaderMgr.SetUnk2f(BlendPrevious()); + mBlendAmount = 0.0f; +} + +void NgPostProc::QueueMotionBlurObject(RndDrawable *drawable) { + if (FindInList(unk23c, drawable) == unk23c.end()) { + unk23c.push_back(drawable); + } } \ No newline at end of file diff --git a/src/system/rndobj/PostProc_NG.h b/src/system/rndobj/PostProc_NG.h index 12b172685..f8a04edbc 100644 --- a/src/system/rndobj/PostProc_NG.h +++ b/src/system/rndobj/PostProc_NG.h @@ -74,6 +74,21 @@ class NgPostProc : public RndPostProc { void CheckNoise(); void CheckHueConverge(); void CheckHallOfTime(); + void DoBloom(); + void ModulateColorXfm(); + void CheckRefract(); + void CheckChromaticAberration(); + void CheckPosterizeAndKaleidoscope(); + + ObjPtrList::iterator + FindInList(ObjPtrList &list, Object *o) { + FOREACH (it, list) { + if ((Object *)*it == o) { + return it; + } + } + return list.end(); + } float unk22c; // 0x22c float unk230; // 0x230 diff --git a/src/system/rndobj/ShaderMgr.h b/src/system/rndobj/ShaderMgr.h index 370eb64e3..8d9745fad 100644 --- a/src/system/rndobj/ShaderMgr.h +++ b/src/system/rndobj/ShaderMgr.h @@ -78,6 +78,8 @@ class RndShaderMgr { void SetUnk38(bool b) { unk38 = b; } void SetUnk39(bool b) { unk39 = b; } void SetUnk34(int i) { unk34 = i; } + void SetUnk29(bool b) { unk29 = b; } + void SetUnk2f(bool b) { unk2f = b; } protected: virtual void LoadShaders(const char *); From 1bf0b676b3feaa149e4ebd001ec70d8ad7e0a715 Mon Sep 17 00:00:00 2001 From: jsenior10 Date: Sat, 25 Apr 2026 11:06:23 +0100 Subject: [PATCH 14/18] locale stuff --- src/system/utl/Locale.cpp | 109 +++++++++++++++++++++++++++++++++++--- src/system/utl/Locale.h | 9 +++- 2 files changed, 108 insertions(+), 10 deletions(-) diff --git a/src/system/utl/Locale.cpp b/src/system/utl/Locale.cpp index ea809ad52..7702bc552 100644 --- a/src/system/utl/Locale.cpp +++ b/src/system/utl/Locale.cpp @@ -1,4 +1,6 @@ #include "utl/Locale.h" + +#include "DataPointMgr.h" #include "obj/DataFile.h" #include "obj/DataFunc.h" #include "os/Debug.h" @@ -8,22 +10,27 @@ #include "xdk/xbdm/xbdm.h" #include +char gLocaleBuffers[4][50]; // not sure if these 2 should be globals but i currently have +int gLocalBufIdx = 0; // no other ideas + DataNode DataSetLocaleVerboseNotify(DataArray *arr) { Locale::SetLocaleVerboseNotify(arr->Int(1)); return DataNode(0); } -DataNode DataToggleShowTokensCheat(DataArray *arr) { - return DataNode(0); -} +DataNode DataToggleShowTokensCheat(DataArray *arr) { return DataNode(0); } static int LocaleChunkSortFunc(const void *a, const void *b) { - const LocaleChunkSort::OrderedLocaleChunk *chunkA = (const LocaleChunkSort::OrderedLocaleChunk *)a; - const LocaleChunkSort::OrderedLocaleChunk *chunkB = (const LocaleChunkSort::OrderedLocaleChunk *)b; + const LocaleChunkSort::OrderedLocaleChunk *chunkA = + (const LocaleChunkSort::OrderedLocaleChunk *)a; + const LocaleChunkSort::OrderedLocaleChunk *chunkB = + (const LocaleChunkSort::OrderedLocaleChunk *)b; Symbol symA = chunkA->node1.LiteralSym(0); Symbol symB = chunkB->node1.LiteralSym(0); - if (symA < symB) return -1; - if (symA > symB) return 1; + if (symA < symB) + return -1; + if (symA > symB) + return 1; return chunkA->node2.Int(0) - chunkB->node2.Int(0); } @@ -66,7 +73,9 @@ void Locale::Init() { Symbol s60; // Check for alternate devkit locale file - String devkitPath(FileMakePath("devkit:\\locale", MakeString("%s\\locale_keep.dta", SystemLanguage()))); + String devkitPath(FileMakePath( + "devkit:\\locale", MakeString("%s\\locale_keep.dta", SystemLanguage()) + )); FileQualifiedFilename(devkitPath, devkitPath.c_str()); static Symbol locale("locale"); @@ -179,3 +188,87 @@ void Locale::Init() { DataRegisterFunc("set_locale_verbose_notify", DataSetLocaleVerboseNotify); DataRegisterFunc("toggle_show_tokens_cheat", DataToggleShowTokensCheat); } + +const char *Localize(Symbol sym, bool *found, Locale &loc) { + if (gShowTokensCheat) { + if (found) { + *found = true; + } + return sym.Str(); + } else { + const char *res = loc.Localize(sym, false); + bool is_found = (res != nullptr); + if (!is_found) { + res = sym.Str(); + Locale::sIgnoreMissingText = sym.Str(); + + if (Locale::GetLocaleVerboseNotify()) { + TheDebug.Notify(MakeString("\"%s\" needs localization", sym)); + } + } + if (found) { + *found = is_found; + } + + return res; + } +} + +const char *LocalizeFloat(const char *fmt, float num) { + const char *str = MakeString(fmt, num); + static Symbol locale_decimal_separator("locale_decimal_separator"); + const char *sep = TheLocale.Localize(locale_decimal_separator, false); + + if (sep != nullptr && *sep != '.') { + char *dest = gLocaleBuffers[gLocalBufIdx]; + + strncpy(dest, str, 50); + dest[49] = '\0'; + + for (char *ptr = dest; *ptr != '\0'; ++ptr) { + if (*ptr == '.') { + *ptr = *sep; + break; + } + } + + gLocalBufIdx = (gLocalBufIdx + 1) % 4; + + return dest; + } + return str; +} + +const char *Locale::Localize(Symbol sym, bool param_2) const { + if (sym.Str() == gNullStr) { + return ""; + } + if (!mSymTable) { + TheDebug.Fail(MakeString(kAssertStr, "Locale.cpp", 0x1d8, "mSymTable"), nullptr); + } + + static Symbol eng("eng"); + + if (mMagnuStrings) { + if (SystemLanguage() == eng) { + DataArray *arr = mMagnuStrings->FindArray(sym, false); + if (arr) { + return arr->Node(1).Str(arr); + } + } + } + { // if we dont scope index it uses 0x54 instead of 0x50 lol + int index; + if (FindDataIndex(sym, index, param_2)) { + return mStrTable[index]; + } + } + + if (UsingCD()) { + SendDebugDataPoint( + "debug/locale/token", "token", sym, "success", false + ); + } + + return nullptr; +} \ No newline at end of file diff --git a/src/system/utl/Locale.h b/src/system/utl/Locale.h index 137786f96..dce749635 100644 --- a/src/system/utl/Locale.h +++ b/src/system/utl/Locale.h @@ -47,18 +47,23 @@ class Locale { void Init(); void Terminate(); - // static const char *sIgnoreMissingText; + static const char *sIgnoreMissingText; void SetMagnuStrings(DataArray *); // bool FindDataIndex(Symbol, int &, bool) const; - // const char *Localize(Symbol, bool) const; + const char *Localize(Symbol, bool) const; static void SetLocaleVerboseNotify(bool set) { Locale::sVerboseNotify = set; } + static bool GetLocaleVerboseNotify() { return sVerboseNotify; } protected: + bool FindDataIndex(Symbol sym, int &index, bool b) const; + static bool sVerboseNotify; }; +bool gShowTokensCheat; + extern Locale TheLocale; const char *Localize(Symbol token, bool *success, Locale &locale); From 0c2bbe51c85e3fe50ddec3b19d047cd5c904634d Mon Sep 17 00:00:00 2001 From: jsenior10 Date: Sun, 26 Apr 2026 19:59:30 +0100 Subject: [PATCH 15/18] finddataindex --- src/system/utl/Locale.cpp | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/system/utl/Locale.cpp b/src/system/utl/Locale.cpp index 7702bc552..509a20ec1 100644 --- a/src/system/utl/Locale.cpp +++ b/src/system/utl/Locale.cpp @@ -18,7 +18,10 @@ DataNode DataSetLocaleVerboseNotify(DataArray *arr) { return DataNode(0); } -DataNode DataToggleShowTokensCheat(DataArray *arr) { return DataNode(0); } +DataNode DataToggleShowTokensCheat(DataArray *arr) { + gShowTokensCheat = !gShowTokensCheat; + return DataNode(0); +} static int LocaleChunkSortFunc(const void *a, const void *b) { const LocaleChunkSort::OrderedLocaleChunk *chunkA = @@ -271,4 +274,29 @@ const char *Locale::Localize(Symbol sym, bool param_2) const { } return nullptr; +} + +bool Locale::FindDataIndex(Symbol sym, int &index, bool fail) const { + int low = 0; + int high = mSize - 1; + + while (high - low >= 0) { + int mid = (low + high) >> 1; + Symbol midSym = mSymTable[mid]; + + if (sym > midSym) { + low = mid + 1; + } else if ((int)sym < (int)midSym) { + high = mid - 1; + } else { + index = mid; + return true; + } + } + + if (fail) { + MILO_FAIL("Couldn't find '%s' in array (file %s)", sym.Str(), mFile.Str()); + } + + return false; } \ No newline at end of file From cf427f8f5e080a3f9ced45edb64f01f52250c9e4 Mon Sep 17 00:00:00 2001 From: jsenior10 Date: Thu, 30 Apr 2026 13:01:21 +0100 Subject: [PATCH 16/18] clipplayer - clipstart, cliplength, getcliprange --- src/system/hamobj/ClipPlayer.cpp | 42 +++++++++++++++++++++++++++++++- src/system/hamobj/ClipPlayer.h | 1 + src/system/utl/Locale.cpp | 6 ++--- 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/src/system/hamobj/ClipPlayer.cpp b/src/system/hamobj/ClipPlayer.cpp index f236a3b0e..d5cc91d50 100644 --- a/src/system/hamobj/ClipPlayer.cpp +++ b/src/system/hamobj/ClipPlayer.cpp @@ -92,7 +92,22 @@ void ClipPlayer::PlayAnims(HamCharacter *c, float f1, float f2, int x) { } namespace { - float ClipStart(CharClip *, float, float &, float &); + float ClipStart(CharClip *clip, float beat, float &start, float &end) { + if (fmodf(beat, 1.0) != 0.0f && ceilf(beat) - beat < 0.0001f) { + beat = ceil(beat); + } + float offset = 0.0f; + float period = (clip->PlayFlags() >> 12) & 0xF; + + if (period != 0.0f) { + offset = Mod(beat - clip->StartBeat(), period); + } + + start = beat - offset; + end = clip->EndBeat() - clip->StartBeat() + start; + + return clip->StartBeat() + offset; + } } void ClipPlayer::PlayClip(CharClip *clip, float f1, float f2, HamDriver::LayerArray *arr) { @@ -215,3 +230,28 @@ void ClipPlayer::PlayNormal(float f1, HamDriver::LayerArray *arr, const char *cc } } } + +float ClipPlayer::ClipLength(CharClip *clip) { + float end = floor(clip->EndBeat()); + float start = ceil(clip->StartBeat()); + return end - start; +} + +bool ClipPlayer::GetClipRange( + const char *c1, const char *c2, float f1, float &f2, float &f3, float &f4 +) { + auto clip = mClipDir->Find(c1, false); + if (clip) { + float clipStart = ClipStart(clip, f1, f2, f3); + f4 = 1e+30; + auto clip2 = mClipDir->Find(c2, false); + if (clip2 != nullptr) { + auto node = clip->FindLastNode(clip2, clipStart); + if (node != nullptr) { + f4 = (node->curBeat - clip->StartBeat()) + f2; + } + } + return true; + } + return false; +} \ No newline at end of file diff --git a/src/system/hamobj/ClipPlayer.h b/src/system/hamobj/ClipPlayer.h index b275c212e..c9eb7a1f3 100644 --- a/src/system/hamobj/ClipPlayer.h +++ b/src/system/hamobj/ClipPlayer.h @@ -37,6 +37,7 @@ class ClipPlayer { void GetRoutineCrossoverClips(float, const char *, CharClip **, CharClip **); bool PushRoutineBuilderClip(int, HamDriver::LayerArray *); void PushClip(int, HamDriver::LayerArray *); + bool GetClipRange(const char *, const char *, float, float &, float &, float &); Keys *mClipKeys; // 0x0 Keys *mClipCrossoverKeys; // 0x4 diff --git a/src/system/utl/Locale.cpp b/src/system/utl/Locale.cpp index 509a20ec1..396a1d7f8 100644 --- a/src/system/utl/Locale.cpp +++ b/src/system/utl/Locale.cpp @@ -206,7 +206,7 @@ const char *Localize(Symbol sym, bool *found, Locale &loc) { Locale::sIgnoreMissingText = sym.Str(); if (Locale::GetLocaleVerboseNotify()) { - TheDebug.Notify(MakeString("\"%s\" needs localization", sym)); + MILO_NOTIFY("\"%s\" needs localization", sym); } } if (found) { @@ -246,9 +246,7 @@ const char *Locale::Localize(Symbol sym, bool param_2) const { if (sym.Str() == gNullStr) { return ""; } - if (!mSymTable) { - TheDebug.Fail(MakeString(kAssertStr, "Locale.cpp", 0x1d8, "mSymTable"), nullptr); - } + MILO_ASSERT(!mSymTable, 0x1d8); static Symbol eng("eng"); From 00c630577c1a72d48dcb0160bac7dae537f2877a Mon Sep 17 00:00:00 2001 From: jsenior10 Date: Thu, 30 Apr 2026 13:45:29 +0100 Subject: [PATCH 17/18] debuggraph draw improvements --- src/system/utl/DebugGraph.cpp | 80 +++++++++++++++++------------------ 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/src/system/utl/DebugGraph.cpp b/src/system/utl/DebugGraph.cpp index 860de6e9e..10976294e 100644 --- a/src/system/utl/DebugGraph.cpp +++ b/src/system/utl/DebugGraph.cpp @@ -24,70 +24,70 @@ void DebugGraph::Draw() { rnd->AddRectFilled2D(rect, mColorB); if (unk50) { - Vector2 minPos; - minPos.x = mRect.x; - minPos.y = mRect.y + mRect.h - 0.02f; - rnd->AddScreenString(MakeString("%.3f", unk3c), minPos, mColorA); - - Vector2 maxPos; - maxPos.x = mRect.x; - maxPos.y = mRect.y; - rnd->AddScreenString(MakeString("%.3f", unk40), maxPos, mColorA); + Vector2 minPos(mRect.x, mRect.y + mRect.h - 0.02f); + rnd->AddScreenString(MakeString("%.3f", unk3c), minPos, mColorA); + + Vector2 maxPos(mRect.x, mRect.y); + rnd->AddScreenString(MakeString("%.3f", unk40), maxPos, mColorA); } if (unk44 != FLT_MAX) { - Vector2 p1; - p1.x = mRect.x; - p1.y = mRect.y + mRect.h * (1.0f - clamp((unk44 - unk3c) / (unk40 - unk3c))); + Hmx::Color color(1.0f, 1.0f, 1.0f, 1.0f); - Vector2 p2; - p2.x = mRect.x + mRect.w; - p2.y = mRect.y + mRect.h * (1.0f - clamp((unk44 - unk3c) / (unk40 - unk3c))); + Vector2 p2( + mRect.w + mRect.x, + mRect.y + mRect.h * (1.0f - clamp((unk44 - unk3c) / (unk40 - unk3c))) + ); - rnd->AddScreenLine(p1, p2, Hmx::Color(1.0f, 1.0f, 1.0f, 1.0f), false); + Vector2 p1( + mRect.x, mRect.y + mRect.h * (1.0f - clamp((unk44 - unk3c) / (unk40 - unk3c))) + ); - Vector2 textPos; - textPos.x = mRect.x; - textPos.y = mRect.y + mRect.h * (1.0f - clamp((unk44 - unk3c) / (unk40 - unk3c))); + rnd->AddScreenLine(p1, p2, color, false); + + Vector2 textPos( + mRect.x, mRect.y + mRect.h * (1.0f - clamp((unk44 - unk3c) / (unk40 - unk3c))) + ); rnd->AddScreenString( - MakeString("%.3f", unk44), textPos, Hmx::Color(1.0f, 1.0f, 1.0f, 1.0f) + MakeString("%.3f", unk44), textPos, Hmx::Color(1.0f, 1.0f, 1.0f, 1.0f) ); } Vector2 titlePos; - titlePos.x = mRect.x + 0.1f; + titlePos.y = mRect.y; - rnd->AddScreenString(unk48.c_str(), titlePos, Hmx::Color(1.0f, 1.0f, 1.0f, 1.0f)); + Hmx::Color color(1.0f, 1.0f, 1.0f, 1.0f); + titlePos.x = mRect.x + 0.1f; + + rnd->AddScreenString(unk48.c_str(), titlePos, color); if (!mSamples.empty()) { auto it = mSamples.begin(); int idx = 1; - Vector2 prevPos; - prevPos.y = - mRect.y + mRect.h * (1.0f - clamp((it->data - unk3c) / (unk40 - unk3c))); - prevPos.x = mRect.x + mRect.w * (1.0f - clamp(0.0f / (float)(unk38 - 1))); + Vector2 prevPos( + mRect.x + mRect.w * (1.0f - clamp(0.0f / (float)(unk38 - 1))), + mRect.y + mRect.h * (1.0f - clamp((it->data - unk3c) / (unk40 - unk3c))) + ); ++it; for (; it != mSamples.end(); ++it) { - Vector2 curPos; - curPos.y = - mRect.y + mRect.h * (1.0f - clamp((it->data - unk3c) / (unk40 - unk3c))); - curPos.x = - mRect.x + mRect.w * (1.0f - clamp((float)idx / (float)(unk38 - 1))); + Vector2 curPos( + mRect.x + mRect.w * (1.0f - clamp((float)idx / (float)(unk38 - 1))), + mRect.y + mRect.h * (1.0f - clamp((it->data - unk3c) / (unk40 - unk3c))) + ); if (it->b) { - Vector2 hl_p1; - hl_p1.y = mRect.y + mRect.h; - - Vector2 hl_p2; - hl_p2.y = mRect.y; + Vector2 hl_p1( + mRect.x + mRect.w * (1.0f - clamp((float)idx / (float)(unk38 - 1))), + mRect.y + mRect.h + ); - hl_p1.x = - mRect.x + mRect.w * (1.0f - clamp((float)idx / (float)(unk38 - 1))); - hl_p2.x = - mRect.x + mRect.w * (1.0f - clamp((float)idx / (float)(unk38 - 1))); + Vector2 hl_p2( + mRect.x + mRect.w * (1.0f - clamp((float)idx / (float)(unk38 - 1))), + mRect.y + ); rnd->AddScreenLine( hl_p2, hl_p1, Hmx::Color(1.0f, 1.0f, 1.0f, 1.0f), false From c3c5bd036b489eb1b84c952f5055c8e2bdc6873b Mon Sep 17 00:00:00 2001 From: jsenior10 Date: Thu, 30 Apr 2026 14:25:32 +0100 Subject: [PATCH 18/18] fix broken datafunc match --- src/system/utl/Locale.cpp | 2 ++ src/system/utl/Locale.h | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/system/utl/Locale.cpp b/src/system/utl/Locale.cpp index 396a1d7f8..12c5cf5e1 100644 --- a/src/system/utl/Locale.cpp +++ b/src/system/utl/Locale.cpp @@ -13,6 +13,8 @@ char gLocaleBuffers[4][50]; // not sure if these 2 should be globals but i currently have int gLocalBufIdx = 0; // no other ideas +bool gShowTokensCheat; + DataNode DataSetLocaleVerboseNotify(DataArray *arr) { Locale::SetLocaleVerboseNotify(arr->Int(1)); return DataNode(0); diff --git a/src/system/utl/Locale.h b/src/system/utl/Locale.h index dce749635..e03c7c074 100644 --- a/src/system/utl/Locale.h +++ b/src/system/utl/Locale.h @@ -62,8 +62,6 @@ class Locale { static bool sVerboseNotify; }; -bool gShowTokensCheat; - extern Locale TheLocale; const char *Localize(Symbol token, bool *success, Locale &locale);