[Bf-blender-cvs] [49ef1a25b8d] blender2.8: Edit Mesh overlay: Ported Display Normals option
Clément Foucault
noreply at git.blender.org
Thu Mar 9 01:38:55 CET 2017
Commit: 49ef1a25b8d361a75211c29baa131d6958072685
Author: Clément Foucault
Date: Thu Mar 9 01:29:58 2017 +0100
Branches: blender2.8
https://developer.blender.org/rB49ef1a25b8d361a75211c29baa131d6958072685
Edit Mesh overlay: Ported Display Normals option
===================================================================
M release/scripts/startup/bl_ui/properties_collection.py
M source/blender/blenkernel/BKE_mesh_render.h
M source/blender/blenkernel/intern/mesh_render.c
M source/blender/draw/CMakeLists.txt
M source/blender/draw/intern/draw_cache.c
M source/blender/draw/intern/draw_cache.h
M source/blender/draw/intern/draw_manager.c
M source/blender/draw/modes/edit_mesh_mode.c
A source/blender/draw/modes/shaders/edit_normals_face_vert.glsl
A source/blender/draw/modes/shaders/edit_normals_geom.glsl
A source/blender/draw/modes/shaders/edit_normals_vert.glsl
M source/blender/makesrna/intern/rna_scene.c
===================================================================
diff --git a/release/scripts/startup/bl_ui/properties_collection.py b/release/scripts/startup/bl_ui/properties_collection.py
index 6debbaf3aac..7cbdeb6e61d 100644
--- a/release/scripts/startup/bl_ui/properties_collection.py
+++ b/release/scripts/startup/bl_ui/properties_collection.py
@@ -128,6 +128,10 @@ class COLLECTION_PT_edit_mode_settings(CollectionButtonsPanel, Panel):
col = layout.column()
template_engine_settings(col, settings, "show_occlude_wire")
template_engine_settings(col, settings, "backwire_opacity")
+ template_engine_settings(col, settings, "face_normals_show")
+ template_engine_settings(col, settings, "vert_normals_show")
+ template_engine_settings(col, settings, "loop_normals_show")
+ template_engine_settings(col, settings, "normals_length")
if __name__ == "__main__": # only for live edit.
diff --git a/source/blender/blenkernel/BKE_mesh_render.h b/source/blender/blenkernel/BKE_mesh_render.h
index 0b51dc3d9d7..0869c96abf0 100644
--- a/source/blender/blenkernel/BKE_mesh_render.h
+++ b/source/blender/blenkernel/BKE_mesh_render.h
@@ -39,6 +39,7 @@ void BKE_mesh_batch_cache_free(struct Mesh *me);
struct Batch *BKE_mesh_batch_cache_get_all_edges(struct Mesh *me);
struct Batch *BKE_mesh_batch_cache_get_all_triangles(struct Mesh *me);
struct Batch *BKE_mesh_batch_cache_get_triangles_with_normals(struct Mesh *me);
+struct Batch *BKE_mesh_batch_cache_get_points_with_normals(struct Mesh *me);
struct Batch *BKE_mesh_batch_cache_get_all_verts(struct Mesh *me);
struct Batch *BKE_mesh_batch_cache_get_fancy_edges(struct Mesh *me);
struct Batch *BKE_mesh_batch_cache_get_overlay_triangles(struct Mesh *me);
diff --git a/source/blender/blenkernel/intern/mesh_render.c b/source/blender/blenkernel/intern/mesh_render.c
index 67991d08f9d..dbe99acc10b 100644
--- a/source/blender/blenkernel/intern/mesh_render.c
+++ b/source/blender/blenkernel/intern/mesh_render.c
@@ -318,6 +318,22 @@ static float *mesh_render_data_vert_co(const MeshRenderData *mrdata, const int v
}
}
+static short *mesh_render_data_vert_nor(const MeshRenderData *mrdata, const int vert_idx)
+{
+ BLI_assert(mrdata->types & MR_DATATYPE_VERT);
+
+ if (mrdata->edit_bmesh) {
+ static short fno[3];
+ BMesh *bm = mrdata->edit_bmesh->bm;
+ BMVert *bv = BM_vert_at_index(bm, vert_idx);
+ normal_float_to_short_v3(fno, bv->no);
+ return fno;
+ }
+ else {
+ return mrdata->mvert[vert_idx].no;
+ }
+}
+
static void mesh_render_data_edge_verts_indices_get(const MeshRenderData *mrdata, const int edge_idx, int r_vert_idx[2])
{
BLI_assert(mrdata->types & MR_DATATYPE_EDGE);
@@ -710,6 +726,7 @@ static void add_overlay_loose_vert(
typedef struct MeshBatchCache {
VertexBuffer *pos_in_order;
+ VertexBuffer *nor_in_order;
ElementList *edges_in_order;
ElementList *triangles_in_order;
@@ -717,7 +734,9 @@ typedef struct MeshBatchCache {
Batch *all_edges;
Batch *all_triangles;
- Batch *triangles_with_normals; /* owns its vertex buffer */
+ VertexBuffer *pos_with_normals;
+ Batch *triangles_with_normals;
+ Batch *points_with_normals;
Batch *fancy_edges; /* owns its vertex buffer (not shared) */
/* TODO : split in 2 buffers to avoid unnecessary
@@ -855,9 +874,10 @@ void BKE_mesh_batch_cache_clear(Mesh *me)
if (cache->overlay_loose_edges) Batch_discard_all(cache->overlay_loose_edges);
if (cache->overlay_facedots) Batch_discard_all(cache->overlay_facedots);
- if (cache->triangles_with_normals) {
- Batch_discard_all(cache->triangles_with_normals);
- }
+ if (cache->triangles_with_normals) Batch_discard(cache->triangles_with_normals);
+ if (cache->points_with_normals) Batch_discard(cache->points_with_normals);
+ if (cache->pos_with_normals) VertexBuffer_discard(cache->pos_with_normals);
+
if (cache->fancy_edges) {
Batch_discard_all(cache->fancy_edges);
@@ -872,16 +892,61 @@ void BKE_mesh_batch_cache_free(Mesh *me)
/* Batch cache usage. */
-static VertexBuffer *mesh_batch_cache_get_pos_in_order(MeshRenderData *mrdata, MeshBatchCache *cache)
+static VertexBuffer *mesh_batch_cache_get_pos_and_normals(MeshRenderData *mrdata, MeshBatchCache *cache)
+{
+ BLI_assert(mrdata->types & (MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI | MR_DATATYPE_LOOP | MR_DATATYPE_POLY));
+
+ if (cache->pos_with_normals == NULL) {
+ unsigned int vidx = 0, nidx = 0;
+
+ static VertexFormat format = { 0 };
+ static unsigned int pos_id, nor_id;
+ if (format.attrib_ct == 0) {
+ /* initialize vertex format */
+ pos_id = add_attrib(&format, "pos", GL_FLOAT, 3, KEEP_FLOAT);
+ nor_id = add_attrib(&format, "nor", GL_SHORT, 3, NORMALIZE_INT_TO_FLOAT);
+ }
+
+ const int tottri = mesh_render_data_looptri_num_get(mrdata);
+
+ cache->pos_with_normals = VertexBuffer_create_with_format(&format);
+ VertexBuffer_allocate_data(cache->pos_with_normals, tottri * 3);
+
+ for (int i = 0; i < tottri; i++) {
+ float *tri_vert_cos[3];
+ short *tri_nor, *tri_vert_nors[3];
+
+ const bool is_smooth = mesh_render_data_looptri_cos_nors_smooth_get(mrdata, i, &tri_vert_cos, &tri_nor, &tri_vert_nors);
+
+ if (is_smooth) {
+ setAttrib(cache->pos_with_normals, nor_id, nidx++, tri_vert_nors[0]);
+ setAttrib(cache->pos_with_normals, nor_id, nidx++, tri_vert_nors[1]);
+ setAttrib(cache->pos_with_normals, nor_id, nidx++, tri_vert_nors[2]);
+ }
+ else {
+ setAttrib(cache->pos_with_normals, nor_id, nidx++, tri_nor);
+ setAttrib(cache->pos_with_normals, nor_id, nidx++, tri_nor);
+ setAttrib(cache->pos_with_normals, nor_id, nidx++, tri_nor);
+ }
+
+ setAttrib(cache->pos_with_normals, pos_id, vidx++, tri_vert_cos[0]);
+ setAttrib(cache->pos_with_normals, pos_id, vidx++, tri_vert_cos[1]);
+ setAttrib(cache->pos_with_normals, pos_id, vidx++, tri_vert_cos[2]);
+ }
+ }
+ return cache->pos_with_normals;
+}
+static VertexBuffer *mesh_batch_cache_get_pos_and_nor_in_order(MeshRenderData *mrdata, MeshBatchCache *cache)
{
BLI_assert(mrdata->types & MR_DATATYPE_VERT);
if (cache->pos_in_order == NULL) {
static VertexFormat format = { 0 };
- static unsigned pos_id;
+ static unsigned pos_id, nor_id;
if (format.attrib_ct == 0) {
/* initialize vertex format */
pos_id = add_attrib(&format, "pos", GL_FLOAT, 3, KEEP_FLOAT);
+ nor_id = add_attrib(&format, "nor", GL_SHORT, 3, NORMALIZE_INT_TO_FLOAT);
}
const int vertex_ct = mesh_render_data_verts_num_get(mrdata);
@@ -890,6 +955,7 @@ static VertexBuffer *mesh_batch_cache_get_pos_in_order(MeshRenderData *mrdata, M
VertexBuffer_allocate_data(cache->pos_in_order, vertex_ct);
for (int i = 0; i < vertex_ct; ++i) {
setAttrib(cache->pos_in_order, pos_id, i, mesh_render_data_vert_co(mrdata, i));
+ setAttrib(cache->pos_in_order, nor_id, i, mesh_render_data_vert_nor(mrdata, i));
}
}
@@ -948,7 +1014,7 @@ Batch *BKE_mesh_batch_cache_get_all_edges(Mesh *me)
/* create batch from Mesh */
MeshRenderData *mrdata = mesh_render_data_create(me, MR_DATATYPE_VERT | MR_DATATYPE_EDGE);
- cache->all_edges = Batch_create(GL_LINES, mesh_batch_cache_get_pos_in_order(mrdata, cache),
+ cache->all_edges = Batch_create(GL_LINES, mesh_batch_cache_get_pos_and_nor_in_order(mrdata, cache),
mesh_batch_cache_get_edges_in_order(mrdata, cache));
mesh_render_data_free(mrdata);
@@ -965,7 +1031,7 @@ Batch *BKE_mesh_batch_cache_get_all_triangles(Mesh *me)
/* create batch from DM */
MeshRenderData *mrdata = mesh_render_data_create(me, MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI);
- cache->all_triangles = Batch_create(GL_TRIANGLES, mesh_batch_cache_get_pos_in_order(mrdata, cache),
+ cache->all_triangles = Batch_create(GL_TRIANGLES, mesh_batch_cache_get_pos_and_nor_in_order(mrdata, cache),
mesh_batch_cache_get_triangles_in_order(mrdata, cache));
mesh_render_data_free(mrdata);
@@ -979,50 +1045,29 @@ Batch *BKE_mesh_batch_cache_get_triangles_with_normals(Mesh *me)
MeshBatchCache *cache = mesh_batch_cache_get(me);
if (cache->triangles_with_normals == NULL) {
- unsigned int vidx = 0, nidx = 0;
-
- static VertexFormat format = { 0 };
- static unsigned int pos_id, nor_id;
- if (format.attrib_ct == 0) {
- /* initialize vertex format */
- pos_id = add_attrib(&format, "pos", GL_FLOAT, 3, KEEP_FLOAT);
- nor_id = add_attrib(&format, "nor", GL_SHORT, 3, NORMALIZE_INT_TO_FLOAT);
- }
-
MeshRenderData *mrdata = mesh_render_data_create(me, MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI | MR_DATATYPE_LOOP | MR_DATATYPE_POLY);
- const int tottri = mesh_render_data_looptri_num_get(mrdata);
- VertexBuffer *vbo = VertexBuffer_create_with_format(&format);
- VertexBuffer_allocate_data(vbo, tottri * 3);
+ cache->triangles_with_normals = Batch_create(GL_TRIANGLES, mesh_batch_cache_get_pos_and_normals(mrdata, cache), NULL);
- for (int i = 0; i < tottri; i++) {
- float *tri_vert_cos[3];
- short *tri_nor, *tri_vert_nors[3];
+ mesh_render_data_free(mrdata);
+ }
- const bool is_smooth = mesh_render_data_looptri_cos_nors_smooth_get(mrdata, i, &tri_vert_cos, &tri_nor, &tri_vert_nors);
+ return cache->triangles_with_normals;
+}
- if (is_smooth) {
- setAttrib(vbo, nor_id, nidx++, tri_vert_nors[0]);
- setAttrib(vbo, nor_id, nidx++, tri_vert_nors[1]);
- setAttrib(vbo, nor_id, nidx++, tri_vert_nors[2]);
- }
- else {
- setAttrib(vbo, nor_id, nidx++, tri_nor);
- setAttrib(vbo, nor_id, nidx++, tri_nor);
- setAttrib(vbo, nor_id, nidx++, tri_nor);
- }
+Batch *BKE_mesh_batch_cache_get_points_with_normals(Mesh *me)
+{
+ MeshBatchCache *cache = mesh_batch_cache_get(me);
- setAttrib(vbo, pos_id, vidx++, tri_vert_cos[0]);
- setAttrib(vbo, pos_id, vidx++, tri_vert_cos[1]);
- setAttrib(vbo, pos_id, vidx++, tri_vert_cos[2]);
- }
+ if (cache->points_with_normals == NULL) {
+ MeshRenderData *mrdata = mesh_render_data_create(me, MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI | MR_DATATYPE_LOOP | MR_DATATYPE_POLY);
- cache->triangles_with_normals = Batch_create(GL_TRIANGLES, vbo, NULL);
+ cache->points_with_normals = Batch_create(GL_POINTS, mesh_batch_cache_get_pos_and_normals(mrdata, cache), NULL);
mesh_render_data_free(mrdata);
}
- return cache->triangles_with_normals;
+ retur
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list