Commit: fe0df0a9729bbb43d9603672ca7aab927a800579
Author: Clément Foucault
Date:   Tue Jan 3 10:44:24 2017 +0100
Branches: clay-engine
https://developer.blender.org/rBfe0df0a9729bbb43d9603672ca7aab927a800579

Beginning Clay Viewport Engine :
- Added temporary draw_mesh function to render edit mesh
- DRW_draw_batch_list allows to render a list of objects with optimal state 
change
- All viewport rendering is done offscreen for the moment

Signed-off-by: Clément Foucault <[email protected]>

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

M       build_files/cmake/macros.cmake
M       source/blender/CMakeLists.txt
M       source/blender/draw/CMakeLists.txt
A       source/blender/draw/DRW_engine.h
D       source/blender/draw/DRW_engines.h
A       source/blender/draw/engines/clay/clay.c
R086    source/blender/draw/DRW_defines.h       
source/blender/draw/engines/clay/clay.h
A       source/blender/draw/engines/clay/shaders/clay_debug_frag.glsl
A       source/blender/draw/engines/clay/shaders/clay_downsample_depth_frag.glsl
A       source/blender/draw/engines/clay/shaders/clay_frag.glsl
A       source/blender/draw/engines/clay/shaders/clay_vert.glsl
A       source/blender/draw/intern/DRW_render.h
A       source/blender/draw/intern/draw_manager.c
M       source/blender/editors/space_view3d/drawobject.c
M       source/blender/editors/space_view3d/view3d_draw.c
M       source/blender/editors/space_view3d/view3d_intern.h
M       source/blender/gpu/GPU_framebuffer.h
M       source/blender/gpu/GPU_shader.h
M       source/blender/gpu/GPU_viewport.h
M       source/blender/gpu/gawain/batch.c
M       source/blender/gpu/gawain/batch.h
M       source/blender/gpu/intern/gpu_framebuffer.c
M       source/blender/gpu/intern/gpu_shader.c
M       source/blender/gpu/intern/gpu_viewport.c
M       source/blender/render/CMakeLists.txt
M       source/blender/render/extern/include/RE_engine.h
M       source/blender/render/intern/source/external_engine.c

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

diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake
index 2e3a190..8bb989f 100644
--- a/build_files/cmake/macros.cmake
+++ b/build_files/cmake/macros.cmake
@@ -604,6 +604,7 @@ function(SETUP_BLENDER_SORTED_LIBS)
                bf_modifiers
                bf_bmesh
                bf_gpu
+               bf_draw
                bf_blenloader
                bf_blenkernel
                bf_physics
diff --git a/source/blender/CMakeLists.txt b/source/blender/CMakeLists.txt
index d49ceb1..057789b 100644
--- a/source/blender/CMakeLists.txt
+++ b/source/blender/CMakeLists.txt
@@ -98,6 +98,7 @@ add_subdirectory(windowmanager)
 add_subdirectory(blenkernel)
 add_subdirectory(blenlib)
 add_subdirectory(bmesh)
+add_subdirectory(draw)
 add_subdirectory(render)
 add_subdirectory(blenfont)
 add_subdirectory(blentranslation)
