Exemplo n.º 1
0
 public ConnectionDrawer(Device device, int connectionNum)
 {
     this.device = device;
     t           = Texture.FromFile(device, "img\\default\\connectpic.png");
     r           = new Random();
     connects    = new List <ColoredTexturedVertex[]>(connectionNum);
     copy        = new ColoredTexturedVertex[splitNumber];
     for (int i = 0; i < connectionNum; i++)
     {
         connects.Add(new ColoredTexturedVertex[splitNumber]);
         for (int j = 0; j < splitNumber; j++)
         {
             float alpha = 1f - Math.Abs(j - splitNumber / 2) / ((float)splitNumber / 2);
             int   color = new Color4(alpha, 1, 1, 1).ToArgb();
             int   x     = -400 + 8 * j;
             int   zure  = r.Next(-diff, diff + 1);
             connects[i][j] = new ColoredTexturedVertex(
                 new Vector3(x, -width / 2 + zure, 0.5f),
                 color,
                 new Vector2(0, 0)
                 );
             j++;
             connects[i][j] = new ColoredTexturedVertex(
                 new Vector3(x, width / 2 + zure, 0.5f),
                 color,
                 new Vector2(0, 1)
                 );
         }
     }
     Matrix = Matrix.Transformation2D(Vector2.Zero, 0, new Vector2(1, 1), Vector2.Zero, 0, new Vector2(400, 225));
 }
Exemplo n.º 2
0
        private void drawgage()
        {
            int   num   = circlepoints.Length / 2;
            float ratio = (lasttime - this.time) / length;

            if (ratio >= 1)
            {
                ratio = 1;
            }
            int displaynum = (int)(num * ratio);

            if (displaynum == 0)
            {
                return;
            }
            ColoredTexturedVertex[] fwv = new ColoredTexturedVertex[displaynum * 2];
            for (int i = 0; i < displaynum; i++)
            {
                fwv[i * 2].Position     = new Vector3(x + circlepoints[i * 2].X, y + circlepoints[i * 2].Y, 0.5f);
                fwv[i * 2].Color        = new Color4(alpha, 1, 1, 1).ToArgb();
                fwv[i * 2 + 1].Position = new Vector3(x + circlepoints[i * 2 + 1].X, y + circlepoints[i * 2 + 1].Y, 0.5f);
                fwv[i * 2 + 1].Color    = new Color4(alpha, 1, 1, 1).ToArgb();
            }
            Texture t = trace.Texture;

            device.SetTexture(0, t);
            device.VertexFormat = ColoredTexturedVertex.Format; // 頂点フォーマットを設定
            // レンダーステート 深度バッファ無効
            //device.SetRenderState(RenderState.ZEnable, false);
            // レンダーステート カリングなし
            //device.SetRenderState(RenderState.CullMode,Cull.None);
            device.DrawUserPrimitives(PrimitiveType.TriangleStrip, 0, displaynum * 2 - 2, fwv);
            //device.SetRenderState(RenderState.CullMode, Cull.Clockwise);
        }
Exemplo n.º 3
0
 protected override void UpdateImpl()
 {
     if (lineChanged)
     {
         lineChanged = false;
         var lineWidth2 = lineWidth / 2;
         if (points != null && points.Length >= 2 && vertices != null)
         {
             ColoredTexturedVertex[] writeVertices = new ColoredTexturedVertex[points.Length * 2];
             for (var i = 0; i < points.Length - 1; i++)
             {
                 Vector2 nextDirection = (points[i + 1] - points[i]);
                 nextDirection.Normalize();
                 var nextDirectionNormal = new Vector2(-nextDirection.Y, nextDirection.X);
                 if (i == 0)
                 {
                     writeVertices[2 * i]     = new ColoredTexturedVertex(new Vector3(points[i] + nextDirectionNormal * lineWidth2, 0.5f));
                     writeVertices[2 * i + 1] = new ColoredTexturedVertex(new Vector3(points[i] - nextDirectionNormal * lineWidth2, 0.5f));
                 }
                 else
                 {
                     var vec        = new Vector2(writeVertices[2 * i].Position.X - points[i].X, writeVertices[2 * i].Position.Y - points[i].Y);
                     var normalized = Vector2.Normalize(vec);
                     var normal     = new Vector2(-normalized.Y, normalized.X);
                     var newPos     = Solve(vec, normal, nextDirectionNormal * lineWidth2, nextDirection);
                     writeVertices[2 * i]     = new ColoredTexturedVertex(new Vector3(points[i] + newPos, 0.5f));
                     writeVertices[2 * i + 1] = new ColoredTexturedVertex(new Vector3(points[i] - newPos, 0.5f));
                 }
                 writeVertices[2 * i + 2] = new ColoredTexturedVertex(new Vector3(points[i + 1] + nextDirectionNormal * lineWidth2, 0.5f));
                 writeVertices[2 * i + 3] = new ColoredTexturedVertex(new Vector3(points[i + 1] - nextDirectionNormal * lineWidth2, 0.5f));
             }
             vertices.Write(writeVertices);
         }
     }
 }
