diff --git a/brolib/BroLib.vcxproj b/brolib/BroLib.vcxproj index 56c733e..67cfb8e 100644 --- a/brolib/BroLib.vcxproj +++ b/brolib/BroLib.vcxproj @@ -33,9 +33,11 @@ + + @@ -58,10 +60,12 @@ + + diff --git a/brolib/BroLib.vcxproj.filters b/brolib/BroLib.vcxproj.filters index cfe5875..7e6fd62 100644 --- a/brolib/BroLib.vcxproj.filters +++ b/brolib/BroLib.vcxproj.filters @@ -99,6 +99,12 @@ Source Files + + Source Files + + + Source Files + @@ -173,5 +179,11 @@ Header Files + + Header Files + + + Header Files + \ No newline at end of file diff --git a/brolib/BroLib/IRsm.h b/brolib/BroLib/IRsm.h index d52c929..1c5eb70 100644 --- a/brolib/BroLib/IRsm.h +++ b/brolib/BroLib/IRsm.h @@ -40,6 +40,9 @@ class IRsm std::vector faces; std::vector children; + glm::mat4 matrix1; + glm::mat4 matrix2; + RsmMeshRenderInfo* renderer; IMesh* parent; @@ -52,7 +55,8 @@ class IRsm child->foreach(callback); } - virtual void makeVirtual() {} + virtual void calcMatrix1() {} + virtual void calcMatrix2() {} }; template @@ -63,8 +67,6 @@ class IRsm inline Mesh* child(int i) { return (Mesh*)children[i]; } - virtual void calcMatrix1() {} - virtual void calcMatrix2() {} void foreach(const std::function*)>& callback) { callback(this); diff --git a/brolib/BroLib/MapRenderer.cpp b/brolib/BroLib/MapRenderer.cpp index af724eb..f8452b1 100644 --- a/brolib/BroLib/MapRenderer.cpp +++ b/brolib/BroLib/MapRenderer.cpp @@ -853,17 +853,8 @@ void MapRenderer::renderMesh(IRsm::IMesh* mesh, const glm::mat4 &matrix, RsmMode mesh->renderer->vbo->setVertexFormat(); renderer->setVbo(mesh->renderer->vbo, allVerts); } - Rsm::Mesh* rsmMesh = dynamic_cast(mesh); - if (rsmMesh) - { - mesh->renderer->matrix = matrix * rsmMesh->matrix1 * rsmMesh->matrix2; - mesh->renderer->matrixSub = matrix * rsmMesh->matrix1; - } - if (rsm2Mesh) - { - mesh->renderer->matrix = matrix; - mesh->renderer->matrixSub = matrix; - } + mesh->renderer->matrix = matrix * mesh->matrix1 * mesh->matrix2; + mesh->renderer->matrixSub = matrix * mesh->matrix1; } if (rsmMesh && (!rsmMesh->frames.empty() || rsmMesh->matrixDirty)) diff --git a/brolib/BroLib/Rsm.cpp b/brolib/BroLib/Rsm.cpp index da2578f..dfb1edb 100644 --- a/brolib/BroLib/Rsm.cpp +++ b/brolib/BroLib/Rsm.cpp @@ -164,8 +164,8 @@ void Rsm::updateMatrices() bbrange = (bbmin + bbmax) / 2.0f; - dynamic_cast(rootMesh)->calcMatrix1(); - dynamic_cast(rootMesh)->calcMatrix2(); + rootMesh->calcMatrix1(); + rootMesh->calcMatrix2(); diff --git a/brolib/BroLib/Rsm.h b/brolib/BroLib/Rsm.h index d54e209..89b3135 100644 --- a/brolib/BroLib/Rsm.h +++ b/brolib/BroLib/Rsm.h @@ -55,8 +55,6 @@ class Rsm : public IRsm glm::vec3 bbmax; glm::vec3 bbrange; - glm::mat4 matrix1; - glm::mat4 matrix2; void calcMatrix1(); void calcMatrix2(); bool matrixDirty = true; diff --git a/brolib/BroLib/Rsm2.cpp b/brolib/BroLib/Rsm2.cpp index 35ce4d8..f616a9b 100644 --- a/brolib/BroLib/Rsm2.cpp +++ b/brolib/BroLib/Rsm2.cpp @@ -9,6 +9,7 @@ Rsm2::Rsm2(const std::string& fileName) this->fileName = fileName; renderer = NULL; loaded = false; + rootMesh = nullptr; if (fileName.substr(fileName.size() - 5) != ".rsm2") return; @@ -44,6 +45,12 @@ Rsm2::Rsm2(const std::string& fileName) loaded = true; } + if (rootMesh) + { + rootMesh->calcMatrix1(); + rootMesh->calcMatrix2(); + } + } @@ -185,6 +192,25 @@ void Rsm2::load0203(blib::util::StreamInFile* rsmFile) +void Rsm2::Mesh::calcMatrix1() +{ + matrix1 = glm::mat4(); + matrix1 = glm::translate(matrix1, pos); + for (unsigned int i = 0; i < children.size(); i++) + child(i)->calcMatrix1(); +} +void Rsm2::Mesh::calcMatrix2() +{ + matrix2 = glm::mat4(); + + + matrix2 *= offset; + + for (unsigned int i = 0; i < children.size(); i++) + child(i)->calcMatrix2(); +} + + std::string Rsm2::readString(blib::util::StreamInFile* file) { int len = file->readInt(); diff --git a/brolib/BroLib/Rsm2.h b/brolib/BroLib/Rsm2.h index 384e0d7..d4c3a2c 100644 --- a/brolib/BroLib/Rsm2.h +++ b/brolib/BroLib/Rsm2.h @@ -6,10 +6,13 @@ class Rsm2 : public IRsm { public: - class Mesh : public IMesh + class Mesh : public IRsm::Mesh { public: std::vector textures; + + void calcMatrix1(); + void calcMatrix2(); }; class Face : public IRsm::Face { diff --git a/vs2015/Release/Browedit.exe b/vs2015/Release/Browedit.exe index 9b7dba5..f1a218c 100644 Binary files a/vs2015/Release/Browedit.exe and b/vs2015/Release/Browedit.exe differ