[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