[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