[Bf-blender-cvs] [89483c73fd1] blender2.8: DWM: write mesh data to the VBO directly
Campbell Barton
noreply at git.blender.org
Wed May 17 03:32:59 CEST 2017
Commit: 89483c73fd11120a37128b4fc4c27e4b660711d8
Author: Campbell Barton
Date: Wed May 17 11:28:44 2017 +1000
Branches: blender2.8
https://developer.blender.org/rB89483c73fd11120a37128b4fc4c27e4b660711d8
DWM: write mesh data to the VBO directly
Was using intermediate functions to store each data type.
This is still done in some places (for more involved access).
For basic data: coords, normals, colors..etc this is unnecessarily indirect.
===================================================================
M source/blender/draw/intern/draw_cache_impl_mesh.c
===================================================================
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index 8c577676721..e52f531a88e 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -893,6 +893,31 @@ fallback:
}
}
+/** Ensure #MeshRenderData.edge_selection */
+static void mesh_render_data_ensure_edge_selection(MeshRenderData *rdata, bool use_wire)
+{
+ bool *edge_selection = rdata->edge_selection;
+ if (edge_selection == NULL) {
+ edge_selection = rdata->edge_selection = MEM_callocN(sizeof(*edge_selection) * rdata->edge_len, __func__);
+
+ for (int i = 0; i < rdata->poly_len; i++) {
+ MPoly *poly = &rdata->mpoly[i];
+
+ if (poly->flag & ME_FACE_SEL) {
+ for (int j = 0; j < poly->totloop; j++) {
+ MLoop *loop = &rdata->mloop[poly->loopstart + j];
+ if (use_wire) {
+ edge_selection[loop->e] = true;
+ }
+ else {
+ edge_selection[loop->e] = !edge_selection[loop->e];
+ }
+ }
+ }
+ }
+ }
+}
+
/** \} */
/* ---------------------------------------------------------------------- */
@@ -1001,32 +1026,6 @@ static bool mesh_render_data_edge_vcos_manifold_pnors(
return true;
}
-static bool mesh_render_data_looptri_vert_indices_get(
- const MeshRenderData *rdata, const int tri_idx,
- int r_vert_idx[3])
-{
- BLI_assert(rdata->types & (MR_DATATYPE_LOOPTRI | MR_DATATYPE_LOOP));
-
- if (rdata->edit_bmesh) {
- const BMLoop **bm_looptri = (const BMLoop **)rdata->edit_bmesh->looptris[tri_idx];
- if (BM_elem_flag_test(bm_looptri[0]->f, BM_ELEM_HIDDEN)) {
- return false;
- }
- r_vert_idx[0] = BM_elem_index_get(bm_looptri[0]->v);
- r_vert_idx[1] = BM_elem_index_get(bm_looptri[1]->v);
- r_vert_idx[2] = BM_elem_index_get(bm_looptri[2]->v);
- }
- else {
- const unsigned int *l_idx = rdata->mlooptri[tri_idx].tri;
- const MLoop *l_tri[3] = {&rdata->mloop[l_idx[0]], &rdata->mloop[l_idx[1]], &rdata->mloop[l_idx[2]]};
- r_vert_idx[0] = l_tri[0]->v;
- r_vert_idx[1] = l_tri[1]->v;
- r_vert_idx[2] = l_tri[2]->v;
- }
-
- return true;
-}
-
static bool mesh_render_data_looptri_mat_index_get(
const MeshRenderData *rdata, const int tri_idx,
short *r_face_mat)
@@ -1219,209 +1218,6 @@ static bool mesh_render_data_looptri_cos_nors_smooth_get(
return true;
}
-static bool mesh_render_data_looptri_weights_get(
- MeshRenderData *rdata, const int tri_idx, int defgroup,
- float *(*r_vert_weights)[3])
-{
- BLI_assert(
- rdata->types &
- (MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI | MR_DATATYPE_LOOP | MR_DATATYPE_POLY | MR_DATATYPE_DVERT));
-
- if (rdata->edit_bmesh) {
- const BMLoop **bm_looptri = (const BMLoop **)rdata->edit_bmesh->looptris[tri_idx];
-
- if (BM_elem_flag_test(bm_looptri[0]->f, BM_ELEM_HIDDEN)) {
- return false;
- }
- mesh_render_data_ensure_vert_weight_color(rdata, defgroup);
-
- float (*vweight)[3] = rdata->vert_weight_color;
-
- (*r_vert_weights)[0] = vweight[BM_elem_index_get(bm_looptri[0]->v)];
- (*r_vert_weights)[1] = vweight[BM_elem_index_get(bm_looptri[1]->v)];
- (*r_vert_weights)[2] = vweight[BM_elem_index_get(bm_looptri[2]->v)];
- }
- else {
- const MLoopTri *mlt = &rdata->mlooptri[tri_idx];
-
- mesh_render_data_ensure_vert_weight_color(rdata, defgroup);
-
- float (*vweight)[3] = rdata->vert_weight_color;
- (*r_vert_weights)[0] = vweight[rdata->mloop[mlt->tri[0]].v];
- (*r_vert_weights)[1] = vweight[rdata->mloop[mlt->tri[1]].v];
- (*r_vert_weights)[2] = vweight[rdata->mloop[mlt->tri[2]].v];
- }
-
- return true;
-}
-
-static bool mesh_render_data_looptri_vert_colors_get(
- MeshRenderData *rdata, const int tri_idx,
- char *(*r_vert_colors)[3])
-{
- BLI_assert(
- rdata->types &
- (MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI | MR_DATATYPE_LOOP | MR_DATATYPE_POLY | MR_DATATYPE_LOOPCOL));
-
- if (rdata->edit_bmesh) {
- const BMLoop **bm_looptri = (const BMLoop **)rdata->edit_bmesh->looptris[tri_idx];
-
- mesh_render_data_ensure_vert_color(rdata);
-
- char (*vcol)[3] = rdata->vert_color;
-
- (*r_vert_colors)[0] = vcol[BM_elem_index_get(bm_looptri[0]->v)];
- (*r_vert_colors)[1] = vcol[BM_elem_index_get(bm_looptri[1]->v)];
- (*r_vert_colors)[2] = vcol[BM_elem_index_get(bm_looptri[2]->v)];
- }
- else {
- const MLoopTri *mlt = &rdata->mlooptri[tri_idx];
-
- mesh_render_data_ensure_poly_normals_short(rdata);
- mesh_render_data_ensure_vert_color(rdata);
-
- char (*vcol)[3] = rdata->vert_color;
-
- (*r_vert_colors)[0] = vcol[mlt->tri[0]];
- (*r_vert_colors)[1] = vcol[mlt->tri[1]];
- (*r_vert_colors)[2] = vcol[mlt->tri[2]];
- }
-
- return true;
-}
-
-static bool mesh_render_data_looptri_select_id_get(
- MeshRenderData *rdata, const int tri_idx, const bool use_hide,
- int *r_select_id)
-{
- BLI_assert(
- rdata->types &
- (MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI | MR_DATATYPE_LOOP | MR_DATATYPE_POLY | MR_DATATYPE_DVERT));
-
- if (rdata->edit_bmesh) {
- const BMLoop **bm_looptri = (const BMLoop **)rdata->edit_bmesh->looptris[tri_idx];
- const int poly_index = BM_elem_index_get(bm_looptri[0]->f);
-
- if (use_hide && BM_elem_flag_test(bm_looptri[0]->f, BM_ELEM_HIDDEN)) {
- return false;
- }
-
- GPU_select_index_get(poly_index + 1, r_select_id);
- }
- else {
- const MLoopTri *mlt = &rdata->mlooptri[tri_idx];
- const int poly_index = mlt->poly;
-
- if (use_hide && (rdata->mpoly[poly_index].flag & ME_HIDE)) {
- return false;
- }
- GPU_select_index_get(poly_index + 1, r_select_id);
- }
-
- return true;
-}
-
-static bool mesh_render_data_edge_cos_sel_get(
- MeshRenderData *rdata, const int edge_idx,
- float r_vert_cos[2][3], int *r_vert_sel,
- bool use_wire, bool use_sel)
-{
- BLI_assert(rdata->types & (MR_DATATYPE_VERT | MR_DATATYPE_EDGE | MR_DATATYPE_POLY | MR_DATATYPE_LOOP));
-
- if (rdata->edit_bmesh) {
- return false;
- }
- else {
- const MEdge *ed = &rdata->medge[edge_idx];
-
- if (!rdata->edge_selection && use_sel) {
- rdata->edge_selection = MEM_callocN(sizeof(*rdata->edge_selection) * rdata->edge_len, __func__);
-
- for (int i = 0; i < rdata->poly_len; i++) {
- MPoly *poly = &rdata->mpoly[i];
-
- if (poly->flag & ME_FACE_SEL) {
- for (int j = 0; j < poly->totloop; j++) {
- MLoop *loop = &rdata->mloop[poly->loopstart + j];
- if (use_wire) {
- rdata->edge_selection[loop->e] = true;
- }
- else {
- rdata->edge_selection[loop->e] = !rdata->edge_selection[loop->e];
- }
- }
- }
- }
- }
-
- if (use_sel && rdata->edge_selection[edge_idx]) {
- *r_vert_sel = true;
- }
- else {
- if (use_wire) {
- *r_vert_sel = false;
- }
- else {
- return false;
- }
- }
-
- copy_v3_v3(r_vert_cos[0], rdata->mvert[ed->v1].co);
- copy_v3_v3(r_vert_cos[1], rdata->mvert[ed->v2].co);
- }
-
- return true;
-}
-
-static bool mesh_render_data_tri_cos_sel_get(
- MeshRenderData *rdata, const int tri_idx,
- float r_vert_cos[3][3])
-{
- BLI_assert(rdata->types & (MR_DATATYPE_VERT | MR_DATATYPE_POLY | MR_DATATYPE_LOOP | MR_DATATYPE_LOOPTRI));
-
- if (rdata->edit_bmesh) {
- return false;
- }
- else {
- const MLoopTri *mlt = &rdata->mlooptri[tri_idx];
-
- if (rdata->mpoly[mlt->poly].flag & ME_FACE_SEL) {
- return false;
- }
-
- copy_v3_v3(r_vert_cos[0], rdata->mvert[rdata->mloop[mlt->tri[0]].v].co);
- copy_v3_v3(r_vert_cos[1], rdata->mvert[rdata->mloop[mlt->tri[1]].v].co);
- copy_v3_v3(r_vert_cos[2], rdata->mvert[rdata->mloop[mlt->tri[2]].v].co);
- }
-
- return true;
-}
-
-static bool mesh_render_data_vert_cos_sel_get(
- MeshRenderData *rdata, const int vert_idx,
- float r_vert_co[3], int *r_vert_sel)
-{
- BLI_assert(rdata->types & (MR_DATATYPE_VERT));
-
- if (rdata->edit_bmesh) {
- return false;
- }
- else {
- const MVert *mv = &rdata->mvert[vert_idx];
-
- if (mv->flag & SELECT) {
- *r_vert_sel = true;
- }
- else {
- *r_vert_sel = false;
- }
-
- copy_v3_v3(r_vert_co, mv->co);
- }
-
- return true;
-}
-
/* First 2 bytes are bit flags
* 3rd is for sharp edges
* 4rd is for creased edges */
@@ -2154,15 +1950,27 @@ static VertexBuffer *mesh_batch_cache_get_tri_weights(
int vbo_len_used = 0;
VertexBuffer_allocate_data(vbo, vbo_len_capacity);
- for (int i = 0; i < tri_len; i++) {
- float *tri_vert_weights[3];
+ mesh_render_data_ensure_vert_weight_color(rdata, defgroup);
+ const float (*vert_weight_color)[3] = rdata->vert_weight_color;
- if (mesh_render_data_looptri_weights_get(
- rdata, i, defgroup, &tri_vert_weights))
- {
- VertexBuffer_set_attrib(vbo, col_id, cidx++, tri_vert_weights[0]);
- VertexBuffer_set_attrib(vbo, col_id, cidx++, tri_vert_weights[1]);
- VertexBuffer_set_attrib(vbo, col_id, cidx++, tri_vert_weights[2]);
+ if (rdata->edit_bmesh) {
+ for (int i = 0; i < tri_len; i++) {
+ const BMLoop **ltri = (const BMLoop **)rdata->edit_bmesh->looptris[i];
+ if (!BM_elem_flag_test(ltri[0]->f, BM_ELEM_HIDDEN)) {
+ for (uint tri_corner = 0; tri_corner < 3; tri_corner++) {
+ const int v_index = BM_elem_index_get(ltri[tri_corner]->v);
+ VertexBuffer_set_attrib(vbo, col_id, cidx++, vert_weight_color[v_index]);
+ }
+ }
+ }
+ }
+ else {
+ for (int i = 0; i < tri_len; i++) {
+ const MLoopTri *mlt = &rdata->mlooptri[i];
+ for (uint tri_corner = 0; tri_corner < 3; tri_corner++) {
+ const uint v_index = rdata->mloop[mlt->tri[tri_corner]].v;
+ VertexBuffer_set_attrib(vbo, col_id, cidx++, vert_weight_color[v_index]);
+ }
}
}
vbo_len_used = cidx;
@@ -2199,15 +2007,27 @@ static VertexBuffer *mesh_batch_cache_get_tri_vert_colors(
const uint vbo_len_capacity = tri_len * 3;
VertexBuffer_allocate_data(vbo, vbo_len_capacity);
- for (int i = 0; i < tri_len; i++) {
- char *tri_vert_colors[3];
+ mesh_render_data_ensure_vert_color(rdata);
+ const char (*vert_color)[3] = rdata->vert_color;
- if (mesh_render_data_looptri_vert_colors_get(
- rdata, i, &tri_vert_colors))
- {
- VertexBuffer_set_attrib(vbo, col_id, cidx++, tri_vert_colors[0]);
- VertexBuffer_set_attrib(vbo, col_id, cidx++, tri_vert_colors[1]);
- VertexBuffer_set_attrib(vbo, col_id, cidx+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list