Cycles: constant folding for RGB/Vector Curves and Color Ramp.
[blender.git] / intern / cycles / kernel / shaders / node_vector_curves.osl
index 94082287f4db70f2b6f7c16c791182c09950a7ce..d92fa11d439f2e6fc3391e534f6c024fdaa65356 100644 (file)
@@ -1,52 +1,39 @@
 /*
- * Copyright 2011, Blender Foundation.
+ * Copyright 2011-2013 Blender Foundation
  *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
  *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
+ * http://www.apache.org/licenses/LICENSE-2.0
  *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * Unless required by applicable law or agreed to in writing, software
+ * 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.
  */
 
-#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);
 }