Physics World

// Physics world.
class RVAPI World
{
public:
    // Query result.
    struct QueryResult
    {
        // Contact position.
        S3f pos;

        // Contact normal.
        S3f normal;

        // Reference.
        void *ref;
    };

    // Query results array.
    typedef Array<QueryResult> QueryResults;

    // Convert query result reference to host entity.
    EntKey GetQueryResultHost(const QueryResult &result) const;

    // Query world using AABB. results must be array of RVWorldQueryResult. Returns true if any hits.
    bool Query(QueryResults &results, const B3f &aabb);

    // Query world for first intersection with ray. Ray goes from [posA] to [posB].
    // [queryResults] must be array of RVWorldQueryResult. Returns true if any hits.
    bool RayCast(QueryResults &results, const S3f &posA, const S3f &posB);

    // Query world for all intersections with ray. Ray goes from [posA] to [posB].
    // [queryResults] must be array of RVWorldQueryResult. Returns true if any hits.
    bool RayCastAll(QueryResults &results, const S3f &posA, const S3f &posB);

    // Set gravity. Default is -9.8f.
    void SetGravity(const S3f &gravity);

    // Enable/Disable sleeping.
    void SetSleeping(bool enable = true);

    // Set physics solver iterations. [vel] is number of velocity iterations (default 12). 
    // [pos] is number of position iterations (default 2).
    void SetIter(uint vel, uint pos);

    // Advance world simulation.
    void Step();

    // Internal.
    void *operator () () const { return (void *)wobj; }

    // Constructor.
    World(void *wobj);

private:
    void *wobj;

    friend class SceneBridge;
};