#ifndef C_BOX2D_SPACE_H
#define C_BOX2D_SPACE_H


#include "c_math.h"
#include "box2d-object.h"
#include "box2d-joint.h"



extern "C"
{
  struct Space;


  struct Space*      b2d_new_Space ();
  void               b2d_free_Space       (Space*   Self);

  void               b2d_Space_add_Object (Space*   Self,    Object*     the_Object);
  void               b2d_Space_rid_Object (Space*   Self,    Object*     the_Object);

  void               b2d_Space_add_Joint  (Space*   Self,    Joint*      the_Joint);
  void               b2d_Space_rid_Joint  (Space*   Self,    Joint*      the_Joint);


  struct b2Joint;
  void*              b2d_b2Joint_user_Data (b2Joint*   the_Joint);


  struct joint_Cursor
  {
    b2Joint*   Joint;
  };

  joint_Cursor       b2d_Space_first_Joint    (Space*          Self);
  void               b2d_Space_next_Joint    (joint_Cursor*   Cursor);
  b2Joint*           b2d_Space_joint_Element (joint_Cursor*   Cursor);


  void               b2d_Space_Gravity_is (Space*   Self,    Vector_3*   Now);
  void               b2d_Space_evolve     (Space*   Self,    float       By);



  //  Ray Casting
  //
  struct b2d_ray_Collision
  {
      const Object*    near_Object;
      Real             hit_Fraction;
      Vector_3         Normal_world;
      Vector_3         Site_world;
  };

  b2d_ray_Collision      b2d_Space_cast_Ray (Space*   Self,    Vector_3*   From,
                                                               Vector_3*   To);


  //  Point Casting
  //
  struct b2d_point_Collision
  {
      const Object*    near_Object;
//      Real             hit_Fraction;
//      Vector_3         Normal_world;
      Vector_3         Site_world;
  };

  b2d_point_Collision    b2d_Space_cast_Point (Space*   Self,    Vector_3*   Point);



  //  Collisions
  //

  struct b2d_Contact
  {
    Object*          Object_A;
    Object*          Object_B;
    Vector_3         Site;
  };

  int                b2d_space_contact_Count (Space*   Self);
  b2d_Contact        b2d_space_Contact       (Space*   Self,   int   contact_Id);

} // extern "C"


#endif

