MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
GeometryPrimitives.hpp
Go to the documentation of this file.
1#pragma once
2
5
7
8namespace MayaFlux::Kinesis {
9
10/**
11 * @brief Generate vertices along a circular path
12 * @param center Circle center in 3D space
13 * @param radius Circle radius
14 * @param segments Number of subdivisions (must be >= 3)
15 * @param normal Circle plane normal (default: XY plane, Z-up)
16 * @return Vertices generated by angle θ ∈ [0, 2π)
17 *
18 * Generates N+1 vertices where last vertex equals first (closed curve).
19 * For LINE_STRIP topology. For POINT_LIST, use N vertices.
20 */
21MAYAFLUX_API std::vector<glm::vec3> generate_circle(
22 const glm::vec3& center,
23 float radius,
24 size_t segments,
25 const glm::vec3& normal = glm::vec3(0, 0, 1));
26
27/**
28 * @brief Generate vertices along an elliptical path
29 * @param center Ellipse center
30 * @param semi_major Semi-major axis length
31 * @param semi_minor Semi-minor axis length
32 * @param segments Number of subdivisions
33 * @param normal Ellipse plane normal
34 * @return Vertices generated by eccentric anomaly
35 */
36MAYAFLUX_API std::vector<glm::vec3> generate_ellipse(
37 const glm::vec3& center,
38 float semi_major,
39 float semi_minor,
40 size_t segments,
41 const glm::vec3& normal = glm::vec3(0, 0, 1));
42
43/**
44 * @brief Generate vertices of an axis-aligned rectangular path
45 * @param center Rectangle centroid
46 * @param width Extent along local X axis
47 * @param height Extent along local Y axis
48 * @param normal Rectangle plane normal
49 * @return 5 vertices (closed rectangular path for LINE_STRIP)
50 */
51MAYAFLUX_API std::vector<glm::vec3> generate_rectangle(
52 const glm::vec3& center,
53 float width,
54 float height,
55 const glm::vec3& normal = glm::vec3(0, 0, 1));
56
57/**
58 * @brief Generate vertices of a regular n-gon
59 * @param center Polygon centroid
60 * @param radius Circumradius (center to vertex distance)
61 * @param sides Number of sides (must be >= 3)
62 * @param normal Polygon plane normal
63 * @param phase_offset Angular offset in radians (default: 0)
64 * @return N+1 vertices (closed path)
65 *
66 * Vertices positioned at angles: θ_k = (2πk/N) + phase_offset
67 */
68MAYAFLUX_API std::vector<glm::vec3> generate_regular_polygon(
69 const glm::vec3& center,
70 float radius,
71 size_t sides,
72 const glm::vec3& normal = glm::vec3(0, 0, 1),
73 float phase_offset = 0.0F);
74
75/**
76 * @brief Apply rigid transformation to vertex set
77 * @param vertices Vertices to transform (modified in-place)
78 * @param transform Affine transformation matrix (4x4)
79 */
80MAYAFLUX_API void apply_transform(
81 std::vector<glm::vec3>& vertices,
82 const glm::mat4& transform);
83
84/**
85 * @brief Apply rotation to vertex set around arbitrary axis
86 * @param vertices Vertices to transform (modified in-place)
87 * @param axis Rotation axis (will be normalized)
88 * @param angle Rotation angle in radians (right-hand rule)
89 * @param origin Rotation pivot (default: coordinate origin)
90 */
91MAYAFLUX_API void apply_rotation(
92 std::vector<glm::vec3>& vertices,
93 const glm::vec3& axis,
94 float angle,
95 const glm::vec3& origin = glm::vec3(0));
96
97/**
98 * @brief Apply translation to vertex set
99 * @param vertices Vertices to transform (modified in-place)
100 * @param displacement Translation vector
101 */
102MAYAFLUX_API void apply_translation(
103 std::vector<glm::vec3>& vertices,
104 const glm::vec3& displacement);
105
106/**
107 * @brief Apply uniform scaling to vertex set
108 * @param vertices Vertices to transform (modified in-place)
109 * @param scale Scale factor (must be > 0)
110 * @param origin Scaling pivot (default: coordinate origin)
111 */
112MAYAFLUX_API void apply_uniform_scale(
113 std::vector<glm::vec3>& vertices,
114 float scale,
115 const glm::vec3& origin = glm::vec3(0));
116
117/**
118 * @brief Apply non-uniform scaling to vertex set
119 * @param vertices Vertices to transform (modified in-place)
120 * @param scale Per-axis scale factors
121 * @param origin Scaling center
122 */
123MAYAFLUX_API void apply_scale(
124 std::vector<glm::vec3>& vertices,
125 const glm::vec3& scale,
126 const glm::vec3& origin = glm::vec3(0));
127
128/**
129 * @brief Compute normal vectors along a piecewise-linear path
130 * @param path_vertices Sequential vertices defining curve
131 * @param normal_length Magnitude of normal vectors
132 * @param stride Sample every stride-th vertex (default: 1)
133 * @return Line segments (pairs) representing normals (for LINE_LIST topology)
134 *
135 * Normal at vertex i: perpendicular to tangent (v[i+1] - v[i])
136 * Returned as pairs: [midpoint - normal/2, midpoint + normal/2]
137 */
138MAYAFLUX_API std::vector<Kakshya::LineVertex> compute_path_normals(
139 const std::vector<Kakshya::LineVertex>& path_vertices,
140 float normal_length,
141 size_t stride = 1);
142
143/**
144 * @brief Compute tangent vectors along a piecewise-linear path
145 * @param path_vertices Sequential vertices defining curve
146 * @param tangent_length Magnitude of tangent vectors
147 * @param stride Sample every stride-th vertex
148 * @return Line segments (pairs) representing tangents (for LINE_LIST topology)
149 *
150 * Tangent at vertex i: direction (v[i+1] - v[i])
151 * Returned as pairs: [vertex - tangent/2, vertex + tangent/2]
152 */
153MAYAFLUX_API std::vector<Kakshya::LineVertex> compute_path_tangents(
154 const std::vector<Kakshya::LineVertex>& path_vertices,
155 float tangent_length,
156 size_t stride = 1);
157
158/**
159 * @brief Compute curvature vectors along a path (2nd derivative approximation)
160 * @param path_vertices Sequential vertices defining curve
161 * @param curvature_scale Magnitude scaling factor
162 * @param stride Sample every stride-th vertex
163 * @return Line segments representing discrete curvature
164 *
165 * Curvature at i approximated by: (v[i+1] - 2*v[i] + v[i-1])
166 */
167MAYAFLUX_API std::vector<Kakshya::LineVertex> compute_path_curvature(
168 const std::vector<Kakshya::LineVertex>& path_vertices,
169 float curvature_scale,
170 size_t stride = 1);
171
172/**
173 * @brief Sample parametric curve uniformly in parameter space
174 * @param curve Parametric function: [0,1] → ℝ³
175 * @param samples Number of samples
176 * @return Vertices sampled at t_k = k/(N-1) for k ∈ [0, N-1]
177 */
178MAYAFLUX_API std::vector<glm::vec3> sample_parametric_curve(
179 const std::function<glm::vec3(float)>& curve,
180 size_t samples);
181
182/**
183 * @brief Resample path vertices for arc-length parameterization
184 * @param path_vertices Input vertices (arbitrary spacing)
185 * @param num_samples Desired output sample count
186 * @return Vertices uniformly distributed by arc length
187 *
188 * Uses piecewise linear arc length estimation.
189 * Output vertices have constant spacing along curve.
190 */
191MAYAFLUX_API std::vector<Kakshya::LineVertex> reparameterize_by_arc_length(
192 const std::vector<Kakshya::LineVertex>& path_vertices,
193 size_t num_samples);
194
195/**
196 * @brief Project vertices onto plane defined by normal
197 * @param vertices Vertices to project (modified in-place)
198 * @param plane_point Point on projection plane
199 * @param plane_normal Plane normal vector
200 */
201MAYAFLUX_API void project_onto_plane(
202 std::vector<glm::vec3>& vertices,
203 const glm::vec3& plane_point,
204 const glm::vec3& plane_normal);
205
206/**
207 * @brief Compute convex hull of vertex set (2D projection)
208 * @param vertices Input vertex set
209 * @param projection_normal Normal of projection plane (default: Z-axis)
210 * @return Vertices forming convex hull boundary (closed path)
211 *
212 * Uses Graham scan on projected coordinates.
213 */
214MAYAFLUX_API std::vector<glm::vec3> compute_convex_hull_2d(
215 const std::vector<glm::vec3>& vertices,
216 const glm::vec3& projection_normal = glm::vec3(0, 0, 1));
217
218/**
219 * @brief Apply color interpolation to position vertices
220 * @param positions Input position vertices
221 * @param colors Color stops for interpolation
222 * @param color_positions Normalized positions [0,1] for each color stop
223 * @param default_thickness Line thickness for all vertices (default: 1.0)
224 * @return LineVertex array with interpolated colors
225 *
226 * Example:
227 * colors = {red, blue}
228 * color_positions = {0.0, 1.0}
229 * → Linear gradient from red to blue along path
230 *
231 * If color_positions.empty(), distributes colors uniformly.
232 */
233[[nodiscard]] MAYAFLUX_API std::vector<Kakshya::Vertex> apply_color_gradient(
234 const std::vector<glm::vec3>& positions,
235 const std::vector<glm::vec3>& colors,
236 const std::vector<float>& color_positions = {},
237 float scalar = 1.0F);
238
239/**
240 * @brief Apply uniform color to position vertices
241 */
242[[nodiscard]] MAYAFLUX_API std::vector<Kakshya::Vertex> apply_uniform_color(
243 const std::vector<glm::vec3>& positions,
244 const glm::vec3& color,
245 float scalar = 1.0F);
246
247/**
248 * @brief Convert positions to LineVertex with per-vertex colors
249 */
250[[nodiscard]] MAYAFLUX_API std::vector<Kakshya::Vertex> apply_vertex_colors(
251 const std::vector<glm::vec3>& positions,
252 const std::vector<glm::vec3>& colors,
253 float scalar = 1.0F);
254
255/**
256 * @struct QuadGeometry
257 * @brief Textured quad vertex data together with its semantic layout descriptor.
258 *
259 * Returned by generate_quad(). Callers memcpy vertices into their staging
260 * buffer and forward layout to set_vertex_layout().
261 */
263 std::array<Kakshya::TextureQuadVertex, 4> vertices;
265};
266
267/**
268 * @brief Generate a textured quad centred on the origin.
269 * @param position Translation in XY (z remains 0). Default: no translation.
270 * @param scale Extents in XY before rotation. Default: {1,1} → NDC-spanning quad.
271 * @param rotation Rotation angle in radians around Z axis. Default: 0.
272 * @return QuadGeometry ready for TRIANGLE_STRIP draw.
273 *
274 * UV origin is bottom-left (0,1) to match Vulkan image layout.
275 * Base vertices sit at ±scale before rotation and translation are applied.
276 */
277[[nodiscard]] MAYAFLUX_API QuadGeometry generate_quad(
278 glm::vec2 position = glm::vec2(0.0F),
279 glm::vec2 scale = glm::vec2(1.0F),
280 float rotation = 0.0F);
281
282// ------------------------------------------------------------
283// 2D filled / textured quads
284// ------------------------------------------------------------
285
286/**
287 * @brief Generate a filled TRIANGLE_STRIP quad from an AABB2D.
288 * @param region NDC axis-aligned bounds.
289 * @param color Uniform fill color.
290 */
291[[nodiscard]] MAYAFLUX_API std::array<Kakshya::Vertex, 4> filled_rect(
292 Kinesis::AABB2D region,
293 glm::vec3 color = glm::vec3(1.F));
294
295/**
296 * @brief Generate a UV-mapped TRIANGLE_STRIP quad from an AABB2D.
297 *
298 * UV origin is bottom-left (0,1) matching Vulkan image layout.
299 * Replaces handwritten textured quad construction in Forma callers.
300 *
301 * @param region NDC axis-aligned bounds.
302 */
303[[nodiscard]] MAYAFLUX_API std::array<Kakshya::TextureQuadVertex, 4> textured_rect(
304 Kinesis::AABB2D region);
305
306// ------------------------------------------------------------
307// 3D wireframe shapes
308// ------------------------------------------------------------
309
310/**
311 * @brief Generate a cuboid wireframe as LINE_LIST pairs.
312 * @param center Centre of the cuboid.
313 * @param half Half-extents along each axis.
314 * @param color Uniform edge color.
315 */
316[[nodiscard]] MAYAFLUX_API std::vector<Kakshya::Vertex> cuboid_wireframe(
317 const glm::vec3& center,
318 const glm::vec3& half,
319 const glm::vec3& color = glm::vec3(1.F));
320
321/**
322 * @brief Generate a solid box as an indexed TRIANGLE_LIST mesh.
323 *
324 * Six faces, four vertices each, two triangles per face. Per-face normals point
325 * outward along the face axis. UV origin is bottom-left matching Vulkan image
326 * layout and the generate_quad convention.
327 *
328 * @param center Centre of the box in world space.
329 * @param half_extents Half-size along each axis. Non-uniform values yield a cuboid.
330 * @param subdivisions Reserved for future per-face tessellation. Currently ignored.
331 * @return MeshData ready for MeshBuffer::set_mesh_data() or MeshWriterNode::set_mesh().
332 */
333[[nodiscard]] MAYAFLUX_API Kakshya::MeshData generate_box(
334 const glm::vec3& center,
335 const glm::vec3& half_extents,
336 uint32_t subdivisions = 1);
337
338/**
339 * @brief Generate a subdivided flat grid in the XZ plane.
340 *
341 * Vertices lie at Y = 0. U maps to X, V maps to Z. UV covers [0,1] across
342 * the full extent. Normals point along +Y throughout.
343 *
344 * @param center World-space centre of the grid.
345 * @param extent_x Total width along X.
346 * @param extent_z Total depth along Z.
347 * @param cols Number of columns (cells along X). Clamped to minimum 1.
348 * @param rows Number of rows (cells along Z). Clamped to minimum 1.
349 * @return MeshData ready for TRIANGLE_LIST draw.
350 */
351[[nodiscard]] MAYAFLUX_API Kakshya::MeshData generate_grid(
352 const glm::vec3& center,
353 float extent_x,
354 float extent_z,
355 uint32_t cols,
356 uint32_t rows,
357 const glm::vec3& normal = glm::vec3(0.0F, 1.0F, 0.0F));
358
359/**
360 * @brief Generate a mesh from an arbitrary parametric surface function.
361 *
362 * @p fn maps (u, v) in [0,1]^2 to a world-space position. Normals are
363 * computed via finite differences on @p fn so they follow the surface
364 * exactly regardless of shape. UV is mapped directly from (u, v).
365 *
366 * Any surface expressible as a function of two parameters is valid:
367 * torus, Möbius band, Klein bottle approximation, spherical harmonic
368 * deformation, audio-driven terrain, or any procedural form.
369 *
370 * @param fn Surface function: (u, v) -> glm::vec3.
371 * @param u_segs Subdivisions along U. Clamped to minimum 1.
372 * @param v_segs Subdivisions along V. Clamped to minimum 1.
373 * @return MeshData ready for TRIANGLE_LIST draw.
374 */
376 const std::function<glm::vec3(float u, float v)>& fn,
377 uint32_t u_segs,
378 uint32_t v_segs);
379
380/**
381 * @brief Extrude a circle along an arbitrary 3D path.
382 *
383 * Each path point becomes a ring of @p radial_segments vertices. The ring
384 * frame is propagated along the path using parallel transport, which
385 * eliminates the twisting that naive normal-aligned cross-sections produce.
386 *
387 * @p radius_fn maps the normalised path parameter t in [0,1] to a radius.
388 * A constant lambda gives a uniform tube. Any callable works: audio node
389 * output, envelope, position-dependent modulation.
390 *
391 * Caps are flat and optional. An open tube (no caps) is suitable for chains
392 * and paths; a capped tube is suitable for solid cylindrical forms.
393 *
394 * @param path Ordered world-space positions defining the spine.
395 * Minimum 2 points. Clamped to minimum 2.
396 * @param radius_fn Callable: float(float t) returning radius at t.
397 * @param radial_segments Number of vertices per ring. Clamped to minimum 3.
398 * @param capped If true, flat polygon caps are added at both ends.
399 * @return MeshData ready for TRIANGLE_LIST draw.
400 */
401[[nodiscard]] MAYAFLUX_API Kakshya::MeshData generate_tube(
402 std::span<const glm::vec3> path,
403 const std::function<float(float t)>& radius_fn,
404 uint32_t radial_segments = 8,
405 bool capped = false);
406
407/**
408 * @brief Revolve a 2D profile curve around the Y axis.
409 *
410 * @p profile_fn maps t in [0,1] to a point in the XY plane. X is the radial
411 * distance from the Y axis; Y is the height. Negative X values are valid and
412 * produce interior geometry. The profile is revolved through @p sweep_radians,
413 * defaulting to a full revolution.
414 *
415 * UV: u maps to the revolution angle in [0,1]; v maps to the profile
416 * parameter t.
417 *
418 * @param profile_fn Callable: glm::vec2(float t) in the XY plane.
419 * @param profile_segs Samples along the profile. Clamped to minimum 2.
420 * @param radial_segs Subdivisions around the axis. Clamped to minimum 3.
421 * @param sweep_radians Arc of revolution. Default: full circle.
422 * @return MeshData ready for TRIANGLE_LIST draw.
423 */
424[[nodiscard]] MAYAFLUX_API Kakshya::MeshData generate_revolution(
425 const std::function<glm::vec2(float t)>& profile_fn,
426 uint32_t profile_segs,
427 uint32_t radial_segs,
428 float sweep_radians = glm::two_pi<float>());
429
430/**
431 * @brief Extract an isosurface from a scalar field using marching cubes.
432 *
433 * Evaluates @p field at every corner of a regular grid spanning
434 * [@p bounds_min, @p bounds_max] with @p res_x * @p res_y * @p res_z cells.
435 * Triangles are generated wherever the field crosses @p iso_level.
436 * Vertex normals are estimated via central finite differences on the field.
437 *
438 * Any Kinesis::SpatialField is valid: distance(), combine(), chain(),
439 * or any user-supplied glm::vec3 -> float lambda wrapped in a SpatialField.
440 *
441 * @param field SpatialField: glm::vec3 -> float.
442 * @param bounds_min World-space minimum corner of the evaluation volume.
443 * @param bounds_max World-space maximum corner of the evaluation volume.
444 * @param res_x Cell count along X. Clamped to minimum 1.
445 * @param res_y Cell count along Y. Clamped to minimum 1.
446 * @param res_z Cell count along Z. Clamped to minimum 1.
447 * @param iso_level Isosurface threshold value. Default 0.0.
448 * @return MeshData ready for TRIANGLE_LIST draw, or empty MeshData if the
449 * field produces no crossings at iso_level.
450 */
451[[nodiscard]] MAYAFLUX_API Kakshya::MeshData generate_sdf_mesh(
452 const Kinesis::SpatialField& field,
453 const glm::vec3& bounds_min,
454 const glm::vec3& bounds_max,
455 uint32_t res_x,
456 uint32_t res_y,
457 uint32_t res_z,
458 float iso_level = 0.0F);
459
460} // namespace MayaFlux::Kinesis
uint32_t width
Definition Decoder.cpp:59
std::vector< glm::vec3 > generate_rectangle(const glm::vec3 &center, float width, float height, const glm::vec3 &normal)
Generate vertices of an axis-aligned rectangular path.
Kakshya::MeshData generate_revolution(const std::function< glm::vec2(float)> &profile_fn, uint32_t profile_segs, uint32_t radial_segs, float sweep_radians)
void apply_rotation(std::vector< glm::vec3 > &vertices, const glm::vec3 &axis, float angle, const glm::vec3 &origin)
Apply rotation to vertex set around arbitrary axis.
std::vector< Kakshya::Vertex > apply_vertex_colors(const std::vector< glm::vec3 > &positions, const std::vector< glm::vec3 > &colors, float scalar)
Convert positions to LineVertex with per-vertex colors.
void apply_scale(std::vector< glm::vec3 > &vertices, const glm::vec3 &scale, const glm::vec3 &origin)
Apply non-uniform scaling to vertex set.
Kakshya::MeshData generate_parametric_surface(const std::function< glm::vec3(float, float)> &fn, uint32_t u_segs, uint32_t v_segs)
void apply_uniform_scale(std::vector< glm::vec3 > &vertices, float scale, const glm::vec3 &origin)
Apply uniform scaling to vertex set.
Kakshya::MeshData generate_box(const glm::vec3 &center, const glm::vec3 &half_extents, uint32_t subdivisions)
Generate a solid box as an indexed TRIANGLE_LIST mesh.
std::vector< glm::vec3 > generate_regular_polygon(const glm::vec3 &center, float radius, size_t sides, const glm::vec3 &normal, float phase_offset)
Generate vertices of a regular n-gon.
std::vector< Kakshya::Vertex > apply_color_gradient(const std::vector< glm::vec3 > &positions, const std::vector< glm::vec3 > &colors, const std::vector< float > &color_positions, float scalar)
Apply color interpolation to position vertices.
void apply_transform(std::vector< glm::vec3 > &vertices, const glm::mat4 &transform)
Apply rigid transformation to vertex set.
QuadGeometry generate_quad(glm::vec2 position, glm::vec2 scale, float rotation)
Generate a textured quad centred on the origin.
std::vector< Kakshya::LineVertex > compute_path_tangents(const std::vector< Kakshya::LineVertex > &path_vertices, float tangent_length, size_t stride)
Compute tangent vectors along a piecewise-linear path.
std::vector< glm::vec3 > generate_ellipse(const glm::vec3 &center, float semi_major, float semi_minor, size_t segments, const glm::vec3 &normal)
Generate vertices along an elliptical path.
void apply_translation(std::vector< glm::vec3 > &vertices, const glm::vec3 &displacement)
Apply translation to vertex set.
void project_onto_plane(std::vector< glm::vec3 > &vertices, const glm::vec3 &plane_point, const glm::vec3 &plane_normal)
Project vertices onto plane defined by normal.
std::vector< Kakshya::LineVertex > compute_path_curvature(const std::vector< Kakshya::LineVertex > &path_vertices, float curvature_scale, size_t stride)
Compute curvature vectors along a path (2nd derivative approximation)
std::vector< glm::vec3 > compute_convex_hull_2d(const std::vector< glm::vec3 > &vertices, const glm::vec3 &projection_normal)
Compute convex hull of vertex set (2D projection)
MAYAFLUX_API Kakshya::MeshData generate_sdf_mesh(const Kinesis::SpatialField &field, const glm::vec3 &bounds_min, const glm::vec3 &bounds_max, uint32_t res_x, uint32_t res_y, uint32_t res_z, float iso_level=0.0F)
Extract an isosurface from a scalar field using marching cubes.
Kakshya::MeshData generate_grid(const glm::vec3 &center, float extent_x, float extent_z, uint32_t cols, uint32_t rows, const glm::vec3 &normal)
Generate a subdivided flat grid in the XZ plane.
std::vector< Kakshya::Vertex > cuboid_wireframe(const glm::vec3 &center, const glm::vec3 &half, const glm::vec3 &color)
Generate a cuboid wireframe as LINE_LIST pairs.
std::array< Kakshya::TextureQuadVertex, 4 > textured_rect(Kinesis::AABB2D region)
Generate a UV-mapped TRIANGLE_STRIP quad from an AABB2D.
std::vector< glm::vec3 > generate_circle(const glm::vec3 &center, float radius, size_t segments, const glm::vec3 &normal)
Generate vertices along a circular path.
std::vector< Kakshya::LineVertex > compute_path_normals(const std::vector< Kakshya::LineVertex > &path_vertices, float normal_length, size_t stride)
Compute normal vectors along a piecewise-linear path.
Tendency< D, float > scale(const Tendency< D, float > &t, float factor)
Uniform scaling of a scalar-output tendency.
Definition Tendency.hpp:97
std::vector< Kakshya::LineVertex > reparameterize_by_arc_length(const std::vector< Kakshya::LineVertex > &path_vertices, size_t num_samples)
Resample path vertices for arc-length parameterization.
std::array< Kakshya::Vertex, 4 > filled_rect(Kinesis::AABB2D region, glm::vec3 color)
Generate a filled TRIANGLE_STRIP quad from an AABB2D.
std::vector< glm::vec3 > sample_parametric_curve(const std::function< glm::vec3(float)> &curve, size_t samples)
Sample parametric curve uniformly in parameter space.
std::vector< Kakshya::Vertex > apply_uniform_color(const std::vector< glm::vec3 > &positions, const glm::vec3 &color, float scalar)
Apply uniform color to position vertices.
Kakshya::MeshData generate_tube(std::span< const glm::vec3 > path, const std::function< float(float)> &radius_fn, uint32_t radial_segments, bool capped)
Owning CPU-side representation of a loaded or generated mesh.
Definition MeshData.hpp:33
Complete description of vertex data layout in a buffer.
Axis-aligned bounding rectangle in a 2D coordinate space.
Definition Bounds.hpp:21
std::array< Kakshya::TextureQuadVertex, 4 > vertices
Textured quad vertex data together with its semantic layout descriptor.
Typed, composable, stateless callable from domain D to range R.
Definition Tendency.hpp:22