From e83bab90d783a49ba6342418452c5f7668da1e60 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Sun, 7 Jun 2026 22:10:52 +0100 Subject: [PATCH 1/3] fix for shape registration The automatic global static was hitting a destructor on xcode, this seemed like it was being pedantic about name at first but then between runs the same issue would come back. With this change it is wrapped in a function to get the vector instead. --- Engine/source/ts/loader/tsShapeLoader.cpp | 8 ++++---- Engine/source/ts/tsShape.cpp | 23 ++++++++++++++++------- Engine/source/ts/tsShape.h | 4 ++-- Engine/source/ts/tsShapeEdit.cpp | 2 +- 4 files changed, 23 insertions(+), 14 deletions(-) diff --git a/Engine/source/ts/loader/tsShapeLoader.cpp b/Engine/source/ts/loader/tsShapeLoader.cpp index 10d54bfec..50ff9ec3e 100644 --- a/Engine/source/ts/loader/tsShapeLoader.cpp +++ b/Engine/source/ts/loader/tsShapeLoader.cpp @@ -1302,9 +1302,9 @@ String TSShapeLoader::getFormatExtensions() { // "*.dsq TAB *.dae TAB StringBuilder output; - for(U32 n = 0; n < TSShape::sRegistrations.size(); ++n) + for(U32 n = 0; n < TSShape::getShapeRegistrations().size(); ++n) { - TSShape::ShapeRegistration reg = TSShape::sRegistrations[n]; + TSShape::ShapeRegistration reg = TSShape::getShapeRegistrations()[n]; for (U32 i = 0; i < reg.extensions.size(); i++) { TSShape::ShapeFormat format = reg.extensions[i]; @@ -1320,9 +1320,9 @@ String TSShapeLoader::getFormatFilters() { // "DSQ Files|*.dsq|COLLADA Files|*.dae|" StringBuilder output; - for (U32 n = 0; n < TSShape::sRegistrations.size(); ++n) + for (U32 n = 0; n < TSShape::getShapeRegistrations().size(); ++n) { - TSShape::ShapeRegistration reg = TSShape::sRegistrations[n]; + TSShape::ShapeRegistration reg = TSShape::getShapeRegistrations()[n]; for (U32 i = 0; i < reg.extensions.size(); i++) { TSShape::ShapeFormat format = reg.extensions[i]; diff --git a/Engine/source/ts/tsShape.cpp b/Engine/source/ts/tsShape.cpp index dc218ad72..43e3b40fe 100644 --- a/Engine/source/ts/tsShape.cpp +++ b/Engine/source/ts/tsShape.cpp @@ -38,19 +38,28 @@ #include "core/stream/fileStream.h" #include "core/fileObject.h" -Vector TSShape::sRegistrations(__FILE__, __LINE__); +// Vector TSShape::sShapeRegistrations(__FILE__, __LINE__); + +Vector& TSShape::getShapeRegistrations() + { + static Vector* regs = + new Vector(__FILE__, __LINE__); + + return *regs; + } void TSShape::sRegisterFormat(const ShapeRegistration& reg) { - U32 insert = sRegistrations.size(); - sRegistrations.insert(insert, reg); + U32 insert = getShapeRegistrations().size(); + getShapeRegistrations().insert(insert, reg); } -const TSShape::ShapeRegistration* TSShape::sFindRegInfo(const String& extension, bool exporting) + +const TSShape::ShapeRegistration* TSShape::sFindShapeRegInfo(const String& extension, bool exporting) { - for (U32 i = 0; i < TSShape::sRegistrations.size(); i++) + for (U32 i = 0; i < getShapeRegistrations().size(); i++) { - const TSShape::ShapeRegistration& reg = TSShape::sRegistrations[i]; + const TSShape::ShapeRegistration& reg = getShapeRegistrations()[i]; const Vector& extensions = exporting ? reg.export_extensions : reg.extensions; for (U32 j = 0; j < extensions.size(); j++) @@ -2358,7 +2367,7 @@ template<> void *Resource::create(const Torque::Path &path) } else { - const TSShape::ShapeRegistration* regInfo = TSShape::sFindRegInfo(extension); + const TSShape::ShapeRegistration* regInfo = TSShape::sFindShapeRegInfo(extension); if (regInfo == NULL) { readSuccess = false; diff --git a/Engine/source/ts/tsShape.h b/Engine/source/ts/tsShape.h index 733a36008..03e7c842a 100644 --- a/Engine/source/ts/tsShape.h +++ b/Engine/source/ts/tsShape.h @@ -122,8 +122,8 @@ public: }; static void sRegisterFormat(const ShapeRegistration& reg); - static const ShapeRegistration* sFindRegInfo(const String& extension, bool exporting = false); - static Vector sRegistrations; + static const ShapeRegistration* sFindShapeRegInfo(const String& extension, bool exporting = false); + static Vector& getShapeRegistrations(); /// Nodes hold the transforms in the shape's tree. They are the bones of the skeleton. struct Node diff --git a/Engine/source/ts/tsShapeEdit.cpp b/Engine/source/ts/tsShapeEdit.cpp index 042fb130f..e44a3be2e 100644 --- a/Engine/source/ts/tsShapeEdit.cpp +++ b/Engine/source/ts/tsShapeEdit.cpp @@ -1361,7 +1361,7 @@ bool TSShape::isShapeFileType(Torque::Path filePath) { String fileExt = filePath.getExtension(); - if (TSShape::sFindRegInfo(fileExt)) + if (TSShape::sFindShapeRegInfo(fileExt)) return true; return false; From 3aac9af35ef14ee39ee9712e3696e1c0f273b30a Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Sun, 7 Jun 2026 22:30:56 +0100 Subject: [PATCH 2/3] same change but for gbitmap make sure to use the namespace TSShape --- Engine/source/gfx/bitmap/gBitmap.cpp | 31 +++++++++++-------- Engine/source/gfx/bitmap/gBitmap.h | 2 +- Engine/source/gfx/gfxTextureManager.cpp | 4 +-- .../source/ts/collada/colladaShapeLoader.cpp | 4 +-- Engine/source/ts/tsShape.cpp | 18 +++++------ 5 files changed, 32 insertions(+), 27 deletions(-) diff --git a/Engine/source/gfx/bitmap/gBitmap.cpp b/Engine/source/gfx/bitmap/gBitmap.cpp index 8da452654..13dbb1fec 100644 --- a/Engine/source/gfx/bitmap/gBitmap.cpp +++ b/Engine/source/gfx/bitmap/gBitmap.cpp @@ -38,8 +38,13 @@ using namespace Torque; const U32 GBitmap::csFileVersion = 3; -Vector GBitmap::sRegistrations( __FILE__, __LINE__ ); +Vector& GBitmap::getBitmapRegistrations() +{ + static Vector * regs = + new Vector(__FILE__, __LINE__); + return *regs; +} GBitmap::GBitmap() : mInternalFormat(GFXFormatR8G8B8), @@ -198,24 +203,24 @@ U32 GBitmap::getFormatBytesPerPixel(GFXFormat fmt) void GBitmap::sRegisterFormat( const GBitmap::Registration ® ) { - U32 insert = sRegistrations.size(); - for ( U32 i = 0; i < sRegistrations.size(); i++ ) + U32 insert = GBitmap::getBitmapRegistrations().size(); + for ( U32 i = 0; i < GBitmap::getBitmapRegistrations().size(); i++ ) { - if ( sRegistrations[i].priority <= reg.priority ) + if ( GBitmap::getBitmapRegistrations()[i].priority <= reg.priority ) { insert = i; break; } } - sRegistrations.insert( insert, reg ); + GBitmap::getBitmapRegistrations().insert( insert, reg ); } const GBitmap::Registration *GBitmap::sFindRegInfo( const String &extension ) { - for ( U32 i = 0; i < GBitmap::sRegistrations.size(); i++ ) + for ( U32 i = 0; i < GBitmap::getBitmapRegistrations().size(); i++ ) { - const GBitmap::Registration ® = GBitmap::sRegistrations[i]; + const GBitmap::Registration ® = GBitmap::getBitmapRegistrations()[i]; const Vector &extensions = reg.extensions; for ( U32 j = 0; j < extensions.size(); ++j ) @@ -236,9 +241,9 @@ bool GBitmap::sFindFile( const Path &path, Path *outPath ) Path tryPath( path ); - for ( U32 i = 0; i < sRegistrations.size(); i++ ) + for ( U32 i = 0; i < GBitmap::getBitmapRegistrations().size(); i++ ) { - const Registration ® = sRegistrations[i]; + const Registration ® = GBitmap::getBitmapRegistrations()[i]; const Vector &extensions = reg.extensions; for ( U32 j = 0; j < extensions.size(); ++j ) @@ -266,9 +271,9 @@ bool GBitmap::sFindFiles( const Path &path, Vector *outFoundPaths ) Path tryPath( path ); - for ( U32 i = 0; i < GBitmap::sRegistrations.size(); i++ ) + for ( U32 i = 0; i < GBitmap::getBitmapRegistrations().size(); i++ ) { - const GBitmap::Registration ® = GBitmap::sRegistrations[i]; + const GBitmap::Registration ® = GBitmap::getBitmapRegistrations()[i]; const Vector &extensions = reg.extensions; for ( U32 j = 0; j < extensions.size(); ++j ) @@ -292,9 +297,9 @@ String GBitmap::sGetExtensionList() { String list; - for ( U32 i = 0; i < sRegistrations.size(); i++ ) + for ( U32 i = 0; i < GBitmap::getBitmapRegistrations().size(); i++ ) { - const Registration ® = sRegistrations[i]; + const Registration ® = GBitmap::getBitmapRegistrations()[i]; for ( U32 j = 0; j < reg.extensions.size(); j++ ) { list += reg.extensions[j]; diff --git a/Engine/source/gfx/bitmap/gBitmap.h b/Engine/source/gfx/bitmap/gBitmap.h index 8e99e47dd..86bb910b2 100644 --- a/Engine/source/gfx/bitmap/gBitmap.h +++ b/Engine/source/gfx/bitmap/gBitmap.h @@ -278,7 +278,7 @@ public: template void swizzle(const Swizzle *s); - static Vector sRegistrations; + static Vector& getBitmapRegistrations(); private: GFXFormat mInternalFormat; diff --git a/Engine/source/gfx/gfxTextureManager.cpp b/Engine/source/gfx/gfxTextureManager.cpp index 177978ff7..ebf509cfe 100644 --- a/Engine/source/gfx/gfxTextureManager.cpp +++ b/Engine/source/gfx/gfxTextureManager.cpp @@ -858,14 +858,14 @@ Torque::Path GFXTextureManager::validatePath(const Torque::Path &path) // Now loop through the rest of the GBitmap extensions // to see if we have any matches - for (U32 i = 0; i < GBitmap::sRegistrations.size(); i++) + for (U32 i = 0; i < GBitmap::getBitmapRegistrations().size(); i++) { // If we have gotten a match (either in this loop or before) // then we can exit if (textureExt) break; - const GBitmap::Registration ® = GBitmap::sRegistrations[i]; + const GBitmap::Registration ® = GBitmap::getBitmapRegistrations()[i]; const Vector &extensions = reg.extensions; for (U32 j = 0; j < extensions.size(); ++j) diff --git a/Engine/source/ts/collada/colladaShapeLoader.cpp b/Engine/source/ts/collada/colladaShapeLoader.cpp index b94e5aa11..584081ed9 100644 --- a/Engine/source/ts/collada/colladaShapeLoader.cpp +++ b/Engine/source/ts/collada/colladaShapeLoader.cpp @@ -407,9 +407,9 @@ void ColladaShapeLoader::computeBounds(Box3F& bounds) String findTextureExtension(const Torque::Path &texPath) { Torque::Path path(texPath); - for(S32 i = 0;i < GBitmap::sRegistrations.size();++i) + for(S32 i = 0;i < GBitmap::getBitmapRegistrations().size();++i) { - GBitmap::Registration ® = GBitmap::sRegistrations[i]; + GBitmap::Registration ® = GBitmap::getBitmapRegistrations()[i]; for(S32 j = 0;j < reg.extensions.size();++j) { path.setExtension(reg.extensions[j]); diff --git a/Engine/source/ts/tsShape.cpp b/Engine/source/ts/tsShape.cpp index 43e3b40fe..2e232a6d2 100644 --- a/Engine/source/ts/tsShape.cpp +++ b/Engine/source/ts/tsShape.cpp @@ -41,25 +41,25 @@ // Vector TSShape::sShapeRegistrations(__FILE__, __LINE__); Vector& TSShape::getShapeRegistrations() - { - static Vector* regs = - new Vector(__FILE__, __LINE__); +{ + static Vector* regs = + new Vector(__FILE__, __LINE__); - return *regs; - } + return *regs; +} void TSShape::sRegisterFormat(const ShapeRegistration& reg) { - U32 insert = getShapeRegistrations().size(); - getShapeRegistrations().insert(insert, reg); + U32 insert = TSShape::getShapeRegistrations().size(); + TSShape::getShapeRegistrations().insert(insert, reg); } const TSShape::ShapeRegistration* TSShape::sFindShapeRegInfo(const String& extension, bool exporting) { - for (U32 i = 0; i < getShapeRegistrations().size(); i++) + for (U32 i = 0; i < TSShape::getShapeRegistrations().size(); i++) { - const TSShape::ShapeRegistration& reg = getShapeRegistrations()[i]; + const TSShape::ShapeRegistration& reg = TSShape::getShapeRegistrations()[i]; const Vector& extensions = exporting ? reg.export_extensions : reg.extensions; for (U32 j = 0; j < extensions.size(); j++) From d4e9275240aa5f9ca1c46b9f7e12657f7505ff6c Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Sun, 7 Jun 2026 22:37:20 +0100 Subject: [PATCH 3/3] replace specific names for a universal getRegistrations --- Engine/source/gfx/bitmap/gBitmap.cpp | 26 +++++++++---------- Engine/source/gfx/bitmap/gBitmap.h | 2 +- Engine/source/gfx/gfxTextureManager.cpp | 4 +-- .../source/ts/collada/colladaShapeLoader.cpp | 4 +-- Engine/source/ts/loader/tsShapeLoader.cpp | 8 +++--- Engine/source/ts/tsShape.cpp | 10 +++---- Engine/source/ts/tsShape.h | 2 +- 7 files changed, 28 insertions(+), 28 deletions(-) diff --git a/Engine/source/gfx/bitmap/gBitmap.cpp b/Engine/source/gfx/bitmap/gBitmap.cpp index 13dbb1fec..bad0acb52 100644 --- a/Engine/source/gfx/bitmap/gBitmap.cpp +++ b/Engine/source/gfx/bitmap/gBitmap.cpp @@ -38,7 +38,7 @@ using namespace Torque; const U32 GBitmap::csFileVersion = 3; -Vector& GBitmap::getBitmapRegistrations() +Vector& GBitmap::getRegistrations() { static Vector * regs = new Vector(__FILE__, __LINE__); @@ -203,24 +203,24 @@ U32 GBitmap::getFormatBytesPerPixel(GFXFormat fmt) void GBitmap::sRegisterFormat( const GBitmap::Registration ® ) { - U32 insert = GBitmap::getBitmapRegistrations().size(); - for ( U32 i = 0; i < GBitmap::getBitmapRegistrations().size(); i++ ) + U32 insert = GBitmap::getRegistrations().size(); + for ( U32 i = 0; i < GBitmap::getRegistrations().size(); i++ ) { - if ( GBitmap::getBitmapRegistrations()[i].priority <= reg.priority ) + if ( GBitmap::getRegistrations()[i].priority <= reg.priority ) { insert = i; break; } } - GBitmap::getBitmapRegistrations().insert( insert, reg ); + GBitmap::getRegistrations().insert( insert, reg ); } const GBitmap::Registration *GBitmap::sFindRegInfo( const String &extension ) { - for ( U32 i = 0; i < GBitmap::getBitmapRegistrations().size(); i++ ) + for ( U32 i = 0; i < GBitmap::getRegistrations().size(); i++ ) { - const GBitmap::Registration ® = GBitmap::getBitmapRegistrations()[i]; + const GBitmap::Registration ® = GBitmap::getRegistrations()[i]; const Vector &extensions = reg.extensions; for ( U32 j = 0; j < extensions.size(); ++j ) @@ -241,9 +241,9 @@ bool GBitmap::sFindFile( const Path &path, Path *outPath ) Path tryPath( path ); - for ( U32 i = 0; i < GBitmap::getBitmapRegistrations().size(); i++ ) + for ( U32 i = 0; i < GBitmap::getRegistrations().size(); i++ ) { - const Registration ® = GBitmap::getBitmapRegistrations()[i]; + const Registration ® = GBitmap::getRegistrations()[i]; const Vector &extensions = reg.extensions; for ( U32 j = 0; j < extensions.size(); ++j ) @@ -271,9 +271,9 @@ bool GBitmap::sFindFiles( const Path &path, Vector *outFoundPaths ) Path tryPath( path ); - for ( U32 i = 0; i < GBitmap::getBitmapRegistrations().size(); i++ ) + for ( U32 i = 0; i < GBitmap::getRegistrations().size(); i++ ) { - const GBitmap::Registration ® = GBitmap::getBitmapRegistrations()[i]; + const GBitmap::Registration ® = GBitmap::getRegistrations()[i]; const Vector &extensions = reg.extensions; for ( U32 j = 0; j < extensions.size(); ++j ) @@ -297,9 +297,9 @@ String GBitmap::sGetExtensionList() { String list; - for ( U32 i = 0; i < GBitmap::getBitmapRegistrations().size(); i++ ) + for ( U32 i = 0; i < GBitmap::getRegistrations().size(); i++ ) { - const Registration ® = GBitmap::getBitmapRegistrations()[i]; + const Registration ® = GBitmap::getRegistrations()[i]; for ( U32 j = 0; j < reg.extensions.size(); j++ ) { list += reg.extensions[j]; diff --git a/Engine/source/gfx/bitmap/gBitmap.h b/Engine/source/gfx/bitmap/gBitmap.h index 86bb910b2..fab66168f 100644 --- a/Engine/source/gfx/bitmap/gBitmap.h +++ b/Engine/source/gfx/bitmap/gBitmap.h @@ -278,7 +278,7 @@ public: template void swizzle(const Swizzle *s); - static Vector& getBitmapRegistrations(); + static Vector& getRegistrations(); private: GFXFormat mInternalFormat; diff --git a/Engine/source/gfx/gfxTextureManager.cpp b/Engine/source/gfx/gfxTextureManager.cpp index ebf509cfe..6d56b1760 100644 --- a/Engine/source/gfx/gfxTextureManager.cpp +++ b/Engine/source/gfx/gfxTextureManager.cpp @@ -858,14 +858,14 @@ Torque::Path GFXTextureManager::validatePath(const Torque::Path &path) // Now loop through the rest of the GBitmap extensions // to see if we have any matches - for (U32 i = 0; i < GBitmap::getBitmapRegistrations().size(); i++) + for (U32 i = 0; i < GBitmap::getRegistrations().size(); i++) { // If we have gotten a match (either in this loop or before) // then we can exit if (textureExt) break; - const GBitmap::Registration ® = GBitmap::getBitmapRegistrations()[i]; + const GBitmap::Registration ® = GBitmap::getRegistrations()[i]; const Vector &extensions = reg.extensions; for (U32 j = 0; j < extensions.size(); ++j) diff --git a/Engine/source/ts/collada/colladaShapeLoader.cpp b/Engine/source/ts/collada/colladaShapeLoader.cpp index 584081ed9..b082678bd 100644 --- a/Engine/source/ts/collada/colladaShapeLoader.cpp +++ b/Engine/source/ts/collada/colladaShapeLoader.cpp @@ -407,9 +407,9 @@ void ColladaShapeLoader::computeBounds(Box3F& bounds) String findTextureExtension(const Torque::Path &texPath) { Torque::Path path(texPath); - for(S32 i = 0;i < GBitmap::getBitmapRegistrations().size();++i) + for(S32 i = 0;i < GBitmap::getRegistrations().size();++i) { - GBitmap::Registration ® = GBitmap::getBitmapRegistrations()[i]; + GBitmap::Registration ® = GBitmap::getRegistrations()[i]; for(S32 j = 0;j < reg.extensions.size();++j) { path.setExtension(reg.extensions[j]); diff --git a/Engine/source/ts/loader/tsShapeLoader.cpp b/Engine/source/ts/loader/tsShapeLoader.cpp index 50ff9ec3e..c63b4a471 100644 --- a/Engine/source/ts/loader/tsShapeLoader.cpp +++ b/Engine/source/ts/loader/tsShapeLoader.cpp @@ -1302,9 +1302,9 @@ String TSShapeLoader::getFormatExtensions() { // "*.dsq TAB *.dae TAB StringBuilder output; - for(U32 n = 0; n < TSShape::getShapeRegistrations().size(); ++n) + for(U32 n = 0; n < TSShape::getRegistrations().size(); ++n) { - TSShape::ShapeRegistration reg = TSShape::getShapeRegistrations()[n]; + TSShape::ShapeRegistration reg = TSShape::getRegistrations()[n]; for (U32 i = 0; i < reg.extensions.size(); i++) { TSShape::ShapeFormat format = reg.extensions[i]; @@ -1320,9 +1320,9 @@ String TSShapeLoader::getFormatFilters() { // "DSQ Files|*.dsq|COLLADA Files|*.dae|" StringBuilder output; - for (U32 n = 0; n < TSShape::getShapeRegistrations().size(); ++n) + for (U32 n = 0; n < TSShape::getRegistrations().size(); ++n) { - TSShape::ShapeRegistration reg = TSShape::getShapeRegistrations()[n]; + TSShape::ShapeRegistration reg = TSShape::getRegistrations()[n]; for (U32 i = 0; i < reg.extensions.size(); i++) { TSShape::ShapeFormat format = reg.extensions[i]; diff --git a/Engine/source/ts/tsShape.cpp b/Engine/source/ts/tsShape.cpp index 2e232a6d2..0ae2305b6 100644 --- a/Engine/source/ts/tsShape.cpp +++ b/Engine/source/ts/tsShape.cpp @@ -40,7 +40,7 @@ // Vector TSShape::sShapeRegistrations(__FILE__, __LINE__); -Vector& TSShape::getShapeRegistrations() +Vector& TSShape::getRegistrations() { static Vector* regs = new Vector(__FILE__, __LINE__); @@ -50,16 +50,16 @@ Vector& TSShape::getShapeRegistrations() void TSShape::sRegisterFormat(const ShapeRegistration& reg) { - U32 insert = TSShape::getShapeRegistrations().size(); - TSShape::getShapeRegistrations().insert(insert, reg); + U32 insert = TSShape::getRegistrations().size(); + TSShape::getRegistrations().insert(insert, reg); } const TSShape::ShapeRegistration* TSShape::sFindShapeRegInfo(const String& extension, bool exporting) { - for (U32 i = 0; i < TSShape::getShapeRegistrations().size(); i++) + for (U32 i = 0; i < TSShape::getRegistrations().size(); i++) { - const TSShape::ShapeRegistration& reg = TSShape::getShapeRegistrations()[i]; + const TSShape::ShapeRegistration& reg = TSShape::getRegistrations()[i]; const Vector& extensions = exporting ? reg.export_extensions : reg.extensions; for (U32 j = 0; j < extensions.size(); j++) diff --git a/Engine/source/ts/tsShape.h b/Engine/source/ts/tsShape.h index 03e7c842a..9499e6b6a 100644 --- a/Engine/source/ts/tsShape.h +++ b/Engine/source/ts/tsShape.h @@ -123,7 +123,7 @@ public: static void sRegisterFormat(const ShapeRegistration& reg); static const ShapeRegistration* sFindShapeRegInfo(const String& extension, bool exporting = false); - static Vector& getShapeRegistrations(); + static Vector& getRegistrations(); /// Nodes hold the transforms in the shape's tree. They are the bones of the skeleton. struct Node