[Bf-blender-cvs] [09277486245] blender2.8: Vertex color access for edit-mode
Campbell Barton
noreply at git.blender.org
Mon May 8 05:00:54 CEST 2017
Commit: 0927748624519608b9caf4b898eaf192c83d3d7b
Author: Campbell Barton
Date: Mon May 8 12:41:05 2017 +1000
Branches: blender2.8
https://developer.blender.org/rB0927748624519608b9caf4b898eaf192c83d3d7b
Vertex color access for edit-mode
Currently not used, adding since legacy drawing can display this.
===================================================================
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 2024541ccac..54ab262b2c6 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -703,8 +703,30 @@ static void mesh_render_data_ensure_vert_color(MeshRenderData *rdata)
char (*vcol)[3] = rdata->vert_color;
if (vcol == NULL) {
if (rdata->edit_bmesh) {
- /* TODO */
- BLI_assert(0);
+ BMesh *bm = rdata->edit_bmesh->bm;
+ const int cd_loop_color_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPCOL);
+ if (cd_loop_color_offset == -1) {
+ goto fallback;
+ }
+
+ vcol = rdata->vert_color = MEM_mallocN(sizeof(*vcol) * rdata->loop_len, __func__);
+
+ BMIter fiter;
+ BMFace *face;
+ int i = 0;
+
+ BM_ITER_MESH(face, &fiter, bm, BM_FACES_OF_MESH) {
+ BMLoop *l_iter, *l_first;
+ l_iter = l_first = BM_FACE_FIRST_LOOP(face);
+ do {
+ const MLoopCol *lcol = BM_ELEM_CD_GET_VOID_P(l_iter, cd_loop_color_offset);
+ vcol[i][0] = lcol->r;
+ vcol[i][1] = lcol->g;
+ vcol[i][2] = lcol->b;
+ i += 1;
+ } while ((l_iter = l_iter->next) != l_first);
+ }
+ BLI_assert(i == rdata->loop_len);
}
else {
if (rdata->loopcol == NULL) {
@@ -1244,8 +1266,27 @@ static bool mesh_render_data_looptri_cos_vert_colors_get(
(MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI | MR_DATATYPE_LOOP | MR_DATATYPE_POLY | MR_DATATYPE_LOOPCOL));
if (rdata->edit_bmesh) {
- /* TODO */
- return false;
+ const BMLoop **bm_looptri = (const BMLoop **)rdata->edit_bmesh->looptris[tri_idx];
+
+ mesh_render_data_ensure_poly_normals_short(rdata);
+ mesh_render_data_ensure_vert_color(rdata);
+
+ short (*pnors_short)[3] = rdata->poly_normals_short;
+ short (*vnors_short)[3] = rdata->vert_normals_short;
+ char (*vcol)[3] = rdata->vert_color;
+
+ (*r_vert_cos)[0] = bm_looptri[0]->v->co;
+ (*r_vert_cos)[1] = bm_looptri[1]->v->co;
+ (*r_vert_cos)[2] = bm_looptri[2]->v->co;
+ (*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)];
+ *r_tri_nor = pnors_short[BM_elem_index_get(bm_looptri[0]->f)];
+ (*r_vert_nors)[0] = vnors_short[BM_elem_index_get(bm_looptri[0]->v)];
+ (*r_vert_nors)[1] = vnors_short[BM_elem_index_get(bm_looptri[1]->v)];
+ (*r_vert_nors)[2] = vnors_short[BM_elem_index_get(bm_looptri[2]->v)];
+
+ *r_is_smooth = BM_elem_flag_test_bool(bm_looptri[0]->f, BM_ELEM_SMOOTH);
}
else {
const MLoopTri *mlt = &rdata->mlooptri[tri_idx];
More information about the Bf-blender-cvs
mailing list