Exemplo n.º 4
0
        private void DrawGage()
        {
            var   alpha = 0.7f;
            int   num   = circlepoints.Length / 2;
            float ratio = (lasttime - this.Time) / Length;

            if (ratio >= 1)
            {
                ratio = 1;
            }
            var displaynum = (int)(num * ratio);

            if (displaynum == 0)
            {
                return;
            }
            ColoredTexturedVertex[] fwv = new ColoredTexturedVertex[displaynum * 2];
            for (int i = 0; i < displaynum; i++)
            {
                fwv[i * 2].Position           = new Vector3(x + circlepoints[i * 2].X, y + circlepoints[i * 2].Y, 0.5f);
                fwv[i * 2].TextureCoordinates = new Vector2(1.0f, 0.5f);
                fwv[i * 2].Color                  = new Color4(alpha, 1, 1, 1).ToBgra();
                fwv[i * 2 + 1].Position           = new Vector3(x + circlepoints[i * 2 + 1].X, y + circlepoints[i * 2 + 1].Y, 0.5f);
                fwv[i * 2 + 1].TextureCoordinates = new Vector2(1.0f, 0.5f);
                fwv[i * 2 + 1].Color              = new Color4(alpha, 1, 1, 1).ToBgra();
            }
            var t = trace.ImageResource.Texture;
        }
