[Bf-blender-cvs] [6ac889f] alembic_pointcache: Alembic reading in the Mesh Cache modifier.
Lukas Tönne
noreply at git.blender.org
Fri Oct 17 15:19:55 CEST 2014
Commit: 6ac889f2b3ab26ee39b93ccafb728cc0e7611ba0
Author: Lukas Tönne
Date: Fri Oct 17 15:09:05 2014 +0200
Branches: alembic_pointcache
https://developer.blender.org/rB6ac889f2b3ab26ee39b93ccafb728cc0e7611ba0
Alembic reading in the Mesh Cache modifier.
Note that this only works with deformation atm.
===================================================================
M source/blender/modifiers/CMakeLists.txt
M source/blender/modifiers/intern/MOD_meshcache.c
M source/blender/pointcache/PTC_api.cpp
M source/blender/pointcache/PTC_api.h
M source/blender/pointcache/intern/mesh.cpp
M source/blender/pointcache/intern/mesh.h
===================================================================
diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt
index 06e9f8f..18f8f12 100644
--- a/source/blender/modifiers/CMakeLists.txt
+++ b/source/blender/modifiers/CMakeLists.txt
@@ -33,6 +33,7 @@ set(INC
../makesdna
../makesrna
../bmesh
+ ../pointcache
../render/extern/include
../../../intern/elbeem/extern
../../../intern/guardedalloc
diff --git a/source/blender/modifiers/intern/MOD_meshcache.c b/source/blender/modifiers/intern/MOD_meshcache.c
index 1900856..9520884 100644
--- a/source/blender/modifiers/intern/MOD_meshcache.c
+++ b/source/blender/modifiers/intern/MOD_meshcache.c
@@ -43,6 +43,8 @@
#include "BKE_main.h"
#include "BKE_pointcache.h"
+#include "PTC_api.h"
+
#include "MEM_guardedalloc.h"
#include "MOD_meshcache_util.h" /* utility functions */
@@ -100,6 +102,33 @@ static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams))
}
+static bool MOD_meshcache_read_alembic_times(struct PTCReader *reader,
+ float (*vertexCos)[3], const int verts_tot, const char UNUSED(interp),
+ const float time, const float UNUSED(fps), const char UNUSED(time_mode),
+ const char **err_str)
+{
+ DerivedMesh *result;
+
+ if (PTC_read_sample(reader, time) == PTC_READ_SAMPLE_INVALID) {
+ *err_str = "Cannot read Alembic cache file";
+ return false;
+ }
+
+ result = PTC_reader_mesh_cache_acquire_result(reader);
+ if (result->getNumVerts(result) != verts_tot) {
+ result->needsFree = 1;
+ result->release(result);
+
+ *err_str = "Cache file vertex count mismatch";
+ return false;
+ }
+
+ result->getVertCos(result, vertexCos);
+ result->release(result);
+
+ return true;
+}
+
static void meshcache_do(
MeshCacheModifierData *mcmd, Object *ob, DerivedMesh *UNUSED(dm),
float (*vertexCos_Real)[3], int numVerts)
@@ -184,6 +213,13 @@ static void meshcache_do(
ok = MOD_meshcache_read_pc2_times(filepath, vertexCos, numVerts,
mcmd->interp, time, fps, mcmd->time_mode, &err_str);
break;
+ case MOD_MESHCACHE_TYPE_ALEMBIC_HDF5: {
+ struct PTCReader *reader = PTC_reader_mesh_cache(scene, ob, mcmd);
+ ok = MOD_meshcache_read_alembic_times(reader, vertexCos, numVerts,
+ mcmd->interp, time, fps, mcmd->time_mode, &err_str);
+ PTC_reader_free(reader);
+ break;
+ }
default:
ok = false;
break;
diff --git a/source/blender/pointcache/PTC_api.cpp b/source/blender/pointcache/PTC_api.cpp
index e2b4ca6..999c4e2 100644
--- a/source/blender/pointcache/PTC_api.cpp
+++ b/source/blender/pointcache/PTC_api.cpp
@@ -264,6 +264,18 @@ PTCReader *PTC_reader_mesh_cache(Scene *scene, Object *ob, MeshCacheModifierData
return (PTCReader *)(new PTC::MeshCacheReader(scene, ob, mcmd));
}
+struct DerivedMesh *PTC_reader_mesh_cache_acquire_result(PTCReader *_reader)
+{
+ PTC::MeshCacheReader *reader = (PTC::MeshCacheReader *)_reader;
+ return reader->acquire_result();
+}
+
+void PTC_reader_mesh_cache_discard_result(PTCReader *_reader)
+{
+ PTC::MeshCacheReader *reader = (PTC::MeshCacheReader *)_reader;
+ reader->discard_result();
+}
+
#else
void PTC_writer_free(PTCWriter *_writer)
diff --git a/source/blender/pointcache/PTC_api.h b/source/blender/pointcache/PTC_api.h
index 9412326..0b7ffc4 100644
--- a/source/blender/pointcache/PTC_api.h
+++ b/source/blender/pointcache/PTC_api.h
@@ -92,6 +92,8 @@ struct PTCReader *PTC_reader_dynamicpaint(struct Scene *scene, struct Object *ob
/* Mesh Cache Modifier */
struct PTCWriter *PTC_writer_mesh_cache(struct Scene *scene, struct Object *ob, struct MeshCacheModifierData *mcmd);
struct PTCReader *PTC_reader_mesh_cache(struct Scene *scene, struct Object *ob, struct MeshCacheModifierData *mcmd);
+struct DerivedMesh *PTC_reader_mesh_cache_acquire_result(struct PTCReader *reader);
+void PTC_reader_mesh_cache_discard_result(struct PTCReader *reader);
#ifdef __cplusplus
} /* extern C */
diff --git a/source/blender/pointcache/intern/mesh.cpp b/source/blender/pointcache/intern/mesh.cpp
index 3ed43cf..a1d41ea 100644
--- a/source/blender/pointcache/intern/mesh.cpp
+++ b/source/blender/pointcache/intern/mesh.cpp
@@ -19,12 +19,15 @@
#include "mesh.h"
extern "C" {
+#include "BLI_math.h"
+
#include "DNA_object_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
#include "BKE_DerivedMesh.h"
+#include "BKE_cdderivedmesh.h"
}
namespace PTC {
@@ -94,7 +97,8 @@ void MeshCacheWriter::write_sample()
MeshCacheReader::MeshCacheReader(Scene *scene, Object *ob, MeshCacheModifierData *mcmd) :
Reader(scene, &ob->id, mcmd->point_cache),
m_ob(ob),
- m_mcmd(mcmd)
+ m_mcmd(mcmd),
+ m_result(NULL)
{
if (m_archive.valid()) {
IObject root = m_archive.getTop();
@@ -108,36 +112,68 @@ MeshCacheReader::~MeshCacheReader()
PTCReadSampleResult MeshCacheReader::read_sample(float frame)
{
-#if 0
+ /* discard existing result data */
+ discard_result();
+
if (!m_mesh.valid())
return PTC_READ_SAMPLE_INVALID;
IPolyMeshSchema &schema = m_mesh.getSchema();
- TimeSamplingPtr ts = schema.getTimeSampling();
+// TimeSamplingPtr ts = schema.getTimeSampling();
ISampleSelector ss = get_frame_sample_selector(frame);
- chrono_t time = ss.getRequestedTime();
+// chrono_t time = ss.getRequestedTime();
- std::pair<index_t, chrono_t> sres = ts->getFloorIndex(time, schema.getNumSamples());
- chrono_t stime = sres.second;
- float sframe = time_to_frame(stime);
+// std::pair<index_t, chrono_t> sres = ts->getFloorIndex(time, schema.getNumSamples());
+// chrono_t stime = sres.second;
+// float sframe = time_to_frame(stime);
IPolyMeshSchema::Sample sample;
schema.get(sample, ss);
- const V3f *positions = sample.getPositions()->get();
- int i, totvert = m_dm->getNumVerts(m_dm);
- MVert *mverts = m_dm->getVertArray(m_dm);
-// for (i = 0, pa = m_psys->particles; i < sample.getPositions()->size(); ++i, ++pa) {
-// pa->state.co[0] = positions[i].x;
-// pa->state.co[1] = positions[i].y;
-// pa->state.co[2] = positions[i].z;
-// }
+ P3fArraySamplePtr positions = sample.getPositions();
+ Int32ArraySamplePtr indices = sample.getFaceIndices();
+ Int32ArraySamplePtr counts = sample.getFaceCounts();
+ int totverts = positions->size();
+ int totloops = indices->size();
+ int totpolys = counts->size();
+
+ m_result = CDDM_new(totverts, 0, 0, totloops, totpolys);
+ MVert *mv, *mverts = m_result->getVertArray(m_result);
+ MLoop *ml, *mloops = m_result->getLoopArray(m_result);
+ MPoly *mp, *mpolys = m_result->getPolyArray(m_result);
+ int i;
+
+ const V3f *positions_data = positions->get();
+ for (i = 0, mv = mverts; i < totverts; ++i, ++mv) {
+ const V3f &co = positions_data[i];
+ copy_v3_v3(mv->co, co.getValue());
+ }
+ const int32_t *indices_data = indices->get();
+ for (i = 0, ml = mloops; i < totloops; ++i, ++ml) {
+ ml->v = indices_data[i];
+ }
+ const int32_t *counts_data = counts->get();
+ for (i = 0, mp = mpolys; i < totpolys; ++i, ++mp) {
+ mp->totloop = counts_data[i];
+ }
return PTC_READ_SAMPLE_EXACT;
-#else
- return PTC_READ_SAMPLE_INVALID;
-#endif
+}
+
+DerivedMesh *MeshCacheReader::acquire_result()
+{
+ DerivedMesh *dm = m_result;
+ m_result = NULL;
+ return dm;
+}
+
+void MeshCacheReader::discard_result()
+{
+ if (m_result) {
+ m_result->release(m_result);
+ m_result = NULL;
+ }
}
} /* namespace PTC */
diff --git a/source/blender/pointcache/intern/mesh.h b/source/blender/pointcache/intern/mesh.h
index 3efa5fb..0637962 100644
--- a/source/blender/pointcache/intern/mesh.h
+++ b/source/blender/pointcache/intern/mesh.h
@@ -51,6 +51,9 @@ public:
MeshCacheReader(Scene *scene, Object *ob, MeshCacheModifierData *mcmd);
~MeshCacheReader();
+ DerivedMesh *acquire_result();
+ void discard_result();
+
PTCReadSampleResult read_sample(float frame);
private:
@@ -58,6 +61,8 @@ private:
MeshCacheModifierData *m_mcmd;
AbcGeom::IPolyMesh m_mesh;
+
+ DerivedMesh *m_result;
};
} /* namespace PTC */
More information about the Bf-blender-cvs
mailing list