[Bf-blender-cvs] [7859dde] alembic_pointcache: Basic reader class.

Lukas Tönne noreply at git.blender.org
Thu Oct 16 16:52:44 CEST 2014


Commit: 7859dde7fe3c6159d438b3a4bdea081d7a1faf1a
Author: Lukas Tönne
Date:   Wed Oct 16 15:30:48 2013 +0200
Branches: alembic_pointcache
https://developer.blender.org/rB7859dde7fe3c6159d438b3a4bdea081d7a1faf1a

Basic reader class.

===================================================================

M	source/blender/blenkernel/intern/particle_system.c
M	source/blender/blenkernel/intern/pointcache.c
M	source/blender/makesdna/DNA_object_force.h
M	source/blender/pointcache/PTC_api.cpp
M	source/blender/pointcache/PTC_api.h
M	source/blender/pointcache/intern/particles.cpp
M	source/blender/pointcache/intern/particles.h
M	source/blender/pointcache/intern/reader.cpp
M	source/blender/pointcache/intern/reader.h
M	source/blender/pointcache/intern/writer.h

===================================================================

diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index 287c27e..6b42c5d 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -4784,8 +4784,6 @@ static void system_step(ParticleSimulationData *sim, float cfra)
 		BKE_ptcache_validate(cache, (int)cache_cfra);
 		if ((int)cache_cfra != startframe)
 			BKE_ptcache_write(pid, (int)cache_cfra);
-		if (psys->pointcache->flag & PTCACHE_DISK_CACHE && psys->pointcache->writer)
-			PTC_write(psys->pointcache->writer);
 	}
 
 	update_children(sim);
diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
index 83439a2..20bc218 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -483,7 +483,7 @@ static struct PTCWriter *ptcache_particle_writer_create(Scene *scene, Object *ob
 	ParticleSystem *psys = psys_v;
 	char filename[FILE_MAX * 2];
 	ptcache_archive_filename(psys->pointcache, ob, filename, true, true);
-	return PTC_writer_create_particles(filename, scene, ob, psys);
+	return PTC_writer_particles(filename, scene, ob, psys);
 }
 
 /* Cloth functions */
@@ -2581,7 +2581,7 @@ int BKE_ptcache_write(PTCacheID *pid, unsigned int cfra)
 	if (!cache->writer && pid->writer_create)
 		cache->writer = pid->writer_create(pid->scene, pid->ob, pid->calldata);
 	if (cache->writer)
