diff options
Diffstat (limited to 'intern/cycles/kernel/svm/svm_attribute.h')
-rw-r--r-- | intern/cycles/kernel/svm/svm_attribute.h | 47 |
1 files changed, 38 insertions, 9 deletions
diff --git a/intern/cycles/kernel/svm/svm_attribute.h b/intern/cycles/kernel/svm/svm_attribute.h index ef6f7d7cbb5..c2366df71d0 100644 --- a/intern/cycles/kernel/svm/svm_attribute.h +++ b/intern/cycles/kernel/svm/svm_attribute.h @@ -52,18 +52,27 @@ ccl_device void svm_node_attr(KernelGlobals *kg, ShaderData *sd, float *stack, u AttributeDescriptor desc = svm_node_attr_init(kg, sd, node, &type, &out_offset); /* fetch and store attribute */ - if (desc.type == NODE_ATTR_FLOAT) { + if(desc.type == NODE_ATTR_FLOAT) { float f = primitive_attribute_float(kg, sd, desc, NULL, NULL); - if (type == NODE_ATTR_FLOAT) { + if(type == NODE_ATTR_FLOAT) { stack_store_float(stack, out_offset, f); } else { stack_store_float3(stack, out_offset, make_float3(f, f, f)); } } + else if(desc.type == NODE_ATTR_FLOAT2) { + float2 f = primitive_attribute_float2(kg, sd, desc, NULL, NULL); + if(type == NODE_ATTR_FLOAT) { + stack_store_float(stack, out_offset, f.x); + } + else { + stack_store_float3(stack, out_offset, make_float3(f.x, f.y, 0.0f)); + } + } else { float3 f = primitive_attribute_float3(kg, sd, desc, NULL, NULL); - if (type == NODE_ATTR_FLOAT) { + if(type == NODE_ATTR_FLOAT) { stack_store_float(stack, out_offset, average(f)); } else { @@ -84,20 +93,30 @@ void svm_node_attr_bump_dx(KernelGlobals *kg, ShaderData *sd, float *stack, uint AttributeDescriptor desc = svm_node_attr_init(kg, sd, node, &type, &out_offset); /* fetch and store attribute */ - if (desc.type == NODE_ATTR_FLOAT) { + if(desc.type == NODE_ATTR_FLOAT) { float dx; float f = primitive_surface_attribute_float(kg, sd, desc, &dx, NULL); - if (type == NODE_ATTR_FLOAT) { + if(type == NODE_ATTR_FLOAT) { stack_store_float(stack, out_offset, f+dx); } else { stack_store_float3(stack, out_offset, make_float3(f+dx, f+dx, f+dx)); } } + else if(desc.type == NODE_ATTR_FLOAT2) { + float2 dx; + float2 f = primitive_attribute_float2(kg, sd, desc, &dx, NULL); + if (type == NODE_ATTR_FLOAT) { + stack_store_float(stack, out_offset, f.x + dx.x); + } + else { + stack_store_float3(stack, out_offset, make_float3(f.x+dx.x, f.y+dx.y, 0.0f)); + } + } else { float3 dx; float3 f = primitive_surface_attribute_float3(kg, sd, desc, &dx, NULL); - if (type == NODE_ATTR_FLOAT) { + if(type == NODE_ATTR_FLOAT) { stack_store_float(stack, out_offset, average(f+dx)); } else { @@ -121,20 +140,30 @@ void svm_node_attr_bump_dy(KernelGlobals *kg, AttributeDescriptor desc = svm_node_attr_init(kg, sd, node, &type, &out_offset); /* fetch and store attribute */ - if (desc.type == NODE_ATTR_FLOAT) { + if(desc.type == NODE_ATTR_FLOAT) { float dy; float f = primitive_surface_attribute_float(kg, sd, desc, NULL, &dy); - if (type == NODE_ATTR_FLOAT) { + if(type == NODE_ATTR_FLOAT) { stack_store_float(stack, out_offset, f+dy); } else { stack_store_float3(stack, out_offset, make_float3(f+dy, f+dy, f+dy)); } } + else if(desc.type == NODE_ATTR_FLOAT2) { + float2 dy; + float2 f = primitive_attribute_float2(kg, sd, desc, NULL, &dy); + if(type == NODE_ATTR_FLOAT) { + stack_store_float(stack, out_offset, f.x + dy.x); + } + else { + stack_store_float3(stack, out_offset, make_float3(f.x+dy.x, f.y+dy.y, 0.0f)); + } + } else { float3 dy; float3 f = primitive_surface_attribute_float3(kg, sd, desc, NULL, &dy); - if (type == NODE_ATTR_FLOAT) { + if(type == NODE_ATTR_FLOAT) { stack_store_float(stack, out_offset, average(f+dy)); } else { |