[Bf-blender-cvs] [6f1bdaab9d] clay-engine: Lamp sunrays and shadow circles

Clément Foucault noreply at git.blender.org
Thu Feb 2 21:41:16 CET 2017


Commit: 6f1bdaab9dfbbe4d12558f8f22be8c7efabe57df
Author: Clément Foucault
Date:   Thu Feb 2 21:39:58 2017 +0100
Branches: clay-engine
https://developer.blender.org/rB6f1bdaab9dfbbe4d12558f8f22be8c7efabe57df

Lamp sunrays and shadow circles

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

M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_cache.c
M	source/blender/draw/intern/draw_cache.h
M	source/blender/draw/intern/draw_mode_pass.c

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

diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index ac57a05dd1..9945628653 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -40,6 +40,7 @@
 #include "BLT_translation.h"
 
 #include "DNA_object_types.h"
+#include "DNA_lamp_types.h"
 #include "DNA_material_types.h"
 #include "DNA_scene_types.h"
 
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index b41c232847..2f571ec7f3 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -49,6 +49,7 @@ static struct DRWShapeCache{
 	Batch *drw_empty_cone;
 	Batch *drw_arrows;
 	Batch *drw_lamp;
+	Batch *drw_lamp_sunrays;
 } SHC = {NULL};
 
 void DRW_shape_cache_free(void)
@@ -75,6 +76,8 @@ void DRW_shape_cache_free(void)
 		Batch_discard_all(SHC.drw_arrows);
 	if (SHC.drw_lamp)
 		Batch_discard_all(SHC.drw_lamp);
+	if (SHC.drw_lamp_sunrays)
+		Batch_discard_all(SHC.drw_lamp_sunrays);
 }
 
 /* Quads */
@@ -439,6 +442,39 @@ Batch *DRW_cache_lamp_get(void)
 #undef NSEGMENTS
 }
 
