[Bf-blender-cvs] [b463cd2ab8] blender2.8: Edit Mode overlay: Moved Shaders to draw modules and resolved some draw issue.

Clément Foucault noreply at git.blender.org
Thu Mar 2 01:10:47 CET 2017


Commit: b463cd2ab8f1a48200e6b348002ac88d3a8507ca
Author: Clément Foucault
Date:   Thu Mar 2 01:07:03 2017 +0100
Branches: blender2.8
https://developer.blender.org/rBb463cd2ab8f1a48200e6b348002ac88d3a8507ca

Edit Mode overlay: Moved Shaders to draw modules and resolved some draw issue.

We don't want to clutter gpu_shader.c with engine specific code
Added face's center dot
Simplified loose vert shader

===================================================================

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/engines/clay/clay.c
M	source/blender/draw/engines/clay/clay.h
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/intern/draw_mode_pass.c
M	source/blender/draw/modes/edit_mesh_mode.c
M	source/blender/draw/modes/edit_mesh_mode.h
A	source/blender/draw/modes/shaders/edit_overlay_facedot_frag.glsl
A	source/blender/draw/modes/shaders/edit_overlay_facedot_vert.glsl
R098	source/blender/gpu/shaders/gpu_shader_edit_overlay_frag.glsl	source/blender/draw/modes/shaders/edit_overlay_frag.glsl
R095	source/blender/gpu/shaders/gpu_shader_edit_overlay_geom_edge.glsl	source/blender/draw/modes/shaders/edit_overlay_geom_edge.glsl
R092	source/blender/gpu/shaders/gpu_shader_edit_overlay_geom_tri.glsl	source/blender/draw/modes/shaders/edit_overlay_geom_tri.glsl
R070	source/blender/gpu/shaders/gpu_shader_edit_overlay_geom_vert.glsl	source/blender/draw/modes/shaders/edit_overlay_loosevert_vert.glsl
R100	source/blender/gpu/shaders/gpu_shader_edit_overlay_vert.glsl	source/blender/draw/modes/shaders/edit_overlay_vert.glsl
M	source/blender/gpu/CMakeLists.txt
M	source/blender/gpu/GPU_shader.h
M	source/blender/gpu/intern/gpu_shader.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_mesh_render.h b/source/blender/blenkernel/BKE_mesh_render.h
index 0370426d41..31c57d4513 100644
--- a/source/blender/blenkernel/BKE_mesh_render.h
+++ b/source/blender/blenkernel/BKE_mesh_render.h
@@ -43,5 +43,6 @@ struct Batch *BKE_mesh_batch_cache_get_fancy_edges(struct Mesh *me);
 struct Batch *BKE_mesh_batch_cache_get_overlay_triangles(struct Mesh *me);
 struct Batch *BKE_mesh_batch_cache_get_overlay_loose_edges(struct Mesh *me);
 struct Batch *BKE_mesh_batch_cache_get_overlay_loose_verts(struct Mesh *me);
+struct Batch *BKE_mesh_batch_cache_get_overlay_facedots(struct Mesh *me);
 
 #endif /* __BKE_MESH_RENDER_H__ */
diff --git a/source/blender/blenkernel/intern/mesh_render.c b/source/blender/blenkernel/intern/mesh_render.c
index 9488b80f20..da88d35b98 100644
--- a/source/blender/blenkernel/intern/mesh_render.c
+++ b/source/blender/blenkernel/intern/mesh_render.c
@@ -298,7 +298,7 @@ static int UNUSED_FUNCTION(mesh_render_data_loops_num_get)(const MeshRenderData
 	return mrdata->totloop;
 }
 
