diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-04-17 07:17:24 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-04-17 07:21:24 +0300 |
commit | e12c08e8d170b7ca40f204a5b0423c23a9fbc2c1 (patch) | |
tree | 8cf3453d12edb177a218ef8009357518ec6cab6a /source/blender/alembic/intern/abc_mesh.cc | |
parent | b3dabc200a4b0399ec6b81f2ff2730d07b44fcaa (diff) |
ClangFormat: apply to source, most of intern
Apply clang format as proposed in T53211.
For details on usage and instructions for migrating branches
without conflicts, see:
https://wiki.blender.org/wiki/Tools/ClangFormat
Diffstat (limited to 'source/blender/alembic/intern/abc_mesh.cc')
-rw-r--r-- | source/blender/alembic/intern/abc_mesh.cc | 1962 |
1 files changed, 980 insertions, 982 deletions
diff --git a/source/blender/alembic/intern/abc_mesh.cc b/source/blender/alembic/intern/abc_mesh.cc index 97cd6ffc0e3..5ccb9be02a3 100644 --- a/source/blender/alembic/intern/abc_mesh.cc +++ b/source/blender/alembic/intern/abc_mesh.cc @@ -57,6 +57,7 @@ extern "C" { #include "DEG_depsgraph_query.h" } +using Alembic::Abc::C4fArraySample; using Alembic::Abc::FloatArraySample; using Alembic::Abc::ICompoundProperty; using Alembic::Abc::Int32ArraySample; @@ -64,7 +65,6 @@ using Alembic::Abc::Int32ArraySamplePtr; using Alembic::Abc::P3fArraySamplePtr; using Alembic::Abc::V2fArraySample; using Alembic::Abc::V3fArraySample; -using Alembic::Abc::C4fArraySample; using Alembic::AbcGeom::IFaceSet; using Alembic::AbcGeom::IFaceSetSchema; @@ -95,13 +95,13 @@ using Alembic::AbcGeom::OSubDSchema; using Alembic::AbcGeom::OV2fGeomParam; using Alembic::AbcGeom::OV3fGeomParam; +using Alembic::AbcGeom::IN3fGeomParam; using Alembic::AbcGeom::kFacevaryingScope; using Alembic::AbcGeom::kVaryingScope; using Alembic::AbcGeom::kVertexScope; using Alembic::AbcGeom::kWrapExisting; -using Alembic::AbcGeom::UInt32ArraySample; using Alembic::AbcGeom::N3fArraySamplePtr; -using Alembic::AbcGeom::IN3fGeomParam; +using Alembic::AbcGeom::UInt32ArraySample; /* ************************************************************************** */ @@ -109,14 +109,14 @@ using Alembic::AbcGeom::IN3fGeomParam; static void get_vertices(struct Mesh *mesh, std::vector<Imath::V3f> &points) { - points.clear(); - points.resize(mesh->totvert); + points.clear(); + points.resize(mesh->totvert); - MVert *verts = mesh->mvert; + MVert *verts = mesh->mvert; - for (int i = 0, e = mesh->totvert; i < e; ++i) { - copy_yup_from_zup(points[i].getValue(), verts[i].co); - } + for (int i = 0, e = mesh->totvert; i < e; ++i) { + copy_yup_from_zup(points[i].getValue(), verts[i].co); + } } static void get_topology(struct Mesh *mesh, @@ -124,29 +124,29 @@ static void get_topology(struct Mesh *mesh, std::vector<int32_t> &loop_counts, bool &smooth_normal) { - const int num_poly = mesh->totpoly; - const int num_loops = mesh->totloop; - MLoop *mloop = mesh->mloop; - MPoly *mpoly = mesh->mpoly; + const int num_poly = mesh->totpoly; + const int num_loops = mesh->totloop; + MLoop *mloop = mesh->mloop; + MPoly *mpoly = mesh->mpoly; - poly_verts.clear(); - loop_counts.clear(); - poly_verts.reserve(num_loops); - loop_counts.reserve(num_poly); + poly_verts.clear(); + loop_counts.clear(); + poly_verts.reserve(num_loops); + loop_counts.reserve(num_poly); - /* NOTE: data needs to be written in the reverse order. */ - for (int i = 0; i < num_poly; ++i) { - MPoly &poly = mpoly[i]; - loop_counts.push_back(poly.totloop); + /* NOTE: data needs to be written in the reverse order. */ + for (int i = 0; i < num_poly; ++i) { + MPoly &poly = mpoly[i]; + loop_counts.push_back(poly.totloop); - smooth_normal |= ((poly.flag & ME_SMOOTH) != 0); + smooth_normal |= ((poly.flag & ME_SMOOTH) != 0); - MLoop *loop = mloop + poly.loopstart + (poly.totloop - 1); + MLoop *loop = mloop + poly.loopstart + (poly.totloop - 1); - for (int j = 0; j < poly.totloop; ++j, --loop) { - poly_verts.push_back(loop->v); - } - } + for (int j = 0; j < poly.totloop; ++j, --loop) { + poly_verts.push_back(loop->v); + } + } } static void get_creases(struct Mesh *mesh, @@ -154,92 +154,92 @@ static void get_creases(struct Mesh *mesh, std::vector<int32_t> &lengths, std::vector<float> &sharpnesses) { - const float factor = 1.0f / 255.0f; + const float factor = 1.0f / 255.0f; - indices.clear(); - lengths.clear(); - sharpnesses.clear(); + indices.clear(); + lengths.clear(); + sharpnesses.clear(); - MEdge *edge = mesh->medge; + MEdge *edge = mesh->medge; - for (int i = 0, e = mesh->totedge; i < e; ++i) { - const float sharpness = static_cast<float>(edge[i].crease) * factor; + for (int i = 0, e = mesh->totedge; i < e; ++i) { + const float sharpness = static_cast<float>(edge[i].crease) * factor; - if (sharpness != 0.0f) { - indices.push_back(edge[i].v1); - indices.push_back(edge[i].v2); - sharpnesses.push_back(sharpness); - } - } + if (sharpness != 0.0f) { + indices.push_back(edge[i].v1); + indices.push_back(edge[i].v2); + sharpnesses.push_back(sharpness); + } + } - lengths.resize(sharpnesses.size(), 2); + lengths.resize(sharpnesses.size(), 2); } static void get_vertex_normals(struct Mesh *mesh, std::vector<Imath::V3f> &normals) { - normals.clear(); - normals.resize(mesh->totvert); + normals.clear(); + normals.resize(mesh->totvert); - MVert *verts = mesh->mvert; - float no[3]; + MVert *verts = mesh->mvert; + float no[3]; - for (int i = 0, e = mesh->totvert; i < e; ++i) { - normal_short_to_float_v3(no, verts[i].no); - copy_yup_from_zup(normals[i].getValue(), no); - } + for (int i = 0, e = mesh->totvert; i < e; ++i) { + normal_short_to_float_v3(no, verts[i].no); + copy_yup_from_zup(normals[i].getValue(), no); + } } static void get_loop_normals(struct Mesh *mesh, std::vector<Imath::V3f> &normals) { - MPoly *mp = mesh->mpoly; - - MLoop *mloop = mesh->mloop; - MLoop *ml = mloop; - - MVert *verts = mesh->mvert; - - const float (*lnors)[3] = static_cast<float(*)[3]>(CustomData_get_layer(&mesh->ldata, CD_NORMAL)); - - normals.clear(); - normals.resize(mesh->totloop); - - unsigned loop_index = 0; - - /* NOTE: data needs to be written in the reverse order. */ - - if (lnors) { - for (int i = 0, e = mesh->totpoly; i < e; ++i, ++mp) { - ml = mloop + mp->loopstart + (mp->totloop - 1); - - for (int j = 0; j < mp->totloop; --ml, ++j, ++loop_index) { - const int index = ml->v; - copy_yup_from_zup(normals[loop_index].getValue(), lnors[index]); - } - } - } - else { - float no[3]; - - for (int i = 0, e = mesh->totpoly; i < e; ++i, ++mp) { - ml = mloop + mp->loopstart + (mp->totloop - 1); - - /* Flat shaded, use common normal for all verts. */ - if ((mp->flag & ME_SMOOTH) == 0) { - BKE_mesh_calc_poly_normal(mp, ml - (mp->totloop - 1), verts, no); - - for (int j = 0; j < mp->totloop; --ml, ++j, ++loop_index) { - copy_yup_from_zup(normals[loop_index].getValue(), no); - } - } - else { - /* Smooth shaded, use individual vert normals. */ - for (int j = 0; j < mp->totloop; --ml, ++j, ++loop_index) { - normal_short_to_float_v3(no, verts[ml->v].no); - copy_yup_from_zup(normals[loop_index].getValue(), no); - } - } - } - } + MPoly *mp = mesh->mpoly; + + MLoop *mloop = mesh->mloop; + MLoop *ml = mloop; + + MVert *verts = mesh->mvert; + + const float(*lnors)[3] = static_cast<float(*)[3]>(CustomData_get_layer(&mesh->ldata, CD_NORMAL)); + + normals.clear(); + normals.resize(mesh->totloop); + + unsigned loop_index = 0; + + /* NOTE: data needs to be written in the reverse order. */ + + if (lnors) { + for (int i = 0, e = mesh->totpoly; i < e; ++i, ++mp) { + ml = mloop + mp->loopstart + (mp->totloop - 1); + + for (int j = 0; j < mp->totloop; --ml, ++j, ++loop_index) { + const int index = ml->v; + copy_yup_from_zup(normals[loop_index].getValue(), lnors[index]); + } + } + } + else { + float no[3]; + + for (int i = 0, e = mesh->totpoly; i < e; ++i, ++mp) { + ml = mloop + mp->loopstart + (mp->totloop - 1); + + /* Flat shaded, use common normal for all verts. */ + if ((mp->flag & ME_SMOOTH) == 0) { + BKE_mesh_calc_poly_normal(mp, ml - (mp->totloop - 1), verts, no); + + for (int j = 0; j < mp->totloop; --ml, ++j, ++loop_index) { + copy_yup_from_zup(normals[loop_index].getValue(), no); + } + } + else { + /* Smooth shaded, use individual vert normals. */ + for (int j = 0; j < mp->totloop; --ml, ++j, ++loop_index) { + normal_short_to_float_v3(no, verts[ml->v].no); + copy_yup_from_zup(normals[loop_index].getValue(), no); + } + } + } + } } /* *************** Modifiers *************** */ @@ -248,43 +248,43 @@ static void get_loop_normals(struct Mesh *mesh, std::vector<Imath::V3f> &normals * displace if it's after subsurf. */ static ModifierData *get_subsurf_modifier(Scene *scene, Object *ob) { - ModifierData *md = static_cast<ModifierData *>(ob->modifiers.last); + ModifierData *md = static_cast<ModifierData *>(ob->modifiers.last); - for (; md; md = md->prev) { - if (!modifier_isEnabled(scene, md, eModifierMode_Render)) { - continue; - } + for (; md; md = md->prev) { + if (!modifier_isEnabled(scene, md, eModifierMode_Render)) { + continue; + } - if (md->type == eModifierType_Subsurf) { - SubsurfModifierData *smd = reinterpret_cast<SubsurfModifierData*>(md); + if (md->type == eModifierType_Subsurf) { + SubsurfModifierData *smd = reinterpret_cast<SubsurfModifierData *>(md); - if (smd->subdivType == ME_CC_SUBSURF) { - return md; - } - } + if (smd->subdivType == ME_CC_SUBSURF) { + return md; + } + } - /* mesh is not a subsurf. break */ - if ((md->type != eModifierType_Displace) && (md->type != eModifierType_ParticleSystem)) { - return NULL; - } - } + /* mesh is not a subsurf. break */ + if ((md->type != eModifierType_Displace) && (md->type != eModifierType_ParticleSystem)) { + return NULL; + } + } - return NULL; + return NULL; } static ModifierData *get_liquid_sim_modifier(Scene *scene, Object *ob) { - ModifierData *md = modifiers_findByType(ob, eModifierType_Fluidsim); + ModifierData *md = modifiers_findByType(ob, eModifierType_Fluidsim); - if (md && (modifier_isEnabled(scene, md, eModifierMode_Render))) { - FluidsimModifierData *fsmd = reinterpret_cast<FluidsimModifierData *>(md); + if (md && (modifier_isEnabled(scene, md, eModifierMode_Render))) { + FluidsimModifierData *fsmd = reinterpret_cast<FluidsimModifierData *>(md); - if (fsmd->fss && fsmd->fss->type == OB_FLUIDSIM_DOMAIN) { - return md; - } - } + if (fsmd->fss && fsmd->fss->type == OB_FLUIDSIM_DOMAIN) { + return md; + } + } - return NULL; + return NULL; } /* ************************************************************************** */ @@ -295,390 +295,394 @@ AbcGenericMeshWriter::AbcGenericMeshWriter(Object *ob, ExportSettings &settings) : AbcObjectWriter(ob, time_sampling, settings, parent) { - m_is_animated = isAnimated(); - m_subsurf_mod = NULL; - m_is_subd = false; - - /* If the object is static, use the default static time sampling. */ - if (!m_is_animated) { - time_sampling = 0; - } - - if (!m_settings.apply_subdiv) { - m_subsurf_mod = get_subsurf_modifier(m_settings.scene, m_object); - m_is_subd = (m_subsurf_mod != NULL); - } - - m_is_liquid = (get_liquid_sim_modifier(m_settings.scene, m_object) != NULL); - - while (parent->alembicXform().getChildHeader(m_name)) { - m_name.append("_"); - } - - if (m_settings.use_subdiv_schema && m_is_subd) { - OSubD subd(parent->alembicXform(), m_name, m_time_sampling); - m_subdiv_schema = subd.getSchema(); - } - else { - OPolyMesh mesh(parent->alembicXform(), m_name, m_time_sampling); - m_mesh_schema = mesh.getSchema(); - - OCompoundProperty typeContainer = m_mesh_schema.getUserProperties(); - OBoolProperty type(typeContainer, "meshtype"); - type.set(m_is_subd); - } + m_is_animated = isAnimated(); + m_subsurf_mod = NULL; + m_is_subd = false; + + /* If the object is static, use the default static time sampling. */ + if (!m_is_animated) { + time_sampling = 0; + } + + if (!m_settings.apply_subdiv) { + m_subsurf_mod = get_subsurf_modifier(m_settings.scene, m_object); + m_is_subd = (m_subsurf_mod != NULL); + } + + m_is_liquid = (get_liquid_sim_modifier(m_settings.scene, m_object) != NULL); + + while (parent->alembicXform().getChildHeader(m_name)) { + m_name.append("_"); + } + + if (m_settings.use_subdiv_schema && m_is_subd) { + OSubD subd(parent->alembicXform(), m_name, m_time_sampling); + m_subdiv_schema = subd.getSchema(); + } + else { + OPolyMesh mesh(parent->alembicXform(), m_name, m_time_sampling); + m_mesh_schema = mesh.getSchema(); + + OCompoundProperty typeContainer = m_mesh_schema.getUserProperties(); + OBoolProperty type(typeContainer, "meshtype"); + type.set(m_is_subd); + } } AbcGenericMeshWriter::~AbcGenericMeshWriter() { - if (m_subsurf_mod) { - m_subsurf_mod->mode &= ~eModifierMode_DisableTemporary; - } + if (m_subsurf_mod) { + m_subsurf_mod->mode &= ~eModifierMode_DisableTemporary; + } } bool AbcGenericMeshWriter::isAnimated() const { - if (m_object->data != NULL) { - AnimData *adt = BKE_animdata_from_id(static_cast<ID*>(m_object->data)); - /* TODO(Sybren): make this check more strict, as the AnimationData may - * actually be empty (no fcurves, drivers, etc.) and thus effectively - * have no animation at all. */ - if (adt != NULL) { - return true; - } - } - if (BKE_key_from_object(m_object) != NULL) { - return true; - } - - /* Test modifiers. */ - ModifierData *md = static_cast<ModifierData *>(m_object->modifiers.first); - while (md) { - - if (md->type != eModifierType_Subsurf) { - return true; - } - - md = md->next; - } - - return false; + if (m_object->data != NULL) { + AnimData *adt = BKE_animdata_from_id(static_cast<ID *>(m_object->data)); + /* TODO(Sybren): make this check more strict, as the AnimationData may + * actually be empty (no fcurves, drivers, etc.) and thus effectively + * have no animation at all. */ + if (adt != NULL) { + return true; + } + } + if (BKE_key_from_object(m_object) != NULL) { + return true; + } + + /* Test modifiers. */ + ModifierData *md = static_cast<ModifierData *>(m_object->modifiers.first); + while (md) { + + if (md->type != eModifierType_Subsurf) { + return true; + } + + md = md->next; + } + + return false; } void AbcGenericMeshWriter::setIsAnimated(bool is_animated) { - m_is_animated = is_animated; + m_is_animated = is_animated; } void AbcGenericMeshWriter::do_write() { - /* We have already stored a sample for this object. */ - if (!m_first_frame && !m_is_animated) - return; - - bool needsfree; - struct Mesh *mesh = getFinalMesh(needsfree); - - try { - if (m_settings.use_subdiv_schema && m_subdiv_schema.valid()) { - writeSubD(mesh); - } - else { - writeMesh(mesh); - } - - if (needsfree) freeEvaluatedMesh(mesh); - } - catch (...) { - if (needsfree) freeEvaluatedMesh(mesh); - throw; - } + /* We have already stored a sample for this object. */ + if (!m_first_frame && !m_is_animated) + return; + + bool needsfree; + struct Mesh *mesh = getFinalMesh(needsfree); + + try { + if (m_settings.use_subdiv_schema && m_subdiv_schema.valid()) { + writeSubD(mesh); + } + else { + writeMesh(mesh); + } + + if (needsfree) + freeEvaluatedMesh(mesh); + } + catch (...) { + if (needsfree) + freeEvaluatedMesh(mesh); + throw; + } } void AbcGenericMeshWriter::freeEvaluatedMesh(struct Mesh *mesh) { - BKE_id_free(NULL, mesh); + BKE_id_free(NULL, mesh); } void AbcGenericMeshWriter::writeMesh(struct Mesh *mesh) { - std::vector<Imath::V3f> points, normals; - std::vector<int32_t> poly_verts, loop_counts; + std::vector<Imath::V3f> points, normals; + std::vector<int32_t> poly_verts, loop_counts; - bool smooth_normal = false; + bool smooth_normal = false; - get_vertices(mesh, points); - get_topology(mesh, poly_verts, loop_counts, smooth_normal); + get_vertices(mesh, points); + get_topology(mesh, poly_verts, loop_counts, smooth_normal); - if (m_first_frame && m_settings.export_face_sets) { - writeFaceSets(mesh, m_mesh_schema); - } + if (m_first_frame && m_settings.export_face_sets) { + writeFaceSets(mesh, m_mesh_schema); + } - m_mesh_sample = OPolyMeshSchema::Sample(V3fArraySample(points), - Int32ArraySample(poly_verts), - Int32ArraySample(loop_counts)); + m_mesh_sample = OPolyMeshSchema::Sample( + V3fArraySample(points), Int32ArraySample(poly_verts), Int32ArraySample(loop_counts)); - UVSample sample; - if (m_first_frame && m_settings.export_uvs) { - const char *name = get_uv_sample(sample, m_custom_data_config, &mesh->ldata); + UVSample sample; + if (m_first_frame && m_settings.export_uvs) { + const char *name = get_uv_sample(sample, m_custom_data_config, &mesh->ldata); - if (!sample.indices.empty() && !sample.uvs.empty()) { - OV2fGeomParam::Sample uv_sample; - uv_sample.setVals(V2fArraySample(sample.uvs)); - uv_sample.setIndices(UInt32ArraySample(sample.indices)); - uv_sample.setScope(kFacevaryingScope); + if (!sample.indices.empty() && !sample.uvs.empty()) { + OV2fGeomParam::Sample uv_sample; + uv_sample.setVals(V2fArraySample(sample.uvs)); + uv_sample.setIndices(UInt32ArraySample(sample.indices)); + uv_sample.setScope(kFacevaryingScope); - m_mesh_schema.setUVSourceName(name); - m_mesh_sample.setUVs(uv_sample); - } + m_mesh_schema.setUVSourceName(name); + m_mesh_sample.setUVs(uv_sample); + } - write_custom_data(m_mesh_schema.getArbGeomParams(), m_custom_data_config, &mesh->ldata, CD_MLOOPUV); - } + write_custom_data( + m_mesh_schema.getArbGeomParams(), m_custom_data_config, &mesh->ldata, CD_MLOOPUV); + } - if (m_settings.export_normals) { - if (smooth_normal) { - get_loop_normals(mesh, normals); - } - else { - get_vertex_normals(mesh, normals); - } + if (m_settings.export_normals) { + if (smooth_normal) { + get_loop_normals(mesh, normals); + } + else { + get_vertex_normals(mesh, normals); + } - ON3fGeomParam::Sample normals_sample; - if (!normals.empty()) { - normals_sample.setScope((smooth_normal) ? kFacevaryingScope : kVertexScope); - normals_sample.setVals(V3fArraySample(normals)); - } + ON3fGeomParam::Sample normals_sample; + if (!normals.empty()) { + normals_sample.setScope((smooth_normal) ? kFacevaryingScope : kVertexScope); + normals_sample.setVals(V3fArraySample(normals)); + } - m_mesh_sample.setNormals(normals_sample); - } + m_mesh_sample.setNormals(normals_sample); + } - if (m_is_liquid) { - std::vector<Imath::V3f> velocities; - getVelocities(mesh, velocities); + if (m_is_liquid) { + std::vector<Imath::V3f> velocities; + getVelocities(mesh, velocities); - m_mesh_sample.setVelocities(V3fArraySample(velocities)); - } + m_mesh_sample.setVelocities(V3fArraySample(velocities)); + } - m_mesh_sample.setSelfBounds(bounds()); + m_mesh_sample.setSelfBounds(bounds()); - m_mesh_schema.set(m_mesh_sample); + m_mesh_schema.set(m_mesh_sample); - writeArbGeoParams(mesh); + writeArbGeoParams(mesh); } void AbcGenericMeshWriter::writeSubD(struct Mesh *mesh) { - std::vector<float> 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<float> crease_sharpness; + std::vector<Imath::V3f> points; + std::vector<int32_t> poly_verts, loop_counts; + std::vector<int32_t> crease_indices, crease_lengths; - bool smooth_normal = false; + bool smooth_normal = false; - get_vertices(mesh, points); - get_topology(mesh, poly_verts, loop_counts, smooth_normal); - get_creases(mesh, crease_indices, crease_lengths, crease_sharpness); + get_vertices(mesh, points); + get_topology(mesh, poly_verts, loop_counts, smooth_normal); + get_creases(mesh, crease_indices, crease_lengths, crease_sharpness); - if (m_first_frame && m_settings.export_face_sets) { - writeFaceSets(mesh, m_subdiv_schema); - } + if (m_first_frame && m_settings.export_face_sets) { + writeFaceSets(mesh, m_subdiv_schema); + } - m_subdiv_sample = OSubDSchema::Sample(V3fArraySample(points), - Int32ArraySample(poly_verts), - Int32ArraySample(loop_counts)); + m_subdiv_sample = OSubDSchema::Sample( + V3fArraySample(points), Int32ArraySample(poly_verts), Int32ArraySample(loop_counts)); - UVSample sample; - if (m_first_frame && m_settings.export_uvs) { - const char *name = get_uv_sample(sample, m_custom_data_config, &mesh->ldata); + UVSample sample; + if (m_first_frame && m_settings.export_uvs) { + const char *name = get_uv_sample(sample, m_custom_data_config, &mesh->ldata); - if (!sample.indices.empty() && !sample.uvs.empty()) { - OV2fGeomParam::Sample uv_sample; - uv_sample.setVals(V2fArraySample(sample.uvs)); - uv_sample.setIndices(UInt32ArraySample(sample.indices)); - uv_sample.setScope(kFacevaryingScope); + if (!sample.indices.empty() && !sample.uvs.empty()) { + OV2fGeomParam::Sample uv_sample; + uv_sample.setVals(V2fArraySample(sample.uvs)); + uv_sample.setIndices(UInt32ArraySample(sample.indices)); + uv_sample.setScope(kFacevaryingScope); - m_subdiv_schema.setUVSourceName(name); - m_subdiv_sample.setUVs(uv_sample); - } + m_subdiv_schema.setUVSourceName(name); + m_subdiv_sample.setUVs(uv_sample); + } - write_custom_data(m_subdiv_schema.getArbGeomParams(), m_custom_data_config, &mesh->ldata, CD_MLOOPUV); - } + write_custom_data( + m_subdiv_schema.getArbGeomParams(), m_custom_data_config, &mesh->ldata, CD_MLOOPUV); + } - if (!crease_indices.empty()) { - m_subdiv_sample.setCreaseIndices(Int32ArraySample(crease_indices)); - m_subdiv_sample.setCreaseLengths(Int32ArraySample(crease_lengths)); - m_subdiv_sample.setCreaseSharpnesses(FloatArraySample(crease_sharpness)); - } + if (!crease_indices.empty()) { + m_subdiv_sample.setCreaseIndices(Int32ArraySample(crease_indices)); + m_subdiv_sample.setCreaseLengths(Int32ArraySample(crease_lengths)); + m_subdiv_sample.setCreaseSharpnesses(FloatArraySample(crease_sharpness)); + } - m_subdiv_sample.setSelfBounds(bounds()); - m_subdiv_schema.set(m_subdiv_sample); + m_subdiv_sample.setSelfBounds(bounds()); + m_subdiv_schema.set(m_subdiv_sample); - writeArbGeoParams(mesh); + writeArbGeoParams(mesh); } -template <typename Schema> -void AbcGenericMeshWriter::writeFaceSets(struct Mesh *me, Schema &schema) +template<typename Schema> void AbcGenericMeshWriter::writeFaceSets(struct Mesh *me, Schema &schema) { - std::map< std::string, std::vector<int32_t>> geo_groups; - getGeoGroups(me, geo_groups); - - std::map< std::string, std::vector<int32_t>>::iterator it; - for (it = geo_groups.begin(); it != geo_groups.end(); ++it) { - OFaceSet face_set = schema.createFaceSet(it->first); - OFaceSetSchema::Sample samp; - samp.setFaces(Int32ArraySample(it->second)); - face_set.getSchema().set(samp); - } + std::map<std::string, std::vector<int32_t>> geo_groups; + getGeoGroups(me, geo_groups); + + std::map<std::string, std::vector<int32_t>>::iterator it; + for (it = geo_groups.begin(); it != geo_groups.end(); ++it) { + OFaceSet face_set = schema.createFaceSet(it->first); + OFaceSetSchema::Sample samp; + samp.setFaces(Int32ArraySample(it->second)); + face_set.getSchema().set(samp); + } } Mesh *AbcGenericMeshWriter::getFinalMesh(bool &r_needsfree) { - /* We don't want subdivided mesh data */ - if (m_subsurf_mod) { - m_subsurf_mod->mode |= eModifierMode_DisableTemporary; - } + /* We don't want subdivided mesh data */ + if (m_subsurf_mod) { + m_subsurf_mod->mode |= eModifierMode_DisableTemporary; + } - r_needsfree = false; + r_needsfree = false; - Scene *scene = DEG_get_evaluated_scene(m_settings.depsgraph); - Object *ob_eval = DEG_get_evaluated_object(m_settings.depsgraph, m_object); - struct Mesh *mesh = getEvaluatedMesh(scene, ob_eval, r_needsfree); + Scene *scene = DEG_get_evaluated_scene(m_settings.depsgraph); + Object *ob_eval = DEG_get_evaluated_object(m_settings.depsgraph, m_object); + struct Mesh *mesh = getEvaluatedMesh(scene, ob_eval, r_needsfree); - if (m_subsurf_mod) { - m_subsurf_mod->mode &= ~eModifierMode_DisableTemporary; - } + if (m_subsurf_mod) { + m_subsurf_mod->mode &= ~eModifierMode_DisableTemporary; + } - if (m_settings.triangulate) { - const bool tag_only = false; - const int quad_method = m_settings.quad_method; - const int ngon_method = m_settings.ngon_method; + if (m_settings.triangulate) { + const bool tag_only = false; + const int quad_method = m_settings.quad_method; + const int ngon_method = m_settings.ngon_method; - struct BMeshCreateParams bmcp = {false}; - struct BMeshFromMeshParams bmfmp = {true, false, false, 0}; - BMesh *bm = BKE_mesh_to_bmesh_ex(mesh, &bmcp, &bmfmp); + struct BMeshCreateParams bmcp = {false}; + struct BMeshFromMeshParams bmfmp = {true, false, false, 0}; + BMesh *bm = BKE_mesh_to_bmesh_ex(mesh, &bmcp, &bmfmp); - BM_mesh_triangulate(bm, quad_method, ngon_method, 4, tag_only, NULL, NULL, NULL); + BM_mesh_triangulate(bm, quad_method, ngon_method, 4, tag_only, NULL, NULL, NULL); - Mesh *result = BKE_mesh_from_bmesh_for_eval_nomain(bm, NULL); - BM_mesh_free(bm); + Mesh *result = BKE_mesh_from_bmesh_for_eval_nomain(bm, NULL); + BM_mesh_free(bm); - if (r_needsfree) { - BKE_id_free(NULL, mesh); - } + if (r_needsfree) { + BKE_id_free(NULL, mesh); + } - mesh = result; - r_needsfree = true; - } + mesh = result; + r_needsfree = true; + } - m_custom_data_config.pack_uvs = m_settings.pack_uv; - m_custom_data_config.mpoly = mesh->mpoly; - m_custom_data_config.mloop = mesh->mloop; - m_custom_data_config.totpoly = mesh->totpoly; - m_custom_data_config.totloop = mesh->totloop; - m_custom_data_config.totvert = mesh->totvert; + m_custom_data_config.pack_uvs = m_settings.pack_uv; + m_custom_data_config.mpoly = mesh->mpoly; + m_custom_data_config.mloop = mesh->mloop; + m_custom_data_config.totpoly = mesh->totpoly; + m_custom_data_config.totloop = mesh->totloop; + m_custom_data_config.totvert = mesh->totvert; - return mesh; + return mesh; } void AbcGenericMeshWriter::writeArbGeoParams(struct Mesh *me) { - if (m_is_liquid) { - /* We don't need anything more for liquid meshes. */ - return; - } - - if (m_first_frame && m_settings.export_vcols) { - if (m_subdiv_schema.valid()) { - write_custom_data(m_subdiv_schema.getArbGeomParams(), m_custom_data_config, &me->ldata, CD_MLOOPCOL); - } - else { - write_custom_data(m_mesh_schema.getArbGeomParams(), m_custom_data_config, &me->ldata, CD_MLOOPCOL); - } - } + if (m_is_liquid) { + /* We don't need anything more for liquid meshes. */ + return; + } + + if (m_first_frame && m_settings.export_vcols) { + if (m_subdiv_schema.valid()) { + write_custom_data( + m_subdiv_schema.getArbGeomParams(), m_custom_data_config, &me->ldata, CD_MLOOPCOL); + } + else { + write_custom_data( + m_mesh_schema.getArbGeomParams(), m_custom_data_config, &me->ldata, CD_MLOOPCOL); + } + } } void AbcGenericMeshWriter::getVelocities(struct Mesh *mesh, std::vector<Imath::V3f> &vels) { - const int totverts = mesh->totvert; - - vels.clear(); - vels.resize(totverts); - - ModifierData *md = get_liquid_sim_modifier(m_settings.scene, m_object); - FluidsimModifierData *fmd = reinterpret_cast<FluidsimModifierData *>(md); - FluidsimSettings *fss = fmd->fss; - - if (fss->meshVelocities) { - float *mesh_vels = reinterpret_cast<float *>(fss->meshVelocities); - - for (int i = 0; i < totverts; ++i) { - copy_yup_from_zup(vels[i].getValue(), mesh_vels); - mesh_vels += 3; - } - } - else { - std::fill(vels.begin(), vels.end(), Imath::V3f(0.0f)); - } + const int totverts = mesh->totvert; + + vels.clear(); + vels.resize(totverts); + + ModifierData *md = get_liquid_sim_modifier(m_settings.scene, m_object); + FluidsimModifierData *fmd = reinterpret_cast<FluidsimModifierData *>(md); + FluidsimSettings *fss = fmd->fss; + + if (fss->meshVelocities) { + float *mesh_vels = reinterpret_cast<float *>(fss->meshVelocities); + + for (int i = 0; i < totverts; ++i) { + copy_yup_from_zup(vels[i].getValue(), mesh_vels); + mesh_vels += 3; + } + } + else { + std::fill(vels.begin(), vels.end(), Imath::V3f(0.0f)); + } } -void AbcGenericMeshWriter::getGeoGroups( - struct Mesh *mesh, - std::map<std::string, std::vector<int32_t>> &geo_groups) +void AbcGenericMeshWriter::getGeoGroups(struct Mesh *mesh, + std::map<std::string, std::vector<int32_t>> &geo_groups) { - const int num_poly = mesh->totpoly; - MPoly *polygons = mesh->mpoly; + const int num_poly = mesh->totpoly; + MPoly *polygons = mesh->mpoly; - for (int i = 0; i < num_poly; ++i) { - MPoly ¤t_poly = polygons[i]; - short mnr = current_poly.mat_nr; + for (int i = 0; i < num_poly; ++i) { + MPoly ¤t_poly = polygons[i]; + short mnr = current_poly.mat_nr; - Material *mat = give_current_material(m_object, mnr + 1); + Material *mat = give_current_material(m_object, mnr + 1); - if (!mat) { - continue; - } + if (!mat) { + continue; + } - std::string name = get_id_name(&mat->id); + std::string name = get_id_name(&mat->id); - if (geo_groups.find(name) == geo_groups.end()) { - std::vector<int32_t> faceArray; - geo_groups[name] = faceArray; - } + if (geo_groups.find(name) == geo_groups.end()) { + std::vector<int32_t> faceArray; + geo_groups[name] = faceArray; + } - geo_groups[name].push_back(i); - } + geo_groups[name].push_back(i); + } - if (geo_groups.size() == 0) { - Material *mat = give_current_material(m_object, 1); + if (geo_groups.size() == 0) { + Material *mat = give_current_material(m_object, 1); - std::string name = (mat) ? get_id_name(&mat->id) : "default"; + std::string name = (mat) ? get_id_name(&mat->id) : "default"; - std::vector<int32_t> faceArray; + std::vector<int32_t> faceArray; - for (int i = 0, e = mesh->totface; i < e; ++i) { - faceArray.push_back(i); - } + for (int i = 0, e = mesh->totface; i < e; ++i) { + faceArray.push_back(i); + } - geo_groups[name] = faceArray; - } + geo_groups[name] = faceArray; + } } - AbcMeshWriter::AbcMeshWriter(Object *ob, AbcTransformWriter *parent, uint32_t time_sampling, ExportSettings &settings) : AbcGenericMeshWriter(ob, parent, time_sampling, settings) -{} +{ +} AbcMeshWriter::~AbcMeshWriter() -{} - -Mesh *AbcMeshWriter::getEvaluatedMesh(Scene *scene_eval, Object *ob_eval, bool &UNUSED(r_needsfree)) { - return mesh_get_eval_final(m_settings.depsgraph, scene_eval, ob_eval, &CD_MASK_MESH); } +Mesh *AbcMeshWriter::getEvaluatedMesh(Scene *scene_eval, + Object *ob_eval, + bool &UNUSED(r_needsfree)) +{ + return mesh_get_eval_final(m_settings.depsgraph, scene_eval, ob_eval, &CD_MASK_MESH); +} /* ************************************************************************** */ @@ -687,55 +691,57 @@ namespace utils { static void build_mat_map(const Main *bmain, std::map<std::string, Material *> &mat_map) { - Material *material = static_cast<Material *>(bmain->materials.first); + Material *material = static_cast<Material *>(bmain->materials.first); - for (; material; material = static_cast<Material *>(material->id.next)) { - mat_map[material->id.name + 2] = material; - } + for (; material; material = static_cast<Material *>(material->id.next)) { + mat_map[material->id.name + 2] = material; + } } -static void assign_materials(Main *bmain, Object *ob, const std::map<std::string, int> &mat_index_map) +static void assign_materials(Main *bmain, + Object *ob, + const std::map<std::string, int> &mat_index_map) { - bool can_assign = true; - std::map<std::string, int>::const_iterator it = mat_index_map.begin(); - - int matcount = 0; - for (; it != mat_index_map.end(); ++it, ++matcount) { - if (!BKE_object_material_slot_add(bmain, ob)) { - can_assign = false; - break; - } - } - - /* TODO(kevin): use global map? */ - std::map<std::string, Material *> mat_map; - build_mat_map(bmain, mat_map); - - std::map<std::string, Material *>::iterator mat_iter; - - if (can_assign) { - it = mat_index_map.begin(); - - for (; it != mat_index_map.end(); ++it) { - std::string mat_name = it->first; - mat_iter = mat_map.find(mat_name.c_str()); - - Material *assigned_mat; - - if (mat_iter == mat_map.end()) { - assigned_mat = BKE_material_add(bmain, mat_name.c_str()); - mat_map[mat_name] = assigned_mat; - } - else { - assigned_mat = mat_iter->second; - } - - assign_material(bmain, ob, assigned_mat, it->second, BKE_MAT_ASSIGN_OBDATA); - } - } + bool can_assign = true; + std::map<std::string, int>::const_iterator it = mat_index_map.begin(); + + int matcount = 0; + for (; it != mat_index_map.end(); ++it, ++matcount) { + if (!BKE_object_material_slot_add(bmain, ob)) { + can_assign = false; + break; + } + } + + /* TODO(kevin): use global map? */ + std::map<std::string, Material *> mat_map; + build_mat_map(bmain, mat_map); + + std::map<std::string, Material *>::iterator mat_iter; + + if (can_assign) { + it = mat_index_map.begin(); + + for (; it != mat_index_map.end(); ++it) { + std::string mat_name = it->first; + mat_iter = mat_map.find(mat_name.c_str()); + + Material *assigned_mat; + + if (mat_iter == mat_map.end()) { + assigned_mat = BKE_material_add(bmain, mat_name.c_str()); + mat_map[mat_name] = assigned_mat; + } + else { + assigned_mat = mat_iter->second; + } + + assign_material(bmain, ob, assigned_mat, it->second, BKE_MAT_ASSIGN_OBDATA); + } + } } -} /* namespace utils */ +} /* namespace utils */ /* ************************************************************************** */ @@ -743,116 +749,120 @@ using Alembic::AbcGeom::UInt32ArraySamplePtr; using Alembic::AbcGeom::V2fArraySamplePtr; struct AbcMeshData { - Int32ArraySamplePtr face_indices; - Int32ArraySamplePtr face_counts; + Int32ArraySamplePtr face_indices; + Int32ArraySamplePtr face_counts; - P3fArraySamplePtr positions; - P3fArraySamplePtr ceil_positions; + P3fArraySamplePtr positions; + P3fArraySamplePtr ceil_positions; - N3fArraySamplePtr vertex_normals; - N3fArraySamplePtr face_normals; + N3fArraySamplePtr vertex_normals; + N3fArraySamplePtr face_normals; - V2fArraySamplePtr uvs; - UInt32ArraySamplePtr uvs_indices; + V2fArraySamplePtr uvs; + UInt32ArraySamplePtr uvs_indices; }; -static void read_mverts_interp(MVert *mverts, const P3fArraySamplePtr &positions, const P3fArraySamplePtr &ceil_positions, const float weight) +static void read_mverts_interp(MVert *mverts, + const P3fArraySamplePtr &positions, + const P3fArraySamplePtr &ceil_positions, + const float weight) { - float tmp[3]; - for (int i = 0; i < positions->size(); ++i) { - MVert &mvert = mverts[i]; - const Imath::V3f &floor_pos = (*positions)[i]; - const Imath::V3f &ceil_pos = (*ceil_positions)[i]; + float tmp[3]; + for (int i = 0; i < positions->size(); ++i) { + MVert &mvert = mverts[i]; + const Imath::V3f &floor_pos = (*positions)[i]; + const Imath::V3f &ceil_pos = (*ceil_positions)[i]; - interp_v3_v3v3(tmp, floor_pos.getValue(), ceil_pos.getValue(), weight); - copy_zup_from_yup(mvert.co, tmp); + interp_v3_v3v3(tmp, floor_pos.getValue(), ceil_pos.getValue(), weight); + copy_zup_from_yup(mvert.co, tmp); - mvert.bweight = 0; - } + mvert.bweight = 0; + } } static void read_mverts(CDStreamConfig &config, const AbcMeshData &mesh_data) { - MVert *mverts = config.mvert; - const P3fArraySamplePtr &positions = mesh_data.positions; - const N3fArraySamplePtr &normals = mesh_data.vertex_normals; - - if ( config.weight != 0.0f - && mesh_data.ceil_positions != NULL - && mesh_data.ceil_positions->size() == positions->size()) - { - read_mverts_interp(mverts, positions, mesh_data.ceil_positions, config.weight); - return; - } - - read_mverts(mverts, positions, normals); + MVert *mverts = config.mvert; + const P3fArraySamplePtr &positions = mesh_data.positions; + const N3fArraySamplePtr &normals = mesh_data.vertex_normals; + + if (config.weight != 0.0f && mesh_data.ceil_positions != NULL && + mesh_data.ceil_positions->size() == positions->size()) { + read_mverts_interp(mverts, positions, mesh_data.ceil_positions, config.weight); + return; + } + + read_mverts(mverts, positions, normals); } -void read_mverts(MVert *mverts, const P3fArraySamplePtr &positions, const N3fArraySamplePtr &normals) +void read_mverts(MVert *mverts, + const P3fArraySamplePtr &positions, + const N3fArraySamplePtr &normals) { - for (int i = 0; i < positions->size(); ++i) { - MVert &mvert = mverts[i]; - Imath::V3f pos_in = (*positions)[i]; + for (int i = 0; i < positions->size(); ++i) { + MVert &mvert = mverts[i]; + Imath::V3f pos_in = (*positions)[i]; - copy_zup_from_yup(mvert.co, pos_in.getValue()); + copy_zup_from_yup(mvert.co, pos_in.getValue()); - mvert.bweight = 0; + mvert.bweight = 0; - if (normals) { - Imath::V3f nor_in = (*normals)[i]; + if (normals) { + Imath::V3f nor_in = (*normals)[i]; - short no[3]; - normal_float_to_short_v3(no, nor_in.getValue()); + short no[3]; + normal_float_to_short_v3(no, nor_in.getValue()); - copy_zup_from_yup(mvert.no, no); - } - } + copy_zup_from_yup(mvert.no, no); + } + } } static void read_mpolys(CDStreamConfig &config, const AbcMeshData &mesh_data) { - MPoly *mpolys = config.mpoly; - MLoop *mloops = config.mloop; - MLoopUV *mloopuvs = config.mloopuv; - - const Int32ArraySamplePtr &face_indices = mesh_data.face_indices; - const Int32ArraySamplePtr &face_counts = mesh_data.face_counts; - const V2fArraySamplePtr &uvs = mesh_data.uvs; - const UInt32ArraySamplePtr &uvs_indices = mesh_data.uvs_indices; - const N3fArraySamplePtr &normals = mesh_data.face_normals; - - const bool do_uvs = (mloopuvs && uvs && uvs_indices) && (uvs_indices->size() == face_indices->size()); - unsigned int loop_index = 0; - unsigned int rev_loop_index = 0; - unsigned int uv_index = 0; - - for (int i = 0; i < face_counts->size(); ++i) { - const int face_size = (*face_counts)[i]; - - MPoly &poly = mpolys[i]; - poly.loopstart = loop_index; - poly.totloop = face_size; - - if (normals != NULL) { - poly.flag |= ME_SMOOTH; - } - - /* NOTE: Alembic data is stored in the reverse order. */ - rev_loop_index = loop_index + (face_size - 1); - - for (int f = 0; f < face_size; ++f, ++loop_index, --rev_loop_index) { - MLoop &loop = mloops[rev_loop_index]; - loop.v = (*face_indices)[loop_index]; - - if (do_uvs) { - MLoopUV &loopuv = mloopuvs[rev_loop_index]; - - uv_index = (*uvs_indices)[loop_index]; - loopuv.uv[0] = (*uvs)[uv_index][0]; - loopuv.uv[1] = (*uvs)[uv_index][1]; - } - } - } + MPoly *mpolys = config.mpoly; + MLoop *mloops = config.mloop; + MLoopUV *mloopuvs = config.mloopuv; + + const Int32ArraySamplePtr &face_indices = mesh_data.face_indices; + const Int32ArraySamplePtr &face_counts = mesh_data.face_counts; + const V2fArraySamplePtr &uvs = mesh_data.uvs; + const UInt32ArraySamplePtr &uvs_indices = mesh_data.uvs_indices; + const N3fArraySamplePtr &normals = mesh_data.face_normals; + + const bool do_uvs = (mloopuvs && uvs && uvs_indices) && + (uvs_indices->size() == face_indices->size()); + unsigned int loop_index = 0; + unsigned int rev_loop_index = 0; + unsigned int uv_index = 0; + + for (int i = 0; i < face_counts->size(); ++i) { + const int face_size = (*face_counts)[i]; + + MPoly &poly = mpolys[i]; + poly.loopstart = loop_index; + poly.totloop = face_size; + + if (normals != NULL) { + poly.flag |= ME_SMOOTH; + } + + /* NOTE: Alembic data is stored in the reverse order. */ + rev_loop_index = loop_index + (face_size - 1); + + for (int f = 0; f < face_size; ++f, ++loop_index, --rev_loop_index) { + MLoop &loop = mloops[rev_loop_index]; + loop.v = (*face_indices)[loop_index]; + + if (do_uvs) { + MLoopUV &loopuv = mloopuvs[rev_loop_index]; + + uv_index = (*uvs_indices)[loop_index]; + loopuv.uv[0] = (*uvs)[uv_index][0]; + loopuv.uv[1] = (*uvs)[uv_index][1]; + } + } + } } ABC_INLINE void read_uvs_params(CDStreamConfig &config, @@ -860,29 +870,29 @@ ABC_INLINE void read_uvs_params(CDStreamConfig &config, const IV2fGeomParam &uv, const ISampleSelector &selector) { - if (!uv.valid()) { - return; - } + if (!uv.valid()) { + return; + } - IV2fGeomParam::Sample uvsamp; - uv.getIndexed(uvsamp, selector); + IV2fGeomParam::Sample uvsamp; + uv.getIndexed(uvsamp, selector); - abc_data.uvs = uvsamp.getVals(); - abc_data.uvs_indices = uvsamp.getIndices(); + abc_data.uvs = uvsamp.getVals(); + abc_data.uvs_indices = uvsamp.getIndices(); - if (abc_data.uvs_indices->size() == config.totloop) { - std::string name = Alembic::Abc::GetSourceName(uv.getMetaData()); + if (abc_data.uvs_indices->size() == config.totloop) { + std::string name = Alembic::Abc::GetSourceName(uv.getMetaData()); - /* According to the convention, primary UVs should have had their name - * set using Alembic::Abc::SetSourceName, but you can't expect everyone - * to follow it! :) */ - if (name.empty()) { - name = uv.getName(); - } + /* According to the convention, primary UVs should have had their name + * set using Alembic::Abc::SetSourceName, but you can't expect everyone + * to follow it! :) */ + if (name.empty()) { + name = uv.getName(); + } - void *cd_ptr = config.add_customdata_cb(config.user_data, name.c_str(), CD_MLOOPUV); - config.mloopuv = static_cast<MLoopUV *>(cd_ptr); - } + void *cd_ptr = config.add_customdata_cb(config.user_data, name.c_str(), CD_MLOOPUV); + config.mloopuv = static_cast<MLoopUV *>(cd_ptr); + } } /* TODO(kevin): normals from Alembic files are not read in anymore, this is due @@ -893,149 +903,143 @@ ABC_INLINE void read_normals_params(AbcMeshData &abc_data, const IN3fGeomParam &normals, const ISampleSelector &selector) { - if (!normals.valid()) { - return; - } - - IN3fGeomParam::Sample normsamp = normals.getExpandedValue(selector); - - if (normals.getScope() == kFacevaryingScope) { - abc_data.face_normals = normsamp.getVals(); - } - else if ((normals.getScope() == kVertexScope) || (normals.getScope() == kVaryingScope)) { - abc_data.vertex_normals = N3fArraySamplePtr(); - } + if (!normals.valid()) { + return; + } + + IN3fGeomParam::Sample normsamp = normals.getExpandedValue(selector); + + if (normals.getScope() == kFacevaryingScope) { + abc_data.face_normals = normsamp.getVals(); + } + else if ((normals.getScope() == kVertexScope) || (normals.getScope() == kVaryingScope)) { + abc_data.vertex_normals = N3fArraySamplePtr(); + } } static bool check_smooth_poly_flag(Mesh *mesh) { - MPoly *mpolys = mesh->mpoly; + MPoly *mpolys = mesh->mpoly; - for (int i = 0, e = mesh->totpoly; i < e; ++i) { - MPoly &poly = mpolys[i]; + for (int i = 0, e = mesh->totpoly; i < e; ++i) { + MPoly &poly = mpolys[i]; - if ((poly.flag & ME_SMOOTH) != 0) { - return true; - } - } + if ((poly.flag & ME_SMOOTH) != 0) { + return true; + } + } - return false; + return false; } static void set_smooth_poly_flag(Mesh *mesh) { - MPoly *mpolys = mesh->mpoly; + MPoly *mpolys = mesh->mpoly; - for (int i = 0, e = mesh->totpoly; i < e; ++i) { - MPoly &poly = mpolys[i]; - poly.flag |= ME_SMOOTH; - } + for (int i = 0, e = mesh->totpoly; i < e; ++i) { + MPoly &poly = mpolys[i]; + poly.flag |= ME_SMOOTH; + } } static void *add_customdata_cb(void *user_data, const char *name, int data_type) { - Mesh *mesh = static_cast<Mesh *>(user_data); - CustomDataType cd_data_type = static_cast<CustomDataType>(data_type); - void *cd_ptr; - CustomData *loopdata; - int numloops; - - /* unsupported custom data type -- don't do anything. */ - if (!ELEM(cd_data_type, CD_MLOOPUV, CD_MLOOPCOL)) { - return NULL; - } - - loopdata = &mesh->ldata; - cd_ptr = CustomData_get_layer_named(loopdata, cd_data_type, name); - if (cd_ptr != NULL) { - /* layer already exists, so just return it. */ - return cd_ptr; - } - - /* create a new layer, taking care to construct the hopefully-soon-to-be-removed - * CD_MTEXPOLY layer too, with the same name. */ - numloops = mesh->totloop; - cd_ptr = CustomData_add_layer_named(loopdata, cd_data_type, CD_DEFAULT, - NULL, numloops, name); - return cd_ptr; + Mesh *mesh = static_cast<Mesh *>(user_data); + CustomDataType cd_data_type = static_cast<CustomDataType>(data_type); + void *cd_ptr; + CustomData *loopdata; + int numloops; + + /* unsupported custom data type -- don't do anything. */ + if (!ELEM(cd_data_type, CD_MLOOPUV, CD_MLOOPCOL)) { + return NULL; + } + + loopdata = &mesh->ldata; + cd_ptr = CustomData_get_layer_named(loopdata, cd_data_type, name); + if (cd_ptr != NULL) { + /* layer already exists, so just return it. */ + return cd_ptr; + } + + /* create a new layer, taking care to construct the hopefully-soon-to-be-removed + * CD_MTEXPOLY layer too, with the same name. */ + numloops = mesh->totloop; + cd_ptr = CustomData_add_layer_named(loopdata, cd_data_type, CD_DEFAULT, NULL, numloops, name); + return cd_ptr; } static void get_weight_and_index(CDStreamConfig &config, Alembic::AbcCoreAbstract::TimeSamplingPtr time_sampling, size_t samples_number) { - Alembic::AbcGeom::index_t i0, i1; + Alembic::AbcGeom::index_t i0, i1; - config.weight = get_weight_and_index(config.time, - time_sampling, - samples_number, - i0, - i1); + config.weight = get_weight_and_index(config.time, time_sampling, samples_number, i0, i1); - config.index = i0; - config.ceil_index = i1; + config.index = i0; + config.ceil_index = i1; } -static void read_mesh_sample(const std::string & iobject_full_name, +static void read_mesh_sample(const std::string &iobject_full_name, ImportSettings *settings, const IPolyMeshSchema &schema, const ISampleSelector &selector, CDStreamConfig &config, bool &do_normals) { - const IPolyMeshSchema::Sample sample = schema.getValue(selector); + const IPolyMeshSchema::Sample sample = schema.getValue(selector); - AbcMeshData abc_mesh_data; - abc_mesh_data.face_counts = sample.getFaceCounts(); - abc_mesh_data.face_indices = sample.getFaceIndices(); - abc_mesh_data.positions = sample.getPositions(); + AbcMeshData abc_mesh_data; + abc_mesh_data.face_counts = sample.getFaceCounts(); + abc_mesh_data.face_indices = sample.getFaceIndices(); + abc_mesh_data.positions = sample.getPositions(); - read_normals_params(abc_mesh_data, schema.getNormalsParam(), selector); + read_normals_params(abc_mesh_data, schema.getNormalsParam(), selector); - do_normals = (abc_mesh_data.face_normals != NULL); + do_normals = (abc_mesh_data.face_normals != NULL); - get_weight_and_index(config, schema.getTimeSampling(), schema.getNumSamples()); + get_weight_and_index(config, schema.getTimeSampling(), schema.getNumSamples()); - if (config.weight != 0.0f) { - Alembic::AbcGeom::IPolyMeshSchema::Sample ceil_sample; - schema.get(ceil_sample, Alembic::Abc::ISampleSelector(config.ceil_index)); - abc_mesh_data.ceil_positions = ceil_sample.getPositions(); - } + if (config.weight != 0.0f) { + Alembic::AbcGeom::IPolyMeshSchema::Sample ceil_sample; + schema.get(ceil_sample, Alembic::Abc::ISampleSelector(config.ceil_index)); + abc_mesh_data.ceil_positions = ceil_sample.getPositions(); + } - if ((settings->read_flag & MOD_MESHSEQ_READ_UV) != 0) { - read_uvs_params(config, abc_mesh_data, schema.getUVsParam(), selector); - } + if ((settings->read_flag & MOD_MESHSEQ_READ_UV) != 0) { + read_uvs_params(config, abc_mesh_data, schema.getUVsParam(), selector); + } - if ((settings->read_flag & MOD_MESHSEQ_READ_VERT) != 0) { - read_mverts(config, abc_mesh_data); - } + if ((settings->read_flag & MOD_MESHSEQ_READ_VERT) != 0) { + read_mverts(config, abc_mesh_data); + } - if ((settings->read_flag & MOD_MESHSEQ_READ_POLY) != 0) { - read_mpolys(config, abc_mesh_data); - } + if ((settings->read_flag & MOD_MESHSEQ_READ_POLY) != 0) { + read_mpolys(config, abc_mesh_data); + } - if ((settings->read_flag & (MOD_MESHSEQ_READ_UV | MOD_MESHSEQ_READ_COLOR)) != 0) { - read_custom_data(iobject_full_name, - schema.getArbGeomParams(), config, selector); - } + if ((settings->read_flag & (MOD_MESHSEQ_READ_UV | MOD_MESHSEQ_READ_COLOR)) != 0) { + read_custom_data(iobject_full_name, schema.getArbGeomParams(), config, selector); + } } CDStreamConfig get_config(Mesh *mesh) { - CDStreamConfig config; + CDStreamConfig config; - BLI_assert(mesh->mvert || mesh->totvert == 0); + BLI_assert(mesh->mvert || mesh->totvert == 0); - config.user_data = mesh; - config.mvert = mesh->mvert; - config.mloop = mesh->mloop; - config.mpoly = mesh->mpoly; - config.totloop = mesh->totloop; - config.totpoly = mesh->totpoly; - config.loopdata = &mesh->ldata; - config.add_customdata_cb = add_customdata_cb; + config.user_data = mesh; + config.mvert = mesh->mvert; + config.mloop = mesh->mloop; + config.mpoly = mesh->mpoly; + config.totloop = mesh->totloop; + config.totpoly = mesh->totpoly; + config.loopdata = &mesh->ldata; + config.add_customdata_cb = add_customdata_cb; - return config; + return config; } /* ************************************************************************** */ @@ -1043,57 +1047,60 @@ CDStreamConfig get_config(Mesh *mesh) AbcMeshReader::AbcMeshReader(const IObject &object, ImportSettings &settings) : AbcObjectReader(object, settings) { - m_settings->read_flag |= MOD_MESHSEQ_READ_ALL; + m_settings->read_flag |= MOD_MESHSEQ_READ_ALL; - IPolyMesh ipoly_mesh(m_iobject, kWrapExisting); - m_schema = ipoly_mesh.getSchema(); + IPolyMesh ipoly_mesh(m_iobject, kWrapExisting); + m_schema = ipoly_mesh.getSchema(); - get_min_max_time(m_iobject, m_schema, m_min_time, m_max_time); + get_min_max_time(m_iobject, m_schema, m_min_time, m_max_time); } bool AbcMeshReader::valid() const { - return m_schema.valid(); + return m_schema.valid(); } void AbcMeshReader::readObjectData(Main *bmain, const Alembic::Abc::ISampleSelector &sample_sel) { - Mesh *mesh = BKE_mesh_add(bmain, m_data_name.c_str()); + Mesh *mesh = BKE_mesh_add(bmain, m_data_name.c_str()); - m_object = BKE_object_add_only_object(bmain, OB_MESH, m_object_name.c_str()); - m_object->data = mesh; + m_object = BKE_object_add_only_object(bmain, OB_MESH, m_object_name.c_str()); + m_object->data = mesh; - Mesh *read_mesh = this->read_mesh(mesh, sample_sel, MOD_MESHSEQ_READ_ALL, NULL); - if (read_mesh != mesh) { - BKE_mesh_nomain_to_mesh(read_mesh, mesh, m_object, &CD_MASK_MESH, true); - } + Mesh *read_mesh = this->read_mesh(mesh, sample_sel, MOD_MESHSEQ_READ_ALL, NULL); + if (read_mesh != mesh) { + BKE_mesh_nomain_to_mesh(read_mesh, mesh, m_object, &CD_MASK_MESH, true); + } - if (m_settings->validate_meshes) { - BKE_mesh_validate(mesh, false, false); - } + if (m_settings->validate_meshes) { + BKE_mesh_validate(mesh, false, false); + } - readFaceSetsSample(bmain, mesh, 0, sample_sel); + readFaceSetsSample(bmain, mesh, 0, sample_sel); - if (has_animations(m_schema, m_settings)) { - addCacheModifier(); - } + if (has_animations(m_schema, m_settings)) { + addCacheModifier(); + } } -bool AbcMeshReader::accepts_object_type(const Alembic::AbcCoreAbstract::ObjectHeader &alembic_header, - const Object *const ob, - const char **err_str) const +bool AbcMeshReader::accepts_object_type( + const Alembic::AbcCoreAbstract::ObjectHeader &alembic_header, + const Object *const ob, + const char **err_str) const { - if (!Alembic::AbcGeom::IPolyMesh::matches(alembic_header)) { - *err_str = "Object type mismatch, Alembic object path pointed to PolyMesh when importing, but not any more."; - return false; - } - - if (ob->type != OB_MESH) { - *err_str = "Object type mismatch, Alembic object path points to PolyMesh."; - return false; - } - - return true; + if (!Alembic::AbcGeom::IPolyMesh::matches(alembic_header)) { + *err_str = + "Object type mismatch, Alembic object path pointed to PolyMesh when importing, but not " + "any more."; + return false; + } + + if (ob->type != OB_MESH) { + *err_str = "Object type mismatch, Alembic object path points to PolyMesh."; + return false; + } + + return true; } Mesh *AbcMeshReader::read_mesh(Mesh *existing_mesh, @@ -1101,209 +1108,202 @@ Mesh *AbcMeshReader::read_mesh(Mesh *existing_mesh, int read_flag, const char **err_str) { - IPolyMeshSchema::Sample sample; - try { - sample = m_schema.getValue(sample_sel); - } - catch(Alembic::Util::Exception &ex) { - *err_str = "Error reading mesh sample; more detail on the console"; - printf("Alembic: error reading mesh sample for '%s/%s' at time %f: %s\n", - m_iobject.getFullName().c_str(), - m_schema.getName().c_str(), - sample_sel.getRequestedTime(), - ex.what()); - return existing_mesh; - } - - const P3fArraySamplePtr &positions = sample.getPositions(); - const Alembic::Abc::Int32ArraySamplePtr &face_indices = sample.getFaceIndices(); - const Alembic::Abc::Int32ArraySamplePtr &face_counts = sample.getFaceCounts(); - - Mesh *new_mesh = NULL; - - /* Only read point data when streaming meshes, unless we need to create new ones. */ - ImportSettings settings; - settings.read_flag |= read_flag; - - bool topology_changed = positions->size() != existing_mesh->totvert || - face_counts->size() != existing_mesh->totpoly || - face_indices->size() != existing_mesh->totloop; - if (topology_changed) { - new_mesh = BKE_mesh_new_nomain_from_template(existing_mesh, - positions->size(), - 0, - 0, - face_indices->size(), - face_counts->size()); - - settings.read_flag |= MOD_MESHSEQ_READ_ALL; - } - else { - /* If the face count changed (e.g. by triangulation), only read points. - * This prevents crash from T49813. - * TODO(kevin): perhaps find a better way to do this? */ - if (face_counts->size() != existing_mesh->totpoly || - face_indices->size() != existing_mesh->totloop) - { - settings.read_flag = MOD_MESHSEQ_READ_VERT; - - if (err_str) { - *err_str = "Topology has changed, perhaps by triangulating the" - " mesh. Only vertices will be read!"; - } - } - } - - CDStreamConfig config = get_config(new_mesh ? new_mesh : existing_mesh); - config.time = sample_sel.getRequestedTime(); - - bool do_normals = false; - read_mesh_sample(m_iobject.getFullName(), - &settings, m_schema, sample_sel, config, do_normals); - - if (new_mesh) { - /* Check if we had ME_SMOOTH flag set to restore it. */ - if (!do_normals && check_smooth_poly_flag(existing_mesh)) { - set_smooth_poly_flag(new_mesh); - } - - BKE_mesh_calc_normals(new_mesh); - BKE_mesh_calc_edges(new_mesh, false, false); - - /* Here we assume that the number of materials doesn't change, i.e. that - * the material slots that were created when the object was loaded from - * Alembic are still valid now. */ - size_t num_polys = new_mesh->totpoly; - if (num_polys > 0) { - std::map<std::string, int> mat_map; - assign_facesets_to_mpoly(sample_sel, 0, new_mesh->mpoly, num_polys, mat_map); - } - - return new_mesh; - } - - if (do_normals) { - BKE_mesh_calc_normals(existing_mesh); - } - - return existing_mesh; + IPolyMeshSchema::Sample sample; + try { + sample = m_schema.getValue(sample_sel); + } + catch (Alembic::Util::Exception &ex) { + *err_str = "Error reading mesh sample; more detail on the console"; + printf("Alembic: error reading mesh sample for '%s/%s' at time %f: %s\n", + m_iobject.getFullName().c_str(), + m_schema.getName().c_str(), + sample_sel.getRequestedTime(), + ex.what()); + return existing_mesh; + } + + const P3fArraySamplePtr &positions = sample.getPositions(); + const Alembic::Abc::Int32ArraySamplePtr &face_indices = sample.getFaceIndices(); + const Alembic::Abc::Int32ArraySamplePtr &face_counts = sample.getFaceCounts(); + + Mesh *new_mesh = NULL; + + /* Only read point data when streaming meshes, unless we need to create new ones. */ + ImportSettings settings; + settings.read_flag |= read_flag; + + bool topology_changed = positions->size() != existing_mesh->totvert || + face_counts->size() != existing_mesh->totpoly || + face_indices->size() != existing_mesh->totloop; + if (topology_changed) { + new_mesh = BKE_mesh_new_nomain_from_template( + existing_mesh, positions->size(), 0, 0, face_indices->size(), face_counts->size()); + + settings.read_flag |= MOD_MESHSEQ_READ_ALL; + } + else { + /* If the face count changed (e.g. by triangulation), only read points. + * This prevents crash from T49813. + * TODO(kevin): perhaps find a better way to do this? */ + if (face_counts->size() != existing_mesh->totpoly || + face_indices->size() != existing_mesh->totloop) { + settings.read_flag = MOD_MESHSEQ_READ_VERT; + + if (err_str) { + *err_str = + "Topology has changed, perhaps by triangulating the" + " mesh. Only vertices will be read!"; + } + } + } + + CDStreamConfig config = get_config(new_mesh ? new_mesh : existing_mesh); + config.time = sample_sel.getRequestedTime(); + + bool do_normals = false; + read_mesh_sample(m_iobject.getFullName(), &settings, m_schema, sample_sel, config, do_normals); + + if (new_mesh) { + /* Check if we had ME_SMOOTH flag set to restore it. */ + if (!do_normals && check_smooth_poly_flag(existing_mesh)) { + set_smooth_poly_flag(new_mesh); + } + + BKE_mesh_calc_normals(new_mesh); + BKE_mesh_calc_edges(new_mesh, false, false); + + /* Here we assume that the number of materials doesn't change, i.e. that + * the material slots that were created when the object was loaded from + * Alembic are still valid now. */ + size_t num_polys = new_mesh->totpoly; + if (num_polys > 0) { + std::map<std::string, int> mat_map; + assign_facesets_to_mpoly(sample_sel, 0, new_mesh->mpoly, num_polys, mat_map); + } + + return new_mesh; + } + + if (do_normals) { + BKE_mesh_calc_normals(existing_mesh); + } + + return existing_mesh; } -void AbcMeshReader::assign_facesets_to_mpoly( - const ISampleSelector &sample_sel, - size_t poly_start, - MPoly *mpoly, int totpoly, - std::map<std::string, int> & r_mat_map) +void AbcMeshReader::assign_facesets_to_mpoly(const ISampleSelector &sample_sel, + size_t poly_start, + MPoly *mpoly, + int totpoly, + std::map<std::string, int> &r_mat_map) { - std::vector<std::string> face_sets; - m_schema.getFaceSetNames(face_sets); - - if (face_sets.empty()) { - return; - } + std::vector<std::string> face_sets; + m_schema.getFaceSetNames(face_sets); - int current_mat = 0; + if (face_sets.empty()) { + return; + } - for (int i = 0; i < face_sets.size(); ++i) { - const std::string &grp_name = face_sets[i]; + int current_mat = 0; - if (r_mat_map.find(grp_name) == r_mat_map.end()) { - r_mat_map[grp_name] = 1 + current_mat++; - } + for (int i = 0; i < face_sets.size(); ++i) { + const std::string &grp_name = face_sets[i]; - const int assigned_mat = r_mat_map[grp_name]; + if (r_mat_map.find(grp_name) == r_mat_map.end()) { + r_mat_map[grp_name] = 1 + current_mat++; + } - const IFaceSet faceset = m_schema.getFaceSet(grp_name); + const int assigned_mat = r_mat_map[grp_name]; - if (!faceset.valid()) { - std::cerr << " Face set " << grp_name << " invalid for " << m_object_name << "\n"; - continue; - } + const IFaceSet faceset = m_schema.getFaceSet(grp_name); - const IFaceSetSchema face_schem = faceset.getSchema(); - const IFaceSetSchema::Sample face_sample = face_schem.getValue(sample_sel); - const Int32ArraySamplePtr group_faces = face_sample.getFaces(); - const size_t num_group_faces = group_faces->size(); + if (!faceset.valid()) { + std::cerr << " Face set " << grp_name << " invalid for " << m_object_name << "\n"; + continue; + } - for (size_t l = 0; l < num_group_faces; l++) { - size_t pos = (*group_faces)[l] + poly_start; + const IFaceSetSchema face_schem = faceset.getSchema(); + const IFaceSetSchema::Sample face_sample = face_schem.getValue(sample_sel); + const Int32ArraySamplePtr group_faces = face_sample.getFaces(); + const size_t num_group_faces = group_faces->size(); - if (pos >= totpoly) { - std::cerr << "Faceset overflow on " << faceset.getName() << '\n'; - break; - } + for (size_t l = 0; l < num_group_faces; l++) { + size_t pos = (*group_faces)[l] + poly_start; - MPoly &poly = mpoly[pos]; - poly.mat_nr = assigned_mat - 1; - } - } + if (pos >= totpoly) { + std::cerr << "Faceset overflow on " << faceset.getName() << '\n'; + break; + } + MPoly &poly = mpoly[pos]; + poly.mat_nr = assigned_mat - 1; + } + } } -void AbcMeshReader::readFaceSetsSample(Main *bmain, Mesh *mesh, size_t poly_start, +void AbcMeshReader::readFaceSetsSample(Main *bmain, + Mesh *mesh, + size_t poly_start, const ISampleSelector &sample_sel) { - std::map<std::string, int> mat_map; - assign_facesets_to_mpoly(sample_sel, - poly_start, mesh->mpoly, mesh->totpoly, - mat_map); - utils::assign_materials(bmain, m_object, mat_map); + std::map<std::string, int> mat_map; + assign_facesets_to_mpoly(sample_sel, poly_start, mesh->mpoly, mesh->totpoly, mat_map); + utils::assign_materials(bmain, m_object, mat_map); } /* ************************************************************************** */ ABC_INLINE MEdge *find_edge(MEdge *edges, int totedge, int v1, int v2) { - for (int i = 0, e = totedge; i < e; ++i) { - MEdge &edge = edges[i]; + for (int i = 0, e = totedge; i < e; ++i) { + MEdge &edge = edges[i]; - if (edge.v1 == v1 && edge.v2 == v2) { - return &edge; - } - } + if (edge.v1 == v1 && edge.v2 == v2) { + return &edge; + } + } - return NULL; + return NULL; } -static void read_subd_sample(const std::string & iobject_full_name, +static void read_subd_sample(const std::string &iobject_full_name, ImportSettings *settings, const ISubDSchema &schema, const ISampleSelector &selector, CDStreamConfig &config) { - const ISubDSchema::Sample sample = schema.getValue(selector); - - AbcMeshData abc_mesh_data; - abc_mesh_data.face_counts = sample.getFaceCounts(); - abc_mesh_data.face_indices = sample.getFaceIndices(); - abc_mesh_data.vertex_normals = N3fArraySamplePtr(); - abc_mesh_data.face_normals = N3fArraySamplePtr(); - abc_mesh_data.positions = sample.getPositions(); - - get_weight_and_index(config, schema.getTimeSampling(), schema.getNumSamples()); - - if (config.weight != 0.0f) { - Alembic::AbcGeom::ISubDSchema::Sample ceil_sample; - schema.get(ceil_sample, Alembic::Abc::ISampleSelector(config.ceil_index)); - abc_mesh_data.ceil_positions = ceil_sample.getPositions(); - } - - if ((settings->read_flag & MOD_MESHSEQ_READ_UV) != 0) { - read_uvs_params(config, abc_mesh_data, schema.getUVsParam(), selector); - } - - if ((settings->read_flag & MOD_MESHSEQ_READ_VERT) != 0) { - read_mverts(config, abc_mesh_data); - } - - if ((settings->read_flag & MOD_MESHSEQ_READ_POLY) != 0) { - read_mpolys(config, abc_mesh_data); - } - - if ((settings->read_flag & (MOD_MESHSEQ_READ_UV | MOD_MESHSEQ_READ_COLOR)) != 0) { - read_custom_data(iobject_full_name, - schema.getArbGeomParams(), config, selector); - } + const ISubDSchema::Sample sample = schema.getValue(selector); + + AbcMeshData abc_mesh_data; + abc_mesh_data.face_counts = sample.getFaceCounts(); + abc_mesh_data.face_indices = sample.getFaceIndices(); + abc_mesh_data.vertex_normals = N3fArraySamplePtr(); + abc_mesh_data.face_normals = N3fArraySamplePtr(); + abc_mesh_data.positions = sample.getPositions(); + + get_weight_and_index(config, schema.getTimeSampling(), schema.getNumSamples()); + + if (config.weight != 0.0f) { + Alembic::AbcGeom::ISubDSchema::Sample ceil_sample; + schema.get(ceil_sample, Alembic::Abc::ISampleSelector(config.ceil_index)); + abc_mesh_data.ceil_positions = ceil_sample.getPositions(); + } + + if ((settings->read_flag & MOD_MESHSEQ_READ_UV) != 0) { + read_uvs_params(config, abc_mesh_data, schema.getUVsParam(), selector); + } + + if ((settings->read_flag & MOD_MESHSEQ_READ_VERT) != 0) { + read_mverts(config, abc_mesh_data); + } + + if ((settings->read_flag & MOD_MESHSEQ_READ_POLY) != 0) { + read_mpolys(config, abc_mesh_data); + } + + if ((settings->read_flag & (MOD_MESHSEQ_READ_UV | MOD_MESHSEQ_READ_COLOR)) != 0) { + read_custom_data(iobject_full_name, schema.getArbGeomParams(), config, selector); + } } /* ************************************************************************** */ @@ -1311,88 +1311,91 @@ static void read_subd_sample(const std::string & iobject_full_name, AbcSubDReader::AbcSubDReader(const IObject &object, ImportSettings &settings) : AbcObjectReader(object, settings) { - m_settings->read_flag |= MOD_MESHSEQ_READ_ALL; + m_settings->read_flag |= MOD_MESHSEQ_READ_ALL; - ISubD isubd_mesh(m_iobject, kWrapExisting); - m_schema = isubd_mesh.getSchema(); + ISubD isubd_mesh(m_iobject, kWrapExisting); + m_schema = isubd_mesh.getSchema(); - get_min_max_time(m_iobject, m_schema, m_min_time, m_max_time); + get_min_max_time(m_iobject, m_schema, m_min_time, m_max_time); } bool AbcSubDReader::valid() const { - return m_schema.valid(); + return m_schema.valid(); } -bool AbcSubDReader::accepts_object_type(const Alembic::AbcCoreAbstract::ObjectHeader &alembic_header, - const Object *const ob, - const char **err_str) const +bool AbcSubDReader::accepts_object_type( + const Alembic::AbcCoreAbstract::ObjectHeader &alembic_header, + const Object *const ob, + const char **err_str) const { - if (!Alembic::AbcGeom::ISubD::matches(alembic_header)) { - *err_str = "Object type mismatch, Alembic object path pointed to SubD when importing, but not any more."; - return false; - } - - if (ob->type != OB_MESH) { - *err_str = "Object type mismatch, Alembic object path points to SubD."; - return false; - } - - return true; + if (!Alembic::AbcGeom::ISubD::matches(alembic_header)) { + *err_str = + "Object type mismatch, Alembic object path pointed to SubD when importing, but not any " + "more."; + return false; + } + + if (ob->type != OB_MESH) { + *err_str = "Object type mismatch, Alembic object path points to SubD."; + return false; + } + + return true; } void AbcSubDReader::readObjectData(Main *bmain, const Alembic::Abc::ISampleSelector &sample_sel) { - Mesh *mesh = BKE_mesh_add(bmain, m_data_name.c_str()); - - m_object = BKE_object_add_only_object(bmain, OB_MESH, m_object_name.c_str()); - m_object->data = mesh; - - Mesh *read_mesh = this->read_mesh(mesh, sample_sel, MOD_MESHSEQ_READ_ALL, NULL); - if (read_mesh != mesh) { - BKE_mesh_nomain_to_mesh(read_mesh, mesh, m_object, &CD_MASK_MESH, true); - } - - ISubDSchema::Sample sample; - try { - sample = m_schema.getValue(sample_sel); - } - catch(Alembic::Util::Exception &ex) { - printf("Alembic: error reading mesh sample for '%s/%s' at time %f: %s\n", - m_iobject.getFullName().c_str(), - m_schema.getName().c_str(), - sample_sel.getRequestedTime(), - ex.what()); - return; - } - - Int32ArraySamplePtr indices = sample.getCreaseIndices(); - Alembic::Abc::FloatArraySamplePtr sharpnesses = sample.getCreaseSharpnesses(); - - MEdge *edges = mesh->medge; - - if (indices && sharpnesses) { - for (int i = 0, s = 0, e = indices->size(); i < e; i += 2, ++s) { - MEdge *edge = find_edge(edges, mesh->totedge, (*indices)[i], (*indices)[i + 1]); - - if (edge) { - edge->crease = unit_float_to_uchar_clamp((*sharpnesses)[s]); - } - } - - mesh->cd_flag |= ME_CDFLAG_EDGE_CREASE; - } - - BKE_mesh_calc_normals(mesh); - BKE_mesh_calc_edges(mesh, false, false); - - if (m_settings->validate_meshes) { - BKE_mesh_validate(mesh, false, false); - } - - if (has_animations(m_schema, m_settings)) { - addCacheModifier(); - } + Mesh *mesh = BKE_mesh_add(bmain, m_data_name.c_str()); + + m_object = BKE_object_add_only_object(bmain, OB_MESH, m_object_name.c_str()); + m_object->data = mesh; + + Mesh *read_mesh = this->read_mesh(mesh, sample_sel, MOD_MESHSEQ_READ_ALL, NULL); + if (read_mesh != mesh) { + BKE_mesh_nomain_to_mesh(read_mesh, mesh, m_object, &CD_MASK_MESH, true); + } + + ISubDSchema::Sample sample; + try { + sample = m_schema.getValue(sample_sel); + } + catch (Alembic::Util::Exception &ex) { + printf("Alembic: error reading mesh sample for '%s/%s' at time %f: %s\n", + m_iobject.getFullName().c_str(), + m_schema.getName().c_str(), + sample_sel.getRequestedTime(), + ex.what()); + return; + } + + Int32ArraySamplePtr indices = sample.getCreaseIndices(); + Alembic::Abc::FloatArraySamplePtr sharpnesses = sample.getCreaseSharpnesses(); + + MEdge *edges = mesh->medge; + + if (indices && sharpnesses) { + for (int i = 0, s = 0, e = indices->size(); i < e; i += 2, ++s) { + MEdge *edge = find_edge(edges, mesh->totedge, (*indices)[i], (*indices)[i + 1]); + + if (edge) { + edge->crease = unit_float_to_uchar_clamp((*sharpnesses)[s]); + } + } + + mesh->cd_flag |= ME_CDFLAG_EDGE_CREASE; + } + + BKE_mesh_calc_normals(mesh); + BKE_mesh_calc_edges(mesh, false, false); + + if (m_settings->validate_meshes) { + BKE_mesh_validate(mesh, false, false); + } + + if (has_animations(m_schema, m_settings)) { + addCacheModifier(); + } } Mesh *AbcSubDReader::read_mesh(Mesh *existing_mesh, @@ -1400,72 +1403,67 @@ Mesh *AbcSubDReader::read_mesh(Mesh *existing_mesh, int read_flag, const char **err_str) { - ISubDSchema::Sample sample; - try { - sample = m_schema.getValue(sample_sel); - } - catch(Alembic::Util::Exception &ex) { - *err_str = "Error reading mesh sample; more detail on the console"; - printf("Alembic: error reading mesh sample for '%s/%s' at time %f: %s\n", - m_iobject.getFullName().c_str(), - m_schema.getName().c_str(), - sample_sel.getRequestedTime(), - ex.what()); - return existing_mesh; - } - - const P3fArraySamplePtr &positions = sample.getPositions(); - const Alembic::Abc::Int32ArraySamplePtr &face_indices = sample.getFaceIndices(); - const Alembic::Abc::Int32ArraySamplePtr &face_counts = sample.getFaceCounts(); - - Mesh *new_mesh = NULL; - - ImportSettings settings; - settings.read_flag |= read_flag; - - if (existing_mesh->totvert != positions->size()) { - new_mesh = BKE_mesh_new_nomain_from_template(existing_mesh, - positions->size(), - 0, - 0, - face_indices->size(), - face_counts->size()); - - settings.read_flag |= MOD_MESHSEQ_READ_ALL; - } - else { - /* If the face count changed (e.g. by triangulation), only read points. - * This prevents crash from T49813. - * TODO(kevin): perhaps find a better way to do this? */ - if (face_counts->size() != existing_mesh->totpoly || - face_indices->size() != existing_mesh->totpoly) - { - settings.read_flag = MOD_MESHSEQ_READ_VERT; - - if (err_str) { - *err_str = "Topology has changed, perhaps by triangulating the" - " mesh. Only vertices will be read!"; - } - } - } - - /* Only read point data when streaming meshes, unless we need to create new ones. */ - CDStreamConfig config = get_config(new_mesh ? new_mesh : existing_mesh); - config.time = sample_sel.getRequestedTime(); - read_subd_sample(m_iobject.getFullName(), - &settings, m_schema, sample_sel, config); - - if (new_mesh) { - /* Check if we had ME_SMOOTH flag set to restore it. */ - if (check_smooth_poly_flag(existing_mesh)) { - set_smooth_poly_flag(new_mesh); - } - - BKE_mesh_calc_normals(new_mesh); - BKE_mesh_calc_edges(new_mesh, false, false); - - return new_mesh; - } - - return existing_mesh; + ISubDSchema::Sample sample; + try { + sample = m_schema.getValue(sample_sel); + } + catch (Alembic::Util::Exception &ex) { + *err_str = "Error reading mesh sample; more detail on the console"; + printf("Alembic: error reading mesh sample for '%s/%s' at time %f: %s\n", + m_iobject.getFullName().c_str(), + m_schema.getName().c_str(), + sample_sel.getRequestedTime(), + ex.what()); + return existing_mesh; + } + + const P3fArraySamplePtr &positions = sample.getPositions(); + const Alembic::Abc::Int32ArraySamplePtr &face_indices = sample.getFaceIndices(); + const Alembic::Abc::Int32ArraySamplePtr &face_counts = sample.getFaceCounts(); + + Mesh *new_mesh = NULL; + + ImportSettings settings; + settings.read_flag |= read_flag; + + if (existing_mesh->totvert != positions->size()) { + new_mesh = BKE_mesh_new_nomain_from_template( + existing_mesh, positions->size(), 0, 0, face_indices->size(), face_counts->size()); + + settings.read_flag |= MOD_MESHSEQ_READ_ALL; + } + else { + /* If the face count changed (e.g. by triangulation), only read points. + * This prevents crash from T49813. + * TODO(kevin): perhaps find a better way to do this? */ + if (face_counts->size() != existing_mesh->totpoly || + face_indices->size() != existing_mesh->totpoly) { + settings.read_flag = MOD_MESHSEQ_READ_VERT; + + if (err_str) { + *err_str = + "Topology has changed, perhaps by triangulating the" + " mesh. Only vertices will be read!"; + } + } + } + + /* Only read point data when streaming meshes, unless we need to create new ones. */ + CDStreamConfig config = get_config(new_mesh ? new_mesh : existing_mesh); + config.time = sample_sel.getRequestedTime(); + read_subd_sample(m_iobject.getFullName(), &settings, m_schema, sample_sel, config); + + if (new_mesh) { + /* Check if we had ME_SMOOTH flag set to restore it. */ + if (check_smooth_poly_flag(existing_mesh)) { + set_smooth_poly_flag(new_mesh); + } + + BKE_mesh_calc_normals(new_mesh); + BKE_mesh_calc_edges(new_mesh, false, false); + + return new_mesh; + } + + return existing_mesh; } |