Files
billiards_gl/sphere.h
Florian Stecker 04a707b4ed initial version
2025-12-07 19:04:34 -05:00

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