-		PTC_write(cache->writer);
+		PTC_write_sample(cache->writer);
 
 	/* Mark frames skipped if more than 1 frame forwards since last non-skipped frame. */
 	if (cfra - cache->last_exact == 1 || cfra == cache->startframe) {
diff --git a/source/blender/makesdna/DNA_object_force.h b/source/blender/makesdna/DNA_object_force.h
index b9b5895..f003477 100644
--- a/source/blender/makesdna/DNA_object_force.h
+++ b/source/blender/makesdna/DNA_object_force.h
@@ -208,6 +208,7 @@ typedef struct PointCache {
 	void (*free_edit)(struct PTCacheEdit *edit);	/* free callback */
 
 	struct PTCWriter *writer;
+	struct PTCReader *reader;
 } PointCache;
 
 typedef struct SBVertex {
diff --git a/source/blender/pointcache/PTC_api.cpp b/source/blender/pointcache/PTC_api.cpp
index b017d45..1ac14f5 100644
--- a/source/blender/pointcache/PTC_api.cpp
+++ b/source/blender/pointcache/PTC_api.cpp
@@ -20,6 +20,7 @@
 
 #ifdef WITH_ALEMBIC
 
+#include "reader.h"
 #include "writer.h"
 #include "particles.h"
 
@@ -32,20 +33,39 @@ void PTC_writer_free(PTCWriter *_writer)
 	delete writer;
 }
 
-void PTC_write(struct PTCWriter *_writer)
+void PTC_write_sample(struct PTCWriter *_writer)
 {
 	PTC::Writer *writer = (PTC::Writer *)_writer;
-	writer->write();
+	writer->write_sample();
+}
+
+
+void PTC_reader_free(PTCReader *_reader)
+{
+	PTC::Reader *reader = (PTC::Reader *)_reader;
+	delete reader;
+}
+
+void PTC_read_sample(struct PTCReader *_reader)
+{
+	PTC::Reader *reader = (PTC::Reader *)_reader;
+	reader->read_sample();
 }
 
 
 /* Particles */
-PTCWriter *PTC_writer_create_particles(const char *filename, Scene *scene, Object *ob, ParticleSystem *psys)
+PTCWriter *PTC_writer_particles(const char *filename, Scene *scene, Object *ob, ParticleSystem *psys)
 {
 	PTC::ParticlesWriter *writer = new PTC::ParticlesWriter(filename, ob, psys);
 	return (PTCWriter *)writer;
 }
 
+PTCReader *PTC_reader_particles(const char *filename, Scene *scene, Object *ob, ParticleSystem *psys)
+{
+	PTC::ParticlesReader *reader = new PTC::ParticlesReader(filename, ob, psys);
+	return (PTCReader *)reader;
+}
+
 #else
 
 void PTC_writer_free(PTCWriter *_writer)
diff --git a/source/blender/pointcache/PTC_api.h b/source/blender/pointcache/PTC_api.h
index a09241c..4b448cb 100644
--- a/source/blender/pointcache/PTC_api.h
+++ b/source/blender/pointcache/PTC_api.h
@@ -34,12 +34,15 @@ struct PTCWriter;
 struct PTCReader;
 
 void PTC_writer_free(struct PTCWriter *writer);
+void PTC_write_sample(struct PTCWriter *writer);
 
-void PTC_write(struct PTCWriter *writer);
+void PTC_reader_free(struct PTCReader *reader);
+void PTC_read_sample(struct PTCReader *reader);
 
 
 /* Particles */
-struct PTCWriter *PTC_writer_create_particles(const char *filename, struct Scene *scene, struct Object *ob, struct ParticleSystem *psys);
+struct PTCWriter *PTC_writer_particles(const char *filename, struct Scene *scene, struct Object *ob, struct ParticleSystem *psys);
+struct PTCReader *PTC_reader_particles(const char *filename, struct Scene *scene, struct Object *ob, struct ParticleSystem *psys);
 
 #ifdef __cplusplus
 } /* extern C */
diff --git a/source/blender/pointcache/intern/particles.cpp b/source/blender/pointcache/intern/particles.cpp
index a3cd988..38c2ebe 100644
--- a/source/blender/pointcache/intern/particles.cpp
+++ b/source/blender/pointcache/intern/particles.cpp
@@ -243,7 +243,7 @@ ParticlesWriter::~ParticlesWriter()
 {
 }
 
-void ParticlesWriter::write()
+void ParticlesWriter::write_sample()
 {
 	OPointsSchema &schema = m_points.getSchema();
 	
@@ -269,4 +269,46 @@ void ParticlesWriter::write()
 	schema.set(sample);
 }
 
+
+ParticlesReader::ParticlesReader(const std::string &filename, Object *ob, ParticleSystem *psys) :
+    Reader(filename),
+    m_ob(ob),
+    m_psys(psys)
+{
+	IObject root = m_archive.getTop();
+	m_points = IPoints(root, m_psys->name);
+}
+
+ParticlesReader::~ParticlesReader()
+{
+}
+
+void ParticlesReader::read_sample()
+{
+	IPointsSchema &schema = m_points.getSchema();
+	
+#if 0
+	int totpart = m_psys->totpart;
+	ParticleData *pa;
+	int i;
+	
+	/* XXX TODO only needed for the first frame/sample */
+	std::vector<Util::uint64_t> ids;
+	ids.reserve(totpart);
+	for (i = 0, pa = m_psys->particles; i < totpart; ++i, ++pa)
+		ids.push_back(i);
+	
+	std::vector<V3f> positions;
+	positions.reserve(totpart);
+	for (i = 0, pa = m_psys->particles; i < totpart; ++i, ++pa) {
+		float *co = pa->state.co;
+		positions.push_back(V3f(co[0], co[1], co[2]));
+	}
+	
+	OPointsSchema::Sample sample = OPointsSchema::Sample(V3fArraySample(positions), UInt64ArraySample(ids));
+
+	schema.set(sample);
+#endif
+}
+
 } /* namespace PTC */
