Exemple #1
0
 /// <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;
 }
Exemple #2
0
 public void Read(Stream input, OWLib.STUD stud)
 {
     using (BinaryReader reader = new BinaryReader(input, System.Text.Encoding.Default, true)) {
         data = reader.Read <MipmapData>();
     }
 }