/// <summary> /// Reads a DGRPImage from a stream. /// </summary> /// <param name="iff">An Iff instance.</param> /// <param name="stream">A Stream object holding a DGRPImage.</param> public void Read(uint version, IoBuffer io) { uint spriteCount = 0; if (version < 20003){ spriteCount = io.ReadUInt16(); Direction = io.ReadByte(); Zoom = io.ReadByte(); }else{ Direction = io.ReadUInt32(); Zoom = io.ReadUInt32(); spriteCount = io.ReadUInt32(); } this.Sprites = new DGRPSprite[spriteCount]; for (var i = 0; i < spriteCount; i++){ var sprite = new DGRPSprite(Parent); sprite.Read(version, io); this.Sprites[i] = sprite; } }
public TTABFieldEncode(IoBuffer io) : base(io) { curByte = io.ReadByte(); bitPos = 0; }
/// <summary> /// Reads a bone from a IOBuffer. /// </summary> /// <param name="reader">An IOBuffer instance used to read from a stream holding a skeleton.</param> /// <returns>A Bone instance.</returns> private Bone ReadBone(IoBuffer reader) { var bone = new Bone(); bone.Unknown = reader.ReadInt32(); bone.Name = reader.ReadPascalString(); bone.ParentName = reader.ReadPascalString(); bone.HasProps = reader.ReadByte(); if (bone.HasProps != 0) { var propertyCount = reader.ReadInt32(); var property = new PropertyListItem(); for (var i = 0; i < propertyCount; i++) { var pairCount = reader.ReadInt32(); for (var x = 0; x < pairCount; x++) { property.KeyPairs.Add(new KeyValuePair<string, string>( reader.ReadPascalString(), reader.ReadPascalString() )); } } bone.Properties.Add(property); } var xx = -reader.ReadFloat(); bone.Translation = new Vector3( xx, reader.ReadFloat(), reader.ReadFloat() ); bone.Rotation = new Quaternion( reader.ReadFloat(), -reader.ReadFloat(), -reader.ReadFloat(), -reader.ReadFloat() ); bone.CanTranslate = reader.ReadInt32(); bone.CanRotate = reader.ReadInt32(); bone.CanBlend = reader.ReadInt32(); bone.WiggleValue = reader.ReadFloat(); bone.WigglePower = reader.ReadFloat(); return bone; }
/// <summary> /// Decodes this SPR2Frame. /// </summary> /// <param name="io">An IOBuffer instance used to read a SPR2Frame.</param> private void Decode(IoBuffer io) { var y = 0; var endmarker = false; var hasPixels = (this.Flags & 0x01) == 0x01; var hasZBuffer = (this.Flags & 0x02) == 0x02; var hasAlpha = (this.Flags & 0x04) == 0x04; var numPixels = this.Width * this.Height; if (hasPixels){ this.PixelData = new Color[numPixels]; } if (hasZBuffer){ this.ZBufferData = new byte[numPixels]; } if (hasAlpha){ this.AlphaData = new byte[numPixels]; } var palette = Parent.ChunkParent.Get<PALT>(this.PaletteID); var transparentPixel = palette.Colors[TransparentColorIndex]; while (!endmarker) { var marker = io.ReadUInt16(); var command = marker >> 13; var count = marker & 0x1FFF; switch (command) { /** Fill with pixel data **/ case 0x00: var bytes = count; bytes -= 2; var x = 0; while (bytes > 0) { var pxMarker = io.ReadUInt16(); var pxCommand = pxMarker >> 13; var pxCount = pxMarker & 0x1FFF; bytes -= 2; switch (pxCommand) { case 0x01: case 0x02: var pxWithAlpha = pxCommand == 0x02; for (var col = 0; col < pxCount; col++) { var zValue = io.ReadByte(); var pxValue = io.ReadByte(); bytes -= 2; var pxColor = palette.Colors[pxValue]; if (pxWithAlpha) { pxColor.A = (byte)(io.ReadByte() * 8.2258064516129032258064516129032); bytes--; } else { if (pxColor.PackedValue == transparentPixel.PackedValue) { pxColor.A = 0; } } var offset = (y * Width) + x; this.PixelData[offset] = pxColor; this.ZBufferData[offset] = zValue; x++; } if (pxWithAlpha) { /** Padding? **/ if ((pxCount * 3) % 2 != 0){ bytes--; io.ReadByte(); } } break; case 0x03: for (var col = 0; col < pxCount; col++) { var offset = (y * Width) + x; this.PixelData[offset] = transparentPixel; this.PixelData[offset].A = 0; if (hasZBuffer){ this.ZBufferData[offset] = 255; } x++; } break; case 0x06: for (var col = 0; col < pxCount; col++) { var pxIndex = io.ReadByte(); bytes--; var offset = (y * Width) + x; var pxColor = palette.Colors[pxIndex]; byte z = 0; if (pxColor.PackedValue == transparentPixel.PackedValue) { pxColor.A = 0; z = 255; } this.PixelData[offset] = pxColor; if (hasZBuffer) { this.ZBufferData[offset] = z; } x++; } if (pxCount % 2 != 0) { bytes--; io.ReadByte(); } break; } } /** If row isnt filled in, the rest is transparent **/ while (x < Width) { var offset = (y * Width) + x; if (hasZBuffer) { this.ZBufferData[offset] = 255; } x++; } break; /** Leave the next count rows in the color channel filled with the transparent color, * in the z-buffer channel filled with 255, and in the alpha channel filled with 0. **/ case 0x04: for (var row = 0; row < count; row++) { for (var col = 0; col < Width; col++) { var offset = ((y+row) * Width) + col; if (hasPixels) { this.PixelData[offset] = transparentPixel; } if (hasAlpha) { this.PixelData[offset].A = 0; } if (hasZBuffer) { ZBufferData[offset] = 255; } } } y += count - 1; break; case 0x05: endmarker = true; break; } y++; } }
/// <summary> /// Decodes this SPRFrame. /// </summary> /// <param name="io">IOBuffer used to read a SPRFrame.</param> private void Decode(IoBuffer io) { var palette = Parent.ChunkParent.Get<PALT>(Parent.PaletteID); if (palette == null) { palette = DEFAULT_PALT; } var y = 0; var endmarker = false; while (!endmarker){ var command = io.ReadByte(); var count = io.ReadByte(); switch (command){ /** Start marker **/ case 0x00: case 0x10: break; /** Fill row with pixel data **/ case 0x04: var bytes = count - 2; var x = 0; while (bytes > 0){ var pxCommand = io.ReadByte(); var pxCount = io.ReadByte(); bytes -= 2; switch (pxCommand){ /** Next {n} pixels are transparent **/ case 0x01: x += pxCount; break; /** Next {n} pixels are the same palette color **/ case 0x02: var index = io.ReadByte(); var padding = io.ReadByte(); bytes -= 2; var color = palette.Colors[index]; for (var j=0; j < pxCount; j++){ this.SetPixel(x, y, color); x++; } break; /** Next {n} pixels are specific palette colours **/ case 0x03: for (var j=0; j < pxCount; j++){ var index2 = io.ReadByte(); var color2 = palette.Colors[index2]; this.SetPixel(x, y, color2); x++; } bytes -= pxCount; if (pxCount % 2 != 0){ //Padding io.ReadByte(); bytes--; } break; } } y++; break; /** End marker **/ case 0x05: endmarker = true; break; /** Leave next rows transparent **/ case 0x09: y += count; continue; } } }