VBOSphere::VBOSphere(float rad, GLuint sl, GLuint st) : radius(rad), slices(sl), stacks(st) { nVerts = (slices+1) * (stacks + 1); elements = (slices * 2 * (stacks-1) ) * 3; // Verts float * v = new float[3 * nVerts]; // Normals float * n = new float[3 * nVerts]; // Tex coords float * tex = new float[2 * nVerts]; // Elements unsigned int * el = new unsigned int[elements]; // Generate the vertex data generateVerts(v, n, tex, el); // Create and populate the buffer objects unsigned int handle[4]; glGenBuffers(4, handle); glBindBuffer(GL_ARRAY_BUFFER, handle[0]); glBufferData(GL_ARRAY_BUFFER, (3 * nVerts) * sizeof(float), v, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, handle[1]); glBufferData(GL_ARRAY_BUFFER, (3 * nVerts) * sizeof(float), n, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, handle[2]); glBufferData(GL_ARRAY_BUFFER, (2 * nVerts) * sizeof(float), tex, GL_STATIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, handle[3]); glBufferData(GL_ELEMENT_ARRAY_BUFFER, elements * sizeof(unsigned int), el, GL_STATIC_DRAW); delete [] v; delete [] n; delete [] el; delete [] tex; // Create the VAO glGenVertexArrays( 1, &vaoHandle ); glBindVertexArray(vaoHandle); glEnableVertexAttribArray(0); // Vertex position glBindBuffer(GL_ARRAY_BUFFER, handle[0]); glVertexAttribPointer( (GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0 ); glEnableVertexAttribArray(1); // Vertex normal glBindBuffer(GL_ARRAY_BUFFER, handle[1]); glVertexAttribPointer( (GLuint)1, 3, GL_FLOAT, GL_FALSE, 0, 0 ); glBindBuffer(GL_ARRAY_BUFFER, handle[2]); glEnableVertexAttribArray(2); // Texture coords glVertexAttribPointer( (GLuint)2, 2, GL_FLOAT, GL_FALSE, 0, 0 ); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, handle[3]); glBindVertexArray(0); }
VBOTorus::VBOTorus(float outerRadius, float innerRadius, int nsides, int nrings) : rings(nrings), sides(nsides) { faces = sides * rings; int nVerts = sides * (rings+1); // One extra ring to duplicate first ring // Verts float * v = new float[3 * nVerts]; // Normals float * n = new float[3 * nVerts]; // Tex coords float * tex = new float[2 * nVerts]; // Elements unsigned int * el = new unsigned int[6 * faces]; // Generate the vertex data generateVerts(v, n, tex, el, outerRadius, innerRadius); // Create and populate the buffer objects unsigned int handle[4]; glGenBuffers(4, handle); glBindBuffer(GL_ARRAY_BUFFER, handle[0]); glBufferData(GL_ARRAY_BUFFER, (3 * nVerts) * sizeof(float), v, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, handle[1]); glBufferData(GL_ARRAY_BUFFER, (3 * nVerts) * sizeof(float), n, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, handle[2]); glBufferData(GL_ARRAY_BUFFER, (2 * nVerts) * sizeof(float), tex, GL_STATIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, handle[3]); glBufferData(GL_ELEMENT_ARRAY_BUFFER, 6 * faces * sizeof(unsigned int), el, GL_STATIC_DRAW); delete [] v; delete [] n; delete [] el; delete [] tex; // Create the VAO glGenVertexArrays( 1, &vaoHandle ); glBindVertexArray(vaoHandle); glEnableVertexAttribArray(0); // Vertex position glBindBuffer(GL_ARRAY_BUFFER, handle[0]); glVertexAttribPointer( (GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, ((GLubyte *)NULL + (0)) ); glEnableVertexAttribArray(1); // Vertex normal glBindBuffer(GL_ARRAY_BUFFER, handle[1]); glVertexAttribPointer( (GLuint)1, 3, GL_FLOAT, GL_FALSE, 0, ((GLubyte *)NULL + (0)) ); glBindBuffer(GL_ARRAY_BUFFER, handle[2]); glEnableVertexAttribArray(2); // Texture coords glVertexAttribPointer( (GLuint)2, 2, GL_FLOAT, GL_FALSE, 0, ((GLubyte *)NULL + (0)) ); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, handle[3]); glBindVertexArray(0); }