@@ -202,9 +202,25 @@ private string GetDisplayName(Model model)
202202
203203 return displayName ;
204204 }
205+ private bool HasMatchingModel ( List < Model > models )
206+ {
207+ if ( string . IsNullOrEmpty ( filter ) ) return false ;
205208
209+ foreach ( Model model in models )
210+ {
211+ string displayName = GetDisplayName ( model ) ;
212+ if ( displayName . ToUpper ( ) . Contains ( filterUpper ) )
213+ return true ;
214+ }
215+ return false ;
216+ }
206217 private void RenderSubTree ( string name , List < Model > models , List < Texture > textureSet )
207218 {
219+ // uncollapse if we find any matching model names
220+ if ( ! string . IsNullOrEmpty ( filter ) && HasMatchingModel ( models ) )
221+ {
222+ ImGui . SetNextItemOpen ( true ) ;
223+ }
208224 if ( ImGui . TreeNode ( name ) )
209225 {
210226 for ( int i = 0 ; i < models . Count ; i ++ )
@@ -236,24 +252,31 @@ private void RenderTree()
236252 RenderSubTree ( "Gadget" , sortedGadgetModels , ( level . game == GameType . RaC1 ) ? level . textures : level . gadgetTextures ) ;
237253 if ( level . armorModels . Count > 0 )
238254 {
255+ bool hasMatch = ! string . IsNullOrEmpty ( filter ) && level . armorModels . Exists ( m =>
256+ ( "Armor " + level . armorModels . IndexOf ( m ) ) . ToUpper ( ) . Contains ( filterUpper ) ) ;
257+
258+ if ( hasMatch ) ImGui . SetNextItemOpen ( true ) ;
259+
239260 if ( ImGui . TreeNode ( "Armor" ) )
240261 {
241262 for ( int i = 0 ; i < level . armorModels . Count ; i ++ )
242263 {
243- Model armor = level . armorModels [ i ] ;
244- RenderModelEntry ( armor , level . armorTextures [ i ] , "Armor " + i ) ;
264+ RenderModelEntry ( level . armorModels [ i ] , level . armorTextures [ i ] , "Armor " + i ) ;
245265 }
246266 ImGui . TreePop ( ) ;
247267 }
248268 }
269+
249270 if ( sortedMissionModels . Count > 0 )
250271 {
272+ bool hasMatch = ! string . IsNullOrEmpty ( filter ) && sortedMissionModels . Exists ( HasMatchingModel ) ;
273+ if ( hasMatch ) ImGui . SetNextItemOpen ( true ) ;
274+
251275 if ( ImGui . TreeNode ( "Missions" ) )
252276 {
253277 for ( int i = 0 ; i < sortedMissionModels . Count ; i ++ )
254278 {
255- Mission mission = level . missions [ i ] ;
256- RenderSubTree ( "Mission " + i , sortedMissionModels [ i ] , mission . textures ) ;
279+ RenderSubTree ( "Mission " + level . missions [ i ] . missionID , sortedMissionModels [ i ] , level . missions [ i ] . textures ) ;
257280 }
258281 ImGui . TreePop ( ) ;
259282 }
@@ -289,7 +312,12 @@ private void RenderInstanceList()
289312 string objName = $ "Instance##{ obj . globalID } ";
290313 if ( obj is Moby mob )
291314 {
292- objName = $ "Instance [{ GetStringFromID ( mob . mobyID ) } ]##{ mob . globalID } ";
315+ objName = $ "Instance [{ GetStringFromID ( mob . mobyID ) } ]";
316+
317+ if ( mob . missionID != - 1 && level . game == GameType . DL )
318+ {
319+ objName = $ "Instance [Mission { mob . missionID } : { GetStringFromID ( mob . mobyID ) } ]";
320+ }
293321 }
294322
295323 if ( ImGui . Button ( objName ) )
@@ -571,11 +599,20 @@ private void UpdateInstanceList()
571599 foreach ( Moby mob in level . mobs )
572600 {
573601 if ( mob . modelID == selectedModel . id )
574- {
575602 selectedObjectInstances . Add ( mob ) ;
603+ }
604+
605+ foreach ( var mission in level . missions )
606+ {
607+ if ( ! levelFrame . IsMissionActive ( mission ) ) continue ;
608+ foreach ( Moby mob in mission . mobies )
609+ {
610+ if ( mob . modelID == selectedModel . id )
611+ selectedObjectInstances . Add ( mob ) ;
576612 }
577613 }
578614 }
615+
579616 else if ( selectedModel is TieModel )
580617 {
581618 foreach ( Tie tie in level . ties )
0 commit comments