[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51446] trunk/blender/intern/cycles: Integer socket support in Cycles.

Lukas Toenne lukas.toenne at googlemail.com
Sat Oct 20 15:11:48 CEST 2012


Revision: 51446
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51446
Author:   lukastoenne
Date:     2012-10-20 13:11:45 +0000 (Sat, 20 Oct 2012)
Log Message:
-----------
Integer socket support in Cycles. Int values are already supported natively in OSL, but were not used as actual ints on the SVM stack. This patch implements all the necessary functionality to support reading input values from RNA properties and convert between SHADER_SOCKET_INT and other types.

Modified Paths:
--------------
    trunk/blender/intern/cycles/app/cycles_xml.cpp
    trunk/blender/intern/cycles/blender/blender_shader.cpp
    trunk/blender/intern/cycles/kernel/osl/nodes/CMakeLists.txt
    trunk/blender/intern/cycles/kernel/osl/nodes/node_convert_from_color.osl
    trunk/blender/intern/cycles/kernel/osl/nodes/node_convert_from_float.osl
    trunk/blender/intern/cycles/kernel/osl/nodes/node_convert_from_normal.osl
    trunk/blender/intern/cycles/kernel/osl/nodes/node_convert_from_point.osl
    trunk/blender/intern/cycles/kernel/osl/nodes/node_convert_from_vector.osl
    trunk/blender/intern/cycles/kernel/svm/svm.h
    trunk/blender/intern/cycles/kernel/svm/svm_convert.h
    trunk/blender/intern/cycles/kernel/svm/svm_types.h
    trunk/blender/intern/cycles/render/graph.h
    trunk/blender/intern/cycles/render/nodes.cpp
    trunk/blender/intern/cycles/render/osl.cpp
    trunk/blender/intern/cycles/render/svm.cpp

Added Paths:
-----------
    trunk/blender/intern/cycles/kernel/osl/nodes/node_convert_from_int.osl

