From e912636633e297a3efe2dd5675f2d78b93447a8d Mon Sep 17 00:00:00 2001 From: MysterD Date: Wed, 4 May 2022 00:14:33 -0700 Subject: [PATCH] Automatically disable billboards on DynOS models with >6 vertices --- data/dynos.cpp.h | 4 +++- data/dynos_bin_geo.cpp | 2 +- data/dynos_bin_gfx.cpp | 2 +- data/dynos_bin_lvl.cpp | 2 +- data/dynos_bin_movtexqc.cpp | 2 +- data/dynos_bin_pointer.cpp | 10 +++++++--- data/dynos_bin_texlist.cpp | 2 +- data/dynos_bin_vtx.cpp | 7 +++++++ data/dynos_mgr_pack.cpp | 13 ++++--------- 9 files changed, 26 insertions(+), 18 deletions(-) diff --git a/data/dynos.cpp.h b/data/dynos.cpp.h index 86687139..7c97992b 100644 --- a/data/dynos.cpp.h +++ b/data/dynos.cpp.h @@ -390,6 +390,7 @@ struct DataNode : NoCopy { Array mTokens; u64 mModelIdentifier = 0; u64 mLoadIndex = 0; + u8 mFlags = 0; }; template using DataNodes = Array*>; @@ -819,6 +820,7 @@ void DynOS_Col_Generate(const SysPath &aPackFolder, Array> _Ac DataNode* DynOS_Geo_Parse(GfxData* aGfxData, DataNode* aNode, bool aDisplayPercent); void DynOS_Geo_Write(FILE *aFile, GfxData *aGfxData, DataNode *aNode); +DataNode** DynOS_Geo_GetLoading(void); void DynOS_Geo_Load(FILE *aFile, GfxData *aGfxData); DataNode* DynOS_Gfx_Parse(GfxData* aGfxData, DataNode* aNode); @@ -873,7 +875,7 @@ void DynOS_Vtx_Load(FILE *aFile, GfxData *aGfxData); void DynOS_Pointer_Lua_Write(FILE* aFile, u32 index, GfxData* aGfxData); void DynOS_Pointer_Write(FILE* aFile, const void* aPtr, GfxData* aGfxData); -void *DynOS_Pointer_Load(FILE *aFile, GfxData *aGfxData, u32 aValue); +void *DynOS_Pointer_Load(FILE *aFile, GfxData *aGfxData, u32 aValue, u8* outFlags); void DynOS_GfxDynCmd_Load(FILE *aFile, GfxData *aGfxData); diff --git a/data/dynos_bin_geo.cpp b/data/dynos_bin_geo.cpp index 2853143a..1f71a3fe 100644 --- a/data/dynos_bin_geo.cpp +++ b/data/dynos_bin_geo.cpp @@ -443,7 +443,7 @@ void DynOS_Geo_Load(FILE *aFile, GfxData *aGfxData) { _Node->mData = New(_Node->mSize); for (u32 i = 0; i != _Node->mSize; ++i) { u32 _Value = ReadBytes(aFile); - void *_Ptr = DynOS_Pointer_Load(aFile, aGfxData, _Value); + void *_Ptr = DynOS_Pointer_Load(aFile, aGfxData, _Value, &_Node->mFlags); if (_Ptr) { _Node->mData[i] = (uintptr_t) _Ptr; } else { diff --git a/data/dynos_bin_gfx.cpp b/data/dynos_bin_gfx.cpp index f3c34c61..939e6ba7 100644 --- a/data/dynos_bin_gfx.cpp +++ b/data/dynos_bin_gfx.cpp @@ -973,7 +973,7 @@ void DynOS_Gfx_Load(FILE *aFile, GfxData *aGfxData) { for (u32 i = 0; i != _Node->mSize; ++i) { u32 _WordsW0 = ReadBytes(aFile); u32 _WordsW1 = ReadBytes(aFile); - void *_Ptr = DynOS_Pointer_Load(aFile, aGfxData, _WordsW1); + void *_Ptr = DynOS_Pointer_Load(aFile, aGfxData, _WordsW1, &_Node->mFlags); if (_Ptr) { _Node->mData[i].words.w0 = (uintptr_t) _WordsW0; _Node->mData[i].words.w1 = (uintptr_t) _Ptr; diff --git a/data/dynos_bin_lvl.cpp b/data/dynos_bin_lvl.cpp index 9ef2cade..9efd2501 100644 --- a/data/dynos_bin_lvl.cpp +++ b/data/dynos_bin_lvl.cpp @@ -1984,7 +1984,7 @@ static DataNode* DynOS_Lvl_Load(FILE *aFile, GfxData *aGfxData) { // Read it for (u32 i = 0; i != _Node->mSize; ++i) { u32 _Value = ReadBytes(aFile); - void *_Ptr = DynOS_Pointer_Load(aFile, aGfxData, _Value); + void *_Ptr = DynOS_Pointer_Load(aFile, aGfxData, _Value, &_Node->mFlags); if (_Ptr) { _Node->mData[i] = (uintptr_t) _Ptr; } else { diff --git a/data/dynos_bin_movtexqc.cpp b/data/dynos_bin_movtexqc.cpp index 5f955140..5d8f6c76 100644 --- a/data/dynos_bin_movtexqc.cpp +++ b/data/dynos_bin_movtexqc.cpp @@ -84,7 +84,7 @@ DataNode* DynOS_MovtexQC_Load(FILE *aFile, GfxData *aGfxData) { for (u32 i = 0; i != _Node->mSize; ++i) { _Node->mData[i].id = ReadBytes(aFile); u32 _Value = ReadBytes(aFile); - void *_Ptr = DynOS_Pointer_Load(aFile, aGfxData, _Value); + void *_Ptr = DynOS_Pointer_Load(aFile, aGfxData, _Value, &_Node->mFlags); _Node->mData[i].quadArraySegmented = (Movtex*)_Ptr; } diff --git a/data/dynos_bin_pointer.cpp b/data/dynos_bin_pointer.cpp index 62965209..91bb014a 100644 --- a/data/dynos_bin_pointer.cpp +++ b/data/dynos_bin_pointer.cpp @@ -2,6 +2,7 @@ extern "C" { #include "behavior_table.h" #include "levels/scripts.h" +#include "engine/graph_node.h" } ///////////// @@ -224,7 +225,7 @@ void DynOS_Pointer_Write(FILE* aFile, const void* aPtr, GfxData* aGfxData) { // Reading // ///////////// -static void *GetPointerFromData(GfxData *aGfxData, const String &aPtrName, u32 aPtrData) { +static void *GetPointerFromData(GfxData *aGfxData, const String &aPtrName, u32 aPtrData, u8* outFlags) { // Lights for (auto& _Node : aGfxData->mLights) { @@ -285,6 +286,7 @@ static void *GetPointerFromData(GfxData *aGfxData, const String &aPtrName, u32 a // Display lists for (auto &_Node : aGfxData->mDisplayLists) { if (_Node->mName == aPtrName) { + *outFlags |= _Node->mFlags; return (void *) _Node->mData; } } @@ -292,6 +294,7 @@ static void *GetPointerFromData(GfxData *aGfxData, const String &aPtrName, u32 a // Geo layouts for (auto &_Node : aGfxData->mGeoLayouts) { if (_Node->mName == aPtrName) { + *outFlags |= _Node->mFlags; return (void *) _Node->mData; } } @@ -299,6 +302,7 @@ static void *GetPointerFromData(GfxData *aGfxData, const String &aPtrName, u32 a // Vertices for (auto &_Node : aGfxData->mVertices) { if (_Node->mName == aPtrName) { + *outFlags |= _Node->mFlags; return (void *) (_Node->mData + aPtrData); } } @@ -393,7 +397,7 @@ static void *GetPointerFromData(GfxData *aGfxData, const String &aPtrName, u32 a return NULL; } -void *DynOS_Pointer_Load(FILE *aFile, GfxData *aGfxData, u32 aValue) { +void *DynOS_Pointer_Load(FILE *aFile, GfxData *aGfxData, u32 aValue, u8* outFlags) { // LUAV if (aValue == LUA_VAR_CODE) { @@ -418,7 +422,7 @@ void *DynOS_Pointer_Load(FILE *aFile, GfxData *aGfxData, u32 aValue) { if (aValue == POINTER_CODE) { String _PtrName; _PtrName.Read(aFile); u32 _PtrData = ReadBytes(aFile); - return GetPointerFromData(aGfxData, _PtrName, _PtrData); + return GetPointerFromData(aGfxData, _PtrName, _PtrData, outFlags); } // Not a pointer diff --git a/data/dynos_bin_texlist.cpp b/data/dynos_bin_texlist.cpp index e362bad3..4729dbe6 100644 --- a/data/dynos_bin_texlist.cpp +++ b/data/dynos_bin_texlist.cpp @@ -76,7 +76,7 @@ DataNode* DynOS_TexList_Load(FILE *aFile, GfxData *aGfxData) { _Node->mData = New(_Node->mSize); for (u32 i = 0; i != _Node->mSize; ++i) { u32 _Value = ReadBytes(aFile); - void *_Ptr = DynOS_Pointer_Load(aFile, aGfxData, _Value); + void *_Ptr = DynOS_Pointer_Load(aFile, aGfxData, _Value, &_Node->mFlags); if (_Ptr == NULL) { PrintError("Could not read texture in texlist"); } else { diff --git a/data/dynos_bin_vtx.cpp b/data/dynos_bin_vtx.cpp index d5ba5e9b..31d28c72 100644 --- a/data/dynos_bin_vtx.cpp +++ b/data/dynos_bin_vtx.cpp @@ -1,4 +1,7 @@ #include "dynos.cpp.h" +extern "C" { +#include "engine/graph_node.h" +} #define F32VTX_SENTINEL_0 0x3346 #define F32VTX_SENTINEL_1 0x5632 @@ -138,6 +141,10 @@ void DynOS_Vtx_Load(FILE *aFile, GfxData *aGfxData) { } } + if (_Node->mSize > 6) { + _Node->mFlags |= GRAPH_EXTRA_FORCE_3D; + } + // Append aGfxData->mVertices.Add(_Node); } diff --git a/data/dynos_mgr_pack.cpp b/data/dynos_mgr_pack.cpp index 210a909b..b40ef52a 100644 --- a/data/dynos_mgr_pack.cpp +++ b/data/dynos_mgr_pack.cpp @@ -12,7 +12,8 @@ static void DynOS_Pack_ActivateActor(s32 aPackIndex, PairmGeoLayouts.end() - 1))->mData, false); + auto& geoNode = *(aGfxData->mGeoLayouts.end() - 1); + GraphNode* graphNode = (GraphNode *) DynOS_Geo_GetGraphNode(geoNode->mData, false); if (graphNode == NULL) { return; } const void* georef = DynOS_Builtin_Actor_GetFromName(aActorName); @@ -23,15 +24,9 @@ static void DynOS_Pack_ActivateActor(s32 aPackIndex, PairmVertices) { - vertices += vtx->mSize; - } - if (vertices > 6) { + if (geoNode->mFlags & GRAPH_EXTRA_FORCE_3D) { actorGfx.mGraphNode->extraFlags |= GRAPH_EXTRA_FORCE_3D; - }*/ + } DynOS_Actor_Valid(georef, actorGfx); }