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