[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