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.c6
-rw-r--r--source/blender/draw/modes/object_mode.c26
-rw-r--r--source/blender/draw/modes/shaders/object_particle_dot_frag.glsl11
-rw-r--r--source/blender/draw/modes/shaders/object_particle_dot_vert.glsl2
-rw-r--r--source/blender/draw/modes/shaders/object_particle_prim_frag.glsl12
-rw-r--r--source/blender/draw/modes/shaders/object_particle_prim_vert.glsl10
6 files changed, 34 insertions, 33 deletions
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;