Commit: 3d63b9a88f969f2766cb37c8d3c937e1054a8154
Author: Clément Foucault
Date:   Thu Feb 16 14:00:37 2017 +0100
Branches: blender2.8
https://developer.blender.org/rB3d63b9a88f969f2766cb37c8d3c937e1054a8154

Clay Engine: Hidden wire

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

M       source/blender/draw/engines/clay/clay.c
M       source/blender/draw/intern/draw_mode_pass.c
M       source/blender/draw/intern/draw_mode_pass.h

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

diff --git a/source/blender/draw/engines/clay/clay.c 
b/source/blender/draw/engines/clay/clay.c
index 85fb53f618..1673dd219c 100644
--- a/source/blender/draw/engines/clay/clay.c
+++ b/source/blender/draw/engines/clay/clay.c
@@ -132,9 +132,11 @@ typedef struct CLAY_PassList{
        /* engine specific */
        struct DRWPass *depth_pass;
        struct DRWPass *depth_pass_cull;
+       struct DRWPass *depth_pass_hidden_wire;
        struct DRWPass *clay_pass;
        struct DRWPass *wire_overlay_pass;
        struct DRWPass *wire_outline_pass;
+       struct DRWPass *wire_outline_pass_hidden_wire;
 } CLAY_PassList;
 
 //#define GTAO
