[Bf-blender-cvs] [dfdb657] alembic_pointcache: Use a nested Object writer to store the Object ID blocks used by dupli lists.

Lukas Tönne noreply at git.blender.org
Fri Mar 13 18:05:34 CET 2015


Commit: dfdb657427608d2c403c1f3984aa6ae4961849e9
Author: Lukas Tönne
Date:   Fri Mar 13 18:04:23 2015 +0100
Branches: alembic_pointcache
https://developer.blender.org/rBdfdb657427608d2c403c1f3984aa6ae4961849e9

Use a nested Object writer to store the Object ID blocks used by dupli
lists.

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

M	source/blender/pointcache/alembic/abc_group.cpp
M	source/blender/pointcache/alembic/abc_group.h
M	source/blender/pointcache/alembic/abc_object.cpp
M	source/blender/pointcache/alembic/abc_object.h
M	source/blender/pointcache/intern/writer.h

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

diff --git a/source/blender/pointcache/alembic/abc_group.cpp b/source/blender/pointcache/alembic/abc_group.cpp
index 4bb24d9..8f7115f 100644
--- a/source/blender/pointcache/alembic/abc_group.cpp
+++ b/source/blender/pointcache/alembic/abc_group.cpp
@@ -24,6 +24,7 @@
 
 #include "abc_mesh.h"
 #include "abc_group.h"
+#include "abc_object.h"
 
 extern "C" {
 #include "BLI_math.h"
@@ -110,6 +111,14 @@ AbcDupligroupWriter::AbcDupligroupWriter(const std::string &name, EvaluationCont
 {
 }
 
+AbcDupligroupWriter::~AbcDupligroupWriter()
+{
+	for (IDWriterMap::iterator it = m_id_writers.begin(); it != m_id_writers.end(); ++it) {
+		if (it->second)
+			delete it->second;
+	}
+}
+
 void AbcDupligroupWriter::open_archive(WriterArchive *archive)
 {
 	BLI_assert(dynamic_cast<AbcWriterArchive*>(archive));
@@ -122,10 +131,14 @@ void AbcDupligroupWriter::open_archive(WriterArchive *archive)
 
 void AbcDupligroupWriter::write_sample_object(Object *ob)
 {
-	OObject abc_object = abc_archive()->add_id_object<OObject>((ID *)ob);
-	m_writers.push_back(abc_object.getPtr());
+	Writer *ob_writer = find_id_writer((ID *)ob);
+	if (!ob_writer) {
+		ob_writer = new AbcObjectWriter(ob->id.name, ob);
+		ob_writer->set_archive(m_archive);
+		m_id_writers.insert(IDWriterPair((ID *)ob, ob_writer));
+	}
 	
-	// TODO mesh, modifiers, sims ...
+	ob_writer->write_sample();
 }
 
 void AbcDupligroupWriter::write_sample_dupli(DupliObject *dob, int index)
@@ -181,6 +194,15 @@ void AbcDupligroupWriter::write_sample()
 	free_object_duplilist(duplilist);
 }
 
+Writer *AbcDupligroupWriter::find_id_writer(ID *id) const
+{
+	IDWriterMap::const_iterator it = m_id_writers.find(id);
+	if (it == m_id_writers.end())
+		return NULL;
+	else
+		return it->second;
+}
+
 /* ------------------------------------------------------------------------- */
 
 typedef float Matrix[4][4];
diff --git a/source/blender/pointcache/alembic/abc_group.h b/source/blender/pointcache/alembic/abc_group.h
index 9dfa9eb..594b624 100644
--- a/source/blender/pointcache/alembic/abc_group.h
+++ b/source/blender/pointcache/alembic/abc_group.h
@@ -66,7 +66,11 @@ class AbcDupligroupWriter : public GroupWriter, public AbcWriter {
 public:
 	typedef std::vector<Abc::ObjectWriterPtr> WriterList;
 	
+	typedef std::map<ID*, Writer*> IDWriterMap;
+	typedef std::pair<ID*, Writer*> IDWriterPair;
+	
 	AbcDupligroupWriter(const std::string &name, EvaluationContext *eval_ctx, Scene *scene, Group *group);
+	~AbcDupligroupWriter();
 	
 	void open_archive(WriterArchive *archive);
 	
@@ -74,12 +78,15 @@ public:
 	void write_sample_object(Object *ob);
 	void write_sample_dupli(DupliObject *dob, int index);
 	
+	Writer *find_id_writer(ID *id) const;
+	
 private:
 	EvaluationContext *m_eval_ctx;
 	Scene *m_scene;
 	
 	Abc::OObject m_abc_group;
 	WriterList m_writers;
+	IDWriterMap m_id_writers;
 };
 
 PTCReadSampleResult abc_read_dupligroup(ReaderArchive *archive, float frame, Group *dupgroup, DupliCache *dupcache);
diff --git a/source/blender/pointcache/alembic/abc_object.cpp b/source/blender/pointcache/alembic/abc_object.cpp
index 95c634e..506a2f0 100644
--- a/source/blender/pointcache/alembic/abc_object.cpp
+++ b/source/blender/pointcache/alembic/abc_object.cpp
@@ -46,6 +46,7 @@ void AbcObjectWriter::open_archive(WriterArchive *archive)
 	}
 }
 
+#if 0
 void AbcObjectWriter::create_refs()
 {
 	if ((m_ob->transflag & OB_DUPLIGROUP) && m_ob->dup_group) {
@@ -54,11 +55,14 @@ void AbcObjectWriter::create_refs()
 			m_abc_object.addChildInstance(abc_group, "dup_group");
 	}
 }
+#endif
 
 void AbcObjectWriter::write_sample()
 {
-	if (!abc_archive()->archive)
+	if (!m_abc_object)
 		return;
+	
+	// TODO mesh, modifiers, sims ...
 }
 
 
diff --git a/source/blender/pointcache/alembic/abc_object.h b/source/blender/pointcache/alembic/abc_object.h
index fe94838..6a7f66a 100644
--- a/source/blender/pointcache/alembic/abc_object.h
+++ b/source/blender/pointcache/alembic/abc_object.h
@@ -39,7 +39,9 @@ public:
 	AbcObjectWriter(const std::string &name, Object *ob);
 	
 	void open_archive(WriterArchive *archive);
+#if 0
 	void create_refs();
+#endif
 	
 	void write_sample();
 	
diff --git a/source/blender/pointcache/intern/writer.h b/source/blender/pointcache/intern/writer.h
index 5d40bf7..7b1443d 100644
--- a/source/blender/pointcache/intern/writer.h
+++ b/source/blender/pointcache/intern/writer.h
@@ -60,7 +60,6 @@ protected:
 	std::string m_name;
 	ID *m_id;
 	
-private:
 	WriterArchive *m_archive;
 };




More information about the Bf-blender-cvs mailing list