diff options
author | Luca Rood <dev@lucarood.com> | 2017-05-23 15:13:25 +0300 |
---|---|---|
committer | Luca Rood <dev@lucarood.com> | 2017-05-23 15:20:10 +0300 |
commit | b5426b50fb1390546190203ffb5bad162fdc066e (patch) | |
tree | a774ef8e0b41dd51071a1e2d894ad686560ddfea /source/blender/draw/modes | |
parent | 21857cb08121d1dcf6b5751b00f88ab2ee0be6e1 (diff) |
Rename/move particle shaders
Diffstat (limited to 'source/blender/draw/modes')
3 files changed, 65 insertions, 3 deletions
diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c index 9d6810ab966..dbc18e19b41 100644 --- a/source/blender/draw/modes/object_mode.c +++ b/source/blender/draw/modes/object_mode.c @@ -66,8 +66,8 @@ extern char datatoc_object_grid_frag_glsl[]; extern char datatoc_object_grid_vert_glsl[]; extern char datatoc_object_empty_image_frag_glsl[]; extern char datatoc_object_empty_image_vert_glsl[]; -extern char datatoc_particle_prim_vert_glsl[]; -extern char datatoc_particle_prim_frag_glsl[]; +extern char datatoc_object_particle_prim_vert_glsl[]; +extern char datatoc_object_particle_prim_frag_glsl[]; extern char datatoc_common_globals_lib_glsl[]; /* *********** LISTS *********** */ @@ -286,7 +286,7 @@ static void OBJECT_engine_init(void *vedata) } if (!e_data.part_prim_sh) { - e_data.part_prim_sh = DRW_shader_create(datatoc_particle_prim_vert_glsl, NULL, datatoc_particle_prim_frag_glsl, NULL); + e_data.part_prim_sh = DRW_shader_create(datatoc_object_particle_prim_vert_glsl, NULL, datatoc_object_particle_prim_frag_glsl, NULL); } if (!e_data.part_dot_sh) { diff --git a/source/blender/draw/modes/shaders/object_particle_prim_frag.glsl b/source/blender/draw/modes/shaders/object_particle_prim_frag.glsl new file mode 100644 index 00000000000..50572f293d9 --- /dev/null +++ b/source/blender/draw/modes/shaders/object_particle_prim_frag.glsl @@ -0,0 +1,19 @@ + +uniform vec4 color; + +flat in int finalAxis; + +out vec4 fragColor; + +void main() +{ + if (finalAxis == -1) { + fragColor = color; + } + else { + vec4 col = vec4(0.0); + col[finalAxis] = 1.0; + col.a = 1.0; + fragColor = col; + } +} diff --git a/source/blender/draw/modes/shaders/object_particle_prim_vert.glsl b/source/blender/draw/modes/shaders/object_particle_prim_vert.glsl new file mode 100644 index 00000000000..2483ca5b2d2 --- /dev/null +++ b/source/blender/draw/modes/shaders/object_particle_prim_vert.glsl @@ -0,0 +1,43 @@ + +uniform mat4 ModelViewProjectionMatrix; +uniform mat4 ViewProjectionMatrix; +uniform mat4 ModelViewMatrix; +uniform mat4 ProjectionMatrix; +uniform int screen_space; +uniform float pixel_size; +uniform float draw_size; + +in vec3 pos; +in vec4 rot; +in vec3 inst_pos; +in int axis; + +flat out int finalAxis; + +vec3 rotate(vec3 vec, vec4 quat) +{ + /* The quaternion representation here stores the w component in the first index */ + return vec + 2.0 * cross(quat.yzw, cross(quat.yzw, vec) + quat.x * vec); +} + +float mul_project_m4_v3_zfac(in vec3 co) +{ + return (ViewProjectionMatrix[0][3] * co.x) + + (ViewProjectionMatrix[1][3] * co.y) + + (ViewProjectionMatrix[2][3] * co.z) + ViewProjectionMatrix[3][3]; +} + +void main() +{ + float pix_size = mul_project_m4_v3_zfac(pos) * pixel_size; + + if (screen_space == 1) { + gl_Position = ModelViewMatrix * vec4(pos, 1.0) + vec4(inst_pos * pix_size * draw_size, 0.0); + gl_Position = ProjectionMatrix * gl_Position; + } + else { + gl_Position = ModelViewProjectionMatrix * vec4(pos + rotate(inst_pos * pix_size * draw_size, rot), 1.0); + } + + finalAxis = axis; +} |