Skip to content

Commit d3d5304

Browse files
committed
Implemented Texture set
Excluded Cells, Worldspaces and Dialog from XML to speed up the process
1 parent 98b0a88 commit d3d5304

8 files changed

Lines changed: 266 additions & 236 deletions

File tree

ESPSharp/ESPSharp.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@
7878
<Compile Include="Subrecords\FormArray.cs" />
7979
<Compile Include="Subrecords\ObjectBounds.cs" />
8080
<Compile Include="Subrecords\PluginHeader.cs" />
81-
<Compile Include="Subrecords\SimpleSubrecord.cs" />
8281
<Compile Include="Subrecords\UndecodedSubrecord.cs" />
8382
<Compile Include="Utility.cs" />
8483
<Compile Include="Zlib.cs" />

ESPSharp/ElderScrollsPlugin.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public void WriteXML(string destinationFolder)
1717
{
1818
Header.WriteXML(Path.Combine(destinationFolder, "Header.xml"));
1919

20-
foreach (Group group in Groups)
20+
foreach (Group group in Groups.Where(g => g.ToString() != "Interior Cells" && g.ToString() != "Worldspaces" && g.ToString() != "Dialog Topics"))
2121
{
2222
string newDir = Path.Combine(destinationFolder, group.ToString());
2323
Directory.CreateDirectory(newDir);

ESPSharp/Record.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,9 @@ public static Record CreateRecord(string Tag)
192192
case "GMST":
193193
outRecord = new GameSetting();
194194
break;
195+
case "TXST":
196+
outRecord = new TextureSet();
197+
break;
195198
default:
196199
outRecord = new GenericRecord();
197200
break;

ESPSharp/Records/TextureSet.cs

Lines changed: 179 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Linq;
44
using System.Text;
55
using System.Threading.Tasks;
6+
using System.Xml.Linq;
67

78
namespace ESPSharp
89
{
@@ -16,28 +17,198 @@ public class TextureSet : Record, IEditorID
1617
public string GlowMap { get; set; }
1718
public string ParallaxMap { get; set; }
1819
public string EnvironmentMap { get; set; }
19-
20-
20+
public DecalData DecalData { get; set; }
21+
public TXSTFlags Flags { get; set; }
2122

2223

2324
public override void ReadData(ESPReader reader, long dataEnd)
2425
{
25-
throw new NotImplementedException();
26+
while (reader.BaseStream.Position < dataEnd)
27+
{
28+
string subTag = reader.PeekTag();
29+
30+
switch (subTag)
31+
{
32+
case "EDID":
33+
EditorID = reader.ReadSimpleSubrecord<string>();
34+
break;
35+
case "OBND":
36+
if (ObjectBounds == null)
37+
ObjectBounds = new ObjectBounds();
38+
39+
ObjectBounds.ReadBinary(reader);
40+
break;
41+
case "TX00":
42+
BaseImage_Transparency = reader.ReadSimpleSubrecord<string>();
43+
break;
44+
case "TX01":
45+
NormalMap_Specular = reader.ReadSimpleSubrecord<string>();
46+
break;
47+
case "TX02":
48+
EnvironmentMapMask = reader.ReadSimpleSubrecord<string>();
49+
break;
50+
case "TX03":
51+
GlowMap = reader.ReadSimpleSubrecord<string>();
52+
break;
53+
case "TX04":
54+
ParallaxMap = reader.ReadSimpleSubrecord<string>();
55+
break;
56+
case "TX05":
57+
EnvironmentMap = reader.ReadSimpleSubrecord<string>();
58+
break;
59+
case "DODT":
60+
if (DecalData == null)
61+
DecalData = new DecalData();
62+
63+
DecalData.ReadBinary(reader);
64+
break;
65+
case "DNAM":
66+
Flags = (TXSTFlags)reader.ReadSimpleSubrecord<UInt16>();
67+
break;
68+
default:
69+
throw new Exception();
70+
}
71+
}
2672
}
2773

2874
public override void WriteData(ESPWriter writer)
2975
{
30-
throw new NotImplementedException();
76+
if (EditorID != null)
77+
writer.WriteSimpleSubrecord<string>(EditorID, "EDID");
78+
79+
if (ObjectBounds != null)
80+
ObjectBounds.WriteBinary(writer);
81+
82+
if (BaseImage_Transparency != null)
83+
writer.WriteSimpleSubrecord<string>(BaseImage_Transparency, "TX00");
84+
85+
if (NormalMap_Specular != null)
86+
writer.WriteSimpleSubrecord<string>(NormalMap_Specular, "TX01");
87+
88+
if (EnvironmentMapMask != null)
89+
writer.WriteSimpleSubrecord<string>(EnvironmentMapMask, "TX02");
90+
91+
if (GlowMap != null)
92+
writer.WriteSimpleSubrecord<string>(GlowMap, "TX03");
93+
94+
if (ParallaxMap != null)
95+
writer.WriteSimpleSubrecord<string>(ParallaxMap, "TX04");
96+
97+
if (EnvironmentMap != null)
98+
writer.WriteSimpleSubrecord<string>(EnvironmentMap, "TX05");
99+
100+
if (DecalData != null)
101+
DecalData.WriteBinary(writer);
102+
103+
if (Flags != null)
104+
writer.WriteSimpleSubrecord<ushort>((ushort)Flags, "DNAM");
31105
}
32106

33-
public override void WriteDataXML(System.Xml.Linq.XElement ele)
107+
public override void WriteDataXML(XElement ele)
34108
{
35-
throw new NotImplementedException();
109+
if (EditorID != null)
110+
ele.AddSimpleSubrecord("EditorID", "EDID", EditorID);
111+
112+
if (ObjectBounds != null)
113+
{
114+
XElement subEle = new XElement("ObjectBounds");
115+
ObjectBounds.WriteXML(subEle);
116+
ele.Add(subEle);
117+
}
118+
119+
if (BaseImage_Transparency != null)
120+
ele.AddSimpleSubrecord("BaseImage_Transparency", "TX00", BaseImage_Transparency);
121+
122+
if (NormalMap_Specular != null)
123+
ele.AddSimpleSubrecord("NormalMap_Specular", "TX01", NormalMap_Specular);
124+
125+
if (EnvironmentMapMask != null)
126+
ele.AddSimpleSubrecord("EnvironmentMapMask", "TX02", EnvironmentMapMask);
127+
128+
if (GlowMap != null)
129+
ele.AddSimpleSubrecord("GlowMap", "TX03", GlowMap);
130+
131+
if (ParallaxMap != null)
132+
ele.AddSimpleSubrecord("ParallaxMap", "TX04", ParallaxMap);
133+
134+
if (EnvironmentMap != null)
135+
ele.AddSimpleSubrecord("EnvironmentMap", "TX05", EnvironmentMap);
136+
137+
if (DecalData != null)
138+
{
139+
XElement subEle = new XElement("DecalData");
140+
DecalData.WriteXML(subEle);
141+
ele.Add(subEle);
142+
}
143+
144+
ele.AddSimpleSubrecord("Flags", "DNAM", Flags.ToString());
36145
}
37146

38-
public override void ReadDataXML(System.Xml.Linq.XElement ele)
147+
public override void ReadDataXML(XElement ele)
39148
{
40-
throw new NotImplementedException();
149+
foreach (var subEle in ele.Elements())
150+
{
151+
switch (subEle.Attribute("Tag").Value)
152+
{
153+
case "EDID":
154+
EditorID = subEle.Value;
155+
break;
156+
case "OBND":
157+
if (ObjectBounds == null)
158+
ObjectBounds = new ObjectBounds();
159+
160+
ObjectBounds.ReadXML(subEle);
161+
break;
162+
case "TX00":
163+
BaseImage_Transparency = subEle.Value;
164+
break;
165+
case "TX01":
166+
NormalMap_Specular = subEle.Value;
167+
break;
168+
case "TX02":
169+
EnvironmentMapMask = subEle.Value;
170+
break;
171+
case "TX03":
172+
GlowMap = subEle.Value;
173+
break;
174+
case "TX04":
175+
ParallaxMap = subEle.Value;
176+
break;
177+
case "TX05":
178+
EnvironmentMap = subEle.Value;
179+
break;
180+
case "DODT":
181+
if (DecalData == null)
182+
DecalData = new DecalData();
183+
184+
DecalData.ReadXML(subEle);
185+
break;
186+
case "DNAM":
187+
Flags = subEle.ToEnum<TXSTFlags>();
188+
break;
189+
}
190+
}
41191
}
42192
}
193+
194+
[Flags]
195+
public enum TXSTFlags : ushort
196+
{
197+
NoSpecularMap = 0x00000001,
198+
Unknown2 = 0x00000002,
199+
Unknown4 = 0x00000004,
200+
Unknown8 = 0x00000008,
201+
Unknown10 = 0x00000010,
202+
Unknown20 = 0x00000020,
203+
Unknown40 = 0x00000040,
204+
Unknown80 = 0x00000080,
205+
Unknown100 = 0x00000100,
206+
Unknown200 = 0x00000200,
207+
Unknown400 = 0x00000400,
208+
Unknown800 = 0x00000800,
209+
Unknown1000 = 0x00001000,
210+
Unknown2000 = 0x00002000,
211+
Unknown4000 = 0x00004000,
212+
Unknown8000 = 0x00008000
213+
}
43214
}

ESPSharp/Subrecords/DecalData.cs

Lines changed: 74 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,29 +17,97 @@ public class DecalData : Subrecord
1717
public float Shininess { get; set; }
1818
public float ParallaxScale { get; set; }
1919
public byte ParallaxPasses { get; set; }
20+
public DecalDataFlags Flags { get; set; }
21+
public byte[] Unused { get; set; }
22+
public Color Color;
23+
2024
protected override void ReadData(ESPReader reader)
2125
{
22-
throw new NotImplementedException();
26+
MinWidth = reader.ReadSingle();
27+
MaxWidth = reader.ReadSingle();
28+
MinHeight = reader.ReadSingle();
29+
MaxHeight = reader.ReadSingle();
30+
Depth = reader.ReadSingle();
31+
Shininess = reader.ReadSingle();
32+
ParallaxScale = reader.ReadSingle();
33+
ParallaxPasses = reader.ReadByte();
34+
Flags = (DecalDataFlags)reader.ReadByte();
35+
Unused = reader.ReadBytes(2);
36+
Color.Red = reader.ReadByte();
37+
Color.Green = reader.ReadByte();
38+
Color.Blue = reader.ReadByte();
39+
Color.Alpha = reader.ReadByte();
2340
}
2441

2542
protected override void WriteData(ESPWriter writer)
2643
{
27-
throw new NotImplementedException();
44+
writer.Write(MinWidth);
45+
writer.Write(MaxWidth);
46+
writer.Write(MinHeight);
47+
writer.Write(MaxHeight);
48+
writer.Write(Depth);
49+
writer.Write(Shininess);
50+
writer.Write(ParallaxScale);
51+
writer.Write(ParallaxPasses);
52+
writer.Write((byte)Flags);
53+
writer.Write(Unused);
54+
writer.Write(Color.Red);
55+
writer.Write(Color.Green);
56+
writer.Write(Color.Blue);
57+
writer.Write(Color.Alpha);
2858
}
2959

3060
protected override void WriteDataXML(XElement ele)
3161
{
32-
throw new NotImplementedException();
62+
ele.Add(
63+
new XElement("Width",
64+
new XElement("Min", MinWidth),
65+
new XElement("Max", MaxWidth)),
66+
new XElement("Height",
67+
new XElement("Min", MinHeight),
68+
new XElement("Max", MaxHeight)),
69+
new XElement("Depth", Depth),
70+
new XElement("Shininess", Shininess),
71+
new XElement("ParallaxScale", ParallaxScale),
72+
new XElement("ParallaxPasses", ParallaxPasses),
73+
new XElement("Flags", Flags),
74+
new XElement("Unused", Unused.ToHex()),
75+
new XElement("Color",
76+
new XElement("Red", Color.Red),
77+
new XElement("Green", Color.Green),
78+
new XElement("Blue", Color.Blue),
79+
new XElement("Alpha", Color.Alpha)));
3380
}
3481

3582
protected override void ReadDataXML(XElement ele)
3683
{
37-
throw new NotImplementedException();
84+
MinWidth = ele.Element("Width").Element("Min").ToSingle();
85+
MaxWidth = ele.Element("Width").Element("Max").ToSingle();
86+
MinHeight = ele.Element("Height").Element("Min").ToSingle();
87+
MaxHeight = ele.Element("Height").Element("Max").ToSingle();
88+
Depth = ele.Element("Depth").ToSingle();
89+
Shininess = ele.Element("Shininess").ToSingle();
90+
ParallaxScale = ele.Element("ParallaxScale").ToSingle();
91+
ParallaxPasses = ele.Element("ParallaxPasses").ToByte();
92+
Flags = ele.Element("Flags").ToEnum<DecalDataFlags>();
93+
Unused = ele.Element("Unused").ToBytes();
94+
Color.Red = ele.Element("Color").Element("Red").ToByte();
95+
Color.Green = ele.Element("Color").Element("Green").ToByte();
96+
Color.Blue = ele.Element("Color").Element("Blue").ToByte();
97+
Color.Alpha = ele.Element("Color").Element("Alpha").ToByte();
3898
}
3999
}
40100

41-
public enum DecalDataFlags : ushort
101+
[Flags]
102+
public enum DecalDataFlags : byte
42103
{
43-
104+
Parallax = 0x00000001,
105+
AlphaBlending = 0x00000002,
106+
AlphaTesting = 0x00000004,
107+
Unknown8 = 0x00000008,
108+
Unknown10 = 0x00000010,
109+
Unknown20 = 0x00000020,
110+
Unknown40 = 0x00000040,
111+
Unknown80 = 0x00000080
44112
}
45113
}

0 commit comments

Comments
 (0)