Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/blenkernel/intern/mesh_render.c281
1 files changed, 146 insertions, 135 deletions
diff --git a/source/blender/blenkernel/intern/mesh_render.c b/source/blender/blenkernel/intern/mesh_render.c
index c442cf0bc73..7dd8c00f181 100644
--- a/source/blender/blenkernel/intern/mesh_render.c
+++ b/source/blender/blenkernel/intern/mesh_render.c
@@ -50,27 +50,27 @@
/* ---------------------------------------------------------------------- */
/* Mesh/BMesh Interface, direct access to basic data. */
-static int mesh_render_verts_num_get(Mesh *me)
+static int mesh_render_verts_len_get(Mesh *me)
{
return me->edit_btmesh ? me->edit_btmesh->bm->totvert : me->totvert;
}
-static int mesh_render_edges_num_get(Mesh *me)
+static int mesh_render_edges_len_get(Mesh *me)
{
return me->edit_btmesh ? me->edit_btmesh->bm->totedge : me->totedge;
}
-static int mesh_render_looptri_num_get(Mesh *me)
+static int mesh_render_looptri_len_get(Mesh *me)
{
return me->edit_btmesh ? me->edit_btmesh->tottri : poly_to_tri_count(me->totpoly, me->totloop);
}
-static int mesh_render_polys_num_get(Mesh *me)
+static int mesh_render_polys_len_get(Mesh *me)
{
return me->edit_btmesh ? me->edit_btmesh->bm->totface : me->totpoly;
}
-static int UNUSED_FUNCTION(mesh_render_loops_num_get)(Mesh *me)
+static int UNUSED_FUNCTION(mesh_render_loops_len_get)(Mesh *me)
{
return me->edit_btmesh ? me->edit_btmesh->bm->totloop : me->totloop;
}
@@ -93,13 +93,13 @@ typedef struct EdgeDrawAttr {
typedef struct MeshRenderData {
int types;
- int totvert;
- int totedge;
- int tottri;
- int totloop;
- int totpoly;
- int totlvert;
- int totledge;
+ int vert_len;
+ int edge_len;
+ int tri_len;
+ int loop_len;
+ int poly_len;
+ int loose_vert_len;
+ int loose_edge_len;
BMEditMesh *edit_bmesh;
MVert *mvert;
@@ -177,23 +177,23 @@ static MeshRenderData *mesh_render_data_create(Mesh *me, const int types)
int bm_ensure_types = 0;
if (types & (MR_DATATYPE_VERT)) {
- mrdata->totvert = bm->totvert;
+ mrdata->vert_len = bm->totvert;
bm_ensure_types |= BM_VERT;
}
if (types & (MR_DATATYPE_EDGE)) {
- mrdata->totedge = bm->totedge;
+ mrdata->edge_len = bm->totedge;
bm_ensure_types |= BM_EDGE;
}
if (types & MR_DATATYPE_LOOPTRI) {
BKE_editmesh_tessface_calc(embm);
- mrdata->tottri = embm->tottri;
+ mrdata->tri_len = embm->tottri;
}
if (types & MR_DATATYPE_LOOP) {
- mrdata->totloop = bm->totloop;
+ mrdata->loop_len = bm->totloop;
bm_ensure_types |= BM_LOOP;
}
if (types & MR_DATATYPE_POLY) {
- mrdata->totpoly = bm->totface;
+ mrdata->poly_len = bm->totface;
bm_ensure_types |= BM_FACE;
}
if (types & MR_DATATYPE_OVERLAY) {
@@ -206,10 +206,10 @@ static MeshRenderData *mesh_render_data_create(Mesh *me, const int types)
BM_mesh_elem_index_ensure(bm, bm_ensure_types);
BM_mesh_elem_table_ensure(bm, bm_ensure_types & ~BM_LOOP);
if (types & MR_DATATYPE_OVERLAY) {
- mrdata->totlvert = mrdata->totledge = 0;
+ mrdata->loose_vert_len = mrdata->loose_edge_len = 0;
- int *lverts = mrdata->loose_verts = MEM_mallocN(mrdata->totvert * sizeof(int), "Loose Vert");
- int *ledges = mrdata->loose_edges = MEM_mallocN(mrdata->totedge * sizeof(int), "Loose Edges");
+ int *lverts = mrdata->loose_verts = MEM_mallocN(mrdata->vert_len * sizeof(int), "Loose Vert");
+ int *ledges = mrdata->loose_edges = MEM_mallocN(mrdata->edge_len * sizeof(int), "Loose Edges");
{
BLI_assert((bm->elem_table_dirty & BM_VERT) == 0);
@@ -219,7 +219,7 @@ static MeshRenderData *mesh_render_data_create(Mesh *me, const int types)
if (!BM_elem_flag_test(v, BM_ELEM_HIDDEN)) {
/* Loose vert */
if (v->e == NULL || !bm_vert_has_visible_edge(v)) {
- lverts[mrdata->totlvert++] = i;
+ lverts[mrdata->loose_vert_len++] = i;
}
}
}
@@ -233,36 +233,36 @@ static MeshRenderData *mesh_render_data_create(Mesh *me, const int types)
if (!BM_elem_flag_test(e, BM_ELEM_HIDDEN)) {
/* Loose edge */
if (e->l == NULL || !bm_edge_has_visible_face(e)) {
- ledges[mrdata->totledge++] = i;
+ ledges[mrdata->loose_edge_len++] = i;
}
}
}
}
- mrdata->loose_verts = MEM_reallocN(mrdata->loose_verts, mrdata->totlvert * sizeof(int));
- mrdata->loose_edges = MEM_reallocN(mrdata->loose_edges, mrdata->totledge * sizeof(int));
+ mrdata->loose_verts = MEM_reallocN(mrdata->loose_verts, mrdata->loose_vert_len * sizeof(int));
+ mrdata->loose_edges = MEM_reallocN(mrdata->loose_edges, mrdata->loose_edge_len * sizeof(int));
}
}
else {
if (types & (MR_DATATYPE_VERT)) {
- mrdata->totvert = me->totvert;
+ mrdata->vert_len = me->totvert;
mrdata->mvert = CustomData_get_layer(&me->vdata, CD_MVERT);
}
if (types & (MR_DATATYPE_EDGE)) {
- mrdata->totedge = me->totedge;
+ mrdata->edge_len = me->totedge;
mrdata->medge = CustomData_get_layer(&me->edata, CD_MEDGE);
}
if (types & MR_DATATYPE_LOOPTRI) {
- const int tottri = mrdata->tottri = poly_to_tri_count(me->totpoly, me->totloop);
- mrdata->mlooptri = MEM_mallocN(sizeof(*mrdata->mlooptri) * tottri, __func__);
+ const int tri_len = mrdata->tri_len = poly_to_tri_count(me->totpoly, me->totloop);
+ mrdata->mlooptri = MEM_mallocN(sizeof(*mrdata->mlooptri) * tri_len, __func__);
BKE_mesh_recalc_looptri(me->mloop, me->mpoly, me->mvert, me->totloop, me->totpoly, mrdata->mlooptri);
}
if (types & MR_DATATYPE_LOOP) {
- mrdata->totloop = me->totloop;
+ mrdata->loop_len = me->totloop;
mrdata->mloop = CustomData_get_layer(&me->ldata, CD_MLOOP);
}
if (types & MR_DATATYPE_POLY) {
- mrdata->totpoly = me->totpoly;
+ mrdata->poly_len = me->totpoly;
mrdata->mpoly = CustomData_get_layer(&me->pdata, CD_MPOLY);
}
}
@@ -296,46 +296,46 @@ static void mesh_render_data_free(MeshRenderData *mrdata)
MEM_freeN(mrdata);
}
-static int mesh_render_data_verts_num_get(const MeshRenderData *mrdata)
+static int mesh_render_data_verts_len_get(const MeshRenderData *mrdata)
{
BLI_assert(mrdata->types & MR_DATATYPE_VERT);
- return mrdata->totvert;
+ return mrdata->vert_len;
}
-static int mesh_render_data_loose_verts_num_get(const MeshRenderData *mrdata)
+static int mesh_render_data_loose_verts_len_get(const MeshRenderData *mrdata)
{
BLI_assert(mrdata->types & MR_DATATYPE_OVERLAY);
- return mrdata->totlvert;
+ return mrdata->loose_vert_len;
}
-static int mesh_render_data_edges_num_get(const MeshRenderData *mrdata)
+static int mesh_render_data_edges_len_get(const MeshRenderData *mrdata)
{
BLI_assert(mrdata->types & MR_DATATYPE_EDGE);
- return mrdata->totedge;
+ return mrdata->edge_len;
}
-static int mesh_render_data_loose_edges_num_get(const MeshRenderData *mrdata)
+static int mesh_render_data_loose_edges_len_get(const MeshRenderData *mrdata)
{
BLI_assert(mrdata->types & MR_DATATYPE_OVERLAY);
- return mrdata->totledge;
+ return mrdata->loose_edge_len;
}
-static int mesh_render_data_looptri_num_get(const MeshRenderData *mrdata)
+static int mesh_render_data_looptri_len_get(const MeshRenderData *mrdata)
{
BLI_assert(mrdata->types & MR_DATATYPE_LOOPTRI);
- return mrdata->tottri;
+ return mrdata->tri_len;
}
-static int UNUSED_FUNCTION(mesh_render_data_loops_num_get)(const MeshRenderData *mrdata)
+static int UNUSED_FUNCTION(mesh_render_data_loops_len_get)(const MeshRenderData *mrdata)
{
BLI_assert(mrdata->types & MR_DATATYPE_LOOP);
- return mrdata->totloop;
+ return mrdata->loop_len;
}
-static int mesh_render_data_polys_num_get(const MeshRenderData *mrdata)
+static int mesh_render_data_polys_len_get(const MeshRenderData *mrdata)
{
BLI_assert(mrdata->types & MR_DATATYPE_POLY);
- return mrdata->totpoly;
+ return mrdata->poly_len;
}
static float *mesh_render_data_vert_co(const MeshRenderData *mrdata, const int vert_idx)
@@ -451,15 +451,15 @@ static bool mesh_render_data_edge_vcos_manifold_pnors(
if (!eap) {
const MLoop *mloop = mrdata->mloop;
const MPoly *mpoly = mrdata->mpoly;
- const int poly_ct = mrdata->totpoly;
+ const int poly_len = mrdata->poly_len;
const bool do_pnors = (pnors == NULL);
- eap = mrdata->edges_adjacent_polys = MEM_callocN(sizeof(*eap) * mrdata->totedge, __func__);
+ eap = mrdata->edges_adjacent_polys = MEM_callocN(sizeof(*eap) * mrdata->edge_len, __func__);
if (do_pnors) {
- pnors = mrdata->poly_normals = MEM_mallocN(sizeof(*pnors) * poly_ct, __func__);
+ pnors = mrdata->poly_normals = MEM_mallocN(sizeof(*pnors) * poly_len, __func__);
}
- for (int i = 0; i < poly_ct; i++, mpoly++) {
+ for (int i = 0; i < poly_len; i++, mpoly++) {
if (do_pnors) {
BKE_mesh_calc_poly_normal(mpoly, mloop + mpoly->loopstart, mvert, pnors[i]);
}
@@ -603,7 +603,7 @@ static bool mesh_render_data_looptri_cos_nors_smooth_get(
BMFace *face;
int i;
- pnors_short = mrdata->poly_normals_short = MEM_mallocN(sizeof(*pnors_short) * mrdata->totpoly, __func__);
+ pnors_short = mrdata->poly_normals_short = MEM_mallocN(sizeof(*pnors_short) * mrdata->poly_len, __func__);
BM_ITER_MESH_INDEX(face, &fiter, bm, BM_FACES_OF_MESH, i) {
normal_float_to_short_v3(pnors_short[i], face->no);
}
@@ -614,7 +614,7 @@ static bool mesh_render_data_looptri_cos_nors_smooth_get(
BMVert *vert;
int i;
- vnors_short = mrdata->vert_normals_short = MEM_mallocN(sizeof(*vnors_short) * mrdata->totvert, __func__);
+ vnors_short = mrdata->vert_normals_short = MEM_mallocN(sizeof(*vnors_short) * mrdata->vert_len, __func__);
BM_ITER_MESH_INDEX(vert, &viter, bm, BM_VERT, i) {
normal_float_to_short_v3(vnors_short[i], vert->no);
}
@@ -638,14 +638,14 @@ static bool mesh_render_data_looptri_cos_nors_smooth_get(
float (*pnors)[3] = mrdata->poly_normals;
if (!pnors) {
- pnors = mrdata->poly_normals = MEM_mallocN(sizeof(*pnors) * mrdata->totpoly, __func__);
+ pnors = mrdata->poly_normals = MEM_mallocN(sizeof(*pnors) * mrdata->poly_len, __func__);
BKE_mesh_calc_normals_poly(
- mrdata->mvert, NULL, mrdata->totvert,
- mrdata->mloop, mrdata->mpoly, mrdata->totloop, mrdata->totpoly, pnors, true);
+ mrdata->mvert, NULL, mrdata->vert_len,
+ mrdata->mloop, mrdata->mpoly, mrdata->loop_len, mrdata->poly_len, pnors, true);
}
- pnors_short = mrdata->poly_normals_short = MEM_mallocN(sizeof(*pnors_short) * mrdata->totpoly, __func__);
- for (int i = 0; i < mrdata->totpoly; i++) {
+ pnors_short = mrdata->poly_normals_short = MEM_mallocN(sizeof(*pnors_short) * mrdata->poly_len, __func__);
+ for (int i = 0; i < mrdata->poly_len; i++) {
normal_float_to_short_v3(pnors_short[i], pnors[i]);
}
}
@@ -861,10 +861,10 @@ typedef struct MeshBatchCache {
/* settings to determine if cache is invalid */
bool is_dirty;
- int tot_edges;
- int tot_tris;
- int tot_polys;
- int tot_verts;
+ int edge_len;
+ int tri_len;
+ int poly_len;
+ int vert_len;
bool is_editmode;
} MeshBatchCache;
@@ -889,10 +889,10 @@ static bool mesh_batch_cache_valid(Mesh *me)
if (cache->is_editmode) {
return false;
}
- else if ((cache->tot_verts != mesh_render_verts_num_get(me)) ||
- (cache->tot_edges != mesh_render_edges_num_get(me)) ||
- (cache->tot_tris != mesh_render_looptri_num_get(me)) ||
- (cache->tot_polys != mesh_render_polys_num_get(me)))
+ else if ((cache->vert_len != mesh_render_verts_len_get(me)) ||
+ (cache->edge_len != mesh_render_edges_len_get(me)) ||
+ (cache->tri_len != mesh_render_looptri_len_get(me)) ||
+ (cache->poly_len != mesh_render_polys_len_get(me)))
{
return false;
}
@@ -915,10 +915,10 @@ static void mesh_batch_cache_init(Mesh *me)
cache->is_editmode = me->edit_btmesh != NULL;
if (cache->is_editmode == false) {
- cache->tot_edges = mesh_render_edges_num_get(me);
- cache->tot_tris = mesh_render_looptri_num_get(me);
- cache->tot_polys = mesh_render_polys_num_get(me);
- cache->tot_verts = mesh_render_verts_num_get(me);
+ cache->edge_len = mesh_render_edges_len_get(me);
+ cache->tri_len = mesh_render_looptri_len_get(me);
+ cache->poly_len = mesh_render_polys_len_get(me);
+ cache->vert_len = mesh_render_verts_len_get(me);
}
cache->is_dirty = false;
@@ -1003,12 +1003,15 @@ static VertexBuffer *mesh_batch_cache_get_pos_and_normals(MeshRenderData *mrdata
nor_id = VertexFormat_add_attrib(&format, "nor", COMP_I16, 3, NORMALIZE_INT_TO_FLOAT);
}
- const int tottri = mesh_render_data_looptri_num_get(mrdata);
+ const int tri_len = mesh_render_data_looptri_len_get(mrdata);
- cache->pos_with_normals = VertexBuffer_create_with_format(&format);
- VertexBuffer_allocate_data(cache->pos_with_normals, tottri * 3);
+ VertexBuffer *vbo = cache->pos_with_normals = VertexBuffer_create_with_format(&format);
- for (int i = 0; i < tottri; i++) {
+ const int vbo_len_capacity = tri_len * 3;
+ int vbo_len_used = 0;
+ VertexBuffer_allocate_data(vbo, vbo_len_capacity);
+
+ for (int i = 0; i < tri_len; i++) {
float *tri_vert_cos[3];
short *tri_nor, *tri_vert_nors[3];
bool is_smooth;
@@ -1017,24 +1020,25 @@ static VertexBuffer *mesh_batch_cache_get_pos_and_normals(MeshRenderData *mrdata
mrdata, i, &tri_vert_cos, &tri_nor, &tri_vert_nors, &is_smooth))
{
if (is_smooth) {
- VertexBuffer_set_attrib(cache->pos_with_normals, nor_id, nidx++, tri_vert_nors[0]);
- VertexBuffer_set_attrib(cache->pos_with_normals, nor_id, nidx++, tri_vert_nors[1]);
- VertexBuffer_set_attrib(cache->pos_with_normals, nor_id, nidx++, tri_vert_nors[2]);
+ VertexBuffer_set_attrib(vbo, nor_id, nidx++, tri_vert_nors[0]);
+ VertexBuffer_set_attrib(vbo, nor_id, nidx++, tri_vert_nors[1]);
+ VertexBuffer_set_attrib(vbo, nor_id, nidx++, tri_vert_nors[2]);
}
else {
- VertexBuffer_set_attrib(cache->pos_with_normals, nor_id, nidx++, tri_nor);
- VertexBuffer_set_attrib(cache->pos_with_normals, nor_id, nidx++, tri_nor);
- VertexBuffer_set_attrib(cache->pos_with_normals, nor_id, nidx++, tri_nor);
+ VertexBuffer_set_attrib(vbo, nor_id, nidx++, tri_nor);
+ VertexBuffer_set_attrib(vbo, nor_id, nidx++, tri_nor);
+ VertexBuffer_set_attrib(vbo, nor_id, nidx++, tri_nor);
}
- VertexBuffer_set_attrib(cache->pos_with_normals, pos_id, vidx++, tri_vert_cos[0]);
- VertexBuffer_set_attrib(cache->pos_with_normals, pos_id, vidx++, tri_vert_cos[1]);
- VertexBuffer_set_attrib(cache->pos_with_normals, pos_id, vidx++, tri_vert_cos[2]);
+ VertexBuffer_set_attrib(vbo, pos_id, vidx++, tri_vert_cos[0]);
+ VertexBuffer_set_attrib(vbo, pos_id, vidx++, tri_vert_cos[1]);
+ VertexBuffer_set_attrib(vbo, pos_id, vidx++, tri_vert_cos[2]);
}
}
+ vbo_len_used = vidx;
- if (vidx != tottri * 3) {
- VertexBuffer_resize_data(cache->pos_with_normals, vidx);
+ if (vbo_len_capacity != vbo_len_used) {
+ VertexBuffer_resize_data(vbo, vbo_len_used);
}
}
return cache->pos_with_normals;
@@ -1052,13 +1056,12 @@ static VertexBuffer *mesh_batch_cache_get_pos_and_nor_in_order(MeshRenderData *m
nor_id = VertexFormat_add_attrib(&format, "nor", COMP_I16, 3, NORMALIZE_INT_TO_FLOAT);
}
- const int vertex_ct = mesh_render_data_verts_num_get(mrdata);
-
- cache->pos_in_order = VertexBuffer_create_with_format(&format);
- VertexBuffer_allocate_data(cache->pos_in_order, vertex_ct);
- for (int i = 0; i < vertex_ct; ++i) {
- VertexBuffer_set_attrib(cache->pos_in_order, pos_id, i, mesh_render_data_vert_co(mrdata, i));
- VertexBuffer_set_attrib(cache->pos_in_order, nor_id, i, mesh_render_data_vert_nor(mrdata, i));
+ VertexBuffer *vbo = cache->pos_in_order = VertexBuffer_create_with_format(&format);
+ const int vbo_len_capacity = mesh_render_data_verts_len_get(mrdata);
+ VertexBuffer_allocate_data(vbo, vbo_len_capacity);
+ for (int i = 0; i < vbo_len_capacity; ++i) {
+ VertexBuffer_set_attrib(vbo, pos_id, i, mesh_render_data_vert_co(mrdata, i));
+ VertexBuffer_set_attrib(vbo, nor_id, i, mesh_render_data_vert_nor(mrdata, i));
}
}
@@ -1071,12 +1074,12 @@ static ElementList *mesh_batch_cache_get_edges_in_order(MeshRenderData *mrdata,
if (cache->edges_in_order == NULL) {
printf("Caching edges in order...\n");
- const int vertex_ct = mesh_render_data_verts_num_get(mrdata);
- const int edge_ct = mesh_render_data_edges_num_get(mrdata);
+ const int vert_len = mesh_render_data_verts_len_get(mrdata);
+ const int edge_len = mesh_render_data_edges_len_get(mrdata);
ElementListBuilder elb;
- ElementListBuilder_init(&elb, PRIM_LINES, edge_ct, vertex_ct);
- for (int i = 0; i < edge_ct; ++i) {
+ ElementListBuilder_init(&elb, PRIM_LINES, edge_len, vert_len);
+ for (int i = 0; i < edge_len; ++i) {
int vert_idx[2];
if (mesh_render_data_edge_verts_indices_get(mrdata, i, vert_idx)) {
add_line_vertices(&elb, vert_idx[0], vert_idx[1]);
@@ -1093,12 +1096,12 @@ static ElementList *mesh_batch_cache_get_triangles_in_order(MeshRenderData *mrda
BLI_assert(mrdata->types & (MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI));
if (cache->triangles_in_order == NULL) {
- const int vertex_ct = mesh_render_data_verts_num_get(mrdata);
- const int tri_ct = mesh_render_data_looptri_num_get(mrdata);
+ const int vert_len = mesh_render_data_verts_len_get(mrdata);
+ const int tri_len = mesh_render_data_looptri_len_get(mrdata);
ElementListBuilder elb;
- ElementListBuilder_init(&elb, PRIM_TRIANGLES, tri_ct, vertex_ct);
- for (int i = 0; i < tri_ct; ++i) {
+ ElementListBuilder_init(&elb, PRIM_TRIANGLES, tri_len, vert_len);
+ for (int i = 0; i < tri_len; ++i) {
int tri_vert_idx[3];
if (mesh_render_data_looptri_vert_indices_get(mrdata, i, tri_vert_idx)) {
add_triangle_vertices(&elb, tri_vert_idx[0], tri_vert_idx[1], tri_vert_idx[2]);
@@ -1214,12 +1217,12 @@ Batch *BKE_mesh_batch_cache_get_fancy_edges(Mesh *me)
MeshRenderData *mrdata = mesh_render_data_create(me, MR_DATATYPE_VERT | MR_DATATYPE_EDGE | MR_DATATYPE_LOOP | MR_DATATYPE_POLY);
- const int edge_ct = mesh_render_data_edges_num_get(mrdata);
+ const int edge_len = mesh_render_data_edges_len_get(mrdata);
- const int vertex_ct = edge_ct * 2; /* these are PRIM_LINE verts, not mesh verts */
- int gpu_edge_idx = 0;
- VertexBuffer_allocate_data(vbo, vertex_ct);
- for (int i = 0; i < edge_ct; ++i) {
+ const int vbo_len_capacity = edge_len * 2; /* these are PRIM_LINE verts, not mesh verts */
+ int vbo_len_used = 0;
+ VertexBuffer_allocate_data(vbo, vbo_len_capacity);
+ for (int i = 0; i < edge_len; ++i) {
float *vcos1, *vcos2;
float *pnor1 = NULL, *pnor2 = NULL;
bool is_manifold;
@@ -1253,11 +1256,11 @@ Batch *BKE_mesh_batch_cache_get_fancy_edges(Mesh *me)
VertexBuffer_set_attrib(vbo, n1_id, 2 * i + 1, n1);
VertexBuffer_set_attrib(vbo, n2_id, 2 * i + 1, n2);
- gpu_edge_idx += 2;
+ vbo_len_used += 2;
}
}
- if (gpu_edge_idx != vertex_ct) {
- VertexBuffer_resize_data(vbo, gpu_edge_idx);
+ if (vbo_len_used != vbo_len_capacity) {
+ VertexBuffer_resize_data(vbo, vbo_len_used);
}
cache->fancy_edges = Batch_create(PRIM_LINES, vbo, NULL);
@@ -1284,60 +1287,62 @@ static void mesh_batch_cache_create_overlay_batches(Mesh *me)
data_id = VertexFormat_add_attrib(&format, "data", COMP_U8, 4, KEEP_INT);
}
- const int tri_ct = mesh_render_data_looptri_num_get(mrdata);
- const int ledge_ct = mesh_render_data_loose_edges_num_get(mrdata);
- const int lvert_ct = mesh_render_data_loose_verts_num_get(mrdata);
+ const int tri_len = mesh_render_data_looptri_len_get(mrdata);
+ const int ledge_len = mesh_render_data_loose_edges_len_get(mrdata);
+ const int lvert_len = mesh_render_data_loose_verts_len_get(mrdata);
if (cache->overlay_triangles == NULL) {
VertexBuffer *vbo = VertexBuffer_create_with_format(&format);
- VertexBuffer_allocate_data(vbo, tri_ct * 3);
+ const int vbo_len_capacity = tri_len * 3;
+ int vbo_len_used = 0;
+ VertexBuffer_allocate_data(vbo, vbo_len_capacity);
- int gpu_vert_idx = 0;
- for (int i = 0; i < tri_ct; ++i) {
+ for (int i = 0; i < tri_len; ++i) {
int tri_vert_idx[3], tri_edge_idx[3];
if (mesh_render_data_looptri_vert_edge_indices_get(mrdata, i, tri_vert_idx, tri_edge_idx)) {
add_overlay_tri(
mrdata, vbo, pos_id, data_id,
- tri_vert_idx, tri_edge_idx, i, gpu_vert_idx);
- gpu_vert_idx += 3;
+ tri_vert_idx, tri_edge_idx, i, vbo_len_used);
+ vbo_len_used += 3;
}
}
- if (gpu_vert_idx != tri_ct * 3) {
- VertexBuffer_resize_data(vbo, gpu_vert_idx);
+ if (vbo_len_used != vbo_len_capacity) {
+ VertexBuffer_resize_data(vbo, vbo_len_used);
}
cache->overlay_triangles = Batch_create(PRIM_TRIANGLES, vbo, NULL);
}
if (cache->overlay_loose_edges == NULL) {
VertexBuffer *vbo = VertexBuffer_create_with_format(&format);
- VertexBuffer_allocate_data(vbo, ledge_ct * 2);
+ const int vbo_len_capacity = ledge_len * 2;
+ int vbo_len_used = 0;
+ VertexBuffer_allocate_data(vbo, vbo_len_capacity);
- int gpu_vert_idx = 0;
- for (int i = 0; i < ledge_ct; ++i) {
+ for (int i = 0; i < ledge_len; ++i) {
int vert_idx[2];
- if (mesh_render_data_edge_verts_indices_get(mrdata, mrdata->loose_edges[i], vert_idx)) {
- add_overlay_loose_edge(
- mrdata, vbo, pos_id, data_id,
- vert_idx[0], vert_idx[1], mrdata->loose_edges[i], gpu_vert_idx);
- gpu_vert_idx += 2;
- }
- }
- if (gpu_vert_idx != ledge_ct * 2) {
- VertexBuffer_resize_data(vbo, gpu_vert_idx);
+ bool ok = mesh_render_data_edge_verts_indices_get(mrdata, mrdata->loose_edges[i], vert_idx);
+ assert(ok); /* we don't add */
+ add_overlay_loose_edge(
+ mrdata, vbo, pos_id, data_id,
+ vert_idx[0], vert_idx[1], mrdata->loose_edges[i], vbo_len_used);
+ vbo_len_used += 2;
}
+ BLI_assert(vbo_len_used == vbo_len_capacity);
cache->overlay_loose_edges = Batch_create(PRIM_LINES, vbo, NULL);
}
if (cache->overlay_loose_verts == NULL) {
VertexBuffer *vbo = VertexBuffer_create_with_format(&format);
- VertexBuffer_allocate_data(vbo, lvert_ct);
+ const int vbo_len_capacity = lvert_len;
+ int vbo_len_used = 0;
+ VertexBuffer_allocate_data(vbo, vbo_len_capacity);
- int gpu_vert_idx = 0;
- for (int i = 0; i < lvert_ct; ++i) {
+ for (int i = 0; i < lvert_len; ++i) {
add_overlay_loose_vert(mrdata, vbo, pos_id, data_id,
- mrdata->loose_verts[i], gpu_vert_idx);
- gpu_vert_idx += 1;
+ mrdata->loose_verts[i], vbo_len_used);
+ vbo_len_used += 1;
}
+ BLI_assert(vbo_len_used == vbo_len_capacity);
cache->overlay_loose_verts = Batch_create(PRIM_POINTS, vbo, NULL);
}
@@ -1396,12 +1401,13 @@ Batch *BKE_mesh_batch_cache_get_overlay_facedots(Mesh *me)
#endif
}
- const int poly_ct = mesh_render_data_polys_num_get(mrdata);
+ const int vbo_len_capacity = mesh_render_data_polys_len_get(mrdata);
+ int vbo_len_used = 0;
VertexBuffer *vbo = VertexBuffer_create_with_format(&format);
- VertexBuffer_allocate_data(vbo, poly_ct);
+ VertexBuffer_allocate_data(vbo, vbo_len_capacity);
- for (int i = 0; i < poly_ct; ++i) {
+ for (int i = 0; i < vbo_len_capacity; ++i) {
float pcenter[3], pnor[3];
bool selected = false;
@@ -1418,8 +1424,13 @@ Batch *BKE_mesh_batch_cache_get_overlay_facedots(Mesh *me)
#endif
VertexBuffer_set_attrib(vbo, pos_id, i, pcenter);
+
+ vbo_len_used += 1;
}
}
+ if (vbo_len_used != vbo_len_capacity) {
+ VertexBuffer_resize_data(vbo, vbo_len_used);
+ }
cache->overlay_facedots = Batch_create(PRIM_POINTS, vbo, NULL);