[Bf-blender-cvs] [bdcf916] gooseberry: Use a nested Object writer to store the Object ID blocks used by dupli lists.
Lukas Tönne
noreply at git.blender.org
Mon Mar 23 13:03:31 CET 2015
Commit: bdcf91615d94da2b7e8acece0e0681443f95ce3c
Author: Lukas Tönne
Date: Fri Mar 13 18:04:23 2015 +0100
Branches: gooseberry
https://developer.blender.org/rBbdcf91615d94da2b7e8acece0e0681443f95ce3c
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