diff --git a/source/blender/pointcache/intern/particles.h b/source/blender/pointcache/intern/particles.h
index 456567b..a64995a 100644
--- a/source/blender/pointcache/intern/particles.h
+++ b/source/blender/pointcache/intern/particles.h
@@ -22,6 +22,7 @@
 #include <Alembic/AbcGeom/IPoints.h>
 #include <Alembic/AbcGeom/OPoints.h>
 
+#include "reader.h"
 #include "schema.h"
 #include "types.h"
 #include "writer.h"
@@ -480,7 +481,7 @@ public:
 	ParticlesWriter(const std::string &filename, Object *ob, ParticleSystem *psys);
 	~ParticlesWriter();
 	
-	void write();
+	void write_sample();
 	
 private:
 	Object *m_ob;
@@ -489,6 +490,20 @@ private:
 	AbcGeom::OPoints m_points;
 };
 
+class ParticlesReader : public Reader {
+public:
+	ParticlesReader(const std::string &filename, Object *ob, ParticleSystem *psys);
+	~ParticlesReader();
+	
+	void read_sample();
+	
+private:
+	Object *m_ob;
+	ParticleSystem *m_psys;
+	
+	AbcGeom::IPoints m_points;
+};
+
 } /* namespace PTC */
 
 #endif  /* PTC_PARTICLES_H */
diff --git a/source/blender/pointcache/intern/reader.cpp b/source/blender/pointcache/intern/reader.cpp
index 8595678..e94da3b 100644
--- a/source/blender/pointcache/intern/reader.cpp
+++ b/source/blender/pointcache/intern/reader.cpp
@@ -16,3 +16,21 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
+#include <Alembic/AbcCoreHDF5/ReadWrite.h>
+
+#include "reader.h"
+
+namespace PTC {
+
+using namespace Abc;
+
+Reader::Reader(const std::string &filename)
+{
+	m_archive = IArchive(AbcCoreHDF5::ReadArchive(), filename, ErrorHandler::kThrowPolicy);
+}
+
+Reader::~Reader()
+{
+}
+
+} /* namespace PTC */
diff --git a/source/blender/pointcache/intern/reader.h b/source/blender/pointcache/intern/reader.h
index 63c5eb3..926fea2 100644
--- a/source/blender/pointcache/intern/reader.h
+++ b/source/blender/pointcache/intern/reader.h
@@ -19,4 +19,25 @@
 #ifndef PTC_READER_H
 #define PTC_READER_H
 
+#include <string>
+
+#include <Alembic/Abc/IArchive.h>
+
+namespace PTC {
+
+using namespace Alembic;
+
+class Reader {
+public:
+	Reader(const std::string &filename);
+	virtual ~Reader();
+	
+	virtual void read_sample() = 0;
+	
+protected:
+	Abc::IArchive m_archive;
+};
+
+} /* namespace PTC */
+
 #endif  /* PTC_READER_H */
diff --git a/source/blender/pointcache/intern/writer.h b/source/blender/pointcache/intern/writer.h
index 31d3aa0..8157e65 100644
--- a/source/blender/pointcache/intern/writer.h
+++ b/source/blender/pointcache/intern/writer.h
@@ -32,13 +32,12 @@ public:
 	Writer(const std::string &filename);
 	virtual ~Writer();
 	
-	virtual void write() = 0;
+	virtual void write_sample() = 0;
 	
 protected:
 	Abc::OArchive m_archive;
 };
 
-
 } /* namespace PTC */
 
 #endif  /* PTC_WRITER_H */




More information about the Bf-blender-cvs mailing list