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/inspector_panel.hpp"
#include "panels/scene_hierarchy_panel.hpp"
#include "panels/viewport_panel.hpp"
#include "panels/scene_panel.hpp"
class Editor : public sophia::Application {
public:
@@ -29,13 +29,13 @@ class Editor : public sophia::Application {
sophia::RenderTargetHandle sceneTarget =
resources().create<sophia::RenderTarget>();
sceneViews().create({.scene = sceneHandle, .target = sceneTarget});
panels().emplace<ViewportPanel>(ui(), sceneTarget, scene, selected);
panels().emplace<ScenePanel>(ui(), sceneTarget, scene, selected);
panels().setDefaultLayout(
{.left = {"Scene Hierarchy"},
.right = {"Inspector", "Frame Stats", "PanelRegistry"},
.bottom = {"Asset Browser", "Console"},
.center = {"Viewport"}});
.center = {"Scene"}});
}
void onUpdate(const sophia::FrameInfo& frameInfo) override {}
@@ -1,4 +1,4 @@
#include "viewport_panel.hpp"
#include "scene_panel.hpp"
#include <imgui.h>
@@ -18,7 +18,7 @@ const ImU32 SELECTION_COLOR = IM_COL32(255, 170, 40, 255);
} // namespace
ImVec2 ViewportPanel::ViewportTransform::worldToScreen(
ImVec2 ScenePanel::ViewportTransform::worldToScreen(
const glm::vec3& world) const {
glm::vec4 clip = viewProjection * glm::vec4{world, 1.f};
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};
}
glm::vec2 ViewportPanel::ViewportTransform::screenToWorld(
glm::vec2 ScenePanel::ViewportTransform::screenToWorld(
const ImVec2& screen) const {
glm::vec2 ndc{(screen.x - origin.x) / size.x * 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;
}
void ViewportPanel::onUpdate(const sophia::FrameInfo&) {
void ScenePanel::onUpdate(const sophia::FrameInfo&) {
drawToolbar();
ImGui::Separator();
@@ -81,9 +81,9 @@ void ViewportPanel::onUpdate(const sophia::FrameInfo&) {
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;
const ImU32 gridColor = IM_COL32(255, 255, 255, 18);
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();
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) {
return;
}
@@ -151,7 +151,7 @@ void ViewportPanel::drawSelection(const ViewportTransform& viewport) {
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;
std::optional<std::tuple<sophia::s32, float>> bestOrder;
@@ -15,11 +15,11 @@
* Picking and moving are 2D: they assume an orthographic camera rotated only
* around Z, and work in the z = 0 plane.
*/
class ViewportPanel : public sophia::Panel {
class ScenePanel : public sophia::Panel {
public:
ViewportPanel(sophia::UI& ui, sophia::RenderTargetHandle target,
ScenePanel(sophia::UI& ui, sophia::RenderTargetHandle target,
sophia::Scene& scene, sophia::Entity& selected)
: Panel{{.name = "Viewport",
: Panel{{.name = "Scene",
.windowFlags = ImGuiWindowFlags_NoScrollbar |
ImGuiWindowFlags_NoScrollWithMouse}},
ui{ui},