Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/kernel/geom/geom_patch.h
| Show First 20 Lines • Show All 58 Lines • ▼ Show 20 Lines | ccl_device_inline int patch_map_resolve_quadrant(float median, | ||||
| } | } | ||||
| return quadrant; | return quadrant; | ||||
| } | } | ||||
| /* retrieve PatchHandle from patch coords */ | /* retrieve PatchHandle from patch coords */ | ||||
| ccl_device_inline PatchHandle | ccl_device_inline PatchHandle | ||||
| patch_map_find_patch(ccl_global const KernelGlobals *kg, int object, int patch, float u, float v) | patch_map_find_patch(KernelGlobals kg, int object, int patch, float u, float v) | ||||
| { | { | ||||
| PatchHandle handle; | PatchHandle handle; | ||||
| kernel_assert((u >= 0.0f) && (u <= 1.0f) && (v >= 0.0f) && (v <= 1.0f)); | kernel_assert((u >= 0.0f) && (u <= 1.0f) && (v >= 0.0f) && (v <= 1.0f)); | ||||
| int node = (object_patch_map_offset(kg, object) + patch) / 2; | int node = (object_patch_map_offset(kg, object) + patch) / 2; | ||||
| float median = 0.5f; | float median = 0.5f; | ||||
| ▲ Show 20 Lines • Show All 120 Lines • ▼ Show 20 Lines | ccl_device_inline void patch_eval_normalize_coords(uint patch_bits, | ||||
| /* normalize uv coordinates */ | /* normalize uv coordinates */ | ||||
| *u = (*u - pu) / frac; | *u = (*u - pu) / frac; | ||||
| *v = (*v - pv) / frac; | *v = (*v - pv) / frac; | ||||
| } | } | ||||
| /* retrieve patch control indices */ | /* retrieve patch control indices */ | ||||
| ccl_device_inline int patch_eval_indices(ccl_global const KernelGlobals *kg, | ccl_device_inline int patch_eval_indices(KernelGlobals kg, | ||||
| ccl_private const PatchHandle *handle, | ccl_private const PatchHandle *handle, | ||||
| int channel, | int channel, | ||||
| int indices[PATCH_MAX_CONTROL_VERTS]) | int indices[PATCH_MAX_CONTROL_VERTS]) | ||||
| { | { | ||||
| int index_base = kernel_tex_fetch(__patches, handle->array_index + 2) + handle->vert_index; | int index_base = kernel_tex_fetch(__patches, handle->array_index + 2) + handle->vert_index; | ||||
| /* XXX: regular patches only */ | /* XXX: regular patches only */ | ||||
| for (int i = 0; i < 16; i++) { | for (int i = 0; i < 16; i++) { | ||||
| indices[i] = kernel_tex_fetch(__patches, index_base + i); | indices[i] = kernel_tex_fetch(__patches, index_base + i); | ||||
| } | } | ||||
| return 16; | return 16; | ||||
| } | } | ||||
| /* evaluate patch basis functions */ | /* evaluate patch basis functions */ | ||||
| ccl_device_inline void patch_eval_basis(ccl_global const KernelGlobals *kg, | ccl_device_inline void patch_eval_basis(KernelGlobals kg, | ||||
| ccl_private const PatchHandle *handle, | ccl_private const PatchHandle *handle, | ||||
| float u, | float u, | ||||
| float v, | float v, | ||||
| float weights[PATCH_MAX_CONTROL_VERTS], | float weights[PATCH_MAX_CONTROL_VERTS], | ||||
| float weights_du[PATCH_MAX_CONTROL_VERTS], | float weights_du[PATCH_MAX_CONTROL_VERTS], | ||||
| float weights_dv[PATCH_MAX_CONTROL_VERTS]) | float weights_dv[PATCH_MAX_CONTROL_VERTS]) | ||||
| { | { | ||||
| uint patch_bits = kernel_tex_fetch(__patches, handle->patch_index + 1); /* read patch param */ | uint patch_bits = kernel_tex_fetch(__patches, handle->patch_index + 1); /* read patch param */ | ||||
| Show All 22 Lines | for (int l = 0; l < 4; l++) { | ||||
| weights_du[4 * k + l] = ds[l] * t[k] * d_scale; | weights_du[4 * k + l] = ds[l] * t[k] * d_scale; | ||||
| weights_dv[4 * k + l] = s[l] * dt[k] * d_scale; | weights_dv[4 * k + l] = s[l] * dt[k] * d_scale; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| /* generic function for evaluating indices and weights from patch coords */ | /* generic function for evaluating indices and weights from patch coords */ | ||||
| ccl_device_inline int patch_eval_control_verts(ccl_global const KernelGlobals *kg, | ccl_device_inline int patch_eval_control_verts(KernelGlobals kg, | ||||
| int object, | int object, | ||||
| int patch, | int patch, | ||||
| float u, | float u, | ||||
| float v, | float v, | ||||
| int channel, | int channel, | ||||
| int indices[PATCH_MAX_CONTROL_VERTS], | int indices[PATCH_MAX_CONTROL_VERTS], | ||||
| float weights[PATCH_MAX_CONTROL_VERTS], | float weights[PATCH_MAX_CONTROL_VERTS], | ||||
| float weights_du[PATCH_MAX_CONTROL_VERTS], | float weights_du[PATCH_MAX_CONTROL_VERTS], | ||||
| float weights_dv[PATCH_MAX_CONTROL_VERTS]) | float weights_dv[PATCH_MAX_CONTROL_VERTS]) | ||||
| { | { | ||||
| PatchHandle handle = patch_map_find_patch(kg, object, patch, u, v); | PatchHandle handle = patch_map_find_patch(kg, object, patch, u, v); | ||||
| kernel_assert(handle.array_index >= 0); | kernel_assert(handle.array_index >= 0); | ||||
| int num_control = patch_eval_indices(kg, &handle, channel, indices); | int num_control = patch_eval_indices(kg, &handle, channel, indices); | ||||
| patch_eval_basis(kg, &handle, u, v, weights, weights_du, weights_dv); | patch_eval_basis(kg, &handle, u, v, weights, weights_du, weights_dv); | ||||
| return num_control; | return num_control; | ||||
| } | } | ||||
| /* functions for evaluating attributes on patches */ | /* functions for evaluating attributes on patches */ | ||||
| ccl_device float patch_eval_float(ccl_global const KernelGlobals *kg, | ccl_device float patch_eval_float(KernelGlobals kg, | ||||
| ccl_private const ShaderData *sd, | ccl_private const ShaderData *sd, | ||||
| int offset, | int offset, | ||||
| int patch, | int patch, | ||||
| float u, | float u, | ||||
| float v, | float v, | ||||
| int channel, | int channel, | ||||
| ccl_private float *du, | ccl_private float *du, | ||||
| ccl_private float *dv) | ccl_private float *dv) | ||||
| Show All 20 Lines | if (du) | ||||
| *du += v * weights_du[i]; | *du += v * weights_du[i]; | ||||
| if (dv) | if (dv) | ||||
| *dv += v * weights_dv[i]; | *dv += v * weights_dv[i]; | ||||
| } | } | ||||
| return val; | return val; | ||||
| } | } | ||||
| ccl_device float2 patch_eval_float2(ccl_global const KernelGlobals *kg, | ccl_device float2 patch_eval_float2(KernelGlobals kg, | ||||
| ccl_private const ShaderData *sd, | ccl_private const ShaderData *sd, | ||||
| int offset, | int offset, | ||||
| int patch, | int patch, | ||||
| float u, | float u, | ||||
| float v, | float v, | ||||
| int channel, | int channel, | ||||
| ccl_private float2 *du, | ccl_private float2 *du, | ||||
| ccl_private float2 *dv) | ccl_private float2 *dv) | ||||
| Show All 20 Lines | if (du) | ||||
| *du += v * weights_du[i]; | *du += v * weights_du[i]; | ||||
| if (dv) | if (dv) | ||||
| *dv += v * weights_dv[i]; | *dv += v * weights_dv[i]; | ||||
| } | } | ||||
| return val; | return val; | ||||
| } | } | ||||
| ccl_device float3 patch_eval_float3(ccl_global const KernelGlobals *kg, | ccl_device float3 patch_eval_float3(KernelGlobals kg, | ||||
| ccl_private const ShaderData *sd, | ccl_private const ShaderData *sd, | ||||
| int offset, | int offset, | ||||
| int patch, | int patch, | ||||
| float u, | float u, | ||||
| float v, | float v, | ||||
| int channel, | int channel, | ||||
| ccl_private float3 *du, | ccl_private float3 *du, | ||||
| ccl_private float3 *dv) | ccl_private float3 *dv) | ||||
| Show All 20 Lines | if (du) | ||||
| *du += v * weights_du[i]; | *du += v * weights_du[i]; | ||||
| if (dv) | if (dv) | ||||
| *dv += v * weights_dv[i]; | *dv += v * weights_dv[i]; | ||||
| } | } | ||||
| return val; | return val; | ||||
| } | } | ||||
| ccl_device float4 patch_eval_float4(ccl_global const KernelGlobals *kg, | ccl_device float4 patch_eval_float4(KernelGlobals kg, | ||||
| ccl_private const ShaderData *sd, | ccl_private const ShaderData *sd, | ||||
| int offset, | int offset, | ||||
| int patch, | int patch, | ||||
| float u, | float u, | ||||
| float v, | float v, | ||||
| int channel, | int channel, | ||||
| ccl_private float4 *du, | ccl_private float4 *du, | ||||
| ccl_private float4 *dv) | ccl_private float4 *dv) | ||||
| Show All 20 Lines | if (du) | ||||
| *du += v * weights_du[i]; | *du += v * weights_du[i]; | ||||
| if (dv) | if (dv) | ||||
| *dv += v * weights_dv[i]; | *dv += v * weights_dv[i]; | ||||
| } | } | ||||
| return val; | return val; | ||||
| } | } | ||||
| ccl_device float4 patch_eval_uchar4(ccl_global const KernelGlobals *kg, | ccl_device float4 patch_eval_uchar4(KernelGlobals kg, | ||||
| ccl_private const ShaderData *sd, | ccl_private const ShaderData *sd, | ||||
| int offset, | int offset, | ||||
| int patch, | int patch, | ||||
| float u, | float u, | ||||
| float v, | float v, | ||||
| int channel, | int channel, | ||||
| ccl_private float4 *du, | ccl_private float4 *du, | ||||
| ccl_private float4 *dv) | ccl_private float4 *dv) | ||||
| Show All 30 Lines | |||||