From 1f41a9ca80a5f44d15e4aa08e17f8dbcd9ef07a1 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Fri, 5 Mar 2021 22:43:32 -0400 Subject: [PATCH] Fix ObstacleColorizer using custom-types --- include/colorizer/ObstacleColorizer.hpp | 62 ++++++++++++++----------- src/colorizer/ObstacleColorizer.cpp | 36 +++++++------- src/main.cpp | 4 +- 3 files changed, 57 insertions(+), 45 deletions(-) diff --git a/include/colorizer/ObstacleColorizer.hpp b/include/colorizer/ObstacleColorizer.hpp index 77a74f7..d9bf28e 100644 --- a/include/colorizer/ObstacleColorizer.hpp +++ b/include/colorizer/ObstacleColorizer.hpp @@ -8,11 +8,45 @@ #include #include #include +#include "custom-types/shared/types.hpp" +#include "custom-types/shared/macros.hpp" +// We use custom types here to avoid GC deleting our variables +DECLARE_CLASS_CODEGEN(Chroma, OCColorManager, Il2CppObject, + + public: + inline static int _tintColorID = -1; + inline static int _addColorID = -1; + inline static std::optional _globalColor = std::nullopt; + UnityEngine::Color _color_Original; + + + static OCColorManager* GetOCColorManager(GlobalNamespace::ObstacleController* oc); + static OCColorManager* CreateOCColorManager(GlobalNamespace::ObstacleController* oc); + static void SetGlobalObstacleColor(std::optional color); + static void ResetGlobal(); + void Reset(); + void SetObstacleColor(std::optional color); + void SetActiveColors(); + + DECLARE_INSTANCE_FIELD(GlobalNamespace::SimpleColorSO*, _color); + DECLARE_INSTANCE_FIELD(GlobalNamespace::StretchableObstacle*, _stretchableObstacle); + DECLARE_INSTANCE_FIELD(GlobalNamespace::ObstacleController*, _oc); + + DECLARE_CTOR(ctor, GlobalNamespace::ObstacleController* oc); + + REGISTER_FUNCTION(Chroma::LSEColorManager, + getLogger().debug("Registering LSEColorManager!"); + REGISTER_METHOD(ctor); + + REGISTER_FIELD(_color); + REGISTER_FIELD(_stretchableObstacle); + REGISTER_FIELD(_oc); + ) +) // TODO: Document properly -// TODO: Does this need to become a custom type? namespace Chroma { class ObstacleColorizer { public: @@ -29,30 +63,6 @@ namespace Chroma { */ static void OCStart(GlobalNamespace::ObstacleController* oc); - class OCColorManager - { - private: - inline static int _tintColorID = -1; - inline static int _addColorID = -1; - static std::optional _globalColor; - GlobalNamespace::ObstacleController* _oc; - UnityEngine::Color _color_Original; - // TODO: THIS MAY GET GC'ED. WE MAY NEED CUSTOM TYPES - SafePtr _color; - GlobalNamespace::StretchableObstacle* _stretchableObstacle; - explicit OCColorManager(GlobalNamespace::ObstacleController* oc); - - public: - static OCColorManager* GetOCColorManager(GlobalNamespace::ObstacleController* oc); - static OCColorManager* CreateOCColorManager(GlobalNamespace::ObstacleController* oc); - static void SetGlobalObstacleColor(std::optional color); - static void ResetGlobal(); - void Reset(); - void SetObstacleColor(std::optional color); - void SetActiveColors(); - }; - private: inline static std::vector _ocColorManagers = {}; }; -} - +} \ No newline at end of file diff --git a/src/colorizer/ObstacleColorizer.cpp b/src/colorizer/ObstacleColorizer.cpp index 9ddfaeb..09b4c27 100644 --- a/src/colorizer/ObstacleColorizer.cpp +++ b/src/colorizer/ObstacleColorizer.cpp @@ -16,9 +16,7 @@ using namespace UnityEngine; using namespace Chroma; -std::optional ObstacleColorizer::OCColorManager::_globalColor = std::nullopt; - - +DEFINE_CLASS(Chroma::OCColorManager); void ObstacleColorizer::Reset(GlobalNamespace::ObstacleController *oc) { auto ocman = OCColorManager::GetOCColorManager(oc); @@ -70,10 +68,13 @@ void ObstacleColorizer::ClearOCColorManagers() { } void ObstacleColorizer::OCStart(GlobalNamespace::ObstacleController *oc) { + getLogger().debug("Create oc"); OCColorManager::CreateOCColorManager(oc); } -ObstacleColorizer::OCColorManager::OCColorManager(GlobalNamespace::ObstacleController *oc) { + + +void OCColorManager::ctor(GlobalNamespace::ObstacleController *oc) { _oc = oc; _stretchableObstacle = _oc->stretchableObstacle; @@ -81,17 +82,16 @@ ObstacleColorizer::OCColorManager::OCColorManager(GlobalNamespace::ObstacleContr if (_color == nullptr) { - // TODO: We might need custom type here - _color = SafePtr(ScriptableObject::CreateInstance()); + _color = ScriptableObject::CreateInstance(); _color->SetColor(_color_Original); } oc->color = _color; } -ObstacleColorizer::OCColorManager * -ObstacleColorizer::OCColorManager::GetOCColorManager(GlobalNamespace::ObstacleController *oc) { - for (auto& n : _ocColorManagers) { +OCColorManager * +OCColorManager::GetOCColorManager(GlobalNamespace::ObstacleController *oc) { + for (auto& n : ObstacleColorizer::_ocColorManagers) { if (n->_oc == oc) return n; } @@ -99,30 +99,30 @@ ObstacleColorizer::OCColorManager::GetOCColorManager(GlobalNamespace::ObstacleCo return nullptr; } -ObstacleColorizer::OCColorManager * -ObstacleColorizer::OCColorManager::CreateOCColorManager(GlobalNamespace::ObstacleController *oc) { +OCColorManager * +OCColorManager::CreateOCColorManager(GlobalNamespace::ObstacleController *oc) { if (GetOCColorManager(oc) != nullptr) { return nullptr; } - auto occm = new OCColorManager(oc); - _ocColorManagers.push_back(occm); + OCColorManager* occm = CRASH_UNLESS(il2cpp_utils::New(oc)); + ObstacleColorizer::_ocColorManagers.push_back(occm); return occm; } -void ObstacleColorizer::OCColorManager::SetGlobalObstacleColor(std::optional color) { +void OCColorManager::SetGlobalObstacleColor(std::optional color) { if (color) { _globalColor = color.value(); } } -void ObstacleColorizer::OCColorManager::ResetGlobal() { +void OCColorManager::ResetGlobal() { _globalColor = std::nullopt; } -void ObstacleColorizer::OCColorManager::Reset() { +void OCColorManager::Reset() { if (_globalColor) { _color->SetColor(_globalColor.value()); @@ -133,14 +133,14 @@ void ObstacleColorizer::OCColorManager::Reset() { } } -void ObstacleColorizer::OCColorManager::SetObstacleColor(std::optional color) { +void OCColorManager::SetObstacleColor(std::optional color) { if (color) { _color->SetColor(color.value()); } } -void ObstacleColorizer::OCColorManager::SetActiveColors() { +void OCColorManager::SetActiveColors() { ParametricBoxFrameController* obstacleFrame = _stretchableObstacle->obstacleFrame; ParametricBoxFakeGlowController* obstacleFakeGlow = _stretchableObstacle->obstacleFakeGlow; Array *materialPropertyBlockControllers = _stretchableObstacle->materialPropertyBlockControllers; diff --git a/src/main.cpp b/src/main.cpp index d9ed69f..07ce7f0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4,6 +4,7 @@ #include "Chroma.hpp" #include "colorizer/LightColorizer.hpp" +#include "colorizer/ObstacleColorizer.hpp" #include "colorizer/SaberColorizer.hpp" #include "custom-types/shared/register.hpp" @@ -47,7 +48,8 @@ extern "C" void load() { custom_types::Register::RegisterTypes< Chroma::LSEColorManager, - Chroma::ChromaGradientController + Chroma::ChromaGradientController, + Chroma::OCColorManager >(); getLogger().info("Installed types");