diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2019-03-05 16:54:54 +0300 |
---|---|---|
committer | Stefan Werner <stefan.werner@tangent-animation.com> | 2019-03-05 16:55:21 +0300 |
commit | db7f9a70b0addd17a2f8a8d87c0b4d77d78b536e (patch) | |
tree | 46a8b0a62f146a17a2e764159b58a6f0c66e01f6 /intern/cycles/kernel/geom/geom_primitive.h | |
parent | a325bc6bf3e6dace5d1e15330650ea532052c9fc (diff) |
Cycles: Added Float2 attribute type.
Float2 are now a new type for attributes in Cycles. Before, the choices
for attribute storage were float and float3, the latter padded to
float4. This meant that UV maps were inflated to twice the size
necessary.
Reviewers: brecht, sergey
Reviewed By: brecht
Subscribers: #cycles
Tags: #cycles
Differential Revision: https://developer.blender.org/D4409
Diffstat (limited to 'intern/cycles/kernel/geom/geom_primitive.h')
-rw-r--r-- | intern/cycles/kernel/geom/geom_primitive.h | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/intern/cycles/kernel/geom/geom_primitive.h b/intern/cycles/kernel/geom/geom_primitive.h index e3e2648e9ec..c9b1995ee05 100644 --- a/intern/cycles/kernel/geom/geom_primitive.h +++ b/intern/cycles/kernel/geom/geom_primitive.h @@ -89,6 +89,37 @@ ccl_device_inline float primitive_volume_attribute_float(KernelGlobals *kg, } #endif +ccl_device_inline float2 primitive_attribute_float2(KernelGlobals *kg, + const ShaderData *sd, + const AttributeDescriptor desc, + float2 *dx, float2 *dy) +{ + if(sd->type & PRIMITIVE_ALL_TRIANGLE) { + if(subd_triangle_patch(kg, sd) == ~0) + return triangle_attribute_float2(kg, sd, desc, dx, dy); + else + return subd_triangle_attribute_float2(kg, sd, desc, dx, dy); + } +#ifdef __HAIR__ + else if(sd->type & PRIMITIVE_ALL_CURVE) { + return curve_attribute_float2(kg, sd, desc, dx, dy); + } +#endif +#ifdef __VOLUME__ + else if(sd->object != OBJECT_NONE && desc.element == ATTR_ELEMENT_VOXEL) { + kernel_assert(0); + if(dx) *dx = make_float2(0.0f, 0.0f); + if(dy) *dy = make_float2(0.0f, 0.0f); + return make_float2(0.0f, 0.0f); + } +#endif + else { + if(dx) *dx = make_float2(0.0f, 0.0f); + if(dy) *dy = make_float2(0.0f, 0.0f); + return make_float2(0.0f, 0.0f); + } +} + ccl_device_inline float3 primitive_attribute_float3(KernelGlobals *kg, const ShaderData *sd, const AttributeDescriptor desc, @@ -119,6 +150,29 @@ ccl_device_inline float3 primitive_attribute_float3(KernelGlobals *kg, } } +ccl_device_inline float2 primitive_surface_attribute_float2(KernelGlobals *kg, + const ShaderData *sd, + const AttributeDescriptor desc, + float2 *dx, float2 *dy) +{ + if(sd->type & PRIMITIVE_ALL_TRIANGLE) { + if(subd_triangle_patch(kg, sd) == ~0) + return triangle_attribute_float2(kg, sd, desc, dx, dy); + else + return subd_triangle_attribute_float2(kg, sd, desc, dx, dy); + } +#ifdef __HAIR__ + else if(sd->type & PRIMITIVE_ALL_CURVE) { + return curve_attribute_float2(kg, sd, desc, dx, dy); + } +#endif + else { + if(dx) *dx = make_float2(0.0f, 0.0f); + if(dy) *dy = make_float2(0.0f, 0.0f); + return make_float2(0.0f, 0.0f); + } +} + ccl_device_inline float3 primitive_surface_attribute_float3(KernelGlobals *kg, const ShaderData *sd, const AttributeDescriptor desc, |