diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2015-01-21 20:44:30 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2015-01-21 22:41:42 +0300 |
commit | 12ccac657f173ca74716e67cc80830c1142f8b22 (patch) | |
tree | 7d77307c14c4e8d7e28a9ec5727332ebb764a4e1 /intern/cycles/kernel/shaders | |
parent | cd723967970e3330d5461eaf8a062d6321de5d4f (diff) |
Cycles: Support sphere mapping for the image texture
Diffstat (limited to 'intern/cycles/kernel/shaders')
-rw-r--r-- | intern/cycles/kernel/shaders/node_image_texture.osl | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/intern/cycles/kernel/shaders/node_image_texture.osl b/intern/cycles/kernel/shaders/node_image_texture.osl index a55640a9168..c63ad179060 100644 --- a/intern/cycles/kernel/shaders/node_image_texture.osl +++ b/intern/cycles/kernel/shaders/node_image_texture.osl @@ -17,6 +17,25 @@ #include "stdosl.h" #include "node_color.h" +point map_to_sphere(vector dir) +{ + float len = length(dir); + float v, u; + if(len > 0.0) { + if(dir[0] == 0.0 && dir[1] == 0.0) { + u = 0.0; /* othwise domain error */ + } + else { + u = (1.0 - atan2(dir[0], dir[1]) / M_PI) / 2.0; + } + v = 1.0 - acos(dir[2] / len) / M_PI; + } + else { + v = u = 0.0; /* to avoid un-initialized variables */ + } + return point(u, v, 0.0); +} + color image_texture_lookup(string filename, string color_space, float u, float v, output float Alpha, int use_alpha, int is_float, string interpolation) { color rgb = (color)texture(filename, u, 1.0 - v, "wrap", "periodic", "interp", interpolation, "alpha", Alpha); @@ -136,5 +155,10 @@ shader node_image_texture( Alpha += weight[2] * tmp_alpha; } } + else if (projection == "Sphere") { + point projected = map_to_sphere((p - vector(0.5, 0.5, 0.5)) * 2.0); + Color = image_texture_lookup(filename, color_space, + projected[0], projected[1], + Alpha, use_alpha, is_float, interpolation); + } } - |