void add_frustum_vertices(int x, int y, const mat4 & inverse_mvp, const vec4 & viewport, btAlignedObjectArray<btVector3> & vertices) { vec2 win(x, y); vec3 p; p = unproject(vec3(win, 0.0f), inverse_mvp, viewport); vertices.push_back(convert_vec(p)); p = unproject(vec3(win, 1.0f), inverse_mvp, viewport); vertices.push_back(convert_vec(p)); }
inline btTransform get_pos_trans(const vec3 & p) { btTransform trans; trans.setIdentity(); trans.setOrigin(convert_vec(p)); return trans; }
void VoxelEditor::update_hit() { has_hit = hit_floor = false; vec3 dir, pos; vec2 win_pos(last_pos.x(), height() - last_pos.y()); get_window_ray(win_pos, inverse_mvp, viewport, pos, dir); btCollisionObject * obj = get_collision_object(); btTransform from_trans; btVector3 from_vec = convert_vec(pos); from_trans.setIdentity(); from_trans.setOrigin(from_vec); btTransform to_trans; btVector3 to_vec = convert_vec(pos + dir * float(1e12)); to_trans.setIdentity(); to_trans.setOrigin(to_vec); btTransform obj_trans; obj_trans.setIdentity(); btCollisionWorld::ClosestRayResultCallback callback(from_vec, to_vec); btCollisionWorld::rayTestSingle(from_trans, to_trans, obj, obj->getCollisionShape(), obj_trans, callback); if (!callback.hasHit()) { vec3 min = voxel->get_min(); vec3 max = voxel->get_max(); btStaticPlaneShape plane(btVector3(0.0f, 0.0f, 1.0f), min.z); obj->setCollisionShape(&plane); btCollisionWorld::rayTestSingle(from_trans, to_trans, obj, obj->getCollisionShape(), obj_trans, callback); if (!callback.hasHit()) return; float x = callback.m_hitPointWorld.x(); float y = callback.m_hitPointWorld.y(); if (x >= max.x || x < min.x || y >= max.y || y < min.y) return; hit_floor = true; } vec3 hit_normal = convert_vec(callback.m_hitNormalWorld); vec3 hit_pos = convert_vec(callback.m_hitPointWorld); hit_next = get_pos_vec(hit_pos + hit_normal * 0.1f); hit_block = get_pos_vec(hit_pos - hit_normal * 0.1f); has_hit = true; }
int PositionArrows::ray_test(const vec3 & ray_pos, const vec3 & ray_dir) { static btCollisionObject * obj = new btCollisionObject(); obj->setCollisionShape(shape); btTransform obj_trans = get_pos_trans(pos); btTransform from_trans; btVector3 from_vec = convert_vec(ray_pos); from_trans.setIdentity(); from_trans.setOrigin(from_vec); btTransform to_trans; btVector3 to_vec = convert_vec(ray_pos + ray_dir * 5000.0f); to_trans.setIdentity(); to_trans.setOrigin(to_vec); ArrowResultCallback callback(from_vec, to_vec); btCollisionWorld::rayTestSingle(from_trans, to_trans, obj, shape, obj_trans, callback); return callback.index; }