private static EntityGeometry Cube(EntityData data, Texture2D propTexture)
        {
            ITextureDefintion texture = DefaultTextureDefinition.Instance;
            var textures = data.Textures;

            if (textures != null)
            {
                if (textures.Length == 1)
                {
                    texture = new TextureRectangle(textures[0], propTexture);
                }
                else
                {
                    var cuboidTexture = new TextureCuboidWrapper();
                    for (var i = 0; i < 6; i++)
                    {
                        if (textures.Length > i)
                        {
                            cuboidTexture.AddSide((CuboidSide)(i + 1), new TextureRectangle(textures[i], propTexture));
                        }
                        else
                        {
                            cuboidTexture.AddSide((CuboidSide)(i + 1), DefaultTextureDefinition.Instance);
                        }
                    }
                    texture = cuboidTexture;
                }
            }

            var size = data.Size3;

            var geometry = new EntityGeometry
            {
                Vertices = CuboidComposer.Create(size.X, size.Y, size.Z, texture),
                Heights  = new[] { size.Y, size.Y, size.Y, size.Y },
                Size     = size
            };

            return(geometry);
        }
        private static EntityGeometry Wall(EntityData data, Texture2D propTexture)
        {
            var size = data.Size3;

            ITextureDefintion texture = DefaultTextureDefinition.Instance;
            var textures = data.Textures;

            if (textures != null && textures.Length > 0)
            {
                var rect = textures[0];
                if (data.tileTexture)
                {
                    rect.Width  = (int)(rect.Width * size.X);
                    rect.Height = (int)(rect.Height * size.Y);
                }
                texture = new TextureRectangle(rect, propTexture);
            }
            else
            {
                if (data.tileTexture)
                {
                    texture = new TextureRectangle(0, 0, size.X, size.Y);
                }
            }

            var vertices = RectangleComposer.Create(size.X, size.Y, texture);

            VertexTransformer.Rotate(vertices, new Vector3(MathHelper.PiOver2, 0, 0));
            VertexTransformer.Offset(vertices, new Vector3(0, 0, 0.5f));

            var geometry = new EntityGeometry
            {
                Vertices = vertices,
                Heights  = new[] { size.Y, size.Y, size.Y, size.Y },
                Size     = new Vector3(size.X, size.Y, size.Z)
            };

            return(geometry);
        }
Beispiel #3
0
 public static VertexPositionNormalTexture[] Create(float radius, float height, int edgeCount, int levels, ITextureDefintion textureDefinition)
 => Create(radius, height, edgeCount, levels, Repeat(textureDefinition, levels));
        private static EntityGeometry Walls(EntityData data, Texture2D propTexture)
        {
            var size = data.Size3;

            var textureDefs      = new ITextureDefintion[4];
            var textureDefsRects = new Rectangle[4];

            void setTexture(Rectangle rect, int dest)
            {
                if (data.tileTexture)
                {
                    if (dest % 2 == 1)
                    {
                        rect.Width = (int)(rect.Width * size.Z);
                    }
                    else
                    {
                        rect.Width = (int)(rect.Width * size.X);
                    }
                    rect.Height = (int)(rect.Height * size.Y);
                }
                textureDefs[dest]      = new TextureRectangle(rect, propTexture);
                textureDefsRects[dest] = rect;
            }

            var textures = data.Textures;

            if (textures != null && textures.Length > 0)
            {
                if (textures.Length < 4)
                {
                    for (var i = 0; i < 4; i++)
                    {
                        setTexture(textures[0], i);
                    }
                }
                else
                {
                    for (var i = 0; i < 4; i++)
                    {
                        setTexture(textures[i], i);
                    }
                }
            }
            else
            {
                for (var i = 0; i < 4; i++)
                {
                    setTexture(propTexture.Bounds, i);
                }
            }

            var texture = new TextureCuboidWrapper();

            texture.AddSide(CuboidSide.Front, textureDefs[0]);
            texture.AddSide(CuboidSide.Left, textureDefs[1]);
            texture.AddSide(CuboidSide.Back, textureDefs[2]);
            texture.AddSide(CuboidSide.Right, textureDefs[3]);

            var vertices = CuboidComposer.Create(size.X, size.Y, size.Z, texture).ToList();

            // remove top and bottom vertices:
            vertices.RemoveRange(0, 6);
            vertices.RemoveRange(vertices.Count - 6, 6);

            // remove sides with 0, 0 textures:
            // shift the right vertices to th end of the list
            var right = vertices.Skip(12).Take(6).ToArray();

            vertices.RemoveRange(12, 6);
            vertices.AddRange(right);

            var removedOffset = 0;

            for (var i = 0; i < 4; i++)
            {
                if (textureDefsRects[i].Width == 0 && textureDefsRects[i].Height == 0)
                {
                    vertices.RemoveRange(removedOffset, 6);
                }
                else
                {
                    removedOffset += 6;
                }
            }

            var geometry = new EntityGeometry
            {
                Vertices = vertices.ToArray(),
                Heights  = new[] { size.Y, size.Y, size.Y, size.Y },
                Size     = size
            };

            return(geometry);
        }