-static int UNUSED_FUNCTION(mesh_render_data_polys_num_get)(const MeshRenderData *mrdata)
+static int mesh_render_data_polys_num_get(const MeshRenderData *mrdata)
 {
 	BLI_assert(mrdata->types & MR_DATATYPE_POLY);
 	return mrdata->totpoly;
@@ -334,6 +334,26 @@ 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)
+{
+	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);
+		*selected = (BM_elem_flag_test(bf, BM_ELEM_SELECT) != 0) ? true : false;
+	}
+	else {
+		MVert *mvert = mrdata->mvert;
+		const MPoly *mpoly = mrdata->mpoly + poly;
+		const MLoop *mloop = mrdata->mloop + mpoly->loopstart;
+
+		BKE_mesh_calc_poly_center(mpoly, mloop, mvert, center);
+
+		*selected = false; /* No selection if not in edit mode */
+	}
+}
+
 static bool mesh_render_data_edge_exists(MeshRenderData *mrdata, const int v1, const int v2)
 {
 	BLI_assert(mrdata->types & MR_DATATYPE_EDGE);
@@ -705,6 +725,7 @@ typedef struct MeshBatchCache {
 	Batch *overlay_triangles;
 	Batch *overlay_loose_verts;
 	Batch *overlay_loose_edges;
+	Batch *overlay_facedots;
 
 	/* settings to determine if cache is invalid */
 	bool is_dirty;
@@ -806,6 +827,7 @@ void BKE_mesh_batch_cache_clear(Mesh *me)
 	if (cache->overlay_triangles) Batch_discard(cache->overlay_triangles);
 	if (cache->overlay_loose_verts) Batch_discard(cache->overlay_loose_verts);
 	if (cache->overlay_loose_edges) Batch_discard(cache->overlay_loose_edges);
+	if (cache->overlay_facedots) Batch_discard(cache->overlay_facedots);
 
 	if (cache->triangles_with_normals) {
 		Batch_discard_all(cache->triangles_with_normals);
@@ -1163,4 +1185,40 @@ Batch *BKE_mesh_batch_cache_get_overlay_loose_verts(Mesh *me)
 	return cache->overlay_loose_verts;
 }
 
+Batch *BKE_mesh_batch_cache_get_overlay_facedots(Mesh *me)
+{
+	MeshBatchCache *cache = mesh_batch_cache_get(me);
+
+	if (cache->overlay_facedots == NULL) {
+		MeshRenderData *mrdata = mesh_render_data_create(me, MR_DATATYPE_VERT | MR_DATATYPE_LOOP | MR_DATATYPE_POLY);
+
+		static VertexFormat format = { 0 };
+		static unsigned pos_id, data_id;
+		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);
+		}
+
+		const int poly_ct = mesh_render_data_polys_num_get(mrdata);
+
+		VertexBuffer *vbo = VertexBuffer_create_with_format(&format);
+		VertexBuffer_allocate_data(vbo, poly_ct);
+
+		for (int i = 0; i < poly_ct; ++i) {
+			float poly_center[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);
+		}
+
+		cache->overlay_facedots = Batch_create(GL_POINTS, vbo, NULL);
+
+		mesh_render_data_free(mrdata);
+	}
+
+	return cache->overlay_facedots;
+}
+
 #undef MESH_RENDER_FUNCTION
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 12722ff23e..ea1d179aa4 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -27,7 +27,7 @@ set(INC
 	.
 	intern
 	engines/clay
-	modes/
+	modes
 
 	../blenkernel
 	../blenlib
@@ -82,6 +82,14 @@ data_to_c_simple(engines/clay/shaders/clay_vert.glsl SRC)
 data_to_c_simple(engines/clay/shaders/ssao_alchemy.glsl SRC)
 data_to_c_simple(engines/clay/shaders/ssao_groundtruth.glsl SRC)
 
+data_to_c_simple(modes/shaders/edit_overlay_frag.glsl SRC)
+data_to_c_simple(modes/shaders/edit_overlay_vert.glsl SRC)
+data_to_c_simple(modes/shaders/edit_overlay_geom_tri.glsl SRC)
+data_to_c_simple(modes/shaders/edit_overlay_geom_edge.glsl SRC)
+data_to_c_simple(modes/shaders/edit_overlay_loosevert_vert.glsl SRC)
+data_to_c_simple(modes/shaders/edit_overlay_facedot_frag.glsl SRC)
+data_to_c_simple(modes/shaders/edit_overlay_facedot_vert.glsl SRC)
+
 list(APPEND INC
 )
 
diff --git a/source/blender/draw/engines/clay/clay.c b/source/blender/draw/engines/clay/clay.c
index 54bae5de85..bde1ffe2fa 100644
--- a/source/blender/draw/engines/clay/clay.c
+++ b/source/blender/draw/engines/clay/clay.c
@@ -754,7 +754,7 @@ static void CLAY_collection_settings_create(RenderEngine *UNUSED(engine), Collec
 	BKE_collection_engine_property_add_float(ces, "ssao_factor_edge", 1.0f);
 }
 
-void clay_engine_free(void)
+void CLAY_engine_free(void)
 {
 	/* data.depth_sh Is builtin so it's automaticaly freed */
 	if (data.clay_sh) {
diff --git a/source/blender/draw/engines/clay/clay.h b/source/blender/draw/engines/clay/clay.h
index add2a45fbd..34dd74b950 100644
--- a/source/blender/draw/engines/clay/clay.h
+++ b/source/blender/draw/engines/clay/clay.h
@@ -31,6 +31,6 @@ extern RenderEngineType viewport_clay_type;
 struct RenderEngineSettings *CLAY_render_settings_create(void);
 struct MaterialEngineSettings *CLAY_material_settings_create(void);
 
-void clay_engine_free(void);
+void CLAY_engine_free(void);
 
 #endif /* __CLAY_H__ */
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index f8d8145843..c16e7c23f0 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -868,8 +868,6 @@ Batch *DRW_cache_single_vert_get(void)
 /* Meshes */
 void DRW_cache_wire_overlay_get(Object *ob, Batch **tris, Batch **ledges, Batch **lverts)
 {
-	Batch *overlay_wire = NULL;
-
 	BLI_assert(ob->type == OB_MESH);
 
 	Mesh *me = ob->data;
@@ -877,8 +875,15 @@ void DRW_cache_wire_overlay_get(Object *ob, Batch **tris, Batch **ledges, Batch
 	*tris = BKE_mesh_batch_cache_get_overlay_triangles(me);
 	*ledges = BKE_mesh_batch_cache_get_overlay_loose_edges(me);
 	*lverts = BKE_mesh_batch_cache_get_overlay_loose_verts(me);
+}
+
+Batch *DRW_cache_face_centers_get(Object *ob)
+{
+	BLI_assert(ob->type == OB_MESH);
+
+	Mesh *me = ob->data;
 
-	return overlay_wire;
+	return BKE_mesh_batch_cache_get_overlay_facedots(me);
 }
 
 Batch *DRW_cache_wire_outline_get(Object *ob)
diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h
index f34dc54729..042bc65b17 100644
--- a/source/blender/draw/intern/draw_cache.h
+++ b/source/blender/draw/intern/draw_cache.h
@@ -63,6 +63,7 @@ struct Batch *DRW_cache_bone_arrows_get(void);
 /* Meshes */
 void DRW_cache_wire_overlay_get(
 	struct Object *ob, struct Batch **tris, struct Batch **ledges, struct Batch **lverts);
+struct Batch *DRW_cache_face_centers_get(struct Object *ob);
 struct Batch *DRW_cache_wire_outline_get(struct Object *ob);
 struct Batch *DRW_cache_surface_get(struct Object *ob);
 
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index c9e788fd8a..d4b773f8d1 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -1372,7 +1372,9 @@ extern struct GPUUniformBuffer *globals_ubo; /* draw_mode_pass.c */
 void DRW_engines_free(void)
 {
 #ifdef WITH_CLAY_ENGINE
-	clay_engine_free();
+	CLAY_engine_free();
+
+	EDIT_MESH_engine_free();
 
 	DRW_shape_cache_free();
 
diff --git a/source/blender/draw/intern/draw_mode_pass.c b/source/blender/draw/intern/draw_mode_pass.c
index 1d16ef26f5..7bf34c4a9b 100644
--- a/source/blender/draw/intern/draw_mode_pass.c
+++ b/source/blender/draw/intern/draw_mode_pass.c
@@ -113,7 +113,7 @@ void DRW_update_global_values(void)
 
 	/* M_SQRT2 to be at least the same size of the old square */
 	ts.sizeVertex = UI_GetThemeValuef(TH_VERTEX_SIZE) * M_SQRT2 / 2.0f;
-	ts.sizeFaceDot = UI_GetThemeValuef(TH_FACEDOT_SIZE) * M_SQRT2 / 2.0f;
+	ts.sizeFaceDot = UI_GetThemeValuef(TH_FACEDOT_SIZE) * M_SQRT2;
 	ts.sizeEdge = 1.0f / 2.0f; /* TODO Theme */
 	ts.sizeEdgeFix = 0.5f + 2.0f * (2.0f * (MAX2(ts.sizeVertex, ts.sizeEdge)) * M_SQRT1_2);
 	ts.sizeNormal = 1.0f; /* TODO compute */
diff --git a/source/blender/draw/modes/edit_mesh_mode.c b/source/blender/draw/modes/edit_mesh_mode.c
index 1f394870c4..4177e7b843 100644
--- a/source/blender/draw/modes/edit_mesh_mode.c
+++ b/source/blender/draw/modes/edit_mesh_mode.c
@@ -46,43 +46,117 @@ static DRWShadingGroup *depth_shgrp_hidden_wire;
 static DRWShadingGroup *face_overlay_shgrp;
 static DRWShadingGroup *ledges_overlay_shgrp;
 static DRWShadingGroup *lverts_overlay_shgrp;
+static DRWShadingGroup *facedot_overlay_shgrp;
 
 extern struct GPUUniformBuffer *globals_ubo; /* draw_mode_pass.c */
 
+static struct GPUShader *overlay_tri_sh = NULL;
+static struct GPUShader *overlay_tri_fast_sh = NULL;
+static struct GPUShader *overlay_tri_vcol_sh = NULL;
+static struct GPUShader *overlay_tri_vcol_fast_sh = NULL;
+static struct GPUShader *overlay_edge_sh = NULL;
+static struct GPUShader *overlay_edge_vcol_sh = NULL;
+static struct GPUShader *overlay_vert_sh = NULL;
+static struct GPUShader *overlay_facedot_sh = NULL;
+
+extern char datatoc_edit_overlay_frag_glsl[];
+extern char datatoc_edit_overlay_vert_glsl[];
+exte

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list