[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