26 data.vertices.size(),
data.edges.size(),
data.face_sizes.size(),
data.face_vertices.size());
28 mesh->vert_positions_for_write().copy_from(
data.vertices);
32 if (!
data.edges.is_empty()) {
34 for (
const int i :
data.edges.index_range()) {
38 fprintf(stderr,
"Invalid PLY vertex index in edge %i/1: %d\n", i, v1);
42 fprintf(stderr,
"Invalid PLY vertex index in edge %i/2: %d\n", i,
v2);
50 if (!
data.face_sizes.is_empty()) {
56 for (
const int i :
data.face_sizes.index_range()) {
58 face_offsets[i] = offset;
59 for (
int j = 0; j <
size; j++) {
62 fprintf(stderr,
"Invalid PLY vertex index in face %i loop %i: %u\n", i, j,
v);
65 corner_verts[offset + j] =
data.face_vertices[offset + j];
78 for (
const int i :
data.vertex_colors.index_range()) {
83 for (
const int i :
data.vertex_colors.index_range()) {
93 if (!
data.uv_coordinates.is_empty()) {
96 for (
const int i :
data.face_vertices.index_range()) {
97 uv_map.
span[i] =
data.uv_coordinates[
data.face_vertices[i]];
104 bool set_custom_normals_for_verts =
false;
105 if (!
data.vertex_normals.is_empty()) {
106 if (!
data.face_sizes.is_empty()) {
109 set_custom_normals_for_verts =
true;
111 else if (
params.import_attributes) {
125 if (
params.import_attributes && !
data.vertex_custom_attr.is_empty()) {
127 attributes.
add<
float>(attr.
name,
138 bool verbose_validate =
false;
140 verbose_validate =
true;
145 if (set_custom_normals_for_verts) {
147 mesh,
reinterpret_cast<float(*)[3]
>(
data.vertex_normals.data()));
void BKE_id_attributes_default_color_set(struct ID *id, const char *name)
void BKE_id_attributes_active_color_set(struct ID *id, const char *name)
void BKE_id_free(Main *bmain, void *idv)
bool BKE_mesh_validate(Mesh *mesh, bool do_verbose, bool cddata_check_mask)
Mesh * BKE_mesh_new_nomain(int verts_num, int edges_num, int faces_num, int corners_num)
void BKE_mesh_set_custom_normals_from_verts(Mesh *mesh, float(*r_custom_vert_normals)[3])
MINLINE void srgb_to_linearrgb_v4(float linear[4], const float srgb[4])
MINLINE void copy_v4_v4(float r[4], const float a[4])
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert * v
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
static VArray ForSpan(Span< T > values)
GSpanAttributeWriter lookup_or_add_for_write_span(StringRef attribute_id, AttrDomain domain, eCustomDataType data_type, const AttributeInit &initializer=AttributeInitDefaultValue())
bool add(const StringRef attribute_id, const AttrDomain domain, const eCustomDataType data_type, const AttributeInit &initializer)
GSpanAttributeWriter lookup_or_add_for_write_only_span(StringRef attribute_id, AttrDomain domain, eCustomDataType data_type)
void mesh_smooth_set(Mesh &mesh, bool use_smooth, bool keep_sharp_edges=false)
void mesh_calc_edges(Mesh &mesh, bool keep_existing_edges, bool select_new_edges)
std::optional< Mesh * > mesh_merge_by_distance_all(const Mesh &mesh, const IndexMask &selection, float merge_distance)
Mesh * convert_ply_to_mesh(PlyData &data, const PLYImportParams ¶ms)
VecBase< float, 2 > float2
ColorSceneLinear4f< eAlpha::Premultiplied > ColorGeometry4f
VecBase< float, 3 > float3
MutableVArraySpan< T > span