Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2019-03-07 01:53:35 +0300
committerClément Foucault <foucault.clem@gmail.com>2019-03-07 03:38:06 +0300
commite1a62fa1a61167990c4ade74b9e8b56573e18d2d (patch)
tree17c585cbd3aece9d49a6755c2bb525bd9aaadcdf /source/blender/nodes/shader
parenta070815d127e3216ab607d5c44c3d8855ff47fdc (diff)
Fix T62259: RGB Curves behave differently in Cycles and Eevee
This was due to curve being not extrapolated correctly. Also curvemap range was not taken into account.
Diffstat (limited to 'source/blender/nodes/shader')
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_curves.c34
1 files changed, 31 insertions, 3 deletions
diff --git a/source/blender/nodes/shader/nodes/node_shader_curves.c b/source/blender/nodes/shader/nodes/node_shader_curves.c
index 4b89f8d26f8..e4c37636347 100644
--- a/source/blender/nodes/shader/nodes/node_shader_curves.c
+++ b/source/blender/nodes/shader/nodes/node_shader_curves.c
@@ -116,11 +116,39 @@ static int gpu_shader_curve_rgb(GPUMaterial *mat, bNode *node, bNodeExecData *UN
float *array, layer;
int size;
- curvemapping_initialize(node->storage);
- curvemapping_table_RGBA(node->storage, &array, &size);
+ CurveMapping *cumap = node->storage;
+
+ curvemapping_initialize(cumap);
+ curvemapping_table_RGBA(cumap, &array, &size);
GPUNodeLink *tex = GPU_color_band(mat, size, array, &layer);
- return GPU_stack_link(mat, node, "curves_rgb", in, out, tex, GPU_constant(&layer));
+ float ext_rgba[4][4];
+ float range_rgba[4];
+
+ for (int a = 0; a < CM_TOT; ++a) {
+ const CurveMap *cm = &cumap->cm[a];
+ ext_rgba[a][0] = cm->mintable;
+ ext_rgba[a][2] = cm->maxtable;
+ range_rgba[a] = 1.0f / max_ff(1e-8f, cm->maxtable - cm->mintable);
+ /* Compute extrapolation gradients. */
+ if ((cm->flag & CUMA_EXTEND_EXTRAPOLATE) != 0) {
+ ext_rgba[a][1] = (cm->ext_in[0] != 0.0f) ? (cm->ext_in[1] / (cm->ext_in[0] * range_rgba[a])) : 1e8f;
+ ext_rgba[a][3] = (cm->ext_out[0] != 0.0f) ? (cm->ext_out[1] / (cm->ext_out[0] * range_rgba[a])) : 1e8f;
+ }
+ else {
+ ext_rgba[a][1] = 0.0f;
+ ext_rgba[a][3] = 0.0f;
+ }
+ print_v4_id(ext_rgba[a]);
+ }
+
+ return GPU_stack_link(mat, node, "curves_rgb", in, out, tex,
+ GPU_constant(&layer),
+ GPU_uniform(range_rgba),
+ GPU_uniform(ext_rgba[0]),
+ GPU_uniform(ext_rgba[1]),
+ GPU_uniform(ext_rgba[2]),
+ GPU_uniform(ext_rgba[3]));
}
void register_node_type_sh_curve_rgb(void)