Example #1
0
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--;
    }


}
Example #2
0
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);

}