Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/kernel/shaders/node_rgb_curves.osl
| /* | /* | ||||
| * Copyright 2011-2013 Blender Foundation | * Copyright 2011-2013 Blender Foundation | ||||
| * | * | ||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| * you may not use this file except in compliance with the License. | * you may not use this file except in compliance with the License. | ||||
| * You may obtain a copy of the License at | * You may obtain a copy of the License at | ||||
| * | * | ||||
| * http://www.apache.org/licenses/LICENSE-2.0 | * http://www.apache.org/licenses/LICENSE-2.0 | ||||
| * | * | ||||
| * Unless required by applicable law or agreed to in writing, software | * Unless required by applicable law or agreed to in writing, software | ||||
| * distributed under the License is distributed on an "AS IS" BASIS, | * distributed under the License is distributed on an "AS IS" BASIS, | ||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| * See the License for the specific language governing permissions and | * See the License for the specific language governing permissions and | ||||
| * limitations under the License. | * limitations under the License. | ||||
| */ | */ | ||||
| #include "stdosl.h" | #include "node_ramp_util.h" | ||||
| #include "oslutil.h" | |||||
| float ramp_lookup(color ramp[], float at, int component) | |||||
| { | |||||
| int table_size = arraylength(ramp); | |||||
| if (at < 0.0 || at > 1.0) { | |||||
| float t0, dy; | |||||
| if (at < 0.0) { | |||||
| t0 = ramp[0][component]; | |||||
| dy = t0 - ramp[1][component]; | |||||
| at = -at; | |||||
| } | |||||
| else { | |||||
| t0 = ramp[table_size - 1][component]; | |||||
| dy = t0 - ramp[table_size - 2][component]; | |||||
| at = at - 1.0; | |||||
| } | |||||
| return t0 + dy * at * (table_size - 1); | |||||
| } | |||||
| float f = clamp(at, 0.0, 1.0) * (table_size - 1); | |||||
| /* clamp int as well in case of NaN */ | |||||
| int i = (int)f; | |||||
| if (i < 0) i = 0; | |||||
| if (i >= table_size) i = 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; | |||||
| } | |||||
| shader node_rgb_curves( | shader node_rgb_curves( | ||||
| color ramp[] = {0.0}, | color ramp[] = {0.0}, | ||||
| float min_x = 0.0, | float min_x = 0.0, | ||||
| float max_x = 1.0, | float max_x = 1.0, | ||||
| color ColorIn = 0.0, | color ColorIn = 0.0, | ||||
| float Fac = 0.0, | float Fac = 0.0, | ||||
| output color ColorOut = 0.0) | output color ColorOut = 0.0) | ||||
| { | { | ||||
| color c = (ColorIn - color(min_x, min_x, min_x)) / (max_x - min_x); | color c = (ColorIn - color(min_x, min_x, min_x)) / (max_x - min_x); | ||||
| ColorOut[0] = ramp_lookup(ramp, c[0], 0); | color r = rgb_ramp_lookup(ramp, c[0], 1, 1); | ||||
| ColorOut[1] = ramp_lookup(ramp, c[1], 1); | color g = rgb_ramp_lookup(ramp, c[0], 1, 1); | ||||
| ColorOut[2] = ramp_lookup(ramp, c[2], 2); | color b = rgb_ramp_lookup(ramp, c[0], 1, 1); | ||||
| ColorOut[0] = r[0]; | |||||
| ColorOut[1] = g[1]; | |||||
| ColorOut[2] = b[2]; | |||||
| ColorOut = mix(ColorIn, ColorOut, Fac); | ColorOut = mix(ColorIn, ColorOut, Fac); | ||||
| } | } | ||||