review vr stuff, fix controller-ui ray casting
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
#ifdef _WIN32
|
||||
bool win32_vr_start();
|
||||
void win32_vr_stop();
|
||||
void win32_render_thread_notify();
|
||||
#endif
|
||||
|
||||
bool trigger_down = false;
|
||||
@@ -16,6 +17,7 @@ glm::vec2 controller_cursor;
|
||||
bool ui_inside = false;
|
||||
bool ui_capture = false;
|
||||
Sphere controller_ray;
|
||||
glm::mat4 head_pose;
|
||||
|
||||
bool App::vr_start()
|
||||
{
|
||||
@@ -52,42 +54,57 @@ void App::vr_draw_ui()
|
||||
|
||||
void App::vr_update(float dt)
|
||||
{
|
||||
glm::vec3 hit;
|
||||
float t;
|
||||
glm::mat3 m = glm::transpose(Canvas::I->m_cam_rot);
|
||||
auto o = m * glm::vec3(0, 0, -1);
|
||||
auto r = m * glm::vec3(1, 0, 0);
|
||||
auto n = m * glm::vec3(0, 0, 1);
|
||||
auto u = m * glm::vec3(0, 1, 0);
|
||||
canvas->m_canvas->m_cam_fov = 45;
|
||||
float tan_fov = glm::tan(glm::radians(canvas->m_canvas->m_cam_fov / 2.f));
|
||||
glm::vec3 aspect = { (float)uirtt.getWidth() / (float)uirtt.getHeight(), 1.f, 1.f };
|
||||
glm::mat4 m = (
|
||||
glm::scale(glm::vec3(100)) *
|
||||
glm::transpose(canvas->m_canvas->m_cam_rot) *
|
||||
glm::translate(glm::vec3(0, 0, -1)) *
|
||||
glm::scale(aspect * tan_fov)
|
||||
);
|
||||
glm::mat4 mm = glm::inverse(m);
|
||||
auto o = glm::vec3(m * glm::vec4(0, 0, 0, 1));
|
||||
auto r = glm::normalize(glm::vec3(glm::vec4(1, 0, 0, 0) * mm));
|
||||
auto n = glm::normalize(glm::vec3(glm::vec4(0, 0, 1, 0) * mm));
|
||||
auto u = glm::normalize(glm::vec3(glm::vec4(0, 1, 0, 0) * mm));
|
||||
auto co = vr_controllers[0].get_pos();
|
||||
auto cd = co + glm::mat3(vr_controllers[0].m_mat) * glm::vec3(0, 0, -1);
|
||||
ui_inside = false;
|
||||
glm::vec3 hit;
|
||||
float t;
|
||||
if (ray_intersect(co, cd, o, n, r, hit, t))
|
||||
{
|
||||
glm::mat4 plane_camera = glm::lookAt(o, n, u);
|
||||
glm::vec4 plane_local = (plane_camera * glm::vec4(hit, 1)) * 2.f;
|
||||
glm::mat4 plane_camera = m;
|
||||
glm::vec4 plane_local = (mm * glm::vec4(hit, 1));
|
||||
if (glm::all(glm::lessThanEqual(glm::abs(xy(plane_local)), glm::vec2(1.0f))))
|
||||
{
|
||||
controller_cursor.x = -(plane_local.x * 0.5f - 0.5f) * width;
|
||||
controller_cursor.y = height - (plane_local.y * 0.5f + 0.5f) * height - 1;
|
||||
controller_cursor.x = -(-plane_local.x * 0.5f - 0.5f) * width;
|
||||
controller_cursor.y = (-plane_local.y * 0.5f + 0.5f) * height;
|
||||
if (!down_controller && ui_visible)
|
||||
{
|
||||
async_start();
|
||||
mouse_move(controller_cursor.x, controller_cursor.y, 1.f, kEventSource::Mouse, false);
|
||||
async_end();
|
||||
ui_inside = true;
|
||||
#ifdef _WIN32
|
||||
win32_render_thread_notify();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (down_controller)
|
||||
{
|
||||
controller_points.add(down_controller->get_pos_n() * 800.f);
|
||||
glm::vec3 head_position = head_pose[3];
|
||||
glm::vec3 c_pos = glm::normalize(down_controller->get_pos() - head_position) * 800.f;
|
||||
controller_points.add(c_pos);
|
||||
auto p = controller_points.average();
|
||||
if (glm::distance(p, controller_last_point) > 10)
|
||||
if (glm::distance(p, controller_last_point) > 1)
|
||||
{
|
||||
async_start();
|
||||
Canvas::I->stroke_update(p, down_controller->get_trigger_value());
|
||||
Canvas::I->stroke_draw();
|
||||
async_end();
|
||||
controller_last_point = p;
|
||||
redraw = true;
|
||||
@@ -106,11 +123,17 @@ void App::vr_analog(const VRController& c, VRController::kButton b, VRController
|
||||
{
|
||||
mouse_down(0, controller_cursor.x, controller_cursor.y, 1.f, kEventSource::Mouse, false);
|
||||
ui_capture = true;
|
||||
#ifdef _WIN32
|
||||
win32_render_thread_notify();
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
mouse_up(0, controller_cursor.x, controller_cursor.y, kEventSource::Mouse, false);
|
||||
ui_capture = false;
|
||||
#ifdef _WIN32
|
||||
win32_render_thread_notify();
|
||||
#endif
|
||||
}
|
||||
async_end();
|
||||
}
|
||||
@@ -118,11 +141,12 @@ void App::vr_analog(const VRController& c, VRController::kButton b, VRController
|
||||
{
|
||||
if (a == VRController::kAction::Press)
|
||||
{
|
||||
glm::vec3 pos = c.get_pos_n() * 800.f;
|
||||
glm::vec3 head_position = head_pose[3];
|
||||
glm::vec3 c_pos = glm::normalize(c.get_pos() - head_position) * 800.f;
|
||||
async_start();
|
||||
Canvas::I->stroke_start(pos, force.x);
|
||||
Canvas::I->stroke_start(c_pos, force.x);
|
||||
async_end();
|
||||
controller_last_point = pos;
|
||||
controller_last_point = c_pos;
|
||||
controller_points.clear();
|
||||
down_controller = &c;
|
||||
}
|
||||
@@ -179,7 +203,7 @@ void App::vr_draw(const glm::mat4& proj, const glm::mat4& camera, const glm::mat
|
||||
for (int plane_index = 0; plane_index < 6; plane_index++)
|
||||
{
|
||||
auto plane_mvp = proj * camera *
|
||||
glm::scale(glm::vec3(canvas->m_canvas->m_order.size() + 500)) *
|
||||
glm::scale(glm::vec3(canvas->m_canvas->m_order.size() * 20)) *
|
||||
canvas->m_canvas->m_plane_transform[plane_index] *
|
||||
glm::translate(glm::vec3(0, 0, -1));
|
||||
|
||||
@@ -206,7 +230,7 @@ void App::vr_draw(const glm::mat4& proj, const glm::mat4& camera, const glm::mat
|
||||
|
||||
int z = (int)(canvas->m_canvas->m_order.size() - i);
|
||||
auto plane_mvp_z = proj * camera *
|
||||
glm::scale(glm::vec3(z + 1) * 100.f) *
|
||||
glm::scale(glm::vec3(z) * 20.f) *
|
||||
//glm::eulerAngleYXZ(yaw, pitch, roll) *
|
||||
canvas->m_canvas->m_plane_transform[plane_index] *
|
||||
glm::translate(glm::vec3(0, 0, -1));
|
||||
@@ -310,7 +334,9 @@ void App::vr_draw(const glm::mat4& proj, const glm::mat4& camera, const glm::mat
|
||||
}
|
||||
}
|
||||
|
||||
float tan_fov = glm::tan(glm::radians(canvas->m_canvas->m_cam_fov / 2.f)) * 0.5f;
|
||||
App::I.grid->draw_heightmap(proj, camera, false);
|
||||
|
||||
float tan_fov = glm::tan(glm::radians(canvas->m_canvas->m_cam_fov / 2.f));
|
||||
glm::vec3 aspect = { (float)uirtt.getWidth() / (float)uirtt.getHeight(), 1.f, 1.f };
|
||||
|
||||
// draw the frame
|
||||
@@ -397,16 +423,17 @@ void App::vr_draw(const glm::mat4& proj, const glm::mat4& camera, const glm::mat
|
||||
m_face_plane.draw_fill();
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
// draw the motion controller sphere
|
||||
if (ui_visible && ui_inside)
|
||||
{
|
||||
auto mvp = proj * camera * glm::translate(glm::normalize(vr_controller_pos));
|
||||
auto mvp = proj * camera * vr_controllers[0].m_mat;
|
||||
ShaderManager::use(kShader::Color);
|
||||
ShaderManager::u_vec4(kShaderUniform::Col, { 0, 0, 0, 1 });
|
||||
ShaderManager::u_mat4(kShaderUniform::MVP, mvp * glm::scale(glm::vec3(.025)));
|
||||
ShaderManager::u_vec4(kShaderUniform::Col, { 1, 0, 1, 1 });
|
||||
ShaderManager::u_mat4(kShaderUniform::MVP, mvp * glm::scale(glm::vec3(.0125, .0125, .07)));
|
||||
sphere.draw_fill();
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
// draw the motion controller brush
|
||||
if (!ui_visible || !ui_inside)
|
||||
|
||||
Reference in New Issue
Block a user