Commit: 89d99b6b77454e1a238a201d1aef9387e2a16d77
Author: Clément Foucault
Date:   Tue Jan 10 23:10:53 2017 +0100
Branches: clay-engine
https://developer.blender.org/rB89d99b6b77454e1a238a201d1aef9387e2a16d77

Added matcap rotation

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

M       source/blender/blenloader/intern/versioning_280.c
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

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

diff --git a/source/blender/blenloader/intern/versioning_280.c 
b/source/blender/blenloader/intern/versioning_280.c
index 8059aab809..22a0aa5613 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -143,5 +143,18 @@ void blo_do_versions_280(FileData *fd, Library 
*UNUSED(lib), Main *main)
                                BLI_strncpy(scene->collection->name, "Master 
Collection", sizeof(scene->collection->name));
                        }
                }
+
+               /* Clay engine defaults */
+               for (Scene *scene = main->scene.first; scene; scene = 
scene->id.next) {
+                       EngineDataClay *settings = &scene->claydata;
+
+                       settings->matcap_rot = 0.0;
+                       settings->matcap_hue = 0.0;
+                       settings->ssao_distance = 0.2;
+                       settings->ssao_attenuation = 1.0f;
+                       settings->ssao_factor_cavity = 2.0f;
+                       settings->ssao_factor_edge = 2.0f;
+                       settings->ssao_samples = 32;
+               }
        }
 }
diff --git a/source/blender/draw/engines/clay/clay.c 
b/source/blender/draw/engines/clay/clay.c
index f903e55cf3..074fe6db69 100644
--- a/source/blender/draw/engines/clay/clay.c
+++ b/source/blender/draw/engines/clay/clay.c
@@ -51,6 +51,7 @@ static struct CLAY_data {
        /* Matcap textures */
        struct GPUTexture *matcap_array;
        float matcap_colors[24][3];
+       float matcap_rot[2];
        int matcap_id;
 
        /* Ssao */
@@ -110,9 +111,9 @@ static void add_icon_to_rect(PreviewImage *prv, float 
*final_rect, int layer)
                }
        }
 
-       data.matcap_colors[layer][0] /= 16.0f;
-       data.matcap_colors[layer][1] /= 16.0f;
-       data.matcap_colors[layer][2] /= 16.0f;
+       data.matcap_colors[layer][0] /= 16.0f * 2.0f; /* the * 2 is to darken 
for shadows */
+       data.matcap_colors[layer][1] /= 16.0f * 2.0f;
+       data.matcap_colors[layer][2] /= 16.0f * 2.0f;
 }
 
 static struct GPUTexture *load_matcaps(PreviewImage *prv[24], int nbr)
@@ -188,6 +189,7 @@ static struct GPUTexture *create_jitter_texture(void)
        float jitter[64 * 64][2];
        int i;
 
+       /* TODO replace by something more evenly distributed like blue noise */
        for (i = 0; i < 64 * 64; i++) {
                jitter[i][0] = 2.0f * BLI_frand() - 1.0f;
                jitter[i][1] = 2.0f * BLI_frand() - 1.0f;
@@ -252,8 +254,10 @@ static void clay_engine_init(void)
        if (!data.clay_sh) {
                const char *defines =
                        "#define USE_AO;\n"
-                       "//#define USE_ROTATION;\n";
+                       "#define USE_ROTATION;\n";
 
+               /* TODO Optimisation : Create shader combinations and bind the 
right 
+                * shader depending on the material settings */
                data.clay_sh = DRW_shader_create(datatoc_clay_vert_glsl, NULL, 
datatoc_clay_frag_glsl, defines);
        }
 }
