[Bf-blender-cvs] [aaa6391] alembic_basic_io: Reading material groups now works again.
Kévin Dietrich
noreply at git.blender.org
Tue May 24 17:06:27 CEST 2016
Commit: aaa6391453c2e3f7043a7d695c29ba9cad0f99b3
Author: Kévin Dietrich
Date: Tue May 24 16:58:49 2016 +0200
Branches: alembic_basic_io
https://developer.blender.org/rBaaa6391453c2e3f7043a7d695c29ba9cad0f99b3
Reading material groups now works again.
It does not read material data as those aren't typically written in .abc
archives, so the materials added only have default values.
===================================================================
M source/blender/alembic/intern/abc_mesh.cc
M source/blender/alembic/intern/abc_mesh.h
===================================================================
diff --git a/source/blender/alembic/intern/abc_mesh.cc b/source/blender/alembic/intern/abc_mesh.cc
index a466216..a2b093f 100644
--- a/source/blender/alembic/intern/abc_mesh.cc
+++ b/source/blender/alembic/intern/abc_mesh.cc
@@ -41,6 +41,7 @@ extern "C" {
#include "BKE_DerivedMesh.h"
#include "BKE_depsgraph.h"
+#include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
@@ -59,6 +60,8 @@ using Alembic::Abc::P3fArraySamplePtr;
using Alembic::Abc::V2fArraySample;
using Alembic::Abc::V3fArraySample;
+using Alembic::AbcGeom::IFaceSet;
+using Alembic::AbcGeom::IFaceSetSchema;
using Alembic::AbcGeom::IObject;
using Alembic::AbcGeom::IPolyMesh;
using Alembic::AbcGeom::IPolyMeshSchema;
@@ -1062,10 +1065,8 @@ static void mesh_add_mpolygons(Mesh *mesh, size_t len)
} /* mesh_utils */
-#if 0
-static Material *findMaterial(const char *name)
+static Material *findMaterial(Main *bmain, const char *name)
{
- Main *bmain = G.main;
Material *material, *found_material = NULL;
for (material = (Material*)bmain->mat.first; material; material = (Material*)material->id.next) {
@@ -1079,46 +1080,43 @@ static Material *findMaterial(const char *name)
return found_material;
}
-static void ABC_apply_materials(Object *ob, void *key)
+static void ABC_apply_materials(Main *bmain, Object *ob, const std::map<std::string, int> &mat_map)
{
- AbcInfo &meshmap = abc_manager->mesh_map[key];
-
/* Clean up slots */
while (object_remove_material_slot(ob));
bool can_assign = true;
- std::map<std::string, int>::iterator it = meshmap.mat_map.begin();
+ std::map<std::string, int>::const_iterator it = mat_map.begin();
+
int matcount = 0;
- for (; it != abc_manager->mesh_map[key].mat_map.end(); ++it, matcount++) {
+ for (; it != mat_map.end(); ++it, ++matcount) {
Material *curmat = give_current_material(ob, matcount);
- if (curmat == NULL) {
- if (!object_add_material_slot(ob)) {
- can_assign = false;
- break;
- }
+
+ if (curmat != NULL) {
+ continue;
+ }
+
+ if (!object_add_material_slot(ob)) {
+ can_assign = false;
+ break;
}
}
if (can_assign) {
- it = abc_manager->mesh_map[key].mat_map.begin();
- for (; it != meshmap.mat_map.end(); ++it) {
+ it = mat_map.begin();
- Material *assigned_name;
+ for (; it != mat_map.end(); ++it) {
std::string mat_name = it->first;
+ Material *assigned_name = findMaterial(bmain, mat_name.c_str());
- if (findMaterial(mat_name.c_str()) != NULL) {//meshmap.materials.find(mat_name) != meshmap.materials.end()) {
- assigned_name = findMaterial(mat_name.c_str());//meshmap.materials[mat_name];
- }
- else {
- assigned_name = BKE_material_add(G.main, mat_name.c_str());
- meshmap.materials[mat_name] = assigned_name;
+ if (assigned_name == NULL) {
+ assigned_name = BKE_material_add(bmain, mat_name.c_str());
}
assign_material(ob, assigned_name, it->second, BKE_MAT_ASSIGN_OBJECT);
}
}
}
-#endif
AbcMeshReader::AbcMeshReader(const IObject &object, ImportSettings &settings)
: AbcObjectReader(object, settings)
@@ -1136,9 +1134,9 @@ void AbcMeshReader::readObjectData(Main *bmain, Scene *scene, float time)
{
Mesh *blender_mesh = BKE_mesh_add(bmain, m_data_name.c_str());
- size_t idx_pos = blender_mesh->totpoly;
- size_t vtx_pos = blender_mesh->totvert;
- size_t loop_pos = blender_mesh->totloop;
+ const size_t idx_pos = blender_mesh->totpoly;
+ const size_t vtx_pos = blender_mesh->totvert;
+ const size_t loop_pos = blender_mesh->totloop;
IV2fGeomParam uv = m_schema.getUVsParam();
ISampleSelector sample_sel(time);
@@ -1210,44 +1208,6 @@ void AbcMeshReader::readObjectData(Main *bmain, Scene *scene, float time)
}
}
- /* TODO */
-#if 0
- if (assign_mat) {
- std::map<std::string, int> &mat_map = abc_manager->mesh_map[key].mat_map;
- int ¤t_mat = abc_manager->mesh_map[key].current_mat;
-
- for (int i = 0; i < face_sets.size(); ++i) {
- std::string grp_name = face_sets[i];
-
- if (mat_map.find(grp_name) == mat_map.end()) {
- mat_map[grp_name] = 1 + current_mat++;
- }
-
- int assigned_mat = mat_map[grp_name];
-
- IFaceSet faceset = m_schema.getFaceSet(face_sets[i]);
- if (!faceset.valid())
- continue;
- IFaceSetSchema face_schem = faceset.getSchema();
- IFaceSetSchema::Sample face_sample = face_schem.getValue(sample_sel);
- Int32ArraySamplePtr group_faces = face_sample.getFaces();
- size_t num_group_faces = group_faces->size();
-
- for (size_t l = 0; l < num_group_faces; l++) {
- size_t pos = (*group_faces)[l]+idx_pos;
-
- if (pos >= blender_mesh->totpoly) {
- std::cerr << "Faceset overflow on " << faceset.getName() << std::endl;
- break;
- }
-
- MPoly &poly = blender_mesh->mpoly[pos];
- poly.mat_nr = assigned_mat - 1;
- }
- }
- }
-#endif
-
BKE_mesh_validate(blender_mesh, false, false);
m_object = BKE_object_add(bmain, scene, OB_MESH, m_object_name.c_str());
@@ -1267,12 +1227,60 @@ void AbcMeshReader::readObjectData(Main *bmain, Scene *scene, float time)
BLI_strncpy(mcmd->filepath, m_iobject.getArchive().getName().c_str(), 1024);
BLI_strncpy(mcmd->sub_object, m_iobject.getFullName().c_str(), 1024);
- /* TODO: add materials */
-#if 0
- if (apply_materials) {
- ABC_apply_materials(m_object, NULL);
+ /* TODO: expose this as a setting to the user? */
+ const bool assign_mat = true;
+
+ if (assign_mat) {
+ readFaceSets(bmain, blender_mesh, idx_pos, sample_sel);
+ }
+}
+
+void AbcMeshReader::readFaceSets(Main *bmain, Mesh *mesh, size_t idx_pos, const ISampleSelector &sample_sel)
+{
+ std::vector<std::string> face_sets;
+ m_schema.getFaceSetNames(face_sets);
+
+ if (face_sets.empty()) {
+ return;
}
-#endif
+
+ std::map<std::string, int> mat_map;
+ int current_mat = 0;
+
+ for (int i = 0; i < face_sets.size(); ++i) {
+ const std::string &grp_name = face_sets[i];
+
+ if (mat_map.find(grp_name) == mat_map.end()) {
+ mat_map[grp_name] = 1 + current_mat++;
+ }
+
+ const int assigned_mat = mat_map[grp_name];
+
+ const IFaceSet faceset = m_schema.getFaceSet(grp_name);
+
+ if (!faceset.valid()) {
+ continue;
+ }
+
+ 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();
+
+ for (size_t l = 0; l < num_group_faces; l++) {
+ size_t pos = (*group_faces)[l] + idx_pos;
+
+ if (pos >= mesh->totpoly) {
+ std::cerr << "Faceset overflow on " << faceset.getName() << '\n';
+ break;
+ }
+
+ MPoly &poly = mesh->mpoly[pos];
+ poly.mat_nr = assigned_mat - 1;
+ }
+ }
+
+ ABC_apply_materials(bmain, m_object, mat_map);
}
AbcEmptyReader::AbcEmptyReader(const Alembic::Abc::IObject &object, ImportSettings &settings)
diff --git a/source/blender/alembic/intern/abc_mesh.h b/source/blender/alembic/intern/abc_mesh.h
index 3887315..3875fa2 100644
--- a/source/blender/alembic/intern/abc_mesh.h
+++ b/source/blender/alembic/intern/abc_mesh.h
@@ -26,6 +26,7 @@
#include "abc_shape.h"
struct DerivedMesh;
+struct Mesh;
struct ModifierData;
class AbcMeshWriter : public AbcShapeWriter {
@@ -112,6 +113,8 @@ public:
bool valid() const;
void readObjectData(Main *bmain, Scene *scene, float time);
+ void readFaceSets(Main *bmain, Mesh *mesh, size_t idx_pos,
+ const Alembic::AbcGeom::ISampleSelector &sample_sel);
};
class AbcEmptyReader : public AbcObjectReader {
More information about the Bf-blender-cvs
mailing list