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); }
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); }
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); }
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; }
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); }
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); }
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); }
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 ); } } }
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 ); } } }
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 ); } } }
public TerrainParticle( Game game, Vector3 pos, Vector3 velocity, double lifetime, TextureRectangle rec ) : base(game, pos, velocity, lifetime, rec) { }
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) { }