From 6f9e9bfa34479b18ee04cd4676cd484b77ba0339 Mon Sep 17 00:00:00 2001 From: adaf Date: Thu, 5 Dec 2024 12:23:14 +0700 Subject: [PATCH] BlockModelStorage update --- Geome3Dash/Geome3Dash.vcxproj | 4 +- Geome3Dash/Geome3Dash.vcxproj.filters | 4 +- ...odelsStorage.cpp => BlockModelStorage.cpp} | 47 +++++++++++-------- ...ockModelsStorage.h => BlockModelStorage.h} | 10 ++-- Geome3Dash/src/CocosShaderProgram.cpp | 4 +- Geome3Dash/src/game/component/G3DBaseNode.cpp | 4 +- Geome3Dash/src/game/component/G3DBaseNode.h | 4 +- .../src/game/editor/G3DCurveEditorLayer.cpp | 6 +-- Geome3Dash/src/game/editor/G3DEditorPopup.cpp | 6 +-- Geome3Dash/src/game/planet/G3DPlanetLayer.cpp | 4 +- Geome3Dash/src/game/playing/G3DPlayLayer.cpp | 8 ++-- .../src/game/test/G3DModelPreviewLayer.cpp | 10 ++-- Geome3Dash/src/hook/CreatorLayer.cpp | 18 +++---- Geome3Dash/src/hook/MenuLayer.cpp | 15 +++--- 14 files changed, 77 insertions(+), 67 deletions(-) rename Geome3Dash/src/{BlockModelsStorage.cpp => BlockModelStorage.cpp} (77%) rename Geome3Dash/src/{BlockModelsStorage.h => BlockModelStorage.h} (92%) diff --git a/Geome3Dash/Geome3Dash.vcxproj b/Geome3Dash/Geome3Dash.vcxproj index fb1e59cf..b2aa54cc 100644 --- a/Geome3Dash/Geome3Dash.vcxproj +++ b/Geome3Dash/Geome3Dash.vcxproj @@ -98,7 +98,7 @@ Create - + @@ -192,7 +192,7 @@ - + diff --git a/Geome3Dash/Geome3Dash.vcxproj.filters b/Geome3Dash/Geome3Dash.vcxproj.filters index 4a9deb61..874afed4 100644 --- a/Geome3Dash/Geome3Dash.vcxproj.filters +++ b/Geome3Dash/Geome3Dash.vcxproj.filters @@ -147,7 +147,7 @@ Source Files - + Source Files @@ -341,7 +341,7 @@ Header Files - + Header Files diff --git a/Geome3Dash/src/BlockModelsStorage.cpp b/Geome3Dash/src/BlockModelStorage.cpp similarity index 77% rename from Geome3Dash/src/BlockModelsStorage.cpp rename to Geome3Dash/src/BlockModelStorage.cpp index 39bfb114..94c5e479 100644 --- a/Geome3Dash/src/BlockModelsStorage.cpp +++ b/Geome3Dash/src/BlockModelStorage.cpp @@ -1,6 +1,6 @@ #include "pch.h" -#include "BlockModelsStorage.h" +#include "BlockModelStorage.h" #include "engine/sus3d/ShaderProgram.h" #include "engine/sus3d/Shader.h" @@ -17,39 +17,41 @@ namespace g3d { - bool BlockModelsStorage::init() + void BlockModelStorage::loadAllShaders() { - basePath = geode::Mod::get()->getResourcesDir() / "model3d"; OpenGLStateHelper::saveState(); const auto shaderPath = basePath / "planet" / "shader"; auto vertexShader = sus3d::Shader::createWithString( - sus3d::shaders::vertexShaderSource, + sus3d::shaders::vertexShaderSource, sus3d::ShaderType::kVertexShader); auto fragmentShader = sus3d::Shader::createWithString( - sus3d::shaders::fragmentShaderSource, + sus3d::shaders::fragmentShaderSource, sus3d::ShaderType::kFragmentShader); + //if (blockShaderProgram) { delete blockShaderProgram; } blockShaderProgram = CocosShaderProgram::create(vertexShader, fragmentShader); delete vertexShader; delete fragmentShader; auto vertexShader2 = sus3d::Shader::createWithString( - sus3d::shaders::vertexShaderSource, + sus3d::shaders::vertexShaderSource, sus3d::ShaderType::kVertexShader); auto fragmentShader2 = sus3d::Shader::createWithFile( - shaderPath / "water2.fsh", + shaderPath / "water2.fsh", sus3d::ShaderType::kFragmentShader); + //if (waterShaderProgram) { delete waterShaderProgram; } waterShaderProgram = CocosShaderProgram::create(vertexShader2, fragmentShader2); delete vertexShader2; delete fragmentShader2; auto vertexShader3 = sus3d::Shader::createWithFile( - shaderPath / "cloud.vsh", + shaderPath / "cloud.vsh", sus3d::ShaderType::kVertexShader); auto fragmentShader3 = sus3d::Shader::createWithFile( - shaderPath / "cloud.fsh", + shaderPath / "cloud.fsh", sus3d::ShaderType::kFragmentShader); + //if (cloudShaderProgram) { delete cloudShaderProgram; } cloudShaderProgram = CocosShaderProgram::create(vertexShader3, fragmentShader3); delete vertexShader3; delete fragmentShader3; @@ -58,20 +60,26 @@ namespace g3d sus3d::shaders::idBufferingVertexShader, sus3d::ShaderType::kVertexShader); auto fragmentShader4 = sus3d::Shader::createWithString( - sus3d::shaders::idBufferingFragmentShader, + sus3d::shaders::idBufferingFragmentShader, sus3d::ShaderType::kFragmentShader); + //if (idBufferShaderProgram) { delete idBufferShaderProgram; } idBufferShaderProgram = CocosShaderProgram::create(vertexShader4, fragmentShader4); delete vertexShader4; delete fragmentShader4; + OpenGLStateHelper::pushState(); + } + bool BlockModelStorage::init() + { + basePath = geode::Mod::get()->getResourcesDir() / "model3d"; + loadAllShaders(); loadAllModels(); - OpenGLStateHelper::pushState(); return true; } // mtl model path fix (model path must be absolute) - void BlockModelsStorage::parseMtlPath(const std::filesystem::path& path) + void BlockModelStorage::parseMtlPath(const std::filesystem::path& path) { if (std::filesystem::exists(path)) { @@ -84,7 +92,7 @@ namespace g3d } } - void BlockModelsStorage::loadAllModels() + void BlockModelStorage::loadAllModels() { try { @@ -112,21 +120,21 @@ namespace g3d } } - sus3d::Model* BlockModelsStorage::getBlockModel(const int id) + sus3d::Model* BlockModelStorage::getBlockModel(const int id) { auto it = blockModels.find(id); if (it == blockModels.end()) { return nullptr; } return it->second; } - sus3d::Model* BlockModelsStorage::getModel(const std::filesystem::path& path) + sus3d::Model* BlockModelStorage::getModel(const std::filesystem::path& path) { auto it = allModels.find(path); if (it == allModels.end()) { return nullptr; } return it->second; } - void BlockModelsStorage::tryRenderBlock( + void BlockModelStorage::tryRenderBlock( const int objectId, sus3d::Camera* camera, sus3d::Light* light) @@ -143,16 +151,15 @@ namespace g3d } } - BlockModelsStorage* BlockModelsStorage::getInstance() + BlockModelStorage* BlockModelStorage::get() { - if (!instance) { - instance = new BlockModelsStorage; + instance = new BlockModelStorage; instance->init(); } return instance; } - BlockModelsStorage* BlockModelsStorage::instance = nullptr; + BlockModelStorage* BlockModelStorage::instance = nullptr; } \ No newline at end of file diff --git a/Geome3Dash/src/BlockModelsStorage.h b/Geome3Dash/src/BlockModelStorage.h similarity index 92% rename from Geome3Dash/src/BlockModelsStorage.h rename to Geome3Dash/src/BlockModelStorage.h index 8fe8aeb9..26b2cef6 100644 --- a/Geome3Dash/src/BlockModelsStorage.h +++ b/Geome3Dash/src/BlockModelStorage.h @@ -15,8 +15,10 @@ namespace sus3d namespace g3d { - class BlockModelsStorage + class BlockModelStorage { + private: + BlockModelStorage() {} protected: std::unordered_map blockModels; std::unordered_map allModels; @@ -24,10 +26,10 @@ namespace g3d sus3d::ShaderProgram* waterShaderProgram; sus3d::ShaderProgram* cloudShaderProgram; sus3d::ShaderProgram* idBufferShaderProgram; - static BlockModelsStorage* instance; + static BlockModelStorage* instance; + void loadAllShaders(); void loadAllModels(); bool init(); - BlockModelsStorage() {} std::filesystem::path basePath; public: sus3d::ShaderProgram* getBlockSP() { return blockShaderProgram; } @@ -42,7 +44,7 @@ namespace g3d void parseMtlPath(const std::filesystem::path& path); sus3d::Model* getModel(const std::filesystem::path& path); sus3d::Model* getBlockModel(const int id); - static BlockModelsStorage* getInstance(); + static BlockModelStorage* get(); template ModelT* loadAndParseMtl(const std::filesystem::path& path) diff --git a/Geome3Dash/src/CocosShaderProgram.cpp b/Geome3Dash/src/CocosShaderProgram.cpp index decba174..8077a990 100644 --- a/Geome3Dash/src/CocosShaderProgram.cpp +++ b/Geome3Dash/src/CocosShaderProgram.cpp @@ -4,12 +4,12 @@ namespace g3d { - void CocosShaderProgram::setBasicUniforms() { + void CocosShaderProgram::setBasicUniforms() + { auto screenSize = CCDirector::sharedDirector()->getWinSize(); float screenWidth = screenSize.width; float screenHeight = screenSize.height; float time = CCDirector::sharedDirector()->getTotalFrames() * CCDirector::sharedDirector()->getAnimationInterval(); - setVec2("iResolution", glm::vec2(screenWidth, screenHeight)); setFloat("iTime", time); } diff --git a/Geome3Dash/src/game/component/G3DBaseNode.cpp b/Geome3Dash/src/game/component/G3DBaseNode.cpp index 231fce5d..cb758fe3 100644 --- a/Geome3Dash/src/game/component/G3DBaseNode.cpp +++ b/Geome3Dash/src/game/component/G3DBaseNode.cpp @@ -11,7 +11,7 @@ #include "helper/OpenGLStateHelper.h" #include "helper/CommonHelper.h" -#include "BlockModelsStorage.h" +#include "BlockModelStorage.h" namespace g3d { @@ -105,7 +105,7 @@ namespace g3d OpenGLStateHelper::saveState(); - auto bms = BlockModelsStorage::getInstance(); + auto bms = BlockModelStorage::get(); shaderProgram = bms->getBlockSP(); getObjectIDByMousePositionShader = bms->getIdBufferSP(); diff --git a/Geome3Dash/src/game/component/G3DBaseNode.h b/Geome3Dash/src/game/component/G3DBaseNode.h index 0cd632ac..bcb0761c 100644 --- a/Geome3Dash/src/game/component/G3DBaseNode.h +++ b/Geome3Dash/src/game/component/G3DBaseNode.h @@ -6,7 +6,7 @@ #include "helper/CommonHelper.h" #include "CocosShaderProgram.h" -#include "BlockModelsStorage.h" +#include "BlockModelStorage.h" namespace g3d { @@ -53,7 +53,7 @@ namespace g3d template T* loadAndAddModel(const std::filesystem::path& filePath) { - auto model = BlockModelsStorage::getInstance()->getModelT(filePath); + auto model = BlockModelStorage::get()->getModelT(filePath); if (model) { models.push_back(model); } return model; } diff --git a/Geome3Dash/src/game/editor/G3DCurveEditorLayer.cpp b/Geome3Dash/src/game/editor/G3DCurveEditorLayer.cpp index 0e911073..d63072f3 100644 --- a/Geome3Dash/src/game/editor/G3DCurveEditorLayer.cpp +++ b/Geome3Dash/src/game/editor/G3DCurveEditorLayer.cpp @@ -11,7 +11,7 @@ #include "engine/sus3d/Shader.h" #include "engine/sus3d/Shaders.h" -#include "BlockModelsStorage.h" +#include "BlockModelStorage.h" namespace g3d { @@ -195,7 +195,7 @@ namespace g3d setKeyboardEnabled(true); - auto bms = BlockModelsStorage::getInstance(); + auto bms = BlockModelStorage::get(); pointModel = bms->getModel(bms->getBP() / "editor" / "model" / "point.obj"); pointModel->setScale(glm::vec3(0.2f)); layer3d->models.push_back(pointModel); @@ -286,7 +286,7 @@ namespace g3d glm::quat rotationQuat = glm::quat_cast(rotationMatrix); glm::vec3 eulerDegrees = glm::degrees(glm::eulerAngles(rotationQuat * firstRotationQuat)); - auto bms = BlockModelsStorage::getInstance(); + auto bms = BlockModelStorage::get(); if (auto blockModel = bms->getBlockModel(block->m_objectID)) { blockModel->setPosition(pos + (normal * lengthScaleFactor * (block->getPositionY() - 110))); diff --git a/Geome3Dash/src/game/editor/G3DEditorPopup.cpp b/Geome3Dash/src/game/editor/G3DEditorPopup.cpp index 4c66d8c3..924f1c9b 100644 --- a/Geome3Dash/src/game/editor/G3DEditorPopup.cpp +++ b/Geome3Dash/src/game/editor/G3DEditorPopup.cpp @@ -6,7 +6,7 @@ #include "helper/OpenGLStateHelper.h" #include "LevelDataManager.h" -#include "BlockModelsStorage.h" +#include "BlockModelStorage.h" namespace g3d { @@ -28,7 +28,7 @@ namespace g3d void G3DEditorScene::loadModel() { - auto bms = BlockModelsStorage::getInstance(); + auto bms = BlockModelStorage::get(); cube = bms->getModel(bms->getBP() / "player" / "cube" / "0" / "model.obj"); cube->setScale(glm::vec3(0.75)); @@ -93,7 +93,7 @@ namespace g3d } - auto bms = BlockModelsStorage::getInstance(); + auto bms = BlockModelStorage::get(); // End jumping logic diff --git a/Geome3Dash/src/game/planet/G3DPlanetLayer.cpp b/Geome3Dash/src/game/planet/G3DPlanetLayer.cpp index e06a4390..da5f4576 100644 --- a/Geome3Dash/src/game/planet/G3DPlanetLayer.cpp +++ b/Geome3Dash/src/game/planet/G3DPlanetLayer.cpp @@ -120,7 +120,7 @@ namespace g3d // Static animation state static bool isAnimating = false; static double timeElapsed = 0.0; - constexpr double duration = 1.0; // Animation duration + constexpr double duration = 1.25; // Animation duration // Trigger animation if the scale difference exceeds the threshold if (!isAnimating && (waterScaleDiff > threshold || planetScaleDiff > threshold)) { @@ -318,7 +318,7 @@ namespace g3d setKeyboardEnabled(true); - auto bms = BlockModelsStorage::getInstance(); + auto bms = BlockModelStorage::get(); const auto planetPath = bms->getBP() / "planet"; const auto shaderPath = planetPath / "shader"; diff --git a/Geome3Dash/src/game/playing/G3DPlayLayer.cpp b/Geome3Dash/src/game/playing/G3DPlayLayer.cpp index 05c10c9f..4e3908f4 100644 --- a/Geome3Dash/src/game/playing/G3DPlayLayer.cpp +++ b/Geome3Dash/src/game/playing/G3DPlayLayer.cpp @@ -3,7 +3,7 @@ #include "game/playing/G3DPlayLayer.h" #include "LevelDataManager.h" -#include "BlockModelsStorage.h" +#include "BlockModelStorage.h" namespace g3d { @@ -11,7 +11,7 @@ namespace g3d std::filesystem::path G3DPlayerObject::getPlayerModelPath(const std::string& type, const int id) { - return geode::Mod::get()->getResourcesDir() / "model3d" / "player" / type / std::to_string(id) / "model.obj"; + return BlockModelStorage::get()->getBP() / "player" / type / std::to_string(id) / "model.obj"; } std::filesystem::path G3DPlayerObject::getFixedPlayerModelPath(const std::string& type, const int id) @@ -30,7 +30,7 @@ namespace g3d void G3DPlayerObject::loadPlayerModel(sus3d::Model** model, const std::string& type, const int id) { - *model = BlockModelsStorage::getInstance()->loadAndParseMtl(getFixedPlayerModelPath(type, id)); + *model = BlockModelStorage::get()->loadAndParseMtl(getFixedPlayerModelPath(type, id)); (*model)->setScale(glm::vec3(0.75)); } @@ -229,7 +229,7 @@ namespace g3d auto distance = std::abs(playLayer->m_player1->m_position.x - obj->getPositionX()); if (distance < maxRender) { - if (auto model = BlockModelsStorage::getInstance()->getBlockModel(obj->m_objectID)) + if (auto model = BlockModelStorage::get()->getBlockModel(obj->m_objectID)) { updateBlock(obj, model); // apply fade diff --git a/Geome3Dash/src/game/test/G3DModelPreviewLayer.cpp b/Geome3Dash/src/game/test/G3DModelPreviewLayer.cpp index b91fce5d..b3f58d34 100644 --- a/Geome3Dash/src/game/test/G3DModelPreviewLayer.cpp +++ b/Geome3Dash/src/game/test/G3DModelPreviewLayer.cpp @@ -5,15 +5,15 @@ #include "game/component/G3DFragmentShaderLayer.h" #include "CocosShaderProgram.h" -#include "BlockModelsStorage.h" +#include "BlockModelStorage.h" #include "engine/sus3d/Shader.h" #include "engine/sus3d/Shaders.h" #include "engine/sus3d/Model.h" #include "engine/sus3d/Mesh.h" -#include "Helper/OpenGLStateHelper.h" -#include "Helper/CommonHelper.h" +#include "helper/OpenGLStateHelper.h" +#include "helper/CommonHelper.h" #include "lib/tinyfiledialogs/tinyfiledialogs.h" @@ -114,7 +114,7 @@ namespace g3d auto size = CCDirector::sharedDirector()->getWinSize(); - auto testLayer = G3DFragmentShaderLayer::create(geode::Mod::get()->getResourcesDir() / "model3d" / "planet" / "shader" / "space.fsh"); + auto testLayer = G3DFragmentShaderLayer::create(BlockModelStorage::get()->getBP() / "planet" / "shader" / "space.fsh"); this->addChild(testLayer); auto bg = CCSprite::create("GJ_gradientBG.png"); @@ -175,7 +175,7 @@ namespace g3d auto path = openModelSelectModal(); if (!path.has_value()) { return; } const auto obj_path = std::filesystem::path(path.value()); - layer3d->models.push_back(BlockModelsStorage::getInstance()->getModel(path.value())); + layer3d->models.push_back(BlockModelStorage::get()->getModel(path.value())); } G3DModelPreviewLayer* G3DModelPreviewLayer::create() { diff --git a/Geome3Dash/src/hook/CreatorLayer.cpp b/Geome3Dash/src/hook/CreatorLayer.cpp index c7486f0b..37cde792 100644 --- a/Geome3Dash/src/hook/CreatorLayer.cpp +++ b/Geome3Dash/src/hook/CreatorLayer.cpp @@ -4,11 +4,12 @@ #include "helper/Easing.h" #include "engine/sus3d/Shader.h" #include "engine/sus3d/Shaders.h" -#include "BlockModelsStorage.h" +#include "BlockModelStorage.h" namespace g3d { - class G3DPlanetCreatorLayerBaseNode : public G3DBaseNode { + class G3DPlanetCreatorLayerBaseNode : public G3DBaseNode + { public: sus3d::ShaderProgram* shaderProgram; sus3d::ShaderProgram* shaderProgram2; @@ -51,14 +52,14 @@ namespace g3d OpenGLStateHelper::pushState(); } - G3DPlanetCreatorLayerBaseNode* G3DPlanetCreatorLayerBaseNode::create() { + G3DPlanetCreatorLayerBaseNode* G3DPlanetCreatorLayerBaseNode::create() + { G3DPlanetCreatorLayerBaseNode* ret = new G3DPlanetCreatorLayerBaseNode(); - - if (!ret || !ret->init()) { + if (!ret || !ret->init()) + { delete ret; return nullptr; } - return ret; } @@ -125,7 +126,8 @@ namespace g3d previousWaterScale = m_fields->planetModelWater->getScale(); previousPlanetScale = m_fields->planetModel->getScale(); - if (!isAnimating) { + if (!isAnimating) + { m_fields->planetModelWater->setScale(glm::vec3(0.251f * m_fields->mapButton->getScale())); m_fields->planetModel->setScale(glm::vec3(0.250f * m_fields->mapButton->getScale())); } @@ -174,7 +176,7 @@ namespace g3d // ----------------------------------------------- - auto bms = BlockModelsStorage::getInstance(); + auto bms = BlockModelStorage::get(); m_fields->mapButton = this->getChildByIDRecursive("map-button"); auto weeklyButton = this->getChildByIDRecursive("weekly-button"); diff --git a/Geome3Dash/src/hook/MenuLayer.cpp b/Geome3Dash/src/hook/MenuLayer.cpp index fac4bdf5..ff95e5dd 100644 --- a/Geome3Dash/src/hook/MenuLayer.cpp +++ b/Geome3Dash/src/hook/MenuLayer.cpp @@ -1,22 +1,21 @@ #include "pch.h" -#include "BlockModelsStorage.h" +#include "BlockModelStorage.h" #include "game/planet/G3DPlanetLayer.h" namespace g3d { - class $modify(MenuLayer) { - bool init() { + class $modify(MenuLayer) + { + bool init() + { // load cache - auto bms = BlockModelsStorage::getInstance(); + auto bms = BlockModelStorage::get(); bms->getBlockModel(1); - const auto planetPath = geode::Mod::get()->getResourcesDir() / "model3d" / "planet"; - const auto modelPath = planetPath / "model"; + const auto modelPath = bms->getBP() / "planet" / "model"; bms->getModelT(modelPath / "new_planet_textured.obj"); bms->getModelT(modelPath / "planet_water.obj"); bms->getModelT(modelPath / "clouds.obj"); if (!MenuLayer::init()) { return false; } - //AllocConsole(); - //freopen_s(reinterpret_cast(stdout), "CONOUT$", "w", stdout); return true; } };