Skip to content

Commit abc5d7e

Browse files
committed
Merge branch 'colorset_editor' into develop
2 parents 8a0629c + c2aa684 commit abc5d7e

File tree

7 files changed

+243
-36
lines changed

7 files changed

+243
-36
lines changed

xivModdingFramework/Materials/DataContainers/XivMtrl.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public class XivMtrl
6262
/// </remarks>
6363
public ushort ColorSetDataSize { get {
6464
var size = ColorSetData.Count * 2;
65-
size += ColorSetExtraData == null ? 0 : ColorSetExtraData.Length;
65+
size += ColorSetDyeData == null ? 0 : ColorSetDyeData.Length;
6666
return (ushort) size;
6767
} }
6868

@@ -168,7 +168,7 @@ public ushort ColorSetDataSize { get {
168168
/// <summary>
169169
/// The byte array containing the extra ColorSet data
170170
/// </summary>
171-
public byte[] ColorSetExtraData { get; set; }
171+
public byte[] ColorSetDyeData { get; set; }
172172

173173
/// <summary>
174174
/// The size of the additional MTRL Data
@@ -534,17 +534,17 @@ public void SetShaderInfo(ShaderInfo info, bool forced = false)
534534
// ColorSetCount seems to always be 1, even when the data is empty.
535535
ColorSetCount = 1;
536536
ColorSetData = new List<Half>();
537-
ColorSetExtraData = null;
537+
ColorSetDyeData = null;
538538
} else
539539
{
540540
if(ColorSetCount == 0 || ColorSetData == null || ColorSetData.Count != 256)
541541
{
542542
// Get default Colorset Data.
543543
ColorSetData = Tex.GetColorsetDataFromDDS(Tex.GetDefaultTexturePath(XivTexType.ColorSet));
544544
}
545-
if(ColorSetExtraData == null || ColorSetExtraData.Length != 32)
545+
if(ColorSetDyeData == null || ColorSetDyeData.Length != 32)
546546
{
547-
ColorSetExtraData = Tex.GetColorsetExtraDataFromDDS(Tex.GetDefaultTexturePath(XivTexType.ColorSet));
547+
ColorSetDyeData = Tex.GetColorsetExtraDataFromDDS(Tex.GetDefaultTexturePath(XivTexType.ColorSet));
548548
}
549549
}
550550

xivModdingFramework/Materials/FileTypes/Mtrl.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -542,7 +542,7 @@ await Task.Run((Func<Task>)(async () =>
542542
xivMtrl.Unknown2 = br.ReadBytes(xivMtrl.UnknownDataSize);
543543

544544
xivMtrl.ColorSetData = new List<Half>();
545-
xivMtrl.ColorSetExtraData = null;
545+
xivMtrl.ColorSetDyeData = null;
546546
if (colorSetDataSize > 0)
547547
{
548548
// Color Data is always 512 (6 x 14 = 64 x 8bpp = 512)
@@ -556,7 +556,7 @@ await Task.Run((Func<Task>)(async () =>
556556
// If the color set is 544 in length, it has an extra 32 bytes at the end
557557
if (colorSetDataSize == 544)
558558
{
559-
xivMtrl.ColorSetExtraData = br.ReadBytes(32);
559+
xivMtrl.ColorSetDyeData = br.ReadBytes(32);
560560
}
561561
}
562562

@@ -681,7 +681,7 @@ public Task<XivTex> MtrlToXivTex(XivMtrl xivMtrl, TexTypePath ttp)
681681
/// <param name="race">The selected race for the item</param>
682682
public void SaveColorSetExtraData(IItem item, XivMtrl xivMtrl, DirectoryInfo saveDirectory, XivRace race)
683683
{
684-
var toWrite = xivMtrl.ColorSetExtraData != null ? xivMtrl.ColorSetExtraData : new byte[32];
684+
var toWrite = xivMtrl.ColorSetDyeData != null ? xivMtrl.ColorSetDyeData : new byte[32];
685685
var path = IOUtil.MakeItemSavePath(item, saveDirectory, race);
686686

687687
Directory.CreateDirectory(path);
@@ -868,7 +868,7 @@ public byte[] CreateMtrlFile(XivMtrl xivMtrl, IItem item)
868868

869869
if (xivMtrl.ColorSetDataSize == 544)
870870
{
871-
mtrlBytes.AddRange(xivMtrl.ColorSetExtraData);
871+
mtrlBytes.AddRange(xivMtrl.ColorSetDyeData);
872872
}
873873

874874

xivModdingFramework/Materials/FileTypes/STM.cs

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ public static async Task<StainingTemplateFile> GetStainingTemplateFile(bool forc
4040

4141
public static async Task SaveStainingTemplateFile(StainingTemplateFile file, string applicationSource, IndexFile index = null, ModList modlist = null)
4242
{
43+
throw new NotImplementedException();
4344
var data = new byte[0];//file.GetBytes();
4445

4546
var _dat = new Dat(XivCache.GameInfo.GameDirectory);
@@ -64,19 +65,11 @@ public enum StainingTemplateArrayType
6465

6566
public class StainingTemplateEntry
6667
{
67-
public int Size
68-
{
69-
get
70-
{
71-
return 0;
72-
}
73-
}
74-
75-
List<Half[]> DiffuseEntries = new List<Half[]>();
76-
List<Half[]> SpecularEntries = new List<Half[]>();
77-
List<Half[]> EmissiveEntries = new List<Half[]>();
78-
List<Half> TileMaterialEntries = new List<Half>();
79-
List<Half> GlossEntries = new List<Half>();
68+
public readonly List<Half[]> DiffuseEntries = new List<Half[]>();
69+
public readonly List<Half[]> SpecularEntries = new List<Half[]>();
70+
public readonly List<Half[]> EmissiveEntries = new List<Half[]>();
71+
public readonly List<Half> TileMaterialEntries = new List<Half>();
72+
public readonly List<Half> GlossEntries = new List<Half>();
8073

8174
public StainingTemplateEntry(byte[] data, int offset)
8275
{
@@ -243,7 +236,11 @@ public void SetTemplate(ushort key, StainingTemplateEntry entry)
243236
}
244237
public StainingTemplateEntry GetTemplate(ushort key)
245238
{
246-
return Templates[key];
239+
if (Templates.ContainsKey(key))
240+
{
241+
return Templates[key];
242+
}
243+
return null;
247244
}
248245
public StainingTemplateFile(byte[] data)
249246
{

xivModdingFramework/SqPack/FileTypes/Dat.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1052,7 +1052,8 @@ await Task.Run(async () =>
10521052
var headerLength = br.ReadInt32();
10531053
var fileType = br.ReadInt32();
10541054
var uncompressedFileSize = br.ReadInt32();
1055-
br.ReadBytes(8);
1055+
var ikd1 = br.ReadInt32();
1056+
var ikd2 = br.ReadInt32();
10561057
xivTex.MipMapCount = br.ReadInt32();
10571058

10581059
var endOfHeader = offset + headerLength;
@@ -1063,6 +1064,9 @@ await Task.Run(async () =>
10631064
xivTex.TextureFormat = TextureTypeDictionary[br.ReadInt32()];
10641065
xivTex.Width = br.ReadInt16();
10651066
xivTex.Height = br.ReadInt16();
1067+
var pos = br.BaseStream.Position;
1068+
xivTex.Layers = br.ReadInt16();
1069+
var imageCount2 = br.ReadInt16();
10661070

10671071
for (int i = 0, j = 0; i < xivTex.MipMapCount; i++)
10681072
{

xivModdingFramework/Textures/DataContainers/XivTex.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ public class XivTex
3838
/// </summary>
3939
public int Height { get; set; }
4040

41+
/// <summary>
42+
/// Number of layers in the in the texture file.
43+
/// </summary>
44+
public int Layers { get; set; }
45+
4146
/// <summary>
4247
/// The amount of mipmaps the texture contains
4348
/// </summary>

xivModdingFramework/Textures/FileTypes/DDS.cs

Lines changed: 192 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,37 @@ public static void MakeDDS(XivTex xivTex, string savePath)
5454
case XivTexType.Icon:
5555
default:
5656
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);
5864
break;
5965
}
6066

6167
File.WriteAllBytes(savePath, DDS.ToArray());
6268
}
6369

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+
6488
/// <summary>
6589
/// Creates the DDS header for given texture data.
6690
/// <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)
80104
header.AddRange(BitConverter.GetBytes(dwSize));
81105

82106
// 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+
}
84112
header.AddRange(BitConverter.GetBytes(dwFlags));
85113

86114
// Surface height (in pixels).
@@ -175,6 +203,13 @@ private static byte[] CreateDDSHeader(XivTex xivTex)
175203
default:
176204
return null;
177205
}
206+
207+
if(xivTex.Layers > 1)
208+
{
209+
var bytes = System.Text.Encoding.UTF8.GetBytes("DX10");
210+
dwFourCC = BitConverter.ToUInt32(bytes, 0);
211+
}
212+
178213
header.AddRange(BitConverter.GetBytes(dwFourCC));
179214

180215
switch (xivTex.TextureFormat)
@@ -326,6 +361,35 @@ private static byte[] CreateDDSHeader(XivTex xivTex)
326361
}
327362
}
328363

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+
329393
return header.ToArray();
330394
}
331395

@@ -542,5 +606,131 @@ private static byte[] CreateColorDDSHeader()
542606

543607
return (compressedDDS, mipPartOffsets, mipPartCount);
544608
}
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+
};
545735
}
546736
}

0 commit comments

Comments
 (0)