@@ -54,13 +54,37 @@ public static void MakeDDS(XivTex xivTex, string savePath)
54
54
case XivTexType . Icon :
55
55
default :
56
56
DDS . AddRange ( CreateDDSHeader ( xivTex ) ) ;
57
- DDS . AddRange ( xivTex . TexData ) ;
57
+
58
+ var data = xivTex . TexData ;
59
+ if ( xivTex . TextureFormat == XivTexFormat . A8R8G8B8 && xivTex . Layers > 1 )
60
+ {
61
+ data = ShiftLayers ( data ) ;
62
+ }
63
+ DDS . AddRange ( data ) ;
58
64
break ;
59
65
}
60
66
61
67
File . WriteAllBytes ( savePath , DDS . ToArray ( ) ) ;
62
68
}
63
69
70
+ // This is a simple shift of the layers around in order to convert ARGB to RGBA
71
+ private static byte [ ] ShiftLayers ( byte [ ] data )
72
+ {
73
+ for ( int i = 0 ; i < data . Length ; i += 4 )
74
+ {
75
+ var alpha = data [ i ] ;
76
+ var red = data [ i + 1 ] ;
77
+ var green = data [ i + 2 ] ;
78
+ var blue = data [ i + 3 ] ;
79
+
80
+ data [ i ] = red ;
81
+ data [ i + 1 ] = green ;
82
+ data [ i + 2 ] = blue ;
83
+ data [ i + 3 ] = alpha ;
84
+ }
85
+ return data ;
86
+ }
87
+
64
88
/// <summary>
65
89
/// Creates the DDS header for given texture data.
66
90
/// <see cref="https://msdn.microsoft.com/en-us/library/windows/desktop/bb943982(v=vs.85).aspx"/>
@@ -80,7 +104,11 @@ private static byte[] CreateDDSHeader(XivTex xivTex)
80
104
header . AddRange ( BitConverter . GetBytes ( dwSize ) ) ;
81
105
82
106
// Flags to indicate which members contain valid data.
83
- const uint dwFlags = 528391 ;
107
+ uint dwFlags = 528391 ;
108
+ if ( xivTex . Layers > 1 )
109
+ {
110
+ dwFlags = 0x00000004 ;
111
+ }
84
112
header . AddRange ( BitConverter . GetBytes ( dwFlags ) ) ;
85
113
86
114
// Surface height (in pixels).
@@ -175,6 +203,13 @@ private static byte[] CreateDDSHeader(XivTex xivTex)
175
203
default :
176
204
return null ;
177
205
}
206
+
207
+ if ( xivTex . Layers > 1 )
208
+ {
209
+ var bytes = System . Text . Encoding . UTF8 . GetBytes ( "DX10" ) ;
210
+ dwFourCC = BitConverter . ToUInt32 ( bytes , 0 ) ;
211
+ }
212
+
178
213
header . AddRange ( BitConverter . GetBytes ( dwFourCC ) ) ;
179
214
180
215
switch ( xivTex . TextureFormat )
@@ -326,6 +361,35 @@ private static byte[] CreateDDSHeader(XivTex xivTex)
326
361
}
327
362
}
328
363
364
+ // Need to write DX10 header here.
365
+ if ( xivTex . Layers > 1 )
366
+ {
367
+ // DXGI_FORMAT dxgiFormat
368
+ uint dxgiFormat = 0 ;
369
+ if ( xivTex . TextureFormat == XivTexFormat . DXT1 ) {
370
+ dxgiFormat = ( uint ) DXGI_FORMAT . DXGI_FORMAT_BC1_UNORM ;
371
+ } else if ( xivTex . TextureFormat == XivTexFormat . DXT5 )
372
+ {
373
+ dxgiFormat = ( uint ) DXGI_FORMAT . DXGI_FORMAT_BC3_UNORM ;
374
+ } else {
375
+ dxgiFormat = ( uint ) DXGI_FORMAT . DXGI_FORMAT_R8G8B8A8_UNORM ;
376
+ }
377
+ header . AddRange ( BitConverter . GetBytes ( dxgiFormat ) ) ;
378
+
379
+ // D3D10_RESOURCE_DIMENSION resourceDimension
380
+ header . AddRange ( BitConverter . GetBytes ( ( int ) 3 ) ) ;
381
+
382
+
383
+ // UINT miscFlag
384
+ header . AddRange ( BitConverter . GetBytes ( ( int ) 0 ) ) ;
385
+
386
+ // UINT arraySize
387
+ header . AddRange ( BitConverter . GetBytes ( xivTex . Layers ) ) ;
388
+
389
+ // UINT miscFlags2
390
+ header . AddRange ( BitConverter . GetBytes ( ( int ) 0 ) ) ;
391
+ }
392
+
329
393
return header . ToArray ( ) ;
330
394
}
331
395
@@ -542,5 +606,131 @@ private static byte[] CreateColorDDSHeader()
542
606
543
607
return ( compressedDDS , mipPartOffsets , mipPartCount ) ;
544
608
}
609
+
610
+ public enum DXGI_FORMAT : uint
611
+ {
612
+ DXGI_FORMAT_UNKNOWN ,
613
+ DXGI_FORMAT_R32G32B32A32_TYPELESS ,
614
+ DXGI_FORMAT_R32G32B32A32_FLOAT ,
615
+ DXGI_FORMAT_R32G32B32A32_UINT ,
616
+ DXGI_FORMAT_R32G32B32A32_SINT ,
617
+ DXGI_FORMAT_R32G32B32_TYPELESS ,
618
+ DXGI_FORMAT_R32G32B32_FLOAT ,
619
+ DXGI_FORMAT_R32G32B32_UINT ,
620
+ DXGI_FORMAT_R32G32B32_SINT ,
621
+ DXGI_FORMAT_R16G16B16A16_TYPELESS ,
622
+ DXGI_FORMAT_R16G16B16A16_FLOAT ,
623
+ DXGI_FORMAT_R16G16B16A16_UNORM ,
624
+ DXGI_FORMAT_R16G16B16A16_UINT ,
625
+ DXGI_FORMAT_R16G16B16A16_SNORM ,
626
+ DXGI_FORMAT_R16G16B16A16_SINT ,
627
+ DXGI_FORMAT_R32G32_TYPELESS ,
628
+ DXGI_FORMAT_R32G32_FLOAT ,
629
+ DXGI_FORMAT_R32G32_UINT ,
630
+ DXGI_FORMAT_R32G32_SINT ,
631
+ DXGI_FORMAT_R32G8X24_TYPELESS ,
632
+ DXGI_FORMAT_D32_FLOAT_S8X24_UINT ,
633
+ DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS ,
634
+ DXGI_FORMAT_X32_TYPELESS_G8X24_UINT ,
635
+ DXGI_FORMAT_R10G10B10A2_TYPELESS ,
636
+ DXGI_FORMAT_R10G10B10A2_UNORM ,
637
+ DXGI_FORMAT_R10G10B10A2_UINT ,
638
+ DXGI_FORMAT_R11G11B10_FLOAT ,
639
+ DXGI_FORMAT_R8G8B8A8_TYPELESS ,
640
+ DXGI_FORMAT_R8G8B8A8_UNORM ,
641
+ DXGI_FORMAT_R8G8B8A8_UNORM_SRGB ,
642
+ DXGI_FORMAT_R8G8B8A8_UINT ,
643
+ DXGI_FORMAT_R8G8B8A8_SNORM ,
644
+ DXGI_FORMAT_R8G8B8A8_SINT ,
645
+ DXGI_FORMAT_R16G16_TYPELESS ,
646
+ DXGI_FORMAT_R16G16_FLOAT ,
647
+ DXGI_FORMAT_R16G16_UNORM ,
648
+ DXGI_FORMAT_R16G16_UINT ,
649
+ DXGI_FORMAT_R16G16_SNORM ,
650
+ DXGI_FORMAT_R16G16_SINT ,
651
+ DXGI_FORMAT_R32_TYPELESS ,
652
+ DXGI_FORMAT_D32_FLOAT ,
653
+ DXGI_FORMAT_R32_FLOAT ,
654
+ DXGI_FORMAT_R32_UINT ,
655
+ DXGI_FORMAT_R32_SINT ,
656
+ DXGI_FORMAT_R24G8_TYPELESS ,
657
+ DXGI_FORMAT_D24_UNORM_S8_UINT ,
658
+ DXGI_FORMAT_R24_UNORM_X8_TYPELESS ,
659
+ DXGI_FORMAT_X24_TYPELESS_G8_UINT ,
660
+ DXGI_FORMAT_R8G8_TYPELESS ,
661
+ DXGI_FORMAT_R8G8_UNORM ,
662
+ DXGI_FORMAT_R8G8_UINT ,
663
+ DXGI_FORMAT_R8G8_SNORM ,
664
+ DXGI_FORMAT_R8G8_SINT ,
665
+ DXGI_FORMAT_R16_TYPELESS ,
666
+ DXGI_FORMAT_R16_FLOAT ,
667
+ DXGI_FORMAT_D16_UNORM ,
668
+ DXGI_FORMAT_R16_UNORM ,
669
+ DXGI_FORMAT_R16_UINT ,
670
+ DXGI_FORMAT_R16_SNORM ,
671
+ DXGI_FORMAT_R16_SINT ,
672
+ DXGI_FORMAT_R8_TYPELESS ,
673
+ DXGI_FORMAT_R8_UNORM ,
674
+ DXGI_FORMAT_R8_UINT ,
675
+ DXGI_FORMAT_R8_SNORM ,
676
+ DXGI_FORMAT_R8_SINT ,
677
+ DXGI_FORMAT_A8_UNORM ,
678
+ DXGI_FORMAT_R1_UNORM ,
679
+ DXGI_FORMAT_R9G9B9E5_SHAREDEXP ,
680
+ DXGI_FORMAT_R8G8_B8G8_UNORM ,
681
+ DXGI_FORMAT_G8R8_G8B8_UNORM ,
682
+ DXGI_FORMAT_BC1_TYPELESS ,
683
+ DXGI_FORMAT_BC1_UNORM ,
684
+ DXGI_FORMAT_BC1_UNORM_SRGB ,
685
+ DXGI_FORMAT_BC2_TYPELESS ,
686
+ DXGI_FORMAT_BC2_UNORM ,
687
+ DXGI_FORMAT_BC2_UNORM_SRGB ,
688
+ DXGI_FORMAT_BC3_TYPELESS ,
689
+ DXGI_FORMAT_BC3_UNORM ,
690
+ DXGI_FORMAT_BC3_UNORM_SRGB ,
691
+ DXGI_FORMAT_BC4_TYPELESS ,
692
+ DXGI_FORMAT_BC4_UNORM ,
693
+ DXGI_FORMAT_BC4_SNORM ,
694
+ DXGI_FORMAT_BC5_TYPELESS ,
695
+ DXGI_FORMAT_BC5_UNORM ,
696
+ DXGI_FORMAT_BC5_SNORM ,
697
+ DXGI_FORMAT_B5G6R5_UNORM ,
698
+ DXGI_FORMAT_B5G5R5A1_UNORM ,
699
+ DXGI_FORMAT_B8G8R8A8_UNORM ,
700
+ DXGI_FORMAT_B8G8R8X8_UNORM ,
701
+ DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM ,
702
+ DXGI_FORMAT_B8G8R8A8_TYPELESS ,
703
+ DXGI_FORMAT_B8G8R8A8_UNORM_SRGB ,
704
+ DXGI_FORMAT_B8G8R8X8_TYPELESS ,
705
+ DXGI_FORMAT_B8G8R8X8_UNORM_SRGB ,
706
+ DXGI_FORMAT_BC6H_TYPELESS ,
707
+ DXGI_FORMAT_BC6H_UF16 ,
708
+ DXGI_FORMAT_BC6H_SF16 ,
709
+ DXGI_FORMAT_BC7_TYPELESS ,
710
+ DXGI_FORMAT_BC7_UNORM ,
711
+ DXGI_FORMAT_BC7_UNORM_SRGB ,
712
+ DXGI_FORMAT_AYUV ,
713
+ DXGI_FORMAT_Y410 ,
714
+ DXGI_FORMAT_Y416 ,
715
+ DXGI_FORMAT_NV12 ,
716
+ DXGI_FORMAT_P010 ,
717
+ DXGI_FORMAT_P016 ,
718
+ DXGI_FORMAT_420_OPAQUE ,
719
+ DXGI_FORMAT_YUY2 ,
720
+ DXGI_FORMAT_Y210 ,
721
+ DXGI_FORMAT_Y216 ,
722
+ DXGI_FORMAT_NV11 ,
723
+ DXGI_FORMAT_AI44 ,
724
+ DXGI_FORMAT_IA44 ,
725
+ DXGI_FORMAT_P8 ,
726
+ DXGI_FORMAT_A8P8 ,
727
+ DXGI_FORMAT_B4G4R4A4_UNORM ,
728
+ DXGI_FORMAT_P208 ,
729
+ DXGI_FORMAT_V208 ,
730
+ DXGI_FORMAT_V408 ,
731
+ DXGI_FORMAT_SAMPLER_FEEDBACK_MIN_MIP_OPAQUE ,
732
+ DXGI_FORMAT_SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE ,
733
+ DXGI_FORMAT_FORCE_UINT
734
+ } ;
545
735
}
546
736
}
0 commit comments