Fix how the lens vector is incorporated, fix formatting
This commit is contained in:
parent
7c6d7ef84d
commit
88a97542e0
|
|
@ -45,14 +45,16 @@ vec3 applyLookAhead(
|
||||||
in vec3 velocity,
|
in vec3 velocity,
|
||||||
in vec3 accel,
|
in vec3 accel,
|
||||||
in float t,
|
in float t,
|
||||||
in float t_squared) {
|
in float t_squared
|
||||||
|
) {
|
||||||
return position + velocity * t + 0.5 * accel * t_squared;
|
return position + velocity * t + 0.5 * accel * t_squared;
|
||||||
}
|
}
|
||||||
|
|
||||||
vec3 rateOfChange(
|
vec3 rateOfChange(
|
||||||
in vec3 v1,
|
in vec3 v1,
|
||||||
in vec3 v2,
|
in vec3 v2,
|
||||||
in float delta_time) {
|
in float delta_time
|
||||||
|
) {
|
||||||
return (v1 - v2) / delta_time;
|
return (v1 - v2) / delta_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -68,7 +70,8 @@ void PS_IMU_Transform(vec4 pos, vec2 texcoord, out vec4 color) {
|
||||||
aspect_ratio /= 2;
|
aspect_ratio /= 2;
|
||||||
|
|
||||||
lens_y_offset = lens_distance_ratio / 3;
|
lens_y_offset = lens_distance_ratio / 3;
|
||||||
if (right_display) lens_y_offset = -lens_y_offset;
|
if(right_display)
|
||||||
|
lens_y_offset = -lens_y_offset;
|
||||||
if(sbs_content) {
|
if(sbs_content) {
|
||||||
// source video is SBS, left-half of the screen goes to the left lens, right-half to the right lens
|
// source video is SBS, left-half of the screen goes to the left lens, right-half to the right lens
|
||||||
if(right_display)
|
if(right_display)
|
||||||
|
|
@ -109,20 +112,14 @@ void PS_IMU_Transform(vec4 pos, vec2 texcoord, out vec4 color) {
|
||||||
color = texture2D(uDesktopTexture, texcoord);
|
color = texture2D(uDesktopTexture, texcoord);
|
||||||
// }
|
// }
|
||||||
} else {
|
} else {
|
||||||
float lens_fov_z_offset_rads = atan(lens_z_offset/screen_distance);
|
float fov_y_half_width = tan(half_fov_y_rads);
|
||||||
float fov_z_pos = tan(half_fov_z_rads - lens_fov_z_offset_rads) * screen_distance;
|
float fov_y_width = fov_y_half_width * 2;
|
||||||
float fov_z_neg = -tan(half_fov_z_rads + lens_fov_z_offset_rads) * screen_distance;
|
float fov_z_half_width = tan(half_fov_z_rads);
|
||||||
float fov_z_width = fov_z_pos - fov_z_neg;
|
float fov_z_width = fov_z_half_width * 2;
|
||||||
|
float vec_y = -texcoord.x * fov_y_width + fov_y_half_width;
|
||||||
float lens_fov_y_offset_rads = atan(lens_y_offset/screen_distance);
|
float vec_z = -texcoord.y * fov_z_width + fov_z_half_width;
|
||||||
float fov_y_pos = tan(half_fov_y_rads - lens_fov_y_offset_rads) * screen_distance;
|
|
||||||
float fov_y_neg = -tan(half_fov_y_rads + lens_fov_y_offset_rads) * screen_distance;
|
|
||||||
float fov_y_width = fov_y_pos - fov_y_neg;
|
|
||||||
float vec_x = screen_distance;
|
|
||||||
float vec_y = -texcoord.x * fov_y_width + fov_y_pos;
|
|
||||||
float vec_z = -texcoord.y * fov_z_width + fov_z_pos;
|
|
||||||
vec3 texcoord_vector = vec3(vec_x, vec_y, vec_z);
|
|
||||||
vec3 lens_vector = vec3(lens_distance_ratio, lens_y_offset, lens_z_offset);
|
vec3 lens_vector = vec3(lens_distance_ratio, lens_y_offset, lens_z_offset);
|
||||||
|
vec3 texcoord_vector = vec3(1.0, vec_y, vec_z);
|
||||||
|
|
||||||
// then rotate the vector using each of the snapshots provided
|
// then rotate the vector using each of the snapshots provided
|
||||||
vec3 rotated_vector_t0 = applyQuaternionToVector(imu_quat_data[0], texcoord_vector);
|
vec3 rotated_vector_t0 = applyQuaternionToVector(imu_quat_data[0], texcoord_vector);
|
||||||
|
|
@ -146,7 +143,8 @@ void PS_IMU_Transform(vec4 pos, vec2 texcoord, out vec4 color) {
|
||||||
float look_ahead_ms_squared = pow(look_ahead_ms, 2);
|
float look_ahead_ms_squared = pow(look_ahead_ms, 2);
|
||||||
|
|
||||||
// apply most recent velocity and acceleration to most recent position to get a predicted position
|
// apply most recent velocity and acceleration to most recent position to get a predicted position
|
||||||
vec3 res = applyLookAhead(rotated_vector_t0, velocity_t0, accel_t0, look_ahead_ms, look_ahead_ms_squared);
|
vec3 res = applyLookAhead(rotated_vector_t0, velocity_t0, accel_t0, look_ahead_ms, look_ahead_ms_squared) -
|
||||||
|
rotated_lens_vector;
|
||||||
|
|
||||||
bool looking_behind = res.x < 0.0;
|
bool looking_behind = res.x < 0.0;
|
||||||
|
|
||||||
|
|
@ -154,14 +152,12 @@ void PS_IMU_Transform(vec4 pos, vec2 texcoord, out vec4 color) {
|
||||||
// so the vector is pointing at a coordinate on the screen
|
// so the vector is pointing at a coordinate on the screen
|
||||||
float display_distance = (sbs_enabled ? display_north_offset : 1.0) - rotated_lens_vector.x;
|
float display_distance = (sbs_enabled ? display_north_offset : 1.0) - rotated_lens_vector.x;
|
||||||
res *= display_distance / res.x;
|
res *= display_distance / res.x;
|
||||||
|
res += rotated_lens_vector;
|
||||||
// adjust x and y by how much our lens moved from its original offset
|
|
||||||
res += rotated_lens_vector - lens_vector;
|
|
||||||
|
|
||||||
// deconstruct the rotated and scaled vector back to a texcoord (just inverse operations of the first conversion
|
// deconstruct the rotated and scaled vector back to a texcoord (just inverse operations of the first conversion
|
||||||
// above)
|
// above)
|
||||||
texcoord.x = (fov_y_pos - res.y) / fov_y_width;
|
texcoord.x = (fov_y_half_width - res.y) / fov_y_width;
|
||||||
texcoord.y = (fov_z_pos - res.z) / fov_z_width;
|
texcoord.y = (fov_z_half_width - res.z) / fov_z_width;
|
||||||
|
|
||||||
// apply the screen offsets now
|
// apply the screen offsets now
|
||||||
float texcoord_width = texcoord_x_max - texcoord_x_min;
|
float texcoord_width = texcoord_x_max - texcoord_x_min;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue