25 const float u = (
atan2f(dir.
y, dir.
x) - range.
y) / range.
x;
26 const float v = (
acosf(dir.
z /
len(dir)) - range.
w) / range.
z;
35 const float phi = range.
x * u + range.
y;
36 const float theta = range.
z *
v + range.
w;
53 const float theta =
atan2f(dir.
y, dir.
x);
63 const float theta =
mix(range.
x, range.
y, u);
64 const float z =
mix(range.
z, range.
w,
v);
92 u = (u - 0.5f) * 2.0f;
93 v = (
v - 0.5f) * 2.0f;
95 const float r =
sqrtf(u * u +
v *
v);
101 const float theta = r * fov * 0.5f;
112 const float r = 2.0f * lens *
sinf(theta * 0.5f);
115 return make_float2(0.5f - uv.
x / width, uv.
y / height + 0.5f);
119 float u,
float v,
float lens,
const float fov,
const float width,
const float height)
121 u = (u - 0.5f) * width;
122 v = (
v - 0.5f) * height;
124 const float rmax = 2.0f * lens *
sinf(fov * 0.25f);
125 const float r =
sqrtf(u * u +
v *
v);
131 const float theta = 2.0f *
asinf(r / (2.0f * lens));
144 u = (u - 0.5f) * width;
145 v = (
v - 0.5f) * height;
147 const float r =
sqrtf(u * u +
v *
v);
148 const float r2 = r * r;
150 const float theta = -(coeff0 +
dot(coeffs, rr));
152 if (
fabsf(theta) > 0.5f * fov) {
160 float3 dir,
const float coeff0,
const float4 coeffs,
const float width,
const float height)
166 float r = (theta - coeff0) / coeffs.
x;
170 for (
int i = 0;
i < 20;
i++) {
182 const float old_r = r;
183 const float r2 = r * r;
184 const float F_r = theta - (coeff0 +
dot(coeffs,
make_float4(r, r2, r2 * r, r2 * r2)));
185 const float dF_r =
dot(diff_coeffs,
make_float4(1.0f, r, r2, r2 * r));
189 if (
fabsf(r - old_r) < 1e-6f) {
196 return make_float2(0.5f - uv.
x / width, uv.
y / height + 0.5f);
206 dir.
x = 2.0f * u - 1.0f;
207 dir.
z = 2.0f *
v - 1.0f;
209 if (dir.
x * dir.
x + dir.
z * dir.
z > 1.0f) {
213 dir.
y = -
sqrtf(
max(1.0f - dir.
x * dir.
x - dir.
z * dir.
z, 0.0f));
218 return 2.0f *
dot(dir,
I) * dir -
I;
226 const float div = 2.0f *
sqrtf(
max(-0.5f * dir.
y, 0.0f));
231 const float u = 0.5f * (dir.
x + 1.0f);
232 const float v = 0.5f * (dir.
z + 1.0f);
259 switch (cam->panorama_type) {
271 cam->fisheye_lens_polynomial_bias,
272 cam->fisheye_lens_polynomial_coefficients,
281 u,
v, cam->fisheye_lens, cam->fisheye_fov, cam->sensorwidth, cam->sensorheight);
287 switch (cam->panorama_type) {
298 cam->fisheye_lens_polynomial_bias,
299 cam->fisheye_lens_polynomial_coefficients,
307 dir, cam->fisheye_lens, cam->sensorwidth, cam->sensorheight);
315 float interocular_offset = cam->interocular_offset;
321 if (cam->pole_merge_angle_to > 0.0f) {
322 const float pole_merge_angle_from = cam->pole_merge_angle_from;
323 const float pole_merge_angle_to = cam->pole_merge_angle_to;
325 if (altitude > pole_merge_angle_to) {
326 interocular_offset = 0.0f;
328 else if (altitude > pole_merge_angle_from) {
329 const float fac = (altitude - pole_merge_angle_from) /
330 (pole_merge_angle_to - pole_merge_angle_from);
332 interocular_offset *=
fade;
338 const float3 stereo_offset = side * interocular_offset;
344 const float convergence_distance = cam->convergence_distance;
346 if (convergence_distance !=
FLT_MAX) {
347 const float3 screen_offset = convergence_distance * (*D);
348 *
D =
normalize(screen_offset - stereo_offset);
MINLINE float safe_acosf(float a)
MINLINE float safe_divide(float a, float b)
MINLINE float safe_asinf(float a)
ATTR_WARN_UNUSED_RESULT const BMVert * v
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
dot(value.rgb, luminance_coefficients)") DEFINE_VALUE("REDUCE(lhs
ccl_device float3 equiangular_cubemap_face_to_direction(float u, float v)
CCL_NAMESPACE_BEGIN ccl_device float2 direction_to_equirectangular_range(const float3 dir, const float4 range)
ccl_device_inline float2 direction_to_panorama(ccl_constant KernelCamera *cam, const float3 dir)
ccl_device float2 direction_to_mirrorball(float3 dir)
ccl_device float2 direction_to_fisheye_equidistant(const float3 dir, const float fov)
ccl_device_inline float3 fisheye_to_direction(const float theta, const float u, float v, const float r)
ccl_device_inline float3 fisheye_lens_polynomial_to_direction(float u, float v, float coeff0, const float4 coeffs, const float fov, const float width, const float height)
ccl_device float3 fisheye_equidistant_to_direction(float u, float v, float fov)
ccl_device float2 direction_to_fisheye_equisolid(const float3 dir, const float lens, const float width, const float height)
ccl_device_inline void spherical_stereo_transform(ccl_constant KernelCamera *cam, ccl_private float3 *P, ccl_private float3 *D)
ccl_device_inline float3 fisheye_equisolid_to_direction(float u, float v, float lens, const float fov, const float width, const float height)
ccl_device float2 direction_to_fisheye_lens_polynomial(float3 dir, const float coeff0, const float4 coeffs, const float width, const float height)
ccl_device float2 direction_to_central_cylindrical(const float3 dir, const float4 range)
ccl_device_inline float3 panorama_to_direction(ccl_constant KernelCamera *cam, const float u, float v)
ccl_device float3 equirectangular_range_to_direction(const float u, const float v, const float4 range)
ccl_device float3 mirrorball_to_direction(const float u, const float v)
ccl_device float2 direction_to_equiangular_cubemap_face(const float3 dir)
ccl_device float3 central_cylindrical_to_direction(const float u, const float v, const float4 range)
ccl_device float2 direction_to_equirectangular(const float3 dir)
ccl_device float3 equirectangular_to_direction(const float u, const float v)
ccl_device float3 spherical_to_direction(const float theta, const float phi)
#define kernel_assert(cond)
#define ccl_device_inline
#define CCL_NAMESPACE_END
VecBase< float, D > normalize(VecOp< float, D >) RET
VecBase< float, 3 > cross(VecOp< float, 3 >, VecOp< float, 3 >) RET
@ PANORAMA_FISHEYE_EQUISOLID
@ PANORAMA_CENTRAL_CYLINDRICAL
@ PANORAMA_EQUIANGULAR_CUBEMAP_FACE
@ PANORAMA_FISHEYE_EQUIDISTANT
@ PANORAMA_FISHEYE_LENS_POLYNOMIAL
@ PANORAMA_EQUIRECTANGULAR
ccl_device_inline float inverse_lerp(const float a, const float b, const float x)
CCL_NAMESPACE_BEGIN ccl_device_inline float2 zero_float2()
ccl_device_inline bool is_zero(const float2 a)
ccl_device_inline float2 safe_normalize(const float2 a)
CCL_NAMESPACE_BEGIN ccl_device_inline float3 zero_float3()
CCL_NAMESPACE_BEGIN ccl_device float fade(const float t)