void spline_mesh(void){ static GLboolean first = GL_TRUE; static GLuint vertBuffer; static GLuint normalBuffer; static GLuint indexBuffer; GLdouble tube[TUBE_N][TUBE_M][3]; GLdouble tubeNormals[TUBE_N][TUBE_M][3]; if(first){ double t, u; int i, j, k; double dt = 2 * M_PI / TUBE_N; double du = 2 * M_PI / TUBE_M; for(i = 0, t = 0.0; i < TUBE_N; i++, t += dt){ GLdouble x = (a + b * cos(q * t)) * cos(p * t); GLdouble y = (a + b * cos(q * t)) * sin(p * t); GLdouble z = b * sin(q * t); GLdouble tangx = -p * y - b * q * sin(q * t) * cos(p * t); GLdouble tangy = p * x - b * q * sin(q * t) * sin(p * t); GLdouble tangz = b * q * cos(q * t); GLdouble accelx = -p * tangy + b * q * (p * sin(q * t) * sin(p * t) - q * cos(q * t) * cos(p * t)); GLdouble accely = p * tangx - b * q * (p * sin(q * t) * cos(p * t) + q * cos(q * t) * sin(p * t)); GLdouble accelz = -(q * q) * b * sin(q * t); GLdouble C[3] = {x, y, z}; GLdouble T[3] = {tangx, tangy, tangz}; GLdouble A[3] = {accelx, accely, accelz}; GLdouble N[3]; GLdouble B[3]; cross(T, A, B); normalize(T); normalize(B); cross(B, T, N); for(j = 0, u = 0.0; j < TUBE_M; j++, u += du){ for(k = 0; k < 3; k++){ tubeNormals[i][j][k] = cos(u) * B[k] + sin(u) * N[k]; tube[i][j][k] = C[k] + R * tubeNormals[i][j][k]; } } } createMeshStripIndices(); glGenBuffers(1, &indexBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(tubeStrips), tubeStrips, GL_STATIC_DRAW); glGenBuffers(1, &vertBuffer); glBindBuffer(GL_ARRAY_BUFFER, vertBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(tube), tube, GL_STATIC_DRAW); glGenBuffers(1, &normalBuffer); glBindBuffer(GL_ARRAY_BUFFER, normalBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(tubeNormals), tubeNormals, GL_STATIC_DRAW); first = GL_FALSE; } loadUniforms(); glEnableVertexAttribArray(vertexPositionAttr); glBindBuffer(GL_ARRAY_BUFFER, vertBuffer); glVertexAttribPointer(vertexPositionAttr, 3, GL_DOUBLE, GL_FALSE, 0, (GLvoid*) 0); //glEnableVertexAttribArray(vertexNormalAttr); //glBindBuffer(GL_ARRAY_BUFFER, normalBuffer); //glVertexAttribPointer(vertexNormalAttr, 3, GL_DOUBLE, GL_FALSE, 0, (GLvoid*) 0); int i; char *offset; glBindBuffer(GL_ARRAY_BUFFER, vertBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); for(i = 0, offset = 0; i < NUM_STRIPS; i++, offset += INDICES_PER_STRIP * sizeof(GLushort)){ glDrawElements(GL_QUAD_STRIP, INDICES_PER_STRIP, GL_UNSIGNED_SHORT, (GLvoid*) offset); } }
void ellipsoidWireFrame() { static GLuint vertBuffer; static GLuint normalsBuffer; static GLuint indexBuffer; static GLboolean first = GL_TRUE; GLfloat u,v; int m,n; int cnt=0; if (first || changeFlag) { for (n=0; n <= BIG_N; n++) { v = -M_PI/2.0 + (float) n/ (float) BIG_N * M_PI; for (m=0; m <= BIG_M; m++) { u = -M_PI + (float) m/ (float) BIG_M * 2.0 * M_PI; verticesArray[cnt] = xValue(u,v); normalsArray[cnt] = nxValue(u,v); cnt++; verticesArray[cnt] = yValue(u,v); normalsArray[cnt] = nyValue(u,v); cnt++; verticesArray[cnt] = zValue(u,v); normalsArray[cnt] = nzValue(u,v); cnt++; } } glGenBuffers(1, &vertBuffer); glBindBuffer(GL_ARRAY_BUFFER, vertBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(verticesArray), verticesArray, GL_STATIC_DRAW); glGenBuffers(1, &normalsBuffer); glBindBuffer(GL_ARRAY_BUFFER,normalsBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(normalsArray), normalsArray, GL_STATIC_DRAW); if (first) { createMeshStripIndices(); glGenBuffers(1, &indexBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(tubeStrips), tubeStrips, GL_STATIC_DRAW); } first = GL_FALSE; changeFlag = GL_FALSE; } loadUniforms(); glEnableVertexAttribArray(vertexPositionAttr); glBindBuffer(GL_ARRAY_BUFFER, vertBuffer); glVertexAttribPointer(vertexPositionAttr,3, GL_FLOAT,GL_FALSE, 0, (GLvoid*) 0); glBindBuffer(GL_ARRAY_BUFFER, normalsBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,indexBuffer); glDrawElements(GL_QUAD_STRIP, TOTAL_INDICES, GL_UNSIGNED_SHORT, (GLvoid*) 0); }