[Bf-blender-cvs] [e84b0d4] alembic_pointcache: Working implementation of cache reading for dupli data during renders.
Lukas Tönne
noreply at git.blender.org
Fri Mar 20 14:50:44 CET 2015
Commit: e84b0d456f963faf1cb0c3c180fa851e2cb6b070
Author: Lukas Tönne
Date: Fri Mar 20 14:48:51 2015 +0100
Branches: alembic_pointcache
https://developer.blender.org/rBe84b0d456f963faf1cb0c3c180fa851e2cb6b070
Working implementation of cache reading for dupli data during renders.
===================================================================
M intern/cycles/blender/blender_mesh.cpp
M intern/cycles/blender/blender_object.cpp
M intern/cycles/blender/blender_sync.h
M intern/cycles/blender/blender_util.h
M source/blender/blenkernel/BKE_anim.h
M source/blender/blenkernel/BKE_cache_library.h
M source/blender/blenkernel/BKE_mesh.h
M source/blender/blenkernel/intern/cache_library.c
M source/blender/blenkernel/intern/mesh.c
M source/blender/blenkernel/intern/object_dupli.c
M source/blender/makesrna/intern/rna_main_api.c
M source/blender/makesrna/intern/rna_object.c
M source/blender/pointcache/PTC_api.cpp
M source/blender/pointcache/PTC_api.h
M source/blender/pointcache/alembic/abc_group.cpp
M source/blender/pointcache/alembic/abc_group.h
M source/blender/pointcache/alembic/alembic.cpp
M source/blender/pointcache/intern/ptc_types.h
===================================================================
diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index 2d634f4..787e009 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -587,8 +587,10 @@ static void create_subd_mesh(Scene *scene, Mesh *mesh, BL::Mesh b_mesh, PointerR
/* Sync */
-Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool object_updated, bool hide_tris, BL::Object b_ob_parent)
+Mesh *BlenderSync::sync_mesh(BL::Object b_parent, bool object_updated, bool hide_tris, BL::DupliObject b_dupli_ob)
{
+ BL::Object b_ob = (b_dupli_ob ? b_dupli_ob.object() : b_parent);
+
/* When viewport display is not needed during render we can force some
* caches to be releases from blender side in order to reduce peak memory
* footprint during synchronization process.
@@ -623,11 +625,14 @@ Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool object_updated, bool hide_tri
bool use_mesh_geometry = render_layer.use_surfaces || render_layer.use_hair;
Mesh *mesh;
- BL::DupliObjectData b_dup_data = (b_ob_parent && b_ob_parent.use_dupli_cache_read())? b_ob_parent.find_dupli_cache(b_ob): BL::DupliObjectData(PointerRNA_NULL);
bool need_update;
- if (b_dup_data) {
- MeshKey key = MeshKey(b_ob_parent, b_ob);
- need_update = mesh_map.sync(&mesh, b_ob_parent, PointerRNA_NULL, key);
+ bool use_dupli_override = b_dupli_ob && b_parent.cache_library() && b_parent.use_dupli_cache_read();
+ if (use_dupli_override) {
+ /* if a dupli override (cached data) is used, identify the mesh by object and parent together,
+ * so that individual per-dupli overrides are possible.
+ */
+ MeshKey key = MeshKey(b_parent, b_ob);
+ need_update = mesh_map.sync(&mesh, b_parent, PointerRNA_NULL, key);
}
else {
BL::ID key = (BKE_object_is_modified(b_ob))? b_ob: b_ob_data;
@@ -685,8 +690,8 @@ Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool object_updated, bool hide_tri
b_ob.update_from_editmode();
bool need_undeformed = mesh->need_attribute(scene, ATTR_STD_GENERATED);
- BL::Mesh b_mesh = (b_dup_data)?
- dupli_cache_to_mesh(b_data, b_dup_data, need_undeformed):
+ BL::Mesh b_mesh = (b_dupli_ob && b_parent)?
+ dupli_to_mesh(b_data, b_scene, b_parent, b_dupli_ob, !preview, need_undeformed):
object_to_mesh(b_data, b_ob, b_scene, true, !preview, need_undeformed);
if(b_mesh) {
diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp
index d3ef4ed..a129289 100644
--- a/intern/cycles/blender/blender_object.cpp
+++ b/intern/cycles/blender/blender_object.cpp
@@ -281,7 +281,7 @@ Object *BlenderSync::sync_object(BL::Object b_parent, int persistent_id[OBJECT_P
/* mesh sync */
if (b_dupli_ob)
- object->mesh = sync_mesh(b_ob, object_updated, hide_tris, b_parent);
+ object->mesh = sync_mesh(b_parent, object_updated, hide_tris, b_dupli_ob);
else
object->mesh = sync_mesh(b_ob, object_updated, hide_tris);
diff --git a/intern/cycles/blender/blender_sync.h b/intern/cycles/blender/blender_sync.h
index 70340cc..6ca3f26 100644
--- a/intern/cycles/blender/blender_sync.h
+++ b/intern/cycles/blender/blender_sync.h
@@ -83,7 +83,7 @@ private:
void sync_curve_settings();
void sync_nodes(Shader *shader, BL::ShaderNodeTree b_ntree);
- Mesh *sync_mesh(BL::Object b_ob, bool object_updated, bool hide_tris, BL::Object b_ob_parent = PointerRNA_NULL);
+ Mesh *sync_mesh(BL::Object b_parent, bool object_updated, bool hide_tris, BL::DupliObject b_dupli_ob = PointerRNA_NULL);
void sync_curves(Mesh *mesh, BL::Mesh b_mesh, BL::Object b_ob, bool motion, int time_index = 0);
Object *sync_object(BL::Object b_parent, int persistent_id[OBJECT_PERSISTENT_ID_SIZE], BL::DupliObject b_dupli_ob,
Transform& tfm, uint layer_flag, float motion_time, bool hide_tris);
diff --git a/intern/cycles/blender/blender_util.h b/intern/cycles/blender/blender_util.h
index 5878d25..f2935d9 100644
--- a/intern/cycles/blender/blender_util.h
+++ b/intern/cycles/blender/blender_util.h
@@ -52,9 +52,9 @@ static inline BL::Mesh object_to_mesh(BL::BlendData data, BL::Object object, BL:
return me;
}
-static inline BL::Mesh dupli_cache_to_mesh(BL::BlendData data, BL::DupliObjectData dupli_data, bool calc_undeformed)
+static inline BL::Mesh dupli_to_mesh(BL::BlendData data, BL::Scene scene, BL::Object parent, BL::DupliObject dob, bool render, bool calc_undeformed)
{
- BL::Mesh me = data.meshes.new_from_dupli_cache(dupli_data, false, calc_undeformed);
+ BL::Mesh me = data.meshes.new_from_dupli(scene, parent, dob, (render)? 2: 1, false, calc_undeformed);
if ((bool)me) {
if (me.use_auto_smooth()) {
me.calc_normals_split();
diff --git a/source/blender/blenkernel/BKE_anim.h b/source/blender/blenkernel/BKE_anim.h
index 04cb2b0..ce965a1 100644
--- a/source/blender/blenkernel/BKE_anim.h
+++ b/source/blender/blenkernel/BKE_anim.h
@@ -84,6 +84,10 @@ void BKE_object_dupli_cache_free(struct Object *ob);
bool BKE_object_dupli_cache_contains(struct Object *ob, struct Object *other);
struct DupliObjectData *BKE_dupli_cache_find_data(struct DupliCache *dupcache, struct Object *ob);
+void BKE_dupli_object_data_init(struct DupliObjectData *data, struct Object *ob, struct DerivedMesh *dm);
+/* does not free data itself */
+void BKE_dupli_object_data_clear(struct DupliObjectData *data);
+
struct DupliObjectData *BKE_dupli_cache_add_mesh(struct DupliCache *dupcache, struct Object *ob, struct DerivedMesh *dm);
void BKE_dupli_cache_add_instance(struct DupliCache *dupcache, float obmat[4][4], struct DupliObjectData *data);
diff --git a/source/blender/blenkernel/BKE_cache_library.h b/source/blender/blenkernel/BKE_cache_library.h
index a25c21d..48e2e7f 100644
--- a/source/blender/blenkernel/BKE_cache_library.h
+++ b/source/blender/blenkernel/BKE_cache_library.h
@@ -41,6 +41,7 @@ struct Scene;
struct EvaluationContext;
struct ParticleSystem;
struct DupliCache;
+struct DupliObjectData;
struct ClothModifierData;
@@ -100,7 +101,9 @@ void BKE_cache_archive_path(const char *path, ID *id, Library *lib, char *result
void BKE_cache_library_dag_recalc_tag(struct EvaluationContext *eval_ctx, struct Main *bmain);
-bool BKE_cache_read_dupligroup(struct Scene *scene, float frame, eCacheLibrary_EvalMode eval_mode,
- struct Group *dupgroup, struct DupliCache *dupcache, struct CacheLibrary *cachelib);
+bool BKE_cache_read_dupli_cache(struct Scene *scene, float frame, eCacheLibrary_EvalMode eval_mode,
+ struct Group *dupgroup, struct DupliCache *dupcache, struct CacheLibrary *cachelib);
+bool BKE_cache_read_dupli_object(struct Scene *scene, float frame, eCacheLibrary_EvalMode eval_mode,
+ struct Object *ob, struct DupliObjectData *data, struct CacheLibrary *cachelib);
#endif
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index 53022a5..c88b102 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -133,7 +133,7 @@ float (*BKE_mesh_vertexCos_get(struct Mesh *me, int *r_numVerts))[3];
struct Mesh *BKE_mesh_new_from_object(struct Main *bmain, struct Scene *sce, struct Object *ob,
int apply_modifiers, int settings, int calc_tessface, int calc_undeformed);
-struct Mesh *BKE_mesh_new_from_dupli_cache(struct Main *bmain, struct DupliObjectData *data, bool calc_tessface, bool calc_undeformed);
+struct Mesh *BKE_mesh_new_from_dupli_data(struct Main *bmain, struct DupliObjectData *data, bool calc_tessface, bool calc_undeformed);
/* vertex level transformations & checks (no derived mesh) */
diff --git a/source/blender/blenkernel/intern/cache_library.c b/source/blender/blenkernel/intern/cache_library.c
index c4dc4da..20a6a13 100644
--- a/source/blender/blenkernel/intern/cache_library.c
+++ b/source/blender/blenkernel/intern/cache_library.c
@@ -650,7 +650,7 @@ void BKE_cache_archive_path(const char *path, ID *id, Library *lib, char *result
}
-bool BKE_cache_read_dupligroup(Scene *scene, float frame, eCacheLibrary_EvalMode eval_mode,
+bool BKE_cache_read_dupli_cache(Scene *scene, float frame, eCacheLibrary_EvalMode eval_mode,
struct Group *dupgroup, struct DupliCache *dupcache, CacheLibrary *cachelib)
{
char filename[FILE_MAX];
@@ -668,7 +668,38 @@ bool BKE_cache_read_dupligroup(Scene *scene, float frame, eCacheLibrary_EvalMode
if (!archive)
return false;
- reader = PTC_reader_dupligroup(dupgroup->id.name, dupgroup, dupcache);
+ reader = PTC_reader_duplicache(dupgroup->id.name, dupgroup, dupcache);
+ PTC_reader_init(reader, archive);
+
+ result = BKE_cache_read_result(PTC_read_sample(reader, frame));
+
+ PTC_reader_free(reader);
+ PTC_close_reader_archive(archive);
+
+ return true;
+}
+
+bool BKE_cache_read_dupli_object(Scene *scene, float frame, eCacheLibrary_EvalMode eval_mode,
+ struct Object *ob, struct DupliObjectData *data, CacheLibrary *cachelib)
+{
+ char filename[FILE_MAX];
+ struct PTCReaderArchive *archive;
+ struct PTCReader *reader;
+ eCacheReadSampleResult result;
+
+ if (!data || !ob || !cachelib)
+ return false;
+ if (!(cachelib->eval_mode & eval_mode))
+ return false;
+
+ BKE_cache_archive_path(cachelib->filepath, (ID *)cachelib, cachelib->id.lib, filename, sizeof(filename));
+ archive = PTC_open_reader_archive(scene, filename);
+ if (!archive)
+ return false;
+
+ PTC_reader_archive_use_render(archive, eval_mode == CACHE_LIBRARY_EVAL_RENDER);
+
+ reader = PTC_reader_duplicache_object(ob->id.name, ob, data);
PTC_reader_init(reader, archive);
result = BKE_cache_read_result(PTC_read_sample(reader, frame));
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index 49c8dff..5f75d00 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -2341,7 +2341,7 @@ Mesh *BKE_mesh_new_from_object(
/* settings: 1 - preview, 2 - render */
-Mesh *BKE_mesh_new_from_dupli_cache(
+Mesh *BKE_mesh_new_from_dupli_data(
Main *bmain, DupliObjectData *data,
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list