diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2023-02-24 13:16:40 +0100 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2023-02-24 13:16:40 +0100 |
commit | d2eae22f0661703507dcbb1407788743827a2862 (patch) | |
tree | f972e46abc016eb7705f517d7560264ecc26cbc4 | |
parent | f5d7c6b5e21eed60c3787546de7d41c7440735db (diff) |
editor/inspect: mark scenery modified on write
-rw-r--r-- | editor/imgui.cpp | 3 | ||||
-rw-r--r-- | editor/inspect-types.cpp | 10 | ||||
-rw-r--r-- | editor/inspect.cpp | 16 | ||||
-rw-r--r-- | editor/inspect.hpp | 8 | ||||
-rw-r--r-- | src/chunk-render.cpp | 3 |
5 files changed, 24 insertions, 16 deletions
diff --git a/editor/imgui.cpp b/editor/imgui.cpp index bb96d78f..38bae066 100644 --- a/editor/imgui.cpp +++ b/editor/imgui.cpp @@ -167,7 +167,8 @@ void app::draw_inspector() auto dpi = M->dpi_scale(); ImGui::SetNextWindowSize({300*dpi[0], 0}); auto b2 = begin_window("inspector"_s); - entities::inspect_type(s); + if (entities::inspect_type(s)) + c.mark_scenery_modified(); } } } diff --git a/editor/inspect-types.cpp b/editor/inspect-types.cpp index 4a3aa391..d04c7913 100644 --- a/editor/inspect-types.cpp +++ b/editor/inspect-types.cpp @@ -66,7 +66,8 @@ using enum_pair = std::pair<StringView, std::size_t>; template<typename T> constexpr auto enum_values(); template<typename T> requires (!std::is_enum_v<T>) constexpr std::array<enum_pair, 0> enum_values(){ return {}; } -template<> constexpr auto enum_values<pass_mode>() +template<> +constexpr auto enum_values<pass_mode>() { return std::to_array<enum_pair>({ { "blocked"_s, (std::size_t)pass_mode::blocked, }, @@ -77,14 +78,15 @@ template<> constexpr auto enum_values<pass_mode>() } template<> -void inspect_type<scenery_ref>(scenery_ref& x) +bool inspect_type<scenery_ref>(scenery_ref& x) { + bool ret = false; visit_tuple([&](const auto& field) { using type = typename std::decay_t<decltype(field)>::FieldType; constexpr auto list = enum_values<type>(); - auto view = ArrayView<const enum_pair>{list.data(), list.size()}; - inspect_field<type>(&x, field.erased(), view); + ret |= inspect_field<type>(&x, field.erased(), list); }, entity_metadata<scenery_ref>::accessors); + return ret; } } // namespace floormat::entities diff --git a/editor/inspect.cpp b/editor/inspect.cpp index 79aaaa03..82514cc9 100644 --- a/editor/inspect.cpp +++ b/editor/inspect.cpp @@ -60,7 +60,7 @@ int corrade_string_resize_callback(ImGuiInputTextCallbackData* data) } template<typename T> -void do_inspect_field(void* datum, const erased_accessor& accessor, field_repr repr, +bool do_inspect_field(void* datum, const erased_accessor& accessor, field_repr repr, const ArrayView<const std::pair<StringView, std::size_t>>& list) { if (list.isEmpty()) @@ -73,7 +73,7 @@ void do_inspect_field(void* datum, const erased_accessor& accessor, field_repr r switch (accessor.is_enabled(datum)) { using enum field_status; - case hidden: return; + case hidden: return false; case readonly: should_disable = true; break; case enabled: should_disable = false; break; } @@ -161,25 +161,29 @@ void do_inspect_field(void* datum, const erased_accessor& accessor, field_repr r if (ret && !should_disable && !eqv(value, orig)) if (accessor.is_enabled(datum) >= field_status::enabled && accessor.can_write()) + { accessor.write_fun(datum, accessor.writer, &value); + return true; + } + return false; } } // namespace #define MAKE_SPEC(type, repr) \ template<> \ - void inspect_field<type>(void* datum, const erased_accessor& accessor, \ + bool inspect_field<type>(void* datum, const erased_accessor& accessor, \ const ArrayView<const std::pair<StringView, std::size_t>>& list) \ { \ - do_inspect_field<type>(datum, accessor, (repr), list); \ + return do_inspect_field<type>(datum, accessor, (repr), list); \ } #define MAKE_SPEC2(type, repr) \ template<> \ - void inspect_field<field_repr_<type, field_repr, repr>>(void* datum, const erased_accessor& accessor, \ + bool inspect_field<field_repr_<type, field_repr, repr>>(void* datum, const erased_accessor& accessor, \ const ArrayView<const std::pair<StringView, std::size_t>>& list) \ { \ - do_inspect_field<type>(datum, accessor, (repr), list); \ + return do_inspect_field<type>(datum, accessor, (repr), list); \ } #define MAKE_SPEC_REPRS(type) \ diff --git a/editor/inspect.hpp b/editor/inspect.hpp index a6da98b7..25ec8ec4 100644 --- a/editor/inspect.hpp +++ b/editor/inspect.hpp @@ -27,14 +27,14 @@ template<typename T> using field_repr_slider = field_repr_<T, field_repr, field_ template<typename T> using field_repr_drag = field_repr_<T, field_repr, field_repr::drag>; template<typename T> using field_repr_cbx = field_repr_<T, field_repr, field_repr::cbx>; -template<typename T> void inspect_field(void* datum, const entities::erased_accessor& accessor, +template<typename T> bool inspect_field(void* datum, const entities::erased_accessor& accessor, const ArrayView<const std::pair<StringView, std::size_t>>& list); -template<typename T> void inspect_type(T& x); +template<typename T> bool inspect_type(T& x); -template<typename T> requires std::is_enum_v<T> void inspect_field(void* datum, const entities::erased_accessor& accessor, +template<typename T> requires std::is_enum_v<T> bool inspect_field(void* datum, const entities::erased_accessor& accessor, const ArrayView<const std::pair<StringView, std::size_t>>& list) { - inspect_field<field_repr_cbx<std::underlying_type_t<T>>>(datum, accessor, list); + return inspect_field<field_repr_cbx<std::underlying_type_t<T>>>(datum, accessor, list); } } // namespace floormat::entities diff --git a/src/chunk-render.cpp b/src/chunk-render.cpp index f7b0678a..d00424df 100644 --- a/src/chunk-render.cpp +++ b/src/chunk-render.cpp @@ -133,7 +133,8 @@ auto chunk::ensure_scenery_mesh() noexcept -> scenery_mesh_tuple const local_coords pos{i}; const auto& atlas = _scenery_atlases[i]; const auto& fr = _scenery_variants[i]; - const auto quad = atlas->frame_quad(Vector3(pos.x, pos.y, 0) * TILE_SIZE, fr.r, fr.frame); + const auto coord = Vector3(pos.x, pos.y, 0) * TILE_SIZE + Vector3(Vector2(fr.offset), 0); + const auto quad = atlas->frame_quad(coord, fr.r, fr.frame); const auto& group = atlas->group(fr.r); const auto texcoords = atlas->texcoords_for_frame(fr.r, fr.frame, !group.mirror_from.isEmpty()); const float depth = tile_shader::depth_value(pos, tile_shader::scenery_depth_offset); |