[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