Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/kernel/geom/curve.h
| Show First 20 Lines • Show All 120 Lines • ▼ Show 20 Lines | ccl_device float3 curve_attribute_float3(KernelGlobals kg, | ||||
| ccl_private float3 *dx, | ccl_private float3 *dx, | ||||
| ccl_private float3 *dy) | ccl_private float3 *dy) | ||||
| { | { | ||||
| if (desc.element & (ATTR_ELEMENT_CURVE_KEY | ATTR_ELEMENT_CURVE_KEY_MOTION)) { | if (desc.element & (ATTR_ELEMENT_CURVE_KEY | ATTR_ELEMENT_CURVE_KEY_MOTION)) { | ||||
| KernelCurve curve = kernel_tex_fetch(__curves, sd->prim); | KernelCurve curve = kernel_tex_fetch(__curves, sd->prim); | ||||
| int k0 = curve.first_key + PRIMITIVE_UNPACK_SEGMENT(sd->type); | int k0 = curve.first_key + PRIMITIVE_UNPACK_SEGMENT(sd->type); | ||||
| int k1 = k0 + 1; | int k1 = k0 + 1; | ||||
| float3 f0 = float4_to_float3(kernel_tex_fetch(__attributes_float3, desc.offset + k0)); | float3 f0 = kernel_tex_fetch(__attributes_float3, desc.offset + k0); | ||||
| float3 f1 = float4_to_float3(kernel_tex_fetch(__attributes_float3, desc.offset + k1)); | float3 f1 = kernel_tex_fetch(__attributes_float3, desc.offset + k1); | ||||
| # ifdef __RAY_DIFFERENTIALS__ | # ifdef __RAY_DIFFERENTIALS__ | ||||
| if (dx) | if (dx) | ||||
| *dx = sd->du.dx * (f1 - f0); | *dx = sd->du.dx * (f1 - f0); | ||||
| if (dy) | if (dy) | ||||
| *dy = make_float3(0.0f, 0.0f, 0.0f); | *dy = make_float3(0.0f, 0.0f, 0.0f); | ||||
| # endif | # endif | ||||
| return (1.0f - sd->u) * f0 + sd->u * f1; | return (1.0f - sd->u) * f0 + sd->u * f1; | ||||
| } | } | ||||
| else { | else { | ||||
| # ifdef __RAY_DIFFERENTIALS__ | # ifdef __RAY_DIFFERENTIALS__ | ||||
| if (dx) | if (dx) | ||||
| *dx = make_float3(0.0f, 0.0f, 0.0f); | *dx = make_float3(0.0f, 0.0f, 0.0f); | ||||
| if (dy) | if (dy) | ||||
| *dy = make_float3(0.0f, 0.0f, 0.0f); | *dy = make_float3(0.0f, 0.0f, 0.0f); | ||||
| # endif | # endif | ||||
| if (desc.element & (ATTR_ELEMENT_CURVE | ATTR_ELEMENT_OBJECT | ATTR_ELEMENT_MESH)) { | if (desc.element & (ATTR_ELEMENT_CURVE | ATTR_ELEMENT_OBJECT | ATTR_ELEMENT_MESH)) { | ||||
| const int offset = (desc.element == ATTR_ELEMENT_CURVE) ? desc.offset + sd->prim : | const int offset = (desc.element == ATTR_ELEMENT_CURVE) ? desc.offset + sd->prim : | ||||
| desc.offset; | desc.offset; | ||||
| return float4_to_float3(kernel_tex_fetch(__attributes_float3, offset)); | return kernel_tex_fetch(__attributes_float3, offset); | ||||
| } | } | ||||
| else { | else { | ||||
| return make_float3(0.0f, 0.0f, 0.0f); | return make_float3(0.0f, 0.0f, 0.0f); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| ccl_device float4 curve_attribute_float4(KernelGlobals kg, | ccl_device float4 curve_attribute_float4(KernelGlobals kg, | ||||
| ccl_private const ShaderData *sd, | ccl_private const ShaderData *sd, | ||||
| const AttributeDescriptor desc, | const AttributeDescriptor desc, | ||||
| ccl_private float4 *dx, | ccl_private float4 *dx, | ||||
| ccl_private float4 *dy) | ccl_private float4 *dy) | ||||
| { | { | ||||
| if (desc.element & (ATTR_ELEMENT_CURVE_KEY | ATTR_ELEMENT_CURVE_KEY_MOTION)) { | if (desc.element & (ATTR_ELEMENT_CURVE_KEY | ATTR_ELEMENT_CURVE_KEY_MOTION)) { | ||||
| KernelCurve curve = kernel_tex_fetch(__curves, sd->prim); | KernelCurve curve = kernel_tex_fetch(__curves, sd->prim); | ||||
| int k0 = curve.first_key + PRIMITIVE_UNPACK_SEGMENT(sd->type); | int k0 = curve.first_key + PRIMITIVE_UNPACK_SEGMENT(sd->type); | ||||
| int k1 = k0 + 1; | int k1 = k0 + 1; | ||||
| float4 f0 = kernel_tex_fetch(__attributes_float3, desc.offset + k0); | float4 f0 = kernel_tex_fetch(__attributes_float4, desc.offset + k0); | ||||
| float4 f1 = kernel_tex_fetch(__attributes_float3, desc.offset + k1); | float4 f1 = kernel_tex_fetch(__attributes_float4, desc.offset + k1); | ||||
| # ifdef __RAY_DIFFERENTIALS__ | # ifdef __RAY_DIFFERENTIALS__ | ||||
| if (dx) | if (dx) | ||||
| *dx = sd->du.dx * (f1 - f0); | *dx = sd->du.dx * (f1 - f0); | ||||
| if (dy) | if (dy) | ||||
| *dy = make_float4(0.0f, 0.0f, 0.0f, 0.0f); | *dy = make_float4(0.0f, 0.0f, 0.0f, 0.0f); | ||||
| # endif | # endif | ||||
| return (1.0f - sd->u) * f0 + sd->u * f1; | return (1.0f - sd->u) * f0 + sd->u * f1; | ||||
| } | } | ||||
| else { | else { | ||||
| # ifdef __RAY_DIFFERENTIALS__ | # ifdef __RAY_DIFFERENTIALS__ | ||||
| if (dx) | if (dx) | ||||
| *dx = make_float4(0.0f, 0.0f, 0.0f, 0.0f); | *dx = make_float4(0.0f, 0.0f, 0.0f, 0.0f); | ||||
| if (dy) | if (dy) | ||||
| *dy = make_float4(0.0f, 0.0f, 0.0f, 0.0f); | *dy = make_float4(0.0f, 0.0f, 0.0f, 0.0f); | ||||
| # endif | # endif | ||||
| if (desc.element & (ATTR_ELEMENT_CURVE | ATTR_ELEMENT_OBJECT | ATTR_ELEMENT_MESH)) { | if (desc.element & (ATTR_ELEMENT_CURVE | ATTR_ELEMENT_OBJECT | ATTR_ELEMENT_MESH)) { | ||||
| const int offset = (desc.element == ATTR_ELEMENT_CURVE) ? desc.offset + sd->prim : | const int offset = (desc.element == ATTR_ELEMENT_CURVE) ? desc.offset + sd->prim : | ||||
| desc.offset; | desc.offset; | ||||
| return kernel_tex_fetch(__attributes_float3, offset); | return kernel_tex_fetch(__attributes_float4, offset); | ||||
| } | } | ||||
| else { | else { | ||||
| return make_float4(0.0f, 0.0f, 0.0f, 0.0f); | return make_float4(0.0f, 0.0f, 0.0f, 0.0f); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| /* Curve thickness */ | /* Curve thickness */ | ||||
| ▲ Show 20 Lines • Show All 126 Lines • Show Last 20 Lines | |||||