@@ -54,7 +54,8 @@ public class ObjectEditorModel
54
54
public ObjectEditorModel ( )
55
55
{
56
56
Logger = new Logger ( ) ;
57
- LoggerObservableLogs = new ObservableCollection < LogLine > ( ( ( Logger ) Logger ) . Logs ) ;
57
+ LoggerObservableLogs = [ ] ;
58
+ Logger . LogAdded += ( sender , laea ) => LoggerObservableLogs . Add ( laea . Log ) ;
58
59
59
60
LoadSettings ( SettingsFile , Logger ) ;
60
61
}
@@ -76,15 +77,13 @@ public void LoadSettings(string settingsFile, ILogger? logger)
76
77
77
78
Settings = settings ! ;
78
79
79
- if ( ! ValidateSettings ( Settings , logger ) )
80
+ if ( ValidateSettings ( Settings , logger ) )
80
81
{
81
- return ;
82
- }
83
-
84
- if ( File . Exists ( Settings . GetObjDataFullPath ( Settings . IndexFileName ) ) )
85
- {
86
- logger ? . Info ( $ "Loading header index from \" { Settings . IndexFileName } \" ") ;
87
- LoadObjDirectory ( Settings . ObjDataDirectory , new Progress < float > ( ) , true ) ;
82
+ if ( File . Exists ( Settings . GetObjDataFullPath ( Settings . IndexFileName ) ) )
83
+ {
84
+ Logger ? . Info ( $ "Loading header index from \" { Settings . IndexFileName } \" ") ;
85
+ LoadObjDirectoryAsync ( Settings . ObjDataDirectory , new Progress < float > ( ) , true ) . Wait ( ) ;
86
+ }
88
87
}
89
88
}
90
89
@@ -159,70 +158,29 @@ public bool TryLoadObject(string filename, out UiLocoFile? uiLocoFile)
159
158
}
160
159
161
160
// this method loads every single object entirely. it takes a long time to run
162
- void CreateIndex ( string [ ] allFiles , IProgress < float > ? progress )
161
+ async Task CreateIndex ( string [ ] allFiles , IProgress < float > progress )
163
162
{
164
163
Logger ? . Info ( $ "Creating index on { allFiles . Length } files") ;
165
164
166
- ConcurrentDictionary < string , IndexObjectHeader > ccHeaderIndex = new ( ) ; // key is full path/filename
167
-
168
- var count = 0 ;
169
- ConcurrentDictionary < string , TimeSpan > timePerFile = new ( ) ;
170
-
171
165
var sw = new Stopwatch ( ) ;
172
166
sw . Start ( ) ;
173
167
174
168
var fileCount = allFiles . Length ;
175
-
176
- _ = Parallel . ForEach ( allFiles , new ParallelOptions ( ) { MaxDegreeOfParallelism = 16 } , ( filename )
177
- => count = LoadAndIndexFile ( count , filename ) ) ;
178
-
179
- HeaderIndex = ccHeaderIndex . OrderBy ( kvp => kvp . Key ) . ToDictionary ( kvp => kvp . Key , kvp => kvp . Value ) ;
169
+ var index = await SawyerStreamReader . FastIndexAsync ( allFiles , progress ) ;
170
+
171
+ HeaderIndex = index . ToDictionary (
172
+ x => x . filename ,
173
+ x => new ObjectIndexModel (
174
+ x . s5 . Name ,
175
+ DatFileType . Object ,
176
+ x . s5 . ObjectType ,
177
+ x . s5 . SourceGame ,
178
+ x . s5 . Checksum ,
179
+ x . VehicleType )
180
+ ) ;
180
181
181
182
sw . Stop ( ) ;
182
- Logger ? . Info ( "Finished creating index" ) ;
183
- Logger ? . Debug ( $ "Time time={ sw . Elapsed } ") ;
184
-
185
- if ( timePerFile . IsEmpty )
186
- {
187
- _ = timePerFile . TryAdd ( "<no items>" , TimeSpan . Zero ) ;
188
- }
189
-
190
- var slowest = timePerFile . MaxBy ( x => x . Value . Ticks ) ;
191
- Logger ? . Debug ( $ "Slowest file={ slowest . Key } Time={ slowest . Value } ") ;
192
-
193
- var average = timePerFile . Average ( x => x . Value . TotalMilliseconds ) ;
194
- Logger ? . Debug ( $ "Average time={ average } ms") ;
195
-
196
- var median = timePerFile . OrderBy ( x => x . Value ) . Skip ( timePerFile . Count / 2 ) . Take ( 1 ) . Single ( ) ;
197
- Logger ? . Debug ( $ "Median time={ median . Value } ms") ;
198
-
199
- int LoadAndIndexFile ( int count , string filename )
200
- {
201
- var startTime = sw . Elapsed ;
202
- var loadResult = TryLoadObject ( filename , out var uiLocoFile ) ;
203
- var elapsed = sw . Elapsed - startTime ;
204
-
205
- if ( loadResult && uiLocoFile != null )
206
- {
207
- _ = ccHeaderIndex . TryAdd ( filename , new IndexObjectHeader (
208
- uiLocoFile . DatFileInfo . S5Header . Name ,
209
- DatFileType . Object ,
210
- uiLocoFile . DatFileInfo . S5Header . ObjectType ,
211
- uiLocoFile . DatFileInfo . S5Header . SourceGame ,
212
- uiLocoFile . DatFileInfo . S5Header . Checksum ,
213
- uiLocoFile . LocoObject . Object is VehicleObject veh ? veh . Type : null ) ) ;
214
-
215
- _ = timePerFile . TryAdd ( uiLocoFile . DatFileInfo . S5Header . Name , elapsed ) ;
216
- }
217
- else
218
- {
219
- Logger ? . Error ( $ "Failed to load \" { filename } \" ") ;
220
- }
221
-
222
- _ = Interlocked . Increment ( ref count ) ;
223
- progress ? . Report ( ( float ) count / fileCount ) ;
224
- return count ;
225
- }
183
+ Logger ? . Info ( $ "Indexed { fileCount } in { sw . Elapsed } ") ;
226
184
}
227
185
228
186
public void SaveFile ( string path , UiLocoFile obj )
@@ -275,7 +233,7 @@ void LoadKnownData(HashSet<string> allFilesInDir, HashSet<string> knownFilenames
275
233
276
234
//LoadPalette(); // update palette from g1
277
235
278
- SaveSettings ( ) ;
236
+ //await SaveSettings();
279
237
280
238
return true ;
281
239
}
@@ -286,19 +244,14 @@ void LoadKnownData(HashSet<string> allFilesInDir, HashSet<string> knownFilenames
286
244
// var allFiles = Directory.GetFiles(directory, "*.dat|*.sv5|*.sc5", SearchOption.AllDirectories);
287
245
//}
288
246
289
- public async Task LoadObjDirectoryAsync ( string directory , IProgress < float > ? progress , bool useExistingIndex )
290
- {
291
- await Task . Run ( ( ) => LoadObjDirectory ( directory , progress , useExistingIndex ) ) ;
292
- await Task . Run ( SaveSettings ) ;
293
- }
294
-
295
- public void LoadObjDirectory ( string directory )
296
- => LoadObjDirectory ( directory , null , true ) ;
247
+ //public void LoadObjDirectory(string directory)
248
+ // => LoadObjDirectory(directory, new Progress<float>(), true);
297
249
298
- public void LoadObjDirectory ( string directory , IProgress < float > ? progress , bool useExistingIndex )
250
+ public async Task LoadObjDirectoryAsync ( string directory , IProgress < float > progress , bool useExistingIndex )
299
251
{
300
- if ( ! Directory . Exists ( directory ) )
252
+ if ( string . IsNullOrEmpty ( directory ) || ! Directory . Exists ( directory ) || progress == null )
301
253
{
254
+ Logger ? . Error ( $ "Couldn't start loading obj dir: { directory } ") ;
302
255
return ;
303
256
}
304
257
@@ -324,7 +277,7 @@ public void LoadObjDirectory(string directory, IProgress<float>? progress, bool
324
277
else
325
278
{
326
279
Logger ? . Info ( "Recreating index file" ) ;
327
- CreateIndex ( allFiles , progress ) ; // do we need the array?
280
+ await CreateIndex ( allFiles , progress ) ; // do we need the array?
328
281
SerialiseHeaderIndexToFile ( Settings . GetObjDataFullPath ( Settings . IndexFileName ) , HeaderIndex , GetOptions ( ) ) ;
329
282
}
330
283
0 commit comments