Exemplo n.º 5
0
            public Circle(PPDDevice device, PPDFramework.Resource.ResourceManager resourceManager) : base(device)
            {
                loadCircleImageResource = resourceManager.GetResource <ImageResourceBase>(Utility.Path.Combine("logo", "circle.png"));

                loadCircleImageVertex    = device.GetModule <ShaderCommon>().CreateVertex(362);
                invLoadCircleImageVertex = device.GetModule <ShaderCommon>().CreateVertex(362);
                var tempLoadCircleVertices    = new ColoredTexturedVertex[362];
                var tempInvLoadCircleVertices = new ColoredTexturedVertex[362];

                for (var i = 0; i < tempLoadCircleVertices.Length; i++)
                {
                    tempLoadCircleVertices[i]    = new ColoredTexturedVertex(Vector3.Zero);
                    tempInvLoadCircleVertices[i] = new ColoredTexturedVertex(Vector3.Zero);
                }
                tempLoadCircleVertices[0].Position           = new Vector3(400, 225, 0.5f);
                tempLoadCircleVertices[0].TextureCoordinates = loadCircleImageResource.GetActualUV(new Vector2(0.5f));
                for (int i = 1; i < tempLoadCircleVertices.Length; i++)
                {
                    var rad = (float)((i - 1) * Math.PI / 180);
                    var uv  = new Vector2((float)Math.Sin(rad), -(float)Math.Cos(rad));
                    tempLoadCircleVertices[i].Position = new Vector3(
                        400 + loadCircleImageResource.Width / 2 * uv.X,
                        225 + loadCircleImageResource.Height / 2 * uv.Y,
                        0.5f);
                    tempLoadCircleVertices[i].TextureCoordinates = loadCircleImageResource.GetActualUV((uv / 2 + new Vector2(0.5f)));
                }

                Array.Copy(tempLoadCircleVertices, 1, tempInvLoadCircleVertices, 0, 361);
                Array.Reverse(tempInvLoadCircleVertices, 0, tempInvLoadCircleVertices.Length);
                tempInvLoadCircleVertices[0] = tempLoadCircleVertices[0];
                loadCircleImageVertex.Write(tempLoadCircleVertices);
                invLoadCircleImageVertex.Write(tempInvLoadCircleVertices);
            }
        public override void Setup()
        {
            var data = new ColoredTexturedVertex[]
            {
                new ColoredTexturedVertex(new Vector3(0.5f, 0.5f, 0.0f), Color4.AliceBlue, new Vector2(1.0f, 1.0f)),       //Top right
                new ColoredTexturedVertex(new Vector3(0.5f, -0.5f, 0.0f), Color4.BlanchedAlmond, new Vector2(1.0f, 0.0f)), //Bottom right
                new ColoredTexturedVertex(new Vector3(-0.5f, -0.5f, 0.0f), Color4.Fuchsia, new Vector2(0.0f, 0.0f)),       //Bottom left
                new ColoredTexturedVertex(new Vector3(-0.5f, 0.5f, 0.0f), Color4.Aqua, new Vector2(0.0f, 1.0f))            //Top left
            };
            var indices = new[]
            {
                0, 1, 3,
                1, 2, 3
            };
            var textureContainer = Texture.LoadTexture("./Assets/Textures/container.png");
            var textureFace      = Texture.LoadTexture("./Assets/Textures/awesomeface.png");
            var vertexAttributes = new [] {
                new VertexAttribute("aPosition", 3, VertexAttribPointerType.Float, ColoredTexturedVertex.Size, 0),
                new VertexAttribute("aColor", 4, VertexAttribPointerType.Float, ColoredTexturedVertex.Size, sizeof(float) * 3),
                new VertexAttribute("aTexCoord", 2, VertexAttribPointerType.Float, ColoredTexturedVertex.Size, sizeof(float) * 7)
            };
            var shaderProgram = ShaderProgram.CreateShaderProgram("./Assets/Shaders/shader.vert", "./Assets/Shaders/shader.frag", vertexAttributes);

            _model = Model.CreateModel(data, new  [] { textureContainer, textureFace }, indices, shaderProgram);
            shaderProgram.SetInt("texture0", 0);
            shaderProgram.SetInt("texture1", 1);
            base.Setup();
        }
Exemplo n.º 7
0
            public void Transform()
            {
                var temp = new ColoredTexturedVertex[Count];

                for (var i = 0; i < Count; i++)
                {
                    temp[i]          = Vertices[i + Offset];
                    temp[i].Position = Vector3.TransformCoordinate(temp[i].Position, Matrix);
                    var newColor = new ColorBGRA(temp[i].Color);
                    newColor.A    = (byte)(newColor.A * Alpha);
                    temp[i].Color = newColor.ToBgra();
                }
                Vertices = temp;
            }
Exemplo n.º 8
0
        private int UpdateVerticesImpl(VertexInfo vertices, int verticesCount, Vector2[] pos)
        {
            ColoredTexturedVertex[] dataVertices = new ColoredTexturedVertex[verticesCount * 2];
            if (verticesCount < 2)
            {
                return(0);
            }
            Vector2 v, vD;
            var     vN1               = Vector2.Zero;
            var     vN2               = Vector2.Zero;
            float   width             = 2f;
            float   alpha             = 0f;
            var     drawVerticesCount = 0;

            for (var i = 0; i < verticesCount; i++)
            {
                if (i < (verticesCount - 1))
                {
                    v.X = pos[i + 1].X - pos[i].X;
                    v.Y = pos[i + 1].Y - pos[i].Y;

                    if (v.X == 0 && v.Y == 0)
                    {
                        continue;
                    }

                    vD    = Vector2.Normalize(v);
                    vD   *= width;
                    vN1.X = -vD.Y;
                    vN1.Y = vD.X;
                    vN2.X = vD.Y;
                    vN2.Y = -vD.X;
                }

                var color = PPDColors.White.ToBgra();
                dataVertices[drawVerticesCount].Position           = new Vector3(pos[i].X + vN1.X, pos[i].Y + vN1.Y, 0.5f);
                dataVertices[drawVerticesCount].TextureCoordinates = trace.ImageResource.GetActualUV(new Vector2(alpha, 0)) + trace.ImageResource.HalfPixel;
                dataVertices[drawVerticesCount].Color = color;
                drawVerticesCount++;
                dataVertices[drawVerticesCount].Position           = new Vector3(pos[i].X + vN2.X, pos[i].Y + vN2.Y, 0.5f);
                dataVertices[drawVerticesCount].TextureCoordinates = trace.ImageResource.GetActualUV(new Vector2(alpha, 1)) - new Vector2(-trace.ImageResource.HalfPixel.X, trace.ImageResource.HalfPixel.Y);
                dataVertices[drawVerticesCount].Color = color;
                drawVerticesCount++;
                alpha = 0.70f * (i + 1) / 40f;
            }
            vertices.Write(dataVertices, drawVerticesCount, 0);
            return(drawVerticesCount);
        }
