[Bf-blender-cvs] [bb2e8ee] alembic_pointcache: Render/Viewport evaluation mode for cache libraries.

Lukas Tönne noreply at git.blender.org
Wed Mar 4 12:53:47 CET 2015


Commit: bb2e8ee262c5265596e3d240323c161b723ca897
Author: Lukas Tönne
Date:   Tue Mar 3 19:29:06 2015 +0100
Branches: alembic_pointcache
https://developer.blender.org/rBbb2e8ee262c5265596e3d240323c161b723ca897

Render/Viewport evaluation mode for cache libraries.

This designates a cache library to be used either for the viewport or
for renders. A "Render" cache library will evaluate modifiers with
render settings and a "Viewport" cache library will use viewport
(realtime) settings.

When reading the cache, the library will only be
used for the assigned purpose, i.e. a Render cache does not work for
viewport caching and vice-versa (although a cache can be baked for one
setting and then switched afterward).

Note that render results will never be visible in the realtime viewport
due to the way object evaluation is handled in Blender at this point
(render settings are only evaluated explicitly during renderer sync).

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

M	release/scripts/startup/bl_ui/properties_scene.py
M	source/blender/blenkernel/BKE_cache_library.h
M	source/blender/blenkernel/BKE_cloth.h
M	source/blender/blenkernel/intern/DerivedMesh.c
M	source/blender/blenkernel/intern/cache_library.c
M	source/blender/blenkernel/intern/cloth.c
M	source/blender/blenkernel/intern/particle.c
M	source/blender/blenkernel/intern/particle_system.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/editors/io/io_cache_library.c
M	source/blender/makesdna/DNA_cache_library_types.h
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/makesrna/intern/rna_cache_library.c
M	source/blender/modifiers/intern/MOD_cache.c
M	source/blender/modifiers/intern/MOD_cloth.c
M	source/blender/pointcache/PTC_api.cpp
M	source/blender/pointcache/PTC_api.h
M	source/blender/pointcache/alembic/abc_mesh.cpp
M	source/blender/pointcache/alembic/abc_mesh.h
M	source/blender/pointcache/alembic/alembic.cpp
M	source/blender/pointcache/intern/export.cpp
M	source/blender/pointcache/intern/export.h
M	source/blender/pointcache/intern/ptc_types.h

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

diff --git a/release/scripts/startup/bl_ui/properties_scene.py b/release/scripts/startup/bl_ui/properties_scene.py
index 218ccb1..1c40742 100644
--- a/release/scripts/startup/bl_ui/properties_scene.py
+++ b/release/scripts/startup/bl_ui/properties_scene.py
@@ -496,6 +496,7 @@ class SCENE_PT_cache_manager(SceneButtonsPanel, Panel):
         row = col.row(align=True)
         row.prop(cachelib, "read", text="Read", toggle=True)
         row.operator("cachelibrary.bake")
+        col.prop(cachelib, "eval_mode", expand=False)
 
         row = layout.row(align=True)
         row.label("Filter:")
