#ifndef __SOLID_H__
#define __SOLID_H__

#include <DynObject.H>
#include <Matrix.H>
#include <SolidFace.H>
#include <CTM.H>

class Solid {
public:
     Solid(const Matrix&, const Matrix&, int = 10);
     Solid(const Solid&);
     ~Solid();

     /* Members */
     void AddFace(const SolidFace&);
     Solid& operator=(const Solid&);
     void Print() const;
     inline SolidFace *Face(int) const;
     inline int NumFaces() const;
     inline Matrix& Vertices() const;
     inline Matrix& Normals() const;

     /* Overloaded operators */
     friend Solid operator*(const Solid&, const CTM&);
     friend Solid operator*(const Solid&, const Matrix&);
     friend Solid operator+(const Solid&, const Solid&);
     inline friend Solid operator+(const Solid&, const SolidFace&);

private:
     Matrix vertices;
     Matrix normals;
     DynObject faces;
     int num_faces;
};

inline Solid operator+(Solid& solid, const SolidFace& face)
{
     solid.AddFace(face);
     return solid;
}

inline SolidFace *Solid::Face(int i) const
{
     return *((SolidFace **) faces[i]);
}

inline int Solid::NumFaces() const
{
     return num_faces;
}

inline Matrix& Solid::Vertices() const
{
     return vertices;
}

inline Matrix& Solid::Normals() const
{
     return normals;
}

/* DO NOT ADD ANYTHING AFTER THIS #endif */
#endif /* __SOLID_H__ */
