Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/kernel/kernel_lookup_table.h
| Show All 14 Lines | |||||
| */ | */ | ||||
| #pragma once | #pragma once | ||||
| CCL_NAMESPACE_BEGIN | CCL_NAMESPACE_BEGIN | ||||
| /* Interpolated lookup table access */ | /* Interpolated lookup table access */ | ||||
| ccl_device float lookup_table_read(ccl_global const KernelGlobals *kg, | ccl_device float lookup_table_read(KernelGlobals kg, float x, int offset, int size) | ||||
| float x, | |||||
| int offset, | |||||
| int size) | |||||
| { | { | ||||
| x = saturate(x) * (size - 1); | x = saturate(x) * (size - 1); | ||||
| int index = min(float_to_int(x), size - 1); | int index = min(float_to_int(x), size - 1); | ||||
| int nindex = min(index + 1, size - 1); | int nindex = min(index + 1, size - 1); | ||||
| float t = x - index; | float t = x - index; | ||||
| float data0 = kernel_tex_fetch(__lookup_table, index + offset); | float data0 = kernel_tex_fetch(__lookup_table, index + offset); | ||||
| if (t == 0.0f) | if (t == 0.0f) | ||||
| return data0; | return data0; | ||||
| float data1 = kernel_tex_fetch(__lookup_table, nindex + offset); | float data1 = kernel_tex_fetch(__lookup_table, nindex + offset); | ||||
| return (1.0f - t) * data0 + t * data1; | return (1.0f - t) * data0 + t * data1; | ||||
| } | } | ||||
| ccl_device float lookup_table_read_2D( | ccl_device float lookup_table_read_2D( | ||||
| ccl_global const KernelGlobals *kg, float x, float y, int offset, int xsize, int ysize) | KernelGlobals kg, float x, float y, int offset, int xsize, int ysize) | ||||
| { | { | ||||
| y = saturate(y) * (ysize - 1); | y = saturate(y) * (ysize - 1); | ||||
| int index = min(float_to_int(y), ysize - 1); | int index = min(float_to_int(y), ysize - 1); | ||||
| int nindex = min(index + 1, ysize - 1); | int nindex = min(index + 1, ysize - 1); | ||||
| float t = y - index; | float t = y - index; | ||||
| float data0 = lookup_table_read(kg, x, offset + xsize * index, xsize); | float data0 = lookup_table_read(kg, x, offset + xsize * index, xsize); | ||||
| if (t == 0.0f) | if (t == 0.0f) | ||||
| return data0; | return data0; | ||||
| float data1 = lookup_table_read(kg, x, offset + xsize * nindex, xsize); | float data1 = lookup_table_read(kg, x, offset + xsize * nindex, xsize); | ||||
| return (1.0f - t) * data0 + t * data1; | return (1.0f - t) * data0 + t * data1; | ||||
| } | } | ||||
| CCL_NAMESPACE_END | CCL_NAMESPACE_END | ||||