[Bf-blender-cvs] [85945849a9] blender2.8: Edit Mode overlay: backwire "ghost wireframe" with variable intensity

Clément Foucault noreply at git.blender.org
Fri Mar 3 02:55:23 CET 2017


Commit: 85945849a9d10f5daa72d1adca1f8e2b10407bea
Author: Clément Foucault
Date:   Fri Mar 3 02:48:34 2017 +0100
Branches: blender2.8
https://developer.blender.org/rB85945849a9d10f5daa72d1adca1f8e2b10407bea

Edit Mode overlay: backwire "ghost wireframe" with variable intensity

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

M	release/scripts/startup/bl_ui/properties_collection.py
M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/clay/clay.c
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/modes/edit_mesh_mode.c
M	source/blender/draw/modes/edit_mesh_mode.h
M	source/blender/draw/modes/shaders/edit_overlay_facedot_frag.glsl
A	source/blender/draw/modes/shaders/edit_overlay_facefill_frag.glsl
A	source/blender/draw/modes/shaders/edit_overlay_facefill_vert.glsl
M	source/blender/draw/modes/shaders/edit_overlay_frag.glsl
A	source/blender/draw/modes/shaders/edit_overlay_mix_frag.glsl
A	source/blender/draw/modes/shaders/edit_overlay_mix_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 1e7bf9416a..6debbaf3aa 100644
--- a/release/scripts/startup/bl_ui/properties_collection.py
+++ b/release/scripts/startup/bl_ui/properties_collection.py
@@ -127,6 +127,7 @@ 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")
 
 
 if __name__ == "__main__":  # only for live edit.
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index ea1d179aa4..cb2681fcf8 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -89,6 +89,10 @@ 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)
+data_to_c_simple(modes/shaders/edit_overlay_mix_frag.glsl SRC)
+data_to_c_simple(modes/shaders/edit_overlay_mix_vert.glsl SRC)
+data_to_c_simple(modes/shaders/edit_overlay_facefill_vert.glsl SRC)
+data_to_c_simple(modes/shaders/edit_overlay_facefill_frag.glsl SRC)
 
 list(APPEND INC
 )
