Skip to content

Commit 8a91298

Browse files
authored
Misc improvements (#53)
* Improve orientation and scale inspection - Fix janky Euler rotation: all axes rotate smoothly and continuously. - Add option to unify all scaling axes into one inspect parameter. * Add Version; CMake option to build exe * Upgrade loading metrics - Defer decompressing images to `Scene` (instead of `gltf::Scene`). - Refactor `LoadStatus`: Provide granular done / total metrics. * Cleanup * 🐛 Only iterate over directories
1 parent b26b623 commit 8a91298

File tree

16 files changed

+197
-115
lines changed

16 files changed

+197
-115
lines changed

CMakeLists.txt

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,17 @@ set(target_prefix facade)
88

99
project(facade)
1010

11-
option(FACADE_BUILD_SHADERS "Build facade shaders" ON)
11+
set(is_root_project OFF)
12+
13+
if(PROJECT_NAME STREQUAL CMAKE_PROJECT_NAME)
14+
set(is_root_project ON)
15+
endif()
16+
17+
option(FACADE_BUILD_SHADERS "Build facade shaders" ${is_root_project})
1218
option(FACADE_PCH "Use PCH" ON)
19+
option(FACADE_BUILD_EXE "Build facade application (else only library)" ${is_root_project})
1320

14-
if(FACADE_BUILD_SHADERS)
21+
if(FACADE_BUILD_EXE AND FACADE_BUILD_SHADERS)
1522
find_program(glslc glslc)
1623

1724
if(glslc STREQUAL glslc-NOTFOUND)
@@ -23,7 +30,7 @@ endif()
2330
add_subdirectory(tools/embed_shader)
2431
add_subdirectory(lib)
2532

26-
if(FACADE_BUILD_SHADERS)
33+
if(FACADE_BUILD_EXE AND FACADE_BUILD_SHADERS)
2734
message(STATUS "Adding build step to embed shaders")
2835
add_custom_command(
2936
DEPENDS
@@ -42,27 +49,29 @@ if(FACADE_BUILD_SHADERS)
4249
)
4350
endif()
4451

45-
add_executable(${PROJECT_NAME})
52+
if(FACADE_BUILD_EXE)
53+
add_executable(${PROJECT_NAME})
54+
55+
target_sources(${PROJECT_NAME} PRIVATE
56+
src/main.cpp
4657

47-
target_sources(${PROJECT_NAME} PRIVATE
48-
src/main.cpp
58+
src/bin/shaders.cpp
59+
src/bin/shaders.hpp
4960

50-
src/bin/shaders.cpp
51-
src/bin/shaders.hpp
61+
src/bin/default_vert.spv.hpp
62+
src/bin/unlit_frag.spv.hpp
63+
)
5264

53-
src/bin/default_vert.spv.hpp
54-
src/bin/unlit_frag.spv.hpp
55-
)
65+
target_link_libraries(${PROJECT_NAME} PRIVATE
66+
facade::engine
67+
facade::compile-options
68+
)
5669

57-
target_link_libraries(${PROJECT_NAME} PRIVATE
58-
facade::engine
59-
facade::compile-options
60-
)
70+
string(TOUPPER ${target_prefix} target_prefix_upper)
6171

62-
string(TOUPPER ${target_prefix} target_prefix_upper)
72+
if(${${target_prefix_upper}_PCH})
73+
target_precompile_headers(${PROJECT_NAME} REUSE_FROM ${target_prefix}-vk)
74+
endif()
6375

64-
if(${${target_prefix_upper}_PCH})
65-
target_precompile_headers(${PROJECT_NAME} REUSE_FROM ${target_prefix}-vk)
76+
target_include_directories(${PROJECT_NAME} PRIVATE src)
6677
endif()
67-
68-
target_include_directories(${PROJECT_NAME} PRIVATE src)

lib/CMakeLists.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ set(CMAKE_CXX_STANDARD 20)
88
set(CMAKE_CXX_STANDARD_REQUIRED ON)
99
set(CMAKE_DEBUG_POSTFIX "-d")
1010

11-
project(${target_prefix}-lib)
11+
set(${target_prefix}_version 0.1.0)
12+
13+
project(${target_prefix}-lib VERSION ${${target_prefix}_version})
1214

1315
add_subdirectory(ext)
1416
add_subdirectory(interface)

lib/engine/CMakeLists.txt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ if("${target_prefix}" STREQUAL "")
22
message(FATAL_ERROR "target_prefix unset")
33
endif()
44

5-
project(${target_prefix}-engine)
5+
project(${target_prefix}-engine VERSION ${${target_prefix}_version})
6+
7+
configure_file(src/build_version.hpp.in "${CMAKE_CURRENT_BINARY_DIR}/include/${target_prefix}/build_version.hpp" @ONLY)
68

79
add_library(${PROJECT_NAME})
810
add_library(${target_prefix}::engine ALIAS ${PROJECT_NAME})
@@ -12,6 +14,7 @@ target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_20)
1214
target_include_directories(${PROJECT_NAME}
1315
PUBLIC
1416
include
17+
"${CMAKE_CURRENT_BINARY_DIR}/include"
1518

1619
PRIVATE
1720
src

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class Inspector {
3030
bool inspect(char const* label, glm::vec3& out_vec3, float speed = 1.0f, float lo = min_v, float hi = max_v) const;
3131
bool inspect(char const* label, glm::vec4& out_vec4, float speed = 1.0f, float lo = min_v, float hi = max_v) const;
3232
bool inspect(char const* label, glm::quat& out_quat) const;
33-
bool inspect(Transform& out_transform) const;
33+
bool inspect(Transform& out_transform, Bool& out_unified_scaling) const;
3434
};
3535

3636
class SceneInspector : public Inspector {
@@ -42,7 +42,7 @@ class SceneInspector : public Inspector {
4242
bool inspect(TreeNode const& node, UnlitMaterial& out_material) const;
4343
bool inspect(TreeNode const& node, LitMaterial& out_material) const;
4444
bool inspect(Id<Material> material_id) const;
45-
bool inspect(Id<Node> node_id) const;
45+
bool inspect(Id<Node> node_id, Bool& out_unified_scaling) const;
4646

4747
bool inspect(Id<Mesh> mesh) const;
4848

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#pragma once
2+
#include <facade/build_version.hpp>
23
#include <facade/glfw/glfw.hpp>
34
#include <facade/scene/scene.hpp>
45
#include <facade/util/time.hpp>

lib/engine/src/build_version.hpp.in

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#include <facade/util/version.hpp>
2+
3+
namespace facade {
4+
///
5+
/// \brief facade build version
6+
///
7+
constexpr auto version_v = Version{
8+
.major = @PROJECT_VERSION_MAJOR@,
9+
.minor = @PROJECT_VERSION_MINOR@,
10+
.patch = @PROJECT_VERSION_PATCH@,
11+
};
12+
}

lib/engine/src/editor/inspector.cpp

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
namespace facade::editor {
88
namespace {
99
bool eq(float const a, float const b, float const epsilon = 0.001f) { return std::abs(a - b) < epsilon; }
10-
constexpr glm::vec3 to_radian(glm::vec3 const& angles) { return {glm::radians(angles.x), glm::radians(angles.y), glm::radians(angles.z)}; }
1110
constexpr glm::vec3 to_degree(glm::vec3 const& angles) { return {glm::degrees(angles.x), glm::degrees(angles.y), glm::degrees(angles.z)}; }
1211

1312
struct Modified {
@@ -54,25 +53,31 @@ bool Inspector::inspect(char const* label, glm::vec4& out_vec4, float speed, flo
5453

5554
bool Inspector::inspect(char const* label, glm::quat& out_quat) const {
5655
auto euler = to_degree(glm::eulerAngles(out_quat));
56+
auto const org = euler;
5757
if (inspect(label, euler, 0.5f, -180.0f, 180.0f)) {
58-
static constexpr auto y_limit_v{90.0f};
59-
if (euler.y < -y_limit_v) { euler.y = y_limit_v; }
60-
if (euler.y > y_limit_v) { euler.y = -y_limit_v; }
61-
out_quat = glm::quat(to_radian(euler));
58+
if (auto const diff = org.x - euler.x; std::abs(diff) > 0.0f) { out_quat = glm::rotate(out_quat, glm::radians(diff), right_v); }
59+
if (auto const diff = org.y - euler.y; std::abs(diff) > 0.0f) { out_quat = glm::rotate(out_quat, glm::radians(diff), up_v); }
60+
if (auto const diff = org.z - euler.z; std::abs(diff) > 0.0f) { out_quat = glm::rotate(out_quat, glm::radians(diff), front_v); }
6261
return true;
6362
}
6463
return false;
6564
}
6665

67-
bool Inspector::inspect(Transform& out_transform) const {
66+
bool Inspector::inspect(Transform& out_transform, Bool& out_unified_scaling) const {
6867
auto ret = Modified{};
6968
if (ImGui::CollapsingHeader("Transform", ImGuiTreeNodeFlags_DefaultOpen)) {
7069
auto vec3 = out_transform.position();
7170
if (ret(inspect("Position", vec3))) { out_transform.set_position(vec3); }
7271
auto quat = out_transform.orientation();
7372
if (ret(inspect("Orientation", quat))) { out_transform.set_orientation(quat); }
7473
vec3 = out_transform.scale();
75-
if (ret(inspect("Scale", vec3))) { out_transform.set_scale(vec3); }
74+
if (out_unified_scaling) {
75+
if (ret(ImGui::DragFloat("Scale", &vec3.x, 0.1f))) { out_transform.set_scale({vec3.x, vec3.x, vec3.x}); }
76+
} else {
77+
if (ret(inspect("Scale", vec3, 0.1f))) { out_transform.set_scale(vec3); }
78+
}
79+
ImGui::SameLine();
80+
ImGui::Checkbox("Unified", &out_unified_scaling.value);
7681
}
7782
return ret.value;
7883
}
@@ -107,11 +112,11 @@ bool SceneInspector::inspect(Id<Material> material_id) const {
107112
return false;
108113
}
109114

110-
bool SceneInspector::inspect(Id<Node> node_id) const {
115+
bool SceneInspector::inspect(Id<Node> node_id, Bool& out_unified_scaling) const {
111116
auto ret = Modified{};
112117
auto* node = m_scene.find(node_id);
113118
if (!node) { return false; }
114-
ret(inspect(node->transform));
119+
ret(inspect(node->transform, out_unified_scaling));
115120
if (auto const* mesh_id = node->find<Id<Mesh>>()) { ret(inspect(*mesh_id)); }
116121
return ret.value;
117122
}

lib/engine/src/engine.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ struct RenderWindow {
158158
renderer(gfx, this->window, gui.get(), Renderer::CreateInfo{command_buffers_v, msaa}), gui(std::move(gui)) {}
159159
};
160160

161-
bool load_gltf(Scene& out_scene, char const* path, std::atomic<LoadStatus>* out_status) {
161+
bool load_gltf(Scene& out_scene, char const* path, AtomicLoadStatus* out_status) {
162162
auto const provider = FileDataProvider::mount_parent_dir(path);
163163
auto json = dj::Json::from_file(path);
164164
return out_scene.load_gltf(json, provider, out_status);
@@ -182,7 +182,7 @@ bool busy(std::future<T> const& future) {
182182
struct LoadRequest {
183183
std::string path{};
184184
std::future<Scene> future{};
185-
std::atomic<LoadStatus> status{};
185+
AtomicLoadStatus status{};
186186
float start_time{};
187187
};
188188
} // namespace
@@ -204,6 +204,7 @@ struct Engine::Impl {
204204
Impl(UniqueWin window, std::uint8_t msaa, bool validation)
205205
: window(std::move(window), std::make_unique<DearImGui>(), msaa, validation), renderer(this->window.gfx), scene(this->window.gfx), msaa(msaa) {
206206
s_instance = this;
207+
load.request.status.reset();
207208
}
208209

209210
~Impl() {
@@ -279,7 +280,7 @@ bool Engine::load_async(std::string gltf_json_path, UniqueTask<void()> on_loaded
279280
// populate load request
280281
m_impl->load.callback = std::move(on_loaded);
281282
m_impl->load.request.path = std::move(gltf_json_path);
282-
m_impl->load.request.status.store(LoadStatus::eStartingThread);
283+
m_impl->load.request.status.reset();
283284
m_impl->load.request.start_time = time::since_start();
284285
auto func = [path = m_impl->load.request.path, gfx = m_impl->window.gfx, status = &m_impl->load.request.status] {
285286
auto scene = Scene{gfx};
@@ -294,7 +295,8 @@ bool Engine::load_async(std::string gltf_json_path, UniqueTask<void()> on_loaded
294295

295296
LoadStatus Engine::load_status() const {
296297
auto lock = std::scoped_lock{m_impl->mutex};
297-
return m_impl->load.request.status.load();
298+
auto const& status = m_impl->load.request.status;
299+
return {.stage = status.stage.load(), .total = status.total, .done = status.done};
298300
}
299301

300302
Scene& Engine::scene() const { return m_impl->scene; }
@@ -311,7 +313,7 @@ void Engine::update_load_request() {
311313
// transfer scene (under mutex lock)
312314
m_impl->scene = m_impl->load.request.future.get();
313315
// reset load status
314-
m_impl->load.request.status.store(LoadStatus::eNone);
316+
m_impl->load.request.status.reset();
315317
// move out the path
316318
auto path = std::move(m_impl->load.request.path);
317319
// move out the callback

lib/scene/include/facade/scene/load_status.hpp

Lines changed: 16 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,44 +3,29 @@
33
#include <string_view>
44

55
namespace facade {
6-
enum class LoadStatus : std::uint8_t {
6+
enum class LoadStage : std::uint8_t {
77
eNone,
8-
eStartingThread,
9-
eParsingBuffers,
10-
eParsingBufferViews,
11-
eParsingAccessors,
12-
eParsingCameras,
13-
eParsingSamplers,
8+
eParsingJson,
149
eLoadingImages,
15-
eParsingTextures,
16-
eParsingMeshes,
17-
eParsingMaterials,
18-
eBuildingGeometry,
19-
eBuildingNodes,
10+
eUploadingTextures,
11+
eUploadingMeshes,
2012
eBuildingScenes,
21-
eUploadingResources,
2213
eCOUNT_,
2314
};
2415

25-
constexpr auto load_status_str = EnumArray<LoadStatus, std::string_view>{
26-
"None",
27-
"Starting Thread",
28-
"Parsing Buffers",
29-
"Parsing BufferViews",
30-
"Parsing Accessors",
31-
"Parsing Cameras",
32-
"Parsing Samplers",
33-
"Loading Images",
34-
"Parsing Textures",
35-
"Parsing Meshes",
36-
"Parsing Materials",
37-
"Building Geometry",
38-
"Building Nodes",
39-
"Building Scenes",
40-
"Uploading Resources",
16+
constexpr auto load_stage_str = EnumArray<LoadStage, std::string_view>{
17+
"None", "Parsing JSON", "Loading Images", "Uploading Textures", "Uploading Meshes", "Building Scenes",
4118
};
19+
static_assert(std::size(load_stage_str.t) == static_cast<std::size_t>(LoadStage::eCOUNT_));
4220

43-
static_assert(std::size(load_status_str.t) == static_cast<std::size_t>(LoadStatus::eCOUNT_));
21+
struct LoadStatus {
22+
LoadStage stage{};
23+
std::size_t total{};
24+
std::size_t done{};
4425

45-
constexpr float load_progress(LoadStatus const stage) { return static_cast<float>(stage) / static_cast<float>(LoadStatus::eCOUNT_); }
26+
constexpr float ratio() const {
27+
if (total == 0) { return 0.0f; }
28+
return static_cast<float>(done) / static_cast<float>(total);
29+
}
30+
};
4631
} // namespace facade

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,18 @@ class Json;
2424
}
2525

2626
namespace facade {
27+
struct AtomicLoadStatus {
28+
std::atomic<LoadStage> stage{};
29+
std::atomic<std::size_t> total{};
30+
std::atomic<std::size_t> done{};
31+
32+
void reset() {
33+
stage = LoadStage::eNone;
34+
total = {};
35+
done = {};
36+
}
37+
};
38+
2739
struct Mesh {
2840
struct Primitive {
2941
Id<StaticMesh> static_mesh{};
@@ -51,7 +63,7 @@ class Scene {
5163

5264
explicit Scene(Gfx const& gfx);
5365

54-
bool load_gltf(dj::Json const& root, DataProvider const& provider, std::atomic<LoadStatus>* out_status = {}) noexcept(false);
66+
bool load_gltf(dj::Json const& root, DataProvider const& provider, AtomicLoadStatus* out_status = {}) noexcept(false);
5567

5668
Id<Camera> add(Camera camera);
5769
Id<Sampler> add(Sampler sampler);

0 commit comments

Comments
 (0)