Loading...
Searching...
No Matches
GeometryInfo.hpp
1#pragma once
2#include <ossia/detail/pod_vector.hpp>
3
4#include <fmt/format.h>
5#include <halp/controls.hpp>
6#include <halp/geometry.hpp>
7#include <halp/meta.hpp>
8
9namespace Threedim
10{
11
13{
14public:
15 halp_meta(name, "Geometry Info")
16 halp_meta(category, "Visuals/3D")
17 halp_meta(c_name, "geometry_info")
18 halp_meta(manual_url, "https://ossia.io/score-docs/processes/geometry-info.html")
19 halp_meta(uuid, "c4deb797-8d5f-4ffb-b25b-b541f5c54099")
20
21 struct
22 {
23 struct
24 {
25 halp_meta(name, "Geometry");
26 halp::dynamic_gpu_geometry mesh;
27 float transform[16]{};
28 bool dirty_mesh = false;
29 bool dirty_transform = false;
30 } geometry;
31 } inputs;
32
33 struct
34 {
35 halp::val_port<"Vertices", int> vertices;
36 halp::val_port<"Indices", int> indices;
37 halp::val_port<"Instances", int> instances;
38
39 // halp::val_port<"Buffers", std::vector<halp::geometry_gpu_buffer>> buffers;
40 halp::val_port<"Attributes", std::vector<halp::geometry_attribute>> attributes;
41 halp::val_port<"Bindings", std::vector<halp::geometry_binding>> bindings;
42 halp::val_port<"Inputs", std::vector<halp::geometry_input>> inputs;
43#if 0
44 halp::val_port<"Readable", std::string> readable;
45#endif
46 } outputs;
47
48 void operator()()
49 {
50 outputs.vertices.value = inputs.geometry.mesh.vertices;
51 outputs.indices.value = inputs.geometry.mesh.indices;
52 outputs.instances.value = inputs.geometry.mesh.instances;
53 // outputs.buffers.value = inputs.geometry.mesh.buffers;
54 outputs.attributes.value = inputs.geometry.mesh.attributes;
55 outputs.bindings.value = inputs.geometry.mesh.bindings;
56 outputs.inputs.value = inputs.geometry.mesh.input;
57
58#if 0
59 {
60 std::string& ret = outputs.readable;
61 ret.clear();
62 fmt::format_to(
63 std::back_inserter(ret), "vertices: {}, indices: {}, instances: {}\n",
64 inputs.geometry.mesh.vertices, inputs.geometry.mesh.indices,
65 inputs.geometry.mesh.instances);
66 // Helper for enum stringification
67 auto to_string = []<typename T>(T v) -> std::string_view {
68 if constexpr(std::is_same_v<T, halp::attribute_location>)
69 {
70 switch(v)
71 {
72 case halp::attribute_location::position:
73 return "position";
74 case halp::attribute_location::tex_coord:
75 return "tex_coord";
76 case halp::attribute_location::color:
77 return "color";
78 case halp::attribute_location::normal:
79 return "normal";
80 case halp::attribute_location::tangent:
81 return "tangent";
82 default:
83 return "unknown";
84 }
85 }
86 else if constexpr(std::is_same_v<T, halp::binding_classification>)
87 {
88 switch(v)
89 {
90 case halp::binding_classification::per_vertex:
91 return "per_vertex";
92 case halp::binding_classification::per_instance:
93 return "per_instance";
94 default:
95 return "unknown";
96 }
97 }
98 else if constexpr(std::is_same_v<T, halp::attribute_format>)
99 {
100 switch(v)
101 {
102 case halp::attribute_format::float4:
103 return "float4";
104 case halp::attribute_format::float3:
105 return "float3";
106 case halp::attribute_format::float2:
107 return "float2";
108 case halp::attribute_format::float1:
109 return "float1";
110 case halp::attribute_format::unormbyte4:
111 return "unormbyte4";
112 case halp::attribute_format::unormbyte2:
113 return "unormbyte2";
114 case halp::attribute_format::unormbyte1:
115 return "unormbyte1";
116 case halp::attribute_format::uint4:
117 return "uint4";
118 case halp::attribute_format::uint3:
119 return "uint3";
120 case halp::attribute_format::uint2:
121 return "uint2";
122 case halp::attribute_format::uint1:
123 return "uint1";
124 case halp::attribute_format::sint4:
125 return "sint4";
126 case halp::attribute_format::sint3:
127 return "sint3";
128 case halp::attribute_format::sint2:
129 return "sint2";
130 case halp::attribute_format::sint1:
131 return "sint1";
132 case halp::attribute_format::half4:
133 return "half4";
134 case halp::attribute_format::half3:
135 return "half3";
136 case halp::attribute_format::half2:
137 return "half2";
138 case halp::attribute_format::half1:
139 return "half1";
140 case halp::attribute_format::ushort4:
141 return "ushort4";
142 case halp::attribute_format::ushort3:
143 return "ushort3";
144 case halp::attribute_format::ushort2:
145 return "ushort2";
146 case halp::attribute_format::ushort1:
147 return "ushort1";
148 case halp::attribute_format::sshort4:
149 return "sshort4";
150 case halp::attribute_format::sshort3:
151 return "sshort3";
152 case halp::attribute_format::sshort2:
153 return "sshort2";
154 case halp::attribute_format::sshort1:
155 return "sshort1";
156 default:
157 return "unknown";
158 }
159 }
160 return "unknown";
161 };
162
163 int i = 0;
164 for(auto& v : inputs.geometry.mesh.attributes)
165 {
166 fmt::format_to(
167 std::back_inserter(ret),
168 "Attribute {}: binding={}, loc={}, fmt={}, offset={}\n", i++, v.binding,
169 to_string(v.location), to_string(v.format), v.byte_offset);
170 }
171
172 i = 0;
173 for(auto& v : inputs.geometry.mesh.bindings)
174 {
175 fmt::format_to(
176 std::back_inserter(ret), "Binding {}: stride={}, step={}, class={}\n", i++,
177 v.stride, v.step_rate, to_string(v.classification));
178 }
179
180 i = 0;
181 for(auto& v : inputs.geometry.mesh.input)
182 {
183 fmt::format_to(
184 std::back_inserter(ret), "Input {}: buffer_idx={}, offset={}\n", i++,
185 v.buffer, v.byte_offset);
186 }
187 qDebug() << ret;
188 }
189#endif
190 }
191};
192
193}
Definition GeometryInfo.hpp:13
Definition TinyObj.hpp:19