Ejemplo n.º 1
0
        public static bool SaveTxPic(IO.XndHolder xnd, ref CTxPicDesc txDesc, string filename,
                                     ETCFormat etcFormat = ETCFormat.RGBA8,
                                     int mipMapLevel     = 0)
        {
            #region Read Pixels
            var imageimport = new EngineNS.Bricks.ImageImport.ImageImport();
            EngineNS.Support.CBlobObject blob = new EngineNS.Support.CBlobObject();
            imageimport.LoadTexture(filename, blob);
            int w        = imageimport.GetWidth();
            int h        = imageimport.GetHeight();
            int channels = imageimport.GetChannels();

            byte[] data = blob.ToBytes();//new byte[w * h * channels];
            System.Drawing.Imaging.PixelFormat format = System.Drawing.Imaging.PixelFormat.Undefined;
            if (channels == 4)
            {
                format = System.Drawing.Imaging.PixelFormat.Format32bppArgb;
            }
            else if (channels == 3)
            {
                format = System.Drawing.Imaging.PixelFormat.Format24bppRgb;
            }
            else if (channels == 1)
            {
                format = System.Drawing.Imaging.PixelFormat.Format32bppArgb;
            }

            var bitmap = new System.Drawing.Bitmap(w, h, format);
            int offset = 0;
            for (int j = 0; j < h; j++)
            {
                for (int i = 0; i < w; i++)
                {
                    if (channels == 4)
                    {
                        System.Drawing.Color color = System.Drawing.Color.FromArgb(data[offset + 3], data[offset], data[offset + 1], data[offset + 2]);
                        offset += 4;
                        bitmap.SetPixel(i, j, color);
                    }
                    else if (channels == 3)
                    {
                        System.Drawing.Color color = System.Drawing.Color.FromArgb(data[offset], data[offset + 1], data[offset + 2]);
                        offset += 3;
                        bitmap.SetPixel(i, j, color);
                    }
                    else if (channels == 1)
                    {
                        System.Drawing.Color color = System.Drawing.Color.FromArgb(data[offset++]);
                        bitmap.SetPixel(i, j, color);
                    }
                }
            }
            var tagBitmap = bitmap.Clone(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height), System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            #endregion

            if (bitmap.PixelFormat == System.Drawing.Imaging.PixelFormat.Format8bppIndexed)
            {
                txDesc.EtcFormat = ETCFormat.UNKNOWN;
            }
            txDesc.Width  = w;
            txDesc.Height = h;

            SaveTxPic(xnd, ref txDesc, tagBitmap, etcFormat, mipMapLevel);
            return(true);
        }
Ejemplo n.º 2
0
 public extern static vBOOL SDK_TexCompressor_EncodePng2ETC(NativePointer self, IntPtr ptr, UInt32 size, ETCFormat fmt, int mipmap, Support.CBlobObject.NativePointer blob);
Ejemplo n.º 3
0
        public static void SaveTxPic(IO.XndHolder xnd, ref CTxPicDesc txDesc, Bitmap tagBitmap,
                                     ETCFormat etcFormat = ETCFormat.RGBA8,
                                     int mipMapLevel     = 0)
        {
            #region Png
            var attr = xnd.Node.AddAttrib("PNG");
            attr.BeginWrite();
            var tagStream = new MemoryStream();
            tagBitmap.Save(tagStream, System.Drawing.Imaging.ImageFormat.Png);
            var pngData = tagStream.ToArray();
            attr.Write(pngData, pngData.Length);
            attr.EndWrite();
            #endregion

            #region PngMips
            var mipsNode = xnd.Node.AddNode("PngMips", 0, 0);
            int curMip   = 0;
            while (true)
            {
                var mipAttr = mipsNode.AddAttrib($"Mip_{curMip}");
                curMip++;
                mipAttr.BeginWrite();
                var mipStream = new MemoryStream();
                tagBitmap.Save(mipStream, System.Drawing.Imaging.ImageFormat.Png);
                var pngMipData = mipStream.ToArray();
                mipAttr.Write(pngMipData, pngMipData.Length);
                mipAttr.EndWrite();

                if (txDesc.MipLevel == curMip)
                {
                    break;
                }
                if (tagBitmap.Width == 1 && tagBitmap.Height == 1)
                {
                    break;
                }
                var mipWidth  = tagBitmap.Width / 2;
                var mipHeight = tagBitmap.Height / 2;
                if (mipWidth == 0)
                {
                    mipWidth = 1;
                }
                if (mipHeight == 0)
                {
                    mipHeight = 1;
                }
                //tagBitmap = EngineNS.BitmapProc.ScaleBitmap(tagBitmap, mipWidth, mipHeight);
                tagBitmap = EngineNS.BitmapProc.GenerateMip(tagBitmap, mipWidth, mipHeight);
            }
            #endregion

            if (CEngine.IsWriteEtc)
            {
                if (etcFormat != ETCFormat.UNKNOWN)
                {
                    using (var etcBlob = EngineNS.Support.CBlobProxy2.CreateBlobProxy())
                    {
                        unsafe
                        {
                            fixed(byte *dataPtr = &pngData[0])
                            {
                                var texCompressor = new EngineNS.Bricks.TexCompressor.CTexCompressor();

                                texCompressor.EncodePng2ETC((IntPtr)dataPtr, (uint)pngData.Length, etcFormat, mipMapLevel, etcBlob);
                                etcBlob.BeginRead();
                            }
                        }
                        if (etcBlob.DataLength >= 0)
                        {
                            var etcNode  = xnd.Node.AddNode("EtcMips", 0, 0);
                            int fmt      = 0;
                            int MipLevel = 0;
                            etcBlob.Read(out fmt);
                            etcBlob.Read(out MipLevel);
                            var layer = new EngineNS.Bricks.TexCompressor.ETCLayer();
                            for (int i = 0; i < MipLevel; i++)
                            {
                                etcBlob.Read(out layer);
                                byte[] etcMipData;
                                etcBlob.Read(out etcMipData, (int)layer.Size);

                                var mipAttr = etcNode.AddAttrib($"Mip_{i}");
                                mipAttr.BeginWrite();
                                mipAttr.Write(layer);
                                mipAttr.Write(etcMipData, etcMipData.Length);
                                mipAttr.EndWrite();
                            }
                        }
                    }
                }
            }

            attr             = xnd.Node.AddAttrib("Desc");
            txDesc.MipLevel  = curMip;
            txDesc.EtcFormat = etcFormat;
            #region Desc
            attr.Version = 3;
            attr.BeginWrite();
            unsafe
            {
                fixed(EngineNS.CTxPicDesc *descPin = &txDesc)
                {
                    attr.Write((IntPtr)(descPin), sizeof(EngineNS.CTxPicDesc));
                }
            }
            attr.EndWrite();
            #endregion
        }
Ejemplo n.º 4
0
 public bool EncodePng2ETC(IntPtr ptr, UInt32 size, ETCFormat fmt, int mipmap, Support.CBlobProxy2 blob)
 {
     return(SDK_TexCompressor_EncodePng2ETC(CoreObject, ptr, size, fmt, mipmap, blob.CoreObject));
 }