public RectangleInt2 TransformRect(RectangleInt2 area, VectorInt2 oldSize) { VectorInt2 first = Transform(area.Start, oldSize); VectorInt2 second = Transform(area.End, oldSize); return(new RectangleInt2(VectorInt2.Min(first, second), VectorInt2.Max(first, second))); }
private static TextureArea[] ConvertTrLevelTexturesToWadTexture(TrLevel oldLevel) { var objectTextures = new TextureArea[oldLevel.ObjectTextures.Count]; ImageC tiles = ImageC.FromByteArray(oldLevel.TextureMap32, 256, oldLevel.TextureMap32.Length / 1024); tiles.ReplaceColor(new ColorC(255, 0, 255, 255), new ColorC(0, 0, 0, 0)); // for (int i = 0; i < oldLevel.ObjectTextures.Count; ++i) Parallel.For(0, oldLevel.ObjectTextures.Count, i => { var oldTexture = oldLevel.ObjectTextures[i]; int textureTileIndex = oldTexture.TileAndFlags & 0x7fff; bool isTriangle = (oldTexture.TileAndFlags & 0x8000) != 0; // Exists only in TR4+ if (oldLevel.Version == TRVersion.Game.TR1 || oldLevel.Version == TRVersion.Game.TR2 || oldLevel.Version == TRVersion.Game.TR3) { isTriangle = (oldTexture.Vertices[3].X == 0) && (oldTexture.Vertices[3].Y == 0); } // Calculate UV coordinates... Vector2[] coords = new Vector2[isTriangle ? 3 : 4]; for (int j = 0; j < coords.Length; ++j) { coords[j] = new Vector2(oldTexture.Vertices[j].X, oldTexture.Vertices[j].Y) * (1.0f / 256.0f); } // Find the corners of the texture Vector2 min = coords[0], max = coords[0]; for (int j = 1; j < coords.Length; ++j) { min = Vector2.Min(min, coords[j]); max = Vector2.Max(max, coords[j]); } VectorInt2 start = VectorInt2.FromFloor(min); VectorInt2 end = VectorInt2.FromCeiling(max); start = VectorInt2.Min(VectorInt2.Max(start, new VectorInt2()), new VectorInt2(256, 256)); end = VectorInt2.Min(VectorInt2.Max(end, new VectorInt2()), new VectorInt2(256, 256)); // Create image ImageC image = ImageC.CreateNew(end.X - start.X, end.Y - start.Y); image.CopyFrom(0, 0, tiles, start.X, start.Y + textureTileIndex * 256, end.X - start.X, end.Y - start.Y); // Replace black with transparent color //image.ReplaceColor(new ColorC(0, 0, 0, 255), new ColorC(0, 0, 0, 0)); WadTexture texture = new WadTexture(image); // Create texture area TextureArea textureArea = new TextureArea(); textureArea.DoubleSided = false; textureArea.BlendMode = (BlendMode)(oldTexture.Attributes); textureArea.TexCoord0 = coords[0] - start; textureArea.TexCoord1 = coords[1] - start; textureArea.TexCoord2 = coords[2] - start; textureArea.TexCoord3 = isTriangle ? textureArea.TexCoord2 : (coords[3] - start); textureArea.Texture = texture; objectTextures[i] = textureArea; }); return(objectTextures); }