From 4adba78df3dd22c91826c7d25f61f7bddac3909b Mon Sep 17 00:00:00 2001 From: Sebastian Lawe Date: Wed, 25 Jan 2023 13:12:50 -0600 Subject: [PATCH] Add ability to merge generated normals with existing normals, allowing for the original normal quality to be preserved, while also retaining the benefit of autogenerated normals. --- .../DesignTimeBuild/.dtbcache.v2 | Bin 112267 -> 112482 bytes .vs/FFXIVLooseTextureCompiler/v17/.suo | Bin 248832 -> 260608 bytes .../FFXIVLooseTextureCompiler.csproj | 4 +- .../ImageProcessing/Brightness.cs | 32 + .../ImageProcessing/KVImageBlender.cs | 641 ++++++++++++++++++ .../ImageProcessing/Normal.cs | 48 +- FFXIVLooseTextureCompiler/MainForm.cs | 221 +++--- .../Penumbra/TextureImporter.cs | 32 +- .../FFXIVLooseTextureCompiler.AssemblyInfo.cs | 4 +- ...seTextureCompiler.AssemblyInfoInputs.cache | 2 +- ...ureCompiler.csproj.CoreCompileInputs.cache | 2 +- ...tureCompiler.csproj.GenerateResource.cache | Bin 308 -> 308 bytes .../FFXIVLooseTextureCompiler.dll | Bin 490496 -> 501760 bytes .../FFXIVLooseTextureCompiler.pdb | Bin 55156 -> 60428 bytes .../obj/Debug/net7.0-windows/apphost.exe | Bin 277504 -> 277504 bytes .../ref/FFXIVLooseTextureCompiler.dll | Bin 154112 -> 157184 bytes .../refint/FFXIVLooseTextureCompiler.dll | Bin 154112 -> 157184 bytes 17 files changed, 855 insertions(+), 131 deletions(-) create mode 100644 FFXIVLooseTextureCompiler/ImageProcessing/Brightness.cs create mode 100644 FFXIVLooseTextureCompiler/ImageProcessing/KVImageBlender.cs diff --git a/.vs/FFXIVLooseTextureCompiler/DesignTimeBuild/.dtbcache.v2 b/.vs/FFXIVLooseTextureCompiler/DesignTimeBuild/.dtbcache.v2 index f33d59ad08a5ebff3979a2f4bf5d6b5389cf96e8..28cbc563cb86739c30cbd54a38b9531273436030 100644 GIT binary patch delta 4320 zcmZ9P2YeJ&5QnonODIARjUvQ|C`FnkBnOF&2%;dxD2ffsUG74YVz6SlU{_E`C}$xm zcCk^!sMG+`dsBL~(D{3UQWR(3F(bVD-R^rk`+YOJ@7?Y1?a=+nI}Ri}RZE<%c^TnA zW==RWoD~R$B3Z#uAQXtS47JP&L<$RY1BIbrPU~PKoE^?=om0@VAe2)W4&-EI2Qvyn z*}0kFQ0tQ6b=+31hK!#w-pT5dmfo>nuxBK{Xh1<^(4gM^d-iBs)VpV|hx_wUY<(Xm zKc!Q5L$rM`(mxz2Do^d}bWe#DJ>m3-9;2kB+fo;q71ETt1e5HSVAE0WT?O zFSp>$;l9fo@#gV%lw*D_{+jcLx#PziKCa|*+$MAD$18K|$JtLYohlsgKjX@~4R-dW zI}OV7-f)I_UGnfXS>2YH~g2m_wY&|6nekcoRQT`#A3~k1*fw&iA{qXql6d#z#vjj%9v$8F!Xb zY0?O+U~P14W|>p3`VH7X*l4P3D&JY=>`#tvHb+}{Uy7~N0ow@MsY4t){CIJ398;ZB z<)=BF;>dUTLM|ZG;q=|OFCR=3Y`S7~328PqU9cGmEXwIFB&6Hi4B=*Kx{C<)Y;2}r zvlP3SP~XO8309%lC4@^Ei=J^46~fI{t^uK;oo=>Za};YtXl!G11e>eaWrQYYVD`inlNz0;Cz=yloRNV2dE(Dk>~g{tHa1_d1&U=5GHq;uU<(zCwj^ZP z+(O|NDVI$M*w`Y$7Aw|@(Avfp3${eD971ja>mt9hIF<;vRJkh&SJ~;73bstKs|nW_ zES52xhjh7~xR%hy_LqylLa{u;bvCv_u$79nCA71#m4dBOEP6emz0Iu>ZnbhZ5N@=w z)q<^2tOKE=jja)EtztJ3Iwi2q{}1U};npeFnb5^fw@$F16zfX3*~emOA31gJF^`6P z!Y#J>vzY7Eyp_<+#?}kAL9yEix0?bZxInfk(4BCHZEh5ElbUxD?lR^UHSZ?eW1E}B z+@fX=!o9|9{;|}&k8rn#7?$DlI_%Fg@m5Q zJg8>Tg@WE zARF5)*dE0mCOqO}V?LEDdzA2)E$$U@pNfwYp760)S2YI{p0v&VVjfWQDZ}2k#MGr`meN6bon9J4t zl<=8tdSX^mb3Ea5W2S#0HNPNyX`9JnR#x*X;?<`Ahv>^@Vpb;*FFQGO`l_som{rxB zM3`)2RRyc2*f)eJrocA6v~P*mt5$)t#H_C7cm8tLzqHH0l$-j2Fx56|h?%11G{SUa zKBeXi!c5z&DdyQ~&LUJ8a}k?~|LSb=m(F|{&}4Io7tYoVoFmE3)nxPhm9=lS`ATkJ z0b!wSriyu;J-y!1DP)7MQUy$Y&PaTHMbDI zWmslCF)vngoBtN#566`gWIlHgcA8L-Ly7(e-n=SSS)X{Q@g2L@-f13TW%rp34U7~ z9jln=oEHUoo#A>n|sOoWpEEm;01YG2~xXz9Hp|d>Xx~T5qDi<{v zO!2t!!J4Oo96BBB<#a`ni?h8r9&%C3J5&<`T?}v=;~WpY9AD?-HZIQfkjfB;PScBv F{{w)?V|V}n delta 4015 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 enable true - 1.0.0.6 - 1.0.0.6 + 1.0.0.7 + 1.0.0.7 1.0.0.6 Always FFXIV Loose Texture Compiler diff --git a/FFXIVLooseTextureCompiler/ImageProcessing/Brightness.cs b/FFXIVLooseTextureCompiler/ImageProcessing/Brightness.cs new file mode 100644 index 0000000..e2c28b4 --- /dev/null +++ b/FFXIVLooseTextureCompiler/ImageProcessing/Brightness.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Drawing.Imaging; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVLooseTextureCompiler.ImageProcessing { + public class Brightness { + public static Bitmap BrightenImage(Bitmap originalImage, float brightness = 1.5f, float contrast = 1.0f, float gamma = 1.0f) { + Bitmap adjustedImage = new Bitmap(originalImage.Width, originalImage.Height); + float adjustedBrightness = brightness - 1.0f; + // create matrix that will brighten and contrast the image + float[][] ptsArray ={ + new float[] {contrast, 0, 0, 0, 0}, // scale red + new float[] {0, contrast, 0, 0, 0}, // scale green + new float[] {0, 0, contrast, 0, 0}, // scale blue + new float[] {0, 0, 0, 1.0f, 0}, // don't scale alpha + new float[] {adjustedBrightness, adjustedBrightness, adjustedBrightness, 0, 1}}; + + ImageAttributes imageAttributes = new ImageAttributes(); + imageAttributes.ClearColorMatrix(); + imageAttributes.SetColorMatrix(new ColorMatrix(ptsArray), ColorMatrixFlag.Default, ColorAdjustType.Bitmap); + imageAttributes.SetGamma(gamma, ColorAdjustType.Bitmap); + Graphics g = Graphics.FromImage(adjustedImage); + g.DrawImage(originalImage, new Rectangle(0, 0, adjustedImage.Width, adjustedImage.Height) + , 0, 0, originalImage.Width, originalImage.Height, + GraphicsUnit.Pixel, imageAttributes); + return adjustedImage; + } + } +} diff --git a/FFXIVLooseTextureCompiler/ImageProcessing/KVImageBlender.cs b/FFXIVLooseTextureCompiler/ImageProcessing/KVImageBlender.cs new file mode 100644 index 0000000..3ba7c17 --- /dev/null +++ b/FFXIVLooseTextureCompiler/ImageProcessing/KVImageBlender.cs @@ -0,0 +1,641 @@ +using System; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Imaging; + +namespace KVImage +{ + public class ImageBlender + { + public enum BlendOperation : int + { + SourceCopy = 1, + ROP_MergePaint, + ROP_NOTSourceErase, + ROP_SourceAND, + ROP_SourceErase, + ROP_SourceInvert, + ROP_SourcePaint, + Blend_Darken, + Blend_Multiply, + Blend_ColorBurn, + Blend_Lighten, + Blend_Screen, + Blend_ColorDodge, + Blend_Overlay, + Blend_SoftLight, + Blend_HardLight, + Blend_PinLight, + Blend_Difference, + Blend_Exclusion, + Blend_Hue, + Blend_Saturation, + Blend_Color, + Blend_Luminosity + } + + // NTSC defined color weights + public const float R_WEIGHT = 0.299f; + public const float G_WEIGHT = 0.587f; + public const float B_WEIGHT = 0.144f; + + public const ushort HLSMAX = 360; + public const byte RGBMAX = 255; + public const byte HUNDEFINED = 0; + + private delegate byte PerChannelProcessDelegate(ref byte nSrc, ref byte nDst); + private delegate void RGBProcessDelegate(byte sR, byte sG, byte sB, ref byte dR, ref byte dG, ref byte dB); + + // Invert image + public void Invert(Image img) + { + if( img == null ) + throw new Exception("Image must be provided"); + + ColorMatrix cMatrix = new ColorMatrix(new float[][] { + new float[] {-1.0f, 0.0f, 0.0f, 0.0f, 0.0f }, + new float[] { 0.0f,-1.0f, 0.0f, 0.0f, 0.0f }, + new float[] { 0.0f, 0.0f,-1.0f, 0.0f, 0.0f }, + new float[] { 0.0f, 0.0f, 0.0f, 1.0f, 0.0f }, + new float[] { 1.0f, 1.0f, 1.0f, 0.0f, 1.0f } + } ); + ApplyColorMatrix(ref img, cMatrix); + } + + // Adjustment values are between -1.0 and 1.0 + public void AdjustBrightness(Image img, float adjValueR, float adjValueG, float adjValueB) + { + if( img == null ) + throw new Exception("Image must be provided"); + + ColorMatrix cMatrix = new ColorMatrix(new float[][] { + new float[] { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f }, + new float[] { 0.0f, 1.0f, 0.0f, 0.0f, 0.0f }, + new float[] { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f }, + new float[] { 0.0f, 0.0f, 0.0f, 1.0f, 0.0f }, + new float[] { adjValueR, adjValueG, adjValueB, 0.0f, 1.0f } + } ); + ApplyColorMatrix(ref img, cMatrix); + } + + + // Adjustment values are between -1.0 and 1.0 + public void AdjustBrightness(Image img, float adjValue) + { + AdjustBrightness(img, adjValue, adjValue, adjValue); + } + + + // Saturation. 0.0 = desaturate, 1.0 = identity, -1.0 = complementary colors + public void AdjustSaturation(Image img, float sat, float rweight, float gweight, float bweight) + { + if( img == null ) + throw new Exception("Image must be provided"); + + ColorMatrix cMatrix = new ColorMatrix(new float[][] { + new float[] { (1.0f-sat)*rweight+sat, (1.0f-sat)*rweight, (1.0f-sat)*rweight, 0.0f, 0.0f }, + new float[] { (1.0f-sat)*gweight, (1.0f-sat)*gweight+sat, (1.0f-sat)*gweight, 0.0f, 0.0f }, + new float[] { (1.0f-sat)*bweight, (1.0f-sat)*bweight, (1.0f-sat)*bweight+sat, 0.0f, 0.0f }, + new float[] { 0.0f, 0.0f, 0.0f, 1.0f, 0.0f }, + new float[] { 0.0f, 0.0f, 0.0f, 0.0f, 1.0f } + } ); + ApplyColorMatrix(ref img, cMatrix); + } + + + // Saturation. 0.0 = desaturate, 1.0 = identity, -1.0 = complementary colors + public void AdjustSaturation(Image img, float sat) + { + AdjustSaturation(img, sat, R_WEIGHT, G_WEIGHT, B_WEIGHT); + } + + + // Weights between 0.0 and 1.0 + public void Desaturate(Image img, float RWeight, float GWeight, float BWeight) + { + AdjustSaturation(img, 0.0f, RWeight, GWeight, BWeight); + } + + + // Desaturate using "default" NTSC defined color weights + public void Desaturate(Image img) + { + AdjustSaturation(img, 0.0f, R_WEIGHT, G_WEIGHT, B_WEIGHT); + } + + + public void ApplyColorMatrix(ref Image img, ColorMatrix colMatrix) + { + Graphics gr = Graphics.FromImage(img); + ImageAttributes attrs = new ImageAttributes(); + attrs.SetColorMatrix(colMatrix); + gr.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height), + 0, 0, img.Width, img.Height, GraphicsUnit.Pixel, attrs); + gr.Dispose(); + } + + + #region BlendImages functions ... + /* + destImage - image that will be used as background + destX, destY - define position on destination image where to start applying blend operation + destWidth, destHeight - width and height of the area to apply blending + srcImage - image to use as foreground (source of blending) + srcX, srcY - starting position of the source image + */ + public Bitmap BlendImages(Image destImage, int destX, int destY, int destWidth, int destHeight, + Image srcImage, int srcX, int srcY, BlendOperation BlendOp) + { + if( destImage == null ) + throw new Exception("Destination image must be provided"); + + if( destImage.Width < destX + destWidth || destImage.Height< destY + destHeight ) + throw new Exception("Destination image is smaller than requested dimentions"); + + if( srcImage == null ) + throw new Exception("Source image must be provided"); + + if( srcImage.Width < srcX + destWidth || srcImage.Height< srcY + destHeight ) + throw new Exception("Source image is smaller than requested dimentions"); + + Bitmap tempBmp = null; + Graphics gr = Graphics.FromImage(destImage); + gr.CompositingMode = CompositingMode.SourceCopy; + + switch( BlendOp ) + { + case BlendOperation.SourceCopy: + gr.DrawImage(srcImage, new Rectangle(destX, destY, destWidth, destHeight), + srcX, srcY, destWidth, destHeight, GraphicsUnit.Pixel); + break; + + case BlendOperation.ROP_MergePaint: + tempBmp = PerChannelProcess(ref destImage, destX, destY, destWidth, destHeight, + ref srcImage, srcX, srcY, new PerChannelProcessDelegate(MergePaint)); + break; + + case BlendOperation.ROP_NOTSourceErase: + tempBmp = PerChannelProcess(ref destImage, destX, destY, destWidth, destHeight, + ref srcImage, srcX, srcY, new PerChannelProcessDelegate(NOTSourceErase)); + break; + + case BlendOperation.ROP_SourceAND: + tempBmp = PerChannelProcess(ref destImage, destX, destY, destWidth, destHeight, + ref srcImage, srcX, srcY, new PerChannelProcessDelegate(SourceAND)); + break; + + case BlendOperation.ROP_SourceErase: + tempBmp = PerChannelProcess(ref destImage, destX, destY, destWidth, destHeight, + ref srcImage, srcX, srcY, new PerChannelProcessDelegate(SourceErase)); + break; + + case BlendOperation.ROP_SourceInvert: + tempBmp = PerChannelProcess(ref destImage, destX, destY, destWidth, destHeight, + ref srcImage, srcX, srcY, new PerChannelProcessDelegate(SourceInvert)); + break; + + case BlendOperation.ROP_SourcePaint: + tempBmp = PerChannelProcess(ref destImage, destX, destY, destWidth, destHeight, + ref srcImage, srcX, srcY, new PerChannelProcessDelegate(SourcePaint)); + break; + + case BlendOperation.Blend_Darken: + tempBmp = PerChannelProcess(ref destImage, destX, destY, destWidth, destHeight, + ref srcImage, srcX, srcY, new PerChannelProcessDelegate(BlendDarken)); + break; + + case BlendOperation.Blend_Multiply: + tempBmp = PerChannelProcess(ref destImage, destX, destY, destWidth, destHeight, + ref srcImage, srcX, srcY, new PerChannelProcessDelegate(BlendMultiply)); + break; + + case BlendOperation.Blend_Screen: + tempBmp = PerChannelProcess(ref destImage, destX, destY, destWidth, destHeight, + ref srcImage, srcX, srcY, new PerChannelProcessDelegate(BlendScreen)); + break; + + case BlendOperation.Blend_Lighten: + tempBmp = PerChannelProcess(ref destImage, destX, destY, destWidth, destHeight, + ref srcImage, srcX, srcY, new PerChannelProcessDelegate(BlendLighten)); + break; + + case BlendOperation.Blend_HardLight: + tempBmp = PerChannelProcess(ref destImage, destX, destY, destWidth, destHeight, + ref srcImage, srcX, srcY, new PerChannelProcessDelegate(BlendHardLight)); + break; + + case BlendOperation.Blend_Difference: + tempBmp = PerChannelProcess(ref destImage, destX, destY, destWidth, destHeight, + ref srcImage, srcX, srcY, new PerChannelProcessDelegate(BlendDifference)); + break; + + case BlendOperation.Blend_PinLight: + tempBmp = PerChannelProcess(ref destImage, destX, destY, destWidth, destHeight, + ref srcImage, srcX, srcY, new PerChannelProcessDelegate(BlendPinLight)); + break; + + case BlendOperation.Blend_Overlay: + tempBmp = PerChannelProcess(ref destImage, destX, destY, destWidth, destHeight, + ref srcImage, srcX, srcY, new PerChannelProcessDelegate(BlendOverlay)); + break; + + case BlendOperation.Blend_Exclusion: + tempBmp = PerChannelProcess(ref destImage, destX, destY, destWidth, destHeight, + ref srcImage, srcX, srcY, new PerChannelProcessDelegate(BlendExclusion)); + break; + + case BlendOperation.Blend_SoftLight: + tempBmp = PerChannelProcess(ref destImage, destX, destY, destWidth, destHeight, + ref srcImage, srcX, srcY, new PerChannelProcessDelegate(BlendSoftLight)); + break; + + case BlendOperation.Blend_ColorBurn: + tempBmp = PerChannelProcess(ref destImage, destX, destY, destWidth, destHeight, + ref srcImage, srcX, srcY, new PerChannelProcessDelegate(BlendColorBurn)); + break; + + case BlendOperation.Blend_ColorDodge: + tempBmp = PerChannelProcess(ref destImage, destX, destY, destWidth, destHeight, + ref srcImage, srcX, srcY, new PerChannelProcessDelegate(BlendColorDodge)); + break; + + case BlendOperation.Blend_Hue: + tempBmp = RGBProcess(ref destImage, destX, destY, destWidth, destHeight, + ref srcImage, srcX, srcY, new RGBProcessDelegate(BlendHue)); + break; + + case BlendOperation.Blend_Saturation: + tempBmp = RGBProcess(ref destImage, destX, destY, destWidth, destHeight, + ref srcImage, srcX, srcY, new RGBProcessDelegate(BlendSaturation)); + break; + + case BlendOperation.Blend_Color: + tempBmp = RGBProcess(ref destImage, destX, destY, destWidth, destHeight, + ref srcImage, srcX, srcY, new RGBProcessDelegate(BlendColor)); + break; + + case BlendOperation.Blend_Luminosity: + tempBmp = RGBProcess(ref destImage, destX, destY, destWidth, destHeight, + ref srcImage, srcX, srcY, new RGBProcessDelegate(BlendLuminosity)); + break; + } + + if( tempBmp != null ) + { + gr.DrawImage(tempBmp, 0, 0, tempBmp.Width, tempBmp.Height); + return tempBmp; + } + + gr.Dispose(); + gr = null; + return null; + } + + + public void BlendImages(Image destImage, Image srcImage, BlendOperation BlendOp) + { + BlendImages(destImage, 0, 0, destImage.Width, destImage.Height, srcImage, 0, 0, BlendOp); + } + + public void BlendImages(Image destImage, BlendOperation BlendOp) + { + BlendImages(destImage, 0, 0, destImage.Width, destImage.Height, null, 0, 0, BlendOp); + } + + public void BlendImages(Image destImage, int destX, int destY, BlendOperation BlendOp) + { + BlendImages(destImage, destX, destY, destImage.Width - destX, destImage.Height - destY, null, 0, 0, BlendOp); + } + + public void BlendImages(Image destImage, int destX, int destY, int destWidth, int destHeight, BlendOperation BlendOp) + { + BlendImages(destImage, destX, destY, destWidth, destHeight, null, 0, 0, BlendOp); + } + #endregion + + #region Private Blending Functions ... + + private Bitmap PerChannelProcess(ref Image destImg, int destX, int destY, int destWidth, int destHeight, + ref Image srcImg, int srcX, int srcY, + PerChannelProcessDelegate ChannelProcessFunction) + { + Bitmap dst = new Bitmap(destImg); + Bitmap src = new Bitmap(srcImg); + + BitmapData dstBD = dst.LockBits( new Rectangle(destX, destY, destWidth, destHeight), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); + BitmapData srcBD = src.LockBits( new Rectangle(srcX, srcY, destWidth, destHeight), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); + + int dstStride = dstBD.Stride; + int srcStride = srcBD.Stride; + + System.IntPtr dstScan0 = dstBD.Scan0; + System.IntPtr srcScan0 = srcBD.Scan0; + + unsafe + { + byte *pDst = (byte *)(void *)dstScan0; + byte *pSrc = (byte *)(void *)srcScan0; + + for(int y = 0; y < destHeight; y++) + { + for(int x = 0; x < destWidth * 3; x++) + { + pDst[x + y * dstStride] = ChannelProcessFunction(ref pSrc[x + y * srcStride], ref pDst[x + y * dstStride]); + } + } + } + + src.UnlockBits(srcBD); + dst.UnlockBits(dstBD); + + src.Dispose(); + + return dst; + } + + private Bitmap RGBProcess(ref Image destImg, int destX, int destY, int destWidth, int destHeight, + ref Image srcImg, int srcX, int srcY, + RGBProcessDelegate RGBProcessFunction) + { + Bitmap dst = new Bitmap(destImg); + Bitmap src = new Bitmap(srcImg); + + BitmapData dstBD = dst.LockBits( new Rectangle(destX, destY, destWidth, destHeight), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); + BitmapData srcBD = src.LockBits( new Rectangle(srcX, srcY, destWidth, destHeight), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); + + int dstStride = dstBD.Stride; + int srcStride = srcBD.Stride; + + System.IntPtr dstScan0 = dstBD.Scan0; + System.IntPtr srcScan0 = srcBD.Scan0; + + unsafe + { + byte *pDst = (byte *)(void *)dstScan0; + byte *pSrc = (byte *)(void *)srcScan0; + + for(int y = 0; y < destHeight; y++) + { + for(int x = 0; x < destWidth; x++) + { + RGBProcessFunction( + pSrc[x * 3 + 2 + y * srcStride], pSrc[x * 3 + 1 + y * srcStride], pSrc[x * 3 + y * srcStride], + ref pDst[x * 3 + 2 + y * dstStride], ref pDst[x * 3 + 1 + y * dstStride], ref pDst[x * 3 + y * dstStride] + ); + } + } + } + + src.UnlockBits(srcBD); + dst.UnlockBits(dstBD); + + src.Dispose(); + + return dst; + } + + #endregion + + #region HLS Conversion Functions ... + + public void RGBToHLS(byte R, byte G, byte B, out ushort H, out ushort L, out ushort S) + { + byte cMax,cMin; /* max and min RGB values */ + float Rdelta,Gdelta,Bdelta; /* intermediate value: % of spread from max */ + + /* calculate lightness */ + cMax = Math.Max( Math.Max(R,G), B); + cMin = Math.Min( Math.Min(R,G), B); + L = (ushort)((((cMax+cMin) * HLSMAX) + RGBMAX ) / (2 * RGBMAX)); + + if (cMax == cMin) + {/* r=g=b --> achromatic case */ + S = 0; /* saturation */ + H = HUNDEFINED; /* hue */ + } + else + {/* chromatic case */ + /* saturation */ + if (L <= (HLSMAX/2)) + S = (ushort)(( ((cMax-cMin)*HLSMAX) + ((cMax+cMin)/2) ) / (cMax+cMin)); + else + S = (ushort)(( ((cMax-cMin)*HLSMAX) + ((2*RGBMAX-cMax-cMin)/2) ) / (2*RGBMAX-cMax-cMin)); + + /* hue */ + Rdelta = (float)(( ((cMax-R)*(HLSMAX/6)) + ((cMax-cMin)/2) ) / (cMax-cMin)); + Gdelta = (float)(( ((cMax-G)*(HLSMAX/6)) + ((cMax-cMin)/2) ) / (cMax-cMin)); + Bdelta = (float)(( ((cMax-B)*(HLSMAX/6)) + ((cMax-cMin)/2) ) / (cMax-cMin)); + + if (R == cMax) + H = (ushort)(Bdelta - Gdelta); + else if (G == cMax) + H = (ushort)((HLSMAX/3) + Rdelta - Bdelta); + else /* B == cMax */ + H = (ushort)(((2*HLSMAX)/3) + Gdelta - Rdelta); + + if (H < 0) + H += HLSMAX; + if (H > HLSMAX) + H -= HLSMAX; + } + } + + public void HLSToRGB(ushort H, ushort L, ushort S, out byte R, out byte G, out byte B) + { + float Magic1, Magic2; /* calculated magic numbers (really!) */ + + if (S == 0) + {/* achromatic case */ + R=G=B=(byte)((L*RGBMAX)/HLSMAX); + } + else + {/* chromatic case */ + /* set up magic numbers */ + if (L <= (HLSMAX/2)) + Magic2 = (float)((L*(HLSMAX + S) + (HLSMAX/2))/HLSMAX); + else + Magic2 = (float)(L + S - ((L*S) + (HLSMAX/2))/HLSMAX); + + Magic1 = (float)(2*L-Magic2); + + /* get RGB, change units from HLSMAX to RGBMAX */ + R = (byte)((HueToRGB(Magic1,Magic2,H+(HLSMAX/3)) * RGBMAX + (HLSMAX/2))/HLSMAX); + G = (byte)((HueToRGB(Magic1,Magic2,H) * RGBMAX + (HLSMAX/2)) / HLSMAX); + B = (byte)((HueToRGB(Magic1,Magic2,H-(HLSMAX/3)) * RGBMAX + (HLSMAX/2))/HLSMAX); + } + } + + /* utility routine for HLStoRGB */ + private float HueToRGB(float n1, float n2, float hue) + { + /* range check: note values passed add/subtract thirds of range */ + if (hue < 0) + hue += HLSMAX; + + if (hue > HLSMAX) + hue -= HLSMAX; + + /* return r,g, or b value from this tridrant */ + if (hue < (HLSMAX/6)) + return (float)( n1 + (((n2-n1)*hue+(HLSMAX/12))/(HLSMAX/6)) ); + if (hue < (HLSMAX/2)) + return (float)( n2 ); + if (hue < ((HLSMAX*2)/3)) + return (float)( n1 + (((n2-n1)*(((HLSMAX*2)/3)-hue)+(HLSMAX/12))/(HLSMAX/6))); + else + return (float)( n1 ); + } + #endregion + + #region Raster Operation Functions ... + + // (NOT Source) OR Destination + private byte MergePaint(ref byte Src, ref byte Dst) + { + return (byte)Math.Max(Math.Min((255 - Src) | Dst, 255), 0); + } + + // NOT (Source OR Destination) + private byte NOTSourceErase(ref byte Src, ref byte Dst) + { + return (byte)Math.Max(Math.Min(255 - (Src | Dst), 255), 0); + } + + // Source AND Destination + private byte SourceAND(ref byte Src, ref byte Dst) + { + return (byte)Math.Max(Math.Min(Src & Dst, 255), 0); + } + + // Source AND (NOT Destination) + private byte SourceErase(ref byte Src, ref byte Dst) + { + return (byte)Math.Max(Math.Min(Src & (255 - Dst), 255), 0); + } + + // Source XOR Destination + private byte SourceInvert(ref byte Src, ref byte Dst) + { + return (byte)Math.Max(Math.Min(Src ^ Dst, 255), 0); + } + + // Source OR Destination + private byte SourcePaint(ref byte Src, ref byte Dst) + { + return (byte)Math.Max(Math.Min(Src | Dst, 255), 0); + } + + #endregion + + #region Blend Pixels Functions ... + // Choose darkest color + private byte BlendDarken(ref byte Src, ref byte Dst) + { + return ((Src < Dst) ? Src : Dst); + } + + // Multiply + private byte BlendMultiply(ref byte Src, ref byte Dst) + { + return (byte)Math.Max(Math.Min((Src/255.0f * Dst/255.0f) * 255.0f, 255), 0); + } + + // Screen + private byte BlendScreen(ref byte Src, ref byte Dst) + { + return (byte)Math.Max(Math.Min(255 - ((255 - Src)/255.0f * (255 - Dst)/255.0f) * 255.0f, 255), 0); + } + + // Choose lightest color + private byte BlendLighten(ref byte Src, ref byte Dst) + { + return ((Src > Dst) ? Src : Dst); + } + + // hard light + private byte BlendHardLight(ref byte Src, ref byte Dst) + { + return ((Src < 128) ? (byte)Math.Max(Math.Min((Src/255.0f * Dst/255.0f) * 255.0f * 2, 255), 0) : (byte)Math.Max(Math.Min(255 - ((255 - Src)/255.0f * (255 - Dst)/255.0f) * 255.0f * 2, 255), 0)); + } + + // difference + private byte BlendDifference(ref byte Src, ref byte Dst) + { + return (byte)((Src > Dst) ? Src - Dst : Dst - Src); + } + + // pin light + private byte BlendPinLight(ref byte Src, ref byte Dst) + { + return ( Src < 128 ) ? ((Dst > Src) ? Src : Dst) : ((Dst < Src) ? Src : Dst); + } + + // overlay + private byte BlendOverlay(ref byte Src, ref byte Dst) + { + return ((Dst < 128) ? (byte)Math.Max(Math.Min((Src/255.0f * Dst/255.0f) * 255.0f * 2, 255), 0) : (byte)Math.Max(Math.Min(255 - ((255 - Src)/255.0f * (255 - Dst)/255.0f) * 255.0f * 2, 255), 0)); + } + + // exclusion + private byte BlendExclusion(ref byte Src, ref byte Dst) + { + return (byte)(Src + Dst - 2 * (Dst * Src) / 255f ); + } + + // Soft Light (XFader formula) + private byte BlendSoftLight(ref byte Src, ref byte Dst) + { + return (byte)Math.Max(Math.Min( (Dst * Src / 255f) + Dst * (255 - ((255-Dst)*(255-Src) / 255f)-(Dst * Src / 255f)) / 255f , 255), 0); + } + + // Color Burn + private byte BlendColorBurn(ref byte Src, ref byte Dst) + { + return (Src == 0) ? (byte)0 : (byte)Math.Max(Math.Min( 255 - (((255-Dst) * 255) / Src) , 255), 0); + } + + // Color Dodge + private byte BlendColorDodge(ref byte Src, ref byte Dst) + { + return (Src == 255) ? (byte)255 : (byte)Math.Max(Math.Min( (Dst * 255) / (255 - Src) , 255), 0); + } + + // use source Hue + private void BlendHue(byte sR, byte sG, byte sB, ref byte dR, ref byte dG, ref byte dB) + { + ushort sH, sL, sS, dH, dL, dS; + RGBToHLS(sR, sG, sB, out sH, out sL, out sS); + RGBToHLS(dR, dG, dB, out dH, out dL, out dS); + HLSToRGB(sH, dL, dS, out dR, out dG, out dB); + } + + // use source Saturation + private void BlendSaturation(byte sR, byte sG, byte sB, ref byte dR, ref byte dG, ref byte dB) + { + ushort sH, sL, sS, dH, dL, dS; + RGBToHLS(sR, sG, sB, out sH, out sL, out sS); + RGBToHLS(dR, dG, dB, out dH, out dL, out dS); + HLSToRGB(dH, dL, sS, out dR, out dG, out dB); + } + + // use source Color + private void BlendColor(byte sR, byte sG, byte sB, ref byte dR, ref byte dG, ref byte dB) + { + ushort sH, sL, sS, dH, dL, dS; + RGBToHLS(sR, sG, sB, out sH, out sL, out sS); + RGBToHLS(dR, dG, dB, out dH, out dL, out dS); + HLSToRGB(sH, dL, sS, out dR, out dG, out dB); + } + + // use source Luminosity + private void BlendLuminosity(byte sR, byte sG, byte sB, ref byte dR, ref byte dG, ref byte dB) + { + ushort sH, sL, sS, dH, dL, dS; + RGBToHLS(sR, sG, sB, out sH, out sL, out sS); + RGBToHLS(dR, dG, dB, out dH, out dL, out dS); + HLSToRGB(dH, sL, dS, out dR, out dG, out dB); + } + + #endregion + } +} diff --git a/FFXIVLooseTextureCompiler/ImageProcessing/Normal.cs b/FFXIVLooseTextureCompiler/ImageProcessing/Normal.cs index 6da3378..36d8eaf 100644 --- a/FFXIVLooseTextureCompiler/ImageProcessing/Normal.cs +++ b/FFXIVLooseTextureCompiler/ImageProcessing/Normal.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Drawing.Imaging; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -7,31 +8,32 @@ namespace FFXIVLooseTextureCompiler.ImageProcessing { public class Normal { public static Bitmap Calculate(string file) { - Bitmap image = (Bitmap)Bitmap.FromFile(file); - #region Global Variables - int w = image.Width - 1; - int h = image.Height - 1; - float sample_l; - float sample_r; - float sample_u; - float sample_d; - float x_vector; - float y_vector; - Bitmap normal = new Bitmap(image.Width, image.Height); - #endregion - for (int y = 0; y < h; y++) { - for (int x = 0; x < w; x++) { - if (x > 0) { sample_l = image.GetPixel(x - 1, y).GetBrightness(); } else { sample_l = image.GetPixel(x < w ? x : x - 1, y).GetBrightness(); } - if (x < w) { sample_r = image.GetPixel(x + 1, y).GetBrightness(); } else { sample_r = image.GetPixel(x < w ? x : x - 1, y).GetBrightness(); } - if (y > 1) { sample_u = image.GetPixel(x < w ? x : x - 1, y - 1).GetBrightness(); } else { sample_u = image.GetPixel(x < w ? x : x - 1, y).GetBrightness(); } - if (y < h) { sample_d = image.GetPixel(x < w ? x : x - 1, y + 1).GetBrightness(); } else { sample_d = image.GetPixel(x < w ? x : x - 1, y).GetBrightness(); } - x_vector = (((sample_l - sample_r) + 1) * .9f) * 255; - y_vector = (((sample_u - sample_d) + 1) * .9f) * 255; - Color col = Color.FromArgb(255, (int)x_vector, (int)y_vector, 255); - normal.SetPixel(x < w ? x : x - 1, y, col); + using (Bitmap image = (Bitmap)Bitmap.FromFile(file)) { + #region Global Variables + int w = image.Width - 1; + int h = image.Height - 1; + float sample_l; + float sample_r; + float sample_u; + float sample_d; + float x_vector; + float y_vector; + Bitmap normal = new Bitmap(image.Width, image.Height); + #endregion + for (int y = 0; y < h; y++) { + for (int x = 0; x < w; x++) { + if (x > 0) { sample_l = image.GetPixel(x - 1, y).GetBrightness(); } else { sample_l = image.GetPixel(x < w ? x : x - 1, y).GetBrightness(); } + if (x < w) { sample_r = image.GetPixel(x + 1, y).GetBrightness(); } else { sample_r = image.GetPixel(x < w ? x : x - 1, y).GetBrightness(); } + if (y > 1) { sample_u = image.GetPixel(x < w ? x : x - 1, y - 1).GetBrightness(); } else { sample_u = image.GetPixel(x < w ? x : x - 1, y).GetBrightness(); } + if (y < h) { sample_d = image.GetPixel(x < w ? x : x - 1, y + 1).GetBrightness(); } else { sample_d = image.GetPixel(x < w ? x : x - 1, y).GetBrightness(); } + x_vector = (((sample_l - sample_r) + 1) * .5f) * 255; + y_vector = (((sample_u - sample_d) + 1) * .5f) * 255; + Color col = Color.FromArgb(255, (int)x_vector, (int)y_vector, 255); + normal.SetPixel(x < w ? x : x - 1, y, col); + } } + return normal; } - return normal; } public static Bitmap Calculate(Bitmap file) { Bitmap image = file; diff --git a/FFXIVLooseTextureCompiler/MainForm.cs b/FFXIVLooseTextureCompiler/MainForm.cs index f1cef35..76bc5e0 100644 --- a/FFXIVLooseTextureCompiler/MainForm.cs +++ b/FFXIVLooseTextureCompiler/MainForm.cs @@ -10,7 +10,6 @@ using System.Diagnostics; using System.Drawing.Imaging; using System.Linq; - namespace FFXIVLooseTextureCompiler { public partial class MainWindow : Form { FFXIVHook Hook = new FFXIVHook(); @@ -150,7 +149,11 @@ private void generateButton_Click(object sender, EventArgs e) { option = new Option((materialSets.Count > 1 ? materialSet.MaterialSetName + " " : "") + (materialSet.MaterialSetName.ToLower().Contains("eye") ? "Multi" : "Normal"), 0); option.Files.Add(materialSet.InternalNormalPath, AppendNumber(materialSet.InternalNormalPath.Replace("/", @"\"), fileCount)); group.Options.Add(option); - ExportTex(materialSet.Normal, AppendNumber(normalBodyDiskPath, fileCount++)); + if (!bakeMissingNormalsCheckbox.Checked) { + ExportTex(materialSet.Normal, AppendNumber(normalBodyDiskPath, fileCount++)); + } else { + ExportTex(materialSet.Normal, AppendNumber(normalBodyDiskPath, fileCount++), ExportType.MergeNormal, materialSet.Diffuse); + } exportProgress.Increment(1); Refresh(); } else if (!string.IsNullOrEmpty(materialSet.Diffuse) && !string.IsNullOrEmpty(materialSet.InternalNormalPath) && bakeMissingNormalsCheckbox.Checked) { @@ -173,17 +176,10 @@ private void generateButton_Click(object sender, EventArgs e) { Refresh(); Application.DoEvents(); } else if (!string.IsNullOrEmpty(materialSet.Diffuse) && !string.IsNullOrEmpty(materialSet.InternalMultiPath) && generateMultiCheckBox.Checked) { - if (!string.IsNullOrEmpty(materialSet.Normal)) { - option = new Option((materialSets.Count > 1 ? materialSet.MaterialSetName + " " : "") + (materialSet.MaterialSetName.ToLower().Contains("eye") ? "Catchlight" : "Multi"), 0); - option.Files.Add(materialSet.InternalMultiPath, AppendNumber(materialSet.InternalMultiPath.Replace("/", @"\"), fileCount)); - group.Options.Add(option); - ExportTex(materialSet.Normal, AppendNumber(multiBodyDiskPath, fileCount), materialSet.InternalDiffusePath.Contains("_fac") ? ExportType.MultiFace : ExportType.Multi); - } else if (!string.IsNullOrEmpty(materialSet.Diffuse)) { - option = new Option((materialSets.Count > 1 ? materialSet.MaterialSetName + " " : "") + (materialSet.MaterialSetName.ToLower().Contains("eye") ? "Catchlight" : "Multi"), 0); - option.Files.Add(materialSet.InternalMultiPath, AppendNumber(materialSet.InternalMultiPath.Replace("/", @"\"), fileCount)); - group.Options.Add(option); - ExportTex(materialSet.Diffuse, AppendNumber(multiBodyDiskPath, fileCount), materialSet.InternalDiffusePath.Contains("_fac") ? ExportType.MultiFace : ExportType.Multi); - } + option = new Option((materialSets.Count > 1 ? materialSet.MaterialSetName + " " : "") + (materialSet.MaterialSetName.ToLower().Contains("eye") ? "Catchlight" : "Multi"), 0); + option.Files.Add(materialSet.InternalMultiPath, AppendNumber(materialSet.InternalMultiPath.Replace("/", @"\"), fileCount)); + group.Options.Add(option); + ExportTex(materialSet.Diffuse, AppendNumber(multiBodyDiskPath, fileCount), ExportType.MultiFace); exportProgress.Increment(1); Refresh(); Application.DoEvents(); @@ -204,7 +200,11 @@ private void generateButton_Click(object sender, EventArgs e) { exportProgress.Maximum--; } if (!string.IsNullOrEmpty(materialSet.Normal) && !string.IsNullOrEmpty(materialSet.InternalNormalPath)) { - ExportTex(materialSet.Normal, AppendNumber(normalBodyDiskPath, fileCount)); + if (!bakeMissingNormalsCheckbox.Checked) { + ExportTex(materialSet.Normal, AppendNumber(normalBodyDiskPath, fileCount)); + } else { + ExportTex(materialSet.Normal, AppendNumber(normalBodyDiskPath, fileCount), ExportType.MergeNormal, materialSet.Diffuse); + } option.Files.Add(materialSet.InternalNormalPath, AppendNumber(materialSet.InternalNormalPath.Replace("/", @"\"), fileCount++)); exportProgress.Increment(1); Refresh(); @@ -224,14 +224,9 @@ private void generateButton_Click(object sender, EventArgs e) { exportProgress.Increment(1); Refresh(); Application.DoEvents(); - } else if (!string.IsNullOrEmpty(materialSet.InternalMultiPath) && generateMultiCheckBox.Checked) { - if (!string.IsNullOrEmpty(materialSet.Normal)) { - ExportTex(materialSet.Normal, AppendNumber(multiBodyDiskPath, fileCount), materialSet.InternalDiffusePath.Contains("_fac") ? ExportType.MultiFace : ExportType.Multi); - option.Files.Add(materialSet.InternalMultiPath, AppendNumber(materialSet.InternalMultiPath.Replace("/", @"\"), fileCount++)); - } else if (!string.IsNullOrEmpty(materialSet.Diffuse)) { - ExportTex(materialSet.Diffuse, AppendNumber(multiBodyDiskPath, fileCount), materialSet.InternalDiffusePath.Contains("_fac") ? ExportType.MultiFace : ExportType.Multi); - option.Files.Add(materialSet.InternalMultiPath, AppendNumber(materialSet.InternalMultiPath.Replace("/", @"\"), fileCount++)); - } + } else if (!string.IsNullOrEmpty(materialSet.Diffuse) && !string.IsNullOrEmpty(materialSet.InternalMultiPath) && generateMultiCheckBox.Checked) { + ExportTex(materialSet.Diffuse, AppendNumber(multiBodyDiskPath, fileCount), ExportType.MultiFace); + option.Files.Add(materialSet.InternalMultiPath, AppendNumber(materialSet.InternalMultiPath.Replace("/", @"\"), fileCount++)); exportProgress.Increment(1); Refresh(); Application.DoEvents(); @@ -246,7 +241,12 @@ private void generateButton_Click(object sender, EventArgs e) { ExportGroup(groupPath, group); } } - + foreach (Bitmap value in normalCache.Values) { + value.Dispose(); + } + foreach (Bitmap value in multiCache.Values) { + value.Dispose(); + } ExportJson(); ExportMeta(); if (generatedOnce) { @@ -301,11 +301,13 @@ public enum ExportType { None, Normal, Multi, - MultiFace + MultiFace, + MergeNormal } - public void ExportTex(string inputFile, string outputFile, ExportType exportType = ExportType.None) { + public void ExportTex(string inputFile, string outputFile, ExportType exportType = ExportType.None, string diffuseNormal = "") { byte[] data = new byte[0]; int contrast = 500; + int contrastFace = 100; if (inputFile.EndsWith(".png")) { switch (exportType) { case ExportType.None: @@ -319,7 +321,7 @@ public void ExportTex(string inputFile, string outputFile, ExportType exportType Graphics g = Graphics.FromImage(target); g.Clear(Color.White); g.DrawImage(bitmap, 0, 0, bitmap.Width, bitmap.Height); - Bitmap normal = Normal.Calculate(target); + Bitmap normal = Normal.Calculate(Contrast.AdjustContrast((target), 250)); normal.Save(stream, ImageFormat.Png); normalCache.Add(inputFile, normal); } @@ -330,23 +332,12 @@ public void ExportTex(string inputFile, string outputFile, ExportType exportType TextureImporter.PngToTex(stream, out data); } break; - case ExportType.Multi: - using (MemoryStream stream = new MemoryStream()) { - if (!multiCache.ContainsKey(inputFile)) { - Bitmap multi = Contrast.AdjustContrast(Grayscale.MakeGrayscale3(normalCache.ContainsKey(inputFile) ? normalCache[inputFile] : new Bitmap(inputFile)), contrast); - multi.Save(stream, ImageFormat.Png); - } else { - multiCache[inputFile].Save(stream, ImageFormat.Png); - } - stream.Position = 0; - TextureImporter.PngToTex(stream, out data); - } - break; case ExportType.MultiFace: using (MemoryStream stream = new MemoryStream()) { if (!multiCache.ContainsKey(inputFile)) { - Bitmap multi = MultiplyFilter.MultiplyImage(Contrast.AdjustContrast(Grayscale.MakeGrayscale3(normalCache.ContainsKey(inputFile) ? normalCache[inputFile] : new Bitmap(inputFile)), contrast), Color.Orange.R, Color.Orange.G, Color.Orange.B); - multi.Save(stream, ImageFormat.Png); + using (Bitmap multi = MultiplyFilter.MultiplyImage(Brightness.BrightenImage(Grayscale.MakeGrayscale3(new Bitmap(inputFile))), 255, 126, 0)) { + multi.Save(stream, ImageFormat.Png); + } } else { multiCache[inputFile].Save(stream, ImageFormat.Png); } @@ -354,27 +345,22 @@ public void ExportTex(string inputFile, string outputFile, ExportType exportType TextureImporter.PngToTex(stream, out data); } break; - - } - } else if (inputFile.EndsWith(".dds")) { - var scratch = ScratchImage.LoadDDS(inputFile); - var rgba = scratch.GetRGBA(out var f).ThrowIfError(f); - byte[] ddsFile = rgba.Pixels[..(f.Meta.Width * f.Meta.Height * f.Meta.Format.BitsPerPixel() / 8)].ToArray(); - switch (exportType) { - case ExportType.None: - TextureImporter.RgbaBytesToTex(ddsFile, f.Meta.Width, f.Meta.Height, out data); - break; - case ExportType.Normal: + case ExportType.MergeNormal: using (MemoryStream stream = new MemoryStream()) { - if (!normalCache.ContainsKey(inputFile)) { - using (Bitmap bitmap = Normal.Calculate(RGBAToBitmap(ddsFile, scratch.Meta.Width, scratch.Meta.Height))) { + if (!normalCache.ContainsKey(diffuseNormal)) { + using (Bitmap bitmap = (diffuseNormal.EndsWith(".dds") ? DDSToBitmap(diffuseNormal) : new Bitmap(diffuseNormal))) { Bitmap target = new Bitmap(bitmap.Size.Width, bitmap.Size.Height); Graphics g = Graphics.FromImage(target); g.Clear(Color.White); g.DrawImage(bitmap, 0, 0, bitmap.Width, bitmap.Height); - Bitmap normal = Normal.Calculate(target); - normal.Save(stream, ImageFormat.Png); - normalCache.Add(inputFile, normal); + Bitmap normal = Normal.Calculate(Contrast.AdjustContrast((target), 250)); + KVImage.ImageBlender imageBlender = new KVImage.ImageBlender(); + using (Bitmap originalNormal = new Bitmap(inputFile)) { + Bitmap destination = new Bitmap(originalNormal, originalNormal.Width, originalNormal.Height); + Bitmap output = imageBlender.BlendImages(originalNormal, 0, 0, originalNormal.Width, originalNormal.Height, normal, 0, 0, KVImage.ImageBlender.BlendOperation.Blend_Overlay); + output.Save(stream, ImageFormat.Png); + normalCache.Add(inputFile, output); + } } } else { normalCache[inputFile].Save(stream, ImageFormat.Png); @@ -383,30 +369,71 @@ public void ExportTex(string inputFile, string outputFile, ExportType exportType TextureImporter.PngToTex(stream, out data); } break; - case ExportType.Multi: - using (MemoryStream stream = new MemoryStream()) { - if (!multiCache.ContainsKey(inputFile)) { - Bitmap multi = Contrast.AdjustContrast(Grayscale.MakeGrayscale3(normalCache.ContainsKey(inputFile) ? normalCache[inputFile] : new Bitmap(inputFile)), contrast); - multi.Save(stream, ImageFormat.Png); - } else { - multiCache[inputFile].Save(stream, ImageFormat.Png); + } + } else if (inputFile.EndsWith(".dds")) { + using (var scratch = ScratchImage.LoadDDS(inputFile)) { + var rgba = scratch.GetRGBA(out var f).ThrowIfError(f); + byte[] ddsFile = rgba.Pixels[..(f.Meta.Width * f.Meta.Height * f.Meta.Format.BitsPerPixel() / 8)].ToArray(); + switch (exportType) { + case ExportType.None: + TextureImporter.RgbaBytesToTex(ddsFile, f.Meta.Width, f.Meta.Height, out data); + break; + case ExportType.Normal: + using (MemoryStream stream = new MemoryStream()) { + if (!normalCache.ContainsKey(inputFile)) { + using (Bitmap bitmap = RGBAToBitmap(ddsFile, scratch.Meta.Width, scratch.Meta.Height)) { + Bitmap target = new Bitmap(bitmap.Size.Width, bitmap.Size.Height); + Graphics g = Graphics.FromImage(target); + g.Clear(Color.White); + g.DrawImage(bitmap, 0, 0, bitmap.Width, bitmap.Height); + Bitmap normal = Normal.Calculate(Contrast.AdjustContrast((target), 250)); + normal.Save(stream, ImageFormat.Png); + normalCache.Add(inputFile, normal); + } + } else { + normalCache[inputFile].Save(stream, ImageFormat.Png); + } + stream.Position = 0; + TextureImporter.PngToTex(stream, out data); } - stream.Position = 0; - TextureImporter.PngToTex(stream, out data); - } - break; - case ExportType.MultiFace: - using (MemoryStream stream = new MemoryStream()) { - if (!multiCache.ContainsKey(inputFile)) { - Bitmap multi = MultiplyFilter.MultiplyImage(Contrast.AdjustContrast(Grayscale.MakeGrayscale3(normalCache.ContainsKey(inputFile) ? normalCache[inputFile] : new Bitmap(inputFile)), contrast), Color.Orange.R, Color.Orange.G, Color.Orange.B); - multi.Save(stream, ImageFormat.Png); - } else { - multiCache[inputFile].Save(stream, ImageFormat.Png); + break; + case ExportType.MultiFace: + using (MemoryStream stream = new MemoryStream()) { + if (!multiCache.ContainsKey(inputFile)) { + Bitmap multi = MultiplyFilter.MultiplyImage(Brightness.BrightenImage(Grayscale.MakeGrayscale3(RGBAToBitmap(ddsFile, scratch.Meta.Width, scratch.Meta.Height))), 255, 126, 0); + multi.Save(stream, ImageFormat.Png); + } else { + multiCache[inputFile].Save(stream, ImageFormat.Png); + } + stream.Position = 0; + TextureImporter.PngToTex(stream, out data); } - stream.Position = 0; - TextureImporter.PngToTex(stream, out data); - } - break; + break; + case ExportType.MergeNormal: + using (MemoryStream stream = new MemoryStream()) { + if (!normalCache.ContainsKey(diffuseNormal)) { + using (Bitmap bitmap = (diffuseNormal.EndsWith(".dds") ? DDSToBitmap(diffuseNormal) : new Bitmap(diffuseNormal))) { + Bitmap target = new Bitmap(bitmap.Size.Width, bitmap.Size.Height); + Graphics g = Graphics.FromImage(target); + g.Clear(Color.White); + g.DrawImage(bitmap, 0, 0, bitmap.Width, bitmap.Height); + Bitmap normal = Normal.Calculate(Contrast.AdjustContrast((target), 250)); + KVImage.ImageBlender imageBlender = new KVImage.ImageBlender(); + using (Bitmap originalNormal = RGBAToBitmap(ddsFile, scratch.Meta.Width, scratch.Meta.Height)) { + Bitmap destination = new Bitmap(originalNormal, originalNormal.Width, originalNormal.Height); + Bitmap output = imageBlender.BlendImages(originalNormal, 0, 0, originalNormal.Width, originalNormal.Height, normal, 0, 0, KVImage.ImageBlender.BlendOperation.Blend_Overlay); + output.Save(stream, ImageFormat.Png); + normalCache.Add(inputFile, output); + } + } + } else { + normalCache[inputFile].Save(stream, ImageFormat.Png); + } + stream.Position = 0; + TextureImporter.PngToTex(stream, out data); + } + break; + } } } else if (inputFile.EndsWith(".bmp")) { using (MemoryStream stream = new MemoryStream()) { @@ -418,7 +445,7 @@ public void ExportTex(string inputFile, string outputFile, ExportType exportType Graphics g = Graphics.FromImage(target); g.Clear(Color.White); g.DrawImage(bitmap, 0, 0, bitmap.Width, bitmap.Height); - Bitmap normal = Normal.Calculate(target); + Bitmap normal = Normal.Calculate(Contrast.AdjustContrast((target), 250)); normal.Save(stream, ImageFormat.Png); normalCache.Add(inputFile, normal); } @@ -434,22 +461,35 @@ public void ExportTex(string inputFile, string outputFile, ExportType exportType TextureImporter.PngToTex(stream, out data); } break; - case ExportType.Multi: + case ExportType.MultiFace: if (!multiCache.ContainsKey(inputFile)) { - Bitmap multi = Contrast.AdjustContrast(Grayscale.MakeGrayscale3(normalCache.ContainsKey(inputFile) ? normalCache[inputFile] : new Bitmap(inputFile)), contrast); - multi.Save(stream, ImageFormat.Png); + using (Bitmap multi = MultiplyFilter.MultiplyImage(Brightness.BrightenImage(Grayscale.MakeGrayscale3(new Bitmap(inputFile))), 255, 126, 0)) { + multi.Save(stream, ImageFormat.Png); + } } else { multiCache[inputFile].Save(stream, ImageFormat.Png); } stream.Position = 0; TextureImporter.PngToTex(stream, out data); break; - case ExportType.MultiFace: - if (!multiCache.ContainsKey(inputFile)) { - Bitmap multi = MultiplyFilter.MultiplyImage(Contrast.AdjustContrast(Grayscale.MakeGrayscale3(normalCache.ContainsKey(inputFile) ? normalCache[inputFile] : new Bitmap(inputFile)), contrast), Color.Orange.R, Color.Orange.G, Color.Orange.B); - multi.Save(stream, ImageFormat.Png); + case ExportType.MergeNormal: + if (!normalCache.ContainsKey(diffuseNormal)) { + using (Bitmap bitmap = (diffuseNormal.EndsWith(".dds") ? DDSToBitmap(diffuseNormal) : new Bitmap(diffuseNormal))) { + Bitmap target = new Bitmap(bitmap.Size.Width, bitmap.Size.Height); + Graphics g = Graphics.FromImage(target); + g.Clear(Color.White); + g.DrawImage(bitmap, 0, 0, bitmap.Width, bitmap.Height); + Bitmap normal = Normal.Calculate(Contrast.AdjustContrast((target), 250)); + KVImage.ImageBlender imageBlender = new KVImage.ImageBlender(); + using (Bitmap originalNormal = new Bitmap(inputFile)) { + Bitmap destination = new Bitmap(originalNormal, originalNormal.Width, originalNormal.Height); + Bitmap output = imageBlender.BlendImages(originalNormal, 0, 0, originalNormal.Width, originalNormal.Height, normal, 0, 0, KVImage.ImageBlender.BlendOperation.Blend_Overlay); + output.Save(stream, ImageFormat.Png); + normalCache.Add(inputFile, output); + } + } } else { - multiCache[inputFile].Save(stream, ImageFormat.Png); + normalCache[inputFile].Save(stream, ImageFormat.Png); } stream.Position = 0; TextureImporter.PngToTex(stream, out data); @@ -462,6 +502,13 @@ public void ExportTex(string inputFile, string outputFile, ExportType exportType Directory.CreateDirectory(Path.GetDirectoryName(outputFile)); File.WriteAllBytes(outputFile, data); } + public Bitmap DDSToBitmap(string inputFile) { + using (var scratch = ScratchImage.LoadDDS(inputFile)) { + var rgba = scratch.GetRGBA(out var f).ThrowIfError(f); + byte[] ddsFile = rgba.Pixels[..(f.Meta.Width * f.Meta.Height * f.Meta.Format.BitsPerPixel() / 8)].ToArray(); + return RGBAToBitmap(ddsFile, scratch.Meta.Width, scratch.Meta.Height); + } + } private void ExportJson() { string jsonText = @"{ ""Name"": """", diff --git a/FFXIVLooseTextureCompiler/Penumbra/TextureImporter.cs b/FFXIVLooseTextureCompiler/Penumbra/TextureImporter.cs index 1d88b99..8b61b28 100644 --- a/FFXIVLooseTextureCompiler/Penumbra/TextureImporter.cs +++ b/FFXIVLooseTextureCompiler/Penumbra/TextureImporter.cs @@ -41,28 +41,30 @@ public static bool RgbaBytesToTex(byte[] rgba, int width, int height, out byte[] } public static bool PngToTex(string inputFile, out byte[] texData) { - using var file = File.OpenRead(inputFile); - var image = SixLabors.ImageSharp.Image.Load(file); + using (var file = File.OpenRead(inputFile)) { + var image = SixLabors.ImageSharp.Image.Load(file); - var buffer = new byte[80 + image.Height * image.Width * 4]; - WriteHeader(buffer, image.Width, image.Height); + var buffer = new byte[80 + image.Height * image.Width * 4]; + WriteHeader(buffer, image.Width, image.Height); - var span = new Span(buffer, 80, buffer.Length - 80); - image.CopyPixelDataTo(span); + var span = new Span(buffer, 80, buffer.Length - 80); + image.CopyPixelDataTo(span); - texData = buffer; - return true; + texData = buffer; + return true; + } } public static bool PngToTex(Stream file, out byte[] texData) { - var image = SixLabors.ImageSharp.Image.Load(file); + using (var image = SixLabors.ImageSharp.Image.Load(file)) { - var buffer = new byte[80 + image.Height * image.Width * 4]; - WriteHeader(buffer, image.Width, image.Height); + var buffer = new byte[80 + image.Height * image.Width * 4]; + WriteHeader(buffer, image.Width, image.Height); - var span = new Span(buffer, 80, buffer.Length - 80); - image.CopyPixelDataTo(span); + var span = new Span(buffer, 80, buffer.Length - 80); + image.CopyPixelDataTo(span); - texData = buffer; - return true; + texData = buffer; + return true; + } } } \ No newline at end of file diff --git a/FFXIVLooseTextureCompiler/obj/Debug/net7.0-windows/FFXIVLooseTextureCompiler.AssemblyInfo.cs b/FFXIVLooseTextureCompiler/obj/Debug/net7.0-windows/FFXIVLooseTextureCompiler.AssemblyInfo.cs index ba8cbbc..8140758 100644 --- a/FFXIVLooseTextureCompiler/obj/Debug/net7.0-windows/FFXIVLooseTextureCompiler.AssemblyInfo.cs +++ b/FFXIVLooseTextureCompiler/obj/Debug/net7.0-windows/FFXIVLooseTextureCompiler.AssemblyInfo.cs @@ -14,11 +14,11 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("FFXIVLooseTextureCompiler")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyCopyrightAttribute("Lawener Industries")] -[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.6")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.7")] [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0.6")] [assembly: System.Reflection.AssemblyProductAttribute("FFXIVLooseTextureCompiler")] [assembly: System.Reflection.AssemblyTitleAttribute("FFXIVLooseTextureCompiler")] -[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.6")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.7")] [assembly: System.Reflection.AssemblyMetadataAttribute("RepositoryUrl", "https://github.com/Sebane1/FFXIVLooseTextureCompiler")] [assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] [assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] diff --git a/FFXIVLooseTextureCompiler/obj/Debug/net7.0-windows/FFXIVLooseTextureCompiler.AssemblyInfoInputs.cache b/FFXIVLooseTextureCompiler/obj/Debug/net7.0-windows/FFXIVLooseTextureCompiler.AssemblyInfoInputs.cache index 143fa28..6be1637 100644 --- a/FFXIVLooseTextureCompiler/obj/Debug/net7.0-windows/FFXIVLooseTextureCompiler.AssemblyInfoInputs.cache +++ b/FFXIVLooseTextureCompiler/obj/Debug/net7.0-windows/FFXIVLooseTextureCompiler.AssemblyInfoInputs.cache @@ -1 +1 @@ -d4b5202897321387948149abb50e4352fe778571 +5b9703ab5b07fe302bf1dde4b6c4101bb1a28263 diff --git a/FFXIVLooseTextureCompiler/obj/Debug/net7.0-windows/FFXIVLooseTextureCompiler.csproj.CoreCompileInputs.cache b/FFXIVLooseTextureCompiler/obj/Debug/net7.0-windows/FFXIVLooseTextureCompiler.csproj.CoreCompileInputs.cache index 1ada21a..8d73927 100644 --- a/FFXIVLooseTextureCompiler/obj/Debug/net7.0-windows/FFXIVLooseTextureCompiler.csproj.CoreCompileInputs.cache +++ b/FFXIVLooseTextureCompiler/obj/Debug/net7.0-windows/FFXIVLooseTextureCompiler.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -a0d470aac4162d1ef26eeabd2424646ae63ceb5a +673214fd68cad8274432c095ac431d29ecd2ed7c diff --git a/FFXIVLooseTextureCompiler/obj/Debug/net7.0-windows/FFXIVLooseTextureCompiler.csproj.GenerateResource.cache b/FFXIVLooseTextureCompiler/obj/Debug/net7.0-windows/FFXIVLooseTextureCompiler.csproj.GenerateResource.cache index 2f3a44aec9524b85c3ce57d7f614f51f36e916bb..4fc04d6cc56c8d85df754e75da76f1e2d40c3087 100644 GIT binary patch delta 15 WcmdnOw1sIxB5V0HHz$ROY3Beerv=>r delta 15 XcmdnOw1sIxB5Ta-edZz))6M|^E?WjD diff --git a/FFXIVLooseTextureCompiler/obj/Debug/net7.0-windows/FFXIVLooseTextureCompiler.dll b/FFXIVLooseTextureCompiler/obj/Debug/net7.0-windows/FFXIVLooseTextureCompiler.dll index 76fab05c900236990b14f3ba155bb6515c88692e..7351460d3acbe77a0eaa491a86035896c04d2399 100644 GIT binary patch delta 79919 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 Z>fYUAbyd#I2ERkwF}UuV-umC={{e8fLVW-L diff --git a/FFXIVLooseTextureCompiler/obj/Debug/net7.0-windows/FFXIVLooseTextureCompiler.pdb b/FFXIVLooseTextureCompiler/obj/Debug/net7.0-windows/FFXIVLooseTextureCompiler.pdb index 0f7d3d4e783b61510e6b06be858747f87a9f6139..7478c913b9f978c39df7039f6c4aff0d9120b55c 100644 GIT binary patch delta 21385 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 delta 16346 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 diff --git a/FFXIVLooseTextureCompiler/obj/Debug/net7.0-windows/apphost.exe b/FFXIVLooseTextureCompiler/obj/Debug/net7.0-windows/apphost.exe index 13022e609309d370600568f819ad4910b10f5685..2dc340be612bd7bd537c253379c37bcb2ec40229 100644 GIT binary patch delta 56 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 diff --git a/FFXIVLooseTextureCompiler/obj/Debug/net7.0-windows/refint/FFXIVLooseTextureCompiler.dll b/FFXIVLooseTextureCompiler/obj/Debug/net7.0-windows/refint/FFXIVLooseTextureCompiler.dll index 4e18723ac51e9a4df0202fa2ccbfce4ec3a1cc85..7f563e7b21b90917db64b8631fbc00b9afa6911d 100644 GIT binary patch delta 15473 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