@@ -298,7 +302,7 @@ static void clay_populate_passes(CLAY_PassList *passes, 
const struct bContext *C
                DRW_batch_uniform_buffer(batch, "depthtex", SCENE_DEPTH, 
depthloc);
                DRW_batch_uniform_texture(batch, "matcaps", data.matcap_array, 
matcaploc);
                DRW_batch_uniform_vec3(batch, "matcaps_color", (float 
*)data.matcap_colors, 24);
-               DRW_batch_uniform_vec3(batch, "matcaps_color", (float 
*)data.matcap_colors, 24);
+               DRW_batch_uniform_vec2(batch, "matcap_rotation", (float 
*)data.matcap_rot, 1);
                DRW_batch_uniform_int(batch, "matcap_index", &data.matcap_id, 
1);
 
                /* SSAO */
@@ -313,23 +317,46 @@ static void clay_populate_passes(CLAY_PassList *passes, 
const struct bContext *C
                pop_clay = true;
        }
 
-       Object *ob;
-       FOREACH_OBJECT(sl, ob)
+       /* Update default material */
        {
-               /* Create hash table of batch based on material id*/
+               EngineDataClay *settings = DRW_render_settings();
 
-               /* Add everything for now */
-               if (pop_clay) {
-                       DRW_batch_add_surface(matcapbatch, ob);
-               }
+               data.matcap_rot[0] = cosf(settings->matcap_rot * 3.14159f * 
2.0f);
+               data.matcap_rot[1] = sinf(settings->matcap_rot * 3.14159f * 
2.0f);
 
-               if (pop_depth) {
-                       DRW_batch_add_surface(depthbatch, ob);
-               }
+               data.ssao_params_var[0] = settings->ssao_distance;
+               data.ssao_params_var[1] = settings->ssao_factor_cavity;
+               data.ssao_params_var[2] = settings->ssao_factor_edge;
+               data.ssao_params_var[3] = settings->ssao_attenuation;
+       }
+
+       static bool first = true;
+       if (first) {
+               first = false;
+
+               /* TODO Why this is crashing? we want to start from an empty 
list
+                * Seems like ob genericNode (see below) is freed two times */
+               // DRW_batch_surface_clear(matcapbatch);
+               // DRW_batch_surface_clear(depthbatch);
 
-               /* Free hash table */
+               Object *ob;
+               FOREACH_OBJECT(sl, ob)
+               {
+                       /* Create hash table of batch based on material id*/
+
+                       /* Add everything for now */
+                       if (pop_clay) {
+                               DRW_batch_surface_add(matcapbatch, ob);
+                       }
+
+                       if (pop_depth) {
+                               DRW_batch_surface_add(depthbatch, ob);
+                       }
+
+                       /* Free hash table */
+               }
+               FOREACH_OBJECT_END
        }
-       FOREACH_OBJECT_END
 }
 
 static void clay_ssao_setup(void)
@@ -349,11 +376,6 @@ static void clay_ssao_setup(void)
 
        DRW_get_dfdy_factors(dfdyfacs);
 
-       data.ssao_params_var[0] = settings->ssao_distance;
-       data.ssao_params_var[1] = settings->ssao_factor_cavity;
-       data.ssao_params_var[2] = settings->ssao_factor_edge;
-       data.ssao_params_var[3] = settings->ssao_attenuation;
-
        data.ssao_params[0] = settings->ssao_samples;
        data.ssao_params[1] = size[0] / 64.0;
        data.ssao_params[2] = size[1] / 64.0;
@@ -414,11 +436,7 @@ 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 */
-       static bool first = true;
-       if (first) {
-               first = false;
-               clay_populate_passes(passes, context);
-       }
+       clay_populate_passes(passes, context);
 
        DRW_draw_background();
 
diff --git a/source/blender/draw/engines/clay/shaders/clay_frag.glsl 
b/source/blender/draw/engines/clay/shaders/clay_frag.glsl
index f40fe63db2..d79cc615ab 100644
--- a/source/blender/draw/engines/clay/shaders/clay_frag.glsl
+++ b/source/blender/draw/engines/clay/shaders/clay_frag.glsl
@@ -51,6 +51,7 @@ vec3 get_view_space_from_depth(in vec2 uvcoords, in vec3 
viewvec_origin, in vec3
        return zview * (viewvec_origin + vec3(uvcoords, 0.0) * viewvec_diff);
 }
 
