[Bf-blender-cvs] [66f9cda] gooseberry: Cache reading for particle paths.

Lukas Tönne noreply at git.blender.org
Mon Mar 23 13:01:39 CET 2015


Commit: 66f9cda5b3cc577d127c3776bf2bf9916feae22b
Author: Lukas Tönne
Date:   Thu Feb 26 14:05:49 2015 +0100
Branches: gooseberry
https://developer.blender.org/rB66f9cda5b3cc577d127c3776bf2bf9916feae22b

Cache reading for particle paths.

Conflicts:
	source/blender/blenkernel/intern/particle.c

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

M	source/blender/blenkernel/BKE_cache_library.h
M	source/blender/blenkernel/intern/cache_library.c
M	source/blender/blenkernel/intern/particle.c

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

diff --git a/source/blender/blenkernel/BKE_cache_library.h b/source/blender/blenkernel/BKE_cache_library.h
index 7c56ad8..c5160e6 100644
--- a/source/blender/blenkernel/BKE_cache_library.h
+++ b/source/blender/blenkernel/BKE_cache_library.h
@@ -38,6 +38,7 @@ struct ListBase;
 struct Main;
 struct Object;
 struct Scene;
+struct ParticleSystem;
 
 struct ClothModifierData;
 
@@ -90,5 +91,7 @@ void BKE_cache_library_group_update(struct Main *bmain, struct CacheLibrary *cac
 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_particle_pathcache_parents(struct Main *bmain, struct Scene *scene, float frame, struct Object *ob, struct ParticleSystem *psys);
+bool BKE_cache_read_particle_pathcache_children(struct Main *bmain, struct Scene *scene, float frame, struct Object *ob, struct ParticleSystem *psys);
 
 #endif
diff --git a/source/blender/blenkernel/intern/cache_library.c b/source/blender/blenkernel/intern/cache_library.c
index a5bfd92..5914a62 100644
--- a/source/blender/blenkernel/intern/cache_library.c
+++ b/source/blender/blenkernel/intern/cache_library.c
@@ -547,3 +547,25 @@ bool BKE_cache_read_hair_dynamics(Main *bmain, Scene *scene, float frame, Object
 	}
 	return false;
 }
+
+bool BKE_cache_read_particle_pathcache_parents(Main *bmain, Scene *scene, float frame, Object *ob, struct ParticleSystem *psys)
+{
+	CacheLibrary *cachelib;
+	
+	for (cachelib = bmain->cache_library.first; cachelib; cachelib = cachelib->id.next) {
+		if (PTC_cachelib_read_sample_particle_pathcache_parents(scene, frame, cachelib, ob, psys) != PTC_READ_SAMPLE_INVALID)
+			return true;
+	}
+	return false;
+}
+
+bool BKE_cache_read_particle_pathcache_children(Main *bmain, Scene *scene, float frame, Object *ob, struct ParticleSystem *psys)
+{
+	CacheLibrary *cachelib;
+	
+	for (cachelib = bmain->cache_library.first; cachelib; cachelib = cachelib->id.next) {
+		if (PTC_cachelib_read_sample_particle_pathcache_children(scene, frame, cachelib, ob, psys) != PTC_READ_SAMPLE_INVALID)
+			return true;
+	}
+	return false;
+}
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index f081c96..ec4bd62 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -63,6 +63,7 @@
 #include "BKE_animsys.h"
 
 #include "BKE_boids.h"
+#include "BKE_cache_library.h"
 #include "BKE_cloth.h"
 #include "BKE_colortools.h"
 #include "BKE_effect.h"
