2525 VisualizerPrebuiltArtifacts ,
2626 resolve_scene_data_requirements ,
2727)
28+ from isaaclab .rendering_mode .rendering_mode_utils import (
29+ apply_mode_profile_to_visualizer_cfg ,
30+ apply_runtime_mode_profile_to_visualizer ,
31+ )
2832from isaaclab .sim .utils import create_new_stage
2933from isaaclab .utils .version import has_kit
3034from isaaclab .visualizers .base_visualizer import BaseVisualizer
@@ -166,6 +170,7 @@ def __init__(self, cfg: SimulationCfg | None = None):
166170 # Initialize visualizer state (provider/visualizers are created lazily during initialize_visualizers()).
167171 self ._scene_data_provider : BaseSceneDataProvider | None = None
168172 self ._visualizers : list [BaseVisualizer ] = []
173+ self ._visualizer_mode_keys : dict [int , str | None ] = {}
169174 self ._scene_data_requirements = SceneDataRequirement ()
170175 self ._visualizer_prebuilt_artifact : VisualizerPrebuiltArtifacts | None = None
171176 self ._visualizer_step_counter = 0
@@ -188,119 +193,19 @@ def __init__(self, cfg: SimulationCfg | None = None):
188193
189194 type(self )._instance = self # Mark as valid singleton only after successful init
190195
191- def _apply_kit_rendering_preset (self , preset_name : str ) -> None :
192- apply_kit_rendering_preset (self .set_setting , preset_name )
193-
194- def _apply_kit_rendering_quality_cfg (self , quality_cfg : RenderingQualityCfg ) -> None :
195- apply_kit_rendering_quality_cfg (self .set_setting , quality_cfg )
196-
197- if rendering_mode :
198- supported_rendering_modes = {"performance" , "balanced" , "quality" }
199- if rendering_mode not in supported_rendering_modes :
200- raise ValueError (
201- f"RenderCfg rendering mode '{ rendering_mode } ' not in supported modes "
202- f"{ sorted (supported_rendering_modes )} ."
203- )
204-
205- isaaclab_app_exp_path = os .path .join (os .path .dirname (os .path .abspath (__file__ )), * [".." ] * 4 , "apps" )
206- from isaaclab .utils .version import get_isaac_sim_version
207-
208- if get_isaac_sim_version ().major < 6 :
209- isaaclab_app_exp_path = os .path .join (isaaclab_app_exp_path , "isaacsim_5" )
210-
211- preset_filename = os .path .join (isaaclab_app_exp_path , f"rendering_modes/{ rendering_mode } .kit" )
212- if os .path .exists (preset_filename ):
213- with open (preset_filename ) as file :
214- preset_dict = toml .load (file )
215-
216- def _apply_nested (data : dict [str , Any ], path : str = "" ) -> None :
217- for key , value in data .items ():
218- key_path = f"{ path } /{ key } " if path else f"/{ key } "
219- if isinstance (value , dict ):
220- _apply_nested (value , key_path )
221- else :
222- self .set_setting (key_path .replace ("." , "/" ), value )
223-
224- _apply_nested (preset_dict )
225- else :
226- logger .warning ("[SimulationContext] Render preset file not found: %s" , preset_filename )
227-
228- # RenderCfg fields mapped to setting paths (stored via SettingsManager)
229- field_to_setting = {
230- "enable_translucency" : "/rtx/translucency/enabled" ,
231- "enable_reflections" : "/rtx/reflections/enabled" ,
232- "enable_global_illumination" : "/rtx/indirectDiffuse/enabled" ,
233- "enable_dlssg" : "/rtx-transient/dlssg/enabled" ,
234- "enable_dl_denoiser" : "/rtx-transient/dldenoiser/enabled" ,
235- "dlss_mode" : "/rtx/post/dlss/execMode" ,
236- "enable_direct_lighting" : "/rtx/directLighting/enabled" ,
237- "samples_per_pixel" : "/rtx/directLighting/sampledLighting/samplesPerPixel" ,
238- "enable_shadows" : "/rtx/shadows/enabled" ,
239- "enable_ambient_occlusion" : "/rtx/ambientOcclusion/enabled" ,
240- "dome_light_upper_lower_strategy" : "/rtx/domeLight/upperLowerStrategy" ,
241- }
242-
243- for key , value in vars (render_cfg ).items ():
244- if value is None or key in {"rendering_mode" , "carb_settings" , "antialiasing_mode" }:
245- continue
246- setting_path = field_to_setting .get (key )
247- if setting_path is not None :
248- self .set_setting (setting_path , value )
249-
250- # Raw overrides from render_cfg (stored via SettingsManager)
251- extra_settings = getattr (render_cfg , "carb_settings" , None )
252- if extra_settings :
253- for key , value in extra_settings .items ():
254- if "_" in key :
255- path = "/" + key .replace ("_" , "/" )
256- elif "." in key :
257- path = "/" + key .replace ("." , "/" )
258- else :
259- path = key
260- self .set_setting (path , value )
261-
262- # Optional anti-aliasing mode via Replicator (best-effort, may use Omniverse APIs)
263- antialiasing_mode = getattr (render_cfg , "antialiasing_mode" , None )
264- if antialiasing_mode is not None :
265- try :
266- import omni .replicator .core as rep
267-
268- rep .settings .set_render_rtx_realtime (antialiasing = quality_cfg .kit_antialiasing_mode )
269- except Exception :
270- pass
271-
272- def _apply_newton_quality_cfg_to_visualizer_cfg (self , visualizer_cfg : Any , quality_cfg : RenderingQualityCfg ) -> None :
273- override_fields = {
274- "newton_enable_shadows" : "enable_shadows" ,
275- "newton_enable_sky" : "enable_sky" ,
276- "newton_enable_wireframe" : "enable_wireframe" ,
277- "newton_sky_upper_color" : "sky_upper_color" ,
278- "newton_sky_lower_color" : "sky_lower_color" ,
279- "newton_light_color" : "light_color" ,
280- }
281- for quality_field , viz_field in override_fields .items ():
282- value = getattr (quality_cfg , quality_field , None )
283- if value is not None and hasattr (visualizer_cfg , viz_field ):
284- setattr (visualizer_cfg , viz_field , value )
285-
286- def _resolve_rendering_quality_name_for_visualizer_cfg (self , visualizer_cfg : Any ) -> str | None :
287- return resolve_rendering_quality_name_for_visualizer_cfg (self .get_setting , visualizer_cfg )
288-
289- def _resolve_rendering_quality_cfg (self , quality_name : str | None ) -> RenderingQualityCfg | None :
290- quality_cfgs = getattr (self .cfg , "rendering_quality_cfgs" , None ) or {}
291- return resolve_rendering_quality_cfg (quality_name , quality_cfgs , logger )
292-
293- def _apply_quality_profile_to_visualizer_cfg (self , visualizer_cfg : Any ) -> None :
294- quality_cfgs = getattr (self .cfg , "rendering_quality_cfgs" , None ) or {}
295- apply_quality_profile_to_visualizer_cfg (
196+ def _apply_mode_profile_to_visualizer_cfg (self , visualizer_cfg : Any ) -> None :
197+ """Apply resolved rendering-mode profile to a visualizer config."""
198+ mode_cfgs = getattr (self .cfg , "rendering_mode_cfgs" , None ) or {}
199+ apply_mode_profile_to_visualizer_cfg (
296200 self .get_setting ,
297201 self .set_setting ,
298202 visualizer_cfg ,
299203 mode_cfgs ,
300204 logger ,
301205 )
302206
303- def _apply_runtime_mode_profile_to_visualizer (self , viz : Visualizer , force : bool = False ) -> None :
207+ def _apply_runtime_mode_profile_to_visualizer (self , viz : BaseVisualizer , force : bool = False ) -> None :
208+ """Apply rendering-mode profile updates to an active visualizer instance."""
304209 mode_cfgs = getattr (self .cfg , "rendering_mode_cfgs" , None ) or {}
305210 apply_runtime_mode_profile_to_visualizer (
306211 self .get_setting ,
@@ -481,6 +386,11 @@ def _is_cli_visualizer_disable_all(self) -> bool:
481386
482387 def resolve_visualizer_types (self ) -> list [str ]:
483388 """Resolve visualizer types from config or CLI settings."""
389+ if self ._is_cli_visualizer_disable_all ():
390+ return []
391+ if self ._is_cli_visualizer_explicit ():
392+ return self ._get_cli_visualizer_types ()
393+
484394 visualizer_cfgs = self .cfg .visualizer_cfgs
485395 if visualizer_cfgs is None :
486396 return []
@@ -715,6 +625,7 @@ def update_visualizers(self, dt: float) -> None:
715625 visualizers_to_remove = []
716626 for viz in self ._visualizers :
717627 try :
628+ self ._apply_runtime_mode_profile_to_visualizer (viz )
718629 if viz .is_closed or not viz .is_running ():
719630 if viz .is_closed :
720631 logger .info ("Visualizer closed: %s" , type (viz ).__name__ )
0 commit comments