diff --git a/source/blender/draw/CMakeLists.txt 
b/source/blender/draw/CMakeLists.txt
index 60449eb..dceb487 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -26,23 +26,23 @@
 set(INC
        .
        intern
-       nodes
-       operations
+       engines/clay
+
        ../blenkernel
        ../blenlib
        ../blentranslation
        ../imbuf
+       ../depsgraph
        ../makesdna
        ../makesrna
-       ../windowmanager
-       ../nodes
-       ../nodes/composite
-       ../nodes/intern
+       ../gpu
+       ../editors/include
+       ../editors/space_view3d
        ../render/extern/include
        ../render/intern/include
-       ../../../extern/clew/include
+
+       ../../../intern/glew-mx
        ../../../intern/guardedalloc
-       ../../../intern/atomic
 )
 
 set(INC_SYS
@@ -50,13 +50,21 @@ set(INC_SYS
 )
 
 set(SRC
-       DRW_defines.h
+       intern/draw_manager.c
+       engines/clay/clay.c
+
+       intern/DRW_render.h
+       engines/clay/clay.h
 
+       ./DRW_engine.h
 )
 
+data_to_c_simple(engines/clay/shaders/clay_frag.glsl SRC)
+data_to_c_simple(engines/clay/shaders/clay_vert.glsl SRC)
+data_to_c_simple(engines/clay/shaders/clay_downsample_depth_frag.glsl SRC)
+data_to_c_simple(engines/clay/shaders/clay_debug_frag.glsl SRC)
+
 list(APPEND INC
 )
 
-endif()
-
 blender_add_lib(bf_draw "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/source/blender/draw/DRW_defines.h 
b/source/blender/draw/DRW_engine.h
similarity index 55%
copy from source/blender/draw/DRW_defines.h
copy to source/blender/draw/DRW_engine.h
index 212c39e..a35c5df 100644
--- a/source/blender/draw/DRW_defines.h
+++ b/source/blender/draw/DRW_engine.h
@@ -19,7 +19,41 @@
  *
  */
 
-#ifndef __DRW_DEFINES_H__
-#define __DRW_DEFINES_H__
+/** \file DRW_engine.h
+ *  \ingroup draw
+ */
+
+#ifndef __DRW_ENGINE_H__
+#define __DRW_ENGINE_H__
+
+typedef enum {
+       DRW_UNIFORM_INT,
+       DRW_UNIFORM_FLOAT,
+       DRW_UNIFORM_TEXTURE,
+       DRW_UNIFORM_BUFFER,
+       DRW_UNIFORM_MAT3,
+       DRW_UNIFORM_MAT4
+} DRWUniformType;
+
+typedef struct DRWUniform {
+       struct DRWUniform *next, *prev;
+       DRWUniformType type;
+       int location;
+       int length;
+       int arraysize;
+       int bindloc;
+       const void *value;
+} DRWUniform;
+
+typedef struct DRWInterface {
+       ListBase uniforms;
+       /* matrices */
+       int modelview;
+       int projection;
+       int modelviewprojection;
+       int normal;
+} DRWInterface;
+
+void DRW_viewport_engine_init(void);
 
-#endif  /* __DRW_DEFINES_H__ */
+#endif /* __DRW_ENGINE_H__ */
\ No newline at end of file
diff --git a/source/blender/draw/DRW_engines.h 
b/source/blender/draw/DRW_engines.h
deleted file mode 100644
index e69de29..0000000
diff --git a/source/blender/draw/engines/clay/clay.c 
b/source/blender/draw/engines/clay/clay.c
new file mode 100644
index 0000000..aab9a85
--- /dev/null
+++ b/source/blender/draw/engines/clay/clay.c
@@ -0,0 +1,217 @@
+/*
+ * Copyright 2016, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Blender Institute
+ *
+ */
+
+#include "DRW_render.h"
+
+#include "clay.h"
+
+/* Shaders */
+
+extern char datatoc_clay_frag_glsl[];
+extern char datatoc_clay_vert_glsl[];
+extern char datatoc_clay_downsample_depth_frag_glsl[];
+extern char datatoc_clay_debug_frag_glsl[];
+
+
+/* Storage */
+
+static struct CLAY_data {
+       /* Depth Pre Pass */
+       struct DRWPass *depth_pass;
+       struct GPUShader *depth_shader;
+       struct DRWInterface *depth_interface;
+       /* Depth Downsample Pass */
+       struct DRWPass *downsample_pass;
+       struct GPUShader *downsample_shader;
+       struct DRWInterface *downsample_interface;
+       /* Shading Pass */
+       struct DRWPass *clay_pass;
+       struct GPUShader *clay_shader;
+       struct DRWInterface *clay_interface;
+
+       /* Debug Pass */
+       struct DRWPass *debug_pass;
+       struct GPUShader *debug_shader;
+       struct DRWInterface *debug_interface;
+} data = {NULL};
+
+/* keep it under MAX_BUFFERS */
+typedef struct CLAY_FramebufferList{
+       /* default */
+       struct GPUFrameBuffer *default_fb;
+       /* engine specific */
+       struct GPUFrameBuffer *downsample_depth;
+} CLAY_FramebufferList;
+
+/* keep it under MAX_TEXTURES */
+typedef struct CLAY_TextureList{
+       /* default */
+       struct GPUTexture *color;
+       struct GPUTexture *depth;
+       /* engine specific */
+       struct GPUTexture *depth_low;
+} CLAY_TextureList;
+
+/* for clarity follow the same layout as TextureList */
+#define SCENE_COLOR 0
+#define SCENE_DEPTH 1
+#define SCENE_DEPTH_LOW 2
+
+/* Functions */
+
+static void clay_init_engine(void)
+{
+       DRWBatch *batch;
+
+       /* Depth prepass */
+       {
+               data.depth_shader = DRW_shader_create_3D_depth_only();
+               data.depth_interface = DRW_interface_create(data.depth_shader);
+
+               data.depth_pass = (DRWPass *)MEM_callocN(sizeof(DRWPass), 
"DRWPass depth_pass");
+               data.depth_pass->state = DRW_STATE_WRITE_DEPTH | 
DRW_STATE_DEPTH_LESS;
+
+               batch = (DRWBatch *)MEM_callocN(sizeof(DRWBatch), "DRWBatch");
+               batch->shader = data.depth_shader;
+               batch->interface = data.depth_interface;
+               BLI_addtail(&data.depth_pass->batches, batch);
+       }
+
+       /* Downsample pass */
+       {
+               data.downsample_shader = 
DRW_shader_create_2D(datatoc_clay_downsample_depth_frag_glsl, NULL);
+               data.downsample_interface = 
DRW_interface_create(data.downsample_shader);
+               DRW_interface_uniform_int(data.downsample_shader, 
data.downsample_interface, "screenres", DRW_get_viewport_size(), 2);
+               DRW_interface_uniform_buffer(data.downsample_shader, 
data.downsample_interface, "depthtex", SCENE_DEPTH, 0);
+
+               data.downsample_pass = (DRWPass *)MEM_callocN(sizeof(DRWPass), 
"DRWPass downsample_pass");
+               data.downsample_pass->state = DRW_STATE_WRITE_DEPTH | 
DRW_STATE_WRITE_COLOR;
+
+               batch = (DRWBatch *)MEM_callocN(sizeof(DRWBatch), "DRWBatch");
+               batch->shader = data.downsample_shader;
+               batch->interface = data.downsample_interface;           
+               BLI_addtail(&data.downsample_pass->batches, batch);             
+       }
+
+       /* Shading pass */
+       {
+               data.clay_shader = DRW_shader_create(datatoc_clay_vert_glsl, 
NULL, datatoc_clay_frag_glsl, NULL);
+               data.clay_interface = DRW_interface_create(data.clay_shader);
+               //DRW_interface_uniform_int(data.clay_shader, 
data.clay_interface, "screenres", DRW_get_viewport_size(), 2);
+               //DRW_interface_uniform_float(data.clay_shader, 
data.clay_interface, "color", col, 4);
+
+               data.clay_pass = (DRWPass *)MEM_callocN(sizeof(DRWPass), 
"DRWPass clay_pass");
+               data.clay_pass->state = DRW_STATE_WRITE_COLOR | 
DRW_STATE_DEPTH_EQUAL;
+
+               batch = (DRWBatch *)MEM_callocN(sizeof(DRWBatch), "DRWBatch");
+               batch->shader = data.clay_shader;
+               batch->interface = data.clay_interface;
+               BLI_addtail(&data.clay_pass->batches, batch);           
+       }
+
+       /* Debug */
+       {
+               data.debug_shader = 
DRW_shader_create_2D(datatoc_clay_debug_frag_glsl, NULL);
+               data.debug_interface = DRW_interface_create(data.debug_shader);
+               DRW_interface_uniform_int(data.debug_shader, 
data.debug_interface, "screenres", DRW_get_viewport_size(), 2);
+               DRW_interface_uniform_buffer(data.debug_shader, 
data.debug_interface, "depthtex", SCENE_DEPTH_LOW, 0);
+
+               data.debug_pass = (DRWPass *)MEM_callocN(sizeof(DRWPass), 
"DRWPass debug_pass");
+               data.debug_pass->state = DRW_STATE_WRITE_COLOR;
+
+               batch = (DRWBatch *)MEM_callocN(sizeof(DRWBatch), "DRWBatch");
+               batch->shader = data.debug_shader;
+               batch->interface = data.debug_interface;
+               BLI_addtail(&data.debug_pass->batches, batch);          
+       }
+}
+
+static void clay_init_view(CLAY_FramebufferList *buffers, CLAY_TextureList 
*textures)
+{
+       int *viewsize = DRW_get_viewport_size();
+
+       DRWFboTexture depth = {&textures->depth_low, DRW_BUF_R_16};
+
+       DRW_framebuffer_init(&buffers->downsample_depth, viewsize[0]/2, 
viewsize[1]/2, &depth, 1);
+}
+
+static void clay_populate_batch(const struct bContext *C)
+{
+       Scene *scene = CTX_data_scene(C);
+       Scene *sce_iter;
+       Base *base;
+       DRWBatch *matcapbatch = data.clay_pass->batches.first;
+       DRWBatch *depthbatch = data.depth_pass->batches.first;
+
+       for (SETLOOPER(scene, sce_iter, base)) {
+               /* Add everything for now */
+               BLI_addtail(&matcapbatch->objects, base);
+               BLI_addtail(&depthbatch->objects, base);
+       }
+}
+
+static void clay_view_draw(RenderEngine *UNUSED(engine), const struct bContext 
*context)
+{
+       /* This function may run for multiple viewports
+        * so get the current viewport buffers */
+       CLAY_FramebufferList *buffers = NULL;
+       CLAY_TextureList *textures = NULL;
+
+       DRW_init_viewport(context, (void **)&buffers, (void **)&textures);
+       
+       if (!data.clay_shader)
+               clay_init_engine();
+
+       clay_init_view(buffers, textures);
+
+       /* TODO : tag to refresh by the deps graph */
+       /* ideally only refresh when objects are added/removed */
+       /* or render properties / materials change */
+       static bool first = true;
+       if (first) {
+               first = false;
+               clay_populate_batch(context);
+       }
+
+       DRW_draw_background();
+
+       /* Step 1 : Depth pre-pass */
+       DRW_draw_pass(data.depth_pass, context);
+
+       /* Step 2 : downsample the depth buffer to a new buffer */
+       DRW_framebuffer_bind(buffers->downsample_depth);
+       DRW_draw_pa

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to