[Bf-blender-cvs] [ea601a4] alembic_pointcache: Use a combined class for hair dynamics for cloth and mesh data.

Lukas Tönne noreply at git.blender.org
Thu Mar 5 16:32:30 CET 2015


Commit: ea601a481428881c6618e4552b65d3e7a3c74b40
Author: Lukas Tönne
Date:   Thu Mar 5 13:43:31 2015 +0100
Branches: alembic_pointcache
https://developer.blender.org/rBea601a481428881c6618e4552b65d3e7a3c74b40

Use a combined class for hair dynamics for cloth and mesh data.

Particles store a copy of the DM internally as the emitter.

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

M	source/blender/blenkernel/intern/cache_library.c
M	source/blender/pointcache/PTC_api.cpp
M	source/blender/pointcache/PTC_api.h
M	source/blender/pointcache/alembic/abc_cloth.h
M	source/blender/pointcache/alembic/abc_particles.cpp
M	source/blender/pointcache/alembic/abc_particles.h
M	source/blender/pointcache/alembic/alembic.cpp
M	source/blender/pointcache/intern/ptc_types.h

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

diff --git a/source/blender/blenkernel/intern/cache_library.c b/source/blender/blenkernel/intern/cache_library.c
index fd843d4..585c0f0 100644
--- a/source/blender/blenkernel/intern/cache_library.c
+++ b/source/blender/blenkernel/intern/cache_library.c
@@ -719,7 +719,7 @@ void BKE_cache_library_writers(CacheLibrary *cachelib, Scene *scene, DerivedMesh
 			case CACHE_TYPE_HAIR: {
 				ParticleSystem *psys = (ParticleSystem *)BLI_findlink(&item->ob->particlesystem, item->index);
 				if (psys && psys->part && psys->part->type == PART_HAIR && psys->clmd) {
-					cachelib_add_writer(writers, item, PTC_writer_hair_dynamics(name, item->ob, psys->clmd));
+					cachelib_add_writer(writers, item, PTC_writer_hair_dynamics(name, item->ob, psys));
 				}
 				break;
 			}
@@ -812,7 +812,7 @@ static struct PTCReader *cache_library_reader_hair_dynamics(CacheLibrary *cachel
 		char name[2*MAX_NAME];
 		BKE_cache_item_name(ob, CACHE_TYPE_HAIR, index, name);
 		
-		return PTC_reader_hair_dynamics(name, ob, psys->clmd);
+		return PTC_reader_hair_dynamics(name, ob, psys);
 	}
 	
 	return NULL;
diff --git a/source/blender/pointcache/PTC_api.cpp b/source/blender/pointcache/PTC_api.cpp
index 2d38782..5da5268 100644
--- a/source/blender/pointcache/PTC_api.cpp
+++ b/source/blender/pointcache/PTC_api.cpp
@@ -244,16 +244,6 @@ PTCReader *PTC_reader_cloth(const char *name, Object *ob, ClothModifierData *clm
 	return (PTCReader *)PTC::Factory::alembic->create_reader_cloth(name, ob, clmd);
 }
 
-PTCWriter *PTC_writer_hair_dynamics(const char *name, Object *ob, ClothModifierData *clmd)
-{
-	return (PTCWriter *)PTC::Factory::alembic->create_writer_hair_dynamics(name, ob, clmd);
-}
-
-PTCReader *PTC_reader_hair_dynamics(const char *name, Object *ob, ClothModifierData *clmd)
-{
-	return (PTCReader *)PTC::Factory::alembic->create_reader_hair_dynamics(name, ob, clmd);
-}
-
 
 /* ==== MESH ==== */
 
@@ -318,6 +308,16 @@ int PTC_reader_particles_totpoint(PTCReader *_reader)
 	return ((PTC::ParticlesReader *)_reader)->totpoint();
 }
 
