diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2019-10-15 02:49:53 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2019-10-16 19:58:12 +0300 |
commit | 4ddf3215a7df3ac4a0cfceccb283414510078ba5 (patch) | |
tree | ce0bea243fa956facde99f10cacb11566d292a95 /source/blender/draw/intern | |
parent | 895666689931b313b06bd6f8384ac09794723f19 (diff) |
Fix T68380 Skin modifier root not displayed
Diffstat (limited to 'source/blender/draw/intern')
-rw-r--r-- | source/blender/draw/intern/draw_cache_extract.h | 5 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_cache_extract_mesh.c | 64 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_cache_impl.h | 1 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_cache_impl_mesh.c | 19 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_common.c | 1 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_common.h | 1 |
6 files changed, 90 insertions, 1 deletions
diff --git a/source/blender/draw/intern/draw_cache_extract.h b/source/blender/draw/intern/draw_cache_extract.h index 46193e255b5..b1eab3c73ae 100644 --- a/source/blender/draw/intern/draw_cache_extract.h +++ b/source/blender/draw/intern/draw_cache_extract.h @@ -81,7 +81,7 @@ BLI_INLINE int mesh_render_mat_len_get(Mesh *me) typedef struct MeshBufferCache { /* Every VBO below contains at least enough - * data for every loops in the mesh (except fdots). + * data for every loops in the mesh (except fdots and skin roots). * For some VBOs, it extends to (in this exact order) : * loops + loose_edges*2 + loose_verts */ struct { @@ -104,6 +104,7 @@ typedef struct MeshBufferCache { GPUVertBuf *fdots_uv; // GPUVertBuf *fdots_edit_data; /* inside fdots_nor for now. */ GPUVertBuf *fdots_edituv_data; + GPUVertBuf *skin_roots; /* Selection */ GPUVertBuf *vert_idx; /* extend */ GPUVertBuf *edge_idx; /* extend */ @@ -157,6 +158,7 @@ typedef enum DRWBatchFlag { MBC_WIRE_LOOPS = (1 << 24), MBC_WIRE_LOOPS_UVS = (1 << 25), MBC_SURF_PER_MAT = (1 << 26), + MBC_SKIN_ROOTS = (1 << 27), } DRWBatchFlag; #define MBC_EDITUV \ @@ -185,6 +187,7 @@ typedef struct MeshBatchCache { GPUBatch *edit_lnor; GPUBatch *edit_fdots; GPUBatch *edit_mesh_analysis; + GPUBatch *edit_skin_roots; /* Edit UVs */ GPUBatch *edituv_faces_stretch_area; GPUBatch *edituv_faces_stretch_angle; diff --git a/source/blender/draw/intern/draw_cache_extract_mesh.c b/source/blender/draw/intern/draw_cache_extract_mesh.c index 2ac97196b99..0479bdd4de7 100644 --- a/source/blender/draw/intern/draw_cache_extract_mesh.c +++ b/source/blender/draw/intern/draw_cache_extract_mesh.c @@ -3860,6 +3860,69 @@ static const MeshExtract extract_fdots_edituv_data = { /** \} */ /* ---------------------------------------------------------------------- */ +/** \name Extract Skin Modifier Roots + * \{ */ + +typedef struct SkinRootData { + float size; + float local_pos[3]; +} SkinRootData; + +static void *extract_skin_roots_init(const MeshRenderData *mr, void *buf) +{ + /* Exclusively for edit mode. */ + BLI_assert(mr->bm); + + static GPUVertFormat format = {0}; + if (format.attr_len == 0) { + GPU_vertformat_attr_add(&format, "size", GPU_COMP_F32, 1, GPU_FETCH_FLOAT); + GPU_vertformat_attr_add(&format, "local_pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); + } + GPUVertBuf *vbo = buf; + GPU_vertbuf_init_with_format(vbo, &format); + GPU_vertbuf_data_alloc(vbo, mr->bm->totvert); + + SkinRootData *vbo_data = (SkinRootData *)vbo->data; + + int root_len = 0; + int cd_ofs = CustomData_get_offset(&mr->bm->vdata, CD_MVERT_SKIN); + + BMIter iter; + BMVert *eve; + BM_ITER_MESH (eve, &iter, mr->bm, BM_VERTS_OF_MESH) { + const MVertSkin *vs = BM_ELEM_CD_GET_VOID_P(eve, cd_ofs); + if (vs->flag & MVERT_SKIN_ROOT) { + vbo_data->size = (vs->radius[0] + vs->radius[1]) * 0.5f; + copy_v3_v3(vbo_data->local_pos, eve->co); + vbo_data++; + root_len++; + } + } + + /* It's really unlikely that all verts will be roots. Resize to avoid loosing VRAM. */ + GPU_vertbuf_data_len_set(vbo, root_len); + + return NULL; +} + +static const MeshExtract extract_skin_roots = { + extract_skin_roots_init, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + false, +}; + +/** \} */ + +/* ---------------------------------------------------------------------- */ /** \name Extract Selection Index * \{ */ @@ -4358,6 +4421,7 @@ void mesh_buffer_cache_create_requested(MeshBatchCache *cache, EXTRACT(vbo, edge_idx); EXTRACT(vbo, vert_idx); EXTRACT(vbo, fdot_idx); + EXTRACT(vbo, skin_roots); EXTRACT(ibo, tris); EXTRACT(ibo, lines); diff --git a/source/blender/draw/intern/draw_cache_impl.h b/source/blender/draw/intern/draw_cache_impl.h index cdc1791b153..8cb318bd0bb 100644 --- a/source/blender/draw/intern/draw_cache_impl.h +++ b/source/blender/draw/intern/draw_cache_impl.h @@ -142,6 +142,7 @@ struct GPUBatch *DRW_mesh_batch_cache_get_edit_edges(struct Mesh *me); struct GPUBatch *DRW_mesh_batch_cache_get_edit_vnors(struct Mesh *me); struct GPUBatch *DRW_mesh_batch_cache_get_edit_lnors(struct Mesh *me); struct GPUBatch *DRW_mesh_batch_cache_get_edit_facedots(struct Mesh *me); +struct GPUBatch *DRW_mesh_batch_cache_get_edit_skin_roots(struct Mesh *me); /* edit-mesh selection */ struct GPUBatch *DRW_mesh_batch_cache_get_triangles_with_select_id(struct Mesh *me); struct GPUBatch *DRW_mesh_batch_cache_get_facedots_with_select_id(struct Mesh *me); diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c index b8b657354b2..49db8bd9765 100644 --- a/source/blender/draw/intern/draw_cache_impl_mesh.c +++ b/source/blender/draw/intern/draw_cache_impl_mesh.c @@ -879,6 +879,13 @@ GPUBatch *DRW_mesh_batch_cache_get_edit_facedots(Mesh *me) return DRW_batch_request(&cache->batch.edit_fdots); } +GPUBatch *DRW_mesh_batch_cache_get_edit_skin_roots(Mesh *me) +{ + MeshBatchCache *cache = mesh_batch_cache_get(me); + mesh_batch_cache_add_request(cache, MBC_SKIN_ROOTS); + return DRW_batch_request(&cache->batch.edit_skin_roots); +} + /** \} */ /* ---------------------------------------------------------------------- */ @@ -1319,6 +1326,18 @@ void DRW_mesh_batch_cache_create_requested( DRW_vbo_request(cache->batch.edit_fdots, &mbufcache->vbo.fdots_pos); DRW_vbo_request(cache->batch.edit_fdots, &mbufcache->vbo.fdots_nor); } + if (DRW_batch_requested(cache->batch.edit_skin_roots, GPU_PRIM_LINES)) { + DRW_vbo_request(cache->batch.edit_skin_roots, &mbufcache->vbo.skin_roots); + /* HACK(fclem): This is a workaround the deferred batch init + * that prevent drawing using DRW_shgroup_call_instances_with_attribs. + * So we instead create the whole instancing batch here. + * Note that we use GPU_PRIM_LINES instead of expected GPU_PRIM_LINE_STRIP + * in order to mimic the old stipple pattern. */ + cache->batch.edit_skin_roots->inst = cache->batch.edit_skin_roots->verts[0]; + cache->batch.edit_skin_roots->verts[0] = NULL; + GPUBatch *circle = DRW_cache_screenspace_circle_get(); + GPU_batch_vertbuf_add(cache->batch.edit_skin_roots, circle->verts[0]); + } /* Selection */ if (DRW_batch_requested(cache->batch.edit_selection_verts, GPU_PRIM_POINTS)) { diff --git a/source/blender/draw/intern/draw_common.c b/source/blender/draw/intern/draw_common.c index 988859c64a5..c04425ded3f 100644 --- a/source/blender/draw/intern/draw_common.c +++ b/source/blender/draw/intern/draw_common.c @@ -83,6 +83,7 @@ void DRW_globals_update(void) UI_GetThemeColor4fv(TH_VNORMAL, gb->colorVNormal); UI_GetThemeColor4fv(TH_LNORMAL, gb->colorLNormal); UI_GetThemeColor4fv(TH_FACE_DOT, gb->colorFaceDot); + UI_GetThemeColor4fv(TH_SKIN_ROOT, gb->colorSkinRoot); UI_GetThemeColor4fv(TH_BACK, gb->colorBackground); /* Custom median color to slightly affect the edit mesh colors. */ diff --git a/source/blender/draw/intern/draw_common.h b/source/blender/draw/intern/draw_common.h index 9899b6c0194..01c0946247a 100644 --- a/source/blender/draw/intern/draw_common.h +++ b/source/blender/draw/intern/draw_common.h @@ -73,6 +73,7 @@ typedef struct GlobalsUboStorage { float colorVNormal[4]; float colorLNormal[4]; float colorFaceDot[4]; + float colorSkinRoot[4]; float colorDeselect[4]; float colorOutline[4]; |