aboutsummaryrefslogtreecommitdiff
path: root/source/30-game/EditorCorePrivate.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/30-game/EditorCorePrivate.cpp')
-rw-r--r--source/30-game/EditorCorePrivate.cpp182
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