Beispiel #1
0
 public override TextureHeader LoadHeader(string file, TextureLoadSettings settings)
 {
     using (Image image = Image.FromFile(file))
     {
         return(new TextureHeader()
         {
             Width = image.Width,
             Height = image.Height,
             Format = TextureFormat.RGBA32_Float,
             MipLevels = 1
         });
     }
 }
Beispiel #2
0
        public override TextureHeader LoadHeader(string file, TextureLoadSettings settings)
        {
            if (file == null)
            {
                throw new ArgumentNullException("file");
            }

            header = new TextureHeader();

            FileStream   stream = new FileStream(file, FileMode.Open);
            BinaryReader reader = new BinaryReader(stream);

            try
            {
                //Header + Magic Word
                int    magicWordSize = 4;
                byte[] magicWordData = reader.ReadBytes(magicWordSize);
                string magicWord     = Encoding.ASCII.GetString(magicWordData).Trim();

                if (magicWord == "DDS")
                {
                    int    headerSize = 124;
                    byte[] headerData = reader.ReadBytes(headerSize);

                    this.headerDDS   = DDSTextureImporter.ByteArrayToStruct <Header>(headerData, 0);
                    header.Width     = (int)this.headerDDS.Width;
                    header.Height    = (int)this.headerDDS.Height;
                    header.Depth     = (int)Depth;
                    header.MipLevels = this.headerDDS.MipMapCount > 0 ? (int)this.headerDDS.MipMapCount : 1;

                    headerDXT10 = new HeaderDXT10();
                    if (this.headerDDS.PixelFormat.Flags == PixelFormatFlags.FourCC && this.headerDDS.PixelFormat.FourCC == "DXT10")
                    {
                        hasHeaderDXT10 = true;
                        byte[] headerDxt10Data = reader.ReadBytes(Marshal.SizeOf(typeof(HeaderDXT10)));
                        headerDXT10 = DDSTextureImporter.ByteArrayToStruct <HeaderDXT10>(headerDxt10Data, 0);
                    }

                    header.Format = GetTextureFormat();
                }
            }
            finally
            {
                reader.Close();
                stream.Close();
            }
            IsHeaderLoaded = true;
            return(header);
        }
Beispiel #3
0
        public override void LoadData(ITexture2D handle, string file, TextureLoadSettings settings)
        {
            unsafe
            {
                using (Bitmap bitmap = new Bitmap(file))
                {
                    BitmapData data = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat);
                    try
                    {
                        Color[] colorsArgb;
                        switch (data.PixelFormat)
                        {
                        case PixelFormat.Format24bppRgb:
                            colorsArgb = new Color[data.Width * data.Height];
                            for (int x = 0; x < data.Width; x++)
                            {
                                for (int y = 0; y < data.Height; y++)
                                {
                                    byte *b = (byte *)(data.Scan0 + y * data.Stride + x * 3);
                                    byte *g = b + 1;
                                    byte *r = g + 1;
                                    colorsArgb[y * data.Width + x] = Color.FromArgb(255, *r, *g, *b);
                                }
                            }
                            break;

                        case PixelFormat.Format32bppArgb:
                            colorsArgb = new Color[data.Width * data.Height];
                            for (int x = 0; x < data.Width; x++)
                            {
                                for (int y = 0; y < data.Height; y++)
                                {
                                    byte *b = (byte *)(data.Scan0 + y * data.Stride + x * 4);
                                    byte *g = b + 1;
                                    byte *r = g + 1;
                                    byte *a = r + 1;
                                    colorsArgb[y * data.Width + x] = Color.FromArgb(*a, *r, *g, *b);
                                }
                            }
                            break;

                        case PixelFormat.Format8bppIndexed:
                            colorsArgb = new Color[data.Width * data.Height];
                            for (int x = 0; x < data.Width; x++)
                            {
                                for (int y = 0; y < data.Height; y++)
                                {
                                    byte *index = (byte *)(data.Scan0 + y * data.Stride + x);

                                    colorsArgb[y * data.Width + x] = Color.FromArgb(bitmap.Palette.Entries[*index].ToArgb());
                                }
                            }
                            break;

                        default:
                            throw new NotImplementedException("PixelFormat " + data.PixelFormat + " not implemented");
                        }
                        GCHandle      gcHandle;
                        DataRectangle dataRectangle = DataRectangle.FromArray(colorsArgb, bitmap.Width * Engine.GraphicsDevice.GetSizeOf(TextureFormat.RGBA32_Float), out gcHandle);
                        try
                        {
                            Engine.GraphicsDevice.RenderContext.UpdateContext.Update(handle, 0, dataRectangle);
                        }
                        finally
                        {
                            gcHandle.Free();
                        }
                    }
                    finally
                    {
                        bitmap.UnlockBits(data);
                    }
                }
            }
        }
Beispiel #4
0
        public override void LoadData(Graphics.ITexture2D handle, string file, TextureLoadSettings settings)
        {
            if (file == null)
            {
                throw new ArgumentNullException("file");
            }
            if (handle == null)
            {
                throw new ArgumentNullException("handle");
            }

            if (!IsHeaderLoaded)
            {
                LoadHeader(file, settings);
            }

            FileStream stream = new FileStream(file, FileMode.Open);

            if (stream.Length <= 128)
            {
                throw new Exception("File is too small");
            }

            GCHandle arrayHandle;

            try
            {
                int dataOffset = 4 + 124;

                if (hasHeaderDXT10)
                {
                    dataOffset += Marshal.SizeOf(typeof(HeaderDXT10));
                }

                stream.Position = dataOffset;

                int    dataSize = (int)stream.Length - dataOffset;
                byte[] data     = new byte[dataSize];
                stream.Read(data, 0, dataSize);

                if (!IsVolumeTexture)
                {
                    int             faces      = IsCubeMap ? 6 : 1;
                    int             levels     = header.MipLevels > 0 ? header.MipLevels : 1;
                    DataRectangle[] rectangles = new DataRectangle[levels * faces];


                    if (TextureFormatHelper.IsCompressed(header.Format))
                    {
                        arrayHandle = GCHandle.Alloc(data, GCHandleType.Pinned);
                    }
                    else
                    {
                        arrayHandle = GCHandle.Alloc(ConvertFormat(data), GCHandleType.Pinned);
                    }

                    try
                    {
                        IntPtr pointer = arrayHandle.AddrOfPinnedObject();

                        for (int face = 0; face < faces; face++)
                        {
                            int width  = header.Width;
                            int height = header.Height;
                            for (int mipLevel = 0; mipLevel < levels; mipLevel++)
                            {
                                int size = (int)GetSize(width, height);
                                rectangles[levels * face + mipLevel] = new DataRectangle(pointer, (int)GetPitch(width), size);

                                width   /= 2;
                                height  /= 2;
                                pointer += size;
                            }
                        }
                        for (int i = 0; i < rectangles.Length; i++)
                        {
                            Engine.GraphicsDevice.RenderContext.UpdateContext.Update(handle, i, rectangles[i]);
                        }
                    }
                    finally
                    {
                        arrayHandle.Free();
                    }
                }
                else
                {
                    //TextureImporterBase doesn't support 3D Textures
                }
            }
            finally
            {
                //if (arrayHandle.IsAllocated)
                //    arrayHandle.Free();

                stream.Close();
            }
        }
Beispiel #5
0
 public abstract void LoadData(ITexture2D handle, string file, TextureLoadSettings settings);
Beispiel #6
0
 public abstract TextureHeader LoadHeader(string file, TextureLoadSettings settings);