[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58775] branches/soc-2013-dingto: Cycles / Vector Transform node:
Thomas Dinges
blender at dingto.org
Wed Jul 31 22:05:14 CEST 2013
Revision: 58775
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58775
Author: dingto
Date: 2013-07-31 20:05:13 +0000 (Wed, 31 Jul 2013)
Log Message:
-----------
Cycles / Vector Transform node:
* Code cleanup to avoid duplicated enum code.
* Added a third type for conversion next to Point and Vector: Normal. This is basically the same result as with the Vector type, but normalizes the vector at the end.
Thanks to Brecht for code review!
Modified Paths:
--------------
branches/soc-2013-dingto/intern/cycles/blender/blender_shader.cpp
branches/soc-2013-dingto/intern/cycles/kernel/shaders/node_vector_transform.osl
branches/soc-2013-dingto/intern/cycles/kernel/svm/svm_types.h
branches/soc-2013-dingto/intern/cycles/kernel/svm/svm_vector_transform.h
branches/soc-2013-dingto/intern/cycles/render/nodes.cpp
branches/soc-2013-dingto/intern/cycles/render/nodes.h
branches/soc-2013-dingto/source/blender/makesdna/DNA_node_types.h
branches/soc-2013-dingto/source/blender/makesrna/intern/rna_nodetree.c
Modified: branches/soc-2013-dingto/intern/cycles/blender/blender_shader.cpp
===================================================================
--- branches/soc-2013-dingto/intern/cycles/blender/blender_shader.cpp 2013-07-31 19:03:42 UTC (rev 58774)
+++ branches/soc-2013-dingto/intern/cycles/blender/blender_shader.cpp 2013-07-31 20:05:13 UTC (rev 58775)
@@ -260,8 +260,8 @@
BL::ShaderNodeVectorTransform b_vector_transform_node(b_node);
VectorTransformNode *vtransform = new VectorTransformNode();
vtransform->type = VectorTransformNode::type_enum[b_vector_transform_node.type()];
- vtransform->convert_from = VectorTransformNode::convert_from_enum[b_vector_transform_node.convert_from()];
- vtransform->convert_to = VectorTransformNode::convert_to_enum[b_vector_transform_node.convert_to()];
+ vtransform->convert_from = VectorTransformNode::convert_space_enum[b_vector_transform_node.convert_from()];
+ vtransform->convert_to = VectorTransformNode::convert_space_enum[b_vector_transform_node.convert_to()];
node = vtransform;
}
else if (b_node.is_a(&RNA_ShaderNodeNormal)) {
Modified: branches/soc-2013-dingto/intern/cycles/kernel/shaders/node_vector_transform.osl
===================================================================
--- branches/soc-2013-dingto/intern/cycles/kernel/shaders/node_vector_transform.osl 2013-07-31 19:03:42 UTC (rev 58774)
+++ branches/soc-2013-dingto/intern/cycles/kernel/shaders/node_vector_transform.osl 2013-07-31 20:05:13 UTC (rev 58775)
@@ -20,16 +20,18 @@
shader node_vector_transform(
string type = "Vector",
- string convert_from = "World",
- string convert_to = "Object",
+ string convert_from = "world",
+ string convert_to = "object",
vector VectorIn = vector(0.0, 0.0, 0.0),
output vector VectorOut = vector(0.0, 0.0, 0.0))
{
- if (type == "Vector") {
+ if (type == "Vector" || type == "Normal") {
VectorOut = transform(convert_from, convert_to, VectorIn);
+ if (type == "Normal")
+ VectorOut = normalize(VectorOut);
}
else if (type == "Point") {
- point Point = point(VectorIn[0], VectorIn[1], VectorIn[2]);
+ point Point = (point)VectorIn;
VectorOut = transform(convert_from, convert_to, Point);
}
}
Modified: branches/soc-2013-dingto/intern/cycles/kernel/svm/svm_types.h
===================================================================
--- branches/soc-2013-dingto/intern/cycles/kernel/svm/svm_types.h 2013-07-31 19:03:42 UTC (rev 58774)
+++ branches/soc-2013-dingto/intern/cycles/kernel/svm/svm_types.h 2013-07-31 20:05:13 UTC (rev 58775)
@@ -232,21 +232,16 @@
typedef enum NodeVectorTransformType {
NODE_VECTOR_TRANSFORM_TYPE_VECTOR,
- NODE_VECTOR_TRANSFORM_TYPE_POINT
+ NODE_VECTOR_TRANSFORM_TYPE_POINT,
+ NODE_VECTOR_TRANSFORM_TYPE_NORMAL
} NodeVectorTransformType;
-typedef enum NodeVectorTransformConvertFrom {
- NODE_VECTOR_TRANSFORM_CONVERT_FROM_WORLD,
- NODE_VECTOR_TRANSFORM_CONVERT_FROM_OBJECT,
- NODE_VECTOR_TRANSFORM_CONVERT_FROM_CAMERA
-} NodeVectorTransformConvertFrom;
+typedef enum NodeVectorTransformConvertSpace {
+ NODE_VECTOR_TRANSFORM_CONVERT_SPACE_WORLD,
+ NODE_VECTOR_TRANSFORM_CONVERT_SPACE_OBJECT,
+ NODE_VECTOR_TRANSFORM_CONVERT_SPACE_CAMERA
+} NodeVectorTransformConvertSpace;
-typedef enum NodeVectorTransformConvertTo {
- NODE_VECTOR_TRANSFORM_CONVERT_TO_WORLD,
- NODE_VECTOR_TRANSFORM_CONVERT_TO_OBJECT,
- NODE_VECTOR_TRANSFORM_CONVERT_TO_CAMERA
-} NodeVectorTransformConvertTo;
-
typedef enum NodeConvert {
NODE_CONVERT_FV,
NODE_CONVERT_FI,
Modified: branches/soc-2013-dingto/intern/cycles/kernel/svm/svm_vector_transform.h
===================================================================
--- branches/soc-2013-dingto/intern/cycles/kernel/svm/svm_vector_transform.h 2013-07-31 19:03:42 UTC (rev 58774)
+++ branches/soc-2013-dingto/intern/cycles/kernel/svm/svm_vector_transform.h 2013-07-31 20:05:13 UTC (rev 58775)
@@ -31,23 +31,24 @@
float3 in = stack_load_float3(stack, vector_in);
NodeVectorTransformType type = (NodeVectorTransformType)itype;
- NodeVectorTransformConvertFrom from = (NodeVectorTransformConvertFrom)ifrom;
- NodeVectorTransformConvertTo to = (NodeVectorTransformConvertTo)ito;
+ NodeVectorTransformConvertSpace from = (NodeVectorTransformConvertSpace)ifrom;
+ NodeVectorTransformConvertSpace to = (NodeVectorTransformConvertSpace)ito;
Transform tfm;
int is_object = (sd->object != ~0);
+ int is_direction = (type == NODE_VECTOR_TRANSFORM_TYPE_VECTOR || type == NODE_VECTOR_TRANSFORM_TYPE_NORMAL);
/* From world */
- if(from == NODE_VECTOR_TRANSFORM_CONVERT_FROM_WORLD) {
- if(to == NODE_VECTOR_TRANSFORM_CONVERT_TO_CAMERA) {
+ if(from == NODE_VECTOR_TRANSFORM_CONVERT_SPACE_WORLD) {
+ if(to == NODE_VECTOR_TRANSFORM_CONVERT_SPACE_CAMERA) {
tfm = kernel_data.cam.worldtocamera;
- if(type == NODE_VECTOR_TRANSFORM_TYPE_VECTOR)
+ if(is_direction)
in = transform_direction(&tfm, in);
else
in = transform_point(&tfm, in);
}
- else if (to == NODE_VECTOR_TRANSFORM_CONVERT_TO_OBJECT && is_object) {
- if(type == NODE_VECTOR_TRANSFORM_TYPE_VECTOR)
+ else if (to == NODE_VECTOR_TRANSFORM_CONVERT_SPACE_OBJECT && is_object) {
+ if(is_direction)
object_inverse_dir_transform(kg, sd, &in);
else
object_inverse_position_transform(kg, sd, &in);
@@ -55,16 +56,16 @@
}
/* From camera */
- else if (from == NODE_VECTOR_TRANSFORM_CONVERT_FROM_CAMERA) {
- if(to == NODE_VECTOR_TRANSFORM_CONVERT_TO_WORLD || to == NODE_VECTOR_TRANSFORM_CONVERT_TO_OBJECT) {
+ else if (from == NODE_VECTOR_TRANSFORM_CONVERT_SPACE_CAMERA) {
+ if(to == NODE_VECTOR_TRANSFORM_CONVERT_SPACE_WORLD || to == NODE_VECTOR_TRANSFORM_CONVERT_SPACE_OBJECT) {
tfm = kernel_data.cam.cameratoworld;
- if(type == NODE_VECTOR_TRANSFORM_TYPE_VECTOR)
+ if(is_direction)
in = transform_direction(&tfm, in);
else
in = transform_point(&tfm, in);
}
- if(to == NODE_VECTOR_TRANSFORM_CONVERT_TO_OBJECT && is_object) {
- if(type == NODE_VECTOR_TRANSFORM_TYPE_VECTOR)
+ if(to == NODE_VECTOR_TRANSFORM_CONVERT_SPACE_OBJECT && is_object) {
+ if(is_direction)
object_inverse_dir_transform(kg, sd, &in);
else
object_inverse_position_transform(kg, sd, &in);
@@ -72,22 +73,26 @@
}
/* From object */
- else if(from == NODE_VECTOR_TRANSFORM_CONVERT_FROM_OBJECT) {
- if((to == NODE_VECTOR_TRANSFORM_CONVERT_TO_WORLD || to == NODE_VECTOR_TRANSFORM_CONVERT_TO_CAMERA) && is_object) {
- if(type == NODE_VECTOR_TRANSFORM_TYPE_VECTOR)
+ else if(from == NODE_VECTOR_TRANSFORM_CONVERT_SPACE_OBJECT) {
+ if((to == NODE_VECTOR_TRANSFORM_CONVERT_SPACE_WORLD || to == NODE_VECTOR_TRANSFORM_CONVERT_SPACE_CAMERA) && is_object) {
+ if(is_direction)
object_dir_transform(kg, sd, &in);
else
object_position_transform(kg, sd, &in);
}
- if(to == NODE_VECTOR_TRANSFORM_CONVERT_TO_CAMERA) {
+ if(to == NODE_VECTOR_TRANSFORM_CONVERT_SPACE_CAMERA) {
tfm = kernel_data.cam.worldtocamera;
- if(type == NODE_VECTOR_TRANSFORM_TYPE_VECTOR)
+ if(is_direction)
in = transform_direction(&tfm, in);
else
in = transform_point(&tfm, in);
}
}
+ /* Normalize Normal */
+ if(type == NODE_VECTOR_TRANSFORM_TYPE_NORMAL)
+ in = normalize(in);
+
/* Output */
if(stack_valid(vector_out)) {
stack_store_float3(stack, vector_out, in);
Modified: branches/soc-2013-dingto/intern/cycles/render/nodes.cpp
===================================================================
--- branches/soc-2013-dingto/intern/cycles/render/nodes.cpp 2013-07-31 19:03:42 UTC (rev 58774)
+++ branches/soc-2013-dingto/intern/cycles/render/nodes.cpp 2013-07-31 20:05:13 UTC (rev 58775)
@@ -3251,35 +3251,24 @@
enm.insert("Vector", NODE_VECTOR_TRANSFORM_TYPE_VECTOR);
enm.insert("Point", NODE_VECTOR_TRANSFORM_TYPE_POINT);
+ enm.insert("Normal", NODE_VECTOR_TRANSFORM_TYPE_NORMAL);
return enm;
}
-static ShaderEnum vector_transform_convert_from_init()
+static ShaderEnum vector_transform_convert_space_init()
{
ShaderEnum enm;
- enm.insert("world", NODE_VECTOR_TRANSFORM_CONVERT_FROM_WORLD);
- enm.insert("object", NODE_VECTOR_TRANSFORM_CONVERT_FROM_OBJECT);
- enm.insert("camera", NODE_VECTOR_TRANSFORM_CONVERT_FROM_CAMERA);
+ enm.insert("world", NODE_VECTOR_TRANSFORM_CONVERT_SPACE_WORLD);
+ enm.insert("object", NODE_VECTOR_TRANSFORM_CONVERT_SPACE_OBJECT);
+ enm.insert("camera", NODE_VECTOR_TRANSFORM_CONVERT_SPACE_CAMERA);
return enm;
}
-static ShaderEnum vector_transform_convert_to_init()
-{
- ShaderEnum enm;
-
- enm.insert("world", NODE_VECTOR_TRANSFORM_CONVERT_TO_WORLD);
- enm.insert("object", NODE_VECTOR_TRANSFORM_CONVERT_TO_OBJECT);
- enm.insert("camera", NODE_VECTOR_TRANSFORM_CONVERT_TO_CAMERA);
-
- return enm;
-}
-
ShaderEnum VectorTransformNode::type_enum = vector_transform_type_init();
-ShaderEnum VectorTransformNode::convert_from_enum = vector_transform_convert_from_init();
-ShaderEnum VectorTransformNode::convert_to_enum = vector_transform_convert_to_init();
+ShaderEnum VectorTransformNode::convert_space_enum = vector_transform_convert_space_init();
void VectorTransformNode::compile(SVMCompiler& compiler)
{
@@ -3290,7 +3279,7 @@
compiler.stack_assign(vector_out);
compiler.add_node(NODE_VECTOR_TRANSFORM,
- compiler.encode_uchar4(type_enum[type], convert_from_enum[convert_from], convert_to_enum[convert_to]),
+ compiler.encode_uchar4(type_enum[type], convert_space_enum[convert_from], convert_space_enum[convert_to]),
compiler.encode_uchar4(vector_in->stack_offset, vector_out->stack_offset));
}
Modified: branches/soc-2013-dingto/intern/cycles/render/nodes.h
===================================================================
--- branches/soc-2013-dingto/intern/cycles/render/nodes.h 2013-07-31 19:03:42 UTC (rev 58774)
+++ branches/soc-2013-dingto/intern/cycles/render/nodes.h 2013-07-31 20:05:13 UTC (rev 58775)
@@ -513,8 +513,7 @@
ustring convert_to;
static ShaderEnum type_enum;
- static ShaderEnum convert_from_enum;
- static ShaderEnum convert_to_enum;
+ static ShaderEnum convert_space_enum;
};
class BumpNode : public ShaderNode {
Modified: branches/soc-2013-dingto/source/blender/makesdna/DNA_node_types.h
===================================================================
--- branches/soc-2013-dingto/source/blender/makesdna/DNA_node_types.h 2013-07-31 19:03:42 UTC (rev 58774)
+++ branches/soc-2013-dingto/source/blender/makesdna/DNA_node_types.h 2013-07-31 20:05:13 UTC (rev 58775)
@@ -878,15 +878,12 @@
/* vector transform */
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list