[Bf-blender-cvs] [00c3c6824d] clay-engine: Integrated MBC functions. Added Object centers and empties.
Clément Foucault
noreply at git.blender.org
Thu Jan 26 15:57:46 CET 2017
Commit: 00c3c6824d6304ffbb3d858fa936edc2c1c4c2fa
Author: Clément Foucault
Date: Thu Jan 26 15:56:40 2017 +0100
Branches: clay-engine
https://developer.blender.org/rB00c3c6824d6304ffbb3d858fa936edc2c1c4c2fa
Integrated MBC functions. Added Object centers and empties.
===================================================================
M source/blender/draw/CMakeLists.txt
M source/blender/draw/DRW_engine.h
M source/blender/draw/engines/clay/clay.c
M source/blender/draw/engines/clay/shaders/clay_frag.glsl
M source/blender/draw/engines/clay/shaders/ssao_groundtruth.glsl
M source/blender/draw/intern/DRW_render.h
A source/blender/draw/intern/draw_cache.c
A source/blender/draw/intern/draw_cache.h
M source/blender/draw/intern/draw_manager.c
M source/blender/draw/intern/draw_mode_pass.c
M source/blender/draw/intern/draw_mode_pass.h
M source/blender/editors/space_view3d/view3d_draw.c
M source/blender/editors/space_view3d/view3d_intern.h
M source/blender/gpu/intern/gpu_viewport.c
===================================================================
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 1aababc350..4cc69c0ea0 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -52,10 +52,12 @@ set(INC_SYS
set(SRC
intern/draw_manager.c
intern/draw_mode_pass.c
+ intern/draw_cache.c
engines/clay/clay.c
intern/DRW_render.h
intern/draw_mode_pass.h
+ intern/draw_cache.h
engines/clay/clay.h
./DRW_engine.h
diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h
index 43e0657e4d..ad05cf625f 100644
--- a/source/blender/draw/DRW_engine.h
+++ b/source/blender/draw/DRW_engine.h
@@ -31,6 +31,7 @@ struct DRWPass;
void DRW_engines_init(void);
void DRW_engines_free(void);
+/* This is here because GPUViewport needs it */
void DRW_pass_free(struct DRWPass *pass);
#endif /* __DRW_ENGINE_H__ */
\ No newline at end of file
diff --git a/source/blender/draw/engines/clay/clay.c b/source/blender/draw/engines/clay/clay.c
index 459a413454..a6b6fc95d5 100644
--- a/source/blender/draw/engines/clay/clay.c
+++ b/source/blender/draw/engines/clay/clay.c
@@ -113,8 +113,10 @@ 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;
+ struct DRWPass *wire_overlay_pass;
+ struct DRWPass *wire_outline_pass;
+ struct DRWPass *non_meshes_pass;
+ struct DRWPass *ob_center_pass;
} CLAY_PassList;
//#define GTAO
@@ -312,6 +314,57 @@ static void CLAY_engine_init(void)
}
}
+static void CLAY_ssao_setup(void)
+{
+ float invproj[4][4];
+ float dfdyfacs[2];
+ 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},
+ {1.0f, -1.0f, -1.0f, 1.0f},
+ {-1.0f, 1.0f, -1.0f, 1.0f}
+ };
+ int i;
+ float *size = DRW_viewport_size_get();
+ EngineDataClay *settings = DRW_render_settings();
+
+ DRW_get_dfdy_factors(dfdyfacs);
+
+ data.ssao_params[0] = settings->ssao_samples;
+ data.ssao_params[1] = size[0] / 64.0;
+ data.ssao_params[2] = size[1] / 64.0;
+ data.ssao_params[3] = dfdyfacs[1]; /* dfdy sign for offscreen */
+
+ /* invert the view matrix */
+ DRW_viewport_matrix_get(data.winmat, DRW_MAT_WIN);
+ invert_m4_m4(invproj, data.winmat);
+
+ /* convert the view vectors to view space */
+ for (i = 0; i < 3; i++) {
+ mul_m4_v4(invproj, viewvecs[i]);
+ /* normalized trick see http://www.derschmale.com/2014/01/26/reconstructing-positions-from-the-depth-buffer */
+ mul_v3_fl(viewvecs[i], 1.0f / viewvecs[i][3]);
+ if (is_persp)
+ mul_v3_fl(viewvecs[i], 1.0f / viewvecs[i][2]);
+ viewvecs[i][3] = 1.0;
+
+ copy_v4_v4(data.viewvecs[i], viewvecs[i]);
+ }
+
+ /* we need to store the differences */
+ data.viewvecs[1][0] -= data.viewvecs[0][0];
+ data.viewvecs[1][1] = data.viewvecs[2][1] - data.viewvecs[0][1];
+
+ /* calculate a depth offset as well */
+ if (!is_persp) {
+ float vec_far[] = {-1.0f, -1.0f, 1.0f, 1.0f};
+ mul_m4_v4(invproj, vec_far);
+ mul_v3_fl(vec_far, 1.0f / vec_far[3]);
+ data.viewvecs[1][2] = vec_far[2] - data.viewvecs[0][2];
+ }
+}
+
static DRWShadingGroup *CLAY_shgroup_create(DRWPass *pass, int *material_id)
{
const int depthloc = 0, matcaploc = 1, jitterloc = 2, sampleloc = 3;
@@ -319,7 +372,7 @@ static DRWShadingGroup *CLAY_shgroup_create(DRWPass *pass, int *material_id)
CLAY_UBO_Material *mat = &data.mat_storage.materials[0];
DRWShadingGroup *grp = DRW_shgroup_create(data.clay_sh, pass);
- DRW_shgroup_uniform_ivec2(grp, "screenres", DRW_viewport_size_get(), 1);
+ DRW_shgroup_uniform_vec2(grp, "screenres", DRW_viewport_size_get(), 1);
DRW_shgroup_uniform_buffer(grp, "depthtex", SCENE_DEPTH, depthloc);
DRW_shgroup_uniform_texture(grp, "matcaps", data.matcap_array, matcaploc);
DRW_shgroup_uniform_mat4(grp, "WinMatrix", (float *)data.winmat);
@@ -463,84 +516,50 @@ static void CLAY_create_cache(CLAY_PassList *passes, const struct bContext *C)
/* Object Mode */
{
- DRW_mode_object_setup(&passes->mode_ob_wire_pass, &passes->mode_ob_center_pass);
+ DRW_pass_setup_common(&passes->wire_overlay_pass,
+ &passes->wire_outline_pass,
+ &passes->non_meshes_pass,
+ &passes->ob_center_pass);
}
/* TODO Create hash table of batch based on material id*/
FOREACH_OBJECT(sl, ob)
{
- if (ob->type == OB_MESH) {
- struct Batch *geom = DRW_cache_surface_get(ob);
-
- /* Add everything for now */
- DRW_shgroup_call_add(default_shgrp, 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 */
-
- DRW_shgroup_call_add(depthbatch, geom, &ob->obmat);
-
- /* Free hash table */
-
- DRW_mode_object_add(passes->mode_ob_wire_pass, passes->mode_ob_center_pass, ob);
+ struct Batch *geom;
+
+ switch (ob->type) {
+ case OB_MESH:
+ geom = DRW_cache_surface_get(ob);
+
+ /* Add everything for now */
+ DRW_shgroup_call_add(depthbatch, geom, &ob->obmat);
+ DRW_shgroup_call_add(default_shgrp, 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 */
+
+ /* Free hash table */
+ break;
+ case OB_LAMP:
+ case OB_CAMERA:
+ case OB_EMPTY:
+ default:
+ DRW_shgroup_non_meshes(passes->non_meshes_pass, ob);
+ break;
}
- }
- FOREACH_OBJECT_END
-}
-
-static void CLAY_ssao_setup(void)
-{
- float invproj[4][4];
- float dfdyfacs[2];
- 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},
- {1.0f, -1.0f, -1.0f, 1.0f},
- {-1.0f, 1.0f, -1.0f, 1.0f}
- };
- int i;
- int *size = DRW_viewport_size_get();
- EngineDataClay *settings = DRW_render_settings();
-
- DRW_get_dfdy_factors(dfdyfacs);
-
- data.ssao_params[0] = settings->ssao_samples;
- data.ssao_params[1] = size[0] / 64.0;
- data.ssao_params[2] = size[1] / 64.0;
- data.ssao_params[3] = dfdyfacs[1]; /* dfdy sign for offscreen */
- /* invert the view matrix */
- DRW_viewport_matrix_get(data.winmat, DRW_MAT_WIN);
- invert_m4_m4(invproj, data.winmat);
-
- /* convert the view vectors to view space */
- for (i = 0; i < 3; i++) {
- mul_m4_v4(invproj, viewvecs[i]);
- /* normalized trick see http://www.derschmale.com/2014/01/26/reconstructing-positions-from-the-depth-buffer */
- mul_v3_fl(viewvecs[i], 1.0f / viewvecs[i][3]);
- if (is_persp)
- mul_v3_fl(viewvecs[i], 1.0f / viewvecs[i][2]);
- viewvecs[i][3] = 1.0;
-
- copy_v4_v4(data.viewvecs[i], viewvecs[i]);
+ /* Add all object center for now */
+ DRW_shgroup_object_center(passes->ob_center_pass, ob);
}
+ FOREACH_OBJECT_END
- /* we need to store the differences */
- data.viewvecs[1][0] -= data.viewvecs[0][0];
- data.viewvecs[1][1] = data.viewvecs[2][1] - data.viewvecs[0][1];
-
- /* calculate a depth offset as well */
- if (!is_persp) {
- float vec_far[] = {-1.0f, -1.0f, 1.0f, 1.0f};
- mul_m4_v4(invproj, vec_far);
- mul_v3_fl(vec_far, 1.0f / vec_far[3]);
- data.viewvecs[1][2] = vec_far[2] - data.viewvecs[0][2];
- }
+ /* Optimization */
+ // DRWShadingGroup *shgrp = DRW_pass_nth_shgroup_get(passes->ob_center_pass, 0);
+ // DRW_shgroup_batch_calls_object_center(shgrp);
}
static void CLAY_view_draw(RenderEngine *UNUSED(engine), const struct bContext *context)
@@ -560,7 +579,11 @@ static void CLAY_view_draw(RenderEngine *UNUSED(engine), const struct bContext *
/* TODO : tag to refresh by the deps graph */
/* ideally only refresh when objects are added/removed */
/* or render properties / materials change */
- if (DRW_viewport_cache_is_dirty()) {
+ //static bool once = false;
+ if (DRW_viewport_cache_is_dirty()
+ //&& !once
+ ) {
+ //once = true;
CLAY_create_cache(passes, context);
}
@@ -580,7 +603,8 @@ static void CLAY_view_draw(RenderEngine *UNUSED(engine), const struct bContext *
/* Pass 4 : Overlays */
DRW_framebuffer_texture_attach(buffers->default_fb, textures->depth, 0);
- DRW_draw_pass(passes->mode_ob_wire_pass);
+ DRW_draw_pass(passes->non_meshes_pass);
+ DRW_draw_pass(passes->ob_center_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 be10f0d509..d9b372b652 100644
--- a/source/blender/draw/engines/clay/shaders/clay_frag.glsl
+++ b/source/blender/draw/engines/clay/shaders/clay_frag.glsl
@@ -1,4 +1,4 @@
-uniform ivec2 screenres;
+uniform vec2 screenres;
uniform sampler2D depthtex;
uniform mat4 WinMatrix;
@@ -164,7 +164,7 @@ void ssao_factors(in float depth, in vec3 normal, in vec3 position, in vec2 scre
#endif
void main() {
- vec2 screenco = vec2(gl_FragCoord.xy) / vec2(screenres);
+ vec2 screenco = vec2(gl_FragCoord.xy) / screenres;
float depth = texture(depthtex, screenco).r;
vec3 position = get_view_space_from_depth(screenco, depth);
diff --git a/source/blender/draw/engines/clay/shaders/ssao_groundtruth.glsl b/source/blender/draw/engines/clay/shaders/ssao_groundtruth.glsl
index f4f6a4259f..2f29624824 100644
--- a/source/blender/draw/engines/clay/shaders/ssao_groundtruth.glsl
+++ b/source/blender/draw/engines/clay/shaders/ssao_groundtruth.glsl
@@ -67,8 +67,8 @@ void ssao_factors(in float depth, in vec3 normal, in vec3 position, in vec2 scre
const float phi_step = 16.0;
const float theta_step = 16.0;
const float m_pi = 3.14159265358979323846;
- vec2 pixel_ratio = vec2(float(screenres.y) / float(screenres.x), 1.0);
- vec2 pixel_size = vec2(1.0) / vec2(screenres.xy);
+ vec2 pixel_ratio = vec2(screenres.y / screenres.x, 1.0);
+ vec2 pixel_size = vec2(1.0) / screenres.xy;
float min_stride = length(pixel_size);
float homcco = WinMatrix[2][3] * position.z + WinMatrix[3][3];
float n
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list