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.
This commit is contained in:
2018-05-15 12:44:55 +02:00
parent e83cee73eb
commit f4fd1f1f4b
2 changed files with 48 additions and 31 deletions

View File

@@ -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,

View File

@@ -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 =