82 lines
2.7 KiB
C
82 lines
2.7 KiB
C
#ifndef SPHERE_H
|
|
#define SPHERE_H
|
|
|
|
#include <GL/gl.h>
|
|
|
|
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
|