+PTCWriter *PTC_writer_hair_dynamics(const char *name, Object *ob, ParticleSystem *psys)
+{
+	return (PTCWriter *)PTC::Factory::alembic->create_writer_hair_dynamics(name, ob, psys);
+}
+
+PTCReader *PTC_reader_hair_dynamics(const char *name, Object *ob, ParticleSystem *psys)
+{
+	return (PTCReader *)PTC::Factory::alembic->create_reader_hair_dynamics(name, ob, psys);
+}
+
 PTCWriter *PTC_writer_particles_pathcache_parents(const char *name, Object *ob, ParticleSystem *psys)
 {
 	return (PTCWriter *)PTC::Factory::alembic->create_writer_particles_pathcache_parents(name, ob, psys);
diff --git a/source/blender/pointcache/PTC_api.h b/source/blender/pointcache/PTC_api.h
index e57a528..5afa651 100644
--- a/source/blender/pointcache/PTC_api.h
+++ b/source/blender/pointcache/PTC_api.h
@@ -92,6 +92,9 @@ struct PTCWriter *PTC_writer_particles(const char *name, struct Object *ob, stru
 struct PTCReader *PTC_reader_particles(const char *name, struct Object *ob, struct ParticleSystem *psys);
 int PTC_reader_particles_totpoint(struct PTCReader *reader);
 
+struct PTCWriter *PTC_writer_hair_dynamics(const char *name, struct Object *ob, struct ParticleSystem *psys);
+struct PTCReader *PTC_reader_hair_dynamics(const char *name, struct Object *ob, struct ParticleSystem *psys);
+
 struct PTCWriter *PTC_writer_particles_pathcache_parents(const char *name, struct Object *ob, struct ParticleSystem *psys);
 struct PTCReader *PTC_reader_particles_pathcache_parents(const char *name, struct Object *ob, struct ParticleSystem *psys);
 struct PTCWriter *PTC_writer_particles_pathcache_children(const char *name, struct Object *ob, struct ParticleSystem *psys);
@@ -100,8 +103,6 @@ struct PTCReader *PTC_reader_particles_pathcache_children(const char *name, stru
 /* Cloth */
 struct PTCWriter *PTC_writer_cloth(const char *name, struct Object *ob, struct ClothModifierData *clmd);
 struct PTCReader *PTC_reader_cloth(const char *name, struct Object *ob, struct ClothModifierData *clmd);
-struct PTCWriter *PTC_writer_hair_dynamics(const char *name, struct Object *ob, struct ClothModifierData *clmd);
-struct PTCReader *PTC_reader_hair_dynamics(const char *name, struct Object *ob, struct ClothModifierData *clmd);
 
 struct PTCWriter *PTC_writer_derived_mesh(const char *name, struct Object *ob, struct DerivedMesh **dm_ptr);
 struct PTCReader *PTC_reader_derived_mesh(const char *name, struct Object *ob);
diff --git a/source/blender/pointcache/alembic/abc_cloth.h b/source/blender/pointcache/alembic/abc_cloth.h
index 9b4d2ed..947f49a 100644
--- a/source/blender/pointcache/alembic/abc_cloth.h
+++ b/source/blender/pointcache/alembic/abc_cloth.h
@@ -63,25 +63,6 @@ private:
 	AbcGeom::IP3fGeomParam m_param_goal_positions;
 };
 
-
-/* Hair is just a cloth sim in disguise ... */
-
-class AbcHairDynamicsWriter : public AbcClothWriter {
-public:
-	AbcHairDynamicsWriter(const std::string &name, Object *ob, ClothModifierData *clmd) :
-	    AbcClothWriter(name, ob, clmd)
-	{}
-};
-
-class AbcHairDynamicsReader : public AbcClothReader {
-public:
-	AbcHairDynamicsReader(const std::string &name, Object *ob, ClothModifierData *clmd) :
-	    AbcClothReader(name, ob, clmd)
-	{}
-	
-	PTCReadSampleResult read_sample(float frame) { return AbcClothReader::read_sample(frame); }
-};
-
 } /* namespace PTC */
 
 #endif  /* PTC_CLOTH_H */
diff --git a/source/blender/pointcache/alembic/abc_particles.cpp b/source/blender/pointcache/alembic/abc_particles.cpp
index 6dcbbb5..ac9ea71 100644
--- a/source/blender/pointcache/alembic/abc_particles.cpp
+++ b/source/blender/pointcache/alembic/abc_particles.cpp
@@ -17,11 +17,13 @@
  */
 
 #include "abc_cloth.h"
+#include "abc_mesh.h"
 #include "abc_particles.h"
 
 extern "C" {
 #include "BLI_math.h"
 
+#include "DNA_modifier_types.h"
 #include "DNA_object_types.h"
 #include "DNA_particle_types.h"
 
@@ -131,6 +133,55 @@ PTCReadSampleResult AbcParticlesReader::read_sample(float frame)
 }
 
 
+AbcHairDynamicsWriter::AbcHairDynamicsWriter(const std::string &name, Object *ob, ParticleSystem *psys) :
+    ParticlesWriter(ob, psys, name),
+    m_dm_writer(name+"__mesh", ob, &psys_get_modifier(ob, psys)->dm),
+    m_cloth_writer(name+"__cloth", ob, psys->clmd)
+{
+}
+
+void AbcHairDynamicsWriter::open_archive(WriterArchive *archive)
+{
+	m_dm_writer.open_archive(archive);
+	m_cloth_writer.open_archive(archive);
+}
+
+void AbcHairDynamicsWriter::write_sample()
+{
+	m_dm_writer.write_sample();
+	m_cloth_writer.write_sample();
+}
+
+AbcHairDynamicsReader::AbcHairDynamicsReader(const std::string &name, Object *ob, ParticleSystem *psys) :
+	ParticlesReader(ob, psys, name),
+	m_dm_reader(name+"__mesh", ob),
+	m_cloth_reader(name+"__cloth", ob, psys->clmd)
+{
+}
+
+void AbcHairDynamicsReader::open_archive(ReaderArchive *archive)
+{
+	m_dm_reader.open_archive(archive);
+	m_cloth_reader.open_archive(archive);
+}
+
+PTCReadSampleResult AbcHairDynamicsReader::read_sample(float frame)
+{
+	if (m_dm_reader.read_sample(frame) == PTC_READ_SAMPLE_INVALID)
+		return PTC_READ_SAMPLE_INVALID;
+	
+	ParticleSystemModifierData *psmd = psys_get_modifier(m_ob, m_psys);
+	if (psmd->dm)
+		psmd->dm->release(psmd->dm);
+	psmd->dm = m_dm_reader.acquire_result();
+	
+	if (m_cloth_reader.read_sample(frame) == PTC_READ_SAMPLE_INVALID)
+		return PTC_READ_SAMPLE_INVALID;
+	
+	return PTC_READ_SAMPLE_EXACT;
+}
+
+
 AbcParticlePathcacheWriter::AbcParticlePathcacheWriter(const std::string &name, Object *ob, ParticleSystem *psys, ParticleCacheKey ***pathcache, int *totpath, const std::string &suffix) :
     ParticlesWriter(ob, psys, name),
     m_pathcache(pathcache),
diff --git a/source/blender/pointcache/alembic/abc_particles.h b/source/blender/pointcache/alembic/abc_particles.h
index 5e624e6..968ff7a 100644
--- a/source/blender/pointcache/alembic/abc_particles.h
+++ b/source/blender/pointcache/alembic/abc_particles.h
@@ -39,6 +39,9 @@ struct ParticleCacheKey;
 namespace PTC {
 
 class AbcClothWriter;
+class AbcClothReader;
+class AbcDerivedMeshWriter;
+class AbcDerivedMeshReader;
 
 class AbcParticlesWriter : public ParticlesWriter, public AbcWriter {
 public:
@@ -66,6 +69,36 @@ private:
 	AbcGeom::IPoints m_points;
 };
 
+
+/* Hair is just a cloth sim in disguise ... */
+
+class AbcHairDynamicsWriter : public ParticlesWriter, public AbcWriter {
+public:
+	AbcHairDynamicsWriter(const std::string &name, Object *ob, ParticleSystem *psys);
+	
+	void open_archive(WriterArchive *archive);
+	
+	void write_sample();
+	
+private:
+	AbcDerivedMeshWriter m_dm_writer;
+	AbcClothWriter m_cloth_writer;
+};
+
+class AbcHairDynamicsReader : public ParticlesReader, public AbcReader {
+public:
+	AbcHairDynamicsReader(const std::string &name, Object *ob, ParticleSystem *psys);
+	
+	void open_archive(ReaderArchive *archive);
+	
+	PTCReadSampleResult read_sample(float frame);
+	
+private:
+	AbcDerivedMeshReader m_dm_reader;
+	AbcClothReader m_cloth_reader;
+};
+
+
 class AbcParticlePathcacheWriter : public ParticlesWriter, public AbcWriter {
 protected:
 	AbcParticlePathcacheWriter(const std::string &name, Object *ob, ParticleSystem *psys, ParticleCacheKey ***pathcache, int *totpath, const std::string &suffix);
diff --git a/source/blender/pointcache/alembic/alembic.cpp b/source/blender/pointcache/alembic/alembic.cpp
index 38ff9a7..d14a86e 100644
--- a/source/blender/pointcache/alembic/alembic.cpp
+++ b/source/blender/pointcache/alembic/alembic.cpp
@@ -56,6 +56,16 @@ class AbcFactory : public Factory {
 		return new AbcParticlesReader(name, ob, psys);
 	}
 	
+	Writer *create_writer_hair_dynamics(const std::string &name, Object *ob, ParticleSystem *psys)
+	{
+		return new AbcHairDynamicsWriter(name, ob, psys);
+	}
+	
+	Reader *create_reader_hair_dynamics(const std::string &name, Object *ob, ParticleSystem *psys)
+	{
+		return new AbcHairDynamicsReader(name, ob, psys);
+	}
+	
 	Writer *create_writer_particles_pathcache_parents(const std::string &name, Object *ob, ParticleSystem *psys)
 	{
 		return new AbcParticlePathcacheParentsWriter(name, ob, psys);
@@ -88,16 +98,6 @@ class AbcFactory : public Factory {
 		return new AbcClothReader(name, ob, clmd);
 	}
 	
-	Writer *create_writer_hair_dynamics(const std::string &name, Object *ob, ClothModifierData *c

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list