Adding 3D support #77

Merged
burkkyy merged 3 commits from dev/adding-3d-support into main 2026-10-02 20:12:46 -07:00
3 changed files with 16 additions and 16 deletions
Showing only changes of commit 379589fe8c - Show all commits
+3 -3
View File
@@ -6,7 +6,7 @@
#include "panels/asset_browser_panel.hpp" #include "panels/asset_browser_panel.hpp"
#include "panels/inspector_panel.hpp" #include "panels/inspector_panel.hpp"
#include "panels/scene_hierarchy_panel.hpp" #include "panels/scene_hierarchy_panel.hpp"
#include "panels/viewport_panel.hpp" #include "panels/scene_panel.hpp"
class Editor : public sophia::Application { class Editor : public sophia::Application {
public: public:
@@ -29,13 +29,13 @@ class Editor : public sophia::Application {
sophia::RenderTargetHandle sceneTarget = sophia::RenderTargetHandle sceneTarget =
resources().create<sophia::RenderTarget>(); resources().create<sophia::RenderTarget>();
sceneViews().create({.scene = sceneHandle, .target = sceneTarget}); sceneViews().create({.scene = sceneHandle, .target = sceneTarget});
panels().emplace<ViewportPanel>(ui(), sceneTarget, scene, selected); panels().emplace<ScenePanel>(ui(), sceneTarget, scene, selected);
panels().setDefaultLayout( panels().setDefaultLayout(
{.left = {"Scene Hierarchy"}, {.left = {"Scene Hierarchy"},
.right = {"Inspector", "Frame Stats", "PanelRegistry"}, .right = {"Inspector", "Frame Stats", "PanelRegistry"},
.bottom = {"Asset Browser", "Console"}, .bottom = {"Asset Browser", "Console"},
.center = {"Viewport"}}); .center = {"Scene"}});
} }
void onUpdate(const sophia::FrameInfo& frameInfo) override {} void onUpdate(const sophia::FrameInfo& frameInfo) override {}
@@ -1,4 +1,4 @@
#include "viewport_panel.hpp" #include "scene_panel.hpp"
#include <imgui.h> #include <imgui.h>
@@ -18,7 +18,7 @@ const ImU32 SELECTION_COLOR = IM_COL32(255, 170, 40, 255);
} // namespace } // namespace
ImVec2 ViewportPanel::ViewportTransform::worldToScreen( ImVec2 ScenePanel::ViewportTransform::worldToScreen(
const glm::vec3& world) const { const glm::vec3& world) const {
glm::vec4 clip = viewProjection * glm::vec4{world, 1.f}; glm::vec4 clip = viewProjection * glm::vec4{world, 1.f};
glm::vec2 ndc = glm::vec2{clip} / clip.w; glm::vec2 ndc = glm::vec2{clip} / clip.w;
@@ -27,7 +27,7 @@ ImVec2 ViewportPanel::ViewportTransform::worldToScreen(
origin.y + (ndc.y * 0.5f + 0.5f) * size.y}; origin.y + (ndc.y * 0.5f + 0.5f) * size.y};
} }
glm::vec2 ViewportPanel::ViewportTransform::screenToWorld( glm::vec2 ScenePanel::ViewportTransform::screenToWorld(
const ImVec2& screen) const { const ImVec2& screen) const {
glm::vec2 ndc{(screen.x - origin.x) / size.x * 2.f - 1.f, glm::vec2 ndc{(screen.x - origin.x) / size.x * 2.f - 1.f,
(screen.y - origin.y) / size.y * 2.f - 1.f}; (screen.y - origin.y) / size.y * 2.f - 1.f};
@@ -35,7 +35,7 @@ glm::vec2 ViewportPanel::ViewportTransform::screenToWorld(
return glm::vec2{world} / world.w; return glm::vec2{world} / world.w;
} }
void ViewportPanel::onUpdate(const sophia::FrameInfo&) { void ScenePanel::onUpdate(const sophia::FrameInfo&) {
drawToolbar(); drawToolbar();
ImGui::Separator(); ImGui::Separator();
@@ -81,9 +81,9 @@ void ViewportPanel::onUpdate(const sophia::FrameInfo&) {
ImGui::TextDisabled("%.0f x %.0f", size.x, size.y); ImGui::TextDisabled("%.0f x %.0f", size.x, size.y);
} }
void ViewportPanel::drawToolbar() { ImGui::Checkbox("Grid", &showGrid); } void ScenePanel::drawToolbar() { ImGui::Checkbox("Grid", &showGrid); }
void ViewportPanel::drawGrid(ImVec2 origin, ImVec2 size) { void ScenePanel::drawGrid(ImVec2 origin, ImVec2 size) {
constexpr float GRID_STEP = 40.0f; constexpr float GRID_STEP = 40.0f;
const ImU32 gridColor = IM_COL32(255, 255, 255, 18); const ImU32 gridColor = IM_COL32(255, 255, 255, 18);
const ImVec2 end(origin.x + size.x, origin.y + size.y); const ImVec2 end(origin.x + size.x, origin.y + size.y);
@@ -99,7 +99,7 @@ void ViewportPanel::drawGrid(ImVec2 origin, ImVec2 size) {
} }
} }
void ViewportPanel::handleInput(const ViewportTransform& viewport) { void ScenePanel::handleInput(const ViewportTransform& viewport) {
const ImGuiIO& io = ImGui::GetIO(); const ImGuiIO& io = ImGui::GetIO();
if (ImGui::IsItemActivated()) { if (ImGui::IsItemActivated()) {
@@ -124,7 +124,7 @@ void ViewportPanel::handleInput(const ViewportTransform& viewport) {
} }
} }
void ViewportPanel::drawSelection(const ViewportTransform& viewport) { void ScenePanel::drawSelection(const ViewportTransform& viewport) {
if (!selected) { if (!selected) {
return; return;
} }
@@ -151,7 +151,7 @@ void ViewportPanel::drawSelection(const ViewportTransform& viewport) {
drawList->AddCircle(center, 4.0f, SELECTION_COLOR, 0, 2.0f); drawList->AddCircle(center, 4.0f, SELECTION_COLOR, 0, 2.0f);
} }
sophia::Entity ViewportPanel::pick(glm::vec2 world) { sophia::Entity ScenePanel::pick(glm::vec2 world) {
sophia::Entity best; sophia::Entity best;
std::optional<std::tuple<sophia::s32, float>> bestOrder; std::optional<std::tuple<sophia::s32, float>> bestOrder;
@@ -15,11 +15,11 @@
* Picking and moving are 2D: they assume an orthographic camera rotated only * Picking and moving are 2D: they assume an orthographic camera rotated only
* around Z, and work in the z = 0 plane. * around Z, and work in the z = 0 plane.
*/ */
class ViewportPanel : public sophia::Panel { class ScenePanel : public sophia::Panel {
public: public:
ViewportPanel(sophia::UI& ui, sophia::RenderTargetHandle target, ScenePanel(sophia::UI& ui, sophia::RenderTargetHandle target,
sophia::Scene& scene, sophia::Entity& selected) sophia::Scene& scene, sophia::Entity& selected)
: Panel{{.name = "Viewport", : Panel{{.name = "Scene",
.windowFlags = ImGuiWindowFlags_NoScrollbar | .windowFlags = ImGuiWindowFlags_NoScrollbar |
ImGuiWindowFlags_NoScrollWithMouse}}, ImGuiWindowFlags_NoScrollWithMouse}},
ui{ui}, ui{ui},