[Bf-blender-cvs] [fe0df0a] clay-engine: 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
Clément Foucault
noreply at git.blender.org
Tue Jan 3 11:58:35 CET 2017
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 <foucault.clem at gmail.com>
===================================================================
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. @@
More information about the Bf-blender-cvs
mailing list