Exemplo n.º 9
0
        public NormalExMarkGage(PPDDevice device, PictureObject trace, Vector2[] circlePoints) : base(device)
        {
            this.trace = trace;
            vertices   = device.GetModule <ShaderCommon>().CreateVertex(circlePoints.Length);
            ColoredTexturedVertex[] dataVertices = new ColoredTexturedVertex[circlePoints.Length];
            var uv    = trace.ImageResource.GetActualUV(new Vector2(alpha, 0.5f)) + trace.ImageResource.HalfPixel;
            var color = PPDColors.White.ToBgra();

            for (int i = 0; i < dataVertices.Length; i++)
            {
                dataVertices[i].Position           = new Vector3(circlePoints[i].X, circlePoints[i].Y, 0.5f);
                dataVertices[i].TextureCoordinates = uv;
                dataVertices[i].Color = color;
            }
            vertices.Write(dataVertices);
        }
Exemplo n.º 10
0
        public override void Setup()
        {
            var data = new ColoredTexturedVertex[]
            {
                new ColoredTexturedVertex(new Vector3(0.5f, 0.5f, 0.0f), Color4.AliceBlue, new Vector2(1.0f, 1.0f)),       //Top right
                new ColoredTexturedVertex(new Vector3(0.5f, -0.5f, 0.0f), Color4.BlanchedAlmond, new Vector2(1.0f, 0.0f)), //Bottom right
                new ColoredTexturedVertex(new Vector3(-0.5f, -0.5f, 0.0f), Color4.Fuchsia, new Vector2(0.0f, 0.0f)),       //Bottom left
                new ColoredTexturedVertex(new Vector3(-0.5f, 0.5f, 0.0f), Color4.Aqua, new Vector2(0.0f, 1.0f))            //Top left
            };
            var indices = new[]
            {
                0, 1, 3,
                1, 2, 3
            };
            var texture = Texture.LoadTexture("./Assets/Resources/container.png");

            _model = Model.CreateModel(texture, data, indices);
            base.Setup();
        }
Exemplo n.º 11
0
        public override void Setup()
        {
            GL.Enable(EnableCap.DepthTest);
            GL.ClearColor(0.4f, 0.7f, 0.9f, 0.5f);

            var vertices = new ColoredTexturedVertex[] {
                new ColoredTexturedVertex(new Vector3(0.5f, 0.5f, 0.0f), Color4.Blue, new Vector2(1.0f, 1.0f)),
                new ColoredTexturedVertex(new Vector3(0.5f, -0.5f, 0.0f), Color4.Green, new Vector2(1.0f, 0.0f)),
                new ColoredTexturedVertex(new Vector3(-0.5f, -0.5f, 0.0f), Color4.Red, new Vector2(0.0f, 0.0f)),
                new ColoredTexturedVertex(new Vector3(-0.5f, 0.5f, 0.0f), Color4.Yellow, new Vector2(0.0f, 1.0f))
            };
            var indices = new int [] {
                0, 1, 3,
                1, 2, 3
            };
            var vao = VertexArray.CreateVertexArray();

            vao.Bind();
            _vao = vao;
            var vbo = VertexBuffer.CreateVertexBuffer();

            vbo.LoadData(vertices);
            _vbo = vbo;
            var ebo = ElementBuffer.CreateElementBuffer();

            ebo.LoadData(indices);
            _ebo = ebo;
            var shader = ShaderProgramFactory.CreateDefault3DShaderProgramWithTexture();

            _shader = shader;
            var texture0 = Texture.LoadTexture("Assets/Textures/container.png");

            texture0.Bind(0);
            var texture1 = Texture.LoadTexture("Assets/Textures/awesomeface.png");

            texture1.Bind(1);
            _shader.SetInt("texture1", 0);
            _shader.SetInt("texture2", 1);
            base.Setup();
        }
