diff options
author | rtk0c <[email protected]> | 2022-06-09 23:20:33 -0700 |
---|---|---|
committer | rtk0c <[email protected]> | 2022-06-09 23:20:33 -0700 |
commit | ab81521707d6ffa3f5d01ad315c0070b54bf468a (patch) | |
tree | e9d19a27a9266962b87ae73576bfa5232ed705b6 /source/30-game/EditorCorePrivate.cpp | |
parent | 3acd929a28c268a52f7799ea3db1ad4a01790fec (diff) | |
parent | e3e848ac4da1c2ae59d93e62da8ef6f87b3452cd (diff) |
Changeset: 68
Diffstat (limited to 'source/30-game/EditorCorePrivate.cpp')
-rw-r--r-- | source/30-game/EditorCorePrivate.cpp | 182 |
1 files changed, 110 insertions, 72 deletions
diff --git a/source/30-game/EditorCorePrivate.cpp b/source/30-game/EditorCorePrivate.cpp index 43857a8..1e7b010 100644 --- a/source/30-game/EditorCorePrivate.cpp +++ b/source/30-game/EditorCorePrivate.cpp @@ -23,6 +23,10 @@ #include <imgui.h> #include <misc/cpp/imgui_stdlib.h> +#include <rapidjson/document.h> +#include <rapidjson/filereadstream.h> +#include <rapidjson/filewritestream.h> +#include <rapidjson/writer.h> #include <cstddef> #include <cstdint> #include <cstdlib> @@ -399,6 +403,21 @@ struct CreatableGameObject { }, }; #undef GAMEOBJECT_CONSTRUCTOR + +void SaveRendererBindings(const Renderer& renderer) { + auto file = Utils::OpenCstdioFile("assets/GameRendererBindings.json", Utils::WriteTruncate); + if (!file) return; + DEFER { fclose(file); }; + + char writerBuffer[65536]; + rapidjson::FileWriteStream stream(file, writerBuffer, sizeof(writerBuffer)); + rapidjson::Writer writer(stream); + + rapidjson::Document root(rapidjson::kObjectType); + renderer.SaveBindings(root, root); + + root.Accept(writer); +} } // namespace ProjectBrussel_UNITY_ID std::unique_ptr<IEditor> IEditor::CreateInstance(App* app) { @@ -659,6 +678,8 @@ void EditorInstance::Show() { } void EditorInstance::ShowWorldProperties() { + using namespace ProjectBrussel_UNITY_ID; + if (mApp->IsGameRunning()) { if (ImGui::Button("Pause")) { mApp->SetGameRunning(false); @@ -675,102 +696,119 @@ void EditorInstance::ShowWorldProperties() { } } + auto& renderer = *mApp->GetWorldRenderer(); auto& camera = *mApp->GetActiveCamera(); - // vvv Camera settings (per instance) - ImGui::TextUnformatted("Active camera:"); - ImGui::Indent(); + if (ImGui::CollapsingHeader("Renderer settings")) { + if (ImGui::Checkbox("Draw shaded", &mRenderer_DrawShaded)) { + renderer.SetRenderOption(Renderer::RO_Shading, mRenderer_DrawShaded); + } + if (ImGui::Checkbox("Draw wireframe", &mRenderer_DrawWireFrame)) { + renderer.SetRenderOption(Renderer::RO_Wireframe, mRenderer_DrawWireFrame); + } - ImGui::TextUnformatted(camera.name.c_str()); - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip("Object at <%p>", &camera); + if (auto ires = Utils::SimpleIresReceptor<IresMaterial>(renderer.binding_WireframeMaterial->GetIres(), *this, IresObject::KD_Material)) { + renderer.binding_WireframeMaterial.Attach(ires->GetInstance()); + SaveRendererBindings(renderer); + } } - ImGui::InputFloat3("Eye", glm::value_ptr(camera.eye)); - if (ImGui::IsMouseReleased(ImGuiMouseButton_Right) && ImGui::IsItemHovered()) { - ImGui::OpenPopup("##CTXMENU"); - } - ImGui::InputFloat3("Target", glm::value_ptr(camera.target)); - if (ImGui::IsMouseReleased(ImGuiMouseButton_Right) && ImGui::IsItemHovered()) { - ImGui::OpenPopup("##CTXMENU"); - } - if (ImGui::BeginPopup("##CTXMENU", ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings)) { - if (ImGui::MenuItem("Reset to origin")) { - camera.SetEyePos(glm::vec3(1.0f, 1.0f, 1.0f)); - } - if (ImGui::MenuItem("Reset completely")) { - camera.eye = glm::vec3(0, 0, 1); - camera.target = glm::vec3(0, 0, 0); + if (ImGui::CollapsingHeader("Camera settings")) { + // vvv Camera settings (per instance) + ImGui::TextUnformatted("Active camera:"); + ImGui::Indent(); + + ImGui::TextUnformatted(camera.name.c_str()); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("Object at <%p>", &camera); } - ImGui::EndPopup(); - } - if (IsCurrentCameraEditor()) { - const char* preview; - switch (mEcm) { - case ECM_2D: preview = "2D view"; break; - case ECM_Side3D: preview = "Side 3D view"; break; + ImGui::InputFloat3("Eye", glm::value_ptr(camera.eye)); + if (ImGui::IsMouseReleased(ImGuiMouseButton_Right) && ImGui::IsItemHovered()) { + ImGui::OpenPopup("##CTXMENU"); + } + ImGui::InputFloat3("Target", glm::value_ptr(camera.target)); + if (ImGui::IsMouseReleased(ImGuiMouseButton_Right) && ImGui::IsItemHovered()) { + ImGui::OpenPopup("##CTXMENU"); } - if (ImGui::BeginCombo("Mode", preview)) { - if (ImGui::Selectable("2D view", mEcm == ECM_2D)) { - if (mEcm != ECM_2D) { - mEcm = ECM_2D; + if (ImGui::BeginPopup("##CTXMENU", ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings)) { + if (ImGui::MenuItem("Reset to origin")) { + camera.SetEyePos(glm::vec3(1.0f, 1.0f, 1.0f)); + } + if (ImGui::MenuItem("Reset completely")) { + camera.eye = glm::vec3(0, 0, 1); + camera.target = glm::vec3(0, 0, 0); + } + ImGui::EndPopup(); + } + + if (IsCurrentCameraEditor()) { + const char* preview; + switch (mEcm) { + case ECM_2D: preview = "2D view"; break; + case ECM_Side3D: preview = "Side 3D view"; break; + } + if (ImGui::BeginCombo("Mode", preview)) { + if (ImGui::Selectable("2D view", mEcm == ECM_2D)) { + if (mEcm != ECM_2D) { + mEcm = ECM_2D; - // TODO project eye to world plane + // TODO project eye to world plane - camera.SetHasPerspective(false); + camera.SetHasPerspective(false); + } } - } - if (ImGui::Selectable("Side 3D view", mEcm == ECM_Side3D, ImGuiSelectableFlags_None)) { - if (mEcm != ECM_Side3D) { - mEcm = ECM_Side3D; + if (ImGui::Selectable("Side 3D view", mEcm == ECM_Side3D, ImGuiSelectableFlags_None)) { + if (mEcm != ECM_Side3D) { + mEcm = ECM_Side3D; - auto origEye = camera.eye; - auto origTarget = camera.target; + auto origEye = camera.eye; + auto origTarget = camera.target; - // New setup: focus on the point of world plane that we were originally "hovering above" - camera.target = origEye; - camera.target.z = 0.0f; + // New setup: focus on the point of world plane that we were originally "hovering above" + camera.target = origEye; + camera.target.z = 0.0f; - // New setup: move the eye back at an angle - camera.eye = camera.target; - camera.eye.x += 4.0f * std::cos(60.0f); - camera.eye.y += 0.0f; - camera.eye.z += 4.0f * std::sin(60.0f); + // New setup: move the eye back at an angle + camera.eye = camera.target; + camera.eye.x += 4.0f * std::cos(60.0f); + camera.eye.y += 0.0f; + camera.eye.z += 4.0f * std::sin(60.0f); - camera.SetHasPerspective(true); + camera.SetHasPerspective(true); + } } + ImGui::EndCombo(); } - ImGui::EndCombo(); } - } - ImGui::Checkbox("Perspective", &camera.perspective); - if (camera.perspective) { - float fovDegress = camera.fov / M_PI * 180.0f; - if (ImGui::SliderFloat("FOV", &fovDegress, 1.0f, 180.0f)) { - camera.fov = fovDegress / 180.0f * M_PI; - } - } else { - if (ImGui::InputFloat("Pixels per meter", &camera.pixelsPerMeter)) { - camera.pixelsPerMeter = std::max(camera.pixelsPerMeter, 0.0f); + ImGui::Checkbox("Perspective", &camera.perspective); + if (camera.perspective) { + float fovDegress = camera.fov / M_PI * 180.0f; + if (ImGui::SliderFloat("FOV", &fovDegress, 1.0f, 180.0f)) { + camera.fov = fovDegress / 180.0f * M_PI; + } + } else { + if (ImGui::InputFloat("Pixels per meter", &camera.pixelsPerMeter)) { + camera.pixelsPerMeter = std::max(camera.pixelsPerMeter, 0.0f); + } } - } - ImGui::Unindent(); - // ^^^ Camera settings (per instance) - // vvv Camera control settings - ImGui::TextUnformatted("Camera controls:"); - ImGui::Indent(); + ImGui::Unindent(); + // ^^^ Camera settings (per instance) + // vvv Camera control settings + ImGui::TextUnformatted("Camera controls:"); + ImGui::Indent(); - ImGui::Checkbox("Move camera with WASD", &mMoveCamKeyboard); - ImGui::SliderFloat("Slide speed", &mMoveCamSlideSpeed, 0.1f, 10.0f); + ImGui::Checkbox("Move camera with WASD", &mMoveCamKeyboard); + ImGui::SliderFloat("Slide speed", &mMoveCamSlideSpeed, 0.1f, 10.0f); - ImGui::Checkbox("Move camera with scoll wheel", &mMoveCamScrollWheel); - ImGui::SliderFloat("Scroll speed", &mMoveCamScrollSpeed, 0.01, 10.0f); + ImGui::Checkbox("Move camera with scoll wheel", &mMoveCamScrollWheel); + ImGui::SliderFloat("Scroll speed", &mMoveCamScrollSpeed, 0.01, 10.0f); - ImGui::Unindent(); - // ^^^ Camera control settings + ImGui::Unindent(); + // ^^^ Camera control settings + } } // TOOD move resource-specific and gameobject-specific inspector code into attachments mechanism |