Skip to content

Commit 768080c

Browse files
authored
Scene Tree (#36)
* Add scene tree (prototype) * Formalize editor::SceneTree - Stateless: user must track `Inspectee` across calls. - Requires existing `Window`.
1 parent 5556025 commit 768080c

File tree

14 files changed

+173
-36
lines changed

14 files changed

+173
-36
lines changed

facade-lib/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ target_sources(${PROJECT_NAME} PRIVATE
117117
include/facade/scene/id.hpp
118118
include/facade/scene/lights.hpp
119119
include/facade/scene/material.hpp
120+
include/facade/scene/node_data.hpp
120121
include/facade/scene/node.hpp
121122
include/facade/scene/rect.hpp
122123
include/facade/scene/renderer.hpp
@@ -128,6 +129,7 @@ target_sources(${PROJECT_NAME} PRIVATE
128129
include/facade/editor/common.hpp
129130
include/facade/editor/inspector.hpp
130131
include/facade/editor/log.hpp
132+
include/facade/editor/scene_tree.hpp
131133

132134
src/util/data_provider.cpp
133135
src/util/geometry.cpp
@@ -171,4 +173,5 @@ target_sources(${PROJECT_NAME} PRIVATE
171173
src/editor/common.cpp
172174
src/editor/inspector.cpp
173175
src/editor/log.cpp
176+
src/editor/scene_tree.cpp
174177
)

facade-lib/include/facade/editor/inspector.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class Scene;
1010

1111
namespace editor {
1212
///
13-
/// \brief ImGui helper to inspect / reflect various properties
13+
/// \brief Stateless ImGui helper to inspect / reflect various properties
1414
///
1515
class Inspector {
1616
public:
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
#pragma once
2+
#include <facade/editor/common.hpp>
3+
#include <facade/scene/id.hpp>
4+
#include <facade/util/fixed_string.hpp>
5+
6+
namespace facade {
7+
class Scene;
8+
class Node;
9+
10+
namespace editor {
11+
///
12+
/// \brief Target Node to inspect (driven by SceneTree)
13+
///
14+
struct Inspectee {
15+
FixedString<128> name{"[Node]###Node"};
16+
Id<Node> id{};
17+
18+
explicit operator bool() const { return id > Id<Node>{}; }
19+
};
20+
21+
///
22+
/// \brief Stateless wrapper to display interactive scene tree and pick Nodes to inspect
23+
///
24+
class SceneTree : public Pinned {
25+
public:
26+
SceneTree(Scene& scene) : m_scene(scene) {}
27+
28+
///
29+
/// \brief Render the scene tree into the passed window
30+
/// \param inout Used to highlight matching Node, and set to clicked Node, if any
31+
/// \returns true if inout changed during tree walk
32+
///
33+
bool render(NotClosed<Window>, Inspectee& inout) const;
34+
35+
private:
36+
Scene& m_scene;
37+
};
38+
} // namespace editor
39+
} // namespace facade

facade-lib/include/facade/engine/engine.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class Scene;
1010
struct Window;
1111

1212
struct EngineCreateInfo {
13-
glm::uvec2 extent{800, 800};
13+
glm::uvec2 extent{1280, 800};
1414
char const* title{"facade"};
1515
std::uint8_t msaa_samples{2};
1616
bool auto_show{false};

facade-lib/include/facade/scene/node.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <facade/scene/transform.hpp>
44
#include <facade/util/type_id.hpp>
55
#include <memory>
6+
#include <span>
67
#include <unordered_map>
78
#include <vector>
89

@@ -36,8 +37,12 @@ class Node {
3637

3738
Id<Node> id() const { return m_id; }
3839

40+
std::span<Node> children() { return m_children; }
41+
std::span<Node const> children() const { return m_children; }
42+
3943
Transform transform{};
4044
std::vector<Transform> instances{};
45+
std::string name{};
4146

4247
private:
4348
struct Hasher {
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#pragma once
2+
#include <facade/scene/transform.hpp>
3+
#include <string>
4+
#include <vector>
5+
6+
namespace facade {
7+
struct NodeData {
8+
enum class Type { eNone, eMesh, eCamera };
9+
10+
std::string name{};
11+
Transform transform{};
12+
std::vector<std::size_t> children{};
13+
std::size_t index{};
14+
Type type{};
15+
};
16+
} // namespace facade

facade-lib/include/facade/scene/scene.hpp

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <facade/scene/lights.hpp>
55
#include <facade/scene/material.hpp>
66
#include <facade/scene/node.hpp>
7+
#include <facade/scene/node_data.hpp>
78
#include <facade/scene/transform.hpp>
89
#include <facade/util/enum_array.hpp>
910
#include <facade/util/image.hpp>
@@ -59,6 +60,8 @@ class Scene {
5960
Node* find_node(Id<Node> id);
6061
Material* find_material(Id<Material> id) const;
6162
Mesh const* find_mesh(Id<Mesh> id) const;
63+
std::span<Node> roots() { return m_tree.roots; }
64+
std::span<Node const> roots() const { return m_tree.roots; }
6265

6366
std::size_t camera_count() const { return m_storage.cameras.size(); }
6467
bool select_camera(Id<Camera> id);
@@ -75,15 +78,6 @@ class Scene {
7578
private:
7679
struct TreeBuilder;
7780

78-
struct NodeData {
79-
enum class Type { eNone, eMesh, eCamera };
80-
81-
Transform transform{};
82-
std::vector<std::size_t> children{};
83-
std::size_t index{};
84-
Type type{};
85-
};
86-
8781
struct Tree {
8882
struct Data {
8983
std::vector<std::size_t> roots{};

facade-lib/include/facade/util/fixed_string.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ class FixedString {
2525

2626
template <std::size_t N>
2727
void append(FixedString<N> const& rhs) {
28-
auto const dsize = std::min(Capacity - m_size, rhs.m_size);
29-
std::memcpy(m_buffer + m_size, rhs.m_buffer, dsize);
28+
auto const dsize = std::min(Capacity - m_size, rhs.size());
29+
std::memcpy(m_buffer + m_size, rhs.data(), dsize);
3030
m_size += dsize;
3131
}
3232

facade-lib/src/detail/gltf.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -605,7 +605,7 @@ Asset Asset::parse(dj::Json const& json, DataProvider const& provider) {
605605
type = camera ? Node::Type::eCamera : Node::Type::eMesh;
606606
index = camera ? camera.as<std::size_t>() : mesh.as<std::size_t>();
607607
}
608-
ret.nodes.push_back(Node{transform(node), children(node["children"]), index, type});
608+
ret.nodes.push_back(Node{node["name"].as<std::string>(), transform(node), children(node["children"]), index, type});
609609
}
610610

611611
auto const& scenes = json["scenes"].array_view();

facade-lib/src/detail/gltf.hpp

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#pragma once
2+
#include <facade/scene/node_data.hpp>
23
#include <facade/scene/transform.hpp>
34
#include <facade/util/byte_buffer.hpp>
45
#include <facade/util/colour_space.hpp>
@@ -126,14 +127,7 @@ struct Texture {
126127
ColourSpace colour_space{ColourSpace::eSrgb};
127128
};
128129

129-
struct Node {
130-
enum class Type { eNone, eMesh, eCamera };
131-
132-
Transform transform{};
133-
std::vector<std::size_t> children{};
134-
std::size_t index{};
135-
Type type{};
136-
};
130+
using Node = NodeData;
137131

138132
struct Scene {
139133
std::vector<std::size_t> root_nodes{};

0 commit comments

Comments
 (0)