diff --git a/src/Config/Configs.h b/src/Config/Configs.h index 36a6e8a..1d8a74e 100644 --- a/src/Config/Configs.h +++ b/src/Config/Configs.h @@ -19,7 +19,7 @@ namespace Configs { std::string m_display; }; - inline void imguiDrawOpts(std::string id,std::vector opts,std::string &val){ + inline void g_imguiDrawOpts(std::string id, std::vector opts, std::string &val){ if(ImGui::BeginCombo(id.c_str(),val.c_str())){ for(const std::string &opt: opts) { if (ImGui::Selectable((opt + "##" + id).c_str())) @@ -31,7 +31,7 @@ namespace Configs { } template - inline void imguiDrawOpts(std::string id,std::vector> opts,t &val){ + void g_imguiDrawOpts(std::string id, std::vector> opts, t &val){ auto selOpt = std::find_if(opts.begin(), opts.end(),[&](const ValueDisplayOptions &opt){ return val == opt.m_val; }); diff --git a/src/MainViewport.cpp b/src/MainViewport.cpp index 08d6997..10fb9be 100644 --- a/src/MainViewport.cpp +++ b/src/MainViewport.cpp @@ -8,8 +8,9 @@ #include #include "IconsFontAwesome6.h" #include "glm/gtx/string_cast.hpp" - +#include #include +#include"Config/Configs.h" MainViewport *MainVP; @@ -32,18 +33,9 @@ glm::vec3 ToGlmVec3(Vector3 Vec3) { } bool IsArea(const std::string& Type) { - if (Type == "Area" || - Type == "Area_Yellow" || - Type == "Area_Pink" || - Type == "StageArea" || - Type == "GeneralArea" || - Type == "PaintedArea" || - Type == "GachihokoHikikomoriArea" || - Type == "GachihokoHikikomoriArea2" || - Type == "SearchableArea" || - Type == "PaintTargetArea") - return true; - return false; + return std::any_of(Configs::g_areas.begin(), Configs::g_areas.end(),[&](const std::string &areatype){ + return Type == areatype; + }); } MainViewport::MainViewport() : Graphics::ViewportWidget("Main Viewport", true), VP(1.0f), defaultShader("ForwardPass"), flatShader("FlatForwardPass") { @@ -66,8 +58,8 @@ MainViewport::MainViewport() : Graphics::ViewportWidget("Main Viewport", true), Graphics::Shader("ShadowPass"), Math::Vector2i(8192,8192)); - auto tex = SunCam->getFbTexByAttachment(GL_DEPTH_ATTACHMENT); - glBindTexture(GL_TEXTURE_2D, tex.m_texture.getId()); + auto& tex = SunCam->getFbTexByAttachment(GL_DEPTH_ATTACHMENT); + glBindTexture(GL_TEXTURE_2D, tex.m_texture->getId()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); @@ -281,8 +273,8 @@ void MainViewport::Draw() { glEnable(GL_CULL_FACE); glCullFace(GL_FRONT); - auto tex = SunCam->getFbTexByAttachment(GL_DEPTH_ATTACHMENT); - tex.m_texture.setActive(5); + auto &tex = SunCam->getFbTexByAttachment(GL_DEPTH_ATTACHMENT); + tex.m_texture->setActive(5); GLint SunVpLoc = m_internalFramebuf->m_shader.getUniformLocation("SunVP"); @@ -857,6 +849,30 @@ glm::vec2 MainViewport::CalcGizmoDir(glm::vec3 dir) { return DirPosVPSpace - ObjPosVPSpace; } -MainViewport *GetMainViewport() { +void MainViewport::clearModels() { + MdlFromObj.clear(); +} + +void MainViewport::cleanUnnescessary() { + auto &map = GetMainWindow()->loadedMap; + + for(auto mdlPairIter = MdlFromObj.begin(); mdlPairIter != MdlFromObj.end(); ){ + auto nextiter = mdlPairIter; + nextiter++; + + if(nextiter == MdlFromObj.end()) + break; + + if(std::none_of(map.Objects.begin(), map.Objects.end(),[&](const LevelObject &obj){ + return obj.Type == nextiter->first; + })){ + MdlFromObj.erase(nextiter); + } else { + mdlPairIter = nextiter; + } + } +} + +MainViewport *g_getMainViewport() { return MainVP; } \ No newline at end of file diff --git a/src/MainViewport.h b/src/MainViewport.h index 7440003..d21b07f 100644 --- a/src/MainViewport.h +++ b/src/MainViewport.h @@ -27,6 +27,11 @@ public: glm::vec3 camPos = glm::vec3(0,0,0); glm::vec2 camrot = glm::vec2(0,0); + void clearModels(); + + void cleanUnnescessary(); +private: + float shadowArea = 750.0f; Graphics::Shader flatShader; @@ -46,7 +51,7 @@ public: GizmoType CurrentGizmoType = Move; -private: + unsigned int HoveredObjId = 0; @@ -77,6 +82,6 @@ private: }; -MainViewport* GetMainViewport(); +MainViewport* g_getMainViewport(); #endif //SPOONTOOL_MAINVIEWPORT_H diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index a982433..669365b 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -30,7 +30,10 @@ MainWindow::MainWindow(): Graphics::Window("SpoonEdit") { auto mapSelectSaveExplorer = addWidget(new Graphics::FileSelectDialog("Select/Save Map", {".yaml"},[&](boost::filesystem::path path){ selectedElem = nullptr; - loadedMap = ConvertFromYaml(path); + GetMainWindow()->loadedMap = ConvertFromYaml(path); + + MainViewport* vp = g_getMainViewport(); + vp->cleanUnnescessary(); },[&](boost::filesystem::path path){ loadedMap.Export(path); })); @@ -90,6 +93,7 @@ MainWindow::MainWindow(): Graphics::Window("SpoonEdit") { AddMenuItem("Game", "Gambit(1)", [&](){ gameSetting = GameMode::Gambit; Configs::g_loadConfigs(GameMode::ToString(gameSetting)); + g_getMainViewport()->clearModels(); }); AddMenuItem("Game", "Blitz(2)", [&](){ gameSetting = GameMode::Blitz; diff --git a/src/Model.cpp b/src/Model.cpp index dfcada4..49765e9 100644 --- a/src/Model.cpp +++ b/src/Model.cpp @@ -18,8 +18,6 @@ #include Model::Model(std::string modelname) { - CopyCount = new unsigned(1); - auto modeltoload = boost::filesystem::current_path() / "Models" / modelname / (modelname + ".dae"); Assimp::Importer importer; @@ -42,7 +40,7 @@ Model::Model(std::string modelname) { auto mesh = scene->mMeshes[i]; auto mat = scene->mMaterials[mesh->mMaterialIndex]; - Materials.push_back(new Graphics::Material(mat,boost::filesystem::current_path() / "Models" / modelname)); + Materials.push_back(std::make_unique(mat,boost::filesystem::current_path() / "Models" / modelname)); auto vertices = std::vector(); auto texcoords = std::vector(); @@ -78,7 +76,7 @@ Model::Model(std::string modelname) { indices.push_back(mesh->mFaces[i3].mIndices[i4]); } - Meshes.push_back(new Graphics::Mesh(vertices,indices,texcoords,normals,tangents,bitangents)); + Meshes.push_back(std::make_unique(vertices,indices,texcoords,normals,tangents,bitangents)); } } @@ -119,7 +117,7 @@ void Model::Draw(const Transform &tf, Graphics::Shader &shader, const glm::mat4 GLuint RotationMatrixID = shader.getUniformLocation("NormalRotationMatrix"); glUniformMatrix4fv(RotationMatrixID,1,GL_FALSE,&nrmRotationMatrix[0][0]); - mesh->Draw(Materials[texnum]); + mesh->Draw(*Materials[texnum]); texnum++; } @@ -153,9 +151,7 @@ void Model::DrawSelection(Transform tf, Graphics::Shader &shader, glm::mat4 VP) GLuint MatrixNoYInvID = shader.getUniformLocation("TransformationMatrixNoYInv"); glUniformMatrix4fv(MatrixNoYInvID,1,GL_FALSE,&noYInvertMatrix[0][0]); - - - mesh->Draw(Materials[texnum]); + mesh->Draw(*Materials[texnum]); texnum++; } @@ -164,20 +160,4 @@ void Model::DrawSelection(Transform tf, Graphics::Shader &shader, glm::mat4 VP) } -Model::~Model() { - (*CopyCount)--; - - if((*CopyCount) == 0) { - for (Graphics::Material *mat: Materials) - delete mat; - - for (Graphics::Mesh *mesh: Meshes) - delete mesh; - } -} - -Model::Model(const Model &mdl): CopyCount(mdl.CopyCount), Meshes(mdl.Meshes), Materials(mdl.Materials) { - (*CopyCount)++; -} - diff --git a/src/Model.h b/src/Model.h index 740354c..531c3f8 100644 --- a/src/Model.h +++ b/src/Model.h @@ -16,18 +16,16 @@ class Model { public: Model(std::string modelName); - Model(const Model& mdl); + Model(const Model& mdl) = delete; - ~Model(); - - unsigned *CopyCount; + Model(Model&&) = default; void Draw(const Transform &tf, Graphics::Shader &shader, const glm::mat4 &VP); void DrawSelection(Transform tf, Graphics::Shader &shader, glm::mat4 VP); protected: - std::list Meshes; - std::vector Materials; + std::list> Meshes; + std::vector> Materials; //std::map TexturesForName; }; diff --git a/src/PropertiesWidget.cpp b/src/PropertiesWidget.cpp index e3bfd82..6eb94da 100644 --- a/src/PropertiesWidget.cpp +++ b/src/PropertiesWidget.cpp @@ -107,7 +107,7 @@ void ImGuiDrawElem(Element* elem,std::string Id = ""){ auto &link = *linkIter; if (ImGui::CollapsingHeader(("Link " + std::to_string(i) + "##" + Id).c_str())) { ImGui::Indent(); - Configs::imguiDrawOpts("Link Type##" + std::to_string(i) + Id, Configs::g_linkOpts, link.Name); + Configs::g_imguiDrawOpts("Link Type##" + std::to_string(i) + Id, Configs::g_linkOpts, link.Name); ImGui::InputText(("Destination##PropWindLink" + std::to_string(i) + Id).c_str(), &link.Destination); if(Element* gotoElem = GetMainWindow()->loadedMap.GetElementById(link.Destination)) { @@ -171,7 +171,7 @@ void ImGuiDrawElem(Element* elem,std::string Id = ""){ if(levelObject) { //ImGuiDrawTeamSelect(levelObject,Id); ImGuiDrawSelection("Team##"+Id,levelObject->Team,Teams::AllOptions.begin(), Teams::AllOptions.end(),Teams::TeamToText); - Configs::imguiDrawOpts("Drop##"+Id, Configs::g_dropIdOpts,levelObject->DropId); + Configs::g_imguiDrawOpts("Drop##" + Id, Configs::g_dropIdOpts, levelObject->DropId); } if(railPoint){ diff --git a/src/RailSelectWidget.cpp b/src/RailSelectWidget.cpp index c215cf1..4861d6b 100644 --- a/src/RailSelectWidget.cpp +++ b/src/RailSelectWidget.cpp @@ -41,7 +41,7 @@ void RailSelectWidget::Draw() { if(ImGui::Button(ICON_FA_PLUS)){ wind->selectedElem = nullptr; - auto vp = GetMainViewport(); + auto vp = g_getMainViewport(); Vector3 pos = {vp->camPos.x, -vp->camPos.y, vp->camPos.z}; wind->loadedMap.Rails.emplace_back(pos); }