+Batch *DRW_cache_lamp_sunrays_get(void)
+{
+	if (!SHC.drw_lamp_sunrays) {
+		float v[3], v1[3], v2[3];
+
+		/* Position Only 3D format */
+		static VertexFormat format = { 0 };
+		static unsigned pos_id;
+		if (format.attrib_ct == 0) {
+			pos_id = add_attrib(&format, "pos", GL_FLOAT, 3, KEEP_FLOAT);
+		}
+
+		VertexBuffer *vbo = VertexBuffer_create_with_format(&format);
+		VertexBuffer_allocate_data(vbo, 16);
+
+		for (int a = 0; a < 8; a++) {
+			v[0] = sinf((2.0f * M_PI * a) / 8.0f);
+			v[1] = cosf((2.0f * M_PI * a) / 8.0f);
+			v[2] = 0.0f;
+
+			mul_v3_v3fl(v1, v, 1.2f);
+			mul_v3_v3fl(v2, v, 2.5f);
+
+			setAttrib(vbo, pos_id, a * 2, v1);
+			setAttrib(vbo, pos_id, a * 2 + 1, v2);
+		}
+
+		SHC.drw_lamp_sunrays = Batch_create(GL_LINES, vbo, NULL);
+	}
+	return SHC.drw_lamp_sunrays;
+}
+
+
 /* Object Center */
 Batch *DRW_cache_single_vert_get(void)
 {
diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h
index 881fc2b529..c53f3d88af 100644
--- a/source/blender/draw/intern/draw_cache.h
+++ b/source/blender/draw/intern/draw_cache.h
@@ -46,6 +46,7 @@ struct Batch *DRW_cache_arrows_get(void);
 
 /* Lamps */
 struct Batch *DRW_cache_lamp_get(void);
+struct Batch *DRW_cache_lamp_sunrays_get(void);
 
 /* Meshes */
 struct Batch *DRW_cache_wire_overlay_get(struct Object *ob);
diff --git a/source/blender/draw/intern/draw_mode_pass.c b/source/blender/draw/intern/draw_mode_pass.c
index 813fb2b38a..391639e57d 100644
--- a/source/blender/draw/intern/draw_mode_pass.c
+++ b/source/blender/draw/intern/draw_mode_pass.c
@@ -101,6 +101,12 @@ static DRWShadingGroup *lamp_groundline;
 static DRWShadingGroup *lamp_circle_wire;
 static DRWShadingGroup *lamp_circle_active;
 static DRWShadingGroup *lamp_circle_select;
+static DRWShadingGroup *lamp_circle_shadow_wire;
+static DRWShadingGroup *lamp_circle_shadow_active;
+static DRWShadingGroup *lamp_circle_shadow_select;
+static DRWShadingGroup *lamp_sunrays_wire;
+static DRWShadingGroup *lamp_sunrays_active;
+static DRWShadingGroup *lamp_sunrays_select;
 
 /* Helpers */
 static DRWShadingGroup *relationship_lines;
@@ -167,7 +173,7 @@ static DRWShadingGroup *shgroup_groundpoints_uniform_color(DRWPass *pass, float
 	return grp;
 }
 
-static DRWShadingGroup *shgroup_lampcircle(DRWPass *pass, float color[4], float *size)
+static DRWShadingGroup *shgroup_lamp(DRWPass *pass, float color[4], float *size)
 {
 	GPUShader *sh = GPU_shader_get_builtin_shader(GPU_SHADER_3D_LAMP_COMMON);
 
@@ -189,7 +195,7 @@ void DRW_pass_setup_common(DRWPass **wire_overlay, DRWPass **wire_outline, DRWPa
 	static float colorWire[4], colorWireEdit[4];
 	static float colorActive[4], colorSelect[4], colorTransform[4], colorGroup[4], colorGroupActive[4];
 	static float colorEmpty[4], colorLamp[4], colorCamera[4], colorSpeaker[4];
-	static float lampCenterSize, lampCircleRad, colorLampNoAlpha[4];
+	static float lampCenterSize, lampCircleRad, lampCircleShadowRad, colorLampNoAlpha[4];
 
 	UI_GetThemeColor4fv(TH_WIRE, colorWire);
 	UI_GetThemeColor4fv(TH_WIRE_EDIT, colorWireEdit);
@@ -290,13 +296,20 @@ void DRW_pass_setup_common(DRWPass **wire_overlay, DRWPass **wire_outline, DRWPa
 		/* Lamps */
 		lampCenterSize = (U.obcenter_dia + 1.5f) * U.pixelsize;
 		lampCircleRad = U.pixelsize * 9.0f;
+		lampCircleShadowRad = lampCircleRad + U.pixelsize * 3.0f;
 		/* TODO
 		 * for now we create 3 times the same VBO with only lamp center coordinates
 		 * but ideally we would only create it once */
 		lamp_center = shgroup_dynpoints_uniform_color(*non_meshes, colorLampNoAlpha, &lampCenterSize);
-		lamp_circle_wire = shgroup_lampcircle(*non_meshes, colorLampNoAlpha, &lampCircleRad);
-		lamp_circle_active = shgroup_lampcircle(*non_meshes, colorActive, &lampCircleRad);
-		lamp_circle_select = shgroup_lampcircle(*non_meshes, colorSelect, &lampCircleRad);
+		lamp_circle_wire = shgroup_lamp(*non_meshes, colorLampNoAlpha, &lampCircleRad);
+		lamp_circle_active = shgroup_lamp(*non_meshes, colorActive, &lampCircleRad);
+		lamp_circle_select = shgroup_lamp(*non_meshes, colorSelect, &lampCircleRad);
+		lamp_circle_shadow_wire = shgroup_lamp(*non_meshes, colorLampNoAlpha, &lampCircleShadowRad);
+		lamp_circle_shadow_active = shgroup_lamp(*non_meshes, colorActive, &lampCircleShadowRad);
+		lamp_circle_shadow_select = shgroup_lamp(*non_meshes, colorSelect, &lampCircleShadowRad);
+		lamp_sunrays_wire = shgroup_lamp(*non_meshes, colorLampNoAlpha, &lampCircleRad);
+		lamp_sunrays_active = shgroup_lamp(*non_meshes, colorActive, &lampCircleRad);
+		lamp_sunrays_select = shgroup_lamp(*non_meshes, colorSelect, &lampCircleRad);
 		lamp_groundline = shgroup_groundlines_uniform_color(*non_meshes, colorLamp);
 		lamp_groundpoint = shgroup_groundpoints_uniform_color(*non_meshes, colorLamp);
 
@@ -503,6 +516,8 @@ static void DRW_draw_lamp(Object *ob)
 {
 	struct Batch *geom = DRW_cache_single_vert_get();
 	struct Batch *lamp = DRW_cache_lamp_get();
+	struct Batch *sunrays = DRW_cache_lamp_sunrays_get();
+	Lamp *la = ob->data;
 
 	/* Don't draw the center if it's selected */
 	if ((ob->base_flag & BASE_SELECTED) == 0) {
@@ -513,6 +528,27 @@ static void DRW_draw_lamp(Object *ob)
 		DRW_shgroup_call_add(lamp_circle_select, lamp, ob->obmat);
 	}
 
+	/* 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 ((ob->base_flag & BASE_SELECTED) == 0) {
+				DRW_shgroup_call_add(lamp_circle_shadow_wire, lamp, ob->obmat);
+			}
+			else {
+				DRW_shgroup_call_add(lamp_circle_shadow_select, lamp, ob->obmat);
+			}
+		}
+	}
+
+	if (la->type == LA_SUN) {
+		if ((ob->base_flag & BASE_SELECTED) == 0) {
+			DRW_shgroup_call_add(lamp_sunrays_wire, sunrays, ob->obmat);
+		}
+		else {
+			DRW_shgroup_call_add(lamp_sunrays_select, sunrays, ob->obmat);
+		}
+	}
+
 	DRW_shgroup_call_add(lamp_groundline, geom, ob->obmat);
 	DRW_shgroup_call_add(lamp_groundpoint, geom, ob->obmat);
 }




More information about the Bf-blender-cvs mailing list