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. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to