#ifndef PHYSICSMOTIONSTATE_H_
#define PHYSICSMOTIONSTATE_H_

#include "Vector3.h"

namespace gameplay
{

class Node;

/**
 * Interface between GamePlay and Bullet to keep object transforms synchronized properly.
 * 
 * @see btMotionState
 */
class PhysicsMotionState : public btMotionState
{
    friend class PhysicsCollisionObject;
    friend class PhysicsRigidBody;
    friend class PhysicsGhostObject;
    friend class PhysicsCharacter;
    friend class PhysicsConstraint;

protected:

    /**
     * Creates a physics motion state for a rigid body.
     * 
     * @param node The node that owns the rigid body that the motion state is being created for.
     * @param centerOfMassOffset The translation offset to the center of mass of the rigid body.
     */
    PhysicsMotionState(Node* node, const Vector3* centerOfMassOffset = NULL);

    /**
     * Destructor.
     */
    virtual ~PhysicsMotionState();

    /**
     * @see btMotionState#getWorldTransform
     */
    virtual void getWorldTransform(btTransform &transform) const;

    /**
     * @see btMotionState#setWorldTransform
     */
    virtual void setWorldTransform(const btTransform &transform);

private:

    // Updates the motion state's world transform from the GamePlay Node object's world transform.
    void updateTransformFromNode() const;

    Node* _node;
    btTransform _centerOfMassOffset;
    mutable btTransform _worldTransform;
};

}

#endif