@@ -1995,6 +1996,7 @@ void psys_cache_child_paths(ParticleSimulationData *sim, float cfra, int editupd
 	ParticleTask *tasks_parent, *tasks_child;
 	int numtasks_parent, numtasks_child;
 	int i, totchild, totparent;
+	bool cache_result;
 	
 	if (sim->psys->flag & PSYS_GLOBAL_HAIR)
 		return;
@@ -2019,32 +2021,40 @@ void psys_cache_child_paths(ParticleSimulationData *sim, float cfra, int editupd
 		sim->psys->totchildcache = totchild;
 	}
 	
-	/* cache parent paths */
-	ctx.parent_pass = 1;
-	psys_tasks_create(&ctx, totparent, &tasks_parent, &numtasks_parent);
-	for (i = 0; i < numtasks_parent; ++i) {
-		ParticleTask *task = &tasks_parent[i];
+	/* try reading from point cache */
+	cache_result = BKE_cache_read_particle_pathcache_parents(G.main, sim->scene, cfra, sim->ob, sim->psys);
+	if (!cache_result) {
+		/* cache parent paths */
+		ctx.parent_pass = 1;
+		psys_tasks_create(&ctx, totparent, &tasks_parent, &numtasks_parent);
+		for (i = 0; i < numtasks_parent; ++i) {
+			ParticleTask *task = &tasks_parent[i];
+			
+			psys_task_init_path(task, sim);
+			BLI_task_pool_push(task_pool, exec_child_path_cache, task, false, TASK_PRIORITY_LOW);
+		}
+		BLI_task_pool_work_and_wait(task_pool);
 		
-		psys_task_init_path(task, sim);
-		BLI_task_pool_push(task_pool, exec_child_path_cache, task, false, TASK_PRIORITY_LOW);
+		psys_tasks_free(tasks_parent, numtasks_parent);
 	}
-	BLI_task_pool_work_and_wait(task_pool);
 	
-	/* cache child paths */
-	ctx.parent_pass = 0;
-	psys_tasks_create(&ctx, totchild, &tasks_child, &numtasks_child);
-	for (i = 0; i < numtasks_child; ++i) {
-		ParticleTask *task = &tasks_child[i];
+	cache_result = BKE_cache_read_particle_pathcache_children(G.main, sim->scene, cfra, sim->ob, sim->psys);
+	if (!cache_result) {
+		/* cache child paths */
+		ctx.parent_pass = 0;
+		psys_tasks_create(&ctx, totchild, &tasks_child, &numtasks_child);
+		for (i = 0; i < numtasks_child; ++i) {
+			ParticleTask *task = &tasks_child[i];
+			
+			psys_task_init_path(task, sim);
+			BLI_task_pool_push(task_pool, exec_child_path_cache, task, false, TASK_PRIORITY_LOW);
+		}
+		BLI_task_pool_work_and_wait(task_pool);
 		
-		psys_task_init_path(task, sim);
-		BLI_task_pool_push(task_pool, exec_child_path_cache, task, false, TASK_PRIORITY_LOW);
+		psys_tasks_free(tasks_child, numtasks_child);
 	}
-	BLI_task_pool_work_and_wait(task_pool);
-
-	BLI_task_pool_free(task_pool);
 	
-	psys_tasks_free(tasks_parent, numtasks_parent);
-	psys_tasks_free(tasks_child, numtasks_child);
+	BLI_task_pool_free(task_pool);
 	
 	psys_thread_context_free(&ctx);
 }
@@ -2121,6 +2131,7 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra)
 	float length, vec[3];
 	float *vg_effector = NULL;
 	float *vg_length = NULL, pa_length = 1.0f;
+	bool cache_result;
 
 	/* we don't have anything valid to create paths from so let's quit here */
 	if ((psys->flag & PSYS_HAIR_DONE || psys->flag & PSYS_KEYED || psys->pointcache) == 0)
@@ -2134,6 +2145,11 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra)
 	psys_free_path_cache(psys, psys->edit);
 	cache = psys->pathcache = psys_alloc_path_cache_buffers(&psys->pathcachebufs, totpart, segments + 1);
 
+	/* try reading from cache */
+	cache_result = BKE_cache_read_particle_pathcache_parents(G.main, sim->scene, cfra, sim->ob, sim->psys);
+	if (cache_result)
+		return;
+
 	psys->lattice_deform_data = psys_create_lattice_deform_data(sim);
 	ma = give_current_material(sim->ob, psys->part->omat);
 	if (ma && (psys->part->draw_col == PART_DRAW_COL_MAT))




More information about the Bf-blender-cvs mailing list