--- /dev/null
+#ifndef MSP_GL_PLACEABLE_H_
+#define MSP_GL_PLACEABLE_H_
+
+#include "matrix.h"
+#include "renderable.h"
+
+namespace Msp {
+namespace GL {
+
+/**
+A base class for things that can be positioned and oriented in 3D space.
+*/
+class Placeable
+{
+protected:
+ Matrix matrix;
+
+ Placeable() { }
+
+public:
+ virtual void set_matrix(const Matrix &);
+
+ /** Returns the Placeable's matrix. This function returns a pointer for
+ compatibility with Renderable. The returned pointer is never null. */
+ virtual const Matrix *get_matrix() const { return &matrix; }
+};
+
+
+class PlacedRenderable: public Renderable, public Placeable
+{
+protected:
+ PlacedRenderable() { }
+
+public:
+ /* Reimplement to clear ambiguity between Renderable and Placeable. This
+ overrides both base classes' implementations. */
+ virtual const Matrix *get_matrix() const { return &matrix; }
+};
+
+} // namespace GL
+} // namespace Msp
+
+#endif