Modified: trunk/blender/intern/cycles/app/cycles_xml.cpp
===================================================================
--- trunk/blender/intern/cycles/app/cycles_xml.cpp	2012-10-20 13:08:51 UTC (rev 51445)
+++ trunk/blender/intern/cycles/app/cycles_xml.cpp	2012-10-20 13:11:45 UTC (rev 51446)
@@ -591,6 +591,7 @@
 					if(string_iequals(in->name, attr.name())) {
 						switch(in->type) {
 							case SHADER_SOCKET_FLOAT:
+							case SHADER_SOCKET_INT:
 								xml_read_float(&in->value.x, node, attr.name());
 								break;
 							case SHADER_SOCKET_COLOR:

Modified: trunk/blender/intern/cycles/blender/blender_shader.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_shader.cpp	2012-10-20 13:08:51 UTC (rev 51445)
+++ trunk/blender/intern/cycles/blender/blender_shader.cpp	2012-10-20 13:11:45 UTC (rev 51446)
@@ -80,6 +80,8 @@
 	switch (b_type) {
 	case BL::NodeSocket::type_VALUE:
 		return SHADER_SOCKET_FLOAT;
+	case BL::NodeSocket::type_INT:
+		return SHADER_SOCKET_INT;
 	case BL::NodeSocket::type_VECTOR:
 		return SHADER_SOCKET_VECTOR;
 	case BL::NodeSocket::type_RGBA:
@@ -89,7 +91,6 @@
 	
 	case BL::NodeSocket::type_BOOLEAN:
 	case BL::NodeSocket::type_MESH:
-	case BL::NodeSocket::type_INT:
 	default:
 		return SHADER_SOCKET_FLOAT;
 	}
@@ -104,6 +105,11 @@
 		input->set(value_sock.default_value());
 		break;
 	}
+	case SHADER_SOCKET_INT: {
+		BL::NodeSocketIntNone value_sock(sock);
+		input->set((float)value_sock.default_value());
+		break;
+	}
 	case SHADER_SOCKET_COLOR: {
 		BL::NodeSocketRGBA rgba_sock(sock);
 		input->set(get_float3(rgba_sock.default_value()));

Modified: trunk/blender/intern/cycles/kernel/osl/nodes/CMakeLists.txt
===================================================================
--- trunk/blender/intern/cycles/kernel/osl/nodes/CMakeLists.txt	2012-10-20 13:08:51 UTC (rev 51445)
+++ trunk/blender/intern/cycles/kernel/osl/nodes/CMakeLists.txt	2012-10-20 13:11:45 UTC (rev 51446)
@@ -12,6 +12,7 @@
 	node_combine_rgb.osl
 	node_convert_from_color.osl
 	node_convert_from_float.osl
+	node_convert_from_int.osl
 	node_convert_from_normal.osl
 	node_convert_from_point.osl
 	node_convert_from_vector.osl

Modified: trunk/blender/intern/cycles/kernel/osl/nodes/node_convert_from_color.osl
===================================================================
--- trunk/blender/intern/cycles/kernel/osl/nodes/node_convert_from_color.osl	2012-10-20 13:08:51 UTC (rev 51445)
+++ trunk/blender/intern/cycles/kernel/osl/nodes/node_convert_from_color.osl	2012-10-20 13:11:45 UTC (rev 51446)
@@ -21,11 +21,13 @@
 shader node_convert_from_color(
 	color Color = color(0.0, 0.0, 0.0),
 	output float Val = 0.0,
+	output int ValInt = 0,
 	output vector Vector = vector(0.0, 0.0, 0.0),
 	output point Point = point(0.0, 0.0, 0.0),
 	output normal Normal = normal(0.0, 0.0, 0.0))
 {
 	Val = Color[0] * 0.2126 + Color[1] * 0.7152 + Color[2] * 0.0722;
+	ValInt = (int)(Color[0]*0.2126 + Color[1]*0.7152 + Color[2]*0.0722);
 	Vector = vector(Color[0], Color[1], Color[2]);
 	Point = point(Color[0], Color[1], Color[2]);
 	Normal = normal(Color[0], Color[1], Color[2]);

Modified: trunk/blender/intern/cycles/kernel/osl/nodes/node_convert_from_float.osl
===================================================================
--- trunk/blender/intern/cycles/kernel/osl/nodes/node_convert_from_float.osl	2012-10-20 13:08:51 UTC (rev 51445)
+++ trunk/blender/intern/cycles/kernel/osl/nodes/node_convert_from_float.osl	2012-10-20 13:11:45 UTC (rev 51446)
@@ -20,11 +20,13 @@
 
 shader node_convert_from_float(
 	float Val = 0.0,
+	output int ValInt = 0,
 	output color Color = color(0.0, 0.0, 0.0),
 	output vector Vector = vector(0.0, 0.0, 0.0),
 	output point Point = point(0.0, 0.0, 0.0),
 	output normal Normal = normal(0.0, 0.0, 0.0))
 {
+	ValInt = (int)Val;
 	Color = color(Val, Val, Val);
 	Vector = vector(Val, Val, Val);
 	Point = point(Val, Val, Val);

Copied: trunk/blender/intern/cycles/kernel/osl/nodes/node_convert_from_int.osl (from rev 51444, trunk/blender/intern/cycles/kernel/osl/nodes/node_convert_from_float.osl)
===================================================================
--- trunk/blender/intern/cycles/kernel/osl/nodes/node_convert_from_int.osl	                        (rev 0)
+++ trunk/blender/intern/cycles/kernel/osl/nodes/node_convert_from_int.osl	2012-10-20 13:11:45 UTC (rev 51446)
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2011, 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.
+ *
+ * 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.
+ *
+ * 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.
+ */
+
+#include "stdosl.h"
+
+shader node_convert_from_int(
+	int ValInt = 0,
+	output float Val = 0.0,
+	output color Color = color(0.0, 0.0, 0.0),
+	output vector Vector = vector(0.0, 0.0, 0.0),
+	output point Point = point(0.0, 0.0, 0.0),
+	output normal Normal = normal(0.0, 0.0, 0.0))
+{
+	float f = (float)ValInt;
+	Val = f;
+	Color = color(f, f, f);
+	Vector = vector(f, f, f);
+	Point = point(f, f, f);
+	Normal = normal(f, f, f);
+}
+

Modified: trunk/blender/intern/cycles/kernel/osl/nodes/node_convert_from_normal.osl
===================================================================
--- trunk/blender/intern/cycles/kernel/osl/nodes/node_convert_from_normal.osl	2012-10-20 13:08:51 UTC (rev 51445)
+++ trunk/blender/intern/cycles/kernel/osl/nodes/node_convert_from_normal.osl	2012-10-20 13:11:45 UTC (rev 51446)
@@ -21,11 +21,13 @@
 shader node_convert_from_normal(
 	normal Normal = normal(0.0, 0.0, 0.0),
 	output float Val = 0.0,
+	output int ValInt = 0,
 	output vector Vector = vector(0.0, 0.0, 0.0),
 	output color Color = color(0.0, 0.0, 0.0),
 	output point Point = point(0.0, 0.0, 0.0))
 {
 	Val = (Normal[0] + Normal[1] + Normal[2]) * (1.0 / 3.0);
+	ValInt = (int)((Normal[0] + Normal[1] + Normal[2])*(1.0/3.0));
 	Vector = vector(Normal[0], Normal[1], Normal[2]);
 	Color = color(Normal[0], Normal[1], Normal[2]);
 	Point = point(Normal[0], Normal[1], Normal[2]);

Modified: trunk/blender/intern/cycles/kernel/osl/nodes/node_convert_from_point.osl
===================================================================
--- trunk/blender/intern/cycles/kernel/osl/nodes/node_convert_from_point.osl	2012-10-20 13:08:51 UTC (rev 51445)
+++ trunk/blender/intern/cycles/kernel/osl/nodes/node_convert_from_point.osl	2012-10-20 13:11:45 UTC (rev 51446)
@@ -21,11 +21,13 @@
 shader node_convert_from_point(
 	point Point = point(0.0, 0.0, 0.0),
 	output float Val = 0.0,
+	output int ValInt = 0,
 	output vector Vector = vector(0.0, 0.0, 0.0),
 	output color Color = color(0.0, 0.0, 0.0),
 	output normal Normal = normal(0.0, 0.0, 0.0))
 {
 	Val = (Point[0] + Point[1] + Point[2]) * (1.0 / 3.0);
+	ValInt = (int)((Normal[0] + Normal[1] + Normal[2])*(1.0/3.0));
 	Vector = vector(Point[0], Point[1], Point[2]);
 	Color = color(Point[0], Point[1], Point[2]);
 	Normal = normal(Point[0], Point[1], Point[2]);

Modified: trunk/blender/intern/cycles/kernel/osl/nodes/node_convert_from_vector.osl
===================================================================
--- trunk/blender/intern/cycles/kernel/osl/nodes/node_convert_from_vector.osl	2012-10-20 13:08:51 UTC (rev 51445)
+++ trunk/blender/intern/cycles/kernel/osl/nodes/node_convert_from_vector.osl	2012-10-20 13:11:45 UTC (rev 51446)
@@ -21,11 +21,13 @@
 shader node_convert_from_vector(
 	vector Vector = vector(0.0, 0.0, 0.0),
 	output float Val = 0.0,
+	output int ValInt = 0,
 	output color Color = color(0.0, 0.0, 0.0),
 	output point Point = point(0.0, 0.0, 0.0),
 	output normal Normal = normal(0.0, 0.0, 0.0))
 {
 	Val = (Vector[0] + Vector[1] + Vector[2]) * (1.0 / 3.0);
+	ValInt = (int)((Normal[0] + Normal[1] + Normal[2])*(1.0/3.0));
 	Color = color(Vector[0], Vector[1], Vector[2]);
 	Point = point(Vector[0], Vector[1], Vector[2]);
 	Normal = normal(Vector[0], Vector[1], Vector[2]);

Modified: trunk/blender/intern/cycles/kernel/svm/svm.h
===================================================================
--- trunk/blender/intern/cycles/kernel/svm/svm.h	2012-10-20 13:08:51 UTC (rev 51445)
+++ trunk/blender/intern/cycles/kernel/svm/svm.h	2012-10-20 13:11:45 UTC (rev 51446)
@@ -82,6 +82,25 @@
 	stack[a] = f;
 }
 
+__device_inline int stack_load_int(float *stack, uint a)
+{
+	kernel_assert(a < SVM_STACK_SIZE);
+
+	return __float_as_int(stack[a]);
+}
+
+__device_inline float stack_load_int_default(float *stack, uint a, uint value)
+{
+	return (a == (uint)SVM_STACK_INVALID)? (int)value: stack_load_int(stack, a);
+}
+
+__device_inline void stack_store_int(float *stack, uint a, int i)
+{
+	kernel_assert(a < SVM_STACK_SIZE);
+
+	stack[a] = __int_as_float(i);
+}
+
 __device_inline bool stack_valid(uint a)
 {
 	return a != (uint)SVM_STACK_INVALID;

Modified: trunk/blender/intern/cycles/kernel/svm/svm_convert.h
===================================================================
--- trunk/blender/intern/cycles/kernel/svm/svm_convert.h	2012-10-20 13:08:51 UTC (rev 51445)
+++ trunk/blender/intern/cycles/kernel/svm/svm_convert.h	2012-10-20 13:11:45 UTC (rev 51446)
@@ -23,6 +23,11 @@
 __device void svm_node_convert(ShaderData *sd, float *stack, uint type, uint from, uint to)
 {
 	switch(type) {
+		case NODE_CONVERT_FI: {
+			float f = stack_load_float(stack, from);
+			stack_store_int(stack, to, (int)f);
+			break;
+		}
 		case NODE_CONVERT_FV: {
 			float f = stack_load_float(stack, from);
 			stack_store_float3(stack, to, make_float3(f, f, f));
@@ -34,13 +39,34 @@
 			stack_store_float(stack, to, g);
 			break;
 		}
+		case NODE_CONVERT_CI: {
+			float3 f = stack_load_float3(stack, from);
+			int i = (int)linear_rgb_to_gray(f);
+			stack_store_int(stack, to, i);
+			break;
+		}
 		case NODE_CONVERT_VF: {
 			float3 f = stack_load_float3(stack, from);
 			float g = (f.x + f.y + f.z)*(1.0f/3.0f);
 			stack_store_float(stack, to, g);
 			break;
 		}
-
+		case NODE_CONVERT_VI: {

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list