Beispiel #5
0
        public static VertexPositionNormalTexture[] Create(float radius, int edgeCount, ITextureDefintion textureDefinition)
        {
            var edgePoints = GetEdgePoints(radius, edgeCount);
            var vertices   = new List <VertexPositionNormalTexture>();
            var diameter   = radius * 2f;

            for (int i = 0; i < edgeCount; i++)
            {
                var edgePoint     = edgePoints[i];
                var nextEdgePoint = edgePoints[0];
                if (i != edgeCount - 1)
                {
                    nextEdgePoint = edgePoints[i + 1];
                }

                vertices.AddRange(new[] { edgePoint, nextEdgePoint, Vector2.Zero }
                                  .Select(v => new VertexPositionNormalTexture
                {
                    Normal            = new Vector3(0, 1, 0),
                    Position          = new Vector3(v.X, 0f, v.Y),
                    TextureCoordinate = textureDefinition.Transform(new Vector2((v.X + radius) / diameter, (v.Y + radius) / diameter))
                }));
            }

            return(vertices.ToArray());
        }
 public void AddSide(CuboidSide side, ITextureDefintion textureDefinition)
 {
     _definitions.Add(side, textureDefinition);
 }
        public static VertexPositionNormalTexture[] Create(float width, float height, ITextureDefintion textureDefinition)
        {
            var halfWidth  = width / 2f;
            var halfHeight = height / 2f;

            return(Create(new[]
            {
                new Vector3(-halfWidth, 0, -halfHeight),
                new Vector3(halfWidth, 0, -halfHeight),
                new Vector3(-halfWidth, 0, halfHeight),
                new Vector3(halfWidth, 0, halfHeight),
            }, textureDefinition));
        }
