private void InitData() { // Get the OpenGL object. OpenGL gl = openGLControl.OpenGL; blob = new TBlob(); blob.Triangle = new TTriangle[numTriangles]; blob.vertex = new TVertex[numVertices]; obj = new TBlob(); obj.Triangle = new TTriangle[numTriangles]; obj.vertex = new TVertex[numVertices]; sphere = new TBlob(); sphere.vertex = new TVertex[numVertices]; for (int i = 0; i < numTriangles; i++) { blob.Triangle[i].T = new TTexCoord[3]; blob.Triangle[i].v = new int[3]; obj.Triangle[i].T = new TTexCoord[3]; obj.Triangle[i].v = new int[3]; } CreateSphere(ref blob); // Copy the verts from blob into the sphere & object int count = 0; foreach (TVertex vertex in blob.vertex) { sphere.vertex[count] = vertex; obj.vertex[count] = vertex; count += 1; } count = 0; foreach (TTriangle triangle in blob.Triangle) { obj.Triangle[count++] = triangle; } for (int i = 0; i < numVertices; i++) { LU[i].X = ArcTan(sphere.vertex[i].X, sphere.vertex[i].Y) * 5; LU[i].Y = ArcTan(sphere.vertex[i].X, sphere.vertex[i].Z) * 6; LU[i].Z = ArcTan(sphere.vertex[i].Y, sphere.vertex[i].Z) * 8; } // Initialise tentacles CubeDL = gl.GenLists(1); gl.NewList(CubeDL, OpenGL.GL_COMPILE); gl.Begin(OpenGL.GL_QUADS); // Front Face gl.TexCoord(0.0, 0.0); gl.Vertex(-1.0, -1.0, 1.0); gl.TexCoord(1.0, 0.0); gl.Vertex(1.0, -1.0, 1.0); gl.TexCoord(1.0, 1.0); gl.Vertex(1.0, 1.0, 1.0); gl.TexCoord(0.0, 1.0); gl.Vertex(-1.0, 1.0, 1.0); // Back Face gl.TexCoord(1.0, 0.0); gl.Vertex(-1.0, -1.0, -1.0); gl.TexCoord(1.0, 1.0); gl.Vertex(-1.0, 1.0, -1.0); gl.TexCoord(0.0, 1.0); gl.Vertex(1.0, 1.0, -1.0); gl.TexCoord(0.0, 0.0); gl.Vertex(1.0, -1.0, -1.0); // Top Face gl.TexCoord(0.0, 1.0); gl.Vertex(-1.0, 1.0, -1.0); gl.TexCoord(0.0, 0.0); gl.Vertex(-1.0, 1.0, 1.0); gl.TexCoord(1.0, 0.0); gl.Vertex(1.0, 1.0, 1.0); gl.TexCoord(1.0, 1.0); gl.Vertex(1.0, 1.0, -1.0); // Bottom Face gl.TexCoord(1.0, 1.0); gl.Vertex(-1.0, -1.0, -1.0); gl.TexCoord(0.0, 1.0); gl.Vertex(1.0, -1.0, -1.0); gl.TexCoord(0.0, 0.0); gl.Vertex(1.0, -1.0, 1.0); gl.TexCoord(1.0, 0.0); gl.Vertex(-1.0, -1.0, 1.0); // Right face gl.TexCoord(1.0, 0.0); gl.Vertex(1.0, -1.0, -1.0); gl.TexCoord(1.0, 1.0); gl.Vertex(1.0, 1.0, -1.0); gl.TexCoord(0.0, 1.0); gl.Vertex(1.0, 1.0, 1.0); gl.TexCoord(0.0, 0.0); gl.Vertex(1.0, -1.0, 1.0); // Left Face gl.TexCoord(0.0, 0.0); gl.Vertex(-1.0, -1.0, -1.0); gl.TexCoord(1.0, 0.0); gl.Vertex(-1.0, -1.0, 1.0); gl.TexCoord(1.0, 1.0); gl.Vertex(-1.0, 1.0, 1.0); gl.TexCoord(0.0, 1.0); gl.Vertex(-1.0, 1.0, -1.0); gl.End(); gl.EndList(); }
//{------------------------------------------------------------------} //{ Function to create a sphere } //{------------------------------------------------------------------} private void CreateSphere(ref TBlob obj) { const int r = 10; int yRing = yRows * (4 + 4); float uTex = 3.0f / (xRows); float vTex = 3.0f / ((3 + 2) * yRows); float yLevel = 0; float radius = 0; int offset = 0; // Top center obj.vertex[0].X = 0; obj.vertex[0].Z = 0; obj.vertex[0].Y = -r; offset = 1; // Top half and center for (int y = 0; y < yRows + 1; y++) { yLevel = (float)(-r * Math.Cos(2 * Math.PI * (y + 1) / yRing)); radius = (float)(r * Math.Sin(2 * Math.PI * (y + 1) / yRing)); for (int x = 0; x < xRows; x++) { obj.vertex[offset].X = (float)(radius * Math.Sin(2 * Math.PI * x / xRows)); obj.vertex[offset].Z = (float)(radius * Math.Cos(2 * Math.PI * x / xRows)); obj.vertex[offset].Y = yLevel; offset++; } } // Bottom half for (int y = 0; y < yRows; y++) { yLevel = (float)(r * Math.Sin(2 * Math.PI * (y + 1) / yRing)); radius = (float)(r * Math.Cos(2 * Math.PI * (y + 1) / yRing)); for (int x = 0; x < xRows; x++) { obj.vertex[offset].X = (float)(radius * Math.Sin(2 * Math.PI * x / xRows)); obj.vertex[offset].Z = (float)(radius * Math.Cos(2 * Math.PI * x / xRows)); obj.vertex[offset].Y = yLevel; offset++; } } // Bottom center obj.vertex[offset].X = 0; obj.vertex[offset].Z = 0; obj.vertex[offset].Y = r; for (int i = 0; i < xRows; i++) { obj.Triangle[i].v[0] = 0; obj.Triangle[i].v[1] = (i + 1) % xRows + 1; obj.Triangle[i].v[2] = (i + 1); obj.Triangle[i].T[0].U = 0.5f; obj.Triangle[i].T[0].V = 0.0f; obj.Triangle[i].T[1].U = (i + 1) * uTex; obj.Triangle[i].T[1].V = vTex; obj.Triangle[i].T[2].U = i * uTex; obj.Triangle[i].T[2].V = vTex; } for (int j = 0; j < yRows * 2; j++) { for (int i = 0; i < xRows; i++) { offset = xRows + (i + j * xRows) * 2; obj.Triangle[offset].v[0] = j * xRows + 1 + i; obj.Triangle[offset].v[1] = j * xRows + 1 + (i + 1) % xRows; obj.Triangle[offset].v[2] = j * xRows + 1 + i + xRows; obj.Triangle[offset].T[0].U = i * uTex; obj.Triangle[offset].T[0].V = (1 + j) * vTex; obj.Triangle[offset].T[1].U = (1 + i) * uTex; obj.Triangle[offset].T[1].V = (1 + j) * vTex; obj.Triangle[offset].T[2].U = i * uTex; obj.Triangle[offset].T[2].V = (2 + j) * vTex; offset = xRows + (i + j * xRows) * 2 + 1; obj.Triangle[offset].v[0] = j * xRows + 1 + (i + 1) % xRows; obj.Triangle[offset].v[1] = j * xRows + 1 + (i + 1) % xRows + xRows; obj.Triangle[offset].v[2] = j * xRows + 1 + i + xRows; obj.Triangle[offset].T[0].U = (i + 1) * uTex; obj.Triangle[offset].T[0].V = (1 + j) * vTex; obj.Triangle[offset].T[1].U = (i + 1) * uTex; obj.Triangle[offset].T[1].V = (2 + j) * vTex; obj.Triangle[offset].T[2].U = i * uTex; obj.Triangle[offset].T[2].V = (2 + j) * vTex; } for (int i = 0; i < xRows; i++) { offset = xRows + xRows * 2 * yRows * 2 + i; obj.Triangle[offset].v[0] = 2 * yRows * xRows + 1 + i; obj.Triangle[offset].v[1] = 2 * yRows * xRows + 1 + (i + 1) % xRows; obj.Triangle[offset].v[2] = 2 * yRows * xRows + 1 + xRows; obj.Triangle[offset].T[0].U = i * uTex; obj.Triangle[offset].T[0].V = (yRows * 2 + 1) * vTex; obj.Triangle[offset].T[1].U = (i + 1) * uTex; obj.Triangle[offset].T[1].V = (yRows * 2 + 1) * vTex; obj.Triangle[offset].T[2].U = 0.5f; obj.Triangle[offset].T[2].V = 1.0f; } } // Calculate Normals for (int i = 0; i < numTriangles - 1; i++) { TVertex[] v = new TVertex[3]; v[0] = obj.vertex[obj.Triangle[i].v[0]]; v[1] = obj.vertex[obj.Triangle[i].v[1]]; v[2] = obj.vertex[obj.Triangle[i].v[2]]; obj.Triangle[i].n = calcNormal(v); } }