| 
						 
							
							
							
						 
					 | 
				
			
			 | 
			 | 
			
				@ -0,0 +1,385 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				#include "renderer.h"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				void ChunksRenderer::init()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					texture.load(RESOURCES_PATH "blocks.png");
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					float facePositions[6][12] =
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						//front
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						0.5, 0.5, 0.5,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						-0.5, 0.5, 0.5,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						-0.5, -0.5, 0.5,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						0.5, -0.5, 0.5,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						//back
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						-0.5, -0.5, -0.5,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						-0.5, 0.5, -0.5,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						0.5, 0.5, -0.5,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						0.5, -0.5, -0.5,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						//top
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						-0.5, 0.5, -0.5,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						-0.5, 0.5, 0.5,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						0.5, 0.5, 0.5,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						0.5, 0.5, -0.5,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						//bottom
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						0.5, -0.5, 0.5,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						-0.5, -0.5, 0.5,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						-0.5, -0.5, -0.5,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						0.5, -0.5, -0.5,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						//left
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						-0.5, -0.5, 0.5,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						-0.5, 0.5, 0.5,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						-0.5, 0.5, -0.5,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						-0.5, -0.5, -0.5,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						//right
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						0.5, 0.5, -0.5,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						0.5, 0.5, 0.5,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						0.5, -0.5, 0.5,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						0.5, -0.5, -0.5,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					};
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					float faceTexture[6][8] =
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						//front
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						1,1,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						0,1,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						0,0,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						1,0,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						//back
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						0,0,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						0,1,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						1,1,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						1,0,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						//bottom
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						1,1,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						0,1,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						0,0,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						1,0,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						//top
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						1,1,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						0,1,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						0,0,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						1,0,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						//left
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						1,0,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						1,1,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						0,1,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						0,0,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						//right
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						1,1,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						0,1,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						0,0,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						1,0,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					};
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					uint8_t vertexMask[4]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						0b0000'0001,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						0b0000'0010,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						0b0000'0100,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						0b0000'1000,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					};
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					//all faces
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					unsigned int faceIndeces[6]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						0,1,2,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2,3,0
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					};
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					shader.load();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					glGenBuffers(1, &faceIndexBuffer);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, faceIndexBuffer);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(faceIndeces), faceIndeces, GL_STATIC_DRAW);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					glGenVertexArrays(6, faceVAO);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					glGenBuffers(6, faceBuffer);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					glGenBuffers(6, faceTextureIndexesBuffer);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					glGenBuffers(6, positionsbuffer);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					glGenBuffers(6, textureUVbuffer);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					glGenBuffers(6, aoBuffer);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					glGenBuffers(1, &faceMask);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					glBindBuffer(GL_ARRAY_BUFFER, faceMask);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					glBufferData(GL_ARRAY_BUFFER, sizeof(vertexMask), vertexMask, GL_STATIC_DRAW);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					for(int i=0; i<6;i++)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glBindVertexArray(faceVAO[i]);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glBindBuffer(GL_ARRAY_BUFFER, faceBuffer[i]);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glBufferData(GL_ARRAY_BUFFER, sizeof(facePositions[i]), facePositions[i], GL_STATIC_DRAW);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glEnableVertexAttribArray(0);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void *)0);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glBindBuffer(GL_ARRAY_BUFFER, faceTextureIndexesBuffer[i]);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glBufferData(GL_ARRAY_BUFFER, sizeof(faceTexture[i]), faceTexture[i], GL_STATIC_DRAW);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glEnableVertexAttribArray(1);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void *)0);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, faceIndexBuffer);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glBindBuffer(GL_ARRAY_BUFFER, positionsbuffer[i]);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glEnableVertexAttribArray(2);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glVertexAttribPointer(2, 3, GL_INT, GL_FALSE, 0, (void *)0);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glVertexAttribDivisor(2, 1);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glBindBuffer(GL_ARRAY_BUFFER, textureUVbuffer[i]);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glEnableVertexAttribArray(3);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, 0, (void *)0);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glVertexAttribDivisor(3, 1);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glBindBuffer(GL_ARRAY_BUFFER, aoBuffer[i]);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glEnableVertexAttribArray(4);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glVertexAttribIPointer(4, 1, GL_UNSIGNED_BYTE, 0, (void *)0);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glVertexAttribDivisor(4, 1);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glBindBuffer(GL_ARRAY_BUFFER, faceMask);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glEnableVertexAttribArray(5);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glVertexAttribIPointer(5, 1, GL_UNSIGNED_BYTE, 0, (void *)0);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					glBindVertexArray(0);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				//deprecated
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				void ChunksRenderer::render(Camera &c, Block b, glm::ivec3 pos)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					shader.bind();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					texture.bind(0);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					shader.setProjectionMatrix(c.getProjectionMatrix());
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					glm::vec3 playerPos = c.getPosition();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					//playerPos /= 2.f;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					shader.setPlayerPos({ playerPos.x, playerPos.y, playerPos.z });
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					shader.setModelViewMatrix(c.getViewMatrix());
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					for(int i=0; i<6; i++)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glBindVertexArray(faceVAO[i]);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						shader.setPosition(pos.x, pos.y, pos.z);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						shader.setTextureAtlasCoords(b.getPositionInAtlas(i).x, b.getPositionInAtlas(i).y);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					glBindVertexArray(0);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				//deprecated
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				void ChunksRenderer::render(Camera &c, Chunk &chunk)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					shader.bind();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					texture.bind(0);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					shader.setProjectionMatrix(c.getProjectionMatrix());
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					glm::vec3 playerPos = c.getPosition();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					shader.setPlayerPos({ playerPos.x, playerPos.y, playerPos.z });
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					shader.setModelViewMatrix(c.getViewMatrix());
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					for(int face=0;face<6;face++)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glBindVertexArray(faceVAO[face]);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						for (int i = 0; i < chunk.positions[face].size(); i++)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							glm::ivec3 pos = chunk.positions[face][i];
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							int addX = chunk.getChunkPositionx16().x;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							int addZ = chunk.getChunkPositionx16().y;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							pos.x += addX;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							pos.z += addZ;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							auto &uv = chunk.UVs[face][i];
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							shader.setPosition(pos.x, pos.y, pos.z);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							shader.setTextureAtlasCoords(uv.x, uv.y);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					glBindVertexArray(0);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				void ChunksRenderer::render(Camera &c, ChunkManager &chunkManager, SkyBox &skyBox)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					//resort chunks and stuff
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					glm::ivec3 curentPosion = c.getPositionInWorld();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					if (lastPosition != curentPosion)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						//todo move this in set player pos
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glm::ivec2 chunkPos = chunkManager.getPlayerInChunk(glm::vec3(curentPosion));
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						Chunk *currentChunk = chunkManager.getChunk(chunkPos);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						if (currentChunk)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							currentChunk->sortTransparentFaces(c.getPosition());
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						lastPosition = curentPosion;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					//
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					shader.bind();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					texture.bind(0);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					shader.setProjectionMatrix(c.getProjectionMatrix());
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					glm::vec3 playerPos = c.getPosition();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					shader.setPlayerPos({ playerPos.x, playerPos.y, playerPos.z });
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					shader.setModelViewMatrix(c.getViewMatrix());
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					shader.setAo(this->ao);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					for (int face = 0; face < 6; face++)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						facesVector.clear();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						uvVector.clear();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						aoVector.clear();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						for (auto c : chunkManager.loadedChunks)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							int addX = c->getChunkPositionx16().x;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							int addZ = c->getChunkPositionx16().y;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							for(int i=0;i< c->positions[face].size(); i++)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								glm::ivec3 pos = c->positions[face][i];
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								pos.x += addX;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								pos.z += addZ;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								glm::vec2 uv = c->UVs[face][i];
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								uint8_t ao = c->ao[face][i];
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								facesVector.push_back(pos);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								uvVector.push_back(uv);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								aoVector.push_back(ao);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glBindVertexArray(faceVAO[face]);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glBindBuffer(GL_ARRAY_BUFFER, positionsbuffer[face]);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glEnableVertexAttribArray(2);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glVertexAttribIPointer(2, 3, GL_INT, 0, (void *)0);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glVertexAttribDivisor(2, 1);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glBufferData(GL_ARRAY_BUFFER, sizeof(glm::ivec3) * facesVector.size(),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							facesVector.data(), GL_STREAM_DRAW);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glBindBuffer(GL_ARRAY_BUFFER, textureUVbuffer[face]);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glEnableVertexAttribArray(3);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, 0, (void *)0);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glVertexAttribDivisor(3, 1);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec2) * uvVector.size(),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							uvVector.data(), GL_STREAM_DRAW);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glBindBuffer(GL_ARRAY_BUFFER, aoBuffer[face]);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glEnableVertexAttribArray(4);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glVertexAttribIPointer(4, 1, GL_UNSIGNED_BYTE, 0, (void *)0);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glVertexAttribDivisor(4, 1);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glBufferData(GL_ARRAY_BUFFER, 1 * aoVector.size(), aoVector.data(), GL_STREAM_DRAW);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glDrawElementsInstanced(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0, facesVector.size());
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					glm::mat4 centeredView = glm::mat4(glm::mat3(c.getViewMatrix()));
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					skyBox.render(c.getProjectionMatrix() * centeredView);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					shader.bind();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					texture.bind(0);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					shader.setProjectionMatrix(c.getProjectionMatrix());
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					shader.setPlayerPos({ playerPos.x, playerPos.y, playerPos.z });
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					shader.setModelViewMatrix(c.getViewMatrix());
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					for (int face = 0; face < 6; face++)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						facesVector.clear();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						uvVector.clear();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						for (auto c : chunkManager.loadedChunks)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							int addX = c->getChunkPositionx16().x;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							int addZ = c->getChunkPositionx16().y;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							for(int i=0;i< c->transparentPositions[face].size(); i++)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								glm::ivec3 pos = c->transparentPositions[face][i];
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								pos.x += addX;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								pos.z += addZ;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								glm::vec2 uv = c->transparentUVs[face][i];
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								facesVector.push_back(pos);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								uvVector.push_back(uv);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glBindVertexArray(faceVAO[face]);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glBindBuffer(GL_ARRAY_BUFFER, positionsbuffer[face]);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glEnableVertexAttribArray(2);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glVertexAttribIPointer(2, 3, GL_INT, 0, (void *)0);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glVertexAttribDivisor(2, 1);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glBufferData(GL_ARRAY_BUFFER, sizeof(glm::ivec3) * facesVector.size(),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							facesVector.data(), GL_STREAM_DRAW);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glBindBuffer(GL_ARRAY_BUFFER, textureUVbuffer[face]);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glEnableVertexAttribArray(3);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, 0, (void *)0);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glVertexAttribDivisor(3, 1);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec2) * uvVector.size(),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							uvVector.data(), GL_STREAM_DRAW);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						glDrawElementsInstanced(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0, (GLsizei)facesVector.size());
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					glBindVertexArray(0);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 |