diff --git a/source/blender/draw/engines/clay/clay.c b/source/blender/draw/engines/clay/clay.c
index 7a5beb4648..7f55ee03a3 100644
--- a/source/blender/draw/engines/clay/clay.c
+++ b/source/blender/draw/engines/clay/clay.c
@@ -689,6 +689,7 @@ static void CLAY_view_draw(RenderEngine *UNUSED(engine), const bContext *context
 	CLAY_FramebufferList *fbl = DRW_engine_framebuffer_list_get();
 
 	CLAY_engine_init();
+	DRW_mode_init();
 
 	/* TODO : tag to refresh by the deps graph */
 	/* ideally only refresh when objects are added/removed */
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index a9d831440d..4c5442cc21 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -131,6 +131,7 @@ typedef struct DRWFboTexture {
 
 void DRW_framebuffer_init(struct GPUFrameBuffer **fb, int width, int height, DRWFboTexture textures[MAX_FBO_TEX], int texnbr);
 void DRW_framebuffer_bind(struct GPUFrameBuffer *fb);
+void DRW_framebuffer_clear(bool color, bool depth, float clear_col[4]);
 void DRW_framebuffer_texture_attach(struct GPUFrameBuffer *fb, struct GPUTexture *tex, int slot);
 void DRW_framebuffer_texture_detach(struct GPUTexture *tex);
 void DRW_framebuffer_blit(struct GPUFrameBuffer *fb_read, struct GPUFrameBuffer *fb_write, bool depth);
@@ -144,19 +145,20 @@ void DRW_shader_free(struct GPUShader *shader);
 /* Batches */
 
 typedef enum {
-	DRW_STATE_WRITE_DEPTH = (1 << 0),
-	DRW_STATE_WRITE_COLOR = (1 << 1),
-	DRW_STATE_DEPTH_LESS  = (1 << 2),
-	DRW_STATE_DEPTH_EQUAL = (1 << 3),
-	DRW_STATE_CULL_BACK   = (1 << 4),
-	DRW_STATE_CULL_FRONT  = (1 << 5),
-	DRW_STATE_WIRE        = (1 << 6),
-	DRW_STATE_WIRE_LARGE  = (1 << 7),
-	DRW_STATE_POINT       = (1 << 8),
-	DRW_STATE_STIPPLE_2   = (1 << 9),
-	DRW_STATE_STIPPLE_3   = (1 << 10),
-	DRW_STATE_STIPPLE_4   = (1 << 11),
-	DRW_STATE_BLEND       = (1 << 12),
+	DRW_STATE_WRITE_DEPTH   = (1 << 0),
+	DRW_STATE_WRITE_COLOR   = (1 << 1),
+	DRW_STATE_DEPTH_LESS    = (1 << 2),
+	DRW_STATE_DEPTH_EQUAL   = (1 << 3),
+	DRW_STATE_DEPTH_GREATER = (1 << 4),
+	DRW_STATE_CULL_BACK     = (1 << 5),
+	DRW_STATE_CULL_FRONT    = (1 << 6),
+	DRW_STATE_WIRE          = (1 << 7),
+	DRW_STATE_WIRE_LARGE    = (1 << 8),
+	DRW_STATE_POINT         = (1 << 9),
+	DRW_STATE_STIPPLE_2     = (1 << 10),
+	DRW_STATE_STIPPLE_3     = (1 << 11),
+	DRW_STATE_STIPPLE_4     = (1 << 12),
+	DRW_STATE_BLEND         = (1 << 13),
 } DRWState;
 
 DRWShadingGroup *DRW_shgroup_create(struct GPUShader *shader, DRWPass *pass);
@@ -210,6 +212,7 @@ void *DRW_render_settings_get(Scene *scene, const char *engine_name);
 #endif /* __DRW_ENGINE_H__ */
 
 /* Cache */
+void DRW_mode_init(void);
 void DRW_mode_cache_init(void);
 void DRW_mode_cache_populate(struct Object *ob);
 void DRW_mode_cache_finish(void);
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 1ffff40fb5..ea14c59bc7 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -942,8 +942,7 @@ static void set_state(short flag)
 	}
 
 	/* Depht Test */
-	if (flag & DRW_STATE_DEPTH_LESS ||
-	    flag & DRW_STATE_DEPTH_EQUAL)
+	if (flag & (DRW_STATE_DEPTH_LESS | DRW_STATE_DEPTH_EQUAL | DRW_STATE_DEPTH_GREATER))
 	{
 
 		glEnable(GL_DEPTH_TEST);
@@ -952,6 +951,8 @@ static void set_state(short flag)
 			glDepthFunc(GL_LEQUAL);
 		else if (flag & DRW_STATE_DEPTH_EQUAL)
 			glDepthFunc(GL_EQUAL);
+		else if (flag & DRW_STATE_DEPTH_GREATER)
+			glDepthFunc(GL_GREATER);
 	}
 	else {
 		glDisable(GL_DEPTH_TEST);
@@ -977,6 +978,7 @@ static void set_state(short flag)
 	/* Blending (all buffer) */
 	if (flag & DRW_STATE_BLEND) {
 		glEnable(GL_BLEND);
+		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 	}
 	else {
 		glDisable(GL_BLEND);
@@ -1063,6 +1065,23 @@ void DRW_draw_pass(DRWPass *UNUSED(pass))
 #endif
 
 /* ******************************************* Mode Engine Cache ****************************************** */
+
+void DRW_mode_init(void)
+{
+	const bContext *C = DRW_get_context();
+	int mode = CTX_data_mode_enum(C);
+
+	switch (mode) {
+		case CTX_MODE_EDIT_MESH:
+			EDIT_MESH_init();
+			break;
+		case CTX_MODE_EDIT_ARMATURE:
+			break;
+		case CTX_MODE_OBJECT:
+			break;
+	}
+}
+
 void DRW_mode_cache_init(void)
 {
 	const bContext *C = DRW_get_context();
@@ -1188,6 +1207,8 @@ void *DRW_render_settings_get(Scene *scene, const char *engine_name)
 void DRW_framebuffer_init(struct GPUFrameBuffer **fb, int width, int height, DRWFboTexture textures[MAX_FBO_TEX],
                           int texnbr)
 {
+	BLI_assert(texnbr <= MAX_FBO_TEX);
+
 	if (!*fb) {
 		int color_attachment = -1;
 		*fb = GPU_framebuffer_create();
@@ -1226,6 +1247,19 @@ void DRW_framebuffer_bind(struct GPUFrameBuffer *fb)
 	GPU_framebuffer_bind(fb);
 }
 
+void DRW_framebuffer_clear(bool color, bool depth, float clear_col[4])
+{
+	if (color) {
+		glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+		glClearColor(clear_col[0], clear_col[1], clear_col[2], clear_col[4]);
+	}
+	if (depth) {
+		glDepthMask(GL_TRUE);
+	}
+	glClear(((color) ? GL_COLOR_BUFFER_BIT : 0) |
+	        ((depth) ? GL_DEPTH_BUFFER_BIT : 0));
+}
+
 void DRW_framebuffer_texture_attach(struct GPUFrameBuffer *fb, GPUTexture *tex, int slot)
 {
 	GPU_framebuffer_texture_attach(fb, tex, slot);
diff --git a/source/blender/draw/modes/edit_mesh_mode.c b/source/blender/draw/modes/edit_mesh_mode.c
index 4177e7b843..c9a998df9a 100644
--- a/source/blender/draw/modes/edit_mesh_mode.c
+++ b/source/blender/draw/modes/edit_mesh_mode.c
@@ -27,6 +27,7 @@
 #include "DRW_render.h"
 
 #include "GPU_shader.h"
+#include "GPU_viewport.h"
 #include "DNA_view3d_types.h"
 
 #include "draw_mode_pass.h"
@@ -40,14 +41,37 @@ typedef struct EDIT_MESH_PassList {
 	struct DRWPass *wire_outline_pass;
 	struct DRWPass *depth_pass_hidden_wire;
 	struct DRWPass *edit_face_overlay_pass;
+	struct DRWPass *edit_face_occluded_pass;
+	struct DRWPass *mix_occlude_pass;
+	struct DRWPass *facefill_occlude_pass;
 } EDIT_MESH_PassList;
 
+/* keep it under MAX_BUFFERS */
+typedef struct EDIT_MESH_FramebufferList {
+	struct GPUFrameBuffer *occlude_wire_fb;
+	struct GPUFrameBuffer *occlude_face_fb;
+} EDIT_MESH_FramebufferList;
+
+/* keep it under MAX_TEXTURES */
+typedef struct EDIT_MESH_TextureList {
+	struct GPUTexture *occlude_wire_depth_tx;
+	struct GPUTexture *occlude_wire_color_tx;
+	struct GPUTexture *occlude_face_color_tx;
+} EDIT_MESH_TextureList;
+
 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;
 
+static DRWShadingGroup *face_occluded_shgrp;
+static DRWShadingGroup *ledges_occluded_shgrp;
+static DRWShadingGroup *lverts_occluded_shgrp;
+static DRWShadingGroup *facedot_occluded_shgrp;
+static DRWShadingGroup *facefill_occluded_shgrp;
+
 extern struct GPUUniformBuffer *globals_ubo; /* draw_mode_pass.c */
 
 static struct GPUShader *overlay_tri_sh = NULL;
@@ -58,6 +82,8 @@ 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;
+static struct GPUShader *overlay_mix_sh = NULL;
+static struct GPUShader *overlay_facefill_sh = NULL;
 
 extern char datatoc_edit_overlay_frag_glsl[];
 extern char datatoc_edit_overlay_vert_glsl[];
@@ -66,19 +92,28 @@ extern char datatoc_edit_overlay_geom_edge_glsl[];
 extern char datatoc_edit_overlay_loosevert_vert_glsl[];
 extern char datatoc_edit_overlay_facedot_frag_glsl[];
 extern char datatoc_edit_overlay_facedot_vert_glsl[];
+extern char datatoc_edit_overlay_mix_vert_glsl[];
+extern char datatoc_edit_overlay_mix_frag_glsl[];
+extern char datatoc_edit_overlay_facefill_vert_glsl[];
+extern char datatoc_edit_overlay_facefill_frag_glsl[];
 
-void EDIT_MESH_cache_init(void)
+void EDIT_MESH_init(void)
 {
-	EDIT_MESH_PassList *psl = DRW_mode_pass_list_get();
-	static struct GPUShader *depth_sh, *tri_sh, *ledge_sh;
+	EDIT_MESH_TextureList *txl = DRW_mode_texture_list_get();
+	EDIT_MESH_FramebufferList *fbl = DRW_mode_framebuffer_list_get();
 
-	const struct bContext *C = DRW_get_context();
-	struct RegionView3D *rv3d = CTX_wm_region_view3d(C);
-	Scene *scene = CTX_data_scene(C);
-	ToolSettings *ts = scene->toolsettings;
+	float *viewport_size = DRW_viewport_size_get();
 
-	if (!depth_sh)
-		depth_sh = DRW_shader_create_3D_depth_only();
+	DRWFboTexture tex[2] = {{&txl->occlude_wire_depth_tx, DRW_BUF_DEPTH_24},
+	                        {&txl->occlude_wire_color_tx, DRW_BUF_RGBA_8}};
+	DRW_framebuffer_init(&fbl->occlude_wire_fb,
+	                     (int)viewport_size[0], (int)viewport_size[1],
+	                  

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list