[Bf-blender-cvs] [2e6159a4948] master: Curve: CurveMapping Extend Option

Jeroen Bakker noreply at git.blender.org
Wed Nov 27 16:06:34 CET 2019


Commit: 2e6159a4948cd0f4e0b636734bfe506796bd87f2
Author: Jeroen Bakker
Date:   Fri Nov 1 12:09:55 2019 +0100
Branches: master
https://developer.blender.org/rB2e6159a4948cd0f4e0b636734bfe506796bd87f2

Curve: CurveMapping Extend Option

Extend options are currently stored per curve. This was not clearly
communicated to the user and they expected this to be a setting per
CurveMapping.

This change will move the option from `Curve` to `CurveMapping`. In
order to support this the API had to be changed.

BPY: CurveMap.evaluate is also moved to CurveMapping.evaluate what
breaks Python API. Cycles has been updated but other add-ons have
not. After release of 2.81 we can merge this to master and adapt
the add-ons.

Reviewed By: campbellbarton

Differential Revision: https://developer.blender.org/D6169

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

M	intern/cycles/blender/blender_util.h
M	intern/opencolorio/gpu_shader_display_transform.glsl
M	intern/opencolorio/ocio_capi.h
M	intern/opencolorio/ocio_impl_glsl.cc
M	source/blender/blenkernel/BKE_blender_version.h
M	source/blender/blenkernel/BKE_colortools.h
M	source/blender/blenkernel/intern/brush.c
M	source/blender/blenkernel/intern/colortools.c
M	source/blender/blenkernel/intern/paint.c
M	source/blender/blenkernel/intern/texture.c
M	source/blender/blenloader/intern/versioning_280.c
M	source/blender/editors/interface/interface_draw.c
M	source/blender/editors/interface/interface_templates.c
M	source/blender/editors/render/render_internal.c
M	source/blender/freestyle/intern/python/BPy_Freestyle.cpp
M	source/blender/imbuf/intern/colormanagement.c
M	source/blender/makesdna/DNA_color_types.h
M	source/blender/makesrna/intern/rna_color.c
M	source/blender/nodes/shader/nodes/node_shader_curves.c

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

diff --git a/intern/cycles/blender/blender_util.h b/intern/cycles/blender/blender_util.h
index 3625dd45ae2..cbe61e367fa 100644
--- a/intern/cycles/blender/blender_util.h
+++ b/intern/cycles/blender/blender_util.h
@@ -159,7 +159,7 @@ static inline void curvemapping_to_array(BL::CurveMapping &cumap, array<float> &
   data.resize(size);
   for (int i = 0; i < size; i++) {
     float t = (float)i / (float)(size - 1);
-    data[i] = curve.evaluate(t);
+    data[i] = cumap.evaluate(curve, t);
   }
 }
 
@@ -197,15 +197,16 @@ static inline void curvemapping_color_to_array(BL::CurveMapping &cumap,
     BL::CurveMap mapI = cumap.curves[3];
     for (int i = 0; i < size; i++) {
       const float t = min_x + (float)i / (float)(size - 1) * range_x;
-      data[i] = make_float3(mapR.evaluate(mapI.evaluate(t)),
-                            mapG.evaluate(mapI.evaluate(t)),
-                            mapB.evaluate(mapI.evaluate(t)));
+      data[i] = make_float3(cumap.evaluate(mapR, cumap.evaluate(mapI, t)),
+                            cumap.evaluate(mapG, cumap.evaluate(mapI, t)),
+                            cumap.evaluate(mapB, cumap.evaluate(mapI, t)));
     }
   }
   else {
     for (int i = 0; i < size; i++) {
       float t = min_x + (float)i / (float)(size - 1) * range_x;
-      data[i] = make_float3(mapR.evaluate(t), mapG.evaluate(t), mapB.evaluate(t));
+      data[i] = make_float3(
+          cumap.evaluate(mapR, t), cumap.evaluate(mapG, t), cumap.evaluate(mapB, t));
     }
   }
 }
diff --git a/intern/opencolorio/gpu_shader_display_transform.glsl b/intern/opencolorio/gpu_shader_display_transform.glsl
index 04e96e8ed3c..9787398e2ae 100644
--- a/intern/opencolorio/gpu_shader_display_transform.glsl
+++ b/intern/opencolorio/gpu_shader_display_transform.glsl
@@ -16,7 +16,7 @@ out vec4 fragColor;
  */
 uniform sampler1D curve_mapping_texture;
 uniform int curve_mapping_lut_size;
-uniform ivec4 use_curve_mapping_extend_extrapolate;
+uniform int use_curve_mapping_extend_extrapolate;
 uniform vec4 curve_mapping_mintable;
 uniform vec4 curve_mapping_range;
 uniform vec4 curve_mapping_ext_in_x;
