Exemplo n.º 1
0
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);
	}
}
Exemplo n.º 2
0
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);


}