Beispiel #8
0
 public static VertexPositionNormalTexture[] Create(Vector3 p1, Vector3 p2, Vector3 p3, ITextureDefintion textureDefinition)
 => Create(new[] { p1, p2, p3 }, textureDefinition);
        public static VertexPositionNormalTexture[] Create(float radius, float height, int edgeCount, ITextureDefintion textureDefinition)
        {
            var edgePoints = CircleComposer.GetEdgePoints(radius, edgeCount);
            var vertices   = new List <VertexPositionNormalTexture>();
            var halfHeight = height / 2f;

            for (int i = 0; i < edgeCount; i++)
            {
                var edgePoint     = edgePoints[i];
                var nextEdgePoint = edgePoints[0];
                if (i != edgeCount - 1)
                {
                    nextEdgePoint = edgePoints[i + 1];
                }

                vertices.AddRange(RectangleComposer.Create(new[]
                {
                    new Vector3(-halfHeight, edgePoint.X, edgePoint.Y),
                    new Vector3(halfHeight, edgePoint.X, edgePoint.Y),
                    new Vector3(-halfHeight, nextEdgePoint.X, nextEdgePoint.Y),
                    new Vector3(halfHeight, nextEdgePoint.X, nextEdgePoint.Y),
                }, textureDefinition));

                textureDefinition.NextElement();
            }

            return(vertices.ToArray());
        }
        public static VertexPositionNormalTexture[] Create(Vector3[] edges, ITextureDefintion textureDefinition)
        {
            var tlb = edges[0];
            var tlf = edges[1];
            var trf = edges[2];
            var trb = edges[3];
            var blb = edges[4];
            var blf = edges[5];
            var brf = edges[6];
            var brb = edges[7];

            var vertices = new List <VertexPositionNormalTexture>();

            var front = RectangleComposer.Create(new[]
            {
                tlf,
                trf,
                blf,
                brf
            }, textureDefinition);

            textureDefinition.NextElement();
            var back = RectangleComposer.Create(new[]
            {
                trb,
                tlb,
                brb,
                blb
            }, textureDefinition);

            textureDefinition.NextElement();
            var left = RectangleComposer.Create(new[]
            {
                tlb,
                tlf,
                blb,
                blf
            }, textureDefinition);

            textureDefinition.NextElement();
            var right = RectangleComposer.Create(new[]
            {
                trb,
                trf,
                brb,
                brf
            }, textureDefinition);

            textureDefinition.NextElement();
            var top = RectangleComposer.Create(new[]
            {
                tlb,
                trb,
                tlf,
                trf
            }, textureDefinition);

            textureDefinition.NextElement();
            var bottom = RectangleComposer.Create(new[]
            {
                blb,
                brb,
                blf,
                brf
            }, textureDefinition);

            vertices.AddRange(top);
            vertices.AddRange(bottom);
            vertices.AddRange(left);
            vertices.AddRange(right);
            vertices.AddRange(front);
            vertices.AddRange(back);

            return(vertices.ToArray());
        }
        public static VertexPositionNormalTexture[] Create(float width, float height, float depth,
                                                           ITextureDefintion textureDefinition)
        {
            var vertices = new List <VertexPositionNormalTexture>();

            var halfWidth  = width / 2f;
            var halfHeight = height / 2f;
            var halfDepth  = depth / 2f;
            var front      = RectangleComposer.Create(new[]
            {
                new Vector3(halfWidth, halfHeight, -halfDepth),
                new Vector3(-halfWidth, halfHeight, -halfDepth),
                new Vector3(halfWidth, -halfHeight, -halfDepth),
                new Vector3(-halfWidth, -halfHeight, -halfDepth),
            }, textureDefinition);

            textureDefinition.NextElement();

            var back = RectangleComposer.Create(new[]
            {
                new Vector3(-halfWidth, halfHeight, halfDepth),
                new Vector3(halfWidth, halfHeight, halfDepth),
                new Vector3(-halfWidth, -halfHeight, halfDepth),
                new Vector3(halfWidth, -halfHeight, halfDepth),
            }, textureDefinition);

            textureDefinition.NextElement();

            var left = RectangleComposer.Create(new[]
            {
                new Vector3(-halfWidth, halfHeight, -halfDepth),
                new Vector3(-halfWidth, halfHeight, halfDepth),
                new Vector3(-halfWidth, -halfHeight, -halfDepth),
                new Vector3(-halfWidth, -halfHeight, halfDepth),
            }, textureDefinition);

            textureDefinition.NextElement();

            var right = RectangleComposer.Create(new[]
            {
                new Vector3(halfWidth, halfHeight, halfDepth),
                new Vector3(halfWidth, halfHeight, -halfDepth),
                new Vector3(halfWidth, -halfHeight, halfDepth),
                new Vector3(halfWidth, -halfHeight, -halfDepth),
            }, textureDefinition);

            textureDefinition.NextElement();

            var bottom = RectangleComposer.Create(new[]
            {
                new Vector3(-halfWidth, -halfHeight, halfDepth),
                new Vector3(halfWidth, -halfHeight, halfDepth),
                new Vector3(-halfWidth, -halfHeight, -halfDepth),
                new Vector3(halfWidth, -halfHeight, -halfDepth),
            }, textureDefinition);

            textureDefinition.NextElement();

            var top = RectangleComposer.Create(new[]
            {
                new Vector3(-halfWidth, halfHeight, -halfDepth),
                new Vector3(halfWidth, halfHeight, -halfDepth),
                new Vector3(-halfWidth, halfHeight, halfDepth),
                new Vector3(halfWidth, halfHeight, halfDepth),
            }, textureDefinition);

            vertices.AddRange(front);
            vertices.AddRange(back);
            vertices.AddRange(right);
            vertices.AddRange(left);
            vertices.AddRange(top);
            vertices.AddRange(bottom);

            return(vertices.ToArray());
        }
 public static VertexPositionNormalTexture[] Create(float length, ITextureDefintion textureDefinition)
 => Create(length, length, length, textureDefinition);
Beispiel #13
0
        public static VertexPositionNormalTexture[] Create(float radius, float height, int edgeCount,
                                                           ITextureDefintion sideTexture, ITextureDefintion endTexture1, ITextureDefintion endTexture2)
        {
            var vertices = new List <VertexPositionNormalTexture>();

            var sides = TubeComposer.Create(radius, height, edgeCount, sideTexture);
            var end1  = CircleComposer.Create(radius, edgeCount, endTexture1);
            var end2  = CircleComposer.Create(radius, edgeCount, endTexture2);

            VertexTransformer.Rotate(end1, new Vector3(0, 0, -MathHelper.PiOver2));
            VertexTransformer.Offset(end1, new Vector3(height / 2f, 0, 0));
            VertexTransformer.Rotate(end2, new Vector3(0, 0, MathHelper.PiOver2));
            VertexTransformer.Offset(end2, new Vector3(-height / 2f, 0, 0));

            vertices.AddRange(sides);
            vertices.AddRange(end1);
            vertices.AddRange(end2);

            return(vertices.ToArray());
        }
Beispiel #14
0
 public static VertexPositionNormalTexture[] Create(float radius, float height, int edgeCount,
                                                    ITextureDefintion sideTexture, ITextureDefintion endTexture)
 => Create(radius, height, edgeCount, sideTexture, endTexture, endTexture);