//============================================================ // <T>序列化多层数据。</T> // // @param output 输出流 //============================================================ public override void SerializeIndex(IOutput output) { base.Serialize(output); // 输出位图列表 output.WriteInt16((short)_bitmaps.Count); foreach (FDrTextureBitmap bitmap in _bitmaps) { output.WriteInt8((sbyte)bitmap.TypeCd); output.WriteInt16((short)0); // 存储信息 bitmap.Serialize(output); // 存储图片 using (FIndexBitmap resource = new FIndexBitmap(bitmap.Image.Native)) { //resource.OptionAlpha = true; resource.OptionAlpha = false; output.WriteInt8((sbyte)bitmap.TypeCd); output.WriteInt16((short)0); //resource.SerializeUnpackIndexed(output, compressColor, pixelCount); resource.SerializeIndexed(output, EDrTexture.SplitColorCount, EDrTexture.SplitPixelCount); } } }
//============================================================ // <T>序列化多层数据。</T> // // @param output 输出流 //============================================================ public override void Serialize(IOutput output) { base.Serialize(output); // 输出位图列表 output.WriteInt16((short)_bitmaps.Count); foreach (FDrTextureBitmap bitmap in _bitmaps) { //// 存储图片 //output.WriteInt8((sbyte)bitmap.TypeCd); //output.WriteInt16((short)bitmap.Index); //using (FDsBitmap merger = new FDsBitmap(bitmap.Image.Native)) { // merger.Serialize(output); //} // 存储信息 bitmap.Serialize(output); using (FIndexBitmap resource = new FIndexBitmap(bitmap.Image.Native)) { resource.OptionAlpha = true; output.WriteInt8((sbyte)bitmap.TypeCd); output.WriteInt16((short)bitmap.Index); resource.SerializeIndexed(output, EDrTexture.SplitColorCount, EDrTexture.SplitPixelCount); } } }
//============================================================ // <T>序列化多层数据。</T> // // @param output 输出流 //============================================================ public override void SerializeIndex(IOutput output) { base.Serialize(output); // 输出位图列表 output.WriteInt16((short)_bitmaps.Count); foreach (FDrTextureBitmap bitmap in _bitmaps) { bitmap.Serialize(output); } // 压缩颜色 int bitmapCount = 0; string path = RContent3dManager.TextureConsole.ResourceDirectory; FByteStream bytes = new FByteStream(); // 合并漫反射和透明纹理 FDrTextureBitmap bitmapDiffuse = FindByTypeCd(EDrTexture.Diffuse); FDrTextureBitmap bitmapAlpha = FindByTypeCd(EDrTexture.Alpha); if ((null != bitmapDiffuse) || (null != bitmapAlpha)) { bitmapCount++; bytes.WriteInt8(EDrTexture.PackDiffuse); bytes.WriteInt16(0); using (FPngMerger merger = new FPngMerger()) { if (null != bitmapDiffuse) { merger.LoadColorFile(path + bitmapDiffuse.Source); } if (null != bitmapAlpha) { merger.LoadAlphaFile(path + bitmapAlpha.Source); } Bitmap bitmap = merger.Merge(); using (FIndexBitmap resource = new FIndexBitmap(bitmap)) { resource.OptionAlpha = true; resource.SerializeIndexed(bytes, EDrTexture.SplitColorCount, EDrTexture.SplitPixelCount); } } } // 合并法线和高光级别纹理 FDrTextureBitmap bitmapNormal = FindByTypeCd(EDrTexture.Normal); FDrTextureBitmap bitmapSpecularLevel = FindByTypeCd(EDrTexture.SpecularLevel); if ((null != bitmapNormal) || (null != bitmapSpecularLevel)) { bitmapCount++; bytes.WriteInt8(EDrTexture.PackNormal); bytes.WriteInt16(0); using (FPngMerger merger = new FPngMerger()) { if (null != bitmapNormal) { merger.LoadColorFile(path + bitmapNormal.Source); } if (null != bitmapSpecularLevel) { merger.LoadAlphaFile(path + bitmapSpecularLevel.Source); } Bitmap bitmap = merger.Merge(); using (FIndexBitmap resource = new FIndexBitmap(bitmap)) { resource.OptionAlpha = true; resource.SerializeIndexed(bytes, EDrTexture.SplitColorCount, EDrTexture.SplitPixelCount); } } } // 合并高光和高度纹理 FDrTextureBitmap bitmapSpecular = FindByTypeCd(EDrTexture.Specular); FDrTextureBitmap bitmapHeight = FindByTypeCd(EDrTexture.Height); if ((null != bitmapSpecular) || (null != bitmapHeight)) { bitmapCount++; bytes.WriteInt8(EDrTexture.PackSpecular); bytes.WriteInt16(0); using (FPngMerger merger = new FPngMerger()) { if (null != bitmapSpecular) { merger.LoadColorFile(path + bitmapSpecular.Source); } if (null != bitmapHeight) { merger.LoadAlphaFile(path + bitmapHeight.Source); } Bitmap bitmap = merger.Merge(); using (FIndexBitmap resource = new FIndexBitmap(bitmap)) { resource.OptionAlpha = true; resource.SerializeIndexed(bytes, EDrTexture.SplitColorCount, EDrTexture.SplitPixelCount); } } } // 合并透射和透射级别纹理 FDrTextureBitmap bitmapTransmittanceColor = FindByTypeCd(EDrTexture.TransmittanceColor); FDrTextureBitmap bitmapTransmittanceLevel = FindByTypeCd(EDrTexture.TransmittanceLevel); if ((null != bitmapTransmittanceColor) || (null != bitmapTransmittanceLevel)) { bitmapCount++; bytes.WriteInt8(EDrTexture.PackTransmittance); bytes.WriteInt16(0); using (FPngMerger merger = new FPngMerger()) { if (null != bitmapTransmittanceColor) { merger.LoadColorFile(path + bitmapTransmittanceColor.Source); } if (null != bitmapTransmittanceLevel) { merger.LoadAlphaFile(path + bitmapTransmittanceLevel.Source); } Bitmap bitmap = merger.Merge(); using (FIndexBitmap resource = new FIndexBitmap(bitmap)) { resource.OptionAlpha = true; resource.SerializeIndexed(bytes, EDrTexture.SplitColorCount, EDrTexture.SplitPixelCount); } } } // 合并其他纹理 FDrTextureBitmap bitmapLight = FindByTypeCd(EDrTexture.Light); FDrTextureBitmap bitmapReflect = FindByTypeCd(EDrTexture.Reflect); FDrTextureBitmap bitmapRefract = FindByTypeCd(EDrTexture.Refract); FDrTextureBitmap bitmapEmissive = FindByTypeCd(EDrTexture.Emissive); if ((null != bitmapLight) || (null != bitmapReflect) || (null != bitmapRefract) || (null != bitmapEmissive)) { bitmapCount++; bytes.WriteInt8(EDrTexture.PackLight); bytes.WriteInt16(0); using (FPngMerger merger = new FPngMerger()) { if (null != bitmapLight) { merger.LoadRFile(path + bitmapLight.Source); } if (null != bitmapReflect) { merger.LoadGFile(path + bitmapReflect.Source); } if (null != bitmapRefract) { merger.LoadBFile(path + bitmapRefract.Source); } if (null != bitmapEmissive) { merger.LoadAlphaFile(path + bitmapEmissive.Source); } Bitmap bitmap = merger.MergeAll(); using (FIndexBitmap resource = new FIndexBitmap(bitmap)) { resource.OptionAlpha = true; resource.SerializeIndexed(bytes, EDrTexture.SplitColorCount, EDrTexture.SplitPixelCount); } } } // 输出环境纹理 FDrTextureBitmap bitmapEnvironment = FindByTypeCd(EDrTexture.Environment); if (null != bitmapEnvironment) { bitmapCount++; bytes.WriteInt8(EDrTexture.Environment); bytes.WriteInt16(0); Bitmap bitmap = new Bitmap(path + bitmapEnvironment.Source); int size = bitmap.Height; int block = bitmap.Width / bitmap.Height; Bitmap cubeBitmap = new Bitmap(bitmap.Height, bitmap.Width, PixelFormat.Format32bppArgb); using (Graphics g = Graphics.FromImage(cubeBitmap)) { for (int n = 0; n < 6; n++) { g.DrawImage(bitmap, new Rectangle(0, size * n, size, size), new Rectangle(size * n, 0, size, size), GraphicsUnit.Pixel); } } using (FIndexBitmap resource = new FIndexBitmap(cubeBitmap)) { resource.OptionAlpha = true; resource.SerializeIndexed(bytes, EDrTexture.SplitColorCount, EDrTexture.SplitPixelCount); } cubeBitmap.Dispose(); } // 输出纹理列表 output.WriteInt16((sbyte)bitmapCount); output.WriteBytes(bytes.Memory, 0, bytes.Length); }