[Bf-blender-cvs] [7b0b538] alembic_pointcache: More info in the persistent alembic storage. Now use Writer/Reader structs in PointCache instead of plain Archive. The writer is constructed on write calls currently, because the basic point cache creation function doesn't provide necessary parameters. This will get replaced eventually, for now just testing the alembic code.

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


Commit: 7b0b538a78c8845aa27952897ff6eabd66949f1c
Author: Lukas Tönne
Date:   Tue Oct 15 18:52:44 2013 +0200
Branches: alembic_pointcache
https://developer.blender.org/rB7b0b538a78c8845aa27952897ff6eabd66949f1c

More info in the persistent alembic storage. Now use Writer/Reader structs in PointCache instead of plain Archive. The writer is constructed on write calls currently, because the basic point cache creation function doesn't provide necessary parameters. This will get replaced eventually, for now just testing the alembic code.

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

M	source/blender/blenkernel/BKE_pointcache.h
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/CMakeLists.txt
M	source/blender/pointcache/PTC_api.cpp
M	source/blender/pointcache/PTC_api.h
D	source/blender/pointcache/intern/archive.cpp
D	source/blender/pointcache/intern/archive.h
M	source/blender/pointcache/intern/particles.cpp
M	source/blender/pointcache/intern/particles.h
A	source/blender/pointcache/intern/reader.cpp
A	source/blender/pointcache/intern/reader.h
M	source/blender/pointcache/intern/schema.h
M	source/blender/pointcache/intern/types.h
A	source/blender/pointcache/intern/writer.cpp
A	source/blender/pointcache/intern/writer.h
M	source/blender/pointcache/test.cpp

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

diff --git a/source/blender/blenkernel/BKE_pointcache.h b/source/blender/blenkernel/BKE_pointcache.h
index 4ef13eb..e018d66 100644
--- a/source/blender/blenkernel/BKE_pointcache.h
+++ b/source/blender/blenkernel/BKE_pointcache.h
@@ -94,6 +94,7 @@ struct Scene;
 struct SmokeModifierData;
 struct SoftBody;
 struct RigidBodyWorld;
+struct PTCWriter;
 
 /* temp structure for read/write */
 typedef struct PTCacheData {
@@ -165,6 +166,9 @@ typedef struct PTCacheID {
 	int (*write_header)(PTCacheFile *pf);
 	int (*read_header)(PTCacheFile *pf);
 
+	/* XXX just a workaround to get going with existing pointcache, eventually PTCacheID should be redundant */
+	struct PTCWriter *(*writer_create)(struct Scene *scene, struct Object *ob, void *calldata);
+
 	struct PointCache *cache;
 	/* used for setting the current cache from ptcaches list */
 	struct PointCache **cache_ptr;
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index 4121711..287c27e 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -96,6 +96,8 @@
 #include "BKE_scene.h"
 #include "BKE_bvhutils.h"
 
+#include "PTC_api.h"
+
 #include "PIL_time.h"
 
 #include "RE_shader_ext.h"
@@ -4782,6 +4784,8 @@ 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 f8a1a59..83439a2 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -476,6 +476,16 @@ static void ptcache_particle_extra_read(void *psys_v, PTCacheMem *pm, float UNUS
 	}
 }
 
+static int ptcache_archive_filename(PointCache *cache, Object *ob, char *filename, bool do_path, bool do_ext);
+
+static struct PTCWriter *ptcache_particle_writer_create(Scene *scene, Object *ob, void *psys_v)
+{
+	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);
+}
+
 /* Cloth functions */
 static int  ptcache_cloth_write(int index, void *cloth_v, void **data, int UNUSED(cfra))
 {
@@ -1186,6 +1196,8 @@ void BKE_ptcache_id_from_particles(PTCacheID *pid, Object *ob, ParticleSystem *p
 
 	pid->default_step = 10;
 	pid->max_step = 20;
+
+	pid->writer_create = ptcache_particle_writer_create;
 }
 void BKE_ptcache_id_from_cloth(PTCacheID *pid, Object *ob, ClothModifierData *clmd)
 {
@@ -2566,6 +2578,11 @@ int BKE_ptcache_write(PTCacheID *pid, unsigned int cfra)
 		error += ptcache_write(pid, cfra, overwrite);
 	}
 
+	if (!cache->writer && pid->writer_create)
+		cache->writer = pid->writer_create(pid->scene, pid->ob, pid->calldata);
+	if (cache->writer)
+		PTC_write(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) {
 		cache->last_exact = cfra;
@@ -3058,7 +3075,7 @@ PointCache *BKE_ptcache_add(ListBase *ptcaches)
 	cache->step= 10;
 	cache->index = -1;
 
-	cache->archive = NULL;
+	cache->writer = NULL;
 
 	BLI_addtail(ptcaches, cache);
 
@@ -3086,8 +3103,8 @@ void BKE_ptcache_free(PointCache *cache)
 	if (cache->cached_frames)
 		MEM_freeN(cache->cached_frames);
 
-	if (cache->archive)
-		PTC_archive_free(cache->archive);
+	if (cache->writer)
+		PTC_writer_free(cache->writer);
 
 	MEM_freeN(cache);
 }
@@ -3142,7 +3159,7 @@ static PointCache *ptcache_copy(PointCache *cache, int copy_data)
 	/* hmm, should these be copied over instead? */
 	ncache->edit = NULL;
 
-	ncache->archive = NULL;
+	ncache->writer = NULL;
 
 	return ncache;
 }
