/* Universidade Federal Fluminense
 * Programa de Pós-Graduação em Computação
 *
 * Tópicos Avançados em Computação Visual e Interfaces II (Técnicas Avançadas de Rendering)
 * Professor: Leandro Augusto Frata Fernandes
 *
 * Version: 2012.05.05-001
 */

#ifndef _OBJECT_HEADER_
#define _OBJECT_HEADER_

// Include some custom definitions.
#include "basic.h"

// A simple abstract class to handle geometry.
class Object {
public:

	Object();
	Object(const coord3f& location, const coord3f& forwardDirection, const coord3f& upDirection);

public:

	coord3f getForwardDirection() const;
	coord3f getLocation() const;
	coord3f getRightDirection() const;
	coord3f getUpDirection() const;

	inline const matrix4x4f& getModelMatrix() const { return m_modelMatrix; }
	inline matrix4x4f getModelMatrixInverse() const { return inverse(m_modelMatrix); }

	void setPosition(const coord3f& location, const coord3f& forwardDirection, const coord3f& upDirection);

public:

	void rotate(const coord3f& axis, const GLfloat& angleInRadians);
	void scale(const coord3f& factor);
	void translate(const coord3f& delta);

private:

	matrix4x4f m_modelMatrix;
};

#endif // _OBJECT_HEADER_
