11 [[nodiscard]] GeometryFn<bool> collapsible_header_geom(
16 glm::vec3 color_closed,
20 return [y_top, x_min, x_max, row_h, color_closed, color_open, has_label](
21 bool open, std::vector<uint8_t>& out, Element& el) {
22 const float bot = y_top - row_h;
23 const glm::vec3 col = open ? color_open : color_closed;
26 const size_t vertex_count = has_label ? 12 : 6;
28 out.assign(vertex_count * stride, 0);
30 const glm::vec3 bl { x_min, bot, 0.F };
31 const glm::vec3 br { x_max, bot, 0.F };
32 const glm::vec3 tl { x_min, y_top, 0.F };
33 const glm::vec3 tr { x_max, y_top, 0.F };
34 constexpr glm::vec3 white { 1.F, 1.F, 1.F };
36 auto write = [&](
size_t idx, glm::vec3 pos, glm::vec3 c,
float w, glm::vec2 uv) {
37 auto* v = out.data() + idx * stride;
38 std::memcpy(v, &pos, 12);
39 std::memcpy(v + 12, &c, 12);
40 std::memcpy(v + 24, &w, 4);
41 std::memcpy(v + 28, &uv, 8);
44 write(0, bl, col, 0.F, {});
45 write(1, br, col, 0.F, {});
46 write(2, tl, col, 0.F, {});
47 write(3, br, col, 0.F, {});
48 write(4, tr, col, 0.F, {});
49 write(5, tl, col, 0.F, {});
52 write(6, bl, white, 1.F, { 0.F, 1.F });
53 write(7, br, white, 1.F, { 1.F, 1.F });
54 write(8, tl, white, 1.F, { 0.F, 0.F });
55 write(9, br, white, 1.F, { 1.F, 1.F });
56 write(10, tr, white, 1.F, { 1.F, 0.F });
57 write(11, tl, white, 1.F, { 0.F, 0.F });
60 el.bounds_hint = Kinesis::AABB2D {
61 .min = { x_min, bot },
62 .max = { x_max, y_top },
74 std::shared_ptr<Buffers::FormaBuffer> in_buf,
77 float x_min,
float x_max,
float row_h)
79 buf = std::move(in_buf);
81 const float y_top = cursor.
y();
84 auto open_state = std::make_shared<MappedState<bool>>();
88 mapped.
state = open_state;
93 .
min = { x_min, cursor.
y() },
94 .max = { x_max, y_top },
103 [m = std::move(mapped),
open = open_state, surface, hid](uint32_t, glm::vec2)
mutable {
104 const bool next = !
open->value;
128 std::shared_ptr<Buffers::FormaBuffer> buf,
135 glm::vec3 color_closed,
136 glm::vec3 color_open)
142 .
place(std::move(buf), surface, cursor, x_min, x_max, row_h);
void on_press(uint32_t id, IO::MouseButtons btn, PressFn fn)
Called when a mouse button is pressed over an element.
uint32_t stride_bytes
Total bytes per vertex (stride in Vulkan terms) e.g., 3 floats (position) + 3 floats (normal) = 24 by...
static VertexLayout for_meshes(uint32_t stride=60)
Factory: layout for MeshVertex (position, color, weight, uv, normal, tangent)
Axis-aligned bounding rectangle in a 2D coordinate space.