[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