[Bf-blender-cvs] [33ca692256] clay-engine: Added object mode wires to new drawing pipeline.

Clément Foucault noreply at git.blender.org
Fri Jan 13 18:25:58 CET 2017


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. @@




More information about the Bf-blender-cvs mailing list