[Bf-blender-cvs] [89d99b6b77] clay-engine: Added matcap rotation
ClÃÂément Foucault
noreply at git.blender.org
Tue Jan 10 23:59:58 CET 2017
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);
More information about the Bf-blender-cvs
mailing list