diff --git a/brolib/BroLib/IRsm.h b/brolib/BroLib/IRsm.h index 1c5eb70..fd9180c 100644 --- a/brolib/BroLib/IRsm.h +++ b/brolib/BroLib/IRsm.h @@ -93,6 +93,7 @@ class IRsm virtual void updateMatrices() {} + virtual void save(const std::string& fileName) {} diff --git a/brolib/BroLib/MapRenderer.cpp b/brolib/BroLib/MapRenderer.cpp index f8452b1..5fc0df1 100644 --- a/brolib/BroLib/MapRenderer.cpp +++ b/brolib/BroLib/MapRenderer.cpp @@ -809,6 +809,11 @@ void MapRenderer::renderModel(Rsw::Model* model, blib::Renderer* renderer) model->aabb.max = glm::max(model->aabb.max, verts[i].position); } } + if (rsm2Model) + { + model->aabb.min = glm::vec3(-99, -99, -99); + model->aabb.max = glm::vec3(99, 99, 99); + } } if (model->model->renderer == NULL) @@ -1044,7 +1049,7 @@ void MapRenderer::renderMeshFbo(IRsm* rsm, float rotation, blib::FBO* fbo, blib: } -void MapRenderer::renderMesh(Rsm* rsm, const glm::mat4 &camera, blib::Renderer* renderer) +void MapRenderer::renderMesh(IRsm* rsm, const glm::mat4 &camera, blib::Renderer* renderer) { blib::FBO* oldFbo = rswRenderState.activeFbo; @@ -1063,9 +1068,7 @@ void MapRenderer::renderMesh(Rsm* rsm, const glm::mat4 &camera, blib::Renderer* rswRenderState.activeFbo = nullptr; rswRenderState.depthTest = true; - Rsm* rsm1 = dynamic_cast(rsm); - if(rsm1) - renderMesh(rsm1->rootMesh, glm::mat4(), rsm->renderer, renderer); + renderMesh(rsm->rootMesh, glm::mat4(), rsm->renderer, renderer); rswRenderState.activeFbo = oldFbo; //rswRenderState.activeShader->setUniform(RswShaderAttributes::ProjectionMatrix, projectionMatrix); diff --git a/brolib/BroLib/MapRenderer.h b/brolib/BroLib/MapRenderer.h index 6937143..5d0b00c 100644 --- a/brolib/BroLib/MapRenderer.h +++ b/brolib/BroLib/MapRenderer.h @@ -205,7 +205,7 @@ class MapRenderer : public blib::gl::GlResizeRegister void setShadowDirty(); void setColorDirty() { gndTileColorDirty = true; } void renderMeshFbo(IRsm* rsm, float rotation, blib::FBO* fbo, blib::Renderer* renderer); - void renderMesh(Rsm* rsm, const glm::mat4& matrix, blib::Renderer* renderer); + void renderMesh(IRsm* rsm, const glm::mat4& matrix, blib::Renderer* renderer); bool gndTextureGridDirty; bool gndGridDirty; bool gatDirty; diff --git a/brolib/BroLib/Rsm2.cpp b/brolib/BroLib/Rsm2.cpp index f616a9b..e002531 100644 --- a/brolib/BroLib/Rsm2.cpp +++ b/brolib/BroLib/Rsm2.cpp @@ -90,6 +90,7 @@ void Rsm2::load0203(blib::util::StreamInFile* rsmFile) mesh->textures.push_back(f - textures.begin()); } + mesh->offset = glm::mat4(1.0f); mesh->offset[0][0] = rsmFile->readFloat();//rotation mesh->offset[0][1] = rsmFile->readFloat(); mesh->offset[0][2] = rsmFile->readFloat(); @@ -195,15 +196,13 @@ 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 = glm::translate(matrix2, pos); matrix2 *= offset; for (unsigned int i = 0; i < children.size(); i++) diff --git a/brolib/BroLib/Rsw.cpp b/brolib/BroLib/Rsw.cpp index fb6a036..c0e01bd 100644 --- a/brolib/BroLib/Rsw.cpp +++ b/brolib/BroLib/Rsw.cpp @@ -872,13 +872,9 @@ void Rsw::Model::getWorldVerts(std::vector& indices, std::vector std::vector Rsw::Model::collisions(const blib::math::Ray &ray) { - if (!aabb.hasRayCollision(ray, 0, 10000000)) + if(!model || !model->loaded || !model->rootMesh || !aabb.hasRayCollision(ray, 0, 10000000)) return std::vector(); - Rsm* rsm = dynamic_cast(model); - if (rsm) - return collisions_(rsm->rootMesh, ray, matrixCache); - - return std::vector(); + return collisions_(model->rootMesh, ray, matrixCache); } @@ -905,9 +901,7 @@ void Rsw::Model::foreachface(std::function&)> { if (!model) return; - Rsm* rsm = dynamic_cast(model); - if (rsm) - foreachface_(rsm->rootMesh, callback, matrixCache); + foreachface_(model->rootMesh, callback, matrixCache); } Rsw::QuadTreeNode::QuadTreeNode(std::vector::const_iterator &it, int level /*= 0*/) : bbox(glm::vec3(0, 0, 0), glm::vec3(0,0,0)) diff --git a/bromedit/BromEdit.cpp b/bromedit/BromEdit.cpp index 3255284..66ecede 100644 --- a/bromedit/BromEdit.cpp +++ b/bromedit/BromEdit.cpp @@ -108,7 +108,8 @@ void BromEdit::init() //loadModel("data\\model\\pud\\stall_03.rsm"); //loadModel("data\\model\\pud\\swing_01.rsm"); //loadModel("data\\model\\pud\\balloon_01.rsm"); - loadModel("data\\model\\plants_e_01.rsm2"); + //loadModel("data\\model\\plants_e_01.rsm2"); + loadModel("data\\model\\ilusion\\boarding_j_01.rsm2"); grid = resourceManager->getResource("assets/textures/grid.png"); grid->setTextureRepeat(true); @@ -168,8 +169,8 @@ void BromEdit::update(double elapsedTime) if (mouseState.position.y > bary+40) { int index = (int)((mouseState.position.y - bary - 40) / 13); - std::function selectMesh; - selectMesh = [&, this](Rsm::Mesh* mesh) + std::function selectMesh; + selectMesh = [&, this](IRsm::IMesh* mesh) { if (index == 0) { @@ -182,11 +183,11 @@ void BromEdit::update(double elapsedTime) }; selectMesh(model->rootMesh); - - for (auto frame : selectedMesh->frames) +#ifdef FIXME + for (auto frame : selectedRsmMesh->frames) if (fabs(frame->time / 10.0 - timeSelect) < 5) frameProperties->selectFrame(frame); - +#endif } if (mouseState.position.y > bary && mouseState.position.y < bary + 40) @@ -211,7 +212,7 @@ void BromEdit::update(double elapsedTime) if (mouseState.position.y > bary + 40 && mouseState.position.x > 100 && mouseState.leftButton) { timeSelect = mouseState.position.x - 100.0f; - for (auto frame : selectedMesh->frames) + for (auto frame : selectedRsmMesh->frames) if (fabs(frame->time / 10.0 - timeSelect) < 5) frameProperties->selectFrame(frame); if (model->renderer->timer.isPaused()) @@ -235,7 +236,11 @@ void BromEdit::draw() matrix = glm::rotate(matrix, rotation.y, glm::vec3(1, 0, 0)); matrix = glm::rotate(matrix, rotation.x, glm::vec3(0, 1, 0)); matrix = glm::rotate(matrix, glm::pi(), glm::vec3(1, 0, 0)); - matrix = glm::translate(matrix, glm::vec3(model->realbbrange)); + + if(model->version < 0x0200) + matrix = glm::translate(matrix, glm::vec3(model1->realbbrange)); + else + matrix = glm::translate(matrix, glm::vec3(100)); renderer->setViewPort(0, 200, window->getWidth(), window->getHeight() - 200); @@ -296,9 +301,9 @@ void BromEdit::draw() int i = 0; - std::function drawLine; + std::function drawLine; - drawLine = [&,this](Rsm::Mesh* mesh, int level) + drawLine = [&,this](IRsm::IMesh* mesh, int level) { if (mesh == selectedMesh) { @@ -311,7 +316,7 @@ void BromEdit::draw() else spriteBatch->draw(font, mesh->name, blib::math::easyMatrix(glm::vec2(5 + 16 * level, y + 40 + i * 13)), glm::vec4(0, 0, 0, 1)); - +#ifdef FIXME for (auto frame : mesh->frames) { std::string symbol = "o"; @@ -325,7 +330,7 @@ void BromEdit::draw() int tick = model->renderer->timer.millis() % mesh->frames[mesh->frames.size() - 1]->time; spriteBatch->draw(font, "|", blib::math::easyMatrix(glm::vec2(100 + tick / 10, y + 40 + i * 13)), glm::vec4(0, 0, 0, 1)); } - +#endif i++; for (auto &m : mesh->children) drawLine(m, level + 1); @@ -345,8 +350,15 @@ void BromEdit::draw() void BromEdit::loadModel(const std::string &fileName) { - model = new IRsm(fileName); - distance = glm::min(100.0f, glm::max(glm::max(model->realbbmax.x - model->realbbmin.x, model->realbbmax.y - model->realbbmin.y), model->realbbmax.z - model->realbbmin.z)); + if (fileName.substr(fileName.size() - 4) == ".rsm") + { + model = new Rsm(fileName); + distance = glm::min(100.0f, glm::max(glm::max(model1->realbbmax.x - model1->realbbmin.x, model1->realbbmax.y - model1->realbbmin.y), model1->realbbmax.z - model1->realbbmin.z)); + } + else if (fileName.substr(fileName.size() - 5) == ".rsm2") + { + model = new Rsm2(fileName); + } mouseState.scrollPosition = 0; renderInfo = new RsmModelRenderInfo(); @@ -376,7 +388,7 @@ void BromEdit::addKeyframe() frame->time = (int)(timeSelect * 10); frameProperties->selectFrame(frame); - +#ifdef FIXME for (auto it = selectedMesh->frames.begin(); it != selectedMesh->frames.end(); it++) { if ((*it)->time / 10 > timeSelect) { @@ -400,12 +412,13 @@ void BromEdit::addKeyframe() return b->time > a->time; }); } - +#endif } void BromEdit::delKeyframe() { +#ifdef FIXME for (auto it = selectedMesh->frames.begin(); it != selectedMesh->frames.end(); it++) { if (fabs((*it)->time / 10.0 - timeSelect) < 5) @@ -436,11 +449,12 @@ void BromEdit::delKeyframe() delete selectedMesh->frames[0]; selectedMesh->frames.clear(); } - +#endif } void BromEdit::prevFrame() { +#ifdef FIXME for (std::size_t i = 0; i < selectedMesh->frames.size(); i++) { auto frame = selectedMesh->frames[i]; @@ -453,10 +467,12 @@ void BromEdit::prevFrame() break; } } +#endif } void BromEdit::nextFrame() { +#ifdef FIXME for (std::size_t i = 0; i < selectedMesh->frames.size(); i++) { auto frame = selectedMesh->frames[i]; @@ -469,11 +485,13 @@ void BromEdit::nextFrame() break; } } +#endif } void BromEdit::addMesh() { +#ifdef FIXME if (!selectedMesh) return; @@ -482,10 +500,12 @@ void BromEdit::addMesh() mesh->parent = selectedMesh; mesh->parentName = mesh->parent->name; mesh->parent->children.push_back(mesh); +#endif } void BromEdit::delMesh() { +#ifdef FIXME if (!selectedMesh) return; // don't delete rootnode @@ -497,7 +517,7 @@ void BromEdit::delMesh() selectedMesh->children.erase(std::remove(selectedMesh->children.begin(), selectedMesh->children.end(), toDelete), selectedMesh->children.end()); delete toDelete; - +#endif } void BromEdit::menuFileNew() @@ -592,8 +612,10 @@ void BromEdit::replaceMesh() mesh->faces.clear(); mesh->vertices.clear(); mesh->texCoords.clear(); +#ifdef FIXME mesh->textures.clear(); mesh->textures.push_back(0); //todo +#endif delete mesh->renderer; mesh->renderer = nullptr; @@ -627,15 +649,15 @@ void BromEdit::replaceMesh() Rsm::Mesh::Face* face = new Rsm::Mesh::Face(); const auto &f = m->mFaces[ii]; - face->twoSide = false; - face->texIndex = 0; + face->twoSided = false; + face->texId = 0; face->smoothGroup = 0; assert(f.mNumIndices == 3); for (int iii = 0; iii < f.mNumIndices; iii++) { - face->vertices[iii] = f.mIndices[iii]; - face->texvertices[iii] = f.mIndices[iii]; + face->vertexIds[iii] = f.mIndices[iii]; + face->texCoordIds[iii] = f.mIndices[iii]; } mesh->faces.push_back(face); @@ -719,7 +741,7 @@ void BromEdit::exportMesh() { for(int i = 0; i < 3; i++) { - auto indices = std::pair(f->vertices[i], f->texvertices[i]); + auto indices = std::pair(f->vertexIds[i], f->texCoordIds[i]); if (lookup.find(indices) == lookup.end()) { lookup[indices] = vertices.size(); @@ -752,7 +774,7 @@ void BromEdit::exportMesh() for (int ii = 0; ii < 3; ii++) { - auto indices = std::pair(f->vertices[ii], f->texvertices[ii]); + auto indices = std::pair(f->vertexIds[ii], f->texCoordIds[ii]); face.mIndices[ii] = lookup[indices]; } } @@ -765,6 +787,7 @@ void BromEdit::exportMesh() void BromEdit::testStuff() { +#ifdef FIXME { auto files = blib::util::FileSystem::getFileList([](const std::string &fileName) { @@ -782,4 +805,5 @@ void BromEdit::testStuff() delete rsm; } } +#endif } \ No newline at end of file diff --git a/bromedit/BromEdit.h b/bromedit/BromEdit.h index 0efa4f1..4a03fca 100644 --- a/bromedit/BromEdit.h +++ b/bromedit/BromEdit.h @@ -3,6 +3,8 @@ #include #include #include +#include +#include #include namespace blib { @@ -28,7 +30,10 @@ class BromEdit : public blib::App, public blib::MouseListener glm::vec2 rotation; float distance = 0; - Rsm::Mesh* selectedMesh = nullptr; + union { + IRsm::IMesh* selectedMesh = nullptr; + Rsm::Mesh* selectedRsmMesh; + }; float timeSelect = 0; @@ -49,7 +54,12 @@ class BromEdit : public blib::App, public blib::MouseListener json config; - IRsm* model; + union + { + IRsm* model; + Rsm* model1; + Rsm2* model2; + }; RsmModelRenderInfo* renderInfo; MapRenderer mapRenderer; diff --git a/bromedit/main.cpp b/bromedit/main.cpp index 553e052..5c534f3 100644 --- a/bromedit/main.cpp +++ b/bromedit/main.cpp @@ -103,8 +103,10 @@ int main(int argc, char* argv[]) BromEdit* app = new BromEdit(config); - if (argc > 1) - app->model = new IRsm(argv[1]); +#ifdef FIXME + //if (argc > 1) + // app->model = new IRsm(argv[1]); +#endif app->start(); delete app; blib::util::FileSystem::dispose(); diff --git a/bromedit/windows/MeshProperties.cpp b/bromedit/windows/MeshProperties.cpp index 73e9ef7..7899cbd 100644 --- a/bromedit/windows/MeshProperties.cpp +++ b/bromedit/windows/MeshProperties.cpp @@ -37,15 +37,15 @@ MeshProperties::MeshProperties(blib::ResourceManager * resourceManager) : blib:: -void MeshProperties::selectMesh(Rsm::Mesh * mesh) +void MeshProperties::selectMesh(IRsm::IMesh * mesh) { - selectedMesh = mesh; + selectedMesh = (Rsm::Mesh*)mesh; for (auto& c : strCallbacks) - c.first->text = *c.second(mesh); + c.first->text = *c.second(selectedMesh); for (auto& c : floatCallbacks) - c.first->text = blib::util::toString(*c.second(mesh)); + c.first->text = blib::util::toString(*c.second(selectedMesh)); } diff --git a/bromedit/windows/MeshProperties.h b/bromedit/windows/MeshProperties.h index 60adac6..852a27f 100644 --- a/bromedit/windows/MeshProperties.h +++ b/bromedit/windows/MeshProperties.h @@ -23,7 +23,7 @@ class MeshProperties : public blib::wm::Window public: MeshProperties(blib::ResourceManager* resourceManager); - void selectMesh(Rsm::Mesh* mesh); + void selectMesh(IRsm::IMesh* mesh); void addHandler(const std::string &name, std::function callback); void addHandler(const std::string &name, std::function callback); diff --git a/vs2015/Release/Browedit.exe b/vs2015/Release/Browedit.exe index f1a218c..0591e69 100644 Binary files a/vs2015/Release/Browedit.exe and b/vs2015/Release/Browedit.exe differ diff --git a/vs2015/Release/bromedit/bromedit.exe b/vs2015/Release/bromedit/bromedit.exe index a85fc2e..b806d1a 100644 Binary files a/vs2015/Release/bromedit/bromedit.exe and b/vs2015/Release/bromedit/bromedit.exe differ