@@ -241,5 +241,57 @@ ZENDEFNODE(PrimFacesAttrToVerts, {
241
241
{" primitive" },
242
242
});
243
243
244
+ struct PrimFacesCenterAsVerts : INode {
245
+ virtual void apply () override {
246
+ auto prim = get_input<PrimitiveObject>(" prim" );
247
+ auto faceType = get_input2<std::string>(" faceType" );
248
+ auto copyFaceAttrs = get_input2<bool >(" copyFaceAttrs" );
249
+
250
+ auto outprim = std::make_shared<PrimitiveObject>();
251
+ std::visit ([&] (auto faceTy) {
252
+
253
+ auto &prim_faces = faceTy.from_prim (prim.get ());
254
+ outprim->verts .resize (prim_faces.size ());
255
+
256
+ for (int i = 0 ; i < prim_faces.size (); i++) {
257
+ meth_average<vec3f> reducer;
258
+ faceTy.foreach_ind (prim.get (), prim_faces[i], [&] (int ind) {
259
+ reducer.add (prim->verts [ind]);
260
+ });
261
+ outprim->verts [i] = reducer.get ();
262
+ }
263
+
264
+ if (copyFaceAttrs) {
265
+ prim_faces.template foreach_attr <AttrAcceptAll>([&] (auto const &key, auto const &facesArr) {
266
+ using T = std::decay_t <decltype (facesArr[0 ])>;
267
+ auto &vertsArr = outprim->verts .add_attr <T>(key);
268
+ vertsArr = facesArr;
269
+ });
270
+ }
271
+
272
+ }, enum_variant<std::variant<
273
+ face_lines, face_tris, face_quads, face_polys
274
+ >>(array_index ({
275
+ " lines" , " tris" , " quads" , " polys"
276
+ }, faceType)));
277
+
278
+ set_output (" prim" , std::move (outprim));
279
+ }
280
+ };
281
+
282
+ ZENDEFNODE (PrimFacesCenterAsVerts, {
283
+ {
284
+ {" PrimitiveObject" , " prim" },
285
+ {" enum lines tris quads polys" , " faceType" , " tris" },
286
+ {" bool" , " copyFaceAttrs" , " 1" },
287
+ },
288
+ {
289
+ {" PrimitiveObject" , " prim" },
290
+ },
291
+ {
292
+ },
293
+ {" primitive" },
294
+ });
295
+
244
296
}
245
297
}
0 commit comments