Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/kernel/geom/subd_triangle.h
| Show First 20 Lines • Show All 437 Lines • ▼ Show 20 Lines | # endif | ||||
| else | else | ||||
| #endif /* __PATCH_EVAL__ */ | #endif /* __PATCH_EVAL__ */ | ||||
| if (desc.element == ATTR_ELEMENT_FACE) { | if (desc.element == ATTR_ELEMENT_FACE) { | ||||
| 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); | ||||
| return float4_to_float3( | return kernel_tex_fetch(__attributes_float3, | ||||
| kernel_tex_fetch(__attributes_float3, desc.offset + subd_triangle_patch_face(kg, patch))); | desc.offset + subd_triangle_patch_face(kg, patch)); | ||||
| } | } | ||||
| else if (desc.element == ATTR_ELEMENT_VERTEX || desc.element == ATTR_ELEMENT_VERTEX_MOTION) { | else if (desc.element == ATTR_ELEMENT_VERTEX || desc.element == ATTR_ELEMENT_VERTEX_MOTION) { | ||||
| float2 uv[3]; | float2 uv[3]; | ||||
| subd_triangle_patch_uv(kg, sd, uv); | subd_triangle_patch_uv(kg, sd, uv); | ||||
| uint4 v = subd_triangle_patch_indices(kg, patch); | uint4 v = subd_triangle_patch_indices(kg, patch); | ||||
| float3 f0 = float4_to_float3(kernel_tex_fetch(__attributes_float3, desc.offset + v.x)); | float3 f0 = kernel_tex_fetch(__attributes_float3, desc.offset + v.x); | ||||
| float3 f1 = float4_to_float3(kernel_tex_fetch(__attributes_float3, desc.offset + v.y)); | float3 f1 = kernel_tex_fetch(__attributes_float3, desc.offset + v.y); | ||||
| float3 f2 = float4_to_float3(kernel_tex_fetch(__attributes_float3, desc.offset + v.z)); | float3 f2 = kernel_tex_fetch(__attributes_float3, desc.offset + v.z); | ||||
| float3 f3 = float4_to_float3(kernel_tex_fetch(__attributes_float3, desc.offset + v.w)); | float3 f3 = kernel_tex_fetch(__attributes_float3, desc.offset + v.w); | ||||
| if (subd_triangle_patch_num_corners(kg, patch) != 4) { | if (subd_triangle_patch_num_corners(kg, patch) != 4) { | ||||
| f1 = (f1 + f0) * 0.5f; | f1 = (f1 + f0) * 0.5f; | ||||
| f3 = (f3 + f0) * 0.5f; | f3 = (f3 + f0) * 0.5f; | ||||
| } | } | ||||
| float3 a = mix(mix(f0, f1, uv[0].x), mix(f3, f2, uv[0].x), uv[0].y); | float3 a = mix(mix(f0, f1, uv[0].x), mix(f3, f2, uv[0].x), uv[0].y); | ||||
| float3 b = mix(mix(f0, f1, uv[1].x), mix(f3, f2, uv[1].x), uv[1].y); | float3 b = mix(mix(f0, f1, uv[1].x), mix(f3, f2, uv[1].x), uv[1].y); | ||||
| Show All 12 Lines | else if (desc.element == ATTR_ELEMENT_CORNER) { | ||||
| float2 uv[3]; | float2 uv[3]; | ||||
| subd_triangle_patch_uv(kg, sd, uv); | subd_triangle_patch_uv(kg, sd, uv); | ||||
| int corners[4]; | int corners[4]; | ||||
| subd_triangle_patch_corners(kg, patch, corners); | subd_triangle_patch_corners(kg, patch, corners); | ||||
| float3 f0, f1, f2, f3; | float3 f0, f1, f2, f3; | ||||
| f0 = float4_to_float3(kernel_tex_fetch(__attributes_float3, corners[0] + desc.offset)); | f0 = kernel_tex_fetch(__attributes_float3, corners[0] + desc.offset); | ||||
| f1 = float4_to_float3(kernel_tex_fetch(__attributes_float3, corners[1] + desc.offset)); | f1 = kernel_tex_fetch(__attributes_float3, corners[1] + desc.offset); | ||||
| f2 = float4_to_float3(kernel_tex_fetch(__attributes_float3, corners[2] + desc.offset)); | f2 = kernel_tex_fetch(__attributes_float3, corners[2] + desc.offset); | ||||
| f3 = float4_to_float3(kernel_tex_fetch(__attributes_float3, corners[3] + desc.offset)); | f3 = kernel_tex_fetch(__attributes_float3, corners[3] + desc.offset); | ||||
| if (subd_triangle_patch_num_corners(kg, patch) != 4) { | if (subd_triangle_patch_num_corners(kg, patch) != 4) { | ||||
| f1 = (f1 + f0) * 0.5f; | f1 = (f1 + f0) * 0.5f; | ||||
| f3 = (f3 + f0) * 0.5f; | f3 = (f3 + f0) * 0.5f; | ||||
| } | } | ||||
| float3 a = mix(mix(f0, f1, uv[0].x), mix(f3, f2, uv[0].x), uv[0].y); | float3 a = mix(mix(f0, f1, uv[0].x), mix(f3, f2, uv[0].x), uv[0].y); | ||||
| float3 b = mix(mix(f0, f1, uv[1].x), mix(f3, f2, uv[1].x), uv[1].y); | float3 b = mix(mix(f0, f1, uv[1].x), mix(f3, f2, uv[1].x), uv[1].y); | ||||
| Show All 9 Lines | #endif | ||||
| return sd->u * a + sd->v * b + (1.0f - sd->u - sd->v) * c; | return sd->u * a + sd->v * b + (1.0f - sd->u - sd->v) * c; | ||||
| } | } | ||||
| else if (desc.element == ATTR_ELEMENT_OBJECT || desc.element == ATTR_ELEMENT_MESH) { | else if (desc.element == ATTR_ELEMENT_OBJECT || desc.element == ATTR_ELEMENT_MESH) { | ||||
| 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); | ||||
| return float4_to_float3(kernel_tex_fetch(__attributes_float3, desc.offset)); | return kernel_tex_fetch(__attributes_float3, desc.offset); | ||||
| } | } | ||||
| else { | else { | ||||
| 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); | ||||
| return make_float3(0.0f, 0.0f, 0.0f); | return make_float3(0.0f, 0.0f, 0.0f); | ||||
| ▲ Show 20 Lines • Show All 60 Lines • ▼ Show 20 Lines | # endif | ||||
| else | else | ||||
| #endif /* __PATCH_EVAL__ */ | #endif /* __PATCH_EVAL__ */ | ||||
| if (desc.element == ATTR_ELEMENT_FACE) { | if (desc.element == ATTR_ELEMENT_FACE) { | ||||
| 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); | ||||
| return kernel_tex_fetch(__attributes_float3, | return kernel_tex_fetch(__attributes_float4, | ||||
| desc.offset + subd_triangle_patch_face(kg, patch)); | desc.offset + subd_triangle_patch_face(kg, patch)); | ||||
| } | } | ||||
| else if (desc.element == ATTR_ELEMENT_VERTEX || desc.element == ATTR_ELEMENT_VERTEX_MOTION) { | else if (desc.element == ATTR_ELEMENT_VERTEX || desc.element == ATTR_ELEMENT_VERTEX_MOTION) { | ||||
| float2 uv[3]; | float2 uv[3]; | ||||
| subd_triangle_patch_uv(kg, sd, uv); | subd_triangle_patch_uv(kg, sd, uv); | ||||
| uint4 v = subd_triangle_patch_indices(kg, patch); | uint4 v = subd_triangle_patch_indices(kg, patch); | ||||
| float4 f0 = kernel_tex_fetch(__attributes_float3, desc.offset + v.x); | float4 f0 = kernel_tex_fetch(__attributes_float4, desc.offset + v.x); | ||||
| float4 f1 = kernel_tex_fetch(__attributes_float3, desc.offset + v.y); | float4 f1 = kernel_tex_fetch(__attributes_float4, desc.offset + v.y); | ||||
| float4 f2 = kernel_tex_fetch(__attributes_float3, desc.offset + v.z); | float4 f2 = kernel_tex_fetch(__attributes_float4, desc.offset + v.z); | ||||
| float4 f3 = kernel_tex_fetch(__attributes_float3, desc.offset + v.w); | float4 f3 = kernel_tex_fetch(__attributes_float4, desc.offset + v.w); | ||||
| if (subd_triangle_patch_num_corners(kg, patch) != 4) { | if (subd_triangle_patch_num_corners(kg, patch) != 4) { | ||||
| f1 = (f1 + f0) * 0.5f; | f1 = (f1 + f0) * 0.5f; | ||||
| f3 = (f3 + f0) * 0.5f; | f3 = (f3 + f0) * 0.5f; | ||||
| } | } | ||||
| float4 a = mix(mix(f0, f1, uv[0].x), mix(f3, f2, uv[0].x), uv[0].y); | float4 a = mix(mix(f0, f1, uv[0].x), mix(f3, f2, uv[0].x), uv[0].y); | ||||
| float4 b = mix(mix(f0, f1, uv[1].x), mix(f3, f2, uv[1].x), uv[1].y); | float4 b = mix(mix(f0, f1, uv[1].x), mix(f3, f2, uv[1].x), uv[1].y); | ||||
| Show All 23 Lines | if (desc.element == ATTR_ELEMENT_CORNER_BYTE) { | ||||
| f1 = color_srgb_to_linear_v4( | f1 = color_srgb_to_linear_v4( | ||||
| color_uchar4_to_float4(kernel_tex_fetch(__attributes_uchar4, corners[1] + desc.offset))); | color_uchar4_to_float4(kernel_tex_fetch(__attributes_uchar4, corners[1] + desc.offset))); | ||||
| f2 = color_srgb_to_linear_v4( | f2 = color_srgb_to_linear_v4( | ||||
| color_uchar4_to_float4(kernel_tex_fetch(__attributes_uchar4, corners[2] + desc.offset))); | color_uchar4_to_float4(kernel_tex_fetch(__attributes_uchar4, corners[2] + desc.offset))); | ||||
| f3 = color_srgb_to_linear_v4( | f3 = color_srgb_to_linear_v4( | ||||
| color_uchar4_to_float4(kernel_tex_fetch(__attributes_uchar4, corners[3] + desc.offset))); | color_uchar4_to_float4(kernel_tex_fetch(__attributes_uchar4, corners[3] + desc.offset))); | ||||
| } | } | ||||
| else { | else { | ||||
| f0 = kernel_tex_fetch(__attributes_float3, corners[0] + desc.offset); | f0 = kernel_tex_fetch(__attributes_float4, corners[0] + desc.offset); | ||||
| f1 = kernel_tex_fetch(__attributes_float3, corners[1] + desc.offset); | f1 = kernel_tex_fetch(__attributes_float4, corners[1] + desc.offset); | ||||
| f2 = kernel_tex_fetch(__attributes_float3, corners[2] + desc.offset); | f2 = kernel_tex_fetch(__attributes_float4, corners[2] + desc.offset); | ||||
| f3 = kernel_tex_fetch(__attributes_float3, corners[3] + desc.offset); | f3 = kernel_tex_fetch(__attributes_float4, corners[3] + desc.offset); | ||||
| } | } | ||||
| if (subd_triangle_patch_num_corners(kg, patch) != 4) { | if (subd_triangle_patch_num_corners(kg, patch) != 4) { | ||||
| f1 = (f1 + f0) * 0.5f; | f1 = (f1 + f0) * 0.5f; | ||||
| f3 = (f3 + f0) * 0.5f; | f3 = (f3 + f0) * 0.5f; | ||||
| } | } | ||||
| float4 a = mix(mix(f0, f1, uv[0].x), mix(f3, f2, uv[0].x), uv[0].y); | float4 a = mix(mix(f0, f1, uv[0].x), mix(f3, f2, uv[0].x), uv[0].y); | ||||
| Show All 10 Lines | #endif | ||||
| return sd->u * a + sd->v * b + (1.0f - sd->u - sd->v) * c; | return sd->u * a + sd->v * b + (1.0f - sd->u - sd->v) * c; | ||||
| } | } | ||||
| else if (desc.element == ATTR_ELEMENT_OBJECT || desc.element == ATTR_ELEMENT_MESH) { | else if (desc.element == ATTR_ELEMENT_OBJECT || desc.element == ATTR_ELEMENT_MESH) { | ||||
| 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); | ||||
| return kernel_tex_fetch(__attributes_float3, desc.offset); | return kernel_tex_fetch(__attributes_float4, desc.offset); | ||||
| } | } | ||||
| else { | else { | ||||
| 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); | ||||
| return make_float4(0.0f, 0.0f, 0.0f, 0.0f); | return make_float4(0.0f, 0.0f, 0.0f, 0.0f); | ||||
| } | } | ||||
| } | } | ||||
| CCL_NAMESPACE_END | CCL_NAMESPACE_END | ||||