diff --git a/browedit/MapView.Objectmode.cpp b/browedit/MapView.Objectmode.cpp index ce72049..33fc7e2 100644 --- a/browedit/MapView.Objectmode.cpp +++ b/browedit/MapView.Objectmode.cpp @@ -237,30 +237,30 @@ void MapView::postRenderObjectMode(BrowEdit* browEdit) lockedGizmo = !ImGui::GetIO().KeyCtrl; } - if (!lockedGizmo) { - if (map->selectedNodes.size() == 1 && gadget.mode == Gadget::Mode::Rotate) { - mat = glm::rotate(mat, -glm::radians(map->selectedNodes[0]->getComponent()->rotation.z), glm::vec3(0, 0, 1)); - rotMat = glm::rotate(rotMat, -glm::radians(map->selectedNodes[0]->getComponent()->rotation.z), glm::vec3(0, 0, 1)); + if (map->selectedNodes[0]->getComponent()) { + if (!lockedGizmo) { + if (map->selectedNodes.size() == 1 && gadget.mode == Gadget::Mode::Rotate) { + mat = glm::rotate(mat, -glm::radians(map->selectedNodes[0]->getComponent()->rotation.z), glm::vec3(0, 0, 1)); + rotMat = glm::rotate(rotMat, -glm::radians(map->selectedNodes[0]->getComponent()->rotation.z), glm::vec3(0, 0, 1)); + } } - } - if (map->selectedNodes.size() == 1 && gadget.mode == Gadget::Mode::Scale) { - mat = glm::rotate(mat, -glm::radians(map->selectedNodes[0]->getComponent()->rotation.z), glm::vec3(0, 0, 1)); - mat = glm::rotate(mat, -glm::radians(map->selectedNodes[0]->getComponent()->rotation.x), glm::vec3(1, 0, 0)); - mat = glm::rotate(mat, glm::radians(map->selectedNodes[0]->getComponent()->rotation.y), glm::vec3(0, 1, 0)); + if (map->selectedNodes.size() == 1 && gadget.mode == Gadget::Mode::Scale) { + mat = glm::rotate(mat, -glm::radians(map->selectedNodes[0]->getComponent()->rotation.z), glm::vec3(0, 0, 1)); + mat = glm::rotate(mat, -glm::radians(map->selectedNodes[0]->getComponent()->rotation.x), glm::vec3(1, 0, 0)); + mat = glm::rotate(mat, glm::radians(map->selectedNodes[0]->getComponent()->rotation.y), glm::vec3(0, 1, 0)); - rotMat = glm::rotate(rotMat, -glm::radians(map->selectedNodes[0]->getComponent()->rotation.z), glm::vec3(0, 0, 1)); - rotMat = glm::rotate(rotMat, glm::radians(map->selectedNodes[0]->getComponent()->rotation.x), glm::vec3(1, 0, 0)); - rotMat = glm::rotate(rotMat, glm::radians(map->selectedNodes[0]->getComponent()->rotation.y), glm::vec3(0, 1, 0)); + rotMat = glm::rotate(rotMat, -glm::radians(map->selectedNodes[0]->getComponent()->rotation.z), glm::vec3(0, 0, 1)); + rotMat = glm::rotate(rotMat, glm::radians(map->selectedNodes[0]->getComponent()->rotation.x), glm::vec3(1, 0, 0)); + rotMat = glm::rotate(rotMat, glm::radians(map->selectedNodes[0]->getComponent()->rotation.y), glm::vec3(0, 1, 0)); + } } - gadget.draw(mouseRay, mat, !lockedGizmo ? -map->selectedNodes[0]->getComponent()->rotation.x : 0); + gadget.draw(mouseRay, mat, !lockedGizmo && map->selectedNodes[0]->getComponent() ? -map->selectedNodes[0]->getComponent()->rotation.x : 0); - if (!lockedGizmo) { - if (map->selectedNodes.size() == 1 && gadget.mode == Gadget::Mode::Rotate) { - if (gadget.selectedAxis == Gadget::Axis::Y) { - rotMat = glm::rotate(rotMat, glm::radians(map->selectedNodes[0]->getComponent()->rotation.x), glm::vec3(1, 0, 0)); - } + if (!lockedGizmo && map->selectedNodes[0]->getComponent() && map->selectedNodes.size() == 1 && gadget.mode == Gadget::Mode::Rotate) { + if (gadget.selectedAxis == Gadget::Axis::Y) { + rotMat = glm::rotate(rotMat, glm::radians(map->selectedNodes[0]->getComponent()->rotation.x), glm::vec3(1, 0, 0)); } } diff --git a/browedit/actions/ObjectChangeAction.h b/browedit/actions/ObjectChangeAction.h index 924ab38..eed9dfb 100644 --- a/browedit/actions/ObjectChangeAction.h +++ b/browedit/actions/ObjectChangeAction.h @@ -4,6 +4,7 @@ #include #include #include +#include template class ObjectChangeAction : public Action @@ -32,7 +33,11 @@ class ObjectChangeAction : public Action auto gndRenderer = node->getComponent(); if (gndRenderer) gndRenderer->setChunksDirty(); //TODO : only set this specific chunk dirty - + auto waterRenderer = node->getComponent(); + if (waterRenderer) { + waterRenderer->renderFullWater = false; + waterRenderer->setDirty(); + } if ((std::string*)ptr == &(node->name)) node->onRename(map); } @@ -45,6 +50,11 @@ class ObjectChangeAction : public Action auto gndRenderer = node->getComponent(); if (gndRenderer) gndRenderer->setChunksDirty(); //TODO : only set this specific chunk dirty + auto waterRenderer = node->getComponent(); + if (waterRenderer) { + waterRenderer->renderFullWater = false; + waterRenderer->setDirty(); + } if ((std::string*)ptr == &(node->name)) node->onRename(map); } diff --git a/browedit/components/Rsw.cpp b/browedit/components/Rsw.cpp index 73c3f61..6ad4a67 100644 --- a/browedit/components/Rsw.cpp +++ b/browedit/components/Rsw.cpp @@ -781,7 +781,14 @@ void Rsw::buildImGui(BrowEdit* browEdit) auto waterRenderer = node->getComponent(); waterRenderer->reloadTextures(); } - util::DragFloat(browEdit, browEdit->activeMapView->map, node, "Height", &water.height, 0.1f, -100, 100); + if (util::DragFloat(browEdit, browEdit->activeMapView->map, node, "Height", &water.height, 0.1f, -100, 100)) { + auto waterRenderer = node->getComponent(); + + if (!waterRenderer->renderFullWater) { + waterRenderer->renderFullWater = true; + waterRenderer->setDirty(); + } + } util::DragFloat(browEdit, browEdit->activeMapView->map, node, "Wave Height", &water.amplitude, 0.1f, -100, 100); util::DragInt(browEdit, browEdit->activeMapView->map, node, "Texture Animation Speed", &water.textureAnimSpeed, 1, 0, 1000); util::DragFloat(browEdit, browEdit->activeMapView->map, node, "Wave Speed", &water.waveSpeed, 0.1f, -100, 100); diff --git a/browedit/components/WaterRenderer.cpp b/browedit/components/WaterRenderer.cpp index 3c708d0..c63740a 100644 --- a/browedit/components/WaterRenderer.cpp +++ b/browedit/components/WaterRenderer.cpp @@ -41,6 +41,11 @@ void WaterRenderer::render() if (!vbo || dirty) { auto gnd = node->getComponent(); + float waveHeight = -9999; + + if (rsw) + waveHeight = rsw->water.height - rsw->water.amplitude; + if(!vbo) vbo = new gl::VBO(); std::vector verts; @@ -48,6 +53,16 @@ void WaterRenderer::render() { for (int y = 0; y < gnd->height; y++) { + auto c = gnd->cubes[x][gnd->height - y - 1]; + + if (!this->renderFullWater) { + if (c->tileUp == -1) + continue; + + if (c->heights[0] <= waveHeight && c->heights[1] <= waveHeight && c->heights[2] <= waveHeight && c->heights[3] <= waveHeight) + continue; + } + verts.push_back(VertexP3T2(glm::vec3(10 * x, 0, 10 * (y+1)), glm::vec2((x % 4) * 0.25f + 0.00f, (y % 4) * 0.25f + 0.00f))); verts.push_back(VertexP3T2(glm::vec3(10 * (x+1), 0, 10 * (y+1)), glm::vec2((x % 4) * 0.25f + 0.25f, (y % 4) * 0.25f + 0.00f))); verts.push_back(VertexP3T2(glm::vec3(10 * (x+1), 0, 10 * (y+2)), glm::vec2((x % 4) * 0.25f + 0.25f, (y % 4) * 0.25f + 0.25f))); diff --git a/browedit/components/WaterRenderer.h b/browedit/components/WaterRenderer.h index e606219..f890770 100644 --- a/browedit/components/WaterRenderer.h +++ b/browedit/components/WaterRenderer.h @@ -32,6 +32,7 @@ class WaterRenderer : public Renderer gl::VBO* vbo = nullptr; bool dirty = true; bool viewFog = false; + bool renderFullWater = false; WaterRenderer(); ~WaterRenderer();