Cycles: constant folding for RGB/Vector Curves and Color Ramp.
[blender.git] / intern / cycles / kernel / shaders / node_vector_curves.osl
index 137ebe112ebf573b4af75a86f863eb1b81f3de98..d92fa11d439f2e6fc3391e534f6c024fdaa65356 100644 (file)
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
- * limitations under the License
+ * limitations under the License.
  */
 
-#include "stdosl.h"
-#include "oslutil.h"
-
-float ramp_lookup(color ramp[RAMP_TABLE_SIZE], float at, int component)
-{
-       float f = clamp((at + 1.0) * 0.5, 0.0, 1.0) * (RAMP_TABLE_SIZE - 1);
-
-       /* clamp int as well in case of NaN */
-       int i = (int)f;
-       if (i < 0) i = 0;
-       if (i >= RAMP_TABLE_SIZE) i = RAMP_TABLE_SIZE - 1;
-       float t = f - (float)i;
-
-       float result = ramp[i][component];
-
-       if (t > 0.0)
-               result = (1.0 - t) * result + t * ramp[i + 1][component];
-       
-       return result * 2.0 - 1.0;
-}
+#include "node_ramp_util.h"
 
 shader node_vector_curves(
-       color ramp[RAMP_TABLE_SIZE] = {0.0},
+       color ramp[] = {0.0},
+       float min_x = 0.0,
+       float max_x = 1.0,
 
        vector VectorIn = vector(0.0, 0.0, 0.0),
        float Fac = 0.0,
        output vector VectorOut = vector(0.0, 0.0, 0.0))
 {
-       VectorOut[0] = ramp_lookup(ramp, VectorIn[0], 0);
-       VectorOut[1] = ramp_lookup(ramp, VectorIn[1], 1);
-       VectorOut[2] = ramp_lookup(ramp, VectorIn[2], 2);
+       vector c = (VectorIn - vector(min_x, min_x, min_x)) / (max_x - min_x);
+
+       color r = rgb_ramp_lookup(ramp, c[0], 1, 1);
+       color g = rgb_ramp_lookup(ramp, c[0], 1, 1);
+       color b = rgb_ramp_lookup(ramp, c[0], 1, 1);
+
+       VectorOut[0] = r[0];
+       VectorOut[1] = g[1];
+       VectorOut[2] = b[2];
 
        VectorOut = mix(VectorIn, VectorOut, Fac);
 }