void flight_move(struct player *p, float dt) { struct inputstate *in = &game.input; player_look(dt); float speed = pv.flyspeed; vec3_t movedir = {0, 0, 0}; if (in->move_left) movedir.x -= 1.f; if (in->move_right) movedir.x += 1.f; if (in->move_forward) movedir.z -= 1.f; if (in->move_backward) movedir.z += 1.f; if (in->move_jump) movedir.y += 1.f; if (in->move_crouch) movedir.y -= 1.f; //if (in->move_sprint) speed += pv.sprintspeed; if (movedir.x != 0 || movedir.y != 0 || movedir.z != 0) { // normalize move dir? but strafing feels good! mat44_t m; m_setidentity(&m); m_rotate(&m, game.camera.yaw, 0, 1.f, 0); vec3_t movevec = m_vec3scale(m_matmulvec3(&m, &movedir), speed*dt); p->vel = m_vec3add(p->vel, movevec); } player_dumb_collide(); // drag p->vel = m_vec3scale(p->vel, 1.f - pv.flyfriction); p->pos.x += p->vel.x * dt; p->pos.y += p->vel.y * dt; p->pos.z += p->vel.z * dt; }
void ui_debug_aabb(vec3_t center, vec3_t extent, uint32_t clr) { vec3_t maxp = m_vec3add(center, extent); vec3_t minp = m_vec3sub(center, extent); vec3_t corners[8] = { { minp.x, minp.y, minp.z }, { maxp.x, minp.y, minp.z }, { maxp.x, minp.y, maxp.z }, { minp.x, minp.y, maxp.z }, { minp.x, maxp.y, minp.z }, { maxp.x, maxp.y, minp.z }, { maxp.x, maxp.y, maxp.z }, { minp.x, maxp.y, maxp.z }, }; ui_debug_line(corners[0], corners[1], clr); ui_debug_line(corners[1], corners[2], clr); ui_debug_line(corners[2], corners[3], clr); ui_debug_line(corners[3], corners[0], clr); ui_debug_line(corners[4], corners[5], clr); ui_debug_line(corners[5], corners[6], clr); ui_debug_line(corners[6], corners[7], clr); ui_debug_line(corners[7], corners[4], clr); ui_debug_line(corners[0], corners[4], clr); ui_debug_line(corners[1], corners[5], clr); ui_debug_line(corners[2], corners[6], clr); ui_debug_line(corners[3], corners[7], clr); }