[Bf-blender-cvs] [f4fd1f1f4bf] blender2.8: Particle edit: Move cache update to particle batch cache implementation
Sergey Sharybin
noreply at git.blender.org
Tue May 15 17:21:39 CEST 2018
Commit: f4fd1f1f4bf709fa3b95c4408ec3f9beb83ff9a9
Author: Sergey Sharybin
Date: Tue May 15 12:44:55 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBf4fd1f1f4bf709fa3b95c4408ec3f9beb83ff9a9
Particle edit: Move cache update to particle batch cache implementation
The idea is to allow "regular" strands to update edit cache and hence
get the final update strands.
===================================================================
M source/blender/draw/intern/draw_cache_impl_particles.c
M source/blender/draw/modes/particle_mode.c
===================================================================
diff --git a/source/blender/draw/intern/draw_cache_impl_particles.c b/source/blender/draw/intern/draw_cache_impl_particles.c
index c8984ab01ec..f9b3735eb42 100644
--- a/source/blender/draw/intern/draw_cache_impl_particles.c
+++ b/source/blender/draw/intern/draw_cache_impl_particles.c
@@ -615,14 +615,55 @@ static void particle_batch_cache_ensure_pos(Object *object,
}
}
+static void drw_particle_update_ptcache_edit(Object *object_eval,
+ PTCacheEdit *edit)
+{
+ if (edit->psys == NULL) {
+ return;
+ }
+ /* NOTE: Get flag from particle system coming from drawing object.
+ * this is where depsgraph will be setting flags to.
+ */
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+ Scene *scene_orig = (Scene *)DEG_get_original_id(&draw_ctx->scene->id);
+ Object *object_orig = DEG_get_original_object(object_eval);
+ if (edit->psys->flag & PSYS_HAIR_UPDATED) {
+ PE_update_object(draw_ctx->depsgraph, scene_orig, object_orig, 0);
+ }
+ if (edit->pathcache == NULL) {
+ Depsgraph *depsgraph = draw_ctx->depsgraph;
+ psys_cache_edit_paths(depsgraph,
+ scene_orig, object_orig,
+ edit,
+ DEG_get_ctime(depsgraph),
+ DEG_get_mode(depsgraph) == DAG_EVAL_RENDER);
+ }
+}
+
+static void drw_particle_update_ptcache(Object *object_eval)
+{
+ if ((object_eval->mode & OB_MODE_PARTICLE_EDIT) == 0) {
+ return;
+ }
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+ Scene *scene_orig = (Scene *)DEG_get_original_id(&draw_ctx->scene->id);
+ Object *object_orig = DEG_get_original_object(object_eval);
+ PTCacheEdit *edit = PE_create_current(
+ draw_ctx->depsgraph, scene_orig, object_orig);
+ if (edit != NULL) {
+ drw_particle_update_ptcache_edit(object_eval, edit);
+ }
+}
+
Gwn_Batch *DRW_particles_batch_cache_get_hair(
- Object *UNUSED(object),
+ Object *object,
ParticleSystem *psys,
ModifierData *md)
{
ParticleBatchCache *cache = particle_batch_cache_get(psys);
if (cache->hair.hairs == NULL) {
+ drw_particle_update_ptcache(object);
ensure_seg_pt_count(NULL, psys, &cache->hair);
particle_batch_cache_ensure_pos_and_seg(NULL, psys, md, &cache->hair);
cache->hair.hairs = GWN_batch_create(GWN_PRIM_LINE_STRIP,
@@ -646,7 +687,7 @@ Gwn_Batch *DRW_particles_batch_cache_get_dots(Object *object, ParticleSystem *ps
}
Gwn_Batch *DRW_particles_batch_cache_get_edit_strands(
- Object *UNUSED(object),
+ Object *object,
ParticleSystem *psys,
PTCacheEdit *edit)
{
@@ -654,6 +695,7 @@ Gwn_Batch *DRW_particles_batch_cache_get_edit_strands(
if (cache->edit_hair.hairs != NULL) {
return cache->edit_hair.hairs;
}
+ drw_particle_update_ptcache_edit(object, edit);
ensure_seg_pt_count(edit, psys, &cache->edit_hair);
particle_batch_cache_ensure_pos_and_seg(edit, psys, NULL, &cache->edit_hair);
cache->edit_hair.hairs = GWN_batch_create(GWN_PRIM_LINE_STRIP,
@@ -729,7 +771,7 @@ static void particle_batch_cache_ensure_edit_inner_pos(
}
Gwn_Batch *DRW_particles_batch_cache_get_edit_inner_points(
- Object *UNUSED(object),
+ Object *object,
ParticleSystem *psys,
PTCacheEdit *edit)
{
@@ -737,6 +779,7 @@ Gwn_Batch *DRW_particles_batch_cache_get_edit_inner_points(
if (cache->edit_inner_points != NULL) {
return cache->edit_inner_points;
}
+ drw_particle_update_ptcache_edit(object, edit);
ensure_edit_inner_points_count(edit, cache);
particle_batch_cache_ensure_edit_inner_pos(edit, cache);
cache->edit_inner_points = GWN_batch_create(GWN_PRIM_POINTS,
@@ -793,7 +836,7 @@ static void particle_batch_cache_ensure_edit_tip_pos(
}
Gwn_Batch *DRW_particles_batch_cache_get_edit_tip_points(
- Object *UNUSED(object),
+ Object *object,
ParticleSystem *psys,
PTCacheEdit *edit)
{
@@ -801,6 +844,7 @@ Gwn_Batch *DRW_particles_batch_cache_get_edit_tip_points(
if (cache->edit_tip_points != NULL) {
return cache->edit_tip_points;
}
+ drw_particle_update_ptcache_edit(object, edit);
ensure_edit_tip_points_count(edit, cache);
particle_batch_cache_ensure_edit_tip_pos(edit, cache);
cache->edit_tip_points = GWN_batch_create(GWN_PRIM_POINTS,
diff --git a/source/blender/draw/modes/particle_mode.c b/source/blender/draw/modes/particle_mode.c
index 49e7d24c113..39af98d7165 100644
--- a/source/blender/draw/modes/particle_mode.c
+++ b/source/blender/draw/modes/particle_mode.c
@@ -139,32 +139,6 @@ static void particle_cache_init(void *vedata)
DRW_shgroup_uniform_float(stl->g_data->tip_points_group, "outlineWidth", &outline_width, 1);
}
-static void draw_update_ptcache_edit(Object *object_eval,
- ParticleSystem *psys,
- PTCacheEdit *edit)
-{
- if (edit->psys == NULL) {
- return;
- }
- /* NOTE: Get flag from particle system coming from drawing object.
- * this is where depsgraph will be setting flags to.
- */
- const DRWContextState *draw_ctx = DRW_context_state_get();
- Scene *scene_orig = (Scene *)DEG_get_original_id(&draw_ctx->scene->id);
- Object *object_orig = DEG_get_original_object(object_eval);
- if (psys->flag & PSYS_HAIR_UPDATED) {
- PE_update_object(draw_ctx->depsgraph, scene_orig, object_orig, 0);
- }
- if (edit->pathcache == NULL) {
- Depsgraph *depsgraph = draw_ctx->depsgraph;
- psys_cache_edit_paths(depsgraph,
- scene_orig, object_orig,
- edit,
- DEG_get_ctime(depsgraph),
- DEG_get_mode(depsgraph) == DAG_EVAL_RENDER);
- }
-}
-
static void particle_edit_cache_populate(void *vedata,
Object *object,
ParticleSystem *psys,
@@ -172,7 +146,6 @@ static void particle_edit_cache_populate(void *vedata,
{
PARTICLE_StorageList *stl = ((PARTICLE_Data *)vedata)->stl;
const DRWContextState *draw_ctx = DRW_context_state_get();
- draw_update_ptcache_edit(object, psys, edit);
ParticleEditSettings *pset = PE_settings(draw_ctx->scene);
{
struct Gwn_Batch *strands =
More information about the Bf-blender-cvs
mailing list