[Bf-blender-cvs] [b7cd6eb] alembic_basic_io: Simplify 'vertex cache' lookup logic.
Kévin Dietrich
noreply at git.blender.org
Wed Apr 6 23:52:35 CEST 2016
Commit: b7cd6eb2d2375199d5e0c8620228ad6b1ca2f274
Author: Kévin Dietrich
Date: Wed Apr 6 22:16:57 2016 +0200
Branches: alembic_basic_io
https://developer.blender.org/rBb7cd6eb2d2375199d5e0c8620228ad6b1ca2f274
Simplify 'vertex cache' lookup logic.
===================================================================
M source/blender/alembic/ABC_alembic.h
M source/blender/alembic/intern/alembic_capi.cc
M source/blender/modifiers/intern/MOD_meshcache.c
M source/blender/modifiers/intern/MOD_meshcache_abc.c
M source/blender/modifiers/intern/MOD_meshcache_util.h
===================================================================
diff --git a/source/blender/alembic/ABC_alembic.h b/source/blender/alembic/ABC_alembic.h
index 716d1c7..bf57c1e 100644
--- a/source/blender/alembic/ABC_alembic.h
+++ b/source/blender/alembic/ABC_alembic.h
@@ -50,7 +50,7 @@ int ABC_export(struct Scene *sce, const char *filename,
void ABC_import(struct bContext *C, const char *filename, int from_forward, int from_up);
-void ABC_get_vertex_cache(const char *filepath, float time, void *key, void *verts, int max_verts, const char *sub_obj, int is_mvert);
+void ABC_get_vertex_cache(const char *filepath, float time, void *verts, int max_verts, const char *sub_obj, int is_mvert);
void ABC_destroy_mesh_data(void *key);
diff --git a/source/blender/alembic/intern/alembic_capi.cc b/source/blender/alembic/intern/alembic_capi.cc
index 9e05812..431e442 100644
--- a/source/blender/alembic/intern/alembic_capi.cc
+++ b/source/blender/alembic/intern/alembic_capi.cc
@@ -346,27 +346,7 @@ static void ABC_mutex_unlock()
{
BLI_mutex_unlock(abc_manager->mutex);
}
-#endif
-
-static void visitObject(IObject iObj, std::vector< std::pair<IPolyMeshSchema, IObject> > &schemas, std::string sub_obj)
-{
- if (!iObj.valid())
- return;
- IObject ret;
- bool found = false;
-
- abc_manager->visitObjects(iObj, ret, sub_obj, found);
- const MetaData &md = ret.getMetaData();
-
- if (IPolyMesh::matches(md) && found) {
- IPolyMesh abc_mesh(ret, kWrapExisting);
- IPolyMeshSchema schem = abc_mesh.getSchema();
- schemas.push_back(std::pair<IPolyMeshSchema, IObject>(schem, ret));
- }
-}
-
-#if 0
static void visitObjectMatrix(IObject iObj, std::string abc_subobject, float time, float mat[][4])
{
if (!iObj.valid())
@@ -524,66 +504,7 @@ static void getIObjectAsMesh(std::pair<IPolyMeshSchema, IObject> schema,
// Compute edge array is done here
BKE_mesh_validate(blender_mesh, false, false);
}
-#endif
-
-static size_t updatePoints(std::pair<IPolyMeshSchema, IObject> schema, const ISampleSelector &sample_sel, MVert *verts, size_t vtx_start, int max_verts = -1, float (*vcos)[3] = 0) {
-
- if (!schema.first.valid()) {
- return vtx_start;
- }
-
- IPolyMeshSchema::Sample smp = schema.first.getValue(sample_sel);
- P3fArraySamplePtr positions = smp.getPositions();
-
- const size_t vertex_count = positions->size();
-
- // We don't want to overflow the buffer !
- if (max_verts > 0) {
- if ((vtx_start + vertex_count) > max_verts)
- return vtx_start;
- }
-
- if (verts) {
- int j = vtx_start;
- for (int i = 0; i < vertex_count; ++i, ++j) {
- Imath::V3f pos_in = (*positions)[i];
-
- // swap from Y-Up to Z-Up
- verts[j].co[0] = pos_in[0];
- verts[j].co[1] = -pos_in[2];
- verts[j].co[2] = pos_in[1];
- }
- }
- else if (vcos) {
- int j = vtx_start;
- for (int i = 0; i < vertex_count; ++i, ++j) {
- Imath::V3f pos_in = (*positions)[i];
-
- // swap from Y-Up to Z-Up
- vcos[j][0] = pos_in[0];
- vcos[j][1] = -pos_in[2];
- vcos[j][2] = pos_in[1];
- }
- }
-
- return vtx_start + vertex_count;
-}
-
-void ABC_destroy_mesh_data(void *key)
-{
- if (abc_manager->mesh_map.find(key) != abc_manager->mesh_map.end()) {
- AbcInfo *info = &abc_manager->mesh_map[key];
-
- if (info->mesh) {
- BKE_mesh_free(info->mesh, true);
- }
-
- info->schema_cache.clear();
- info->mesh = NULL;
- }
-}
-#if 0
static void ABC_destroy_key(void *key)
{
MeshMap::iterator it;
@@ -708,87 +629,156 @@ static void ABC_apply_materials(Object *ob, void *key)
}
#endif
-void ABC_get_vertex_cache(const char *filepath, float time, void *key, void *verts, int max_verts, const char *sub_obj, int is_mverts)
+static size_t updatePoints(std::pair<IPolyMeshSchema, IObject> schema,
+ const ISampleSelector &sample_sel,
+ MVert *verts, size_t vtx_start, int max_verts = -1,
+ float (*vcos)[3] = 0)
{
- std::string file_path = filepath;
- std::string sub_object = sub_obj;
+ if (!schema.first.valid()) {
+ return vtx_start;
+ }
+
+ IPolyMeshSchema::Sample smp = schema.first.getValue(sample_sel);
+ P3fArraySamplePtr positions = smp.getPositions();
+
+ const size_t vertex_count = positions->size();
+
+ /* don't overflow the buffer! */
+ if (max_verts > 0) {
+ if ((vtx_start + vertex_count) > max_verts)
+ return vtx_start;
+ }
- if (file_path.empty()) {
- std::cerr << __func__ << ": file path is empty!\n";
+ if (verts) {
+ int j = vtx_start;
+ for (int i = 0; i < vertex_count; ++i, ++j) {
+ Imath::V3f pos_in = (*positions)[i];
+
+ verts[j].co[0] = pos_in[0];
+ verts[j].co[1] = pos_in[1];
+ verts[j].co[2] = pos_in[2];
+ }
+ }
+ else if (vcos) {
+ int j = vtx_start;
+ for (int i = 0; i < vertex_count; ++i, ++j) {
+ Imath::V3f pos_in = (*positions)[i];
+
+ vcos[j][0] = pos_in[0];
+ vcos[j][1] = pos_in[1];
+ vcos[j][2] = pos_in[2];
+ }
+ }
+
+ return vtx_start + vertex_count;
+}
+
+void ABC_destroy_mesh_data(void *key)
+{
+ if (abc_manager->mesh_map.find(key) != abc_manager->mesh_map.end()) {
+ AbcInfo *info = &abc_manager->mesh_map[key];
+
+ if (info->mesh) {
+ BKE_mesh_free(info->mesh, true);
+ }
+
+ info->schema_cache.clear();
+ info->mesh = NULL;
+ }
+}
+
+static void find_mesh_object(const IObject &object, IObject &ret,
+ const std::string &name, bool &found)
+{
+ if (!object.valid()) {
return;
}
- IArchive *archive = abc_manager->getArchive(file_path);
+ std::vector<std::string> tokens;
+ split(name, "/", tokens);
+
+ IObject tmp = object;
+
+ std::vector<std::string>::iterator iter;
+ for (iter = tokens.begin(); iter != tokens.end(); ++iter) {
+ IObject child = tmp.getChild(*iter);
+
+ if (!child.valid()) {
+ continue;
+ }
+
+ const MetaData &md = child.getMetaData();
+
+ if (IPolyMesh::matches(md)) {
+ ret = child;
+ found = true;
+ return;
+ }
+
+ tmp = child;
+ }
+}
+
+void ABC_get_vertex_cache(const char *filepath, float time, void *verts,
+ int max_verts, const char *sub_obj, int is_mverts)
+{
+ IArchive *archive = abc_manager->getArchive(filepath);
if (!archive || !archive->valid()) {
return;
}
- IObject iObj = archive->getTop();
+ IObject object = archive->getTop();
- if (!iObj.valid()) {
+ if (!object.valid()) {
return;
}
- MeshMap::iterator mit = abc_manager->mesh_map_cache.find(key);
+ IObject mesh_obj;
+ bool found = false;
- if (mit == abc_manager->mesh_map_cache.end()) {
- AbcInfo info;
- info.filename = file_path;
- info.sub_object = sub_object;
- visitObject(iObj, info.schema_cache, sub_object);
- abc_manager->mesh_map_cache[key] = info;
- }
- else if (mit->second.filename != file_path || mit->second.sub_object != sub_object) {
- if (mit->second.mesh)
- BKE_mesh_free(mit->second.mesh, true);
- AbcInfo info;
- info.filename = file_path;
- info.sub_object = sub_object;
- visitObject(iObj, info.schema_cache, sub_object);
- abc_manager->mesh_map_cache[key] = info;
+ find_mesh_object(object, mesh_obj, sub_obj, found);
+
+ if (!found) {
+ return;
}
+ IPolyMesh mesh(mesh_obj, kWrapExisting);
+ IPolyMeshSchema schema = mesh.getSchema();
ISampleSelector sample_sel(time);
- std::vector< std::pair<IPolyMeshSchema, IObject> >::iterator it;
- size_t vtx_count = 0;
- for (it = abc_manager->mesh_map_cache[key].schema_cache.begin(); it != abc_manager->mesh_map_cache[key].schema_cache.end(); ++it) {
- if (is_mverts)
- vtx_count = updatePoints(*it, sample_sel, (MVert*)verts, vtx_count, max_verts, NULL);
- else {
- float (*vcos)[3] = static_cast<float (*)[3]>(verts);
- vtx_count = updatePoints(*it, sample_sel, NULL, vtx_count, max_verts, vcos);
- }
+ if (is_mverts) {
+ updatePoints(std::pair<IPolyMeshSchema, IObject>(schema, mesh_obj),
+ sample_sel, (MVert *)verts, 0, max_verts, NULL);
+ }
+ else {
+ float (*vcos)[3] = static_cast<float (*)[3]>(verts);
+ updatePoints(std::pair<IPolyMeshSchema, IObject>(schema, mesh_obj),
+ sample_sel, NULL, 0, max_verts, vcos);
}
}
int ABC_check_subobject_valid(const char *name, const char *sub_obj)
{
- if (name[0] == '\0')
+ if ((name[0] == '\0') || (sub_obj[0] == '\0')) {
return 0;
+ }
IArchive *archive = abc_manager->getArchive(name);
if (!archive) {
- std::cerr << "Couldn't find archive!\n";
return 0;
}
if (!archive->valid()) {
- std::cerr << "Alembic archive is not valid!\n";
- return 0;
- }
-
- if (sub_obj[0] == '\0') {
- std::cerr << "Subobject name is empty!\n";
return 0;
}
bool found = false;
- abc_manager->getObject(name, sub_obj, found);
+ IObject ob;
+ find_mesh_object(archive->getTop(), ob, sub_obj, found);
- return found;
+ return (found && ob.valid());
}
int ABC_export(Scene *sce, const char *filename,
diff --git a/source/blender/modifiers/intern/MOD_meshcache.c b/source/blender/modifiers/intern/MOD_meshcache.c
index 30a3402..f818320 100644
--- a/source/blender/modifiers/intern/MOD_meshcache.c
+++ b/source/blender/modifiers/intern/MOD_meshcache.c
@@ -109,7 +109,7 @@ static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams))
static void meshcache_do(
MeshCacheModifierData *mcmd, Object *ob, DerivedMesh *UNUSED(dm),
- float (*vertexCos_Real)[3], int numVerts, ModifierData *md)
+ float (*vertexCos_Real)[3], int numVerts)
{
const bool use_factor = mcmd->factor < 1.0f;
float (*vertexCos_Store)[3] = (use_factor || (mcmd->deform_mode == MOD_MESHCACHE_DEFORM_INTEGRATE)) ?
@@ -195,7 +195,7 @@ static void meshcache_do(
/* TODO(kevin): we pass the modifierdata since it is used as a key
* to map abc archives to modifiers */
ok = MOD_meshcache_read_abc_times(filepath, mcmd->sub_object, vertexCos, numVerts,
- mcmd->interp, time, fps, mcmd->time_mode, &err_str, md);
+ mcmd->interp, time, fps, mcmd->time_mode, &err_str);
break;
default:
ok = false;
@@ -305,7 +305,7 @@ static void deformVerts(ModifierData *md, Object *ob,
{
MeshCacheModifierData *mcmd = (MeshCacheModifierData *)md;
- meshcache_do(mcmd, ob, derivedData, vertexCos, numVerts, md);
+ meshcache_do(mcmd, ob, derivedData, vertexCos, numVerts);
}
static void deformVertsEM(
@@ -314,7 +314,7 @@ static void
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list