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