text: #ifndef _cVAOManager_HG_
  #define _cVAOManager_HG_
  
  // Will load the models and place them 
  // into the vertex and index buffers to be drawn
  
  #include <string>
  #include <map>
  
  // The vertex structure, as it is in the SHADER (on the GPU)
  // This is also called the 'vertex layout'. 
  // This means that if the shader vertex layout changed, this
  //  vertex structure will also need to change (usually). 
  struct sVert
  {
  	float x, y, z;		// added "z"
  	float r, g, b;
  	float nx, ny, nz;	// Added a normal to the shader, so it's here, too
  };
  
  struct sVec3
  {
  	sVec3() : x(0.0f), y(0.0f), z(0.0f) {}
  	sVec3(float x, float y, float z)
  	{
  		this->x = x;
  		this->y = y;
  		this->z = z;
  	}
  	float x, y, z;
  };
  
  // This represents a single mesh (3D object) structure in 'indexed' format. 
  // Its layout is set up to match how the GPU sees the mesh, rather
  //  than how the file was, etc. 
  // It's also storing the infomation that we need to tell the GPU
  //  which model we want to draw. 
  struct sModelDrawInfo
  {
  	sModelDrawInfo(); 
  
  	std::string meshName;
  
  	unsigned int VAO_ID;
  
  	unsigned int VertexBufferID;
  	unsigned int VertexBuffer_Start_Index;
  	unsigned int numberOfVertices;
  
  	unsigned int IndexBufferID;
  	unsigned int IndexBuffer_Start_Index;
  	unsigned int numberOfIndices;
  	unsigned int numberOfTriangles;
  
  	// Relative scale to 1.0f
  	// If you use this scale, the object will be drawn at "scale 1.0f"
  	float scaleOfOne;
  
  	// You could store the max and min values of the 
  	//  vertices here (determined when you load them):
  	sVec3 maxValues;
  	sVec3 minValues;
  	sVec3 extents;
  	float maxExtent;
  
  
  	// The "local" (i.e. "CPU side" temporary array)
  	sVert* pVertices;	//  = 0;
  	// The index buffer (CPU side)
  	unsigned int* pIndices;
  };
  
  
  class cVAOManager
  {
  public:
  
  	bool LoadModelIntoVAO(std::string fileName, 
  						  sModelDrawInfo &drawInfo, 
  						  unsigned int shaderProgramID);
  
  	// We don't want to return an int, likely
  	bool FindDrawInfoByModelName(std::string filename,
  								 sModelDrawInfo &drawInfo);
  
  	std::string getLastError(bool bAndClear = true);
  
  	//pickRandomModel()
  
  private:
  
  	std::map< std::string /*model name*/,
  		      sModelDrawInfo /* info needed to draw*/ >
  		m_map_ModelName_to_VAOID;
  
  	// Loads the ply model file into a temporary array
  	bool m_LoadTheModel( std::string fileName, 
  						 sModelDrawInfo &drawInfo);
  
  	std::string m_lastErrorString;
  	void m_AppendTextToLastError(std::string text, bool addNewLineBefore = true);
  };
  
  #endif	// _cVAOManager_HG_
  