#ifndef C_BOX2D_OBJECT_H
#define C_BOX2D_OBJECT_H


#include "c_math.h"
#include "box2d-shape.h"


extern "C"
{
  struct Object;

  struct Object*   b2d_new_Object            (Vector_2* Site,
                                              Real      Mass,
                                              Real      Friction,
                                              Real      Restitution,
					                                    Shape*    the_Shape);

  void             b2d_free_Object           (Object*   Self);


  void             b2d_Object_Scale_is       (Object*   Self,   Vector_2*     Now);

  Shape*           b2d_Object_Shape          (Object*   Self);

  void*            b2d_Object_user_Data      (Object*   Self);
  void             b2d_Object_user_Data_is   (Object*   Self,   void*         Now);


  Real             b2d_Object_Mass           (Object*   Self);
  void             b2d_Object_Friction_is    (Object*   Self,   Real          Now);
  void             b2d_Object_Restitution_is (Object*   Self,   Real          Now);


  Vector_3         b2d_Object_Site           (Object*   Self);
  void             b2d_Object_Site_is        (Object*   Self,   Vector_3*     Now);

  Matrix_3x3       b2d_Object_Spin           (Object*   Self);
  void             b2d_Object_Spin_is        (Object*   Self,   Matrix_3x3*   Now);

  Real             b2d_Object_xy_Spin        (Object*   Self);
  void             b2d_Object_xy_Spin_is     (Object*   Self,   Real          Now);

  Matrix_4x4       b2d_Object_Transform      (Object*   Self);
  void             b2d_Object_Transform_is   (Object*   Self,   Matrix_4x4*   Now);


  Vector_3         b2d_Object_Speed          (Object*   Self);
  void             b2d_Object_Speed_is       (Object*   Self,   Vector_3*     Now);

  Vector_3         b2d_Object_Gyre           (Object*   Self);
  void             b2d_Object_Gyre_is        (Object*   Self,   Vector_3*     Now);


  void             b2d_Object_apply_Force          (Object*   Self,   Vector_3*   Force);
  void             b2d_Object_apply_Torque         (Object*   Self,   Vector_3*   Torque);
  void             b2d_Object_apply_Torque_impulse (Object*   Self,   Vector_3*   Torque);

  void             b2d_dump (Object*   Self);
} // extern "C"


#endif
