Commit: 3c95a0c1222202e2b282432476c182d7b9d9c8f4 Author: Clément Foucault Date: Wed Jul 17 00:31:03 2019 +0200 Branches: tmp-batch-cache-cleanup https://developer.blender.org/rB3c95a0c1222202e2b282432476c182d7b9d9c8f4
Mesh Batch Cache: Refactor Part 5 - Add Vcol support - Add UV/Tangent support - Add Orco support - Add Paint Line Mask support - Add Adjacency Lines support - Add EditUV face/line/point/facedot support - Add EditUV data flag support - Add EditUV StretchAngle/Area support - Add Facedots select index support - Add Weight support - Add Mesh Analysis support =================================================================== M source/blender/draw/intern/draw_cache_impl_mesh.c M source/blender/gpu/shaders/gpu_shader_2D_edituvs_stretch_vert.glsl =================================================================== diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c index 0bebbdd4ede..716329f3eb7 100644 --- a/source/blender/draw/intern/draw_cache_impl_mesh.c +++ b/source/blender/draw/intern/draw_cache_impl_mesh.c @@ -361,6 +361,8 @@ typedef enum eMRDataType { MR_DATATYPE_LOOP_NORMALS = 1 << 12, /* New data types to replace all above */ MR_DATA_POLY_NOR = 1 << 13, + MR_DATA_LOOP_NOR = 1 << 14, + MR_DATA_LOOPTRI = 1 << 15, } eMRDataType; #define MR_DATATYPE_VERT_LOOP_POLY (MR_DATATYPE_VERT | MR_DATATYPE_POLY | MR_DATATYPE_LOOP) @@ -1271,10 +1273,14 @@ static MeshRenderData *mesh_render_data_create_ex_new(Mesh *me, mr->toolsettings = ts; mr->mat_len = mesh_render_mat_len_get(me); + const bool is_auto_smooth = (me->flag & ME_AUTOSMOOTH) != 0; + const float split_angle = is_auto_smooth ? me->smoothresh : (float)M_PI; + if (me->edit_mesh) { BLI_assert(me->edit_mesh->mesh_eval_cage && me->edit_mesh->mesh_eval_final); mr->bm = me->edit_mesh->bm; mr->edit_bmesh = me->edit_mesh; + mr->edit_data = me->runtime.edit_data; mr->me = (do_final) ? me->edit_mesh->mesh_eval_final : me->edit_mesh->mesh_eval_cage; mr->use_mapped = mr->me && !mr->me->runtime.is_original; @@ -1309,7 +1315,7 @@ static MeshRenderData *mesh_render_data_create_ex_new(Mesh *me, * Force not mapped in this case. */ if (do_final && me->edit_mesh->mesh_eval_final != me->edit_mesh->mesh_eval_cage) { mr->use_mapped = false; - mr->edit_bmesh = NULL; + // mr->edit_bmesh = NULL; mr->iter = MR_EXTRACT_MESH; } } @@ -1332,7 +1338,11 @@ static MeshRenderData *mesh_render_data_create_ex_new(Mesh *me, mr->mloop = CustomData_get_layer(&mr->me->ldata, CD_MLOOP); mr->mpoly = CustomData_get_layer(&mr->me->pdata, CD_MPOLY); - if (data_flag & MR_DATA_POLY_NOR) { + mr->v_origindex = CustomData_get_layer(&mr->me->vdata, CD_ORIGINDEX); + mr->e_origindex = CustomData_get_layer(&mr->me->edata, CD_ORIGINDEX); + mr->p_origindex = CustomData_get_layer(&mr->me->pdata, CD_ORIGINDEX); + + if (data_flag & (MR_DATA_POLY_NOR | MR_DATA_LOOP_NOR)) { mr->poly_normals = MEM_mallocN(sizeof(*mr->poly_normals) * mr->poly_len, __func__); BKE_mesh_calc_normals_poly(mr->mvert, NULL, @@ -1344,7 +1354,26 @@ static MeshRenderData *mesh_render_data_create_ex_new(Mesh *me, mr->poly_normals, true); } - if (types & MR_ITER_LOOPTRI) { + if (data_flag & MR_DATA_LOOP_NOR) { + mr->loop_normals = MEM_mallocN(sizeof(*mr->loop_normals) * mr->loop_len, __func__); + short(*clnors)[2] = CustomData_get_layer(&mr->me->ldata, CD_CUSTOMLOOPNORMAL); + BKE_mesh_normals_loop_split(mr->me->mvert, + mr->vert_len, + mr->me->medge, + mr->edge_len, + mr->me->mloop, + mr->loop_normals, + mr->loop_len, + mr->me->mpoly, + mr->poly_normals, + mr->poly_len, + is_auto_smooth, + split_angle, + NULL, + clnors, + NULL); + } + if ((types & MR_ITER_LOOPTRI) || (data_flag & MR_DATA_LOOPTRI)) { mr->mlooptri = MEM_mallocN(sizeof(*mr->mlooptri) * mr->tri_len, "MR_DATATYPE_LOOPTRI"); BKE_mesh_recalc_looptri(mr->me->mloop, mr->me->mpoly, @@ -1404,7 +1433,22 @@ static MeshRenderData *mesh_render_data_create_ex_new(Mesh *me, if (data_flag & MR_DATA_POLY_NOR) { /* Use bmface->no instead. */ } - if (types & MR_ITER_LOOPTRI) { + if (data_flag & MR_DATA_LOOP_NOR) { + mr->loop_normals = MEM_mallocN(sizeof(*mr->loop_normals) * mr->loop_len, __func__); + int clnors_offset = CustomData_get_offset(&mr->bm->ldata, CD_CUSTOMLOOPNORMAL); + BM_loops_calc_normal_vcos(mr->bm, + NULL, + NULL, + NULL, + is_auto_smooth, + split_angle, + mr->loop_normals, + NULL, + NULL, + clnors_offset, + false); + } + if ((types & MR_ITER_LOOPTRI) || (data_flag & MR_DATA_LOOPTRI)) { /* Edit mode ensures this is valid, no need to calculate. */ BLI_assert((bm->totloop == 0) || (mr->edit_bmesh->looptris != NULL)); } @@ -1755,7 +1799,8 @@ fallback: } } -static float evaluate_vertex_weight(const MDeformVert *dvert, const DRW_MeshWeightState *wstate) +static float UNUSED_FUNCTION(evaluate_vertex_weight)(const MDeformVert *dvert, + const DRW_MeshWeightState *wstate) { float input = 0.0f; bool show_alert_color = false; @@ -1801,8 +1846,8 @@ static float evaluate_vertex_weight(const MDeformVert *dvert, const DRW_MeshWeig } /** Ensure #MeshRenderData.vert_weight */ -static void mesh_render_data_ensure_vert_weight(MeshRenderData *rdata, - const struct DRW_MeshWeightState *wstate) +static void UNUSED_FUNCTION(mesh_render_data_ensure_vert_weight)( + MeshRenderData *rdata, const struct DRW_MeshWeightState *wstate) { float *vweight = rdata->vert_weight; if (vweight == NULL) { @@ -1824,7 +1869,7 @@ static void mesh_render_data_ensure_vert_weight(MeshRenderData *rdata, vweight = rdata->vert_weight = MEM_mallocN(sizeof(*vweight) * rdata->vert_len, __func__); BM_ITER_MESH_INDEX (eve, &viter, bm, BM_VERT, i) { const MDeformVert *dvert = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset); - vweight[i] = evaluate_vertex_weight(dvert, wstate); + vweight[i] = UNUSED_evaluate_vertex_weight(dvert, wstate); } } else { @@ -1834,7 +1879,7 @@ static void mesh_render_data_ensure_vert_weight(MeshRenderData *rdata, vweight = rdata->vert_weight = MEM_mallocN(sizeof(*vweight) * rdata->vert_len, __func__); for (int i = 0; i < rdata->vert_len; i++) { - vweight[i] = evaluate_vertex_weight(&rdata->dvert[i], wstate); + vweight[i] = UNUSED_evaluate_vertex_weight(&rdata->dvert[i], wstate); } } } @@ -2213,7 +2258,7 @@ typedef enum DRWBatchFlag { #define MBC_EDITUV \ (MBC_EDITUV_FACES_STRECH_AREA | MBC_EDITUV_FACES_STRECH_ANGLE | MBC_EDITUV_FACES | \ - MBC_EDITUV_EDGES | MBC_EDITUV_VERTS | MBC_EDITUV_FACEDOTS) + MBC_EDITUV_EDGES | MBC_EDITUV_VERTS | MBC_EDITUV_FACEDOTS | MBC_WIRE_LOOPS_UVS) #define FOREACH_MESH_BUFFER_CACHE(batch_cache, mbc) \ for (MeshBufferCache *mbc = &batch_cache->final; \ @@ -2263,7 +2308,7 @@ typedef struct MeshBufferCache { GPUIndexBuf *lines_adjacency; /* Uv overlays. (visibility can differ from 3D view) */ GPUIndexBuf *edituv_tris; - GPUIndexBuf *edituv_line_strips; + GPUIndexBuf *edituv_lines; GPUIndexBuf *edituv_points; GPUIndexBuf *edituv_facedots; } ibo; @@ -2469,8 +2514,9 @@ static void mesh_batch_cache_discard_uvedit(MeshBatchCache *cache) GPU_VERTBUF_DISCARD_SAFE(mbufcache->vbo.facedots_uv); GPU_VERTBUF_DISCARD_SAFE(mbufcache->vbo.facedots_data_edituv); GPU_INDEXBUF_DISCARD_SAFE(mbufcache->ibo.edituv_tris); - GPU_INDEXBUF_DISCARD_SAFE(mbufcache->ibo.edituv_line_strips); + GPU_INDEXBUF_DISCARD_SAFE(mbufcache->ibo.edituv_lines); GPU_INDEXBUF_DISCARD_SAFE(mbufcache->ibo.edituv_points); + GPU_INDEXBUF_DISCARD_SAFE(mbufcache->ibo.edituv_facedots); } GPU_BATCH_DISCARD_SAFE(cache->batch.edituv_faces_strech_area); GPU_BATCH_DISCARD_SAFE(cache->batch.edituv_faces_strech_angle); @@ -2478,6 +2524,7 @@ static void mesh_batch_cache_discard_uvedit(MeshBatchCache *cache) GPU_BATCH_DISCARD_SAFE(cache->batch.edituv_edges); GPU_BATCH_DISCARD_SAFE(cache->batch.edituv_verts); GPU_BATCH_DISCARD_SAFE(cache->batch.edituv_facedots); + GPU_BATCH_DISCARD_SAFE(cache->batch.wire_loops_uvs); cache->batch_ready &= ~MBC_EDITUV; } @@ -2499,11 +2546,15 @@ void DRW_mesh_batch_cache_dirty_tag(Mesh *me, int mode) GPU_BATCH_DISCARD_SAFE(cache->batch.edit_vertices); GPU_BATCH_DISCARD_SAFE(cache->batch.edit_edges); GPU_BATCH_DISCARD_SAFE(cache->batch.edit_facedots); + GPU_BATCH_DISCARD_SAFE(cache->batch.edit_selection_verts); + GPU_BATCH_DISCARD_SAFE(cache->batch.edit_selection_edges); + GPU_BATCH_DISCARD_SAFE(cache->batch.edit_selection_faces); GPU_BATCH_DISCARD_SAFE(cache->batch.edit_selection_facedots); GPU_BATCH_DISCARD_SAFE(cache->batch.edit_mesh_analysis); cache->batch_ready &= ~(MBC_EDIT_TRIANGLES | MBC_EDIT_VERTICES | MBC_EDIT_EDGES | MBC_EDIT_FACEDOTS | MBC_EDIT_SELECTION_FACEDOTS | - MBC_EDIT_MESH_ANALYSIS); + MBC_EDIT_SELECTION_FACES | MBC_EDIT_SELECTION_EDGES | + MBC_EDIT_SELECTION_VERTS | MBC_EDIT_MESH_ANALYSIS); /* Because visible UVs depends on edit mode selection, discard everything. */ mesh_batch_cache_discard_uvedit(cache); break; @@ -3163,7 +3214,7 @@ static void UNUSED_FUNCTION(mesh_create_weights)(MeshRenderData *rdata, const int vbo_len_capacity = mesh_render_data_verts_len_get_maybe_mapped(rdata); - mesh_render_data_ensure_vert_weight(rdata, wstate); + // mesh_render_data_ensure_vert_weight(rdata, wstate); const float *vert_weight = rdata->vert_weight; GPU_vertbuf_init_with_format(vbo, &format); @@ -4694,7 +4745,7 @@ typedef struct MeshExtractIterData { BMLoop *eloop; BMLoop **elooptri; /* Index of current element. Is not BMesh index if iteration is on mapped. */ - int vert_idx, edge_idx, face_idx, loop_idx; + int vert_ @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs