diff options
author | Alexander Gavrilov <angavrilov@gmail.com> | 2020-10-26 20:23:40 +0300 |
---|---|---|
committer | Brecht Van Lommel <brecht@blender.org> | 2020-10-28 14:43:42 +0300 |
commit | d58b55b55a0197c397810766446f18d64a8d4a6b (patch) | |
tree | 81f61f20e693708075e5a26ae0fde1f6b35212b2 /intern/cycles/kernel/geom/geom_triangle.h | |
parent | ee6b989f8e2ae99c28441ab8663a99bfd16b6c65 (diff) |
Cycles: internal support for float4 geometry attributes
Previously only float3 and byte4 was supported.
Ref D2057
Diffstat (limited to 'intern/cycles/kernel/geom/geom_triangle.h')
-rw-r--r-- | intern/cycles/kernel/geom/geom_triangle.h | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/intern/cycles/kernel/geom/geom_triangle.h b/intern/cycles/kernel/geom/geom_triangle.h index 0278f3ade8e..45fd761b13f 100644 --- a/intern/cycles/kernel/geom/geom_triangle.h +++ b/intern/cycles/kernel/geom/geom_triangle.h @@ -312,20 +312,43 @@ ccl_device float4 triangle_attribute_float4(KernelGlobals *kg, float4 *dx, float4 *dy) { - if (desc.element == ATTR_ELEMENT_CORNER_BYTE || desc.element == ATTR_ELEMENT_VERTEX) { + if (desc.element == ATTR_ELEMENT_FACE) { + if (dx) + *dx = make_float4(0.0f, 0.0f, 0.0f, 0.0f); + if (dy) + *dy = make_float4(0.0f, 0.0f, 0.0f, 0.0f); + + return kernel_tex_fetch(__attributes_float3, desc.offset + sd->prim); + } + else if (desc.element == ATTR_ELEMENT_VERTEX || desc.element == ATTR_ELEMENT_VERTEX_MOTION) { + uint4 tri_vindex = kernel_tex_fetch(__tri_vindex, sd->prim); + + float4 f0 = kernel_tex_fetch(__attributes_float3, desc.offset + tri_vindex.x); + float4 f1 = kernel_tex_fetch(__attributes_float3, desc.offset + tri_vindex.y); + float4 f2 = kernel_tex_fetch(__attributes_float3, desc.offset + tri_vindex.z); + +#ifdef __RAY_DIFFERENTIALS__ + if (dx) + *dx = sd->du.dx * f0 + sd->dv.dx * f1 - (sd->du.dx + sd->dv.dx) * f2; + if (dy) + *dy = sd->du.dy * f0 + sd->dv.dy * f1 - (sd->du.dy + sd->dv.dy) * f2; +#endif + + return sd->u * f0 + sd->v * f1 + (1.0f - sd->u - sd->v) * f2; + } + else if (desc.element == ATTR_ELEMENT_CORNER || desc.element == ATTR_ELEMENT_CORNER_BYTE) { + int tri = desc.offset + sd->prim * 3; float4 f0, f1, f2; if (desc.element == ATTR_ELEMENT_CORNER_BYTE) { - int tri = desc.offset + sd->prim * 3; f0 = color_uchar4_to_float4(kernel_tex_fetch(__attributes_uchar4, tri + 0)); f1 = color_uchar4_to_float4(kernel_tex_fetch(__attributes_uchar4, tri + 1)); f2 = color_uchar4_to_float4(kernel_tex_fetch(__attributes_uchar4, tri + 2)); } else { - uint4 tri_vindex = kernel_tex_fetch(__tri_vindex, sd->prim); - f0 = kernel_tex_fetch(__attributes_float3, desc.offset + tri_vindex.x); - f1 = kernel_tex_fetch(__attributes_float3, desc.offset + tri_vindex.y); - f2 = kernel_tex_fetch(__attributes_float3, desc.offset + tri_vindex.z); + f0 = kernel_tex_fetch(__attributes_float3, tri + 0); + f1 = kernel_tex_fetch(__attributes_float3, tri + 1); + f2 = kernel_tex_fetch(__attributes_float3, tri + 2); } #ifdef __RAY_DIFFERENTIALS__ @@ -343,7 +366,7 @@ ccl_device float4 triangle_attribute_float4(KernelGlobals *kg, if (dy) *dy = make_float4(0.0f, 0.0f, 0.0f, 0.0f); - return color_uchar4_to_float4(kernel_tex_fetch(__attributes_uchar4, desc.offset)); + return kernel_tex_fetch(__attributes_float3, desc.offset); } else { if (dx) |