Adding 3D support #77
+3
-3
@@ -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},
|
||||||
Reference in New Issue
Block a user