internal static void ConvertTr4Sprites(Wad2 wad, Tr4Wad oldWad) { int spriteDataSize = oldWad.SpriteData.Length; // Load the real sprite texture data int numSpriteTexturePages = spriteDataSize / 196608; if ((spriteDataSize % 196608) != 0) { numSpriteTexturePages++; } foreach (var oldSequence in oldWad.SpriteSequences) { int lengthOfSequence = -oldSequence.NegativeLength; int startIndex = oldSequence.Offset; var newSequence = new WadSpriteSequence(new WadSpriteSequenceId((uint)oldSequence.ObjectID)); for (int i = startIndex; i < startIndex + lengthOfSequence; i++) { var oldSpriteTexture = oldWad.SpriteTextures[i]; int spriteWidth = oldSpriteTexture.Width + 1; int spriteHeight = oldSpriteTexture.Height + 1; int spriteX = oldSpriteTexture.X; int spriteY = oldSpriteTexture.Y; var spriteImage = ImageC.CreateNew(spriteWidth, spriteHeight); for (int y = 0; y < spriteHeight; y++) { for (int x = 0; x < spriteWidth; x++) { int baseIndex = oldSpriteTexture.Tile * 196608 + 768 * (y + spriteY) + 3 * (x + spriteX); byte b = oldWad.SpriteData[baseIndex + 0]; byte g = oldWad.SpriteData[baseIndex + 1]; byte r = oldWad.SpriteData[baseIndex + 2]; if (r == 255 && g == 0 && b == 255) { spriteImage.SetPixel(x, y, 0, 0, 0, 0); } else { spriteImage.SetPixel(x, y, b, g, r, 255); } } } // Add current sprite to the sequence newSequence.Sprites.Add(new WadSprite { Texture = new WadTexture(spriteImage) }); } wad.SpriteSequences.Add(newSequence.Id, newSequence); } }
private static void ConvertTrLevelSprites(Wad2 wad, TrLevel oldLevel) { ImageC tiles = ImageC.FromByteArray(oldLevel.TextureMap32, 256, oldLevel.TextureMap32.Length / 1024); foreach (var oldSequence in oldLevel.SpriteSequences) { int lengthOfSequence = -oldSequence.NegativeLength; int startIndex = oldSequence.Offset; var newSequence = new WadSpriteSequence(new WadSpriteSequenceId((uint)oldSequence.ObjectID)); for (int i = startIndex; i < startIndex + lengthOfSequence; i++) { tr_sprite_texture oldSpriteTexture = oldLevel.SpriteTextures[i]; int spriteX, spriteY, spriteWidth, spriteHeight; int x1 = oldSpriteTexture.LeftSide; int x2 = oldSpriteTexture.RightSide; int y1 = oldSpriteTexture.TopSide; int y2 = oldSpriteTexture.BottomSide; if (oldLevel.Version == TRVersion.Game.TR1 || oldLevel.Version == TRVersion.Game.TR2 || oldLevel.Version == TRVersion.Game.TR3) { spriteX = oldSpriteTexture.X; spriteY = oldSpriteTexture.Y; spriteWidth = ((oldSpriteTexture.Width - 255) / 256 + 1); spriteHeight = ((oldSpriteTexture.Height - 255) / 256 + 1); } else { spriteX = oldSpriteTexture.LeftSide; spriteY = oldSpriteTexture.TopSide; spriteWidth = ((oldSpriteTexture.Width / 256) + 1); spriteHeight = ((oldSpriteTexture.Height / 256) + 1); } // Add current sprite to the sequence var spriteImage = ImageC.CreateNew(spriteWidth, spriteHeight); spriteImage.CopyFrom(0, 0, tiles, spriteX, spriteY + oldSpriteTexture.Tile * 256, spriteWidth, spriteHeight); RectangleInt2 rect = new RectangleInt2(x1, y1, x2, y2); newSequence.Sprites.Add(new WadSprite { Texture = new WadTexture(spriteImage), Alignment = rect }); } wad.SpriteSequences.Add(newSequence.Id, newSequence); } }
public FormSpriteSequenceEditor(WadToolClass tool, Wad2 wad, WadSpriteSequence spriteSequence) { InitializeComponent(); SpriteSequence = spriteSequence; Wad = wad; _tool = tool; _currentPath = Wad.FileName; // Load data Text = "Sprite sequence '" + spriteSequence.Id.ToString(Wad.GameVersion) + "'"; dataGridView.DataSource = new BindingList <WadSprite>(new List <WadSprite>(spriteSequence.Sprites)); dataGridViewControls.CreateNewRow = newObject; dataGridViewControls.DataGridView = dataGridView; dataGridViewControls.Enabled = true; // Refresh initially if (dataGridView.Rows.Count > 0) { dataGridView.Rows[0].Selected = true; } SelectSprite(); }