Exemplo n.º 12
0
        public MarkConnectionCommon(PPDDevice device, PPDFramework.Resource.ResourceManager resourceManager) : base(device)
        {
            var path = Utility.Path.Combine("connectpic.png");

            ImageResource     = resourceManager.GetResource <ImageResourceBase>(path);
            ActualUVRectangle = ImageResource.GetActualUVRectangle(0, 0, 1, 1);
            r        = new Random();
            Connects = new ColoredTexturedVertex[ConnectionCount][];
            for (int i = 0; i < ConnectionCount; i++)
            {
                Connects[i] = new ColoredTexturedVertex[SplitCount];
                for (int j = 0; j < SplitCount; j++)
                {
                    int x = -MaxWidth / 2 + MaxWidth / SplitCount * j;
                    Connects[i][j] = new ColoredTexturedVertex(new Vector3(x, 0, 0.5f));
                    j++;
                    Connects[i][j] = new ColoredTexturedVertex(new Vector3(x, 0, 0.5f));
                }
            }
            for (int i = 0; i < SplitCount + BaseScale; i++)
            {
                UpdateImpl();
            }
        }
Exemplo n.º 13
0
        protected void drawtrace(Vector2[] pos)
        {
            int     i, MAX_PLV = 80;                                          // ループカウンタ
            Vector2 v, vD, vN1, vN2;                                          // 計算用のベクタ

            ColoredTexturedVertex[] fwv = new ColoredTexturedVertex[MAX_PLV]; // 頂点データの配列
            int   nFWVCount             = 0;                                  // 描画する頂点の数。初期値は0
            int   k     = 0;                                                  // 書き込み対象の配列インデックス
            float width = 2f;
            float alpha = 0f;

            vN1 = new Vector2(0, 0);
            vN2 = new Vector2(0, 0);
            // 頂点の数が2より小さい場合は描画できない。FALSEを返して終了
            if (iVerticesCount < 2)
            {
                return;
            }
            for (i = 0; i < iVerticesCount; i++)
            {
                // 最後の頂点以外の場合
                if (i < (iVerticesCount - 1))
                {
                    // 現在の頂点から次の頂点を指すベクトルをvとする
                    v.X = pos[i + 1].X - pos[i].X;
                    v.Y = pos[i + 1].Y - pos[i].Y;

                    if (v.X == 0 && v.Y == 0)
                    {
                        continue;
                    }
                    // ベクトルvを正規化したものをベクトルvDとする
                    vD = Vector2.Normalize(v);

                    // vDに幅widthをかける
                    vD *= width;

                    // ベクトルvDを-90度回転させたものをベクトルvN1とする
                    vN1.X = vD.Y;
                    vN1.Y = -vD.X;

                    // ベクトルvDを90度回転させたものをベクトルvN2とする
                    vN2.X = -vD.Y;
                    vN2.Y = vD.X;
                }



                // 位置を設定
                fwv[k].Position = new Vector3(pos[i].X + vN1.X, pos[i].Y + vN1.Y, 0.5f);
                fwv[k].Color    = new Color4(alpha, 1, 1, 1).ToArgb();



                ++k; // 配列インデックスをひとつインクリメント

                // 位置を設定
                fwv[k].Position = new Vector3(pos[i].X + vN2.X, pos[i].Y + vN2.Y, 0.5f);
                fwv[k].Color    = new Color4(alpha, 1, 1, 1).ToArgb();

                k++;

                nFWVCount += 2;    // 描画する頂点の数が2つ増加
                width      = 2f + 0.5f * (i + 1) / 40f;
                alpha      = 0.95f * (i + 1) / 40f;
            }
            Texture t = trace.Texture;

            device.SetTexture(0, t);
            device.VertexFormat = ColoredTexturedVertex.Format; // 頂点フォーマットを設定
            // レンダーステート 深度バッファ無効
            //device.SetRenderState(RenderState.ZEnable, false);
            // レンダーステート カリングなし
            //device.SetRenderState(RenderState.CullMode,Cull.None);
            Array.Resize(ref fwv, nFWVCount);
            device.DrawUserPrimitives(PrimitiveType.TriangleStrip, 0, nFWVCount - 2, fwv);
            //device.SetRenderState(RenderState.CullMode, Cull.Clockwise);
        }
