void createMeshStripIndices(void) { int n=0; int i,j; for (i=0; i< BIG_N; i++) { for (j=0; j<= BIG_M; j++) { tubeStrips[n++] = VERTEX_INDEX(i,j); tubeStrips[n++] = VERTEX_INDEX((i+1) % (BIG_N+1),j); } tubeStrips[n] = tubeStrips[n-1]; n++; tubeStrips[n] = tubeStrips[n-2]; n++; tubeStrips[n] = VERTEX_INDEX(i,j); n++; tubeStrips[n] = VERTEX_INDEX(i,j); n++; } while (n!= TOTAL_INDICES-1) { n--; } }
void buildTube(){ static GLboolean firstTime = GL_TRUE; if( firstTime ) { glGenBuffers(1,&vertexBuffer); glGenBuffers(1,&indexBuffer); glGenBuffers(1,&normalBuffer); /* Fill and buffer index data, since its done only once */ int n = 0; int i, j; for ( i = 0; i < TUBE_N; i++ ) { for( j = 0; j < TUBE_M; j++ ) { tubeStrips[n++] = VERTEX_INDEX((i+1)%TUBE_N,j); tubeStrips[n++] = VERTEX_INDEX(i,j); } tubeStrips[n++] = VERTEX_INDEX((i+1)%TUBE_N,0); tubeStrips[n++] = VERTEX_INDEX(i,0); } glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(tubeStrips), tubeStrips, GL_STATIC_DRAW); firstTime = GL_FALSE; } double dt = (2*M_PI)/TUBE_N; double du = (2*M_PI)/TUBE_M; /* Calculate Points */ double t; int i; for(i = 0, t = 0.0; i < TUBE_N; i++, t += dt ){ GLdouble C[3], T[3], A[3], B[3], N[3]; /* x, y, z */ C[0] = ( a + b*cos(q*t)) * cos(p*t); C[1] = ( a + b*cos(q*t)) * sin(p*t); C[2] = b * sin(q*t); /* dx, dy, dz */ T[0] = -p*C[1] - b*q*sin(q*t)*cos(p*t); T[1] = p*C[0] - b*q*sin(q*t)*sin(p*t); T[2] = b*q*cos(q*t); /* ddx, ddy, ddz */ A[0] = -p*T[1] + b*q*(p*sin(q*t)*sin(p*t) - q*cos(q*t)*cos(p*t)); A[1] = p*T[0] - b*q*(p*sin(q*t)*cos(p*t) + q*cos(q*t)*sin(p*t)); A[2] = -(q*q)*b*sin(q*t); /* B = T cross A */ B[0] = T[1]*A[2] - T[2]*A[1]; B[1] = T[2]*A[0] - T[0]*A[2]; B[2] = T[0]*A[1] - T[1]*A[0]; /* Normalize T and B */ normalize(T); normalize(B); /* N = B cross T */ N[0] = B[1]*T[2] - B[2]*T[1]; N[1] = B[2]*T[0] - B[0]*T[2]; N[2] = B[0]*T[1] - B[1]*T[0]; //normalize(N); float u; int j; for( j = 0, u = 0.0; j < TUBE_M; j++, u += du ){ for( int 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]; } } } /* Load vertex buffer */ glBindBuffer(GL_ARRAY_BUFFER, normalBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(tubeNormals), tubeNormals, GL_DYNAMIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(tube), tube, GL_DYNAMIC_DRAW); }