diff options
Diffstat (limited to 'source/blender/io/alembic/exporter/abc_writer_mesh.cc')
-rw-r--r-- | source/blender/io/alembic/exporter/abc_writer_mesh.cc | 62 |
1 files changed, 47 insertions, 15 deletions
diff --git a/source/blender/io/alembic/exporter/abc_writer_mesh.cc b/source/blender/io/alembic/exporter/abc_writer_mesh.cc index 7275d0addf0..6ab4b06fba6 100644 --- a/source/blender/io/alembic/exporter/abc_writer_mesh.cc +++ b/source/blender/io/alembic/exporter/abc_writer_mesh.cc @@ -76,10 +76,13 @@ static void get_topology(struct Mesh *mesh, std::vector<int32_t> &poly_verts, std::vector<int32_t> &loop_counts, bool &r_has_flat_shaded_poly); -static void get_creases(struct Mesh *mesh, - std::vector<int32_t> &indices, - std::vector<int32_t> &lengths, - std::vector<float> &sharpnesses); +static void get_edge_creases(struct Mesh *mesh, + std::vector<int32_t> &indices, + std::vector<int32_t> &lengths, + std::vector<float> &sharpnesses); +static void get_vert_creases(struct Mesh *mesh, + std::vector<int32_t> &indices, + std::vector<float> &sharpnesses); static void get_loop_normals(struct Mesh *mesh, std::vector<Imath::V3f> &normals, bool has_flat_shaded_poly); @@ -283,15 +286,16 @@ void ABCGenericMeshWriter::write_mesh(HierarchyContext &context, Mesh *mesh) void ABCGenericMeshWriter::write_subd(HierarchyContext &context, struct Mesh *mesh) { - std::vector<float> crease_sharpness; + std::vector<float> edge_crease_sharpness, vert_crease_sharpness; std::vector<Imath::V3f> points; std::vector<int32_t> poly_verts, loop_counts; - std::vector<int32_t> crease_indices, crease_lengths; + std::vector<int32_t> edge_crease_indices, edge_crease_lengths, vert_crease_indices; bool has_flat_poly = false; get_vertices(mesh, points); get_topology(mesh, poly_verts, loop_counts, has_flat_poly); - get_creases(mesh, crease_indices, crease_lengths, crease_sharpness); + get_edge_creases(mesh, edge_crease_indices, edge_crease_lengths, edge_crease_sharpness); + get_vert_creases(mesh, vert_crease_indices, vert_crease_sharpness); if (!frame_has_been_written_ && args_.export_params->face_sets) { write_face_sets(context.object, mesh, abc_subdiv_schema_); @@ -322,10 +326,15 @@ void ABCGenericMeshWriter::write_subd(HierarchyContext &context, struct Mesh *me write_generated_coordinates(abc_poly_mesh_schema_.getArbGeomParams(), m_custom_data_config); } - if (!crease_indices.empty()) { - subdiv_sample.setCreaseIndices(Int32ArraySample(crease_indices)); - subdiv_sample.setCreaseLengths(Int32ArraySample(crease_lengths)); - subdiv_sample.setCreaseSharpnesses(FloatArraySample(crease_sharpness)); + if (!edge_crease_indices.empty()) { + subdiv_sample.setCreaseIndices(Int32ArraySample(edge_crease_indices)); + subdiv_sample.setCreaseLengths(Int32ArraySample(edge_crease_lengths)); + subdiv_sample.setCreaseSharpnesses(FloatArraySample(edge_crease_sharpness)); + } + + if (!vert_crease_indices.empty()) { + subdiv_sample.setCornerIndices(Int32ArraySample(vert_crease_indices)); + subdiv_sample.setCornerSharpnesses(FloatArraySample(vert_crease_sharpness)); } update_bounding_box(context.object); @@ -477,10 +486,10 @@ static void get_topology(struct Mesh *mesh, } } -static void get_creases(struct Mesh *mesh, - std::vector<int32_t> &indices, - std::vector<int32_t> &lengths, - std::vector<float> &sharpnesses) +static void get_edge_creases(struct Mesh *mesh, + std::vector<int32_t> &indices, + std::vector<int32_t> &lengths, + std::vector<float> &sharpnesses) { const float factor = 1.0f / 255.0f; @@ -503,6 +512,29 @@ static void get_creases(struct Mesh *mesh, lengths.resize(sharpnesses.size(), 2); } +static void get_vert_creases(struct Mesh *mesh, + std::vector<int32_t> &indices, + std::vector<float> &sharpnesses) +{ + indices.clear(); + sharpnesses.clear(); + + const float *creases = static_cast<const float *>(CustomData_get_layer(&mesh->vdata, CD_CREASE)); + + if (!creases) { + return; + } + + for (int i = 0, v = mesh->totvert; i < v; i++) { + const float sharpness = creases[i]; + + if (sharpness != 0.0f) { + indices.push_back(i); + sharpnesses.push_back(sharpness); + } + } +} + static void get_loop_normals(struct Mesh *mesh, std::vector<Imath::V3f> &normals, bool has_flat_shaded_poly) |