|  | @@ -12,8 +12,6 @@ static_assert(std::is_same<GL::Program, GLuint>::value, "p has invalid type");
 | 
	
		
			
				|  |  |  static_assert(std::is_same<char, GLchar>::value, "char has invalid type");
 | 
	
		
			
				|  |  |  static_assert(std::is_same<int, GLint>::value, "int has invalid type");
 | 
	
		
			
				|  |  |  static_assert(std::is_same<float, GLfloat>::value, "float has invalid type");
 | 
	
		
			
				|  |  | -static_assert(std::is_same<GL::ShaderType, GLenum>::value,
 | 
	
		
			
				|  |  | -              "shader type has invalid type");
 | 
	
		
			
				|  |  |  static_assert(std::is_same<GL::Texture, GLuint>::value,
 | 
	
		
			
				|  |  |                "texture has invalid type");
 | 
	
		
			
				|  |  |  static_assert(std::is_same<GL::Framebuffer, GLuint>::value,
 | 
	
	
		
			
				|  | @@ -24,19 +22,6 @@ static_assert(std::is_same<GL::VertexArray, GLuint>::value,
 | 
	
		
			
				|  |  |                "vertex array has invalid type");
 | 
	
		
			
				|  |  |  static_assert(std::is_same<GL::Buffer, GLuint>::value,
 | 
	
		
			
				|  |  |                "buffer has invalid type");
 | 
	
		
			
				|  |  | -static_assert(std::is_same<GL::BufferUsage, GLenum>::value,
 | 
	
		
			
				|  |  | -              "buffer usage has invalid type");
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -GL::ShaderType GL::NO_SHADER = 0;
 | 
	
		
			
				|  |  | -GL::ShaderType GL::VERTEX_SHADER = GL_VERTEX_SHADER;
 | 
	
		
			
				|  |  | -GL::ShaderType GL::FRAGMENT_SHADER = GL_FRAGMENT_SHADER;
 | 
	
		
			
				|  |  | -GL::ShaderType GL::GEOMETRY_SHADER = GL_GEOMETRY_SHADER;
 | 
	
		
			
				|  |  | -GL::ShaderType GL::TESSELATION_CONTROL_SHADER = GL_TESS_CONTROL_SHADER;
 | 
	
		
			
				|  |  | -GL::ShaderType GL::TESSELATION_EVALUATION_SHADER = GL_TESS_EVALUATION_SHADER;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -GL::BufferUsage GL::STATIC_DRAW = GL_STATIC_DRAW;
 | 
	
		
			
				|  |  | -GL::BufferUsage GL::STREAM_DRAW = GL_STREAM_DRAW;
 | 
	
		
			
				|  |  | -GL::BufferUsage GL::DYNAMIC_DRAW = GL_DYNAMIC_DRAW;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  GL::Attribute::Attribute(int count_, int size_, int type_, bool normalized_)
 | 
	
		
			
				|  |  |      : count(count_), size(size_), type(type_), normalized(normalized_) {
 | 
	
	
		
			
				|  | @@ -210,7 +195,17 @@ void GL::deleteProgram(Program p) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  GL::Shader GL::createShader(ShaderType type) {
 | 
	
		
			
				|  |  | -    return glCreateShader(type);
 | 
	
		
			
				|  |  | +    static constexpr GLenum MAP[] = {0,
 | 
	
		
			
				|  |  | +                                     GL_VERTEX_SHADER,
 | 
	
		
			
				|  |  | +                                     GL_FRAGMENT_SHADER,
 | 
	
		
			
				|  |  | +                                     GL_GEOMETRY_SHADER,
 | 
	
		
			
				|  |  | +                                     GL_TESS_CONTROL_SHADER,
 | 
	
		
			
				|  |  | +                                     GL_TESS_EVALUATION_SHADER};
 | 
	
		
			
				|  |  | +    static constexpr int MAP_SIZE =
 | 
	
		
			
				|  |  | +        static_cast<int>(sizeof(MAP) / sizeof(GLenum));
 | 
	
		
			
				|  |  | +    int index = static_cast<int>(type);
 | 
	
		
			
				|  |  | +    GLenum realTyp = index < 0 || index >= MAP_SIZE ? MAP[0] : MAP[index];
 | 
	
		
			
				|  |  | +    return glCreateShader(realTyp);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void GL::compileShader(Shader s, const char* code) {
 | 
	
	
		
			
				|  | @@ -398,7 +393,13 @@ void GL::bindBuffer(Buffer b) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void GL::bufferData(int size, const void* data, BufferUsage usage) {
 | 
	
		
			
				|  |  | -    glBufferData(GL_ARRAY_BUFFER, size, data, usage);
 | 
	
		
			
				|  |  | +    static constexpr GLenum MAP[] = {0, GL_STATIC_DRAW, GL_STREAM_DRAW,
 | 
	
		
			
				|  |  | +                                     GL_DYNAMIC_DRAW};
 | 
	
		
			
				|  |  | +    static constexpr int MAP_SIZE =
 | 
	
		
			
				|  |  | +        static_cast<int>(sizeof(MAP) / sizeof(GLenum));
 | 
	
		
			
				|  |  | +    int index = static_cast<int>(usage);
 | 
	
		
			
				|  |  | +    GLenum realUsage = index < 0 || index >= MAP_SIZE ? MAP[0] : MAP[index];
 | 
	
		
			
				|  |  | +    glBufferData(GL_ARRAY_BUFFER, size, data, realUsage);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void GL::bufferSubData(int offset, int size, const void* data) {
 |