Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
TextureImportTool.c
Go to the documentation of this file.
2{
3 None, // CHC_NONE
4 DXTCompression, // CHC_DXT
5 RedHQCompression, // CHC_BC4
7 RedGreen, // CHC_RG
8 Alpha8, // CHC_A8
9 Red, // CHC_R
10 HDRCompression, // CHC_BC6H
12}
13
14enum MetaEddsMipMapFilter
15{
20}
21
22enum MetaEddsColorSpaceConversion
23{
24 None,
27}
28
29class TextureTypeProperty
30{
31 string m_Name;
32 typename m_ValType;
33 int m_Val;
34 ref array<int> m_OtherVariants;
35}
36
38{
39 Ignore = 0,
40 Report = 1 << 0,
41 Fix = 1 << 2,
43}
44
45enum TextureCheckResult
46{
50}
51
52class PlatformConfig
53{
54 string m_Platform;
56}
57
58class TextureType
59{
60 // Take a look at typename.EnumToString and store typename variables for enums.
61 string m_PostFix;
62 ref array<ref TextureTypeProperty> m_Properties = new array<ref TextureTypeProperty>;
63 ref array<ref PlatformConfig> m_PlatformConfigs = new array<ref PlatformConfig>;
64
65 void TextureType(array<ref TextureType> container, string name)
66 {
67 m_PostFix = name;
68 m_PostFix.ToLower();
69 container.Insert(this);
70 }
71
72 void Insert(string name, typename valType, int val, array<int> otherVariants = null)
73 {
74 auto prop = new TextureTypeProperty;
75 prop.m_Name = name;
76 prop.m_ValType = valType;
77 prop.m_Val = val;
78 prop.m_OtherVariants = otherVariants;
79 m_Properties.Insert(prop);
80 }
81
82 void AddBaseConfig(string platform, ResourceName configFile)
83 {
84 PlatformConfig config = new PlatformConfig;
85 config.m_Platform = platform;
86 config.m_ConfigFile = configFile;
87 m_PlatformConfigs.Insert(config);
88 }
89
90 ResourceName GetBaseConfig(string platform)
91 {
92 foreach (PlatformConfig config : m_PlatformConfigs)
93 {
94 if(config.m_Platform == platform)
95 return config.m_ConfigFile;
96 }
97
98 return "";
99 }
100
101 void CopyFrom(TextureType parent)
102 {
103 foreach (TextureTypeProperty property : parent.m_Properties)
104 {
105 m_Properties.Insert(property);
106 }
107
108 foreach (PlatformConfig config : parent.m_PlatformConfigs)
109 {
110 m_PlatformConfigs.Insert(config);
111 }
112 }
113
114 bool IsType(string path)
115 {
116 string pathNoExt = FilePath.StripExtension(path);
117 pathNoExt.ToLower();
118 return pathNoExt.EndsWith(m_PostFix);
119 }
120}
121
122class TextureTypes
123{
124 ref array<ref TextureType> m_Types;
125
126 // Property names
127 private static const string Conversion = "Conversion";
128 private static const string ColorSpace = "ColorSpace";
129 private static const string GenerateMips = "GenerateMips";
130 private static const string GenerateCubemap = "GenerateCubemap";
131 private static const string MipMapFilter = "MipMapFilter";
132
133 void TextureTypes()
134 {
135 m_Types = new array<ref TextureType>();
136
137 //--------------------------------------------------------------------
138 //color maps -> to sRGB
139 ref TextureType COType = new TextureType(m_Types, "_co");
140 COType.Insert(Conversion, MetaEddsConversion, MetaEddsConversion.ColorHQCompression);
141 COType.Insert(ColorSpace, MetaEddsColorSpaceConversion, MetaEddsColorSpaceConversion.ToSrgb);
142 COType.AddBaseConfig("PC", "{EAB5DE3219F9CBA8}configs/ResourceTypes/PC/TextureColorMap.conf");
143 COType.AddBaseConfig("XBOX_ONE", "{91D862F89991BFBE}configs/ResourceTypes/XBOX_ONE/TextureColorMap.conf");
144 COType.AddBaseConfig("XBOX_SERIES", "{5FEAED1642ECE679}configs/ResourceTypes/XBOX_SERIES/TextureColorMap.conf");
145 COType.AddBaseConfig("PS4", "{12273E1A0928F0C4}configs/ResourceTypes/PS4/TextureColorMap.conf");
146 COType.AddBaseConfig("PS5", "{531A0D167B1ABD97}configs/ResourceTypes/PS5/TextureColorMap.conf");
147 COType.AddBaseConfig("HEADLESS", "{BEAF5CD0C438676E}configs/ResourceTypes/HEADLESS/TextureColorMap.conf");
148
149 ref TextureType BCType = new TextureType(m_Types, "_bc");
150 BCType.CopyFrom(COType);
151
152 ref TextureType BCRType = new TextureType(m_Types, "_bcr");
153 BCRType.CopyFrom(COType);
154
155 ref TextureType BCHType = new TextureType(m_Types, "_bch");
156 BCHType.CopyFrom(COType);
157
158 ref TextureType CAType = new TextureType(m_Types, "_ca");
159 CAType.CopyFrom(COType);
160
161 ref TextureType BCAType = new TextureType(m_Types, "_bca");
162 BCAType.CopyFrom(COType);
163
164 ref TextureType MCType = new TextureType(m_Types, "_mc");
165 MCType.CopyFrom(COType);
166
167 ref TextureType MCAType = new TextureType(m_Types, "_mca");
168 MCAType.CopyFrom(COType);
169
170 ref TextureType MLODType = new TextureType(m_Types, "_mlod");
171 MLODType.CopyFrom(COType);
172
173 //--------------------------------------------------------------------
174 //EM maps
175 ref TextureType EMType = new TextureType(m_Types, "_em");
176 EMType.Insert(Conversion, MetaEddsConversion, MetaEddsConversion.ColorHQCompression, {MetaEddsConversion.DXTCompression});
177 EMType.Insert(ColorSpace, MetaEddsColorSpaceConversion, MetaEddsColorSpaceConversion.ToSrgb);
178 EMType.AddBaseConfig("PC", "{EAB5DE3219F9CBA8}configs/ResourceTypes/PC/TextureColorMap.conf");
179 EMType.AddBaseConfig("XBOX_ONE", "{91D862F89991BFBE}configs/ResourceTypes/XBOX_ONE/TextureColorMap.conf");
180 EMType.AddBaseConfig("XBOX_SERIES", "{5FEAED1642ECE679}configs/ResourceTypes/XBOX_SERIES/TextureColorMap.conf");
181 EMType.AddBaseConfig("PS4", "{12273E1A0928F0C4}configs/ResourceTypes/PS4/TextureColorMap.conf");
182 EMType.AddBaseConfig("PS5", "{531A0D167B1ABD97}configs/ResourceTypes/PS5/TextureColorMap.conf");
183 EMType.AddBaseConfig("HEADLESS", "{BEAF5CD0C438676E}configs/ResourceTypes/HEADLESS/TextureColorMap.conf");
184
185 //--------------------------------------------------------------------
186 //MCR maps - rgb is linear overlay modificator of albedo
187 ref TextureType MCRType = new TextureType(m_Types, "_mcr");
188 MCRType.Insert(Conversion, MetaEddsConversion, MetaEddsConversion.ColorHQCompression);
189 MCRType.Insert(ColorSpace, MetaEddsColorSpaceConversion, MetaEddsColorSpaceConversion.ToLinear, {MetaEddsColorSpaceConversion.ToSrgb});
190 MCRType.AddBaseConfig("PC", "{A6CC0A2F9DB86CBE}configs/ResourceTypes/PC/TextureMCRMap.conf");
191 MCRType.AddBaseConfig("XBOX_ONE", "{224B78299A038E4A}configs/ResourceTypes/XBOX_ONE/TextureMCRMap.conf");
192 MCRType.AddBaseConfig("XBOX_SERIES", "{B5FA7506CF384E79}configs/ResourceTypes/XBOX_SERIES/TextureMCRMap.conf");
193 MCRType.AddBaseConfig("PS4", "{E7A6FCCE55593073}configs/ResourceTypes/PS4/TextureMCRMap.conf");
194 MCRType.AddBaseConfig("PS5", "{E3BE705DB85AD3CA}configs/ResourceTypes/PS5/TextureMCRMap.conf");
195 MCRType.AddBaseConfig("HEADLESS", "{D49C34F7354B6F47}configs/ResourceTypes/HEADLESS/TextureMCRMap.conf");
196
197 //--------------------------------------------------------------------
198 //pure normal maps
199 ref TextureType NOType = new TextureType(m_Types, "_no");
200 NOType.Insert(Conversion, MetaEddsConversion, MetaEddsConversion.RedGreenHQCompression);
201 NOType.AddBaseConfig("PC", "{CEA87F769FD618D2}configs/ResourceTypes/PC/TextureNormalMap.conf");
202 NOType.AddBaseConfig("XBOX_ONE", "{5B84FAB5D39FB8AA}configs/ResourceTypes/XBOX_ONE/TextureNormalMap.conf");
203 NOType.AddBaseConfig("XBOX_SERIES", "{1B409AA3788B720F}configs/ResourceTypes/XBOX_SERIES/TextureNormalMap.conf");
204 NOType.AddBaseConfig("PS4", "{9533DFD9EDDCEDD2}configs/ResourceTypes/PS4/TextureNormalMap.conf");
205 NOType.AddBaseConfig("PS5", "{30F530559C17A96E}configs/ResourceTypes/PS5/TextureNormalMap.conf");
206 NOType.AddBaseConfig("HEADLESS", "{FC84ABE4B37D0DA0}configs/ResourceTypes/HEADLESS/TextureNormalMap.conf");
207
208 ref TextureType NType = new TextureType(m_Types, "_n");
209 NType.CopyFrom(NOType);
210
211 ref TextureType NOHQType = new TextureType(m_Types, "_nohq");
212 NOHQType.CopyFrom(NOType);
213
214 // Terrain textures are caught by this and they would require swizzle to work.
215 // ref TextureType normalType = new TextureType(m_Types, "_normal.");
216 // normalType.Insert(Conversion, MetaEddsConversion, MetaEddsConversion.RedGreenHQCompression);
217
218 //--------------------------------------------------------------------
219 //N types and packing with other sources
220 ref TextureType NMOType = new TextureType(m_Types, "_nmo");
221 NMOType.Insert(Conversion, MetaEddsConversion, MetaEddsConversion.ColorHQCompression);
222 NMOType.AddBaseConfig("PC", "{A968DA7F9A1E3A3E}configs/ResourceTypes/PC/TextureNType.conf");
223 NMOType.AddBaseConfig("XBOX_ONE", "{7F6A4D372443A88D}configs/ResourceTypes/XBOX_ONE/TextureNType.conf");
224 NMOType.AddBaseConfig("XBOX_SERIES", "{065D289C7FF8B20D}configs/ResourceTypes/XBOX_SERIES/TextureNType.conf");
225 NMOType.AddBaseConfig("PS4", "{29DF4A6CBBABE916}configs/ResourceTypes/PS4/TextureNType.conf");
226 NMOType.AddBaseConfig("PS5", "{DED3C8CA8494EA99}configs/ResourceTypes/PS5/TextureNType.conf");
227 NMOType.AddBaseConfig("HEADLESS", "{AFD658E4D0EB5FBC}configs/ResourceTypes/HEADLESS/TextureNType.conf");
228
229 ref TextureType NHOType = new TextureType(m_Types, "_nho");
230 NHOType.CopyFrom(NMOType);
231
232 ref TextureType NTCType = new TextureType(m_Types, "_ntc");
233 NTCType.CopyFrom(NMOType);
234
235 ref TextureType NTOType = new TextureType(m_Types, "_nto");
236 NTOType.CopyFrom(NMOType);
237
238 //--------------------------------------------------------------------
239 ref TextureType VFXType = new TextureType(m_Types, "_vfx");
240 VFXType.Insert(Conversion, MetaEddsConversion, MetaEddsConversion.ColorHQCompression);
241 VFXType.AddBaseConfig("PC", "{4EC6C20A754D338D}configs/ResourceTypes/PC/TextureEffect.conf");
242 VFXType.AddBaseConfig("XBOX_ONE", "{CA41B00C72F6D179}configs/ResourceTypes/XBOX_ONE/TextureEffect.conf");
243 VFXType.AddBaseConfig("XBOX_SERIES", "{5DF0BD2327CD114A}configs/ResourceTypes/XBOX_SERIES/TextureEffect.conf");
244 VFXType.AddBaseConfig("PS4", "{0FAC34EBBDAC6F40}configs/ResourceTypes/PS4/TextureEffect.conf");
245 VFXType.AddBaseConfig("PS5", "{0BB4B87850AF8CF9}configs/ResourceTypes/PS5/TextureEffect.conf");
246 VFXType.AddBaseConfig("HEADLESS", "{3C96FCD2DDBE3074}configs/ResourceTypes/HEADLESS/TextureEffect.conf");
247
248 //--------------------------------------------------------------------
249 //various masks
250 ref TextureType MASKQType = new TextureType(m_Types, "_mask");
251 MASKQType.Insert(Conversion, MetaEddsConversion, MetaEddsConversion.ColorHQCompression);
252 MASKQType.AddBaseConfig("PC", "{2231C67ACC4BB0AC}configs/ResourceTypes/PC/TextureMask.conf");
253 MASKQType.AddBaseConfig("XBOX_ONE", "{3B78A666261DD8B4}configs/ResourceTypes/XBOX_ONE/TextureMask.conf");
254 MASKQType.AddBaseConfig("XBOX_SERIES", "{9A79E1F659B378E7}configs/ResourceTypes/XBOX_SERIES/TextureMask.conf");
255 MASKQType.AddBaseConfig("PS4", "{5CB64ED6EEBDE368}configs/ResourceTypes/PS4/TextureMask.conf");
256 MASKQType.AddBaseConfig("PS5", "{64796311C22F7B3C}configs/ResourceTypes/PS5/TextureMask.conf");
257 MASKQType.AddBaseConfig("HEADLESS", "{0B025DFAF55852CD}configs/ResourceTypes/HEADLESS/TextureMask.conf");
258
259 ref TextureType MASK1QType = new TextureType(m_Types, "_mask1");
260 MASK1QType.Insert(Conversion, MetaEddsConversion, MetaEddsConversion.RedHQCompression);
261 MASK1QType.AddBaseConfig("PC", "{51097E750D3FCE37}configs/ResourceTypes/PC/TextureMask1.conf");
262 MASK1QType.AddBaseConfig("XBOX_ONE", "{870BE93DB3625C84}configs/ResourceTypes/XBOX_ONE/TextureMask1.conf");
263 MASK1QType.AddBaseConfig("XBOX_SERIES", "{FE3C8C96E8D94604}configs/ResourceTypes/XBOX_SERIES/TextureMask1.conf");
264 MASK1QType.AddBaseConfig("PS4", "{D1BEEE662C8A1D1F}configs/ResourceTypes/PS4/TextureMask1.conf");
265 MASK1QType.AddBaseConfig("PS5", "{26B26CC013B51E90}configs/ResourceTypes/PS5/TextureMask1.conf");
266 MASK1QType.AddBaseConfig("HEADLESS", "{57B7FCEE47CAABB5}configs/ResourceTypes/HEADLESS/TextureMask1.conf");
267
268 ref TextureType MASK2QType = new TextureType(m_Types, "_mask2");
269 MASK2QType.Insert(Conversion, MetaEddsConversion, MetaEddsConversion.RedGreenHQCompression);
270 MASK2QType.AddBaseConfig("PC", "{0FE15736B2B24038}configs/ResourceTypes/PC/TextureMask2.conf");
271 MASK2QType.AddBaseConfig("XBOX_ONE", "{D9E3C07E0CEFD28B}configs/ResourceTypes/XBOX_ONE/TextureMask2.conf");
272 MASK2QType.AddBaseConfig("XBOX_SERIES", "{A0D4A5D55754C80B}configs/ResourceTypes/XBOX_SERIES/TextureMask2.conf");
273 MASK2QType.AddBaseConfig("PS4", "{8F56C72593079310}configs/ResourceTypes/PS4/TextureMask2.conf");
274 MASK2QType.AddBaseConfig("PS5", "{785A4583AC38909F}configs/ResourceTypes/PS5/TextureMask2.conf");
275 MASK2QType.AddBaseConfig("HEADLESS", "{095FD5ADF84725BA}configs/ResourceTypes/HEADLESS/TextureMask2.conf");
276
277
278 //camo mask
279 ref TextureType CRMType = new TextureType(m_Types, "_crm");
280 CRMType.CopyFrom(MASKQType);
281
282 //clutter mask
283 ref TextureType CMASKType = new TextureType(m_Types, "_cmask");
284 CMASKType.Insert(Conversion, MetaEddsConversion, MetaEddsConversion.RedGreenHQCompression);
285 CMASKType.Insert(GenerateMips, bool, false);
286 CMASKType.AddBaseConfig("PC", "{6733F446131BB044}configs/ResourceTypes/PC/TextureCMask.conf");
287 CMASKType.AddBaseConfig("XBOX_ONE", "{B131630EAD4622F8}configs/ResourceTypes/XBOX_ONE/TextureCMask.conf");
288 CMASKType.AddBaseConfig("XBOX_SERIES", "{C80606A5F6FD3877}configs/ResourceTypes/XBOX_SERIES/TextureCMask.conf");
289 CMASKType.AddBaseConfig("PS4", "{E784645532AE636D}configs/ResourceTypes/PS4/TextureCMask.conf");
290 CMASKType.AddBaseConfig("PS5", "{1088E6F30D9160E3}configs/ResourceTypes/PS5/TextureCMask.conf");
291 CMASKType.AddBaseConfig("HEADLESS", "{618D76DD59EED5C6}configs/ResourceTypes/HEADLESS/TextureCMask.conf");
292
293
294 //--------------------------------------------------------------------
295 //one channel
296 ref TextureType AType = new TextureType(m_Types, "_a");
297 AType.Insert(Conversion, MetaEddsConversion, MetaEddsConversion.RedHQCompression);
298 AType.AddBaseConfig("PC", "{6B149ECE3A72EF45}configs/ResourceTypes/PC/TextureOneChannel.conf");
299 AType.AddBaseConfig("XBOX_ONE", "{DC95471339A9BC2B}configs/ResourceTypes/XBOX_ONE/TextureOneChannel.conf");
300 AType.AddBaseConfig("XBOX_SERIES", "{C2F053ADC70F3804}configs/ResourceTypes/XBOX_SERIES/TextureOneChannel.conf");
301 AType.AddBaseConfig("PS4", "{19FBA5E0ACB1C98E}configs/ResourceTypes/PS4/TextureOneChannel.conf");
302 AType.AddBaseConfig("PS5", "{EE57BA009CACD0D1}configs/ResourceTypes/PS5/TextureOneChannel.conf");
303 AType.AddBaseConfig("HEADLESS", "{6866463573917E52}configs/ResourceTypes/HEADLESS/TextureOneChannel.conf");
304
305 ref TextureType HType = new TextureType(m_Types, "_h");
306 HType.CopyFrom(AType);
307
308 ref TextureType OType = new TextureType(m_Types, "_o");
309 OType.CopyFrom(AType);
310
311 ref TextureType AOType = new TextureType(m_Types, "_ao");
312 AOType.CopyFrom(AType);
313
314 //--------------------------------------------------------------------
315 //portal lut
316 ref TextureType PLUTType = new TextureType(m_Types, "_plut");
317 PLUTType.Insert(Conversion, MetaEddsConversion, MetaEddsConversion.RedHQCompression);
318 PLUTType.Insert(MipMapFilter, MetaEddsMipMapFilter, MetaEddsMipMapFilter.Gauss);
319 PLUTType.AddBaseConfig("PC", "{15216161DB8E7A0D}configs/ResourceTypes/PC/TexturePortalLUT.conf");
320 PLUTType.AddBaseConfig("XBOX_ONE", "{E19B9C1FD4491FD4}configs/ResourceTypes/XBOX_ONE/TexturePortalLUT.conf");
321 PLUTType.AddBaseConfig("XBOX_SERIES", "{9BA8570DDBA5283F}configs/ResourceTypes/XBOX_SERIES/TexturePortalLUT.conf");
322 PLUTType.AddBaseConfig("PS4", "{9D1ACBBD33CC8473}configs/ResourceTypes/PS4/TexturePortalLUT.conf");
323 PLUTType.AddBaseConfig("PS5", "{FE193D54570A6317}configs/ResourceTypes/PS5/TexturePortalLUT.conf");
324 PLUTType.AddBaseConfig("HEADLESS", "{469BCD4EB4ABAADE}configs/ResourceTypes/HEADLESS/TexturePortalLUT.conf");
325
326 //--------------------------------------------------------------------
327 ref TextureType layerType = new TextureType(m_Types, "_layer");
328 layerType.Insert(Conversion, MetaEddsConversion, MetaEddsConversion.None);
329 layerType.AddBaseConfig("PC", "{A59F335F96C4442F}configs/ResourceTypes/PC/TextureTerrainLayer.conf");
330 layerType.AddBaseConfig("XBOX_ONE", "{9843D16A29542D5A}configs/ResourceTypes/XBOX_ONE/TextureTerrainLayer.conf");
331 layerType.AddBaseConfig("XBOX_SERIES", "{2071F9D39E062268}configs/ResourceTypes/XBOX_SERIES/TextureTerrainLayer.conf");
332 layerType.AddBaseConfig("PS4", "{4C431036F57D4D58}configs/ResourceTypes/PS4/TextureTerrainLayer.conf");
333 layerType.AddBaseConfig("PS5", "{BA3AFE83BEFD6794}configs/ResourceTypes/PS5/TextureTerrainLayer.conf");
334 layerType.AddBaseConfig("HEADLESS", "{3B38AD285230D19F}configs/ResourceTypes/HEADLESS/TextureTerrainLayer.conf");
335
336 ref TextureType supertextureType = new TextureType(m_Types, "_supertexture");
337 supertextureType.Insert(Conversion, MetaEddsConversion, MetaEddsConversion.ColorHQCompression);
338 supertextureType.Insert(ColorSpace, MetaEddsColorSpaceConversion, MetaEddsColorSpaceConversion.ToSrgb);
339 supertextureType.AddBaseConfig("PC", "{CBA1266690ABD336}configs/ResourceTypes/PC/TextureTerrainSuper.conf");
340 supertextureType.AddBaseConfig("XBOX_ONE", "{F67DC4532F3BBA43}configs/ResourceTypes/XBOX_ONE/TextureTerrainSuper.conf");
341 supertextureType.AddBaseConfig("XBOX_SERIES", "{4E4FECEA9869B571}configs/ResourceTypes/XBOX_SERIES/TextureTerrainSuper.conf");
342 supertextureType.AddBaseConfig("PS4", "{227D050FF312DA41}configs/ResourceTypes/PS4/TextureTerrainSuper.conf");
343 supertextureType.AddBaseConfig("PS5", "{D404EBBAB892F08D}configs/ResourceTypes/PS5/TextureTerrainSuper.conf");
344 supertextureType.AddBaseConfig("HEADLESS", "{5506B811545F4686}configs/ResourceTypes/HEADLESS/TextureTerrainSuper.conf");
345
346 ref TextureType normaltextureType = new TextureType(m_Types, "_normal");
347 //with vegetation height in blue channel we need to use ColorHQCompression for better quality
348 normaltextureType.Insert(Conversion, MetaEddsConversion, MetaEddsConversion.ColorHQCompression);
349 normaltextureType.AddBaseConfig("PC", "{835E083C88C3D9C3}configs/ResourceTypes/PC/TextureTerrainNormal.conf");
350 normaltextureType.AddBaseConfig("XBOX_ONE", "{6C5EFFA712A52100}configs/ResourceTypes/XBOX_ONE/TextureTerrainNormal.conf");
351 normaltextureType.AddBaseConfig("XBOX_SERIES", "{90ADE65A903F3042}configs/ResourceTypes/XBOX_SERIES/TextureTerrainNormal.conf");
352 normaltextureType.AddBaseConfig("PS4", "{6F6E5A1432381FD2}configs/ResourceTypes/PS4/TextureTerrainNormal.conf");
353 normaltextureType.AddBaseConfig("PS5", "{5CEA2418C9F889F8}configs/ResourceTypes/PS5/TextureTerrainNormal.conf");
354 normaltextureType.AddBaseConfig("HEADLESS", "{EAB38BDFD096C0A6}configs/ResourceTypes/HEADLESS/TextureTerrainNormal.conf");
355
356 // UI texture atlas
357 ref TextureType UITextureAtlasType = new TextureType(m_Types, "_atlas");
358 UITextureAtlasType.Insert(GenerateMips, bool, false);
359 UITextureAtlasType.AddBaseConfig("PC", "{1D692833852EC72A}configs/ResourceTypes/PC/TextureUIAtlas.conf");
360 UITextureAtlasType.AddBaseConfig("XBOX_ONE", "{96767353535A4256}configs/ResourceTypes/XBOX_ONE/TextureUIAtlas.conf");
361 UITextureAtlasType.AddBaseConfig("XBOX_SERIES", "{8A3A5BA26FD3DE70}configs/ResourceTypes/XBOX_SERIES/TextureUIAtlas.conf");
362 UITextureAtlasType.AddBaseConfig("PS4", "{962DE8F3FC2848A3}configs/ResourceTypes/PS4/TextureUIAtlas.conf");
363 UITextureAtlasType.AddBaseConfig("PS5", "{BED5DFAD2A554849}configs/ResourceTypes/PS5/TextureUIAtlas.conf");
364 UITextureAtlasType.AddBaseConfig("HEADLESS", "{15892FB1C3E30D2C}configs/ResourceTypes/HEADLESS/TextureUIAtlas.conf");
365
366 // UI textures
367 ref TextureType uiType = new TextureType(m_Types, "_ui");
368 uiType.AddBaseConfig("PC", "{3549C665CAA9A8EA}configs/ResourceTypes/PC/TextureUI.conf");
369 uiType.AddBaseConfig("XBOX_ONE", "{5E6D8E2B87D36B34}configs/ResourceTypes/XBOX_ONE/TextureUI.conf");
370 uiType.AddBaseConfig("XBOX_SERIES", "{03194CD39583675A}configs/ResourceTypes/XBOX_SERIES/TextureUI.conf");
371 uiType.AddBaseConfig("PS4", "{A752014F057BCE60}configs/ResourceTypes/PS4/TextureUI.conf");
372 uiType.AddBaseConfig("PS5", "{8BEB72EF65A8FB2E}configs/ResourceTypes/PS5/TextureUI.conf");
373 uiType.AddBaseConfig("HEADLESS", "{E604D15366D985DF}configs/ResourceTypes/HEADLESS/TextureUI.conf");
374
375 // UI textures uncompressed
376 ref TextureType uiTypeUncompressed = new TextureType(m_Types, "_uiuc");
377 uiTypeUncompressed.AddBaseConfig("PC", "{D256EAFDC1226362}configs/ResourceTypes/PC/TextureUIUncompressed.conf");
378 uiTypeUncompressed.AddBaseConfig("XBOX_ONE", "{712BC6681ADE741A}configs/ResourceTypes/XBOX_ONE/TextureUIUncompressed.conf");
379 uiTypeUncompressed.AddBaseConfig("XBOX_SERIES", "{B613AECC9D415504}configs/ResourceTypes/XBOX_SERIES/TextureUIUncompressed.conf");
380 uiTypeUncompressed.AddBaseConfig("PS4", "{9A726D592B629239}configs/ResourceTypes/PS4/TextureUIUncompressed.conf");
381 uiTypeUncompressed.AddBaseConfig("PS5", "{30FCD9651534E6BB}configs/ResourceTypes/PS5/TextureUIUncompressed.conf");
382 uiTypeUncompressed.AddBaseConfig("HEADLESS", "{A677FEF8099B272E}configs/ResourceTypes/HEADLESS/TextureUIUncompressed.conf");
383
384 // Env. map (Generate env map from panorama, HDR compression enabled by default)
385 ref TextureType environmentMapType = new TextureType(m_Types, "_env");
386 environmentMapType.AddBaseConfig("PC", "{009B945B41B128FC}configs/ResourceTypes/PC/TextureEnvMap.conf");
387 environmentMapType.AddBaseConfig("XBOX_ONE", "{841CE65D460ACA08}configs/ResourceTypes/XBOX_ONE/TextureEnvMap.conf");
388 environmentMapType.AddBaseConfig("XBOX_SERIES", "{13ADEB7213310A3B}configs/ResourceTypes/XBOX_SERIES/TextureEnvMap.conf");
389 environmentMapType.AddBaseConfig("PS4", "{41F162BA89507431}configs/ResourceTypes/PS4/TextureEnvMap.conf");
390 environmentMapType.AddBaseConfig("PS5", "{45E9EE2964539788}configs/ResourceTypes/PS5/TextureEnvMap.conf");
391 environmentMapType.AddBaseConfig("HEADLESS", "{72CBAA83E9422B05}configs/ResourceTypes/HEADLESS/TextureEnvMap.conf");
392
393 //Lut texture
394 ref TextureType lutType = new TextureType(m_Types, "_lut");
395 lutType.AddBaseConfig("PC", "{FDA8724761A5E880}configs/ResourceTypes/PC/TextureLut.conf");
396 lutType.AddBaseConfig("XBOX_ONE", "{9AE8215636729E7A}configs/ResourceTypes/XBOX_ONE/TextureLut.conf");
397 lutType.AddBaseConfig("XBOX_SERIES", "{CBB7E88AA7DE5748}configs/ResourceTypes/XBOX_SERIES/TextureLut.conf");
398 lutType.AddBaseConfig("PS4", "{F34906600DC4FE84}configs/ResourceTypes/PS4/TextureLut.conf");
399 lutType.AddBaseConfig("PS5", "{5D15FD30EDF58E3B}configs/ResourceTypes/PS5/TextureLut.conf");
400 lutType.AddBaseConfig("HEADLESS", "{3D6CF9FDEC095638}configs/ResourceTypes/HEADLESS/TextureLut.conf");
401
402 //this is special type, it looks if file with same name but .fnt extension is exist next to .edds
403 ref TextureType fontType = new FontTextureType(m_Types, "_fnt");
404 fontType.AddBaseConfig("PC", "{F18523FA5BAAEA63}configs/ResourceTypes/PC/TextureFonts.conf");
405 fontType.AddBaseConfig("XBOX_ONE", "{02B393E0229C74CB}configs/ResourceTypes/XBOX_ONE/TextureFonts.conf");
406 fontType.AddBaseConfig("XBOX_SERIES", "{85ECC27BD918BA89}configs/ResourceTypes/XBOX_SERIES/TextureFonts.conf");
407 fontType.AddBaseConfig("PS4", "{3C102C974458DF07}configs/ResourceTypes/PS4/TextureFonts.conf");
408 fontType.AddBaseConfig("PS5", "{863E314F45203AC4}configs/ResourceTypes/PS5/TextureFonts.conf");
409 fontType.AddBaseConfig("HEADLESS", "{D20F8633D63483FA}configs/ResourceTypes/HEADLESS/TextureFonts.conf");
410
411 //this is special type which will be assigned when no one from normal types above matches
412 ref TextureType unspecifiedType = new TextureType(m_Types, "");
413 unspecifiedType.Insert(Conversion, MetaEddsConversion, MetaEddsConversion.DXTCompression);
414 unspecifiedType.AddBaseConfig("PC", "{DC555BD399D92412}configs/ResourceTypes/PC/TextureUnspecified.conf");
415 unspecifiedType.AddBaseConfig("XBOX_ONE", "{8F13AE697AE60784}configs/ResourceTypes/XBOX_ONE/TextureUnspecified.conf");
416 unspecifiedType.AddBaseConfig("XBOX_SERIES", "{D28E01700D90F52C}configs/ResourceTypes/XBOX_SERIES/TextureUnspecified.conf");
417 unspecifiedType.AddBaseConfig("PS4", "{C6CD3D8752652D2A}configs/ResourceTypes/PS4/TextureUnspecified.conf");
418 unspecifiedType.AddBaseConfig("PS5", "{6248F71B9D7C1E93}configs/ResourceTypes/PS5/TextureUnspecified.conf");
419 unspecifiedType.AddBaseConfig("HEADLESS", "{699C82A6807668A7}configs/ResourceTypes/HEADLESS/TextureUnspecified.conf");
420 }
421
422 TextureType FindTextureType(string absFileName)
423 {
424 TextureType unspecifiedType = null;
425
426 foreach (TextureType texType : m_Types)
427 {
428 if (texType.m_PostFix == "")
429 {
430 unspecifiedType = texType;
431 continue;
432 }
433
434 if (texType.IsType(absFileName))
435 return texType;
436 }
437
438 return unspecifiedType;
439 }
440
441 TextureCheckResult DoChecks(TextureIssueOp op, ResourceName resourceName, notnull MetaFile meta)
442 {
443 int combined = 0;
444 TextureCheckResult checkRes;
445
446 checkRes = CheckConfigurations(op, resourceName, meta);
447 combined |= checkRes;
448 if (checkRes == TextureCheckResult.UnfixedFatalIssue)
449 return checkRes;
450
451 TextureType matchingType = FindTextureType(resourceName);
452 checkRes = CheckAncestors(op, resourceName, meta, matchingType);
453 combined |= checkRes;
454 if (checkRes == TextureCheckResult.UnfixedFatalIssue)
455 return checkRes;
456
457 checkRes = CheckUnnecessarySettingInPc(op, resourceName, meta);
458 combined |= checkRes;
459 if (checkRes == TextureCheckResult.UnfixedFatalIssue)
460 return checkRes;
461
462 checkRes = CheckSuspiciousNonPcSetting(op, resourceName, meta);
463 combined |= checkRes;
464 if (checkRes == TextureCheckResult.UnfixedFatalIssue)
465 return checkRes;
466
467 checkRes = CheckWrongPropertyValues(op, resourceName, meta, matchingType);
468 combined |= checkRes;
469 if (checkRes == TextureCheckResult.UnfixedFatalIssue)
470 return checkRes;
471
472 return combined;
473 }
474
475 TextureCheckResult CheckConfigurations(TextureIssueOp op, ResourceName resourceName, notnull MetaFile meta)
476 {
477 BaseContainerList configurations = meta.GetObjectArray("Configurations");
478 if (!configurations)
479 {
480 if (op & TextureIssueOp.Report)
481 PrintFormat("@\"%1\" : Meta-file is missing 'Configurations' property.", resourceName);
482
483 return TextureCheckResult.UnfixedFatalIssue;
484 }
485
486 BaseContainer confPc = configurations.Get(0);
487 string confClassPc = confPc.GetClassName();
488 if (confClassPc == "EDDSResourceClass")
489 {
490 if (op & TextureIssueOp.Report)
491 PrintFormat("@\"%1\" : Resource class is 'EDDSResourceClass'", resourceName);
492
493 return TextureCheckResult.UnfixedFatalIssue;
494 }
495
496 int numVarsPc = confPc.GetNumVars();
497 TextureCheckResult res = TextureCheckResult.NothingChanged;
498 for (int iConf = 1, countConf = configurations.Count(); iConf < countConf; iConf++)
499 {
500 BaseContainer confDerived = configurations.Get(iConf);
501 string confName = confDerived.GetName();
502 string confClassDerived = confDerived.GetClassName();
503 if (confClassPc != confClassDerived)
504 {
505 if (op & TextureIssueOp.Report)
506 {
508 "@\"%1\" : Configuration '%2' has wrong type: expected: '%3', found: '%4'",
509 resourceName, confName, confClassPc, confClassDerived
510 );
511 }
512 res = TextureCheckResult.UnfixedFatalIssue;
513 }
514
515 int numVarsDerived = confDerived.GetNumVars();
516 if (numVarsPc != numVarsDerived)
517 {
518 if (op & TextureIssueOp.Report)
519 {
521 "@\"%1\" : Configuration '%1' has wrong num vars: expected: '%2', found: '%3'",
522 resourceName, confName, numVarsPc, numVarsDerived
523 );
524 }
525 res = TextureCheckResult.UnfixedFatalIssue;
526 }
527 }
528
529 return res;
530 }
531
532 TextureCheckResult CheckAncestors(TextureIssueOp op, ResourceName resourceName, notnull MetaFile meta, notnull TextureType type)
533 {
534 BaseContainerList configurations = meta.GetObjectArray("Configurations");
535
536 bool unfixedFatalIssue = false;
537 bool somethingChanged = false;
538 for (int iConf = 0, countConf = configurations.Count(); iConf < countConf; iConf++)
539 {
540 BaseContainer config = configurations.Get(iConf);
541 string configName = config.GetName();
542 ResourceName baseConfig = type.GetBaseConfig(configName);
543
544 if (!baseConfig)
545 {
546 if (op & TextureIssueOp.Report)
547 {
548 PrintFormat("@\"%1\" : Ancestor config missing for configuration '%2'.",
549 resourceName, configName
550 );
551 }
552
553 unfixedFatalIssue = true;
554 continue;
555 }
556
557 BaseContainer ancestor = config.GetAncestor();
558 if (!ancestor || ancestor.GetResourceName() != baseConfig)
559 {
560 if (op & TextureIssueOp.Report)
561 {
562 PrintFormat("@\"%1\" : Incorrect ancestor on configuration '%2'",
563 resourceName, configName
564 );
565 }
566 if (op & TextureIssueOp.Fix)
567 {
568 config.SetAncestor(baseConfig);
569 somethingChanged = true;
570 }
571 else
572 {
573 unfixedFatalIssue = true;
574 }
575 }
576 }
577
578 if (unfixedFatalIssue)
579 return TextureCheckResult.UnfixedFatalIssue;
580 else if (somethingChanged)
581 return TextureCheckResult.SomethingChanged;
582 else
583 return TextureCheckResult.NothingChanged;
584 }
585
586 TextureCheckResult CheckUnnecessarySettingInPc(TextureIssueOp op, ResourceName resourceName, notnull MetaFile meta)
587 {
588 BaseContainerList configurations = meta.GetObjectArray("Configurations");
589 BaseContainer confPc = configurations[0];
590 BaseContainer confPcAncestor = confPc.GetAncestor();
591 if (!confPcAncestor)
592 return TextureCheckResult.NothingChanged;
593
594 bool propertiesModified = false;
595 for (int iVar = 0, countVar = confPc.GetNumVars(); iVar < countVar; iVar++)
596 {
597 string name = confPc.GetVarName(iVar);
598 if (!confPc.IsVariableSetDirectly(name))
599 continue;
600
601 DataVarType varType = confPc.GetDataVarType(iVar);
602 if (varType == DataVarType.SCALAR)
603 {
604 float propValPc, propValPcAncestor;
605 if (!confPc.Get(name, propValPc))
606 continue;
607 if (!confPcAncestor.Get(name, propValPcAncestor))
608 continue;
609
610 if (propValPc == propValPcAncestor)
611 {
612 if (op & TextureIssueOp.Report)
613 {
615 "@\"%1\" : Configuration 'PC' has directly set value for property '%2', even though same value is inherited from ancestor.",
616 resourceName, name
617 );
618 }
619
620 if (op & TextureIssueOp.Fix)
621 {
622 propertiesModified = true;
623 confPc.ClearVariable(name);
624 }
625 }
626 }
627 else
628 {
629 int propValPc, propValPcAncestor;
630 if (!confPc.Get(name, propValPc))
631 continue;
632 if (!confPcAncestor.Get(name, propValPcAncestor))
633 continue;
634
635 if (propValPc == propValPcAncestor)
636 {
637 if (op & TextureIssueOp.Report)
638 {
640 "@\"%1\" : Configuration 'PC' has directly set value for property '%2', even though same value is inherited from ancestor.",
641 resourceName, name
642 );
643 }
644
645 if (op & TextureIssueOp.Fix)
646 {
647 propertiesModified = true;
648 confPc.ClearVariable(name);
649 }
650 }
651 }
652 }
653
654 if (propertiesModified)
655 return TextureCheckResult.SomethingChanged;
656 else
657 return TextureCheckResult.NothingChanged;
658 }
659
660 TextureCheckResult CheckSuspiciousNonPcSetting(TextureIssueOp op, ResourceName resourceName, notnull MetaFile meta)
661 {
662 BaseContainerList configurations = meta.GetObjectArray("Configurations");
663 BaseContainer confPc = configurations[0];
664 bool propertiesModified = false;
665 bool fatalIssue = false;
666 for (int iConf = 1, countConf = configurations.Count(); iConf < countConf; iConf++)
667 {
668 BaseContainer confDerived = configurations.Get(iConf);
669 string confName = confDerived.GetName();
670
671 for (int iVar = 0, countVar = confPc.GetNumVars(); iVar < countVar; iVar++)
672 {
673 string namePc = confPc.GetVarName(iVar);
674 string nameDerived = confDerived.GetVarName(iVar);
675 if (namePc != nameDerived)
676 {
677 if (op & TextureIssueOp.Report)
678 {
680 "@\"%1\" : Configuration '%2' has wrong var %3 name: expected: '%4', actual: '%5'",
681 resourceName, confName, iVar, namePc, nameDerived
682 );
683 }
684
685 fatalIssue = true;
686 continue;
687 }
688
689 DataVarType varType = confPc.GetDataVarType(iVar);
690 bool isSetDirectlyPc = confPc.IsVariableSetDirectly(namePc);
691 bool isSetDirectlyDerived = confDerived.IsVariableSetDirectly(nameDerived);
692 if (isSetDirectlyPc)
693 {
694 if (varType == DataVarType.SCALAR)
695 {
696 float propValPc, propValDerived;
697 if (!confPc.Get(namePc, propValPc))
698 continue;
699
700 if (!confDerived.Get(nameDerived, propValDerived))
701 continue;
702
703 if (propValPc != propValDerived)
704 {
705 if (op & TextureIssueOp.Report)
706 {
708 "@\"%1\" : Configuration '%2' has wrong value in property '%3': expected '%4', found '%5'",
709 resourceName, confName, nameDerived, propValPc, propValDerived
710 );
711 }
712
713 if (op & TextureIssueOp.Fix)
714 {
715 propertiesModified = true;
716 confDerived.Set(nameDerived, propValPc);
717 }
718 }
719 }
720 else
721 {
722 int propValPc, propValDerived;
723 if (!confPc.Get(namePc, propValPc))
724 continue;
725
726 if (!confDerived.Get(nameDerived, propValDerived))
727 continue;
728
729 if (propValPc != propValDerived)
730 {
731 if (op & TextureIssueOp.Report)
732 {
734 "@\"%1\" : Configuration '%2' has wrong value in property '%3': expected '%4', found '%5'",
735 resourceName, confName, nameDerived, propValPc, propValDerived
736 );
737 }
738
739 if (op & TextureIssueOp.Fix)
740 {
741 propertiesModified = true;
742 confDerived.Set(nameDerived, propValPc);
743 }
744 }
745 }
746 }
747 else if (isSetDirectlyDerived)
748 {
749 if (varType == DataVarType.SCALAR)
750 {
751 float propValDerived;
752 if (!confDerived.Get(nameDerived, propValDerived))
753 continue;
754
755 if (op & TextureIssueOp.Report)
756 {
758 "@\"%1\" : Configuration '%2' has property '%3' set directly while 'PC' doesn't. value: '%4'",
759 resourceName, confName, nameDerived, propValDerived
760 );
761 }
762
763 if (op & TextureIssueOp.Fix)
764 {
765 propertiesModified = true;
766 confDerived.ClearVariable(nameDerived);
767 }
768 }
769 else
770 {
771 int propValDerived;
772 if (!confDerived.Get(nameDerived, propValDerived))
773 continue;
774
775 if (op & TextureIssueOp.Report)
776 {
778 "@\"%1\" : Configuration '%2' has property '%3' set directly while 'PC' doesn't. value: '%4'",
779 resourceName, confName, nameDerived, propValDerived
780 );
781 }
782
783 if (op & TextureIssueOp.Fix)
784 {
785 propertiesModified = true;
786 confDerived.ClearVariable(nameDerived);
787 }
788 }
789 }
790 }
791 }
792
793 if (fatalIssue)
794 return TextureCheckResult.UnfixedFatalIssue;
795 else if (propertiesModified)
796 return TextureCheckResult.SomethingChanged;
797 else
798 return TextureCheckResult.NothingChanged;
799 }
800
801 TextureCheckResult CheckWrongPropertyValues(TextureIssueOp op, ResourceName resourceName, notnull MetaFile meta, notnull TextureType type)
802 {
803 // This check is currently disabled because it is not clear what it should
804 // be doing now that we have introduced configs for specific texture suffixes.
805 return TextureCheckResult.NothingChanged;
806
807 BaseContainerList configurations = meta.GetObjectArray("Configurations");
808 BaseContainer confPc = configurations[0];
809
810 TextureCheckResult res = TextureCheckResult.NothingChanged;
811 foreach (TextureTypeProperty prop : type.m_Properties)
812 {
813 int propVal;
814 if (confPc.Get(prop.m_Name, propVal))
815 {
816 int propValCorrect = prop.m_Val;
817 bool isIncorrect = propVal != propValCorrect;
818 if (isIncorrect && prop.m_OtherVariants)
819 {
820 foreach (int otherVariant : prop.m_OtherVariants)
821 {
822 if (otherVariant == propVal)
823 {
824 isIncorrect = false;
825 break;
826 }
827 }
828 }
829
830 if (isIncorrect)
831 {
832 if (op & TextureIssueOp.Report)
833 {
834 string valName, valNameCorrect;
835 if (prop.m_ValType == bool)
836 {
837 if (propVal) { valName = "true"; } else { valName = "false"; }
838 if (propValCorrect) { valNameCorrect = "true"; } else { valNameCorrect = "false"; }
839 }
840 else
841 {
842 valName = typename.EnumToString(prop.m_ValType, propVal);
843 valNameCorrect = typename.EnumToString(prop.m_ValType, propValCorrect);
844 }
845 PrintFormat("@\"%1\" : Property '%2' has wrong value ('%3' instead of '%4').",
846 resourceName, prop.m_Name, valName, valNameCorrect
847 );
848 }
849
850 if (op & TextureIssueOp.Fix)
851 {
852 res = TextureCheckResult.SomethingChanged;
853 confPc.Set(prop.m_Name, propValCorrect);
854 }
855 }
856 }
857 else
858 {
859 if (op & TextureIssueOp.Report)
860 {
861 PrintFormat("@\"%1\" : Property '%2' is not set", resourceName, prop.m_Name);
862 }
863
864 if (op & TextureIssueOp.Fix)
865 {
866 res = TextureCheckResult.SomethingChanged;
867 confPc.Set(prop.m_Name, prop.m_Val);
868 }
869 }
870 }
871
872 return res;
873 }
874}
875
876class FontTextureType: TextureType
877{
878 override bool IsType(string path)
879 {
880 string fntPath = FilePath.ReplaceExtension(path, "fnt");
881 return FileIO.FileExists(fntPath);
882 }
883}
884
885// //----------------------------------------------------------------------------------------------
886// bool FixTextureMetaFile(MetaFile meta, string absFileName, TextureTypes textureTypes)
887// {
888// BaseContainerList configurations = meta.GetObjectArray("Configurations");
889// if(!configurations)
890// return false;
891
892// bool anyChangeInMetaFile = false;
893
894// for(int c = 0; c < configurations.Count(); c++)
895// {
896// TextureType typeToAssign = textureTypes.FindTextureType(absFileName);
897// BaseContainer cfg = configurations.Get(c);
898// string cfgName = cfg.GetName();
899// ResourceName ancestor = typeToAssign.GetBaseConfig(cfgName);
900// if (ancestor != "")
901// {
902// cfg.SetAncestor(ancestor);
903// anyChangeInMetaFile = true;
904// }
905// }
906
907// return anyChangeInMetaFile;
908// }
909
910[WorkbenchPluginAttribute("Texture Import", "Texture Import Helper", "", "", {"ResourceManager"},"",0xf574)]
911class TextureImportPlugin: ResourceManagerPlugin
912{
913 [Attribute("true", UIWidgets.CheckBox)]
914 bool Enabled;
915
916 ref TextureTypes m_TextureTypes = new TextureTypes();
917
918 //--------------------------------------------------------------------
919 bool IsImage(string className)
920 {
921 return
922 className == "PNGResourceClass" ||
923 className == "DDSResourceClass" ||
924 className == "TGAResourceClass" ||
925 className == "TIFFResourceClass" ||
926 className == "PNGResourceClass" ||
927 className == "HDRResourceClass" ||
928 className == "JPGResourceClass";
929 }
930
931 //--------------------------------------------------------------------
932 override void OnRegisterResource(string absFileName, BaseContainer metaFile)
933 {
934 BaseContainer conf = metaFile.GetObjectArray("Configurations")[0];
935 if (!Enabled || !IsImage(conf.GetClassName()))
936 return;
937
938 TextureType type = m_TextureTypes.FindTextureType(absFileName);
939 m_TextureTypes.CheckAncestors(TextureIssueOp.Fix, absFileName, metaFile, type);
940 // FixTextureMetaFile(metaFile, absFileName, m_TextureTypes);
941 }
942
943 override void OnRenameResource(string absFileNameOld, string absFileNameNew, BaseContainer metaFile)
944 {
945 BaseContainer conf = metaFile.GetObjectArray("Configurations")[0];
946 if (!Enabled || !IsImage(conf.GetClassName()))
947 return;
948
949 TextureType type = m_TextureTypes.FindTextureType(absFileNameNew);
950 m_TextureTypes.CheckAncestors(TextureIssueOp.Fix, absFileNameNew, metaFile, type);
951 // FixTextureMetaFile(metaFile, absFileNameNew, m_TextureTypes);
952 }
953
954 override void Configure()
955 {
956 Workbench.ScriptDialog("Configure Texture Import Plugin", "", this);
957 }
958
959 [ButtonAttribute("OK")]
960 void OkButton() {}
961}
962
963[WorkbenchPluginAttribute("Batch texture processor", "Perform simple checks and fixes on many textures", "", "", {"ResourceManager"},"",0xf1c5)]
964class BatchTextureProcessorPlugin: WorkbenchPlugin
965{
966 [Attribute("", UIWidgets.FileNamePicker, "Check only textures whose path starts with given filter string.", params:"folders")]
967 string PathStartsWith;
968
969 [Attribute("", UIWidgets.EditBox, "Check only textures whose path contains given filter string.")]
970 string PathContains;
971
972 [Attribute("", UIWidgets.EditBox, "Check only textures whose path ends with given filter string.")]
973 string PathEndsWith;
974
975 [Attribute("true", UIWidgets.CheckBox, "Report missing meta-file")]
976 bool ReportMissingMetaFile;
977
978 [Attribute(
979 enumType: TextureIssueOp,
980 uiwidget: UIWidgets.ComboBox,
981 desc: "Check whether configurations are present and have correct classes."
982 )]
983 TextureIssueOp CheckConfigurations;
984
985 [Attribute(
986 enumType: TextureIssueOp,
987 uiwidget: UIWidgets.ComboBox,
988 desc: "Check whether configurations have correct ancestors."
989 )]
990 TextureIssueOp CheckAncestors;
991
992 [Attribute(
993 enumType: TextureIssueOp,
994 uiwidget: UIWidgets.ComboBox,
995 desc: "Check whether PC configuration is directly setting same value as inherited from ancestor"
996 )]
997 TextureIssueOp UnnecessarySettingInPc;
998
999 [Attribute(
1000 enumType: TextureIssueOp,
1001 uiwidget: UIWidgets.ComboBox,
1002 desc: "Non-PC configuration property having different value than what is directly set in PC."
1003 )]
1004 TextureIssueOp CheckSuspiciousNonPcSetting;
1005
1006 [Attribute(
1007 enumType: TextureIssueOp,
1008 uiwidget: UIWidgets.ComboBox,
1009 desc: "Check whether properties have values matching presets."
1010 )]
1011 TextureIssueOp CheckWrongPropertyValues;
1012
1013 [Attribute("true", UIWidgets.CheckBox, "Reimport changed resources")]
1014 bool ReimportChanged;
1015
1016 ref TextureTypes m_TextureTypes = new TextureTypes();
1017 ref array<string> m_Resources = new array<string>;
1018
1019 //----------------------------------------------------------------------------------------------
1020 [ButtonAttribute("Run", true)]
1021 bool OK()
1022 {
1023 return true;
1024 }
1025
1026 //----------------------------------------------------------------------------------------------
1027 [ButtonAttribute("Cancel")]
1028 bool Cancel()
1029 {
1030 return false;
1031 }
1032
1033 //----------------------------------------------------------------------------------------------
1034 bool TestAgainstFilter(string resource)
1035 {
1036 int resourceLength = resource.Length();
1037
1038 int prefixLength = PathStartsWith.Length();
1039 if (resourceLength < prefixLength)
1040 return false;
1041
1042 int suffixLength = PathEndsWith.Length();
1043 if (resourceLength < suffixLength)
1044 return false;
1045
1046 int subLength = PathContains.Length();
1047 if (resourceLength < subLength)
1048 return false;
1049
1050 resource.ToLower();
1051 if (!resource.StartsWith(PathStartsWith))
1052 return false;
1053
1054 if (!resource.EndsWith(PathEndsWith))
1055 return false;
1056
1057 if (!resource.Contains(PathContains))
1058 return false;
1059
1060 return true;
1061 }
1062
1063 //----------------------------------------------------------------------------------------------
1064 void Find(ResourceName resName, string filePath)
1065 {
1066 m_Resources.Insert(filePath);
1067 }
1068
1069 //----------------------------------------------------------------------------------------------
1070 override void Run()
1071 {
1072 if (!Workbench.ScriptDialog("Configure batch texture processor", "", this))
1073 return;
1074
1075 PathStartsWith.ToLower();
1076 PathContains.ToLower();
1077 PathEndsWith.ToLower();
1078
1079 // TODO: Search resources in specific directory? Must filter myself.
1080
1082 filter.fileExtensions = {"edds"};
1083 ResourceDatabase.SearchResources(filter, Find);
1084
1085 m_Resources.Sort();
1086
1087 ResourceManager rb = Workbench.GetModule(ResourceManager);
1088 WBProgressDialog progress = new WBProgressDialog("Processing...", rb);
1089
1090 float count = m_Resources.Count();
1091
1092 array<string> toRebuild = new array<string>;
1093
1094 foreach (int resourceIdx, string resource : m_Resources)
1095 {
1096 progress.SetProgress(resourceIdx / count);
1097
1098 if (!TestAgainstFilter(resource))
1099 continue;
1100
1101 MetaFile meta = rb.GetMetaFile(resource);
1102 if (!meta)
1103 {
1104 if (ReportMissingMetaFile)
1105 PrintFormat("@\"%1\" : Meta-file is missing.", resource);
1106
1107 continue;
1108 }
1109
1110 TextureType matchingType;
1111 bool metaChanged = false;
1112 TextureCheckResult checkRes = TextureCheckResult.NothingChanged;
1113
1114 if (checkRes != TextureCheckResult.UnfixedFatalIssue)
1115 {
1116 checkRes = m_TextureTypes.CheckConfigurations(CheckConfigurations, resource, meta);
1117 if (checkRes == TextureCheckResult.SomethingChanged)
1118 metaChanged = true;
1119 }
1120
1121 if (checkRes != TextureCheckResult.UnfixedFatalIssue)
1122 {
1123 matchingType = m_TextureTypes.FindTextureType(resource);
1124 checkRes = m_TextureTypes.CheckAncestors(CheckAncestors, resource, meta, matchingType);
1125 if (checkRes == TextureCheckResult.SomethingChanged)
1126 metaChanged = true;
1127 }
1128
1129 if (checkRes != TextureCheckResult.UnfixedFatalIssue)
1130 {
1131 checkRes = m_TextureTypes.CheckUnnecessarySettingInPc(UnnecessarySettingInPc, resource, meta);
1132 if (checkRes == TextureCheckResult.SomethingChanged)
1133 metaChanged = true;
1134 }
1135
1136 if (checkRes != TextureCheckResult.UnfixedFatalIssue)
1137 {
1138 checkRes = m_TextureTypes.CheckSuspiciousNonPcSetting(CheckSuspiciousNonPcSetting, resource, meta);
1139 if (checkRes == TextureCheckResult.SomethingChanged)
1140 metaChanged = true;
1141 }
1142
1143 if (checkRes != TextureCheckResult.UnfixedFatalIssue)
1144 {
1145 checkRes = m_TextureTypes.CheckWrongPropertyValues(CheckWrongPropertyValues, resource, meta, matchingType);
1146 if (checkRes == TextureCheckResult.SomethingChanged)
1147 metaChanged = true;
1148 }
1149
1150 if (metaChanged)
1151 {
1152 meta.Save();
1153 toRebuild.Insert(resource);
1154 }
1155 meta.Release();
1156 }
1157
1158 if (ReimportChanged && toRebuild.Count() > 0)
1159 {
1160 Print("Reimporting modified resources.");
1161 rb.RebuildResourceFiles(toRebuild, "PC");
1162 }
1163
1164 m_Resources.Clear();
1165 }
1166}
string path
GenerateFlowMaps WorkbenchPlugin WorkbenchPluginAttribute("Regenerate river flow-maps", "Generate and save/overwrite river flow-maps", "", "", {"WorldEditor"}, "", 0xf773)
Definition FlowmapTool.c:59
CinematicTrackAttribute m_Name
bool Enabled
Definition PeerConfig.c:60
ResourceName resourceName
Definition SCR_AIGroup.c:66
EDamageType type
override void Run()
Configs ServerBrowser KickDialogs conf
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
SCR_RespawnComponentClass OK
Result code for request/assign response.
Definition EMoveError.c:14
enum MetaEddsConversion Kaiser
MetaEddsConversion
@ RedGreenHQCompression
@ DXTCompression
@ RedHQCompression
@ ColorHQCompression
@ Alpha8
@ HDRCompression
@ RedGreen
@ Red
enum MetaEddsConversion Gauss
enum TextureIssueOp UnfixedFatalIssue
int m_Val
enum TextureIssueOp SomethingChanged
class TextureType m_Types
enum MetaEddsConversion Triangle
enum TextureIssueOp NothingChanged
enum TextureIssueOp m_Platform
enum MetaEddsConversion Box
ResourceName m_ConfigFile
enum MetaEddsConversion ToSrgb
enum MetaEddsConversion ToLinear
ref array< int > m_OtherVariants
TextureIssueOp
@ Report
@ Ignore
@ ReportAndFix
override void Configure()
class WorkbenchDialog_AbortRetryIgnore ButtonAttribute("OK", true)
Object used for holding filtering params for ResourceDatabase.SearchResources() method.
Definition System.c:9
DataVarType
Definition DataVarType.c:18
proto void Print(void var, LogLevel level=LogLevel.NORMAL)
Prints content of variable to console/log.
proto void PrintFormat(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL, LogLevel level=LogLevel.NORMAL)
SCR_FieldOfViewSettings Attribute
proto int Find(T value)