15 b.add_input<
decl::Vector>(
"UV").hide_value().supports_field();
20 .description(
"Faces to consider when packing islands");
22 "Space between islands");
24 b.add_output<
decl::Vector>(
"UV").field_source_reference_all();
36 const Span<int> corner_verts = mesh.corner_verts();
40 face_evaluator.
add(selection_field);
62 const int corner = face[
i];
63 const int vert = corner_verts[corner];
65 mp_co[
i] = positions[vert];
66 mp_uv[
i] = uv[corner];
103 selection_field_(selection_field),
120 selection_field_.node().for_each_field_input_recursive(
fn);
121 uv_field_.node().for_each_field_input_recursive(
fn);
126 return AttrDomain::Corner;
134 const bool rotate =
params.extract_input<
bool>(
"Rotate");
135 const float margin =
params.extract_input<
float>(
"Margin");
138 selection_field, uv_field,
rotate, margin)));
146 ntype.
ui_name =
"Pack UV Islands";
148 "Scale islands of a UV map and move them so they fill the UV space as much as possible";
#define NODE_CLASS_CONVERTER
#define GEO_NODE_UV_PACK_ISLANDS
#define NOD_REGISTER_NODE(REGISTER_FUNC)
MutableSpan< T > as_mutable_span()
constexpr int64_t size() const
static VArray ForContainer(ContainerT container)
int add(GField field, GVArray *varray_ptr)
IndexMask get_evaluated_as_mask(int field_index)
int add_with_destination(GField field, GVMutableArray dst)
void foreach_index(Fn &&fn) const
void node_register_type(bNodeType &ntype)
void uv_parametrizer_construct_end(ParamHandle *phandle, bool fill_holes, bool topology_from_uvs, int *r_count_failed=nullptr)
void uv_parametrizer_flush(ParamHandle *handle)
void uv_parametrizer_pack(ParamHandle *handle, float margin, bool do_rotate, bool ignore_pinned)
void uv_parametrizer_face_add(ParamHandle *handle, const ParamKey key, const int nverts, const ParamKey *vkeys, const float **co, float **uv, const float *weight, const bool *pin, const bool *select)
static void node_geo_exec(GeoNodeExecParams params)
static void node_declare(NodeDeclarationBuilder &b)
static void node_register()
static VArray< float3 > construct_uv_gvarray(const Mesh &mesh, const Field< bool > selection_field, const Field< float3 > uv_field, const bool rotate, const float margin, const AttrDomain domain)
VecBase< float, 3 > float3
void geo_node_type_base(blender::bke::bNodeType *ntype, std::string idname, const std::optional< int16_t > legacy_type)
static void rotate(float new_co[3], float a, const float ax[3], const float co[3])
std::string ui_description
NodeGeometryExecFunction geometry_node_execute
const char * enum_name_legacy
NodeDeclareFunction declare