Example #1
0
        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();
        }
Example #2
0
        //{------------------------------------------------------------------}
        //{  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);
            }
        }