示例#1
0
        private static EntityGeometry Tube(EntityData data, Texture2D propTexture)
        {
            var elementCount          = data.tubeResolution;
            ITextureDefintion texture = DefaultTextureDefinition.Instance;
            var wrapTexture           = data.wrapTexture;

            var textures = data.Textures;

            if (textures != null && textures.Length > 0)
            {
                if (wrapTexture)
                {
                    texture = new TextureTubeWrapper(textures[0], propTexture.Bounds, elementCount);
                }
                else
                {
                    texture = new TextureRectangle(textures[0], propTexture);
                }
            }

            var size = data.Size2;
            // /2 because it's radius, not diameter.
            var vertices = TubeComposer.Create(size.X / 2f, size.Y, elementCount, texture);

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

            return(geometry);
        }
示例#2
0
        private static EntityGeometry Billboard(EntityData data, Texture2D propTexture)
        {
            ITextureDefintion texture = DefaultTextureDefinition.Instance;
            var textures = data.Textures;

            if (textures != null && textures.Length > 0)
            {
                texture = new TextureRectangle(textures[0], propTexture);
            }

            var size     = data.Size2;
            var vertices = RectangleComposer.Create(1f, 1f, texture);

            VertexTransformer.Rotate(vertices, new Vector3(data.billboardTilt, 0, 0));
            VertexTransformer.Scale(vertices, new Vector3(size.X, size.Y, 1f));
            if (size.Y != 1f)
            {
                VertexTransformer.Offset(vertices, new Vector3(0, (size.Y - 1f) / 2f, 0));
            }

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

            return(geometry);
        }
示例#3
0
        private static EntityGeometry Plane(EntityData data, Texture2D propTexture)
        {
            var size = data.Size2;

            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);
                }
            }

            VertexPositionNormalTexture[] vertices;
            float[] heights;

            var floorOffset = -0.5f;

            if (data.elevation == null || data.elevation.Length < 4)
            {
                vertices = RectangleComposer.Create(size.X, size.Y, texture);
                VertexTransformer.Offset(vertices, new Vector3(0, floorOffset, 0));
                heights = new float[] { 0, 0, 0, 0 };
            }
            else
            {
                var halfWidth  = size.X / 2f;
                var halfHeight = size.Y / 2f;
                vertices = RectangleComposer.Create(new[]
                {
                    new Vector3(-halfWidth, data.elevation[0] + floorOffset, -halfHeight),
                    new Vector3(halfWidth, data.elevation[1] + floorOffset, -halfHeight),
                    new Vector3(-halfWidth, data.elevation[2] + floorOffset, halfHeight),
                    new Vector3(halfWidth, data.elevation[3] + floorOffset, halfHeight),
                }, texture);
                heights = new float[] { data.elevation[0], data.elevation[1], data.elevation[2], data.elevation[3] };
            }

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

            return(geometry);
        }
示例#4
0
 public Particle( Game game, Vector3 pos, Vector3 velocity, double lifetime, TextureRectangle rec )
 {
     this.game = game;
     Position = lastPos = nextPos = pos;
     Velocity = velocity;
     Lifetime = (float)lifetime;
     Rectangle = rec;
 }
示例#5
0
        private static EntityGeometry HouseInside(EntityData data, Texture2D propTexture)
        {
            ITextureDefintion texture = DefaultTextureDefinition.Instance;
            var textures = data.Textures;

            if (textures != null && textures.Length > 0)
            {
                texture = new TextureRectangle(textures[0], propTexture);
            }

            var size        = data.Size3;
            var allVertices = new List <VertexPositionNormalTexture>();

            // back
            {
                var vertices = RectangleComposer.Create(1f, 1f, texture);
                VertexTransformer.Scale(vertices, new Vector3(size.X, size.Y, 1f));
                VertexTransformer.Rotate(vertices, new Vector3(MathHelper.PiOver2, 0, 0));
                VertexTransformer.Offset(vertices, new Vector3(0, 0, -size.Z / 2f));
                allVertices.AddRange(vertices);
            }
            // left
            {
                var vertices = RectangleComposer.Create(1f, 1f, texture);
                VertexTransformer.Scale(vertices, new Vector3(size.Z, size.Y, 1f));
                VertexTransformer.Rotate(vertices, new Vector3(MathHelper.PiOver2, MathHelper.PiOver2, 0));
                VertexTransformer.Offset(vertices, new Vector3(-size.X / 2f, 0, 0));
                allVertices.AddRange(vertices);
            }
            // right
            {
                var vertices = RectangleComposer.Create(1f, 1f, texture);
                VertexTransformer.Scale(vertices, new Vector3(size.Z, size.Y, 1f));
                VertexTransformer.Rotate(vertices, new Vector3(MathHelper.PiOver2, -MathHelper.PiOver2, 0));
                VertexTransformer.Offset(vertices, new Vector3(size.X / 2f, 0, 0));
                allVertices.AddRange(vertices);
            }
            // floor
            {
                var vertices = RectangleComposer.Create(1f, 1f, texture);
                VertexTransformer.Scale(vertices, new Vector3(size.X, 1f, size.Z));
                VertexTransformer.Offset(vertices, new Vector3(0, -0.499f, 0)); // do not put 0.5 to not interfer with floors
                allVertices.AddRange(vertices);
            }

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

            return(geometry);
        }
