#ifndef SPHERE_H #define SPHERE_H #include void generateSphere(int w, int h, GLuint *VA) { GLuint VB, NB, IB; GLfloat vertices[3*w*h + 6]; GLfloat normals[3*w*h + 6]; GLuint indices[6*w*h]; memset(vertices, 0, sizeof(vertices)); memset(normals, 0, sizeof(normals)); memset(indices, 0, sizeof(indices)); for(int i = 0; i < h; i++) for(int j = 0; j < w; j++) { vertices[3*i*w + 3*j + 0] = normals[3*i*w + 3*j + 0] = sin((float)(i+1.0)/(h+1.0)*M_PI) * cos((float)j/w*2*M_PI); vertices[3*i*w + 3*j + 1] = normals[3*i*w + 3*j + 1] = sin((float)(i+1.0)/(h+1.0)*M_PI) * sin((float)j/w*2*M_PI); vertices[3*i*w + 3*j + 2] = normals[3*i*w + 3*j + 2] = cos((float)(i+1.0)/(h+1.0)*M_PI); } vertices[3*w*h + 0] = normals[3*w*h + 0] = 0; vertices[3*w*h + 1] = normals[3*w*h + 1] = 0; vertices[3*w*h + 2] = normals[3*w*h + 2] = 1; vertices[3*w*h + 3] = normals[3*w*h + 3] = 0; vertices[3*w*h + 4] = normals[3*w*h + 4] = 0; vertices[3*w*h + 5] = normals[3*w*h + 5] = -1; for(int i = 0; i < h - 1; i++) { for(int j = 0; j < w - 1; j++) { indices[6*i*w + 6*j] = i*w + j; indices[6*i*w + 6*j + 1] = i*w + j + 1; indices[6*i*w + 6*j + 2] = i*w + j + w; indices[6*i*w + 6*j + 3] = i*w + j + 1; indices[6*i*w + 6*j + 4] = i*w + j + w + 1; indices[6*i*w + 6*j + 5] = i*w + j + w; } indices[6*i*w + 6*w - 6] = i*w + w - 1; indices[6*i*w + 6*w - 5] = i*w; indices[6*i*w + 6*w - 4] = i*w + 2*w - 1; indices[6*i*w + 6*w - 3] = i*w; indices[6*i*w + 6*w - 2] = i*w + w; indices[6*i*w + 6*w - 1] = i*w + 2*w - 1; } for(int i = 0; i < w - 1; i++) { indices[6*h*w - 6*w + 6*i + 0] = i; indices[6*h*w - 6*w + 6*i + 1] = w*h; indices[6*h*w - 6*w + 6*i + 2] = i+1; indices[6*h*w - 6*w + 6*i + 3] = w*h - w + i + 1; indices[6*h*w - 6*w + 6*i + 4] = w*h + 1; indices[6*h*w - 6*w + 6*i + 5] = w*h - w + i; } indices[6*h*w - 6 + 0] = w - 1; indices[6*h*w - 6 + 1] = w*h; indices[6*h*w - 6 + 2] = 0; glGenVertexArrays(1, VA); glBindVertexArray(*VA); glGenBuffers(1, &VB); glBindBuffer(GL_ARRAY_BUFFER, VB); glBufferData(GL_ARRAY_BUFFER, (3*w*h+6)*sizeof(GLfloat), vertices, GL_STATIC_DRAW); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); glGenBuffers(1, &NB); glBindBuffer(GL_ARRAY_BUFFER, NB); glBufferData(GL_ARRAY_BUFFER, (3*w*h+6)*sizeof(GLfloat), normals, GL_STATIC_DRAW); glEnableVertexAttribArray(1); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0); glGenBuffers(1, &IB); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IB); glBufferData(GL_ELEMENT_ARRAY_BUFFER, 6*w*h*sizeof(GLuint), indices, GL_STATIC_DRAW); } #endif