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:
authorClément Foucault <foucault.clem@gmail.com>2017-02-02 23:39:58 +0300
committerClément Foucault <foucault.clem@gmail.com>2017-02-02 23:39:58 +0300
commit6f1bdaab9dfbbe4d12558f8f22be8c7efabe57df (patch)
tree0baef047c3728f2a3a11caf1ce1d20691c7890da
parent8641fa13972e79d17ba35fd35ee7bcf1518007ff (diff)
Lamp sunrays and shadow circles
-rw-r--r--source/blender/draw/intern/DRW_render.h1
-rw-r--r--source/blender/draw/intern/draw_cache.c36
-rw-r--r--source/blender/draw/intern/draw_cache.h1
-rw-r--r--source/blender/draw/intern/draw_mode_pass.c46
4 files changed, 79 insertions, 5 deletions
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index ac57a05dd14..99456286536 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 b41c232847c..2f571ec7f3c 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 881fc2b529b..c53f3d88af3 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 813fb2b38af..391639e57dc 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);
}