summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2023-02-24 13:16:40 +0100
committerStanislaw Halik <sthalik@misaki.pl>2023-02-24 13:16:40 +0100
commitd2eae22f0661703507dcbb1407788743827a2862 (patch)
treef972e46abc016eb7705f517d7560264ecc26cbc4
parentf5d7c6b5e21eed60c3787546de7d41c7440735db (diff)
editor/inspect: mark scenery modified on write
-rw-r--r--editor/imgui.cpp3
-rw-r--r--editor/inspect-types.cpp10
-rw-r--r--editor/inspect.cpp16
-rw-r--r--editor/inspect.hpp8
-rw-r--r--src/chunk-render.cpp3
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);