Commit: eb473143a8cf26260bd165cb63e043ae9da7a216 Author: Clément Foucault Date: Thu Feb 9 18:33:50 2017 +0100 Branches: blender2.8 https://developer.blender.org/rBeb473143a8cf26260bd165cb63e043ae9da7a216
Clay Engine: Convert Lamp to use new instancing feature. =================================================================== M source/blender/draw/intern/draw_mode_pass.c M source/blender/gpu/intern/gpu_shader.c M source/blender/gpu/shaders/gpu_shader_3D_lamp_vert.glsl =================================================================== diff --git a/source/blender/draw/intern/draw_mode_pass.c b/source/blender/draw/intern/draw_mode_pass.c index 4a9a340cf1..53ee769c04 100644 --- a/source/blender/draw/intern/draw_mode_pass.c +++ b/source/blender/draw/intern/draw_mode_pass.c @@ -100,23 +100,8 @@ static DRWShadingGroup *lamp_center_group; static DRWShadingGroup *lamp_groundpoint; static DRWShadingGroup *lamp_groundline; static DRWShadingGroup *lamp_circle; -static DRWShadingGroup *lamp_circle_active; -static DRWShadingGroup *lamp_circle_select; -static DRWShadingGroup *lamp_circle_transform; -static DRWShadingGroup *lamp_circle_group; -static DRWShadingGroup *lamp_circle_group_active; static DRWShadingGroup *lamp_circle_shadow; -static DRWShadingGroup *lamp_circle_shadow_active; -static DRWShadingGroup *lamp_circle_shadow_select; -static DRWShadingGroup *lamp_circle_shadow_transform; -static DRWShadingGroup *lamp_circle_shadow_group; -static DRWShadingGroup *lamp_circle_shadow_group_active; static DRWShadingGroup *lamp_sunrays; -static DRWShadingGroup *lamp_sunrays_active; -static DRWShadingGroup *lamp_sunrays_select; -static DRWShadingGroup *lamp_sunrays_transform; -static DRWShadingGroup *lamp_sunrays_group; -static DRWShadingGroup *lamp_sunrays_group_active; /* Helpers */ static DRWShadingGroup *relationship_lines; @@ -186,13 +171,13 @@ static DRWShadingGroup *shgroup_groundpoints_uniform_color(DRWPass *pass, float return grp; } -static DRWShadingGroup *shgroup_lamp(DRWPass *pass, struct Batch *geom, float color[4], float *size) +static DRWShadingGroup *shgroup_lamp(DRWPass *pass, struct Batch *geom, float *size) { GPUShader *sh = GPU_shader_get_builtin_shader(GPU_SHADER_3D_LAMP_COMMON); DRWShadingGroup *grp = DRW_shgroup_instance_create(sh, pass, geom); - DRW_shgroup_attrib_float(grp, "InstanceModelMatrix", 16); - DRW_shgroup_uniform_vec4(grp, "color", color, 1); + DRW_shgroup_attrib_float(grp, "lamp_pos", 3); + DRW_shgroup_attrib_float(grp, "color", 3); DRW_shgroup_uniform_float(grp, "size", size, 1); DRW_shgroup_uniform_float(grp, "pixel_size", DRW_viewport_pixelsize_get(), 1); DRW_shgroup_uniform_vec3(grp, "screen_vecs", DRW_viewport_screenvecs_get(), 2); @@ -324,26 +309,11 @@ void DRW_pass_setup_common(DRWPass **wire_overlay, DRWPass **wire_outline, DRWPa lamp_center_group = shgroup_dynpoints_uniform_color(*non_meshes, colorGroup, &lampCenterSize); geom = DRW_cache_lamp_get(); - lamp_circle = shgroup_lamp(*non_meshes, geom, colorLampNoAlpha, &lampCircleRad); - lamp_circle_active = shgroup_lamp(*non_meshes, geom, colorActive, &lampCircleRad); - lamp_circle_select = shgroup_lamp(*non_meshes, geom, colorSelect, &lampCircleRad); - lamp_circle_transform = shgroup_lamp(*non_meshes, geom, colorTransform, &lampCircleRad); - lamp_circle_group = shgroup_lamp(*non_meshes, geom, colorGroup, &lampCircleRad); - lamp_circle_group_active = shgroup_lamp(*non_meshes, geom, colorGroupActive, &lampCircleRad); - lamp_circle_shadow = shgroup_lamp(*non_meshes, geom, colorLampNoAlpha, &lampCircleShadowRad); - lamp_circle_shadow_active = shgroup_lamp(*non_meshes, geom, colorActive, &lampCircleShadowRad); - lamp_circle_shadow_select = shgroup_lamp(*non_meshes, geom, colorSelect, &lampCircleShadowRad); - lamp_circle_shadow_transform = shgroup_lamp(*non_meshes, geom, colorTransform, &lampCircleShadowRad); - lamp_circle_shadow_group = shgroup_lamp(*non_meshes, geom, colorGroup, &lampCircleShadowRad); - lamp_circle_shadow_group_active = shgroup_lamp(*non_meshes, geom, colorGroupActive, &lampCircleShadowRad); + lamp_circle = shgroup_lamp(*non_meshes, geom, &lampCircleRad); + lamp_circle_shadow = shgroup_lamp(*non_meshes, geom, &lampCircleShadowRad); geom = DRW_cache_lamp_sunrays_get(); - lamp_sunrays = shgroup_lamp(*non_meshes, geom, colorLampNoAlpha, &lampCircleRad); - lamp_sunrays_active = shgroup_lamp(*non_meshes, geom, colorActive, &lampCircleRad); - lamp_sunrays_select = shgroup_lamp(*non_meshes, geom, colorSelect, &lampCircleRad); - lamp_sunrays_transform = shgroup_lamp(*non_meshes, geom, colorTransform, &lampCircleRad); - lamp_sunrays_group = shgroup_lamp(*non_meshes, geom, colorGroup, &lampCircleRad); - lamp_sunrays_group_active = shgroup_lamp(*non_meshes, geom, colorGroupActive, &lampCircleRad); + lamp_sunrays = shgroup_lamp(*non_meshes, geom, &lampCircleRad); lamp_groundline = shgroup_groundlines_uniform_color(*non_meshes, colorLamp); lamp_groundpoint = shgroup_groundpoints_uniform_color(*non_meshes, colorLamp); @@ -548,6 +518,7 @@ static void DRW_draw_lamp(Object *ob) { Lamp *la = ob->data; int theme_id = draw_object_wire_theme(ob); + float *color; /* Don't draw the center if it's selected or active */ if (theme_id == TH_GROUP) @@ -555,52 +526,38 @@ static void DRW_draw_lamp(Object *ob) else if (theme_id == TH_LAMP) DRW_shgroup_dynamic_call_add(lamp_center, ob->obmat[3]); + switch (theme_id) { + case TH_ACTIVE: + color = colorActive; + break; + case TH_SELECT: + color = colorSelect; + break; + case TH_GROUP: + color = colorGroup; + break; + case TH_GROUP_ACTIVE: + color = colorGroupActive; + break; + case TH_TRANSFORM: + color = colorTransform; + break; + default: + color = colorLampNoAlpha; + break; + } + /* First circle */ - if (theme_id == TH_ACTIVE) - DRW_shgroup_dynamic_call_add(lamp_circle_active, ob->obmat); - else if (theme_id == TH_SELECT) - DRW_shgroup_dynamic_call_add(lamp_circle_select, ob->obmat); - else if (theme_id == TH_GROUP) - DRW_shgroup_dynamic_call_add(lamp_circle_group, ob->obmat); - else if (theme_id == TH_GROUP_ACTIVE) - DRW_shgroup_dynamic_call_add(lamp_circle_group_active, ob->obmat); - else if (theme_id == TH_TRANSFORM) - DRW_shgroup_dynamic_call_add(lamp_circle_transform, ob->obmat); - else - DRW_shgroup_dynamic_call_add(lamp_circle, ob->obmat); + DRW_shgroup_dynamic_call_add(lamp_circle, ob->obmat[3], color); /* draw dashed outer circle if shadow is on. remember some lamps can't have certain shadows! */ if (la->type != LA_HEMI) { - if ((la->mode & LA_SHAD_RAY) || ((la->mode & LA_SHAD_BUF) && (la->type == LA_SPOT))) { - if (theme_id == TH_ACTIVE) - DRW_shgroup_dynamic_call_add(lamp_circle_shadow_active, ob->obmat); - else if (theme_id == TH_SELECT) - DRW_shgroup_dynamic_call_add(lamp_circle_shadow_select, ob->obmat); - else if (theme_id == TH_GROUP) - DRW_shgroup_dynamic_call_add(lamp_circle_shadow_group, ob->obmat); - else if (theme_id == TH_GROUP_ACTIVE) - DRW_shgroup_dynamic_call_add(lamp_circle_shadow_group_active, ob->obmat); - else if (theme_id == TH_TRANSFORM) - DRW_shgroup_dynamic_call_add(lamp_circle_shadow_transform, ob->obmat); - else - DRW_shgroup_dynamic_call_add(lamp_circle_shadow, ob->obmat); - } + DRW_shgroup_dynamic_call_add(lamp_circle_shadow, ob->obmat[3], color); } /* Sunrays */ if (la->type == LA_SUN) { - if (theme_id == TH_ACTIVE) - DRW_shgroup_dynamic_call_add(lamp_sunrays_active, ob->obmat); - else if (theme_id == TH_SELECT) - DRW_shgroup_dynamic_call_add(lamp_sunrays_select, ob->obmat); - else if (theme_id == TH_GROUP) - DRW_shgroup_dynamic_call_add(lamp_sunrays_group, ob->obmat); - else if (theme_id == TH_GROUP_ACTIVE) - DRW_shgroup_dynamic_call_add(lamp_sunrays_group_active, ob->obmat); - else if (theme_id == TH_TRANSFORM) - DRW_shgroup_dynamic_call_add(lamp_sunrays_transform, ob->obmat); - else - DRW_shgroup_dynamic_call_add(lamp_sunrays, ob->obmat); + DRW_shgroup_dynamic_call_add(lamp_sunrays, ob->obmat[3]); } /* Line and point going to the ground */ diff --git a/source/blender/gpu/intern/gpu_shader.c b/source/blender/gpu/intern/gpu_shader.c index d796fb96c3..e77d649d76 100644 --- a/source/blender/gpu/intern/gpu_shader.c +++ b/source/blender/gpu/intern/gpu_shader.c @@ -697,7 +697,7 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader) datatoc_gpu_shader_3D_groundline_geom_glsl }, [GPU_SHADER_3D_LAMP_COMMON] = { datatoc_gpu_shader_3D_lamp_vert_glsl, - datatoc_gpu_shader_uniform_color_frag_glsl}, + datatoc_gpu_shader_flat_color_frag_glsl}, [GPU_SHADER_2D_POINT_FIXED_SIZE_UNIFORM_COLOR] = { datatoc_gpu_shader_2D_vert_glsl, datatoc_gpu_shader_point_uniform_color_frag_glsl }, diff --git a/source/blender/gpu/shaders/gpu_shader_3D_lamp_vert.glsl b/source/blender/gpu/shaders/gpu_shader_3D_lamp_vert.glsl index dbc683ef42..c7ccaf8170 100644 --- a/source/blender/gpu/shaders/gpu_shader_3D_lamp_vert.glsl +++ b/source/blender/gpu/shaders/gpu_shader_3D_lamp_vert.glsl @@ -5,9 +5,10 @@ uniform float size; uniform float pixel_size; in vec2 pos; -in mat4 InstanceModelMatrix; +in vec3 lamp_pos; +in vec3 color; -#define lamp_pos InstanceModelMatrix[3].xyz +flat out vec4 finalColor; float mul_project_m4_v3_zfac(in vec3 co) { @@ -21,4 +22,5 @@ void main() float pix_size = mul_project_m4_v3_zfac(lamp_pos) * pixel_size; vec3 screen_pos = screen_vecs[0].xyz * pos.x + screen_vecs[1].xyz * pos.y; gl_Position = ViewProjectionMatrix * vec4(lamp_pos + screen_pos * size * pix_size, 1.0); + finalColor = vec4(color, 1.0); } _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs