33using System . Linq ;
44using System . Text ;
55using System . Threading . Tasks ;
6+ using System . Xml . Linq ;
67
78namespace 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}
0 commit comments