/* This illustrates how to draw a quad by drawing two triangles and reusing vertices. */ void init_geometryQuad(kuhl_geometry *geom, GLuint prog) { kuhl_geometry_new(geom, prog, 4, // number of vertices GL_TRIANGLES); // type of thing to draw /* The data that we want to draw */ GLfloat vertexPositions[] = {0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0 }; kuhl_geometry_attrib(geom, vertexPositions, 3, // number of components x,y,z "in_Position", // GLSL variable KG_WARN); // warn if attribute is missing in GLSL program? GLfloat texcoord[] = {0, 0, 1, 0, 1, 1, 0, 1}; kuhl_geometry_attrib(geom, texcoord, 2, // number of components x,y,z "in_TexCoord", // GLSL variable KG_WARN); // warn if attribute is missing in GLSL program? GLuint indexData[] = { 0, 1, 2, // first triangle is index 0, 1, and 2 in the list of vertices 0, 2, 3 }; // indices of second triangle. kuhl_geometry_indices(geom, indexData, 6); kuhl_errorcheck(); }
void init_geometryTriangle(kuhl_geometry *geom, GLuint prog) { kuhl_geometry_new(geom, prog, 3, GL_TRIANGLES); GLfloat texcoordData[] = {0, 0, 1, 0, 1, 1 }; kuhl_geometry_attrib(geom, texcoordData, 2, "in_TexCoord", KG_WARN); /* The data that we want to draw */ GLfloat vertexData[] = {0, 0, 0, 1, 0, 0, 1, 1, 0}; kuhl_geometry_attrib(geom, vertexData, 3, "in_Position", KG_WARN); /* Load the texture. It will be bound to texId */ GLuint texId = 0; kuhl_read_texture_file("../images/rainbow.png", &texId); /* Tell this piece of geometry to use the texture we just loaded. */ kuhl_geometry_texture(geom, texId, "tex", KG_WARN); kuhl_errorcheck(); }
/* This illustrates how to draw a quad by drawing two triangles and reusing vertices. */ void init_geometryQuad(kuhl_geometry *geom, GLuint prog) { kuhl_geometry_new(geom, prog, 4, // number of vertices GL_TRIANGLES); // type of thing to draw /* Vertices that we want to form triangles out of. Every 3 numbers * is a vertex position. Below, we provide indices to form * triangles out of these vertices. */ GLfloat vertexPositions[] = {0+1.1, 0, 0, 1+1.1, 0, 0, 1+1.1, 1, 0, 0+1.1, 1, 0 }; kuhl_geometry_attrib(geom, vertexPositions, 3, // number of components x,y,z "in_Position", // GLSL variable KG_WARN); // warn if attribute is missing in GLSL program? /* A list of triangles that we want to draw. "0" refers to the * first vertex in our list of vertices. Every three numbers forms * a single triangle. */ GLuint indexData[] = { 0, 1, 2, 0, 2, 3 }; kuhl_geometry_indices(geom, indexData, 6); kuhl_errorcheck(); }
void init_geometryTriangle(kuhl_geometry *geom, GLuint program) { kuhl_geometry_new(geom, program, 3, // num vertices GL_TRIANGLES); // primitive type /* The data that we want to draw */ GLfloat vertexPositions[] = {0, 0, 0, 1, 0, 0, 1, 1, 0}; kuhl_geometry_attrib(geom, vertexPositions, // data 3, // number of components (x,y,z) "in_Position", // GLSL variable KG_WARN); // warn if attribute is missing in GLSL program? }
void init_geometryTriangle(kuhl_geometry *geom, GLuint prog) { kuhl_geometry_new(geom, prog, 3, // num vertices GL_TRIANGLES); // primitive type /* Vertices that we want to form triangles out of. Every 3 numbers * is a vertex position. Since no indices are provided, every * three vertex positions form a single triangle.*/ GLfloat vertexPositions[] = {0, 0, 0, 1, 0, 0, 1, 1, 0}; kuhl_geometry_attrib(geom, vertexPositions, // data 3, // number of components (x,y,z) "in_Position", // GLSL variable KG_WARN); // warn if attribute is missing in GLSL program? }
void init_geometryCursor(kuhl_geometry *geom, GLuint prog) { kuhl_geometry_new(geom, prog, 4, GL_LINES); /* The data that we want to draw */ GLfloat vertexData[] = {-.04, 0, 0, .04, 0, 0, 0, -.04, 0, 0, .04, 0 }; kuhl_geometry_attrib(geom, vertexData, 3, "in_Position", KG_WARN); GLfloat colorData[] = { 1,1,1, 1,1,1, 1,1,1, 1,1,1 }; kuhl_geometry_attrib(geom, colorData, 3, "in_Color", KG_WARN); }
/** Creates a cylinder geometry object. */ void init_geometryCylinder(kuhl_geometry *cyl, GLuint prog) { int numSides=50; GLfloat vertices[1024]; GLfloat normals[1024]; GLuint indices[1024]; GLfloat texcoords[1024]; int verticesIndex = 0; int normalsIndex = 0; int indicesIndex = 0; int texcoordsIndex = 0; // Bottom middle vertices[verticesIndex++] = 0; vertices[verticesIndex++] = -.5; vertices[verticesIndex++] = -0; normals[normalsIndex++] = 0; normals[normalsIndex++] = -1; normals[normalsIndex++] = 0; texcoords[texcoordsIndex++] = 0; texcoords[texcoordsIndex++] = 0; // For each vertex around bottom perimeter for(int i=0; i<numSides; i++) { vertices[verticesIndex++] = .5*sin(i*2*M_PI/numSides); vertices[verticesIndex++] = -.5; vertices[verticesIndex++] = .5*cos(i*2*M_PI/numSides); normals[normalsIndex++] = 0; normals[normalsIndex++] = -1; normals[normalsIndex++] = 0; texcoords[texcoordsIndex++] = 0; texcoords[texcoordsIndex++] = 0; } // For each face/triangle on bottom, what are the 3 vertices? for(int i=0; i<numSides; i++) { indices[indicesIndex++] = 0; // center point indices[indicesIndex++] = i+1; if(i+2 >= numSides+1) indices[indicesIndex++] = 1; else indices[indicesIndex++] = i+2; } int verticesIndexTopStart = verticesIndex; // Bottom middle vertices[verticesIndex++] = 0; vertices[verticesIndex++] = .5; vertices[verticesIndex++] = -0; normals[normalsIndex++] = 0; normals[normalsIndex++] = 1; normals[normalsIndex++] = 0; texcoords[texcoordsIndex++] = 1; texcoords[texcoordsIndex++] = 1; // For each vertex around bottom perimeter for(int i=0; i<numSides; i++) { vertices[verticesIndex++] = .5*sin(i*2*M_PI/numSides); vertices[verticesIndex++] = .5; vertices[verticesIndex++] = .5*cos(i*2*M_PI/numSides); normals[normalsIndex++] = 0; normals[normalsIndex++] = 1; normals[normalsIndex++] = 0; texcoords[texcoordsIndex++] = 1; texcoords[texcoordsIndex++] = 1; } // For each face/triangle on bottom for(int i=0; i<numSides; i++) { indices[indicesIndex++] = verticesIndexTopStart/3; // center point indices[indicesIndex++] = verticesIndexTopStart/3+i+1; if(i+2 >= numSides+1) indices[indicesIndex++] = verticesIndexTopStart/3+1; else indices[indicesIndex++] = verticesIndexTopStart/3+i+2; } // For each vertex on faces on the sides of the cylinder for(int i=0; i<numSides; i++) { vertices[verticesIndex++] = .5*sin(i*2*M_PI/numSides); vertices[verticesIndex++] = .5; vertices[verticesIndex++] = .5*cos(i*2*M_PI/numSides); vertices[verticesIndex++] = .5*sin(i*2*M_PI/numSides); vertices[verticesIndex++] = -.5; vertices[verticesIndex++] = .5*cos(i*2*M_PI/numSides); vertices[verticesIndex++] = .5*sin((i+1)*2*M_PI/numSides); vertices[verticesIndex++] = -.5; vertices[verticesIndex++] = .5*cos((i+1)*2*M_PI/numSides); vertices[verticesIndex++] = .5*sin((i+1)*2*M_PI/numSides); vertices[verticesIndex++] = .5; vertices[verticesIndex++] = .5*cos((i+1)*2*M_PI/numSides); for(int j=0; j<4; j++) { float pt1[] = { vertices[verticesIndex-3*4+0], vertices[verticesIndex-3*4+1], vertices[verticesIndex-3*4+2] }; float pt2[] = { vertices[verticesIndex-3*4+3], vertices[verticesIndex-3*4+4], vertices[verticesIndex-3*4+5] }; float pt3[] = { vertices[verticesIndex-3*4+6], vertices[verticesIndex-3*4+7], vertices[verticesIndex-3*4+8] }; float v1[3],v2[3],n[3]; vec3f_sub_new(v1, pt2,pt1); vec3f_sub_new(v2, pt3,pt1); vec3f_cross_new(n, v1, v2); normals[normalsIndex++] = n[0]; normals[normalsIndex++] = n[1]; normals[normalsIndex++] = n[2]; if(j < 2) texcoords[texcoordsIndex++] = (numSides-i)/(float)numSides; else texcoords[texcoordsIndex++] = (numSides-(i+1))/(float)numSides; if(j == 1 || j == 2) texcoords[texcoordsIndex++] = 0; // bottom else texcoords[texcoordsIndex++] = 1; // top } indices[indicesIndex++] = verticesIndex/3-4; indices[indicesIndex++] = verticesIndex/3-3; indices[indicesIndex++] = verticesIndex/3-2; indices[indicesIndex++] = verticesIndex/3-4; indices[indicesIndex++] = verticesIndex/3-2; indices[indicesIndex++] = verticesIndex/3-1; } kuhl_geometry_new(cyl, prog, verticesIndex/3, GL_TRIANGLES); kuhl_geometry_attrib(cyl, vertices, 3, "in_Position", 1); kuhl_geometry_attrib(cyl, normals, 3, "in_Normal", 1); kuhl_geometry_attrib(cyl, texcoords, 2, "in_TexCoord", 1); kuhl_geometry_indices(cyl, indices, indicesIndex); /* printf("v: %d\n", verticesIndex); printf("n: %d\n", normalsIndex); printf("t: %d\n", texcoordsIndex); printf("i: %d\n", indicesIndex); */ }