MayaFlux 0.3.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
LayoutTranslator.cpp
Go to the documentation of this file.
2
4
6
8{
9 using namespace Kakshya;
10
11 switch (modality) {
12 case DataModality::VERTEX_POSITIONS_3D:
13 case DataModality::VERTEX_NORMALS_3D:
14 case DataModality::VERTEX_TANGENTS_3D:
15 case DataModality::VERTEX_COLORS_RGB:
16 return vk::Format::eR32G32B32Sfloat;
17
18 case DataModality::TEXTURE_COORDS_2D:
19 return vk::Format::eR32G32Sfloat;
20
21 case DataModality::VERTEX_COLORS_RGBA:
22 return vk::Format::eR32G32B32A32Sfloat;
23
24 case DataModality::AUDIO_1D:
25 case DataModality::AUDIO_MULTICHANNEL:
26 return vk::Format::eR64Sfloat;
27
28 case DataModality::SPECTRAL_2D:
29 return vk::Format::eR32G32Sfloat;
30
31 case DataModality::TRANSFORMATION_MATRIX:
32 return vk::Format::eR32G32B32A32Sfloat;
33
34 case DataModality::SCALAR_F32:
35 return vk::Format::eR32Sfloat;
36
37 default:
39 "Unknown modality for vertex format conversion, defaulting to R32G32B32Sfloat");
40 return vk::Format::eR32G32B32Sfloat;
41 }
42}
43
44std::pair<
45 std::vector<Core::VertexBinding>,
46 std::vector<Core::VertexAttribute>>
48 const Kakshya::VertexLayout& layout,
49 uint32_t binding_index)
50{
51 if (layout.attributes.empty()) {
53 "Cannot translate empty vertex layout");
54 return {};
55 }
56
57 if (layout.vertex_count == 0) {
59 "Vertex layout has zero vertices");
60 }
61
62 if (layout.stride_bytes == 0) {
64 "Vertex layout has zero stride");
65 return {};
66 }
67
68 std::vector<Core::VertexBinding> bindings;
69 bindings.emplace_back(
70 binding_index,
71 layout.stride_bytes,
72 false,
73 vk::VertexInputRate::eVertex);
74
75 std::vector<Core::VertexAttribute> attributes;
76 uint32_t location = 0;
77
78 for (const auto& attr : layout.attributes) {
79 attributes.emplace_back(
80 location,
81 binding_index,
82 modality_to_vk_format(attr.component_modality),
83 attr.offset_in_vertex);
84
86 "Vertex attribute: location={}, format={}, offset={}",
87 location,
88 vk::to_string(attributes.back().format),
89 attr.offset_in_vertex);
90
91 location++;
92 }
93
95 "Translated vertex layout: {} vertices, {} bytes stride, {} attributes",
96 layout.vertex_count, layout.stride_bytes, layout.attributes.size());
97
98 return { bindings, attributes };
99}
100
102{
103 using namespace Kakshya;
104
105 switch (modality) {
106 case DataModality::VERTEX_POSITIONS_3D:
107 case DataModality::VERTEX_NORMALS_3D:
108 case DataModality::VERTEX_TANGENTS_3D:
109 case DataModality::VERTEX_COLORS_RGB:
110 return 12; // 3 * float32
111
112 case DataModality::TEXTURE_COORDS_2D:
113 return 8; // 2 * float32
114
115 case DataModality::VERTEX_COLORS_RGBA:
116 return 16; // 4 * float32
117
118 case DataModality::AUDIO_1D:
119 case DataModality::AUDIO_MULTICHANNEL: // float64
120 case DataModality::SPECTRAL_2D: // 2 * float32
121 return 8;
122
123 case DataModality::TRANSFORMATION_MATRIX:
124 return 64; // 4x4 * float32
125
126 case DataModality::SCALAR_F32:
127 default:
128 return 4;
129 }
130}
131
133{
134 using namespace Kakshya;
135
136 switch (modality) {
137 case DataModality::VERTEX_POSITIONS_3D:
138 return "vec3 (positions)";
139 case DataModality::VERTEX_NORMALS_3D:
140 return "vec3 (normals)";
141 case DataModality::VERTEX_TANGENTS_3D:
142 return "vec3 (tangents)";
143 case DataModality::VERTEX_COLORS_RGB:
144 return "vec3 (color RGB)";
145 case DataModality::VERTEX_COLORS_RGBA:
146 return "vec4 (color RGBA)";
147 case DataModality::TEXTURE_COORDS_2D:
148 return "vec2 (UV)";
149 case DataModality::AUDIO_1D:
150 return "double (audio sample)";
151 case DataModality::AUDIO_MULTICHANNEL:
152 return "double (audio multichannel)";
153 case DataModality::SPECTRAL_2D:
154 return "vec2 (frequency, magnitude)";
155 case DataModality::TRANSFORMATION_MATRIX:
156 return "mat4 (transformation)";
157 default:
158 return "unknown";
159 }
160}
161
162} // namespace MayaFlux::Portal::Graphics
#define MF_INFO(comp, ctx,...)
#define MF_ERROR(comp, ctx,...)
#define MF_TRACE(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
static uint32_t get_modality_size_bytes(Kakshya::DataModality modality)
Get size in bytes for a modality Useful for computing strides, offsets, etc.
static std::pair< std::vector< Core::VertexBinding >, std::vector< Core::VertexAttribute > > translate_layout(const Kakshya::VertexLayout &layout, uint32_t binding_index=0)
Translate a semantic vertex layout to Vulkan binding/attribute descriptions.
static vk::Format modality_to_vk_format(Kakshya::DataModality modality)
Convert semantic modality to Vulkan format.
static std::string_view describe_modality(Kakshya::DataModality modality)
Describe a modality in human-readable form e.g., "vec3" for VERTEX_POSITIONS_3D.
@ Rendering
GPU rendering operations (graphics pipeline, frame rendering)
@ Portal
High-level user-facing API layer.
DataModality
Data modality types for cross-modal analysis.
Definition NDData.hpp:78
uint32_t stride_bytes
Total bytes per vertex (stride in Vulkan terms) e.g., 3 floats (position) + 3 floats (normal) = 24 by...
uint32_t vertex_count
Total number of vertices in this buffer.
std::vector< VertexAttributeLayout > attributes
All attributes that make up one vertex Ordered by shader location (0, 1, 2, ...)
Complete description of vertex data layout in a buffer.