[Bf-blender-cvs] [033c2c71312] blender2.8: Draw manager: Start using more explicit API for particle edit mode

Sergey Sharybin noreply at git.blender.org
Wed May 9 15:03:01 CEST 2018


Commit: 033c2c71312daf86a148a068a2e20afcb784b3ee
Author: Sergey Sharybin
Date:   Wed May 9 11:14:27 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB033c2c71312daf86a148a068a2e20afcb784b3ee

Draw manager: Start using more explicit API for particle edit mode

===================================================================

M	source/blender/draw/intern/draw_cache.c
M	source/blender/draw/intern/draw_cache.h
M	source/blender/draw/intern/draw_cache_impl.h
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.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)



More information about the Bf-blender-cvs mailing list