Commit: 6f063bdb1c316d31d108d2d609de36a0e4461db5
Author: Luca Rood
Date:   Tue May 23 14:37:01 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB6f063bdb1c316d31d108d2d609de36a0e4461db5

Use pointers to actual data for particle uniforms

This makes particle color uniforms point directly to material color, and
particle size uniforms point directly to ParticleSettings size.

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

M       source/blender/draw/intern/draw_cache.c
M       source/blender/draw/modes/object_mode.c
M       source/blender/draw/modes/shaders/object_particle_dot_frag.glsl
M       source/blender/draw/modes/shaders/object_particle_dot_vert.glsl
M       source/blender/draw/modes/shaders/object_particle_prim_frag.glsl
M       source/blender/draw/modes/shaders/object_particle_prim_vert.glsl

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

diff --git a/source/blender/draw/intern/draw_cache.c 
b/source/blender/draw/intern/draw_cache.c
index 4ec4cc5bda8..06ec0f746e0 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -2299,6 +2299,7 @@ Batch *DRW_cache_particles_get_prim(int type)
                                float co[3] = {-1.0f, 0.0f, 0.0f};
                                int axis = -1;
                                VertexBuffer_set_attrib(vbo, pos_id, 0, co);
+                               VertexBuffer_set_attrib(vbo, axis_id, 0, &axis);
 
                                co[0] = 1.0f;
                                VertexBuffer_set_attrib(vbo, pos_id, 1, co);
@@ -2308,6 +2309,7 @@ Batch *DRW_cache_particles_get_prim(int type)
                                co[0] = 0.0f;
                                co[1] = -1.0f;
                                VertexBuffer_set_attrib(vbo, pos_id, 2, co);
+                               VertexBuffer_set_attrib(vbo, axis_id, 2, &axis);
 
                                co[1] = 1.0f;
                                VertexBuffer_set_attrib(vbo, pos_id, 3, co);
@@ -2317,6 +2319,7 @@ Batch *DRW_cache_particles_get_prim(int type)
                                co[1] = 0.0f;
                                co[2] = -1.0f;
                                VertexBuffer_set_attrib(vbo, pos_id, 4, co);
+                               VertexBuffer_set_attrib(vbo, axis_id, 4, &axis);
 
                                co[2] = 1.0f;
                                VertexBuffer_set_attrib(vbo, pos_id, 5, co);
@@ -2343,6 +2346,7 @@ Batch *DRW_cache_particles_get_prim(int type)
                                float co[3] = {0.0f, 0.0f, 0.0f};
                                int axis = 0;
                                VertexBuffer_set_attrib(vbo, pos_id, 0, co);
+                               VertexBuffer_set_attrib(vbo, axis_id, 0, &axis);
 
                                co[0] = 1.0f;
                                VertexBuffer_set_attrib(vbo, pos_id, 1, co);
@@ -2352,6 +2356,7 @@ Batch *DRW_cache_particles_get_prim(int type)
                                co[0] = 0.0f;
                                axis = 1;
                                VertexBuffer_set_attrib(vbo, pos_id, 2, co);
+                               VertexBuffer_set_attrib(vbo, axis_id, 2, &axis);
 
                                co[1] = 1.0f;
                                VertexBuffer_set_attrib(vbo, pos_id, 3, co);
@@ -2361,6 +2366,7 @@ Batch *DRW_cache_particles_get_prim(int type)
                                co[1] = 0.0f;
                                axis = 2;
                                VertexBuffer_set_attrib(vbo, pos_id, 4, co);
+                               VertexBuffer_set_attrib(vbo, axis_id, 4, &axis);
 
                                co[2] = 1.0f;
                                VertexBuffer_set_attrib(vbo, pos_id, 5, co);
diff --git a/source/blender/draw/modes/object_mode.c 
b/source/blender/draw/modes/object_mode.c
index ee95d4a0598..0259e1055af 100644
--- a/source/blender/draw/modes/object_mode.c
+++ b/source/blender/draw/modes/object_mode.c
@@ -1400,46 +1400,33 @@ static void OBJECT_cache_populate(void *vedata, Object 
*ob)
                                        unit_m4(mat);
 
                                        if (draw_as != PART_DRAW_PATH) {
-                                               static float size;
-                                               static float axis_size;
-                                               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};
+                                               static float def_prim_col[3] = 
{0.5f, 0.5f, 0.5f};
+                                               static float def_sec_col[3] = 
{1.0f, 1.0f, 1.0f};
 
                                                Material *ma = 
give_current_material(ob, part->omat);
 