+/* TODO remove this when switching to geometric normals */
 vec3 calculate_view_space_normal(in vec3 viewposition)
 {
        vec3 normal = cross(normalize(dFdx(viewposition)), dfdy_sign * 
normalize(dFdy(viewposition)));
@@ -58,6 +59,7 @@ vec3 calculate_view_space_normal(in vec3 viewposition)
        return normalize(normal);
 }
 
+#ifdef USE_AO
 void calculate_ssao_factor(in float depth, in vec3 normal, in vec3 position, 
out float cavities, out float edges)
 {
        vec2 uvs = vec2(gl_FragCoord.xy) / vec2(screenres);
@@ -118,7 +120,7 @@ void calculate_ssao_factor(in float depth, in vec3 normal, 
in vec3 position, out
        cavities = clamp(cavities * ssao_factor_cavity, 0.0, 0.85);
        edges = edges * ssao_factor_edge;
 }
-
+#endif
 
 void main() {
        vec2 uvs = vec2(gl_FragCoord.xy) / vec2(screenres);
@@ -133,11 +135,12 @@ void main() {
        if (gl_FragCoord.z > depth + 1e-5)
                discard;
 
-       vec2 texco = abs(normal.xy * .49 + 0.5);
 #ifdef USE_ROTATION
        /* Rotate texture coordinates */
-       vec2 rotY = vec2(-matcap_roation.y, matcap_roation.x);
-       texco = vec2(dot(texco, matcap_roation), dot(texco, rotY));
+       vec2 rotY = vec2(-matcap_rotation.y, matcap_rotation.x);
+       vec2 texco = abs(vec2(dot(normal.xy, matcap_rotation), dot(normal.xy, 
rotY)) * .49 + 0.5);
+#else
+       vec2 texco = abs(normal.xy * .49 + 0.5);
 #endif
        vec3 col = texture(matcaps, vec3(texco, float(matcap_index))).rgb;
 
@@ -145,7 +148,7 @@ void main() {
        float cavity, edges;
        calculate_ssao_factor(depth, normal, position, cavity, edges);
 
-       col = mix(col, matcaps_color[int(matcap_index)] * 0.5, cavity);
+       col = mix(col, matcaps_color[int(matcap_index)], cavity);
        col *= edges + 1.0;
 #endif
 
diff --git a/source/blender/draw/intern/DRW_render.h 
b/source/blender/draw/intern/DRW_render.h
index 47af819195..5a3835b8ee 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -131,7 +131,8 @@ void DRW_shader_free(struct GPUShader *shader);
 /* Batches */
 DRWBatch *DRW_batch_create(struct GPUShader *shader, DRWPass *pass);
 void DRW_batch_free(struct DRWBatch *batch);
-void DRW_batch_add_surface(DRWBatch *batch, struct Object *ob);
+void DRW_batch_surface_add(DRWBatch *batch, struct Object *ob);
+void DRW_batch_surface_clear(DRWBatch *batch);
 
 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);
diff --git a/source/blender/draw/intern/draw_manager.c 
b/source/blender/draw/intern/draw_manager.c
index 86ff210908..3576ff312a 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -345,11 +345,20 @@ void DRW_batch_free(struct DRWBatch *batch)
 }
 
 /* Later use VBO */
-void DRW_batch_add_surface(DRWBatch *batch, Object *ob)
+void DRW_batch_surface_add(DRWBatch *batch, Object *ob)
 {
        BLI_addtail(&batch->objects, BLI_genericNodeN(ob));
 }
 
+void DRW_batch_surface_clear(DRWBatch *batch)
+{
+       for (LinkData *link = batch->objects.first; link; link = link->next) {
+               MEM_freeN(link->data);
+       }
+       BLI_freelistN(&batch->objects);
+       //BLI_listbase_clear(&batch->objects);
+}
+
 void DRW_batch_uniform_texture(DRWBatch *batch, const char *name, const 
GPUTexture *tex, int loc)
 {
        DRW_interface_uniform(batch, name, DRW_UNIFORM_TEXTURE, tex, 0, 0, loc);

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

Reply via email to