[Bf-blender-cvs] [21857cb0812] blender2.8: Create new shading group for each psys

Luca Rood noreply at git.blender.org
Tue May 23 14:40:08 CEST 2017


Commit: 21857cb08121d1dcf6b5751b00f88ab2ee0be6e1
Author: Luca Rood
Date:   Tue May 23 12:32:15 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB21857cb08121d1dcf6b5751b00f88ab2ee0be6e1

Create new shading group for each psys

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

M	source/blender/draw/modes/object_mode.c

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

diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c
index 21f5ad97b3d..9d6810ab966 100644
--- a/source/blender/draw/modes/object_mode.c
+++ b/source/blender/draw/modes/object_mode.c
@@ -186,12 +186,6 @@ typedef struct OBJECT_PrivateData{
 	DRWShadingGroup *wire_select;
 	DRWShadingGroup *wire_select_group;
 	DRWShadingGroup *wire_transform;
-
-	/* Particles */
-	DRWShadingGroup *part_dot_shgrp;
-	DRWShadingGroup *part_cross_shgrp;
-	DRWShadingGroup *part_circle_shgrp;
-	DRWShadingGroup *part_axis_shgrp;
 } OBJECT_PrivateData; /* Transient data */
 
 static struct {
@@ -990,28 +984,6 @@ static void OBJECT_cache_init(void *vedata)
 	{
 		/* Particle Pass */
 		psl->particle = DRW_pass_create("Particle Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_POINT | DRW_STATE_BLEND);
-
-		static int screen_space[2] = {0, 1};
-
-		stl->g_data->part_dot_shgrp = DRW_shgroup_create(e_data.part_dot_sh, psl->particle);
-
-		stl->g_data->part_cross_shgrp = DRW_shgroup_instance_create(e_data.part_prim_sh, psl->particle, DRW_cache_particles_get_prim(PART_DRAW_CROSS));
-		DRW_shgroup_uniform_int(stl->g_data->part_cross_shgrp, "screen_space", &screen_space[0], 1);
-		DRW_shgroup_uniform_float(stl->g_data->part_cross_shgrp, "pixel_size", DRW_viewport_pixelsize_get(), 1);
-		DRW_shgroup_attrib_float(stl->g_data->part_cross_shgrp, "pos", 3);
-		DRW_shgroup_attrib_float(stl->g_data->part_cross_shgrp, "rot", 4);
-
-		stl->g_data->part_circle_shgrp = DRW_shgroup_instance_create(e_data.part_prim_sh, psl->particle, DRW_cache_particles_get_prim(PART_DRAW_CIRC));
-		DRW_shgroup_uniform_int(stl->g_data->part_circle_shgrp, "screen_space", &screen_space[1], 1);
-		DRW_shgroup_uniform_float(stl->g_data->part_circle_shgrp, "pixel_size", DRW_viewport_pixelsize_get(), 1);
-		DRW_shgroup_attrib_float(stl->g_data->part_circle_shgrp, "pos", 3);
-		DRW_shgroup_attrib_float(stl->g_data->part_circle_shgrp, "rot", 4);
-
-		stl->g_data->part_axis_shgrp = DRW_shgroup_instance_create(e_data.part_prim_sh, psl->particle, DRW_cache_particles_get_prim(PART_DRAW_AXIS));
-		DRW_shgroup_uniform_int(stl->g_data->part_axis_shgrp, "screen_space", &screen_space[0], 1);
-		DRW_shgroup_uniform_float(stl->g_data->part_axis_shgrp, "pixel_size", DRW_viewport_pixelsize_get(), 1);
-		DRW_shgroup_attrib_float(stl->g_data->part_axis_shgrp, "pos", 3);
-		DRW_shgroup_attrib_float(stl->g_data->part_axis_shgrp, "rot", 4);
 	}
 }
 
@@ -1430,6 +1402,8 @@ static void OBJECT_cache_populate(void *vedata, Object *ob)
 						static float col[4] = {1.0f, 1.0f, 1.0f, 1.0f};
 						static float o_col[4] = {0.5f, 0.5f, 0.5f, 1.0f};
 						struct Batch *geom = DRW_cache_particles_get_dots(psys);
+						DRWShadingGroup *shgrp;
+						static int screen_space[2] = {0, 1};
 
 						Material *ma = give_current_material(ob, part->omat);
 
@@ -1443,29 +1417,38 @@ static void OBJECT_cache_populate(void *vedata, Object *ob)
 
 						switch (draw_as) {
 							case PART_DRAW_DOT:
-								DRW_shgroup_uniform_vec4(stl->g_data->part_dot_shgrp, "color", col, 1);
-								DRW_shgroup_uniform_vec4(stl->g_data->part_dot_shgrp, "outlineColor", o_col, 1);
-								DRW_shgroup_uniform_float(stl->g_data->part_dot_shgrp, "size", &size, 1);
-								DRW_shgroup_call_add(stl->g_data->part_dot_shgrp, geom, mat);
+								shgrp = DRW_shgroup_create(e_data.part_dot_sh, psl->particle);
+								DRW_shgroup_uniform_vec4(shgrp, "color", col, 1);
+								DRW_shgroup_uniform_vec4(shgrp, "outlineColor", o_col, 1);
+								DRW_shgroup_uniform_float(shgrp, "size", &size, 1);
+								DRW_shgroup_call_add(shgrp, geom, mat);
 								break;
 							case PART_DRAW_CROSS:
-								DRW_shgroup_uniform_vec4(stl->g_data->part_cross_shgrp, "color", col, 1);
-								DRW_shgroup_uniform_float(stl->g_data->part_cross_shgrp, "draw_size", &size, 1);
-								DRW_shgroup_instance_batch(stl->g_data->part_cross_shgrp, geom);
+								shgrp = DRW_shgroup_instance_create(e_data.part_prim_sh, psl->particle, DRW_cache_particles_get_prim(PART_DRAW_CROSS));
+								DRW_shgroup_uniform_int(shgrp, "screen_space", &screen_space[0], 1);
+								DRW_shgroup_uniform_float(shgrp, "draw_size", &size, 1);
 								break;
 							case PART_DRAW_CIRC:
-								DRW_shgroup_uniform_vec4(stl->g_data->part_circle_shgrp, "color", col, 1);
-								DRW_shgroup_uniform_float(stl->g_data->part_circle_shgrp, "draw_size", &size, 1);
-								DRW_shgroup_instance_batch(stl->g_data->part_circle_shgrp, geom);
+								shgrp = DRW_shgroup_instance_create(e_data.part_prim_sh, psl->particle, DRW_cache_particles_get_prim(PART_DRAW_CIRC));
+								DRW_shgroup_uniform_int(shgrp, "screen_space", &screen_space[1], 1);
+								DRW_shgroup_uniform_float(shgrp, "draw_size", &size, 1);
 								break;
 							case PART_DRAW_AXIS:
-								DRW_shgroup_uniform_vec4(stl->g_data->part_axis_shgrp, "color", col, 1);
-								DRW_shgroup_uniform_float(stl->g_data->part_axis_shgrp, "draw_size", &axis_size, 1);
-								DRW_shgroup_instance_batch(stl->g_data->part_axis_shgrp, geom);
+								shgrp = DRW_shgroup_instance_create(e_data.part_prim_sh, psl->particle, DRW_cache_particles_get_prim(PART_DRAW_AXIS));
+								DRW_shgroup_uniform_int(shgrp, "screen_space", &screen_space[0], 1);
+								DRW_shgroup_uniform_float(shgrp, "draw_size", &axis_size, 1);
 								break;
 							default:
 								break;
 						}
+
+						if (draw_as != PART_DRAW_DOT) {
+							DRW_shgroup_attrib_float(shgrp, "pos", 3);
+							DRW_shgroup_attrib_float(shgrp, "rot", 4);
+							DRW_shgroup_uniform_vec4(shgrp, "color", col, 1);
+							DRW_shgroup_uniform_float(shgrp, "pixel_size", DRW_viewport_pixelsize_get(), 1);
+							DRW_shgroup_instance_batch(shgrp, geom);
+						}
 					}
 				}
 			}




More information about the Bf-blender-cvs mailing list