Exemplo n.º 14
0
 public ColoredVertex(ColoredTexturedVertex vertex)
 {
     Position = vertex.Position;
     Color    = vertex.Color;
 }
Exemplo n.º 15
0
 public Vertex(ColoredTexturedVertex vertex)
 {
     Position = vertex.Position;
     Normal   = Vector3.UnitY;
 }
Exemplo n.º 16
0
 public Vertex(ColoredTexturedVertex vertex)
 {
     Position = vertex.Position;
 }
Exemplo n.º 17
0
        public static Mesh LoadMesh(Device device, string path)
        {
            var loader = new WavefrontObjLoader();

            loader.LoadObj(path);

            //if (positionTransform.HasValue)
            //{
            //    Matrix3 transform = positionTransform.Value;
            //    for (int j = 0; j < loader.VertexList.Count; j++)
            //    {
            //        loader.VertexList[j].Vector = Matrix3.Transform(loader.VertexList[j].Vector, transform);
            //    }
            //}

            // vertex buffer
            var vertexCount = loader.TriangleCount * 3;
            var vertices    = new ColoredTexturedVertex[vertexCount];

            int i = 0;

            foreach (var face in loader.FaceList)
            {
                var v = face.VertexIndexList;
                var n = face.NormalVertexIndexList;
                var t = face.TextureVertexIndexList;

                vertices[i + 0] = new ColoredTexturedVertex {
                    Position = loader.VertexList[v[0] - 1].Vector, Normal = loader.NormalList[n[0] - 1].Vector, Color = new Vector4(1, 1, 1, 1), Texture = loader.TextureList[t[0] - 1].Vector
                };
                vertices[i + 1] = new ColoredTexturedVertex {
                    Position = loader.VertexList[v[1] - 1].Vector, Normal = loader.NormalList[n[1] - 1].Vector, Color = new Vector4(1, 1, 1, 1), Texture = loader.TextureList[t[1] - 1].Vector
                };
                vertices[i + 2] = new ColoredTexturedVertex {
                    Position = loader.VertexList[v[2] - 1].Vector, Normal = loader.NormalList[n[2] - 1].Vector, Color = new Vector4(1, 1, 1, 1), Texture = loader.TextureList[t[2] - 1].Vector
                };

                i += 3;

                if (v.Length == 4)
                {
                    vertices[i + 0] = new ColoredTexturedVertex {
                        Position = loader.VertexList[v[2] - 1].Vector, Normal = loader.NormalList[n[2] - 1].Vector, Color = new Vector4(1, 1, 1, 1), Texture = loader.TextureList[t[2] - 1].Vector
                    };
                    vertices[i + 1] = new ColoredTexturedVertex {
                        Position = loader.VertexList[v[3] - 1].Vector, Normal = loader.NormalList[n[3] - 1].Vector, Color = new Vector4(1, 1, 1, 1), Texture = loader.TextureList[t[3] - 1].Vector
                    };
                    vertices[i + 2] = new ColoredTexturedVertex {
                        Position = loader.VertexList[v[0] - 1].Vector, Normal = loader.NormalList[n[0] - 1].Vector, Color = new Vector4(1, 1, 1, 1), Texture = loader.TextureList[t[0] - 1].Vector
                    };

                    i += 3;
                }
            }

            var indices = new int[vertexCount];

            for (int j = 0; j < vertexCount; j++)
            {
                indices[j] = j;
            }


            Mesh mesh = new Mesh(device);

            mesh.VertexBuffer = Buffer11.Create <ColoredTexturedVertex>(device.NativeDevice, BindFlags.VertexBuffer, vertices.ToArray());
            mesh.IndexBuffer  = Buffer11.Create(device.NativeDevice, BindFlags.IndexBuffer, indices.ToArray());
            mesh.VertexSize   = Utilities.SizeOf <ColoredTexturedVertex>();

            mesh.IndexCount = indices.Count();

            return(mesh);
        }
