diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-01-21 20:32:40 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-01-22 01:16:59 +0300 |
commit | 6700ee98551d40cdc40a83051ae8200e22a71fb2 (patch) | |
tree | 70fabf124d649b1e6a4870e779dc6c6db43b39da /source/blender/draw | |
parent | b2c81c5d431796448dbaf4096df80df4b032dd60 (diff) |
DRW: Make the lamp widgets lines stippled.
Diffstat (limited to 'source/blender/draw')
-rw-r--r-- | source/blender/draw/intern/draw_cache.c | 47 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_cache.h | 1 | ||||
-rw-r--r-- | source/blender/draw/modes/object_mode.c | 1 |
3 files changed, 42 insertions, 7 deletions
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c index e02f6bd6306..5ef1e0de1c7 100644 --- a/source/blender/draw/intern/draw_cache.c +++ b/source/blender/draw/intern/draw_cache.c @@ -65,6 +65,7 @@ static struct DRWShapeCache { Gwn_Batch *drw_field_tube_limit; Gwn_Batch *drw_field_cone_limit; Gwn_Batch *drw_lamp; + Gwn_Batch *drw_lamp_shadows; Gwn_Batch *drw_lamp_sunrays; Gwn_Batch *drw_lamp_area; Gwn_Batch *drw_lamp_hemi; @@ -1013,14 +1014,14 @@ Gwn_Batch *DRW_cache_lamp_get(void) Gwn_VertBuf *vbo = GWN_vertbuf_create_with_format(&format); GWN_vertbuf_data_alloc(vbo, NSEGMENTS * 2); - for (int a = 0; a < NSEGMENTS; a++) { - v[0] = sinf((2.0f * M_PI * a) / ((float)NSEGMENTS)); - v[1] = cosf((2.0f * M_PI * a) / ((float)NSEGMENTS)); - GWN_vertbuf_attr_set(vbo, attr_id.pos, a * 2, v); + for (int a = 0; a < NSEGMENTS * 2; a += 2) { + v[0] = sinf((2.0f * M_PI * a) / ((float)NSEGMENTS * 2)); + v[1] = cosf((2.0f * M_PI * a) / ((float)NSEGMENTS * 2)); + GWN_vertbuf_attr_set(vbo, attr_id.pos, a, v); - v[0] = sinf((2.0f * M_PI * (a + 1)) / ((float)NSEGMENTS)); - v[1] = cosf((2.0f * M_PI * (a + 1)) / ((float)NSEGMENTS)); - GWN_vertbuf_attr_set(vbo, attr_id.pos, a * 2 + 1, v); + v[0] = sinf((2.0f * M_PI * (a + 1)) / ((float)NSEGMENTS * 2)); + v[1] = cosf((2.0f * M_PI * (a + 1)) / ((float)NSEGMENTS * 2)); + GWN_vertbuf_attr_set(vbo, attr_id.pos, a + 1, v); } SHC.drw_lamp = GWN_batch_create_ex(GWN_PRIM_LINES, vbo, NULL, GWN_BATCH_OWNS_VBO); @@ -1029,6 +1030,38 @@ Gwn_Batch *DRW_cache_lamp_get(void) #undef NSEGMENTS } +Gwn_Batch *DRW_cache_lamp_shadows_get(void) +{ +#define NSEGMENTS 10 + if (!SHC.drw_lamp_shadows) { + float v[2]; + + /* Position Only 3D format */ + static Gwn_VertFormat format = { 0 }; + static struct { uint pos; } attr_id; + if (format.attrib_ct == 0) { + attr_id.pos = GWN_vertformat_attr_add(&format, "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT); + } + + Gwn_VertBuf *vbo = GWN_vertbuf_create_with_format(&format); + GWN_vertbuf_data_alloc(vbo, NSEGMENTS * 2); + + for (int a = 0; a < NSEGMENTS * 2; a += 2) { + v[0] = sinf((2.0f * M_PI * a) / ((float)NSEGMENTS * 2)); + v[1] = cosf((2.0f * M_PI * a) / ((float)NSEGMENTS * 2)); + GWN_vertbuf_attr_set(vbo, attr_id.pos, a, v); + + v[0] = sinf((2.0f * M_PI * (a + 1)) / ((float)NSEGMENTS * 2)); + v[1] = cosf((2.0f * M_PI * (a + 1)) / ((float)NSEGMENTS * 2)); + GWN_vertbuf_attr_set(vbo, attr_id.pos, a + 1, v); + } + + SHC.drw_lamp_shadows = GWN_batch_create_ex(GWN_PRIM_LINES, vbo, NULL, GWN_BATCH_OWNS_VBO); + } + return SHC.drw_lamp_shadows; +#undef NSEGMENTS +} + Gwn_Batch *DRW_cache_lamp_sunrays_get(void) { if (!SHC.drw_lamp_sunrays) { diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h index 3564178dba9..148171a966a 100644 --- a/source/blender/draw/intern/draw_cache.h +++ b/source/blender/draw/intern/draw_cache.h @@ -70,6 +70,7 @@ struct Gwn_Batch *DRW_cache_field_cone_limit_get(void); /* Lamps */ struct Gwn_Batch *DRW_cache_lamp_get(void); +struct Gwn_Batch *DRW_cache_lamp_shadows_get(void); struct Gwn_Batch *DRW_cache_lamp_sunrays_get(void); struct Gwn_Batch *DRW_cache_lamp_area_get(void); struct Gwn_Batch *DRW_cache_lamp_hemi_get(void); diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c index 1d4d82bf900..175eb172cd1 100644 --- a/source/blender/draw/modes/object_mode.c +++ b/source/blender/draw/modes/object_mode.c @@ -986,6 +986,7 @@ static void OBJECT_cache_init(void *vedata) geom = DRW_cache_lamp_get(); stl->g_data->lamp_circle = shgroup_instance_screenspace(psl->non_meshes, geom, &ts.sizeLampCircle); + geom = DRW_cache_lamp_shadows_get(); stl->g_data->lamp_circle_shadow = shgroup_instance_screenspace(psl->non_meshes, geom, &ts.sizeLampCircleShadow); geom = DRW_cache_lamp_sunrays_get(); |