@@ -42,8 +42,8 @@ float read_curve_mapping(int table, int index)
 float curvemap_calc_extend(int table, float x, vec2 first, vec2 last)
 {
   if (x <= first[0]) {
-    if (use_curve_mapping_extend_extrapolate[table] == 0) {
-      /* no extrapolate */
+    if (use_curve_mapping_extend_extrapolate == 0) {
+      /* horizontal extrapolation */
       return first[1];
     }
     else {
@@ -55,8 +55,8 @@ float curvemap_calc_extend(int table, float x, vec2 first, vec2 last)
     }
   }
   else if (x >= last[0]) {
-    if (use_curve_mapping_extend_extrapolate[table] == 0) {
-      /* no extrapolate */
+    if (use_curve_mapping_extend_extrapolate == 0) {
+      /* horizontal extrapolation */
       return last[1];
     }
     else {
diff --git a/intern/opencolorio/ocio_capi.h b/intern/opencolorio/ocio_capi.h
index 9ba2d8fb8f9..5670b37f892 100644
--- a/intern/opencolorio/ocio_capi.h
+++ b/intern/opencolorio/ocio_capi.h
@@ -73,10 +73,10 @@ typedef struct OCIO_CurveMappingSettings {
   int lut_size;
 
   /* Extend extrapolation flags for all the tables.
-   * if use_extend_extrapolate[T] != 0 means extrapolation for
-   * table T is needed.
+   * if use_extend_extrapolate != 0 means extrapolation for
+   * curve.
    */
-  int use_extend_extrapolate[4];
+  int use_extend_extrapolate;
 
   /* Minimal X value of the curve mapping tables. */
   float mintable[4];
diff --git a/intern/opencolorio/ocio_impl_glsl.cc b/intern/opencolorio/ocio_impl_glsl.cc
index 99d59c8d989..a80e29a2dec 100644
--- a/intern/opencolorio/ocio_impl_glsl.cc
+++ b/intern/opencolorio/ocio_impl_glsl.cc
@@ -499,8 +499,8 @@ bool OCIOImpl::setupGLSLDraw(OCIO_GLSLDrawState **state_r,
     if (use_curve_mapping) {
       immUniform1i("curve_mapping_texture", 2);
       immUniform1i("curve_mapping_lut_size", curve_mapping_settings->lut_size);
-      immUniform4iv("use_curve_mapping_extend_extrapolate",
-                    curve_mapping_settings->use_extend_extrapolate);
+      immUniform1i("use_curve_mapping_extend_extrapolate",
+                   curve_mapping_settings->use_extend_extrapolate);
       immUniform4fv("curve_mapping_mintable", curve_mapping_settings->mintable);
       immUniform4fv("curve_mapping_range", curve_mapping_settings->range);
       immUniform4fv("curve_mapping_ext_in_x", curve_mapping_settings->ext_in_x);
diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h
index dd1fff9ce47..c38e6e14d70 100644
--- a/source/blender/blenkernel/BKE_blender_version.h
+++ b/source/blender/blenkernel/BKE_blender_version.h
@@ -27,7 +27,7 @@
  * \note Use #STRINGIFY() rather than defining with quotes.
  */
 #define BLENDER_VERSION 282
-#define BLENDER_SUBVERSION 1
+#define BLENDER_SUBVERSION 2
 /** Several breakages with 280, e.g. collections vs layers. */
 #define BLENDER_MINVERSION 280
 #define BLENDER_MINSUBVERSION 0
diff --git a/source/blender/blenkernel/BKE_colortools.h b/source/blender/blenkernel/BKE_colortools.h
index 643073b3470..e4ea1dad086 100644
--- a/source/blender/blenkernel/BKE_colortools.h
+++ b/source/blender/blenkernel/BKE_colortools.h
@@ -68,7 +68,9 @@ void BKE_curvemapping_initialize(struct CurveMapping *cumap);
 
 /* keep these (const CurveMap) - to help with thread safety */
 /* single curve, no table check */
-float BKE_curvemap_evaluateF(const struct CurveMap *cuma, float value);
+float BKE_curvemap_evaluateF(const struct CurveMapping *cumap,
+                             const struct CurveMap *cuma,
+                             float value);
 /* single curve, with table check */
 float BKE_curvemapping_evaluateF(const struct CurveMapping *cumap, int cur, float value);
 void BKE_curvemapping_evaluate3F(const struct CurveMapping *cumap,
diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c
index 4d496fe758b..27c3df5ce6e 100644
--- a/source/blender/blenkernel/intern/brush.c
+++ b/source/blender/blenkernel/intern/brush.c
@@ -1069,18 +1069,19 @@ void BKE_brush_sculpt_reset(Brush *br)
  */
 void BKE_brush_curve_preset(Brush *b, eCurveMappingPreset preset)
 {
-  CurveMap *cm = NULL;
+  CurveMapping *cumap = NULL;
+  CurveMap *cuma = NULL;
 
   if (!b->curve) {
     b->curve = BKE_curvemapping_add(1, 0, 0, 1, 1);
   }
+  cumap = b->curve;
+  cumap->flag &= ~CUMA_EXTEND_EXTRAPOLATE;
+  cumap->preset = preset;
 
-  cm = b->curve->cm;
-  cm->flag &= ~CUMA_EXTEND_EXTRAPOLATE;
-
-  b->curve->preset = preset;
-  BKE_curvemap_reset(cm, &b->curve->clipr, b->curve->preset, CURVEMAP_SLOPE_NEGATIVE);
-  BKE_curvemapping_changed(b->curve, false);
+  cuma = b->curve->cm;
+  BKE_curvemap_reset(cuma, &cumap->clipr, cumap->preset, CURVEMAP_SLOPE_NEGATIVE);
+  BKE_curvemapping_changed(cumap, false);
 }
 
 /* Generic texture sampler for 3D painting systems. point has to be either in
diff --git a/source/blender/blenkernel/intern/colortools.c b/source/blender/blenkernel/intern/colortools.c
index 8166bbea962..2ec04ee2747 100644
--- a/source/blender/blenkernel/intern/colortools.c
+++ b/source/blender/blenkernel/intern/colortools.c
@@ -54,7 +54,7 @@ void BKE_curvemapping_set_defaults(
   int a;
   float clipminx, clipminy, clipmaxx, clipmaxy;
 
-  cumap->flag = CUMA_DO_CLIP;
+  cumap->flag = CUMA_DO_CLIP | CUMA_EXTEND_EXTRAPOLATE;
   if (tot == 4) {
     cumap->cur = 3; /* rhms, hack for 'col' curve? */
   }
@@ -71,7 +71,6 @@ void BKE_curvemapping_set_defaults(
   cumap->bwmul[0] = cumap->bwmul[1] = cumap->bwmul[2] = 1.0f;
 
   for (a = 0; a < tot; a++) {
-    cumap->cm[a].flag = CUMA_EXTEND_EXTRAPOLATE;
     cumap->cm[a].totpoint = 2;
     cumap->cm[a].curve = MEM_callocN(2 * sizeof(CurveMapPoint), "curve points");
 
@@ -591,14 +590,15 @@ static void calchandle_curvemap(BezTriple *bezt, const BezTriple *prev, const Be
 
 /* in X, out Y.
  * X is presumed to be outside first or last */
-static float curvemap_calc_extend(const CurveMap *cuma,
+static float curvemap_calc_extend(const CurveMapping *cumap,
+                                  const CurveMap *cuma,
                                   float x,
                                   const float first[2],
                                   const float last[2])
 {
   if (x <= first[0]) {
-    if ((cuma->flag & CUMA_EXTEND_EXTRAPOLATE) == 0) {
-      /* no extrapolate */
+    if ((cumap->flag & CUMA_EXTEND_EXTRAPOLATE) == 0) {
+      /* extrapolate horizontally */
       return first[1];
     }
     else {
@@ -611,8 +611,8 @@ static float curvemap_calc_extend(const CurveMap *cuma,
     }
   }
   else if (x >= last[0]) {
-    if ((cuma->flag & CUMA_EXTEND_EXTRAPOLATE) == 0) {
-      /* no extrapolate */
+    if ((cumap->flag & CUMA_EXTEND_EXTRAPOLATE) == 0) {
+      /* extrapolate horizontally */
       return last[1];
     }
     else {
@@ -628,8 +628,9 @@ static float curvemap_calc_extend(const CurveMap *cuma,
 }
 
 /* only creates a table for a single channel in CurveMapping */
-static void curvemap_make_table(CurveMap *cuma, const rctf *clipr)
+static void curvemap_make_table(const CurveMapping *cumap, CurveMap *cuma)
 {
+  const rctf *clipr = &cumap->clipr;
   CurveMapPoint *cmp = cuma->curve;
   BezTriple *bezt;
 
@@ -782,7 +783,7 @@ static void curvemap_make_table(CurveMap *cuma, const rctf *clipr)
       }
       else {
         /* Extrapolate values that lie outside the start and end point. */
-        cmp[a].y = curvemap_calc_extend(cuma, cur_x, firstpoint, lastpoint);
+        cmp[a].y = curvemap_calc_extend(cumap, cuma, cur_x, firstpoint, lastpoint);
       }
     }
     else {
@@ -829,7 +830,7 @@ void BKE_curvemapping_premultiply(CurveMapping *cumap, int restore)
       /* verify and copy */
       for (a = 0; a < 3; a++) {
         if (cumap->cm[a].table == NULL) {
-          curvemap_make_table(cumap->cm + a, &cumap->clipr);
+          curvemap_make_table(cumap, cumap->cm + a);
         }
         cumap->cm[a].premultable = cumap->cm[a].table;
         cumap->cm[a].table = MEM_mallocN((CM_TABLE + 1) * sizeof(CurveMapPoint), "premul table");
@@ -838,14 +839,15 @@ void BKE_curvemapping_premultiply(CurveMapping *cumap, int restore)
       }
 
       if (cum

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list