/// <summary> /// Load Texture From Binary Reader. /// </summary> /// <param name="br">The Binary Reader.</param> /// <returns></returns> public bool LoadFrom(BinaryReader br) { _header = null; _volumeTexture = null; _cubeMapTexture = null; _texture = null; _lastError = ""; uint id = br.ReadUInt32(); if (id != 0x20534444) return SetLastError("Invalid DDS Image File."); _header = new DDSHeader(br); bool isCompressed = false; SquishFlags compressFlag = SquishFlags.Dxt1; if (IsFourCC()) { isCompressed = true; switch (_header.PixelFormat.FourCC) { case FOURCC_DXT1: isCompressed = true; compressFlag = SquishFlags.Dxt1; break; case FOURCC_DXT3: compressFlag = SquishFlags.Dxt3; break; case FOURCC_DXT5: compressFlag = SquishFlags.Dxt5; break; case FOURCC_ATI1: compressFlag = SquishFlags.BC4; break; case FOURCC_ATI2: compressFlag = SquishFlags.BC5; break; default: isCompressed = false; break; } } uint mipMaps = 1; if (HasMipMaps()) mipMaps = _header.MipMapCount; if (IsVolumeTexture()) { uint ui_slices = _header.Depth; uint ui_width = _header.Width; uint ui_height = _header.Height; _volumeTexture = new VolumeTextureData((int)mipMaps); for (int i = 0; i < mipMaps; i++) { _volumeTexture.Mipmaps[i] = new VolumeTextureMipMap((int)ui_slices); for (int j = 0; j < ui_slices; j++) { int dataSize = (int)(ui_width * ui_height * (_header.PixelFormat.RGBBitCount / 8)); if (isCompressed) dataSize = SharpSquish.GetStorageRequirements((int)ui_width, (int)ui_height, compressFlag); byte[] m_slice = br.ReadBytes(dataSize); _volumeTexture.Mipmaps[i].Slices[j] = new MipmapData() { Width = ui_width, Height = ui_height, Data = m_slice }; } ui_width = Math.Max(ui_width / 2, 1); ui_height = Math.Max(ui_height / 2, 1); ui_slices = Math.Max(ui_slices / 2, 1); } } else if (isCubeMapTexture()) { _cubeMapTexture = new CubeMapTextureData(); bool posX = ((_header.Caps2 & DDSCaps2.DDSCAPS2_CUBEMAP_POSITIVEX) != 0); bool negX = ((_header.Caps2 & DDSCaps2.DDSCAPS2_CUBEMAP_NEGATIVEX) != 0); bool posY = ((_header.Caps2 & DDSCaps2.DDSCAPS2_CUBEMAP_POSITIVEY) != 0); bool negY = ((_header.Caps2 & DDSCaps2.DDSCAPS2_CUBEMAP_NEGATIVEY) != 0); bool posZ = ((_header.Caps2 & DDSCaps2.DDSCAPS2_CUBEMAP_POSITIVEZ) != 0); bool negZ = ((_header.Caps2 & DDSCaps2.DDSCAPS2_CUBEMAP_NEGATIVEZ) != 0); if (posX) _cubeMapTexture.PositiveX = ReadFace(br, mipMaps, isCompressed, compressFlag); else _cubeMapTexture.PositiveX = null; if (negX) _cubeMapTexture.NegativeX = ReadFace(br, mipMaps, isCompressed, compressFlag); else _cubeMapTexture.NegativeX = null; if (posY) _cubeMapTexture.PositiveY = ReadFace(br, mipMaps, isCompressed, compressFlag); else _cubeMapTexture.PositiveY = null; if (negY) _cubeMapTexture.NegativeY = ReadFace(br, mipMaps, isCompressed, compressFlag); else _cubeMapTexture.NegativeY = null; if (posZ) _cubeMapTexture.PositiveZ = ReadFace(br, mipMaps, isCompressed, compressFlag); else _cubeMapTexture.PositiveZ = null; if (negZ) _cubeMapTexture.NegativeZ = ReadFace(br, mipMaps, isCompressed, compressFlag); else _cubeMapTexture.NegativeZ = null; } else { _texture = new MipmapData[(int)mipMaps]; uint ui_width = _header.Width; uint ui_height = _header.Height; for (int i = 0; i < mipMaps; i++) { int dataSize = (int)(ui_width * ui_height * (_header.PixelFormat.RGBBitCount / 8)); if (isCompressed) dataSize = SharpSquish.GetStorageRequirements((int)ui_width, (int)ui_height, compressFlag); byte[] m_slice = br.ReadBytes(dataSize); _texture[i] = new MipmapData() { Width = ui_width, Height = ui_height, Data = m_slice }; ui_width = Math.Max(ui_width / 2, 1); ui_height = Math.Max(ui_height / 2, 1); } } return true; }
public void Read(Stream input, OWLib.STUD stud) { using (BinaryReader reader = new BinaryReader(input, System.Text.Encoding.Default, true)) { data = reader.Read <MipmapData>(); } }