Exemple #1
0
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));
}
Exemple #2
0
inline btTransform get_pos_trans(const vec3 & p)
{
    btTransform trans;
    trans.setIdentity();
    trans.setOrigin(convert_vec(p));
    return trans;
}
Exemple #3
0
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;
}
Exemple #4
0
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;
}