示例#6
0
        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);
        }
示例#7
0
        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);
        }
示例#8
0
        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);
        }
示例#9
0
        void DrawZ( int z, int x1, int x2, int y1, int y2, int axisSize, FastColour col, ref VertexPos3fTex2fCol4b* vertices )
        {
            int endX = x2, endY = y2, startY = y1;
            for( ; x1 < endX; x1 += axisSize ) {
                x2 = x1 + axisSize;
                if( x2 > endX ) x2 = endX;
                y1 = startY;
                for( ; y1 < endY; y1 += axisSize ) {
                    y2 = y1 + axisSize;
                    if( y2 > endY ) y2 = endY;

                    TextureRectangle rec = new TextureRectangle( 0, 0, x2 - x1, y2 - y1 );
                    *vertices++ = new VertexPos3fTex2fCol4b( x1, y1, z, rec.U1, rec.V1, col );
                    *vertices++ = new VertexPos3fTex2fCol4b( x1, y2, z, rec.U1, rec.V2, col );
                    *vertices++ = new VertexPos3fTex2fCol4b( x2, y2, z, rec.U2, rec.V2, col );
                    *vertices++ = new VertexPos3fTex2fCol4b( x2, y1, z, rec.U2, rec.V1, col );
                }
            }
        }
示例#10
0
        void DrawY( int x1, int z1, int x2, int z2, int y, int axisSize, FastColour col, ref VertexPos3fTex2fCol4b* vertices )
        {
            int endX = x2, endZ = z2, startZ = z1;
            for( ; x1 < endX; x1 += axisSize ) {
                x2 = x1 + axisSize;
                if( x2 > endX ) x2 = endX;
                z1 = startZ;
                for( ; z1 < endZ; z1 += axisSize ) {
                    z2 = z1 + axisSize;
                    if( z2 > endZ ) z2 = endZ;

                    TextureRectangle rec = new TextureRectangle( 0, 0, x2 - x1, z2 - z1 );
                    *vertices++ = new VertexPos3fTex2fCol4b( x1, y, z1, rec.U1, rec.V1, col );
                    *vertices++ = new VertexPos3fTex2fCol4b( x1, y, z2, rec.U1, rec.V2, col );
                    *vertices++ = new VertexPos3fTex2fCol4b( x2, y, z2, rec.U2, rec.V2, col );
                    *vertices++ = new VertexPos3fTex2fCol4b( x2, y, z1, rec.U2, rec.V1, col );
                }
            }
        }
示例#11
0
        void DrawX( int x, int z1, int z2, int y1, int y2, int axisSize, FastColour col, ref VertexPos3fTex2fCol4b* vertices )
        {
            int endZ = z2, endY = y2, startY = y1;
            for( ; z1 < endZ; z1 += axisSize ) {
                z2 = z1 + axisSize;
                if( z2 > endZ ) z2 = endZ;
                y1 = startY;
                for( ; y1 < endY; y1 += axisSize ) {
                    y2 = y1 + axisSize;
                    if( y2 > endY ) y2 = endY;

                    TextureRectangle rec = new TextureRectangle( 0, 0, z2 - z1, y2 - y1 );
                    *vertices++ = new VertexPos3fTex2fCol4b( x, y1, z1, rec.U1, rec.V1, col );
                    *vertices++ = new VertexPos3fTex2fCol4b( x, y2, z1, rec.U1, rec.V2, col );
                    *vertices++ = new VertexPos3fTex2fCol4b( x, y2, z2, rec.U2, rec.V2, col );
                    *vertices++ = new VertexPos3fTex2fCol4b( x, y1, z2, rec.U2, rec.V1, col );
                }
            }
        }
示例#12
0
 public TerrainParticle( Game game, Vector3 pos, Vector3 velocity, double lifetime, TextureRectangle rec )
     : base(game, pos, velocity, lifetime, rec)
 {
 }
示例#13
0
 public Texture( int id, int x, int y, int width, int height, TextureRectangle rec )
     : this(id, x, y, width, height, rec.U1, rec.U2, rec.V1, rec.V2)
 {
 }