@@ -609,6 +611,7 @@ static void CLAY_create_cache(CLAY_PassList *passes, 
CLAY_StorageList *stl, cons
        DRWShadingGroup *clay_shgrp;
        DRWShadingGroup *depth_shgrp;
        DRWShadingGroup *depth_shgrp_cull;
+       DRWShadingGroup *depth_shgrp_hidden_wire;
 
        /* Depth Pass */
        {
@@ -616,6 +619,8 @@ static void CLAY_create_cache(CLAY_PassList *passes, 
CLAY_StorageList *stl, cons
                depth_shgrp_cull = DRW_shgroup_create(data.depth_sh, 
passes->depth_pass_cull);
                passes->depth_pass = DRW_pass_create("Depth Pass", 
DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS);
                depth_shgrp = DRW_shgroup_create(data.depth_sh, 
passes->depth_pass);
+               passes->depth_pass_hidden_wire = DRW_pass_create("Depth Pass 
Hidden Wire", DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | 
DRW_STATE_CULL_BACK);
+               depth_shgrp_hidden_wire = DRW_shgroup_create(data.depth_sh, 
passes->depth_pass_hidden_wire);
        }
 
        /* Clay Pass */
@@ -629,6 +634,7 @@ static void CLAY_create_cache(CLAY_PassList *passes, 
CLAY_StorageList *stl, cons
        {
                DRW_pass_setup_common(&passes->wire_overlay_pass,
                                          &passes->wire_outline_pass,
+                                         
&passes->wire_outline_pass_hidden_wire,
                                          &passes->non_meshes_pass,
                                          &passes->ob_center_pass);
        }
@@ -641,11 +647,12 @@ static void CLAY_create_cache(CLAY_PassList *passes, 
CLAY_StorageList *stl, cons
                }
 
                CollectionEngineSettings *ces_mode_ob = 
BKE_object_collection_engine_get(ob, COLLECTION_MODE_OBJECT, "");
-               //CollectionEngineSettings *ces_mode_ed = 
BKE_object_collection_engine_get(ob, COLLECTION_MODE_EDIT, "");
+               CollectionEngineSettings *ces_mode_ed = 
BKE_object_collection_engine_get(ob, COLLECTION_MODE_EDIT, "");
 
                struct Batch *geom;
                bool do_wire = 
BKE_collection_engine_property_value_get_bool(ces_mode_ob, "show_wire");
                bool do_cull = 
BKE_collection_engine_property_value_get_bool(ces_mode_ob, 
"show_backface_culling");
+               bool do_occlude_wire = 
BKE_collection_engine_property_value_get_bool(ces_mode_ed, "show_occlude_wire");
                bool do_outlines = ((ob->base_flag & BASE_SELECTED) != 0) || 
do_wire;
 
                switch (ob->type) {
@@ -653,16 +660,26 @@ static void CLAY_create_cache(CLAY_PassList *passes, 
CLAY_StorageList *stl, cons
                                geom = DRW_cache_surface_get(ob);
 
                                /* Depth Prepass */
-                               DRW_shgroup_call_add((do_cull) ? 
depth_shgrp_cull : depth_shgrp, geom, ob->obmat);
+                               if (do_occlude_wire)
+                                       
DRW_shgroup_call_add(depth_shgrp_hidden_wire, geom, ob->obmat);
+                               else
+                                       DRW_shgroup_call_add((do_cull) ? 
depth_shgrp_cull : depth_shgrp, geom, ob->obmat);
 
                                /* Shading */
-                               clay_shgrp = CLAY_object_shgrp_get(ob, stl, 
passes);
-                               DRW_shgroup_call_add(clay_shgrp, geom, 
ob->obmat);
+                               if (!do_occlude_wire) {
+                                       clay_shgrp = CLAY_object_shgrp_get(ob, 
stl, passes);
+                                       DRW_shgroup_call_add(clay_shgrp, geom, 
ob->obmat);
+                               }
 
                                
//DRW_shgroup_wire_overlay(passes->wire_overlay_pass, ob);
 
                                /* Wires / Outlines */
-                               
DRW_shgroup_wire_outline(passes->wire_outline_pass, ob, do_wire, false, 
do_outlines);
+                               if (do_occlude_wire) {
+                                       
DRW_shgroup_wire_outline(passes->wire_outline_pass_hidden_wire, ob, true, 
false, true);
+                               }
+                               else {
+                                       
DRW_shgroup_wire_outline(passes->wire_outline_pass, ob, do_wire, false, 
do_outlines);
+                               }
 
                                break;
                        case OB_LAMP:
@@ -732,6 +749,11 @@ static void CLAY_view_draw(RenderEngine *UNUSED(engine), 
const bContext *context
        //DRW_draw_pass(passes->wire_overlay_pass);
        DRW_draw_pass(passes->wire_outline_pass);
        DRW_draw_pass(passes->non_meshes_pass);
+
+       /* Hidden Wires */
+       DRW_draw_pass(passes->depth_pass_hidden_wire);
+       DRW_draw_pass(passes->wire_outline_pass_hidden_wire);
+
        DRW_draw_pass(passes->ob_center_pass);
 
        DRW_draw_manipulator();
diff --git a/source/blender/draw/intern/draw_mode_pass.c 
b/source/blender/draw/intern/draw_mode_pass.c
index a31ab7c4c1..32a9417735 100644
--- a/source/blender/draw/intern/draw_mode_pass.c
+++ b/source/blender/draw/intern/draw_mode_pass.c
@@ -161,7 +161,8 @@ static DRWShadingGroup *shgroup_instance(DRWPass *pass, 
struct Batch *geom)
 
 /* This Function setup the passes needed for the mode rendering.
  * The passes are populated by the rendering engine using the DRW_shgroup_* 
functions. */
-void DRW_pass_setup_common(DRWPass **wire_overlay, DRWPass **wire_outline, 
DRWPass **non_meshes, DRWPass **ob_center)
+void DRW_pass_setup_common(DRWPass **wire_overlay, DRWPass **wire_outline, 
DRWPass **wire_outline_pass_hidden_wire,
+                           DRWPass **non_meshes, DRWPass **ob_center)
 {
        UI_GetThemeColor4fv(TH_WIRE, colorWire);
        UI_GetThemeColor4fv(TH_WIRE_EDIT, colorWireEdit);
@@ -192,6 +193,14 @@ void DRW_pass_setup_common(DRWPass **wire_overlay, DRWPass 
**wire_outline, DRWPa
                *wire_outline = DRW_pass_create("Wire + Outlines Pass", state);
        }
 
+       if (wire_outline_pass_hidden_wire) {
+               /* This pass can draw mesh outlines and/or fancy wireframe */
+               /* Fancy wireframes are not meant to be occluded (without Z 
offset) */
+               /* Outlines and Fancy Wires use the same VBO */
+               DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH 
| DRW_STATE_DEPTH_LESS | DRW_STATE_BLEND;
+               *wire_outline_pass_hidden_wire = DRW_pass_create("Wire + 
Outlines Pass", state);
+       }
+
        if (non_meshes) {
                /* Non Meshes Pass (Camera, empties, lamps ...) */
                struct Batch *geom;
diff --git a/source/blender/draw/intern/draw_mode_pass.h 
b/source/blender/draw/intern/draw_mode_pass.h
index 6e260dac7a..b0fd3e69bd 100644
--- a/source/blender/draw/intern/draw_mode_pass.h
+++ b/source/blender/draw/intern/draw_mode_pass.h
@@ -30,7 +30,8 @@ struct DRWPass;
 struct Batch;
 struct Object;
 
-void DRW_pass_setup_common(struct DRWPass **wire_overlay, struct DRWPass 
**wire_outline, struct DRWPass **non_meshes, struct DRWPass **ob_center);
+void DRW_pass_setup_common(struct DRWPass **wire_overlay, struct DRWPass 
**wire_outline, struct DRWPass **wire_outline_pass_hidden_wire,
+                           struct DRWPass **non_meshes, struct DRWPass 
**ob_center);
 
 void DRW_shgroup_wire_overlay(struct DRWPass *wire_overlay, struct Object *ob);
 void DRW_shgroup_wire_outline(

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to