Exemplo n.º 18
0
        public static Mesh CreateSphere(Device device)
        {
            float diameter     = 30;
            int   tessellation = 10;

            if (tessellation < 3)
            {
                throw new ArgumentOutOfRangeException("tessellation", "Must be >= 3");
            }

            int verticalSegments   = tessellation;
            int horizontalSegments = tessellation * 2;

            var vertices = new ColoredTexturedVertex[(verticalSegments + 1) * (horizontalSegments + 1)];
            var indices  = new int[(verticalSegments) * (horizontalSegments + 1) * 6];

            float radius = diameter / 2;

            int vertexCount = 0;

            // Create rings of vertices at progressively higher latitudes.
            for (int i = 0; i <= verticalSegments; i++)
            {
                float v = 1.0f - (float)i / verticalSegments;

                var latitude = (float)((i * Math.PI / verticalSegments) - Math.PI / 2.0);
                var dy       = (float)Math.Sin(latitude);
                var dxz      = (float)Math.Cos(latitude);

                // Create a single ring of vertices at this latitude.
                for (int j = 0; j <= horizontalSegments; j++)
                {
                    float u = (float)j / horizontalSegments;

                    var longitude = (float)(j * 2.0 * Math.PI / horizontalSegments);
                    var dx        = (float)Math.Sin(longitude);
                    var dz        = (float)Math.Cos(longitude);

                    dx *= dxz;
                    dz *= dxz;

                    var normal            = new Vector3(dx, dy, dz);
                    var textureCoordinate = new Vector2(u, v);

                    vertices[vertexCount++] = new ColoredTexturedVertex(normal * radius, normal, Vector4.One, textureCoordinate);
                }
            }

            // Fill the index buffer with triangles joining each pair of latitude rings.
            int stride = horizontalSegments + 1;

            int indexCount = 0;

            for (int i = 0; i < verticalSegments; i++)
            {
                for (int j = 0; j <= horizontalSegments; j++)
                {
                    int nextI = i + 1;
                    int nextJ = (j + 1) % stride;

                    //indices[indexCount++] = (i * stride + j);
                    //indices[indexCount++] = (nextI * stride + j);
                    //indices[indexCount++] = (i * stride + nextJ);

                    //indices[indexCount++] = (i * stride + nextJ);
                    //indices[indexCount++] = (nextI * stride + j);
                    //indices[indexCount++] = (nextI * stride + nextJ);
                    indices[indexCount++] = (i * stride + j);
                    indices[indexCount++] = (i * stride + nextJ);
                    indices[indexCount++] = (nextI * stride + j);

                    indices[indexCount++] = (nextI * stride + j);
                    indices[indexCount++] = (i * stride + nextJ);
                    indices[indexCount++] = (nextI * stride + nextJ);
                }
            }

            Mesh mesh = new Mesh(device);

            mesh.VertexBuffer = Buffer11.Create <ColoredTexturedVertex>(device.NativeDevice, BindFlags.VertexBuffer, vertices.ToArray());
            mesh.IndexBuffer  = Buffer11.Create(device.NativeDevice, BindFlags.IndexBuffer, indices.ToArray());
            mesh.VertexSize   = Utilities.SizeOf <ColoredTexturedVertex>();

            mesh.IndexCount = indices.Count();

            return(mesh);
        }