Commit: 33ca692256c6e3cb2685eec007f74bc5b4f3323e
Author: Clément Foucault
Date:   Fri Jan 13 18:25:06 2017 +0100
Branches: clay-engine
https://developer.blender.org/rB33ca692256c6e3cb2685eec007f74bc5b4f3323e

Added object mode wires to new drawing pipeline.

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

M       source/blender/draw/CMakeLists.txt
M       source/blender/draw/engines/clay/clay.c
M       source/blender/draw/engines/clay/shaders/clay_frag.glsl
M       source/blender/draw/intern/DRW_render.h
M       source/blender/draw/intern/draw_manager.c
A       source/blender/draw/intern/draw_mode_pass.c
A       source/blender/draw/intern/draw_mode_pass.h
M       source/blender/editors/space_view3d/drawobject.c
M       source/blender/editors/space_view3d/view3d_intern.h

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

diff --git a/source/blender/draw/CMakeLists.txt 
b/source/blender/draw/CMakeLists.txt
index 3aef11dfcb..1aababc350 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -51,9 +51,11 @@ set(INC_SYS
 
 set(SRC
        intern/draw_manager.c
+       intern/draw_mode_pass.c
        engines/clay/clay.c
 
        intern/DRW_render.h
+       intern/draw_mode_pass.h
        engines/clay/clay.h
 
        ./DRW_engine.h
diff --git a/source/blender/draw/engines/clay/clay.c 
b/source/blender/draw/engines/clay/clay.c
index 44d71474f4..8aaafb635d 100644
--- a/source/blender/draw/engines/clay/clay.c
+++ b/source/blender/draw/engines/clay/clay.c
@@ -109,6 +109,8 @@ typedef struct CLAY_TextureList{
 typedef struct CLAY_PassList{
        struct DRWPass *depth_pass;
        struct DRWPass *clay_pass;
+       struct DRWPass *mode_ob_wire_pass;
+       struct DRWPass *mode_ob_center_pass;
 } CLAY_PassList;
 
 /* Functions */
@@ -415,22 +417,33 @@ static void clay_populate_passes(CLAY_PassList *passes, 
const struct bContext *C
                defaultbatch = clay_batch_create(passes->clay_pass, storage);
        }
 
+       /* Object Mode */
+       {
+               DRW_mode_object_setup(&passes->mode_ob_wire_pass, 
&passes->mode_ob_center_pass);
+       }
+
        /* TODO Create hash table of batch based on material id*/
        FOREACH_OBJECT(sl, ob)
        {
-               /* Add everything for now */
-               DRW_batch_surface_add(defaultbatch, ob);
+               if (ob->type == OB_MESH) {
+                       struct Batch *geom = DRW_cache_surface_get(ob);
+
+                       /* Add everything for now */
+                       DRW_batch_call_add(defaultbatch, geom, &ob->obmat);
+
+                       /* When encountering a new material :
+                        * - Create new Batch
+                        * - Initialize Batch
+                        * - Push it to the hash table
+                        * - The pass takes care of inserting it
+                        * next to the same shader calls */
 
-               /* When encountering a new material :
-                * - Create new Batch
-                * - Initialize Batch
-                * - Push it to the hash table
-                * - The pass takes care of inserting it
-                * next to the same shader calls */
+                       DRW_batch_call_add(depthbatch, geom, &ob->obmat);
 
-               DRW_batch_surface_add(depthbatch, ob);
+                       /* Free hash table */
 
-               /* Free hash table */
+                       DRW_mode_object_add(passes->mode_ob_wire_pass, 
passes->mode_ob_center_pass, ob);
+               }
        }
        FOREACH_OBJECT_END
 }
@@ -439,7 +452,7 @@ static void clay_ssao_setup(void)
 {
        float invproj[4][4];
        float dfdyfacs[2];
-       bool is_persp = DRW_viewport_is_persp();
+       bool is_persp = DRW_viewport_is_persp_get();
        /* view vectors for the corners of the view frustum. Can be used to 
recreate the world space position easily */
        float viewvecs[3][4] = {
            {-1.0f, -1.0f, -1.0f, 1.0f},
@@ -510,11 +523,17 @@ static void clay_view_draw(RenderEngine *UNUSED(engine), 
const struct bContext *
        /* Pass 1 : Depth pre-pass */
        DRW_draw_pass(passes->depth_pass);
 
-       /* Pass 2 : Shading */
-       clay_ssao_setup();
+       /* Pass 2 : Downsample Depth */
        DRW_framebuffer_texture_detach(textures->depth);
+       /* TODO */
+
+       /* Pass 3 : Shading */
+       clay_ssao_setup();
        DRW_draw_pass(passes->clay_pass);
+
+       /* Pass 4 : Overlays */
        DRW_framebuffer_texture_attach(buffers->default_fb, textures->depth, 0);
+       DRW_draw_pass(passes->mode_ob_wire_pass);
 
        /* Always finish by this */
        DRW_state_reset();
diff --git a/source/blender/draw/engines/clay/shaders/clay_frag.glsl 
b/source/blender/draw/engines/clay/shaders/clay_frag.glsl
index 56b26acf0d..16178a48eb 100644
--- a/source/blender/draw/engines/clay/shaders/clay_frag.glsl
+++ b/source/blender/draw/engines/clay/shaders/clay_frag.glsl
@@ -37,6 +37,7 @@ in vec3 normal;
 out vec4 fragColor;
 #endif
 
+/* TODO Move this to SSAO modules */
 /* simple depth reconstruction, see 
http://www.derschmale.com/2014/01/26/reconstructing-positions-from-the-depth-buffer
  * we change the factors from the article to fit the OpennGL model.  */
 vec3 get_view_space_from_depth(in vec2 uvcoords, in vec3 viewvec_origin, in 
vec3 viewvec_diff, in float depth)
diff --git a/source/blender/draw/intern/DRW_render.h 
b/source/blender/draw/intern/DRW_render.h
index c4e4b2459f..c809276712 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -43,6 +43,8 @@
 #include "DNA_material_types.h"
 #include "DNA_scene_types.h"
 
+#include "draw_mode_pass.h"
+
 #include "MEM_guardedalloc.h"
 
 #include "RE_engine.h"
@@ -51,6 +53,7 @@ struct GPUFrameBuffer;
 struct GPUShader;
 struct GPUTexture;
 struct Object;
+struct Batch;
 
 typedef struct DRWUniform DRWUniform;
 typedef struct DRWInterface DRWInterface;
@@ -129,13 +132,28 @@ struct GPUShader *DRW_shader_create_3D_depth_only(void);
 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)
+       /* TODO GL_BLEND */
+} DRWState;
+
 DRWBatch *DRW_batch_create(struct GPUShader *shader, DRWPass *pass, void 
*storage);
 void DRW_batch_free(struct DRWBatch *batch);
-void DRW_batch_surface_add(DRWBatch *batch, struct Object *ob);
-void DRW_batch_surface_clear(DRWBatch *batch);
+void DRW_batch_call_add(DRWBatch *batch, struct Batch *geom, const float 
**obmat);
+void DRW_batch_state_set(DRWBatch *batch, DRWState state);
 
 void DRW_batch_uniform_texture(DRWBatch *batch, const char *name, const struct 
GPUTexture *tex, int loc);
 void DRW_batch_uniform_buffer(DRWBatch *batch, const char *name, const int 
value, int loc);
+void DRW_batch_uniform_bool(DRWBatch *batch, const char *name, const bool 
*value, int arraysize);
 void DRW_batch_uniform_float(DRWBatch *batch, const char *name, const float 
*value, int arraysize);
 void DRW_batch_uniform_vec2(DRWBatch *batch, const char *name, const float 
*value, int arraysize);
 void DRW_batch_uniform_vec3(DRWBatch *batch, const char *name, const float 
*value, int arraysize);
@@ -146,17 +164,12 @@ void DRW_batch_uniform_ivec3(DRWBatch *batch, const char 
*name, const int *value
 void DRW_batch_uniform_mat3(DRWBatch *batch, const char *name, const float 
*value);
 void DRW_batch_uniform_mat4(DRWBatch *batch, const char *name, const float 
*value);
 
-/* Passes */
-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)
-       /* TODO GL_BLEND */
-} DRWState;
+/* Geometry Cache */
+struct Batch *DRW_cache_wire_get(Object *ob);
+struct Batch *DRW_cache_surface_get(Object *ob);
+struct Batch *DRW_cache_surface_material_get(Object *ob, int nr);
 
+/* Passes */
 DRWPass *DRW_pass_create(const char *name, DRWState state);
 
 /* Viewport */
@@ -169,7 +182,7 @@ typedef enum {
 void DRW_viewport_init(const bContext *C, void **buffers, void **textures, 
void **passes);
 void DRW_viewport_matrix_get(float mat[4][4], DRWViewportMatrixType type);
 int *DRW_viewport_size_get(void);
-bool DRW_viewport_is_persp(void);
+bool DRW_viewport_is_persp_get(void);
 
 /* Settings */
 void *DRW_material_settings(Material *ma);
diff --git a/source/blender/draw/intern/draw_manager.c 
b/source/blender/draw/intern/draw_manager.c
index 7146a09b4a..567780e30d 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -19,7 +19,7 @@
  *
  */
 
-/** \file blender/draw/viewport_engine.c
+/** \file blender/draw/draw_manager.c
  *  \ingroup draw
  */
 
@@ -41,6 +41,9 @@
 #include "DNA_view3d_types.h" /* hacky */
 #include "DNA_object_types.h" /* hacky */
 #include "view3d_intern.h" /* hacky */
+#include "BKE_DerivedMesh.h" /* hacky */
+
+#include "DNA_mesh_types.h"
 
 #include "GPU_basic_shader.h"
 #include "GPU_batch.h"
@@ -49,7 +52,6 @@
 #include "GPU_framebuffer.h"
 #include "GPU_immediate.h"
 #include "GPU_matrix.h"
-#include "GPU_select.h"
 #include "GPU_shader.h"
 #include "GPU_texture.h"
 #include "GPU_viewport.h"
@@ -66,6 +68,7 @@ extern char datatoc_gpu_shader_basic_vert_glsl[];
 
 /* Structures */
 typedef enum {
+       DRW_UNIFORM_BOOL,
        DRW_UNIFORM_INT,
        DRW_UNIFORM_FLOAT,
        DRW_UNIFORM_TEXTURE,
@@ -91,19 +94,28 @@ struct DRWInterface {
        int projection;
        int modelviewprojection;
        int normal;
+       int eye;
 };
 
 struct DRWPass {
        ListBase batches;
        DRWState state;
+       float state_param; /* Line / Point width */
 };
 
+typedef struct DRWCall {
+       struct DRWCall *next, *prev;
+       struct Batch *geometry;
+       float **obmat;
+} DRWCall;
+
 struct DRWBatch {
        struct DRWBatch *next, *prev;
        struct GPUShader *shader;        /* Shader to bind */
        struct DRWInterface *interface;  /* Uniforms pointers */
        void *storage;                   /* Uniforms values */
-       ListBase objects;                /* (Object *) LinkData->data - List 
with all objects and transform */
+       ListBase call;                   /* List with all geometry and 
transforms */
+       int state;                       /* State changes for this batch only */
 };
 
 /* Render State */
@@ -219,33 +231,6 @@ void DRW_texture_free(GPUTexture *tex)
        GPU_texture_free(tex);
 }
 
-/* ***************************************** BUFFERS 
******************************************/
-
-static void draw_fullscreen(void)
-{
-       if (!fs_quad_init) {
-               glGenBuffers(1, &fs_quad);
-               glBindBuffer(GL_ARRAY_BUFFER, fs_quad);
-               glBufferData(GL_ARRAY_BUFFER, 16 * sizeof(float), NULL, 
GL_STATIC_DRAW);
-               glBufferSubData(GL_ARRAY_BUFFER, 0, 8 * sizeof(float), fs_cos);
-               glBufferSubData(GL_ARRAY_BUFFER, 8 * sizeof(float), 8 * 
sizeof(float), fs_uvs);
-       }
-
-       /* set up quad buffer */
-       glBindBuffer(GL_ARRAY_BUFFER, fs_quad);
-       glVertexPointer(2, GL_FLOAT, 0, NULL);
-       glTexCoordPointer(2, GL_FLOAT, 0, ((GLubyte *)NULL + 8 * 
sizeof(float)));
-       glEnableClientState(GL_VERTEX_ARRAY);
-       glEnableClientState(GL_TEXTURE_COORD_ARRAY);
-
-       /* Draw */
-       glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
-
-       /* Restore */
-       glDisableClientState(GL_VERTEX_ARRAY);
-       glDisableClientState(GL_TEXTURE_COORD_ARRAY);
-       glBindBuffer(GL_ARRAY_BUFFER, 0);
-}
 
 /* ****************************************** SHADERS 
******************************************/
 
@@ -286,6 +271,7 @@ static DRWInterface *

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to