diff --git a/source/blender/blenkernel/BKE_cache_library.h b/source/blender/blenkernel/BKE_cache_library.h
index a9b289d..49652bf 100644
--- a/source/blender/blenkernel/BKE_cache_library.h
+++ b/source/blender/blenkernel/BKE_cache_library.h
@@ -96,7 +96,15 @@ void BKE_cache_library_group_update(struct Main *bmain, struct CacheLibrary *cac
 bool BKE_cache_archive_path_test(const char *path, ID *id, Library *lib);
 void BKE_cache_archive_path(const char *path, ID *id, Library *lib, char *result, int max);
 
-void BKE_cache_library_writers(struct Scene *scene, int required_mode, struct CacheLibrary *cachelib, struct ListBase *writers);
+/* temporary list of writers for CacheLibrary */
+typedef struct CacheLibraryWriterLink {
+	struct CacheLibraryWriterLink *next, *prev;
+	
+	struct CacheItem *item;
+	struct PTCWriter *writer;
+} CacheLibraryWriterLink;
+
+void BKE_cache_library_writers(struct CacheLibrary *cachelib, struct Scene *scene, struct DerivedMesh **render_dm_ptr, struct ListBase *writers);
 struct PTCWriterArchive *BKE_cache_library_writers_open_archive(struct Scene *scene, struct CacheLibrary *cachelib, struct ListBase *writers);
 void BKE_cache_library_writers_free(struct PTCWriterArchive *archive, struct ListBase *writers);
 
@@ -106,11 +114,17 @@ eCacheReadSampleResult BKE_cache_library_read_particles(struct Scene *scene, flo
 eCacheReadSampleResult BKE_cache_library_read_particles_pathcache_parents(struct Scene *scene, float frame, struct CacheLibrary *cachelib, struct Object *ob, struct ParticleSystem *psys);
 eCacheReadSampleResult BKE_cache_library_read_particles_pathcache_children(struct Scene *scene, float frame, struct CacheLibrary *cachelib, struct Object *ob, struct ParticleSystem *psys);
 
-bool BKE_cache_read_derived_mesh(struct Main *bmain, struct Scene *scene, float frame, struct Object *ob, struct DerivedMesh **r_dm);
-bool BKE_cache_read_cloth(struct Main *bmain, struct Scene *scene, float frame, struct Object *ob, struct ClothModifierData *clmd);
-bool BKE_cache_read_hair_dynamics(struct Main *bmain, struct Scene *scene, float frame, struct Object *ob, struct ParticleSystem *psys);
-bool BKE_cache_read_particles(struct Main *bmain, struct Scene *scene, float frame, struct Object *ob, struct ParticleSystem *psys);
-bool BKE_cache_read_particles_pathcache_parents(struct Main *bmain, struct Scene *scene, float frame, struct Object *ob, struct ParticleSystem *psys);
-bool BKE_cache_read_particles_pathcache_children(struct Main *bmain, struct Scene *scene, float frame, struct Object *ob, struct ParticleSystem *psys);
+bool BKE_cache_read_derived_mesh(struct Main *bmain, struct Scene *scene, float frame, eCacheLibrary_EvalMode eval_mode,
+                                 struct Object *ob, struct DerivedMesh **r_dm);
+bool BKE_cache_read_cloth(struct Main *bmain, struct Scene *scene, float frame, eCacheLibrary_EvalMode eval_mode,
+                          struct Object *ob, struct ClothModifierData *clmd);
+bool BKE_cache_read_hair_dynamics(struct Main *bmain, struct Scene *scene, float frame, eCacheLibrary_EvalMode eval_mode,
+                                  struct Object *ob, struct ParticleSystem *psys);
+bool BKE_cache_read_particles(struct Main *bmain, struct Scene *scene, float frame, eCacheLibrary_EvalMode eval_mode,
+                              struct Object *ob, struct ParticleSystem *psys);
+bool BKE_cache_read_particles_pathcache_parents(struct Main *bmain, struct Scene *scene, float frame, eCacheLibrary_EvalMode eval_mode,
+                                                struct Object *ob, struct ParticleSystem *psys);
+bool BKE_cache_read_particles_pathcache_children(struct Main *bmain, struct Scene *scene, float frame, eCacheLibrary_EvalMode eval_mode,
+                                                 struct Object *ob, struct ParticleSystem *psys);
 
 #endif
diff --git a/source/blender/blenkernel/BKE_cloth.h b/source/blender/blenkernel/BKE_cloth.h
index 1a13d05..358bfbb 100644
--- a/source/blender/blenkernel/BKE_cloth.h
+++ b/source/blender/blenkernel/BKE_cloth.h
@@ -233,7 +233,7 @@ void cloth_free_contacts(ColliderContacts *collider_contacts, int totcolliders);
 void cloth_free_modifier_extern (struct ClothModifierData *clmd );
 void cloth_free_modifier (struct ClothModifierData *clmd );
 void cloth_init (struct ClothModifierData *clmd );
-void clothModifier_do (struct ClothModifierData *clmd, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, float (*vertexCos)[3]);
+void clothModifier_do (struct ClothModifierData *clmd, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, float (*vertexCos)[3], bool use_render);
 
 int cloth_uses_vgroup(struct ClothModifierData *clmd);
 
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 3be32ca..902f448 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -1522,7 +1522,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
 	float (*deformedVerts)[3] = NULL;
 	DerivedMesh *dm = NULL, *cachedm = NULL, *orcodm, *clothorcodm, *finaldm;
 	int numVerts = me->totvert;
-	int required_mode;
+	int required_mode, cache_eval_mode;
 	bool isPrevDeform = false;
 	MultiresModifierData *mmd = get_multires_modifier(scene, ob, 0);
 	const bool has_multires = (mmd && mmd->sculptlvl != 0);
@@ -1553,12 +1553,18 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
 	if (useDeform)
 		deform_app_flags |= MOD_APPLY_USECACHE;
 	
-	if (useRenderParams) required_mode = eModifierMode_Render;
-	else required_mode = eModifierMode_Realtime;
+	if (useRenderParams) {
+		required_mode = eModifierMode_Render;
+		cache_eval_mode = CACHE_LIBRARY_EVAL_RENDER;
+	}
+	else {
+		required_mode = eModifierMode_Realtime;
+		cache_eval_mode = CACHE_LIBRARY_EVAL_VIEWPORT;
+	}
 	
 	modifiers_clearErrors(ob);
 	
-	if (BKE_cache_read_derived_mesh(G.main, scene, scene->r.cfra, ob, &cachedm)) {
+	if (BKE_cache_read_derived_mesh(G.main, scene, scene->r.cfra, cache_eval_mode, ob, &cachedm)) {
 		CacheModifierData *cmd = (CacheModifierData *)mesh_find_cache_modifier(scene, ob, required_mode);
 		if (cmd) {
 			firstmd = &cmd->modifier;
diff --git a/source/blender/blenkernel/intern/cache_library.c b/source/blender/blenkernel/intern/cache_library.c
index 279118b..d0bf244 100644
--- a/source/blender/blenkernel/intern/cache_library.c
+++ b/source/blender/blenkernel/intern/cache_library.c
@@ -645,17 +645,26 @@ void BKE_cache_archive_path(const char *path, ID *id, Library *lib, char *result
 }
 
 
-static void cachelib_add_writer(ListBase *writers, struct PTCWriter *writer)
+static void cachelib_add_writer(ListBase *writers, struct CacheItem *item, struct PTCWriter *writer)
 {
 	if (writer) {
-		LinkData *link = (LinkData *)MEM_callocN(sizeof(LinkData), "cachelib writers link");
-		link->data = writer;
+		CacheLibraryWriterLink *link = MEM_callocN(sizeof(CacheLibraryWriterLink), "cachelib writers link");
+		
+		link->item = item;
+		link->writer = writer;
 		BLI_addtail(writers, link);
 	}
 }
 
-void BKE_cache_library_writers(Scene *scene, int required_mode, CacheLibrary *cachelib, ListBase *writers)
+static int cachelib_writers_cmp(const void *a, const void *b)
+{
+	const CacheLibraryWriterLink *la = a, *lb = b;
+	return la->item->ob > lb->item->ob;
+}
+
+void BKE_cache_library_writers(CacheLibrary *cachelib, Scene *scene, DerivedMesh **render_dm_ptr, ListBase *writers)
 {
+	const eCacheLibrary_EvalMode eval_mode = cachelib->eval_mode;
 	CacheItem *item;
 	
 	BLI_listbase_clear(writers);
@@ -670,32 +679,50 @@ void BKE_cache_library_writers(Scene *scene, int required_mode, CacheLibrary *ca
 		
 		switch (item->type) {
 			case CACHE_TYPE_DERIVED_MESH: {
-				CacheModifierData *cachemd = (CacheModifierData *)mesh_find_cache_modifier(scene, item->ob, required_mode);
-				if (cachemd)
-					cachelib_add_writer(writers, PTC_writer_cache_modifier(name, item->ob, cachemd));
-				else
-					cachelib_add_writer(writers, PTC_writer_derived_final(name, item->ob));
+				if (item->ob->type == OB_MESH) {
+					CacheModifierData *cachemd = (CacheModifierData *)mesh_find_cache_modifier(scene, item->ob, CD_MASK_MESH);
+					if (cachemd) {
+						switch (eval_mode) {
+							case CACHE_LIBRARY_EVAL_VIEWPORT:
+								cachelib_add_writer(writers, item, PTC_writer_cache_modifier_realtime(name, item->ob, cachemd));
+								break;
+							case CACHE_LIBRARY_EVAL_RENDER:
+								cachelib_add_writer(writers, item, PTC_writer_cache_modifier_render(name, scene, item->ob, cachemd));
+								break;
+						}
+					}
+					else {
+						switch (eval_mode) {
+							case CACHE_LIBRARY_EVAL_VIEWPORT:
+								cachelib_add_writer(writers, item, PTC_writer_derived_final_realtime(name, item->ob));
+								break;
+							case CACHE_LIBRARY_EVAL_RENDER:
+								cachelib_add_writer(writers, item, PTC_writer_derived_final_render(name, scene, item->ob, render_dm_ptr));
+								break;
+						}
+					}
+				}
 				break;
 			}
 			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, PTC_writer_hair_dynamics(name, item->ob, psys->clmd));
+					cachelib_add_writer(writers, item, PTC_writer_hair_dynamics(name, item->ob, psys->clmd));
 				}
 				break;
 			}
 			case CACHE_TYPE_HAIR_PATHS: {
 				ParticleSystem *psys = (ParticleSystem *)BLI_findlink(&item->ob->particlesystem, item->index)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list