-                                               if (ma) {
-                                                       copy_v3_v3(col, &ma->r);
-                                                       copy_v3_v3(o_col, 
&ma->specr);
-                                               }
-
-                                               size = (float)part->draw_size;
-                                               axis_size = size * 2.0f;
-
                                                switch (draw_as) {
                                                        case PART_DRAW_DOT:
                                                                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_uniform_vec3(shgrp, "color", ma ? &ma->r : def_prim_col, 1);
+                                                               
DRW_shgroup_uniform_vec3(shgrp, "outlineColor", ma ? &ma->specr : def_sec_col, 
1);
+                                                               
DRW_shgroup_uniform_short_to_int(shgrp, "size", &part->draw_size, 1);
                                                                
DRW_shgroup_call_add(shgrp, geom, mat);
                                                                break;
                                                        case PART_DRAW_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(shgrp, "screen_space", &screen_space[0], 1);
-                                                               
DRW_shgroup_uniform_float(shgrp, "draw_size", &size, 1);
                                                                break;
                                                        case PART_DRAW_CIRC:
                                                                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:
                                                                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;
@@ -1448,7 +1435,8 @@ static void OBJECT_cache_populate(void *vedata, Object 
*ob)
                                                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_vec3(shgrp, "color", &ma->r, 1);
+                                                       
DRW_shgroup_uniform_short_to_int(shgrp, "draw_size", &part->draw_size, 1);
                                                        
DRW_shgroup_uniform_float(shgrp, "pixel_size", DRW_viewport_pixelsize_get(), 1);
                                                        
DRW_shgroup_instance_batch(shgrp, geom);
                                                }
diff --git a/source/blender/draw/modes/shaders/object_particle_dot_frag.glsl 
b/source/blender/draw/modes/shaders/object_particle_dot_frag.glsl
index eae5ee633ae..044a949ef98 100644
--- a/source/blender/draw/modes/shaders/object_particle_dot_frag.glsl
+++ b/source/blender/draw/modes/shaders/object_particle_dot_frag.glsl
@@ -1,6 +1,6 @@
 
-uniform vec4 color;
-uniform vec4 outlineColor;
+uniform vec3 color;
+uniform vec3 outlineColor;
 
 in vec4 radii;
 out vec4 fragColor;
@@ -23,11 +23,12 @@ void main() {
        float midStroke = 0.5 * (radii[1] + radii[2]);
 
        if (dist > midStroke) {
-               fragColor.rgb = outlineColor.rgb;
-               fragColor.a = mix(outlineColor.a, 0.0, smoothstep(radii[1], 
radii[0], dist));
+               fragColor.rgb = outlineColor;
+               fragColor.a = mix(1.0, 0.0, smoothstep(radii[1], radii[0], 
dist));
        }
        else {
-               fragColor = mix(color, outlineColor, smoothstep(radii[3], 
radii[2], dist));
+               fragColor.rgb = mix(color, outlineColor, smoothstep(radii[3], 
radii[2], dist));
+               fragColor.a = 1.0;
        }
 
        if (fragColor.a == 0.0) {
diff --git a/source/blender/draw/modes/shaders/object_particle_dot_vert.glsl 
b/source/blender/draw/modes/shaders/object_particle_dot_vert.glsl
index d9d30c8e677..36b665173f1 100644
--- a/source/blender/draw/modes/shaders/object_particle_dot_vert.glsl
+++ b/source/blender/draw/modes/shaders/object_particle_dot_vert.glsl
@@ -1,6 +1,6 @@
 
 uniform mat4 ModelViewProjectionMatrix;
-uniform float size;
+uniform int size;
 
 in vec3 pos;
 out vec4 radii;
diff --git a/source/blender/draw/modes/shaders/object_particle_prim_frag.glsl 
b/source/blender/draw/modes/shaders/object_particle_prim_frag.glsl
index 50572f293d9..791d38390a2 100644
--- a/source/blender/draw/modes/shaders/object_particle_prim_frag.glsl
+++ b/source/blender/draw/modes/shaders/object_particle_prim_frag.glsl
@@ -1,5 +1,5 @@
 
-uniform vec4 color;
+uniform vec3 color;
 
 flat in int finalAxis;
 
@@ -8,12 +8,12 @@ out vec4 fragColor;
 void main()
 {
        if (finalAxis == -1) {
-               fragColor = color;
+               fragColor.rgb = color;
        }
        else {
-               vec4 col = vec4(0.0);
-               col[finalAxis] = 1.0;
-               col.a = 1.0;
-               fragColor = col;
+               fragColor.rgb = vec3(0.0);
+               fragColor[finalAxis] = 1.0;
        }
+
+       fragColor.a = 1.0;
 }
diff --git a/source/blender/draw/modes/shaders/object_particle_prim_vert.glsl 
b/source/blender/draw/modes/shaders/object_particle_prim_vert.glsl
index 2483ca5b2d2..ff16f61b884 100644
--- a/source/blender/draw/modes/shaders/object_particle_prim_vert.glsl
+++ b/source/blender/draw/modes/shaders/object_particle_prim_vert.glsl
@@ -5,7 +5,7 @@ uniform mat4 ModelViewMatrix;
 uniform mat4 ProjectionMatrix;
 uniform int screen_space;
 uniform float pixel_size;
-uniform float draw_size;
+uniform int draw_size;
 
 in vec3 pos;
 in vec4 rot;
@@ -36,7 +36,13 @@ void main()
                gl_Position = ProjectionMatrix * gl_Position;
        }
        else {
-               gl_Position = ModelViewProjectionMatrix * vec4(pos + 
rotate(inst_pos * pix_size * draw_size, rot), 1.0);
+               int size = draw_size;
+
+               if (axis > -1) {
+                       size *= 2;
+               }
+
+               gl_Position = ModelViewProjectionMatrix * vec4(pos + 
rotate(inst_pos * pix_size * size, rot), 1.0);
        }
 
        finalAxis = axis;

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to