[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