[Bf-blender-cvs] [3c95a0c1222] tmp-batch-cache-cleanup: Mesh Batch Cache: Refactor Part 5
Clément Foucault
noreply at git.blender.org
Mon Jul 22 12:53:00 CEST 2019
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. @@
More information about the Bf-blender-cvs
mailing list