38 float u = (
atan2f(dir.
y, dir.
x) - range.y) / range.x;
39 float v = (
acosf(dir.
z /
len(dir)) - range.w) / range.z;
46 float phi = range.x * u + range.y;
47 float theta = range.z *
v + range.w;
65 const float theta =
atan2f(dir.
y, dir.
x);
73 const float theta =
mix(range.x, range.y, u);
74 const float z =
mix(range.z, range.w,
v);
89 u = (u - 0.5f) * 2.0f;
90 v = (
v - 0.5f) * 2.0f;
97 float phi =
safe_acosf((r != 0.0f) ? u / r : 0.0f);
98 float theta = r * fov * 0.5f;
109 const float r = 2.0f * lens *
sinf(theta * 0.5f);
112 return make_float2(0.5f - uv.
x / width, uv.
y / height + 0.5f);
118 u = (u - 0.5f) * width;
119 v = (
v - 0.5f) * height;
121 float rmax = 2.0f * lens *
sinf(fov * 0.25f);
122 float r =
sqrtf(u * u +
v *
v);
127 float phi =
safe_acosf((r != 0.0f) ? u / r : 0.0f);
128 float theta = 2.0f *
asinf(r / (2.0f * lens));
137 float u,
float v,
float coeff0, float4 coeffs,
float fov,
float width,
float height)
139 u = (u - 0.5f) * width;
140 v = (
v - 0.5f) * height;
142 float r =
sqrtf(u * u +
v *
v);
145 float theta = -(coeff0 +
dot(coeffs, rr));
147 if (
fabsf(theta) > 0.5f * fov)
150 float phi =
safe_acosf((r != 0.0f) ? u / r : 0.0f);
159 float3 dir,
float coeff0, float4 coeffs,
float width,
float height)
165 float r = (theta - coeff0) / coeffs.x;
167 const float4 diff_coeffs =
make_float4(1.0f, 2.0f, 3.0f, 4.0f) * coeffs;
169 for (
int i = 0; i < 20; i++) {
181 const float old_r = r, r2 = r * r;
182 const float F_r = theta - (coeff0 +
dot(coeffs,
make_float4(r, r2, r2 * r, r2 * r2)));
183 const float dF_r =
dot(diff_coeffs,
make_float4(1.0f, r, r2, r2 * r));
187 if (
fabsf(r - old_r) < 1e-6f) {
194 return make_float2(0.5f - uv.
x / width, uv.
y / height + 0.5f);
204 dir.
x = 2.0f * u - 1.0f;
205 dir.
z = 2.0f *
v - 1.0f;
207 if (dir.
x * dir.
x + dir.
z * dir.
z > 1.0f)
210 dir.
y = -
sqrtf(
max(1.0f - dir.
x * dir.
x - dir.
z * dir.
z, 0.0f));
215 return 2.0f *
dot(dir,
I) * dir -
I;
223 float div = 2.0f *
sqrtf(
max(-0.5f * dir.
y, 0.0f));
227 float u = 0.5f * (dir.
x + 1.0f);
228 float v = 0.5f * (dir.
z + 1.0f);
253 switch (cam->panorama_type) {
265 cam->fisheye_lens_polynomial_bias,
266 cam->fisheye_lens_polynomial_coefficients,
275 u,
v, cam->fisheye_lens, cam->fisheye_fov, cam->sensorwidth, cam->sensorheight);
281 switch (cam->panorama_type) {
292 cam->fisheye_lens_polynomial_bias,
293 cam->fisheye_lens_polynomial_coefficients,
301 dir, cam->fisheye_lens, cam->sensorwidth, cam->sensorheight);
309 float interocular_offset = cam->interocular_offset;
315 if (cam->pole_merge_angle_to > 0.0f) {
316 const float pole_merge_angle_from = cam->pole_merge_angle_from,
317 pole_merge_angle_to = cam->pole_merge_angle_to;
319 if (altitude > pole_merge_angle_to) {
320 interocular_offset = 0.0f;
322 else if (altitude > pole_merge_angle_from) {
323 float fac = (altitude - pole_merge_angle_from) /
324 (pole_merge_angle_to - pole_merge_angle_from);
326 interocular_offset *=
fade;
332 float3 stereo_offset = side * interocular_offset;
338 const float convergence_distance = cam->convergence_distance;
340 if (convergence_distance !=
FLT_MAX) {
341 float3 screen_offset = convergence_distance * (*D);
342 *D =
normalize(screen_offset - stereo_offset);
MINLINE float safe_acosf(float a)
MINLINE float safe_asinf(float a)
ATTR_WARN_UNUSED_RESULT const BMVert * v
ccl_device_inline float sin_theta(const float3 w)
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
SIMD_FORCE_INLINE btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1.
additional_info("compositor_sum_squared_difference_float_shared") .push_constant(Type output_img float dot(value.rgb, luminance_coefficients)") .define("LOAD(value)"
ccl_device float3 equiangular_cubemap_face_to_direction(float u, float v)
ccl_device float2 direction_to_fisheye(float3 dir, float fov)
ccl_device float3 fisheye_to_direction(float u, float v, float fov)
ccl_device float2 direction_to_mirrorball(float3 dir)
ccl_device float2 direction_to_equiangular_cubemap_face(float3 dir)
ccl_device float2 direction_to_fisheye_lens_polynomial(float3 dir, float coeff0, float4 coeffs, float width, float height)
CCL_NAMESPACE_BEGIN ccl_device float2 direction_to_spherical(float3 dir)
ccl_device_inline float3 panorama_to_direction(ccl_constant KernelCamera *cam, float u, float v)
ccl_device float2 direction_to_central_cylindrical(float3 dir, float4 range)
ccl_device float2 direction_to_equirectangular_range(float3 dir, float4 range)
ccl_device_inline void spherical_stereo_transform(ccl_constant KernelCamera *cam, ccl_private float3 *P, ccl_private float3 *D)
ccl_device_inline float2 direction_to_panorama(ccl_constant KernelCamera *cam, float3 dir)
ccl_device float3 equirectangular_to_direction(float u, float v)
ccl_device float2 direction_to_equirectangular(float3 dir)
ccl_device float2 direction_to_fisheye_equisolid(float3 dir, float lens, float width, float height)
ccl_device_inline float3 fisheye_equisolid_to_direction(float u, float v, float lens, float fov, float width, float height)
ccl_device float3 spherical_to_direction(float theta, float phi)
ccl_device float3 equirectangular_range_to_direction(float u, float v, float4 range)
ccl_device float3 mirrorball_to_direction(float u, float v)
ccl_device float3 central_cylindrical_to_direction(float u, float v, float4 range)
ccl_device_inline float3 fisheye_lens_polynomial_to_direction(float u, float v, float coeff0, float4 coeffs, float fov, float width, float height)
#define kernel_assert(cond)
#define ccl_device_inline
#define CCL_NAMESPACE_END
@ PANORAMA_FISHEYE_EQUISOLID
@ PANORAMA_CENTRAL_CYLINDRICAL
@ PANORAMA_EQUIANGULAR_CUBEMAP_FACE
@ PANORAMA_FISHEYE_EQUIDISTANT
@ PANORAMA_FISHEYE_LENS_POLYNOMIAL
@ PANORAMA_EQUIRECTANGULAR
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_device_inline float cross(const float2 a, const float2 b)
CCL_NAMESPACE_BEGIN ccl_device_inline float3 zero_float3()
CCL_NAMESPACE_BEGIN ccl_device float fade(float t)
ccl_device_inline float inverse_lerp(float a, float b, float x)