diff options
-rw-r--r-- | source/blender/draw/intern/draw_cache.c | 5 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_cache.h | 4 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_cache_impl.h | 2 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_cache_impl_particles.c | 13 | ||||
-rw-r--r-- | source/blender/draw/modes/particle_mode.c | 34 |
5 files changed, 43 insertions, 15 deletions
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c index aec1750edc5..15f4aa319bd 100644 --- a/source/blender/draw/intern/draw_cache.c +++ b/source/blender/draw/intern/draw_cache.c @@ -2886,6 +2886,11 @@ Gwn_Batch *DRW_cache_particles_get_dots(Object *object, ParticleSystem *psys) return DRW_particles_batch_cache_get_dots(object, psys); } +Gwn_Batch *DRW_cache_particles_get_edit_strands(struct PTCacheEdit* edit) +{ + return DRW_particles_batch_cache_get_edit_strands(edit); +} + Gwn_Batch *DRW_cache_particles_get_prim(int type) { switch (type) { diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h index dfaf126e425..82cfe77d613 100644 --- a/source/blender/draw/intern/draw_cache.h +++ b/source/blender/draw/intern/draw_cache.h @@ -28,8 +28,9 @@ struct Gwn_Batch; struct GPUMaterial; -struct Object; struct ModifierData; +struct Object; +struct PTCacheEdit; void DRW_shape_cache_free(void); @@ -168,6 +169,7 @@ struct Gwn_Batch *DRW_cache_lattice_vert_overlay_get(struct Object *ob); /* Particles */ struct Gwn_Batch *DRW_cache_particles_get_hair(struct ParticleSystem *psys, struct ModifierData *md); struct Gwn_Batch *DRW_cache_particles_get_dots(struct Object *object, struct ParticleSystem *psys); +struct Gwn_Batch *DRW_cache_particles_get_edit_strands(struct PTCacheEdit* edit); struct Gwn_Batch *DRW_cache_particles_get_prim(int type); /* Metaball */ diff --git a/source/blender/draw/intern/draw_cache_impl.h b/source/blender/draw/intern/draw_cache_impl.h index cfc57dd6e40..b537f1f0151 100644 --- a/source/blender/draw/intern/draw_cache_impl.h +++ b/source/blender/draw/intern/draw_cache_impl.h @@ -34,6 +34,7 @@ struct Gwn_VertBuf; struct ListBase; struct ModifierData; struct ParticleSystem; +struct PTCacheEdit; struct Curve; struct Lattice; @@ -124,5 +125,6 @@ void DRW_mesh_cache_sculpt_coords_ensure(struct Mesh *me); /* Particles */ struct Gwn_Batch *DRW_particles_batch_cache_get_hair(struct ParticleSystem *psys, struct ModifierData *md); struct Gwn_Batch *DRW_particles_batch_cache_get_dots(struct Object *object, struct ParticleSystem *psys); +struct Gwn_Batch *DRW_particles_batch_cache_get_edit_strands(struct PTCacheEdit* edit); #endif /* __DRAW_CACHE_IMPL_H__ */ diff --git a/source/blender/draw/intern/draw_cache_impl_particles.c b/source/blender/draw/intern/draw_cache_impl_particles.c index 4b69c017ba0..0cc3c001ef2 100644 --- a/source/blender/draw/intern/draw_cache_impl_particles.c +++ b/source/blender/draw/intern/draw_cache_impl_particles.c @@ -577,3 +577,16 @@ Gwn_Batch *DRW_particles_batch_cache_get_dots(Object *object, ParticleSystem *ps return cache->hairs; } + +Gwn_Batch *DRW_particles_batch_cache_get_edit_strands(PTCacheEdit* edit) +{ + ParticleSystem *psys = edit->psys; + ParticleBatchCache *cache = particle_batch_cache_get(psys); + if (cache->hairs != NULL) { + return cache->hairs; + } + ensure_seg_pt_count(psys, cache); + particle_batch_cache_ensure_pos_and_seg(psys, NULL, cache); + cache->hairs = GWN_batch_create(GWN_PRIM_LINE_STRIP, cache->pos, cache->indices); + return cache->hairs; +} diff --git a/source/blender/draw/modes/particle_mode.c b/source/blender/draw/modes/particle_mode.c index 25143afff14..eff7d9ca33b 100644 --- a/source/blender/draw/modes/particle_mode.c +++ b/source/blender/draw/modes/particle_mode.c @@ -52,7 +52,7 @@ extern char datatoc_particle_strand_frag_glsl[]; /* *********** LISTS *********** */ typedef struct PARTICLE_PassList { - struct DRWPass *hair_pass; + struct DRWPass *psys_edit_pass; } PARTICLE_PassList; typedef struct PARTICLE_FramebufferList { @@ -83,7 +83,7 @@ static struct { } e_data = {NULL}; /* Engine data */ typedef struct PARTICLE_PrivateData { - DRWShadingGroup *hair_group; + DRWShadingGroup *psys_edit_group; } PARTICLE_PrivateData; /* Transient data */ /* *********** FUNCTIONS *********** */ @@ -110,18 +110,25 @@ static void particle_cache_init(void *vedata) } /* Create a pass */ - psl->hair_pass = DRW_pass_create("Hair Pass", (DRW_STATE_WRITE_COLOR | - DRW_STATE_WRITE_DEPTH | - DRW_STATE_DEPTH_LESS | - DRW_STATE_WIRE)); + psl->psys_edit_pass = DRW_pass_create("PSys Edit Pass", + (DRW_STATE_WRITE_COLOR | + DRW_STATE_WRITE_DEPTH | + DRW_STATE_DEPTH_LESS | + DRW_STATE_WIRE)); + + stl->g_data->psys_edit_group = DRW_shgroup_create( + e_data.hair_shader, psl->psys_edit_pass); +} - stl->g_data->hair_group = DRW_shgroup_create(e_data.hair_shader, - psl->hair_pass); +static void particle_edit_cache_populate(void *vedata, PTCacheEdit* edit) +{ + PARTICLE_StorageList *stl = ((PARTICLE_Data *)vedata)->stl; + struct Gwn_Batch *edit_strands = DRW_cache_particles_get_edit_strands(edit); + DRW_shgroup_call_add(stl->g_data->psys_edit_group, edit_strands, NULL); } static void particle_cache_populate(void *vedata, Object *object) { - PARTICLE_StorageList *stl = ((PARTICLE_Data *)vedata)->stl; for (ParticleSystem *psys = object->particlesystem.first; psys != NULL; psys = psys->next) @@ -129,12 +136,11 @@ static void particle_cache_populate(void *vedata, Object *object) if (!psys_check_enabled(object, psys, false)) { continue; } - if (PE_get_current_from_psys(psys) == NULL) { + PTCacheEdit* edit = PE_get_current_from_psys(psys); + if (edit == NULL) { continue; } - /* NOTE: Particle edit mode visualizes particles as strands. */ - struct Gwn_Batch *hair = DRW_cache_particles_get_hair(psys, NULL); - DRW_shgroup_call_add(stl->g_data->hair_group, hair, NULL); + particle_edit_cache_populate(vedata, edit); break; } } @@ -150,7 +156,7 @@ static void particle_draw_scene(void *vedata) PARTICLE_PassList *psl = ((PARTICLE_Data *)vedata)->psl; - DRW_draw_pass(psl->hair_pass); + DRW_draw_pass(psl->psys_edit_pass); } static void particle_engine_free(void) |