1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- /*
- * Copyright 2011-2013 Blender Foundation
- *
- * 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
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * 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 "node_color.h"
- vector environment_texture_direction_to_equirectangular(vector dir)
- {
- float u = -atan2(dir[1], dir[0]) / (M_2PI) + 0.5;
- float v = atan2(dir[2], hypot(dir[0], dir[1])) / M_PI + 0.5;
- return vector(u, v, 0.0);
- }
- vector environment_texture_direction_to_mirrorball(vector idir)
- {
- vector dir = idir;
- dir[1] -= 1.0;
- float div = 2.0 * sqrt(max(-0.5 * dir[1], 0.0));
- if (div > 0.0)
- dir /= div;
- float u = 0.5 * (dir[0] + 1.0);
- float v = 0.5 * (dir[2] + 1.0);
- return vector(u, v, 0.0);
- }
- shader node_environment_texture(
- int use_mapping = 0,
- matrix mapping = matrix(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
- vector Vector = P,
- string filename = "",
- string projection = "equirectangular",
- string interpolation = "linear",
- int compress_as_srgb = 0,
- int ignore_alpha = 0,
- int unassociate_alpha = 0,
- int is_float = 1,
- output color Color = 0.0,
- output float Alpha = 1.0)
- {
- vector p = Vector;
- if (use_mapping)
- p = transform(mapping, p);
- p = normalize(p);
- if (projection == "equirectangular")
- p = environment_texture_direction_to_equirectangular(p);
- else
- p = environment_texture_direction_to_mirrorball(p);
- /* todo: use environment for better texture filtering of equirectangular */
- Color = (color)texture(
- filename, p[0], 1.0 - p[1], "wrap", "periodic", "interp", interpolation, "alpha", Alpha);
- if (ignore_alpha) {
- Alpha = 1.0;
- }
- else if (unassociate_alpha) {
- Color = color_unpremultiply(Color, Alpha);
- if (!is_float)
- Color = min(Color, 1.0);
- }
- if (compress_as_srgb)
- Color = color_srgb_to_scene_linear(Color);
- }
|