[Bf-blender-cvs] [73ca2f702f5] tmp-batch-cache-cleanup: Mesh Batch Cache: Refactor part 1
Clément Foucault
noreply at git.blender.org
Mon Jul 22 12:52:50 CEST 2019
Commit: 73ca2f702f5ba6cf6d75c9855b7815d3001f673a
Author: Clément Foucault
Date: Sun Jul 14 00:59:52 2019 +0200
Branches: tmp-batch-cache-cleanup
https://developer.blender.org/rB73ca2f702f5ba6cf6d75c9855b7815d3001f673a
Mesh Batch Cache: Refactor part 1
- Start refactoring MeshRenderData and mesh_render_data_create_ex
- Add Iter functions
- Add dummy callbacks
- Add some Extract types (not enabled)
===================================================================
M source/blender/draw/intern/draw_cache_impl_mesh.c
M source/blender/gpu/GPU_element.h
M source/blender/gpu/intern/gpu_element.c
===================================================================
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index f244cf40e79..cf8c14dc1d8 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -90,6 +90,19 @@ typedef struct DRW_MeshCDMask {
uint32_t tan_orco : 1;
} DRW_MeshCDMask;
+typedef enum eMRIterType {
+ MR_ITER_LOOPTRI = 1 << 0,
+ MR_ITER_LOOP = 1 << 1,
+ MR_ITER_LEDGE = 1 << 2,
+ MR_ITER_LVERT = 1 << 3,
+} eMRIterType;
+
+typedef enum eMRExtractType {
+ MR_EXTRACT_BMESH,
+ MR_EXTRACT_MAPPED,
+ MR_EXTRACT_MESH,
+} eMRExtractType;
+
/* DRW_MeshWeightState.flags */
enum {
DRW_MESH_WEIGHT_STATE_MULTIPAINT = (1 << 0),
@@ -193,11 +206,19 @@ typedef struct MeshRenderData {
int edge_len;
int tri_len;
int loop_len;
+ int loop_loose_len;
+ int edge_loose_len;
+ int vert_loose_len;
int poly_len;
int mat_len;
- int loose_vert_len;
- int loose_edge_len;
+ int loose_vert_len; /* Obsolete */
+ int loose_edge_len; /* Obsolete */
+ int *tri_mat_len;
+
+ int *lverts;
+ int *ledges;
+ bool use_mapped;
/* Support for mapped mesh data. */
struct {
/* Must be set if we want to get mapped data. */
@@ -225,10 +246,18 @@ typedef struct MeshRenderData {
int *p_origindex;
} mapped;
+ int *v_origindex;
+ int *e_origindex;
+ int *l_origindex;
+ int *p_origindex;
+
BMEditMesh *edit_bmesh;
+ BMesh *bm;
struct EditMeshData *edit_data;
const ToolSettings *toolsettings;
+ eMRExtractType iter;
+
Mesh *me;
MVert *mvert;
@@ -1225,6 +1254,131 @@ static MeshRenderData *mesh_render_data_create_ex(Mesh *me,
return rdata;
}
+static MeshRenderData *mesh_render_data_create_ex_new(Mesh *me,
+ const int types,
+ const DRW_MeshCDMask *UNUSED(cd_used),
+ const ToolSettings *ts)
+{
+ MeshRenderData *mr = MEM_callocN(sizeof(*mr), __func__);
+ mr->toolsettings = ts;
+ mr->mat_len = mesh_render_mat_len_get(me);
+
+ mr->me = me;
+ mr->edit_bmesh = me->edit_mesh;
+ mr->use_mapped = me->edit_mesh && me->edit_mesh->mesh_eval_cage &&
+ !me->edit_mesh->mesh_eval_cage->runtime.is_original;
+
+ mr->iter = mr->edit_bmesh ? (mr->use_mapped ? MR_EXTRACT_MAPPED : MR_EXTRACT_BMESH) :
+ MR_EXTRACT_MESH;
+
+ if (mr->edit_bmesh) {
+ mr->bm = mr->edit_bmesh->bm;
+ }
+
+ if (mr->use_mapped) {
+ mr->me = mr->edit_bmesh->mesh_eval_cage;
+
+ 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);
+
+ mr->use_mapped = (mr->v_origindex || mr->e_origindex || mr->p_origindex);
+ BLI_assert(mr->use_mapped);
+ }
+
+ if (!mr->edit_bmesh || mr->use_mapped) {
+ /* Mesh */
+ mr->vert_len = mr->me->totvert;
+ mr->edge_len = mr->me->totedge;
+ mr->loop_len = mr->me->totloop;
+ mr->poly_len = mr->me->totpoly;
+ mr->tri_len = poly_to_tri_count(mr->poly_len, mr->loop_len);
+
+ mr->mvert = CustomData_get_layer(&mr->me->vdata, CD_MVERT);
+ mr->medge = CustomData_get_layer(&mr->me->edata, CD_MEDGE);
+ mr->mloop = CustomData_get_layer(&mr->me->ldata, CD_MLOOP);
+ mr->mpoly = CustomData_get_layer(&mr->me->pdata, CD_MPOLY);
+
+ if (types & MR_ITER_LOOPTRI) {
+ mr->mlooptri = MEM_mallocN(sizeof(*mr->mlooptri) * mr->tri_len, "MR_DATATYPE_LOOPTRI");
+ BKE_mesh_recalc_looptri(
+ me->mloop, me->mpoly, me->mvert, me->totloop, me->totpoly, mr->mlooptri);
+ }
+ if (types & (MR_ITER_LEDGE | MR_ITER_LVERT)) {
+ mr->vert_loose_len = 0;
+ mr->edge_loose_len = 0;
+
+ /* TODO */
+ /* Note: Might not be possible for lverts. */
+
+ mr->loop_loose_len = mr->vert_loose_len + mr->edge_loose_len * 2;
+ }
+ }
+ else {
+ /* BMesh */
+ BMesh *bm = mr->bm;
+
+ mr->vert_len = bm->totvert;
+ mr->edge_len = bm->totedge;
+ mr->loop_len = bm->totloop;
+ mr->poly_len = bm->totface;
+ mr->tri_len = poly_to_tri_count(mr->poly_len, mr->loop_len);
+
+ mr->efa_act_uv = EDBM_uv_active_face_get(mr->edit_bmesh, false, false);
+ mr->efa_act = BM_mesh_active_face_get(bm, false, true);
+ mr->eed_act = BM_mesh_active_edge_get(bm);
+ mr->eve_act = BM_mesh_active_vert_get(bm);
+
+ mr->cd.offset.crease = CustomData_get_offset(&bm->edata, CD_CREASE);
+ mr->cd.offset.bweight = CustomData_get_offset(&bm->edata, CD_BWEIGHT);
+#ifdef WITH_FREESTYLE
+ mr->cd.offset.freestyle_edge = CustomData_get_offset(&bm->edata, CD_FREESTYLE_EDGE);
+ mr->cd.offset.freestyle_face = CustomData_get_offset(&bm->pdata, CD_FREESTYLE_FACE);
+#endif
+
+ int bm_ensure_types = BM_VERT | BM_EDGE | BM_LOOP | BM_FACE;
+
+ BM_mesh_elem_index_ensure(bm, bm_ensure_types);
+ BM_mesh_elem_table_ensure(bm, bm_ensure_types & ~BM_LOOP);
+
+ if (types & MR_ITER_LOOPTRI) {
+ /* Edit mode ensures this is valid, no need to calculate. */
+ BLI_assert((bm->totloop == 0) || (mr->edit_bmesh->looptris != NULL));
+ }
+ if (types & (MR_ITER_LEDGE | MR_ITER_LVERT)) {
+ int elem_id;
+ BMIter iter;
+ BMVert *eve;
+ BMEdge *ede;
+ mr->vert_loose_len = 0;
+ mr->edge_loose_len = 0;
+
+ mr->lverts = MEM_mallocN(mr->vert_len * sizeof(*mr->lverts), __func__);
+ BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, elem_id) {
+ if (eve->e == NULL) {
+ mr->lverts[mr->vert_loose_len++] = elem_id;
+ }
+ }
+ if (mr->vert_loose_len < mr->vert_len) {
+ mr->lverts = MEM_reallocN(mr->lverts, mr->vert_loose_len * sizeof(*mr->lverts));
+ }
+
+ mr->ledges = MEM_mallocN(mr->edge_len * sizeof(int), __func__);
+ BM_ITER_MESH_INDEX (ede, &iter, bm, BM_EDGES_OF_MESH, elem_id) {
+ if (ede->l == NULL) {
+ mr->ledges[mr->edge_loose_len++] = elem_id;
+ }
+ }
+ if (mr->edge_loose_len < mr->vert_len) {
+ mr->ledges = MEM_reallocN(mr->ledges, mr->edge_loose_len * sizeof(*mr->ledges));
+ }
+
+ mr->loop_loose_len = mr->vert_loose_len + mr->edge_loose_len * 2;
+ }
+ }
+ return mr;
+}
+
/* Warning replace mesh pointer. */
#define MBC_GET_FINAL_MESH(me) \
/* Hack to show the final result. */ \
@@ -1270,6 +1424,9 @@ static void mesh_render_data_free(MeshRenderData *rdata)
MEM_SAFE_FREE(rdata->mapped.loose_verts);
MEM_SAFE_FREE(rdata->mapped.loose_edges);
+ MEM_SAFE_FREE(rdata->lverts);
+ MEM_SAFE_FREE(rdata->ledges);
+
CustomData_free(&rdata->cd.output.ldata, rdata->loop_len);
MEM_freeN(rdata);
@@ -2008,13 +2165,13 @@ typedef struct MeshBufferCache {
* loops + loose_edges*2 + loose_verts */
struct {
GPUVertBuf *pos_nor; /* extend */
+ GPUVertBuf *lnor; /* extend */
GPUVertBuf *edge_fac; /* extend */
GPUVertBuf *weights; /* extend */
GPUVertBuf *uv_tan;
GPUVertBuf *vcol;
GPUVertBuf *orco;
/* Only for edit mode. */
- GPUVertBuf *vnor; /* extend */
GPUVertBuf *data; /* extend */
GPUVertBuf *data_edituv;
GPUVertBuf *stretch_area;
@@ -2033,12 +2190,11 @@ typedef struct MeshBufferCache {
* Only need to be updated when topology changes. */
struct {
/* Indices to vloops. */
- GPUIndexBuf *tris; /* Ordered per material. */
- GPUIndexBuf *lines;
+ GPUIndexBuf *tris; /* Ordered per material. */
+ GPUIndexBuf *lines; /* Loose edges last. */
GPUIndexBuf *points;
GPUIndexBuf *facedots;
/* 3D overlays. */
- GPUIndexBuf *lines_loose; /* only loose edges. */
GPUIndexBuf *lines_paint_mask; /* no loose edges. */
GPUIndexBuf *lines_adjacency;
/* Uv overlays. (visibility can differ from 3D view) */
@@ -2369,14 +2525,14 @@ void DRW_mesh_batch_cache_free(Mesh *me)
/* GPUBatch cache usage. */
-static void mesh_create_edit_vertex_loops(MeshRenderData *rdata,
- GPUVertBuf *vbo_pos_nor,
- GPUVertBuf *vbo_lnor,
- GPUVertBuf *vbo_uv,
- GPUVertBuf *vbo_data,
- GPUVertBuf *vbo_verts,
- GPUVertBuf *vbo_edges,
- GPUVertBuf *vbo_faces)
+static void UNUSED_FUNCTION(mesh_create_edit_vertex_loops)(MeshRenderData *rdata,
+ GPUVertBuf *vbo_pos_nor,
+ GPUVertBuf *vbo_lnor,
+ GPUVertBuf *vbo_uv,
+ GPUVertBuf *vbo_data,
+ GPUVertBuf *vbo_verts,
+ GPUVertBuf *vbo_edges,
+ GPUVertBuf *vbo_faces)
{
#if 0
const int vert_len = mesh_render_data_verts_len_get_maybe_mapped(rdata);
@@ -2784,10 +2940,10 @@ static void mesh_create_edit_vertex_loops(MeshRenderData *rdata,
}
/* TODO: We could use gl_PrimitiveID as index instead of using another VBO. */
-static void mesh_create_edit_facedots_select_id(MeshRenderData *rdata,
- GPUVertBuf *vbo,
- Scene *scene,
- Object *ob)
+static void UNUSED_FUNCTION(mesh_create_edit_facedots_select_id)(MeshRenderData *rdata,
+ GPUVertBuf *vbo,
+ Scene *scene,
+ Object *ob)
{
const int poly_len = mesh_render_data_polys_len_get_maybe_mapped(rdata);
@@ -2860,7 +3016,7 @@ static void mesh_create_edit_facedots_select_id(MeshRenderData *rdata,
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list