Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/draw/intern/draw_cache.c5
-rw-r--r--source/blender/draw/intern/draw_cache.h4
-rw-r--r--source/blender/draw/intern/draw_cache_impl.h2
-rw-r--r--source/blender/draw/intern/draw_cache_impl_particles.c13
-rw-r--r--source/blender/draw/modes/particle_mode.c34
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)