@@ -3531,23 +3548,10 @@ void BKE_ptcache_toggle_disk_cache(PTCacheID *pid)
 		cache->cached_frames=NULL;
 	}
 
-	if (cache->flag & PTCACHE_DISK_CACHE) {
+	if (cache->flag & PTCACHE_DISK_CACHE)
 		BKE_ptcache_mem_to_disk(pid);
-		
-		if (!cache->archive) {
-			char filename[FILE_MAX * 2];
-			ptcache_archive_filename(cache, pid->ob, filename, true, true);
-			cache->archive = PTC_archive_create(filename);
-		}
-	}
-	else {
+	else
 		BKE_ptcache_disk_to_mem(pid);
-		
-		if (cache->archive) {
-			PTC_archive_free(cache->archive);
-			cache->archive = NULL;
-		}
-	}
 
 	cache->flag ^= PTCACHE_DISK_CACHE;
 	BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0);
diff --git a/source/blender/makesdna/DNA_object_force.h b/source/blender/makesdna/DNA_object_force.h
index dbf15fd..b9b5895 100644
--- a/source/blender/makesdna/DNA_object_force.h
+++ b/source/blender/makesdna/DNA_object_force.h
@@ -207,7 +207,7 @@ typedef struct PointCache {
 	struct PTCacheEdit *edit;
 	void (*free_edit)(struct PTCacheEdit *edit);	/* free callback */
 
-	struct PTCArchive *archive;
+	struct PTCWriter *writer;
 } PointCache;
 
 typedef struct SBVertex {
diff --git a/source/blender/pointcache/CMakeLists.txt b/source/blender/pointcache/CMakeLists.txt
index bd02a66..c2e8247 100644
--- a/source/blender/pointcache/CMakeLists.txt
+++ b/source/blender/pointcache/CMakeLists.txt
@@ -42,12 +42,14 @@ if(WITH_ALEMBIC)
 	list(APPEND INC_SYS ${ALEMBIC_INCLUDE_DIRS} ${OPENEXR_INCLUDE_DIR}/OpenEXR)
 
 	list(APPEND SRC
-	intern/archive.h
-	intern/archive.cpp
 	intern/particles.h
 	intern/particles.cpp
+	intern/reader.h
+	intern/reader.cpp
 	intern/schema.h
 	intern/types.h
+	intern/writer.h
+	intern/writer.cpp
 	)
 
 	add_definitions(-DWITH_ALEMBIC)
diff --git a/source/blender/pointcache/PTC_api.cpp b/source/blender/pointcache/PTC_api.cpp
index dcd04ce..b017d45 100644
--- a/source/blender/pointcache/PTC_api.cpp
+++ b/source/blender/pointcache/PTC_api.cpp
@@ -20,51 +20,45 @@
 
 #ifdef WITH_ALEMBIC
 
-#include "archive.h"
+#include "writer.h"
 #include "particles.h"
 
 #include "DNA_object_types.h"
 #include "DNA_particle_types.h"
 
-typedef struct PTCArchive PTCArchive;
-typedef struct PTCObject PTCObject;
-
-PTCArchive *PTC_archive_create(const char *filename)
+void PTC_writer_free(PTCWriter *_writer)
 {
-	OArchive *archive = new OArchive(Alembic::AbcCoreHDF5::WriteArchive(),
-	                                 std::string(filename),
-	                                 ErrorHandler::kThrowPolicy);
-	
-	return (PTCArchive *)archive;
+	PTC::Writer *writer = (PTC::Writer *)_writer;
+	delete writer;
 }
 
-void PTC_archive_free(PTCArchive *_archive)
+void PTC_write(struct PTCWriter *_writer)
 {
-	OArchive *archive = (OArchive *)_archive;
-	delete archive;
+	PTC::Writer *writer = (PTC::Writer *)_writer;
+	writer->write();
 }
 
 
-void PTC_write_particles(PTCArchive *_archive, Object *ob, ParticleSystem *psys)
+/* Particles */
+PTCWriter *PTC_writer_create_particles(const char *filename, Scene *scene, Object *ob, ParticleSystem *psys)
 {
-	OArchive *archive = (OArchive *)_archive;
-	
-	OObject root = archive->getTop();
-	
-//	OParticles particles(root.getChild(psys->name).getPtr(), kWrapExisting);
-//	if (!particles.getPtr())
-//		particles = OParticles(root, psys->name);
+	PTC::ParticlesWriter *writer = new PTC::ParticlesWriter(filename, ob, psys);
+	return (PTCWriter *)writer;
 }
 
 #else
 
-PTCArchive *PTC_archive_create(const char *filename)
+void PTC_writer_free(PTCWriter *_writer)
+{
+}
+
+void PTC_write(struct PTCWriter *_writer)
 {
-	return NULL;
 }
 
-void PTC_archive_free(PTCArchive *_archive)
+PTCWriter *PTC_writer_create_particles(const char *filename, struct Object *ob, struct ParticleSystem *psys)
 {
+	return NULL;
 }
 
 #endif
diff --git a/source/blender/pointcache/PTC_api.h b/source/blender/pointcache/PTC_api.h
index ce14f9d..a09241c 100644
--- a/source/blender/pointcache/PTC_api.h
+++ b/source/blender/pointcache/PTC_api.h
@@ -23,20 +23,23 @@
 extern "C" {
 #endif
 
+struct Scene;
+struct Object;
+struct ParticleSystem;
+
 void PTC_test_archive(void);
 
 
-struct PTCArchive;
+struct PTCWriter;
+struct PTCReader;
 
-struct PTCArchive *PTC_archive_create(const char *filename);
-void PTC_archive_free(struct PTCArchive *archive);
+void PTC_writer_free(struct PTCWriter *writer);
 
+void PTC_write(struct PTCWriter *writer);
 
-/* Particles */
-struct Object;
-struct ParticleSystem;
 
-void PTC_write_particles(struct PTCArchive *archive, struct Object *ob, struct ParticleSystem *psys);
+/* Particles */
+struct PTCWriter *PTC_writer_create_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 63d073a..a3cd988 100644
--- a/source/blender/pointcache/intern/particles.cpp
+++ b/source/blender/pointcache/intern/particles.cpp
@@ -18,8 +18,17 @@
 
 #include "particles.h"
 
-//namespace PTC {
+extern "C" {
+#include "DNA_object_types.h"
+#include "DNA_particle_types.h"
+}
+
+namespace PTC {
 
+using namespace Abc;
+using namespace AbcGeom;
+
+#if 0
 void IParticlesSchema::init(const Abc::Argument &iArg0,
                             const Abc::Argument &iArg1)
 {
@@ -218,5 +227,46 @@ void OParticlesSchema::init(uint32_t iTsIdx)
 
 	ALEMBIC_ABC_SAFE_CALL_END_RESET();
 }
+#endif
+
+
+ParticlesWriter::ParticlesWriter(const std::string &filename, Object *ob, ParticleSystem *psys) :
+    Writer(filename),
+    m_ob(ob),
+    m_psys(psys)
+{
+	OObject root = m_archive.getTop();
+	m_points = OPoints(root, m_psys->name);
+}
+
+ParticlesWriter::~ParticlesWriter()
+{
+}
+
+void ParticlesWriter::write()
+{
+	OPointsSchema &schema = m_points.getSchema();
+	
+	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->sta

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list