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:
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/intern/mesh_render.c29
-rw-r--r--source/blender/draw/modes/shaders/edit_overlay_facedot_vert.glsl4
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);
}