diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-03-02 17:03:40 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-03-02 17:03:40 +0300 |
commit | 561d11c5e601cce73dc6ab108596147bdfd4507c (patch) | |
tree | 130cfcf7deac37d73070544c379cc5fb776b8125 | |
parent | 0b6fa1a0fbca496fe4163ee679a1faeb47a51441 (diff) |
Edit Mesh overlay: pack normals with face centers.
Needed for face normals.
-rw-r--r-- | source/blender/blenkernel/intern/mesh_render.c | 29 | ||||
-rw-r--r-- | source/blender/draw/modes/shaders/edit_overlay_facedot_vert.glsl | 4 |
2 files changed, 25 insertions, 8 deletions
diff --git a/source/blender/blenkernel/intern/mesh_render.c b/source/blender/blenkernel/intern/mesh_render.c index 5b8f70ce218..ad0353b9bac 100644 --- a/source/blender/blenkernel/intern/mesh_render.c +++ b/source/blender/blenkernel/intern/mesh_render.c @@ -334,13 +334,14 @@ static void mesh_render_data_edge_verts_indices_get(const MeshRenderData *mrdata } } -static void mesh_render_data_poly_center_select_get(MeshRenderData *mrdata, const int poly, float center[3], bool *selected) +static void mesh_render_data_pnors_pcenter_select_get(MeshRenderData *mrdata, const int poly, float pnors[3], float center[3], bool *selected) { BLI_assert(mrdata->types & (MR_DATATYPE_VERT | MR_DATATYPE_LOOP | MR_DATATYPE_POLY)); if (mrdata->edit_bmesh) { const BMFace *bf = BM_face_at_index(mrdata->edit_bmesh->bm, poly); BM_face_calc_center_mean(bf, center); + BM_face_calc_normal(bf, pnors); *selected = (BM_elem_flag_test(bf, BM_ELEM_SELECT) != 0) ? true : false; } else { @@ -349,6 +350,7 @@ static void mesh_render_data_poly_center_select_get(MeshRenderData *mrdata, cons const MLoop *mloop = mrdata->mloop + mpoly->loopstart; BKE_mesh_calc_poly_center(mpoly, mloop, mvert, center); + BKE_mesh_calc_poly_normal(mpoly, mloop, mvert, pnors); *selected = false; /* No selection if not in edit mode */ } @@ -1197,7 +1199,11 @@ Batch *BKE_mesh_batch_cache_get_overlay_facedots(Mesh *me) if (format.attrib_ct == 0) { /* initialize vertex format */ pos_id = add_attrib(&format, "pos", GL_FLOAT, 3, KEEP_FLOAT); - data_id = add_attrib(&format, "data", GL_INT, 1, KEEP_INT); +#if USE_10_10_10 + data_id = add_attrib(&format, "norAndFlag", COMP_I10, 4, NORMALIZE_INT_TO_FLOAT); +#else + data_id = add_attrib(&format, "norAndFlag", GL_FLOAT, 4, KEEP_FLOAT); +#endif } const int poly_ct = mesh_render_data_polys_num_get(mrdata); @@ -1206,11 +1212,22 @@ Batch *BKE_mesh_batch_cache_get_overlay_facedots(Mesh *me) VertexBuffer_allocate_data(vbo, poly_ct); for (int i = 0; i < poly_ct; ++i) { - float poly_center[3]; + float pcenter[3], pnor[3]; int selected = 0; - mesh_render_data_poly_center_select_get(mrdata, i, poly_center, (bool *)&selected); - setAttrib(vbo, pos_id, i, poly_center); - setAttrib(vbo, data_id, i, &selected); + + mesh_render_data_pnors_pcenter_select_get(mrdata, i, pnor, pcenter, (bool *)&selected); + +#if USE_10_10_10 + PackedNormal nor = { .x = 0, .y = 0, .z = -511 }; + nor = convert_i10_v3(pnor); + nor.w = selected; + setAttrib(vbo, data_id, i, &nor); +#else + float nor[4] = {pnor[0], pnor[1], pnor[2], (float)selected}; + setAttrib(vbo, data_id, i, nor); +#endif + + setAttrib(vbo, pos_id, i, pcenter); } cache->overlay_facedots = Batch_create(GL_POINTS, vbo, NULL); diff --git a/source/blender/draw/modes/shaders/edit_overlay_facedot_vert.glsl b/source/blender/draw/modes/shaders/edit_overlay_facedot_vert.glsl index ab7f760d8a1..b075d39c29e 100644 --- a/source/blender/draw/modes/shaders/edit_overlay_facedot_vert.glsl +++ b/source/blender/draw/modes/shaders/edit_overlay_facedot_vert.glsl @@ -45,7 +45,7 @@ layout(std140) uniform globalsBlock { uniform mat4 ModelViewProjectionMatrix; in vec3 pos; -in int data; +in vec4 norAndFlag; flat out int isSelected; @@ -53,5 +53,5 @@ void main() { gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0); gl_PointSize = sizeFaceDot; - isSelected = data; + isSelected = int(norAndFlag.w); } |