From 170844135aa826423394210039047070a99e8a85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Thu, 23 Jan 2020 15:38:33 +0100 Subject: Fix T67050 Overlay: Forcefield limits are not dashed This adds some kind of dashing to the tube and cone limits. Although the dashing is in object space and is not a good as old dashing. But it is the least time consuming and least complex solution. --- source/blender/draw/intern/draw_cache.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) (limited to 'source/blender/draw/intern/draw_cache.c') diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c index 4d10e781e79..f2e43e032a9 100644 --- a/source/blender/draw/intern/draw_cache.c +++ b/source/blender/draw/intern/draw_cache.c @@ -1222,10 +1222,11 @@ GPUBatch *DRW_cache_field_curve_get(void) GPUBatch *DRW_cache_field_tube_limit_get(void) { #define CIRCLE_RESOL 32 +#define SIDE_STIPPLE 32 if (!SHC.drw_field_tube_limit) { GPUVertFormat format = extra_vert_format(); - int v_len = 2 * (CIRCLE_RESOL * 2 + 4); + int v_len = 2 * (CIRCLE_RESOL * 2 + 4 * SIDE_STIPPLE / 2); GPUVertBuf *vbo = GPU_vertbuf_create_with_format(&format); GPU_vertbuf_data_alloc(vbo, v_len); @@ -1233,14 +1234,14 @@ GPUBatch *DRW_cache_field_tube_limit_get(void) int flag = VCLASS_EMPTY_SIZE; /* Caps */ for (int i = 0; i < 2; i++) { - float z = (float)i * 2.0f - 1.0f; - circle_verts(vbo, &v, CIRCLE_RESOL, 1.0f, z, flag); + float z = i * 2.0f - 1.0f; + circle_dashed_verts(vbo, &v, CIRCLE_RESOL, 1.0f, z, flag); } /* Side Edges */ for (int a = 0; a < 4; a++) { - for (int i = 0; i < 2; i++) { - float z = (float)i * 2.0f - 1.0f; - float angle = (2.0f * M_PI * a) / 4.0f; + float angle = (2.0f * M_PI * a) / 4.0f; + for (int i = 0; i < SIDE_STIPPLE; i++) { + float z = (i / (float)SIDE_STIPPLE) * 2.0f - 1.0f; GPU_vertbuf_vert_set(vbo, v++, &(Vert){{sinf(angle), cosf(angle), z}, flag}); } } @@ -1248,16 +1249,18 @@ GPUBatch *DRW_cache_field_tube_limit_get(void) SHC.drw_field_tube_limit = GPU_batch_create_ex(GPU_PRIM_LINES, vbo, NULL, GPU_BATCH_OWNS_VBO); } return SHC.drw_field_tube_limit; +#undef SIDE_STIPPLE #undef CIRCLE_RESOL } GPUBatch *DRW_cache_field_cone_limit_get(void) { #define CIRCLE_RESOL 32 +#define SIDE_STIPPLE 32 if (!SHC.drw_field_cone_limit) { GPUVertFormat format = extra_vert_format(); - int v_len = 2 * (CIRCLE_RESOL * 2 + 4); + int v_len = 2 * (CIRCLE_RESOL * 2 + 4 * SIDE_STIPPLE / 2); GPUVertBuf *vbo = GPU_vertbuf_create_with_format(&format); GPU_vertbuf_data_alloc(vbo, v_len); @@ -1265,14 +1268,14 @@ GPUBatch *DRW_cache_field_cone_limit_get(void) int flag = VCLASS_EMPTY_SIZE; /* Caps */ for (int i = 0; i < 2; i++) { - float z = (float)i * 2.0f - 1.0f; - circle_verts(vbo, &v, CIRCLE_RESOL, 1.0f, z, flag); + float z = i * 2.0f - 1.0f; + circle_dashed_verts(vbo, &v, CIRCLE_RESOL, 1.0f, z, flag); } /* Side Edges */ for (int a = 0; a < 4; a++) { - for (int i = 0; i < 2; i++) { - float z = (float)i * 2.0f - 1.0f; - float angle = (2.0f * M_PI * a) / 4.0f; + float angle = (2.0f * M_PI * a) / 4.0f; + for (int i = 0; i < SIDE_STIPPLE; i++) { + float z = (i / (float)SIDE_STIPPLE) * 2.0f - 1.0f; GPU_vertbuf_vert_set(vbo, v++, &(Vert){{sinf(angle) * z, cosf(angle) * z, z}, flag}); } } @@ -1280,6 +1283,7 @@ GPUBatch *DRW_cache_field_cone_limit_get(void) SHC.drw_field_cone_limit = GPU_batch_create_ex(GPU_PRIM_LINES, vbo, NULL, GPU_BATCH_OWNS_VBO); } return SHC.drw_field_cone_limit; +#undef SIDE_STIPPLE #undef CIRCLE_RESOL } -- cgit v1.2.3