[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52408] trunk/blender/intern/cycles: Fix [ #33239] Cycles OSL : Environment Texture Rotation Incorrect:

Thomas Dinges blender at dingto.org
Tue Nov 20 15:18:59 CET 2012


Revision: 52408
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52408
Author:   dingto
Date:     2012-11-20 14:18:56 +0000 (Tue, 20 Nov 2012)
Log Message:
-----------
Fix [#33239] Cycles OSL : Environment Texture Rotation Incorrect:
* Projection mappings were not implemented yet. 

Modified Paths:
--------------
    trunk/blender/intern/cycles/kernel/shaders/node_environment_texture.osl
    trunk/blender/intern/cycles/render/nodes.cpp

Modified: trunk/blender/intern/cycles/kernel/shaders/node_environment_texture.osl
===================================================================
--- trunk/blender/intern/cycles/kernel/shaders/node_environment_texture.osl	2012-11-20 13:29:27 UTC (rev 52407)
+++ trunk/blender/intern/cycles/kernel/shaders/node_environment_texture.osl	2012-11-20 14:18:56 UTC (rev 52408)
@@ -19,15 +19,45 @@
 #include "stdosl.h"
 #include "node_color.h"
 
+vector environment_texture_direction_to_equirectangular(vector dir) {
+	float u = -atan2(dir[1], dir[0])/(2.0*M_PI) + 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 dir) {
+	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(
 	vector Vector = P,
 	string filename = "",
+	string projection = "Equirectangular",
 	string color_space = "sRGB",
 	output color Color = color(0.0, 0.0, 0.0),
 	output float Alpha = 1.0)
 {
-	Color = (color)environment(filename, Vector, "alpha", Alpha);
+	vector Vec = normalize(Vector);
 
+	if (projection == "Equirectangular") {
+		Vec = environment_texture_direction_to_equirectangular(Vec);
+	}
+	else {
+		Vec = environment_texture_direction_to_mirrorball(Vec);
+	}
+
+	Color = (color)texture(filename, Vec[0], 1.0 - Vec[1], "wrap", "periodic", "alpha", Alpha);
+
 	if (color_space == "sRGB")
 		Color = color_srgb_to_scene_linear(Color);
 }

Modified: trunk/blender/intern/cycles/render/nodes.cpp
===================================================================
--- trunk/blender/intern/cycles/render/nodes.cpp	2012-11-20 13:29:27 UTC (rev 52407)
+++ trunk/blender/intern/cycles/render/nodes.cpp	2012-11-20 14:18:56 UTC (rev 52408)
@@ -329,6 +329,7 @@
 void EnvironmentTextureNode::compile(OSLCompiler& compiler)
 {
 	compiler.parameter("filename", filename.c_str());
+	compiler.parameter("projection", projection);
 	if(is_float || color_space != "Color")
 		compiler.parameter("color_space", "Linear");
 	else




More information about the Bf-blender-cvs mailing list