Esempio n. 1
0
        public static int generateLightCone(int stacks, int slices, out Buffer vbuf, out Buffer ibuf)
        {
            VF.Position3[] vertices = new VF.Position3[(1 + slices + 1) + (stacks + 1) * (slices + 1)];
            ushort[] indices = new ushort[(slices + 1) * 2 + 2 + stacks * (slices + 1) * 2];

            int verticesIdx = 0;

            // bottom
            vertices[verticesIdx++] = new VF.Position3()
            {
                Position = Vector3.UnitZ
            };
            for (int sliceNumber = 0; sliceNumber <= slices; ++sliceNumber)
            {
                float phi = sliceNumber * 2 * Radians.PI / slices + Radians.PI / 2;
                float sinPhi = Radians.Sin(phi);
                float cosPhi = Radians.Cos(phi);

                vertices[verticesIdx++] = new VF.Position3()
                {
                    Position = new Vector3(cosPhi, sinPhi, 1.0f)
                };
            }

            // cone
            for (int stackNumber = 0; stackNumber <= stacks; ++stackNumber)
            {
                for (int sliceNumber = slices; sliceNumber >= 0; --sliceNumber)
                {
                    float phi = sliceNumber * 2 * Radians.PI / slices + Radians.PI / 2;
                    float sinPhi = Radians.Sin(phi);
                    float cosPhi = Radians.Cos(phi);
                    float t = 1.0f - (float)stackNumber / (float)stacks;

                    vertices[verticesIdx++] = new VF.Position3()
                    {
                        Position = new Vector3(cosPhi * t, sinPhi * t, t)
                    };
                }
            }

            int indicesIdx = 0;

            // bottom
            for (int sliceNumber = 0; sliceNumber <= slices; ++sliceNumber)
            {
                indices[indicesIdx++] = (ushort)(0);
                indices[indicesIdx++] = (ushort)(1 + sliceNumber);
            }
            indices[indicesIdx++] = (ushort)(1 + slices);
            indices[indicesIdx++] = (ushort)(1 + slices);

            for (int stackNumber = 0; stackNumber < stacks; ++stackNumber)
            {
                for (int sliceNumber = 0; sliceNumber <= slices; ++sliceNumber)
                {
                    indices[indicesIdx++] = (ushort)((1 + slices + 1) + (stackNumber + 1) * (slices + 1) + sliceNumber);
                    indices[indicesIdx++] = (ushort)((1 + slices + 1) + stackNumber * (slices + 1) + sliceNumber);
                }
            }

            vbuf = Device.Current.CreateVertexBuffer(BufferUsage.StaticDraw, vertices);
            ibuf = Device.Current.CreateIndexBuffer(BufferUsage.StaticDraw, indices);

            return indicesIdx;
        }
Esempio n. 2
0
        public static int generateLightSphere(int stacks, int slices, out Buffer vbuf, out Buffer ibuf)
        {
            VF.Position3[] vertices = new VF.Position3[(stacks + 1) * (slices + 1)];
            ushort[] indices = new ushort[stacks * (slices + 1) * 2];

            int verticesIdx = 0;

            for (int stackNumber = 0; stackNumber <= stacks; ++stackNumber)
            {
                for (int sliceNumber = 0; sliceNumber <= slices; ++sliceNumber)
                {
                    float theta = stackNumber * Radians.PI / stacks;
                    float phi = sliceNumber * 2 * Radians.PI / slices + Radians.PI / 2;
                    float sinTheta = Radians.Sin(theta);
                    float sinPhi = Radians.Sin(phi);
                    float cosTheta = Radians.Cos(theta);
                    float cosPhi = Radians.Cos(phi);

                    vertices[verticesIdx++] = new VF.Position3()
                    {
                        Position = new Vector3(cosPhi * sinTheta, sinPhi * sinTheta, cosTheta)
                    };
                }
            }

            int indicesIdx = 0;

            for (int stackNumber = 0; stackNumber < stacks; ++stackNumber)
            {
                for (int sliceNumber = 0; sliceNumber <= slices; ++sliceNumber)
                {
                    indices[indicesIdx++] = (ushort)(stackNumber * (slices + 1) + sliceNumber);
                    indices[indicesIdx++] = (ushort)((stackNumber + 1) * (slices + 1) + sliceNumber);
                }
            }

            vbuf = Device.Current.CreateVertexBuffer(BufferUsage.StaticDraw, vertices);
            ibuf = Device.Current.CreateIndexBuffer(BufferUsage.StaticDraw, indices);

            return indicesIdx;
        }