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!
This commit is contained in:
Thomas Dinges
2013-07-31 20:05:13 +00:00
parent b6024a0e75
commit 2a25acb108
8 changed files with 56 additions and 75 deletions

View File

@@ -260,8 +260,8 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
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)) {

View File

@@ -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);
}
}

View File

@@ -232,20 +232,15 @@ typedef enum NodeVectorMath {
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 NodeVectorTransformConvertTo {
NODE_VECTOR_TRANSFORM_CONVERT_TO_WORLD,
NODE_VECTOR_TRANSFORM_CONVERT_TO_OBJECT,
NODE_VECTOR_TRANSFORM_CONVERT_TO_CAMERA
} NodeVectorTransformConvertTo;
typedef enum NodeVectorTransformConvertSpace {
NODE_VECTOR_TRANSFORM_CONVERT_SPACE_WORLD,
NODE_VECTOR_TRANSFORM_CONVERT_SPACE_OBJECT,
NODE_VECTOR_TRANSFORM_CONVERT_SPACE_CAMERA
} NodeVectorTransformConvertSpace;
typedef enum NodeConvert {
NODE_CONVERT_FV,

View File

@@ -31,23 +31,24 @@ __device void svm_node_vector_transform(KernelGlobals *kg, ShaderData *sd, float
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 @@ __device void svm_node_vector_transform(KernelGlobals *kg, ShaderData *sd, float
}
/* 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 @@ __device void svm_node_vector_transform(KernelGlobals *kg, ShaderData *sd, float
}
/* 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);

View File

@@ -3251,35 +3251,24 @@ static ShaderEnum vector_transform_type_init()
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);
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);
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;
}
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 @@ void VectorTransformNode::compile(SVMCompiler& compiler)
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));
}

View File

@@ -513,8 +513,7 @@ public:
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 {

View File

@@ -878,14 +878,11 @@ typedef struct NodeShaderNormalMap {
/* vector transform */
#define SHD_VECT_TRANSFORM_TYPE_VECTOR 0
#define SHD_VECT_TRANSFORM_TYPE_POINT 1
#define SHD_VECT_TRANSFORM_TYPE_NORMAL 2
#define SHD_VECT_TRANSFORM_FROM_WORLD 0
#define SHD_VECT_TRANSFORM_FROM_OBJECT 1
#define SHD_VECT_TRANSFORM_FROM_CAMERA 2
#define SHD_VECT_TRANSFORM_TO_WORLD 0
#define SHD_VECT_TRANSFORM_TO_OBJECT 1
#define SHD_VECT_TRANSFORM_TO_CAMERA 2
#define SHD_VECT_TRANSFORM_SPACE_WORLD 0
#define SHD_VECT_TRANSFORM_SPACE_OBJECT 1
#define SHD_VECT_TRANSFORM_SPACE_CAMERA 2
/* toon modes */
#define SHD_TOON_DIFFUSE 0

View File

@@ -3514,20 +3514,14 @@ static void def_sh_vect_transform(StructRNA *srna)
static EnumPropertyItem prop_vect_type_items[] = {
{SHD_VECT_TRANSFORM_TYPE_VECTOR, "VECTOR", 0, "Vector", ""},
{SHD_VECT_TRANSFORM_TYPE_POINT, "POINT", 0, "Point", ""},
{SHD_VECT_TRANSFORM_TYPE_NORMAL, "NORMAL", 0, "Normal", ""},
{0, NULL, 0, NULL, NULL}
};
static EnumPropertyItem prop_vect_from_items[] = {
{SHD_VECT_TRANSFORM_FROM_WORLD, "WORLD", 0, "World", ""},
{SHD_VECT_TRANSFORM_FROM_OBJECT, "OBJECT", 0, "Object", ""},
{SHD_VECT_TRANSFORM_FROM_CAMERA, "CAMERA", 0, "Camera", ""},
{0, NULL, 0, NULL, NULL}
};
static EnumPropertyItem prop_vect_to_items[] = {
{SHD_VECT_TRANSFORM_TO_WORLD, "WORLD", 0, "World", ""},
{SHD_VECT_TRANSFORM_TO_OBJECT, "OBJECT", 0, "Object", ""},
{SHD_VECT_TRANSFORM_TO_CAMERA, "CAMERA", 0, "Camera", ""},
static EnumPropertyItem prop_vect_space_items[] = {
{SHD_VECT_TRANSFORM_SPACE_WORLD, "WORLD", 0, "World", ""},
{SHD_VECT_TRANSFORM_SPACE_OBJECT, "OBJECT", 0, "Object", ""},
{SHD_VECT_TRANSFORM_SPACE_CAMERA, "CAMERA", 0, "Camera", ""},
{0, NULL, 0, NULL, NULL}
};
@@ -3541,12 +3535,12 @@ static void def_sh_vect_transform(StructRNA *srna)
RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "convert_from", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, prop_vect_from_items);
RNA_def_property_enum_items(prop, prop_vect_space_items);
RNA_def_property_ui_text(prop, "Convert From", "Space to convert from");
RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "convert_to", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, prop_vect_to_items);
RNA_def_property_enum_items(prop, prop_vect_space_items);
RNA_def_property_ui_text(prop, "Convert To", "Space to convert to");
RNA_def_property_update(prop, 0, "rna_Node_update");
}