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