From 771757868b35cfab40e9d2effcf579a764e0747b Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Sat, 21 Feb 2026 00:23:17 +0000 Subject: [PATCH 01/34] init pass --- apps/rendering_modes/balanced.kit | 49 ----- apps/rendering_modes/performance.kit | 48 ----- apps/rendering_modes/quality.kit | 53 ------ docs/source/deployment/cluster.rst | 2 +- docs/source/deployment/docker.rst | 2 +- docs/source/deployment/run_docker_example.rst | 4 +- docs/source/features/hydra.rst | 8 +- docs/source/features/multi_gpu.rst | 24 +-- .../features/population_based_training.rst | 2 +- docs/source/features/visualization.rst | 2 +- .../estimate_how_many_cameras_can_run.rst | 2 +- docs/source/how-to/import_new_asset.rst | 2 +- docs/source/how-to/record_video.rst | 2 +- docs/source/how-to/save_camera_output.rst | 2 +- docs/source/how-to/simulation_performance.rst | 2 +- .../migration/migrating_from_isaacgymenvs.rst | 2 +- .../migrating_from_omniisaacgymenvs.rst | 2 +- docs/source/overview/environments.rst | 2 +- .../augmented_imitation.rst | 2 +- .../overview/imitation-learning/skillgen.rst | 16 +- .../performance_benchmarks.rst | 8 +- .../rl_existing_scripts.rst | 26 +-- .../reinforcement-learning/rl_frameworks.rst | 10 +- .../00_hover/hover_policy.rst | 8 +- .../02_gear_assembly/gear_assembly_policy.rst | 8 +- docs/source/refs/release_notes.rst | 4 +- docs/source/refs/troubleshooting.rst | 4 +- .../include/src_verify_isaaclab.rst | 10 +- docs/source/setup/quickstart.rst | 2 +- docs/source/testing/benchmarks.rst | 6 +- docs/source/tutorials/00_sim/create_empty.rst | 2 +- .../03_envs/configuring_rl_training.rst | 6 +- .../03_envs/modify_direct_rl_env.rst | 2 +- .../03_envs/policy_inference_in_usd.rst | 2 +- source/isaaclab/isaaclab/app/app_launcher.py | 20 +- source/isaaclab/isaaclab/renderer/__init__.py | 5 + .../renderer/rendering_quality_presets.py | 82 ++++++++ .../isaaclab/isaaclab/sim/simulation_cfg.py | 176 ++++++------------ .../isaaclab/sim/simulation_context.py | 115 ++++++++++-- .../isaaclab/visualizers/visualizer_cfg.py | 7 + .../test/sim/test_simulation_render_config.py | 103 ++++------ .../test/test_generate_dataset.py | 6 +- .../test/test_generate_dataset_skillgen.py | 3 +- .../test_environments_training.py | 3 +- 44 files changed, 389 insertions(+), 457 deletions(-) delete mode 100644 apps/rendering_modes/balanced.kit delete mode 100644 apps/rendering_modes/performance.kit delete mode 100644 apps/rendering_modes/quality.kit create mode 100644 source/isaaclab/isaaclab/renderer/__init__.py create mode 100644 source/isaaclab/isaaclab/renderer/rendering_quality_presets.py diff --git a/apps/rendering_modes/balanced.kit b/apps/rendering_modes/balanced.kit deleted file mode 100644 index be2b03c0323..00000000000 --- a/apps/rendering_modes/balanced.kit +++ /dev/null @@ -1,49 +0,0 @@ -### THESE ARE RT1 SETTINGS ONLY ### -# rtx.translucency.enabled = false -# rtx.reflections.enabled = false -# rtx.reflections.denoiser.enabled = true -## this will be ignored when RR (dldenoiser) is enabled -## rtx.directLighting.sampledLighting.denoisingTechnique = 0 -# rtx.directLighting.sampledLighting.enabled = true -# rtx.indirectDiffuse.enabled = false -# rtx.indirectDiffuse.denoiser.enabled = true -############################################## - -### THESE ARE RT2 SETTINGS TO MATCH ABOVE PERFORMANCE SETTINGS ### -# these are needed if indirectDiffuse = false (this means GI false) - maxBounces needs to be 2 -rtx.rtpt.cached.enabled = false -rtx.rtpt.lightcache.cached.enabled = false -rtx.rtpt.translucency.virtualMotion.enabled = false -rtx.rtpt.maxBounces = 2 -rtx.rtpt.splitGlass = false -rtx.rtpt.splitClearcoat = false -rtx.rtpt.splitRoughReflection = true -# this gives slightly brighter image -rtx.rtpt.useAmbientOcclusionForAmbientLight = false -############################################## - -rtx.sceneDb.ambientLightIntensity = 1.0 - -rtx.shadows.enabled = true - -# rtx.domeLight.upperLowerStrategy = 3 - -rtx.ambientOcclusion.enabled = false -rtx.ambientOcclusion.denoiserMode = 1 - -rtx.raytracing.subpixel.mode = 0 -rtx.raytracing.cached.enabled = true - -# DLSS frame gen does not yet support tiled camera well -rtx-transient.dlssg.enabled = false - -rtx-transient.dldenoiser.enabled = true - -# Set the DLSS model -rtx.post.dlss.execMode = 1 # can be 0 (Performance), 1 (Balanced), 2 (Quality), or 3 (Auto) - -# Avoids replicator warning -rtx.pathtracing.maxSamplesPerLaunch = 1000000 - -# Avoids silent trimming of tiles -rtx.viewTile.limit = 1000000 diff --git a/apps/rendering_modes/performance.kit b/apps/rendering_modes/performance.kit deleted file mode 100644 index f991bd372bd..00000000000 --- a/apps/rendering_modes/performance.kit +++ /dev/null @@ -1,48 +0,0 @@ -### THESE ARE RT1 SETTINGS ONLY ### -# rtx.translucency.enabled = false -# rtx.reflections.enabled = false -# rtx.reflections.denoiser.enabled = false -# rtx.directLighting.sampledLighting.denoisingTechnique = 0 -# rtx.directLighting.sampledLighting.enabled = false -# rtx.indirectDiffuse.enabled = false -# rtx.indirectDiffuse.denoiser.enabled = false -############################################## - -### THESE ARE RT2 SETTINGS TO MATCH ABOVE PERFORMANCE SETTINGS ### -# these are needed if indirectDiffuse = false (this means GI false) - maxBounces needs to be 2 -rtx.rtpt.cached.enabled = false -rtx.rtpt.lightcache.cached.enabled = false -rtx.rtpt.translucency.virtualMotion.enabled = false -rtx.rtpt.maxBounces = 2 -rtx.rtpt.splitGlass = false -rtx.rtpt.splitClearcoat = false -rtx.rtpt.splitRoughReflection = true -# this gives slightly brighter image -rtx.rtpt.useAmbientOcclusionForAmbientLight = false -############################################## - -rtx.sceneDb.ambientLightIntensity = 1.0 - -rtx.shadows.enabled = true - -rtx.domeLight.upperLowerStrategy = 3 - -rtx.ambientOcclusion.enabled = false -rtx.ambientOcclusion.denoiserMode = 1 - -rtx.raytracing.subpixel.mode = 0 -rtx.raytracing.cached.enabled = false - -# DLSS frame gen does not yet support tiled camera well -rtx-transient.dlssg.enabled = false - -rtx-transient.dldenoiser.enabled = false - -# Set the DLSS model -rtx.post.dlss.execMode = 0 # can be 0 (Performance), 1 (Balanced), 2 (Quality), or 3 (Auto) - -# Avoids replicator warning -rtx.pathtracing.maxSamplesPerLaunch = 1000000 - -# Avoids silent trimming of tiles -rtx.viewTile.limit = 1000000 diff --git a/apps/rendering_modes/quality.kit b/apps/rendering_modes/quality.kit deleted file mode 100644 index 56073b84c67..00000000000 --- a/apps/rendering_modes/quality.kit +++ /dev/null @@ -1,53 +0,0 @@ -### THESE ARE RT1 SETTINGS ONLY ### -# rtx.translucency.enabled = true -# rtx.reflections.enabled = true -# rtx.reflections.denoiser.enabled = true -## this will be ignored when RR (dldenoiser) is enabled -## rtx.directLighting.sampledLighting.denoisingTechnique = 0 -# rtx.directLighting.sampledLighting.enabled = true -# rtx.indirectDiffuse.enabled = true -# rtx.indirectDiffuse.denoiser.enabled = true -############################################## - -### THESE ARE RT2 SETTINGS ### -# maxBounces should be 3 if indirectDiffuse was true -rtx.rtpt.maxBounces = 3 -rtx.rtpt.cached.enabled = false -rtx.rtpt.lightcache.cached.enabled = false -rtx.rtpt.translucency.virtualMotion.enabled = false -rtx.rtpt.splitRoughReflection = true -# these are even more costly, we should only set them to true if noise is observed -# rtx.rtpt.splitGlass = true -# rtx.rtpt.splitClearcoat = true - -# Improved adaptive sampling for disocclusion (reduces ghosting/temporal artifacts) -rtx.rtpt.adaptiveSampling.disocclusion.enabled = true -rtx.rtpt.adaptiveSampling.disocclusion.spp = 4 -############################################## - -rtx.sceneDb.ambientLightIntensity = 1.0 - -rtx.shadows.enabled = true - -# rtx.domeLight.upperLowerStrategy = 4 - -rtx.ambientOcclusion.enabled = true -rtx.ambientOcclusion.denoiserMode = 0 - -rtx.raytracing.subpixel.mode = 1 -rtx.raytracing.cached.enabled = true - -# DLSS frame gen does not yet support tiled camera well -rtx-transient.dlssg.enabled = false - -# RT2 only supports DLSS-RR -# rtx-transient.dldenoiser.enabled = true - -# Set the DLSS model -rtx.post.dlss.execMode = 2 # can be 0 (Performance), 1 (Balanced), 2 (Quality), or 3 (Auto) - -# Avoids replicator warning -rtx.pathtracing.maxSamplesPerLaunch = 1000000 - -# Avoids silent trimming of tiles -rtx.viewTile.limit = 1000000 diff --git a/docs/source/deployment/cluster.rst b/docs/source/deployment/cluster.rst index ab9e03874e7..5374cc88d50 100644 --- a/docs/source/deployment/cluster.rst +++ b/docs/source/deployment/cluster.rst @@ -199,7 +199,7 @@ ANYmal rough terrain locomotion training can be executed with the following comm .. code:: bash - ./docker/cluster/cluster_interface.sh job --task Isaac-Velocity-Rough-Anymal-C-v0 --headless --video --enable_cameras + ./docker/cluster/cluster_interface.sh job --task Isaac-Velocity-Rough-Anymal-C-v0 --visualizer none --video --enable_cameras The above will, in addition, also render videos of the training progress and store them under ``isaaclab/logs`` directory. diff --git a/docs/source/deployment/docker.rst b/docs/source/deployment/docker.rst index 65e22e2aef7..37cf18ee57e 100644 --- a/docs/source/deployment/docker.rst +++ b/docs/source/deployment/docker.rst @@ -349,7 +349,7 @@ To run an example within the container, run: .. code:: bash - ./isaaclab.sh -p scripts/tutorials/00_sim/log_time.py --headless + ./isaaclab.sh -p scripts/tutorials/00_sim/log_time.py --visualizer none .. _`NVIDIA Software License Agreement`: https://www.nvidia.com/en-us/agreements/enterprise-software/nvidia-software-license-agreement diff --git a/docs/source/deployment/run_docker_example.rst b/docs/source/deployment/run_docker_example.rst index 8da716585f7..a42baf13c59 100644 --- a/docs/source/deployment/run_docker_example.rst +++ b/docs/source/deployment/run_docker_example.rst @@ -92,11 +92,11 @@ The output will be a file, ``log.txt``, with the ``sim_time`` written on a newli Executing the Script ~~~~~~~~~~~~~~~~~~~~ -We will execute the script to produce a log, adding a ``--headless`` flag to our execution to prevent a GUI: +We will execute the script to produce a log, adding a ``--visualizer none`` flag to our execution to prevent a GUI: .. code-block:: bash - isaaclab -p scripts/tutorials/00_sim/log_time.py --headless + isaaclab -p scripts/tutorials/00_sim/log_time.py --visualizer none Now ``log.txt`` will have been produced at ``/workspace/isaaclab/logs/docker_tutorial``. If we exit the container diff --git a/docs/source/features/hydra.rst b/docs/source/features/hydra.rst index 0e3ddc34181..0ea0cd6f33d 100644 --- a/docs/source/features/hydra.rst +++ b/docs/source/features/hydra.rst @@ -25,28 +25,28 @@ As a result, training with hydra arguments can be run with the following syntax: .. code-block:: shell - python scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Cartpole-v0 --headless env.actions.joint_effort.scale=10.0 agent.seed=2024 + python scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Cartpole-v0 --visualizer none env.actions.joint_effort.scale=10.0 agent.seed=2024 .. tab-item:: rl_games :sync: rl_games .. code-block:: shell - python scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-v0 --headless env.actions.joint_effort.scale=10.0 agent.params.seed=2024 + python scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-v0 --visualizer none env.actions.joint_effort.scale=10.0 agent.params.seed=2024 .. tab-item:: skrl :sync: skrl .. code-block:: shell - python scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --headless env.actions.joint_effort.scale=10.0 agent.seed=2024 + python scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --visualizer none env.actions.joint_effort.scale=10.0 agent.seed=2024 .. tab-item:: sb3 :sync: sb3 .. code-block:: shell - python scripts/reinforcement_learning/sb3/train.py --task=Isaac-Cartpole-v0 --headless env.actions.joint_effort.scale=10.0 agent.seed=2024 + python scripts/reinforcement_learning/sb3/train.py --task=Isaac-Cartpole-v0 --visualizer none env.actions.joint_effort.scale=10.0 agent.seed=2024 The above command will run the training script with the task ``Isaac-Cartpole-v0`` in headless mode, and set the ``env.actions.joint_effort.scale`` parameter to 10.0 and the ``agent.seed`` parameter to 2024. diff --git a/docs/source/features/multi_gpu.rst b/docs/source/features/multi_gpu.rst index 2537e5eff25..7c3e58d6f90 100644 --- a/docs/source/features/multi_gpu.rst +++ b/docs/source/features/multi_gpu.rst @@ -96,14 +96,14 @@ To train with multiple GPUs, use the following command, where ``--nproc_per_node .. code-block:: shell - python -m torch.distributed.run --nnodes=1 --nproc_per_node=2 scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-v0 --headless --distributed + python -m torch.distributed.run --nnodes=1 --nproc_per_node=2 scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-v0 --visualizer none --distributed .. tab-item:: rsl_rl :sync: rsl_rl .. code-block:: shell - python -m torch.distributed.run --nnodes=1 --nproc_per_node=2 scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Cartpole-v0 --headless --distributed + python -m torch.distributed.run --nnodes=1 --nproc_per_node=2 scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Cartpole-v0 --visualizer none --distributed .. tab-item:: skrl :sync: skrl @@ -115,14 +115,14 @@ To train with multiple GPUs, use the following command, where ``--nproc_per_node .. code-block:: shell - python -m torch.distributed.run --nnodes=1 --nproc_per_node=2 scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --headless --distributed + python -m torch.distributed.run --nnodes=1 --nproc_per_node=2 scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --visualizer none --distributed .. tab-item:: JAX :sync: jax .. code-block:: shell - python -m skrl.utils.distributed.jax --nnodes=1 --nproc_per_node=2 scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --headless --distributed --ml_framework jax + python -m skrl.utils.distributed.jax --nnodes=1 --nproc_per_node=2 scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --visualizer none --distributed --ml_framework jax Multi-Node Training ------------------- @@ -141,14 +141,14 @@ For the master node, use the following command, where ``--nproc_per_node`` repre .. code-block:: shell - python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=0 --master_addr= --master_port=5555 scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-v0 --headless --distributed + python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=0 --master_addr= --master_port=5555 scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-v0 --visualizer none --distributed .. tab-item:: rsl_rl :sync: rsl_rl .. code-block:: shell - python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=0 --master_addr= --master_port=5555 scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Cartpole-v0 --headless --distributed + python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=0 --master_addr= --master_port=5555 scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Cartpole-v0 --visualizer none --distributed .. tab-item:: skrl :sync: skrl @@ -160,14 +160,14 @@ For the master node, use the following command, where ``--nproc_per_node`` repre .. code-block:: shell - python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=0 --master_addr= --master_port=5555 scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --headless --distributed + python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=0 --master_addr= --master_port=5555 scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --visualizer none --distributed .. tab-item:: JAX :sync: jax .. code-block:: shell - python -m skrl.utils.distributed.jax --nproc_per_node=2 --nnodes=2 --node_rank=0 --coordinator_address=ip_of_master_machine:5555 scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --headless --distributed --ml_framework jax + python -m skrl.utils.distributed.jax --nproc_per_node=2 --nnodes=2 --node_rank=0 --coordinator_address=ip_of_master_machine:5555 scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --visualizer none --distributed --ml_framework jax Note that the port (``5555``) can be replaced with any other available port. @@ -181,14 +181,14 @@ For non-master nodes, use the following command, replacing ``--node_rank`` with .. code-block:: shell - python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=1 --master_addr= --master_port=5555 scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-v0 --headless --distributed + python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=1 --master_addr= --master_port=5555 scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-v0 --visualizer none --distributed .. tab-item:: rsl_rl :sync: rsl_rl .. code-block:: shell - python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=1 --master_addr= --master_port=5555 scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Cartpole-v0 --headless --distributed + python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=1 --master_addr= --master_port=5555 scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Cartpole-v0 --visualizer none --distributed .. tab-item:: skrl :sync: skrl @@ -200,14 +200,14 @@ For non-master nodes, use the following command, replacing ``--node_rank`` with .. code-block:: shell - python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=1 --master_addr= --master_port=5555 scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --headless --distributed + python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=1 --master_addr= --master_port=5555 scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --visualizer none --distributed .. tab-item:: JAX :sync: jax .. code-block:: shell - python -m skrl.utils.distributed.jax --nproc_per_node=2 --nnodes=2 --node_rank=1 --coordinator_address=ip_of_master_machine:5555 scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --headless --distributed --ml_framework jax + python -m skrl.utils.distributed.jax --nproc_per_node=2 --nnodes=2 --node_rank=1 --coordinator_address=ip_of_master_machine:5555 scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --visualizer none --distributed --ml_framework jax For more details on multi-node training with PyTorch, please visit the `PyTorch documentation `_. diff --git a/docs/source/features/population_based_training.rst b/docs/source/features/population_based_training.rst index 1de85bb57c5..8efc77f04c1 100644 --- a/docs/source/features/population_based_training.rst +++ b/docs/source/features/population_based_training.rst @@ -118,7 +118,7 @@ Launch *N* workers, where *n* indicates each worker index: --seed= \ --task=Isaac-Repose-Cube-Shadow-Direct-v0 \ --num_envs=8192 \ - --headless \ + --visualizer none \ --track \ --wandb-name=idx \ --wandb-entity=<**entity**> \ diff --git a/docs/source/features/visualization.rst b/docs/source/features/visualization.rst index 13d573308ef..40c28d584e5 100644 --- a/docs/source/features/visualization.rst +++ b/docs/source/features/visualization.rst @@ -176,7 +176,7 @@ For the migration-focused summary and deprecation context, see Visualizer Backends ------------------- -Omniverse Visualizer +Kit Visualizer ~~~~~~~~~~~~~~~~~~~~ **Main Features:** diff --git a/docs/source/how-to/estimate_how_many_cameras_can_run.rst b/docs/source/how-to/estimate_how_many_cameras_can_run.rst index ec9fa72cfb6..6a6dc8ce781 100644 --- a/docs/source/how-to/estimate_how_many_cameras_can_run.rst +++ b/docs/source/how-to/estimate_how_many_cameras_can_run.rst @@ -109,7 +109,7 @@ to live monitor resources while running this script, and in Windows, you can use If your system has a hard time handling the desired cameras, you can try the following - - Switch to headless mode (supply ``--headless``) + - Switch to headless mode (supply ``--visualizer none``) - Ensure you are using the GPU pipeline not CPU! - If you aren't using Tiled Cameras, switch to Tiled Cameras - Decrease camera resolution diff --git a/docs/source/how-to/import_new_asset.rst b/docs/source/how-to/import_new_asset.rst index e241be44e96..b62015a2942 100644 --- a/docs/source/how-to/import_new_asset.rst +++ b/docs/source/how-to/import_new_asset.rst @@ -140,7 +140,7 @@ is derived automatically from the robot name in the URDF): * ``anymal.usda`` - This is the main asset file. -To run the script headless, you can add the ``--headless`` flag. This will not open the GUI and +To run the script headless, you can add the ``--visualizer none`` flag. This will not open the GUI and exit the script after the conversion is complete. You can press play on the opened window to see the asset in the scene. The asset should fall under gravity. If it blows up, then it might be that you have self-collisions present in the URDF. diff --git a/docs/source/how-to/record_video.rst b/docs/source/how-to/record_video.rst index aba74363129..7339f532c31 100644 --- a/docs/source/how-to/record_video.rst +++ b/docs/source/how-to/record_video.rst @@ -18,7 +18,7 @@ Example usage: .. code-block:: shell - python scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-v0 --headless --video --video_length 100 --video_interval 500 + python scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-v0 --visualizer none --video --video_length 100 --video_interval 500 The recorded videos will be saved in the same directory as the training checkpoints, under diff --git a/docs/source/how-to/save_camera_output.rst b/docs/source/how-to/save_camera_output.rst index f92f9bcc93d..cf294b2315c 100644 --- a/docs/source/how-to/save_camera_output.rst +++ b/docs/source/how-to/save_camera_output.rst @@ -92,7 +92,7 @@ To run the accompanying script, execute the following command: ./isaaclab.sh -p scripts/tutorials/04_sensors/run_usd_camera.py --save --draw --enable_cameras # Usage with saving only in headless mode - ./isaaclab.sh -p scripts/tutorials/04_sensors/run_usd_camera.py --save --headless --enable_cameras + ./isaaclab.sh -p scripts/tutorials/04_sensors/run_usd_camera.py --save --visualizer none --enable_cameras The simulation should start, and you can observe different objects falling down. An output folder will be created diff --git a/docs/source/how-to/simulation_performance.rst b/docs/source/how-to/simulation_performance.rst index bab04b6e8c1..76985156148 100644 --- a/docs/source/how-to/simulation_performance.rst +++ b/docs/source/how-to/simulation_performance.rst @@ -13,7 +13,7 @@ of objects in the scene, the complexity of the physics simulation, and the hardw Here are some tips to improve performance: 1. **Use Headless Mode**: Running the simulation in headless mode can significantly improve performance, especially - when rendering is not required. You can enable headless mode by using the ``--headless`` flag when running the + when rendering is not required. You can enable headless mode by using the ``--visualizer none`` flag when running the simulator. 2. **Avoid Unnecessary Collisions**: If possible, reduce the number of object overlaps to reduce overhead in the simulation. Excessive contacts and collisions in the simulation can be expensive in the collision phase in the simulation. diff --git a/docs/source/migration/migrating_from_isaacgymenvs.rst b/docs/source/migration/migrating_from_isaacgymenvs.rst index db6371c40c9..ef14354adc3 100644 --- a/docs/source/migration/migrating_from_isaacgymenvs.rst +++ b/docs/source/migration/migrating_from_isaacgymenvs.rst @@ -916,7 +916,7 @@ To launch a training in Isaac Lab, use the command: .. code-block:: bash - python scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-Direct-v0 --headless + python scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-Direct-v0 --visualizer none Launching Inferencing ~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/source/migration/migrating_from_omniisaacgymenvs.rst b/docs/source/migration/migrating_from_omniisaacgymenvs.rst index b3a46f0a518..12f11ff9283 100644 --- a/docs/source/migration/migrating_from_omniisaacgymenvs.rst +++ b/docs/source/migration/migrating_from_omniisaacgymenvs.rst @@ -983,7 +983,7 @@ To launch a training in Isaac Lab, use the command: .. code-block:: bash - python scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-Direct-v0 --headless + python scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-Direct-v0 --visualizer none Launching Inferencing ~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/source/overview/environments.rst b/docs/source/overview/environments.rst index 95c29a33e8e..163a7f28329 100644 --- a/docs/source/overview/environments.rst +++ b/docs/source/overview/environments.rst @@ -312,7 +312,7 @@ We provide environments for both disassembly and assembly. * |disassembly-link|: The plug starts inserted in the socket. A low-level controller lifts the plug out and moves it to a random position. This process is purely scripted and does not involve any learned policy. Therefore, it does not require policy training or evaluation. The resulting trajectories serve as demonstrations for the reverse process, i.e., learning to assemble. To run disassembly for a specific task: ``python source/isaaclab_tasks/isaaclab_tasks/direct/automate/run_disassembly_w_id.py --assembly_id=ASSEMBLY_ID --disassembly_dir=DISASSEMBLY_DIR``. All generated trajectories are saved to a local directory ``DISASSEMBLY_DIR``. * |assembly-link|: The goal is to insert the plug into the socket. You can use this environment to train a policy via reinforcement learning or evaluate a pre-trained checkpoint. - * To train an assembly policy, we run the command ``python source/isaaclab_tasks/isaaclab_tasks/direct/automate/run_w_id.py --assembly_id=ASSEMBLY_ID --train``. We can customize the training process using the optional flags: ``--headless`` to run without opening the GUI windows, ``--max_iterations=MAX_ITERATIONS`` to set the number of training iterations, ``--num_envs=NUM_ENVS`` to set the number of parallel environments during training, ``--seed=SEED`` to assign the random seed. The policy checkpoints will be saved automatically during training in the directory ``logs/rl_games/Assembly/test``. + * To train an assembly policy, we run the command ``python source/isaaclab_tasks/isaaclab_tasks/direct/automate/run_w_id.py --assembly_id=ASSEMBLY_ID --train``. We can customize the training process using the optional flags: ``--visualizer none`` to run without opening the GUI windows, ``--max_iterations=MAX_ITERATIONS`` to set the number of training iterations, ``--num_envs=NUM_ENVS`` to set the number of parallel environments during training, ``--seed=SEED`` to assign the random seed. The policy checkpoints will be saved automatically during training in the directory ``logs/rl_games/Assembly/test``. * To evaluate an assembly policy, we run the command ``python source/isaaclab_tasks/isaaclab_tasks/direct/automate/run_w_id.py --assembly_id=ASSEMBLY_ID --checkpoint=CHECKPOINT --log_eval``. The evaluation results are stored in ``evaluation_{ASSEMBLY_ID}.h5``. .. table:: diff --git a/docs/source/overview/imitation-learning/augmented_imitation.rst b/docs/source/overview/imitation-learning/augmented_imitation.rst index 376f447f97a..2db54c8a2f4 100644 --- a/docs/source/overview/imitation-learning/augmented_imitation.rst +++ b/docs/source/overview/imitation-learning/augmented_imitation.rst @@ -21,7 +21,7 @@ In the following example, we will show you how to use Isaac Lab Mimic to generat .. code:: bash ./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \ - --device cpu --enable_cameras --headless --num_envs 10 --generation_num_trials 1000 \ + --device cpu --enable_cameras --visualizer none --num_envs 10 --generation_num_trials 1000 \ --input_file ./datasets/annotated_dataset.hdf5 --output_file ./datasets/mimic_dataset_1k.hdf5 \ --task Isaac-Stack-Cube-Franka-IK-Rel-Visuomotor-Cosmos-Mimic-v0 \ --rendering_mode performance diff --git a/docs/source/overview/imitation-learning/skillgen.rst b/docs/source/overview/imitation-learning/skillgen.rst index be8382b5c5e..431eef4fa60 100644 --- a/docs/source/overview/imitation-learning/skillgen.rst +++ b/docs/source/overview/imitation-learning/skillgen.rst @@ -96,7 +96,7 @@ For trajectory visualization during development: * Enable trajectory visualization by setting ``visualize_plan = True`` in the cuRobo planner configuration * When enabled, cuRobo planner interface will stream planned end-effector trajectories, waypoints, and collision data to Rerun for interactive inspection * Visualization helps identify planning issues, collision problems, and trajectory smoothness before full dataset generation - * Can also be ran with ``--headless`` to disable isaacsim visualization but still visualize and debug end effector trajectories + * Can also be ran with ``--visualizer none`` to disable isaacsim visualization but still visualize and debug end effector trajectories Step 4: Verify Installation ^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -250,7 +250,7 @@ Key parameters for SkillGen data generation: * ``--generation_num_trials``: Number of demonstrations to generate * ``--num_envs``: Parallel environments (tune based on GPU memory) * ``--device``: Computation device (cpu/cuda). Use cpu for stable physics -* ``--headless``: Disable visualization for faster generation +* ``--visualizer none``: Disable visualization for faster generation .. _task-basic-cube-stacking: @@ -296,7 +296,7 @@ Once satisfied with small-scale results, generate a full training dataset: ./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \ --device cpu \ - --headless \ + --visualizer none \ --num_envs 1 \ --generation_num_trials 1000 \ --input_file ./datasets/annotated_dataset_skillgen.hdf5 \ @@ -306,9 +306,9 @@ Once satisfied with small-scale results, generate a full training dataset: .. note:: - * Use ``--headless`` to disable visualization for faster generation. Rerun visualization can be enabled by setting ``visualize_plan = True`` in the cuRobo planner configuration with ``--headless`` enabled as well for debugging. + * Use ``--visualizer none`` to disable visualization for faster generation. Rerun visualization can be enabled by setting ``visualize_plan = True`` in the cuRobo planner configuration with ``--visualizer none`` enabled as well for debugging. * Adjust ``--num_envs`` based on your GPU memory (start with 1, increase gradually). The performance gain is not very significant when num_envs is greater than 1. A value of 5 seems to be a sweet spot for most GPUs to balance performance and memory usage between cuRobo instances and simulation environments. - * Generation time: ~90 to 120 minutes for one environment with ``--headless`` enabled for 1000 demonstrations on a RTX 6000 Ada GPU. Time depends on the GPU, the number of environments, and the success rate of the demonstrations (which depends on quality of the annotated dataset). + * Generation time: ~90 to 120 minutes for one environment with ``--visualizer none`` enabled for 1000 demonstrations on a RTX 6000 Ada GPU. Time depends on the GPU, the number of environments, and the success rate of the demonstrations (which depends on quality of the annotated dataset). * cuRobo planner interface and configurations are described in :ref:`cuRobo-interface-features`. .. _task-bin-cube-stacking: @@ -350,7 +350,7 @@ Generate the complete adaptive stacking dataset: ./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \ --device cpu \ - --headless \ + --visualizer none \ --num_envs 1 \ --generation_num_trials 1000 \ --input_file ./datasets/annotated_dataset_skillgen.hdf5 \ @@ -364,7 +364,7 @@ Generate the complete adaptive stacking dataset: .. note:: - If the pre-annotated dataset is used and the data generation command is run with ``--headless`` enabled, the generation time is typically around ~220 minutes for 1000 demonstrations for a single environment on a RTX 6000 Ada GPU. + If the pre-annotated dataset is used and the data generation command is run with ``--visualizer none`` enabled, the generation time is typically around ~220 minutes for 1000 demonstrations for a single environment on a RTX 6000 Ada GPU. .. note:: @@ -374,7 +374,7 @@ Generate the complete adaptive stacking dataset: * Vanilla Cube Stacking: 1 env ~9.3–9.6 GB steady; 5 envs ~21.8–22.2 GB steady (briefly higher during initialization). * Adaptive Bin Cube Stacking: 1 env ~9.3–9.6 GB steady; 5 envs ~22.0–22.3 GB steady (briefly higher during initialization). * Minimum recommended GPU: ≥24 GB VRAM for ``--num_envs`` 1–2; ≥48 GB VRAM for ``--num_envs`` up to ~5. - * To reduce VRAM: prefer ``--headless`` and keep ``--num_envs`` modest. Numbers can vary with scene assets and number of demonstrations. + * To reduce VRAM: prefer ``--visualizer none`` and keep ``--num_envs`` modest. Numbers can vary with scene assets and number of demonstrations. Learning Policies from SkillGen Data ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/source/overview/reinforcement-learning/performance_benchmarks.rst b/docs/source/overview/reinforcement-learning/performance_benchmarks.rst index 61615126ee3..aad8bc06521 100644 --- a/docs/source/overview/reinforcement-learning/performance_benchmarks.rst +++ b/docs/source/overview/reinforcement-learning/performance_benchmarks.rst @@ -11,7 +11,7 @@ Multi-GPU and multi-node training performance results are also outlined. Benchmark Results ----------------- -All benchmarking results were performed with the RL Games library with ``--headless`` flag on Ubuntu 22.04. +All benchmarking results were performed with the RL Games library with ``--visualizer none`` flag on Ubuntu 22.04. ``Isaac-Velocity-Rough-G1-v0`` environment benchmarks were performed with the RSL RL library. The PhysX backend was used for all benchmarks. @@ -138,13 +138,13 @@ Example scripts can be run similarly to training scripts: .. code-block:: bash # benchmark with RSL RL - python scripts/benchmarks/benchmark_rsl_rl.py --task=Isaac-Cartpole-v0 --headless + python scripts/benchmarks/benchmark_rsl_rl.py --task=Isaac-Cartpole-v0 --visualizer none # benchmark with RL Games - python scripts/benchmarks/benchmark_rlgames.py --task=Isaac-Cartpole-v0 --headless + python scripts/benchmarks/benchmark_rlgames.py --task=Isaac-Cartpole-v0 --visualizer none # benchmark without RL libraries - python scripts/benchmarks/benchmark_non_rl.py --task=Isaac-Cartpole-v0 --headless + python scripts/benchmarks/benchmark_non_rl.py --task=Isaac-Cartpole-v0 --visualizer none Each script will generate a set of KPI files at the end of the run, which includes data on the startup times, runtime statistics, such as the time taken for each simulation or rendering step, diff --git a/docs/source/overview/reinforcement-learning/rl_existing_scripts.rst b/docs/source/overview/reinforcement-learning/rl_existing_scripts.rst index 66eb5948397..81e645006b5 100644 --- a/docs/source/overview/reinforcement-learning/rl_existing_scripts.rst +++ b/docs/source/overview/reinforcement-learning/rl_existing_scripts.rst @@ -98,7 +98,7 @@ RL-Games # run script for playing with 32 environments ./isaaclab.sh -p scripts/reinforcement_learning/rl_games/play.py --task Isaac-Ant-v0 --num_envs 32 --checkpoint /PATH/TO/model.pth # run script for recording video of a trained agent (requires installing `ffmpeg`) - ./isaaclab.sh -p scripts/reinforcement_learning/rl_games/play.py --task Isaac-Ant-v0 --headless --video --video_length 200 + ./isaaclab.sh -p scripts/reinforcement_learning/rl_games/play.py --task Isaac-Ant-v0 --visualizer none --video --video_length 200 .. tab-item:: :icon:`fa-brands fa-windows` Windows :sync: windows @@ -114,7 +114,7 @@ RL-Games :: run script for playing with 32 environments isaaclab.bat -p scripts\reinforcement_learning\rl_games\play.py --task Isaac-Ant-v0 --num_envs 32 --checkpoint /PATH/TO/model.pth :: run script for recording video of a trained agent (requires installing `ffmpeg`) - isaaclab.bat -p scripts\reinforcement_learning\rl_games\play.py --task Isaac-Ant-v0 --headless --video --video_length 200 + isaaclab.bat -p scripts\reinforcement_learning\rl_games\play.py --task Isaac-Ant-v0 --visualizer none --video --video_length 200 RSL-RL ------ @@ -139,7 +139,7 @@ RSL-RL # run script for playing with 32 environments ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/play.py --task Isaac-Reach-Franka-v0 --num_envs 32 --load_run run_folder_name --checkpoint /PATH/TO/model.pt # run script for recording video of a trained agent (requires installing `ffmpeg`) - ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/play.py --task Isaac-Reach-Franka-v0 --headless --video --video_length 200 + ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/play.py --task Isaac-Reach-Franka-v0 --visualizer none --video --video_length 200 .. tab-item:: :icon:`fa-brands fa-windows` Windows :sync: windows @@ -155,7 +155,7 @@ RSL-RL :: run script for playing with 32 environments isaaclab.bat -p scripts\reinforcement_learning\rsl_rl\play.py --task Isaac-Reach-Franka-v0 --num_envs 32 --load_run run_folder_name --checkpoint /PATH/TO/model.pt :: run script for recording video of a trained agent (requires installing `ffmpeg`) - isaaclab.bat -p scripts\reinforcement_learning\rsl_rl\play.py --task Isaac-Reach-Franka-v0 --headless --video --video_length 200 + isaaclab.bat -p scripts\reinforcement_learning\rsl_rl\play.py --task Isaac-Reach-Franka-v0 --visualizer none --video --video_length 200 - Training and distilling an agent with `RSL-RL `__ on ``Isaac-Velocity-Flat-Anymal-D-v0``: @@ -175,7 +175,7 @@ RSL-RL # run script for rl training of the teacher agent with Newton backend ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Velocity-Flat-Anymal-D-v0 --headless presets=newton # run script for distilling the teacher agent into a student agent - ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Velocity-Flat-Anymal-D-v0 --headless --agent rsl_rl_distillation_cfg_entry_point --load_run teacher_run_folder_name + ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Velocity-Flat-Anymal-D-v0 --visualizer none --agent rsl_rl_distillation_cfg_entry_point --load_run teacher_run_folder_name # run script for playing the student with 64 environments ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/play.py --task Isaac-Velocity-Flat-Anymal-D-v0 --num_envs 64 --agent rsl_rl_distillation_cfg_entry_point @@ -191,7 +191,7 @@ RSL-RL :: run script for rl training of the teacher agent with Newton backend isaaclab.bat -p scripts\reinforcement_learning\rsl_rl\train.py --task Isaac-Velocity-Flat-Anymal-D-v0 --headless presets=newton :: run script for distilling the teacher agent into a student agent - isaaclab.bat -p scripts\reinforcement_learning\rsl_rl\train.py --task Isaac-Velocity-Flat-Anymal-D-v0 --headless --agent rsl_rl_distillation_cfg_entry_point --load_run teacher_run_folder_name + isaaclab.bat -p scripts\reinforcement_learning\rsl_rl\train.py --task Isaac-Velocity-Flat-Anymal-D-v0 --visualizer none --agent rsl_rl_distillation_cfg_entry_point --load_run teacher_run_folder_name :: run script for playing the student with 64 environments isaaclab.bat -p scripts\reinforcement_learning\rsl_rl\play.py --task Isaac-Velocity-Flat-Anymal-D-v0 --num_envs 64 --agent rsl_rl_distillation_cfg_entry_point @@ -222,7 +222,7 @@ SKRL # run script for playing with 32 environments ./isaaclab.sh -p scripts/reinforcement_learning/skrl/play.py --task Isaac-Reach-Franka-v0 --num_envs 32 --checkpoint /PATH/TO/model.pt # run script for recording video of a trained agent (requires installing `ffmpeg`) - ./isaaclab.sh -p scripts/reinforcement_learning/skrl/play.py --task Isaac-Reach-Franka-v0 --headless --video --video_length 200 + ./isaaclab.sh -p scripts/reinforcement_learning/skrl/play.py --task Isaac-Reach-Franka-v0 --visualizer none --video --video_length 200 .. tab-item:: :icon:`fa-brands fa-windows` Windows :sync: windows @@ -238,7 +238,7 @@ SKRL :: run script for playing with 32 environments isaaclab.bat -p scripts\reinforcement_learning\skrl\play.py --task Isaac-Reach-Franka-v0 --num_envs 32 --checkpoint /PATH/TO/model.pt :: run script for recording video of a trained agent (requires installing `ffmpeg`) - isaaclab.bat -p scripts\reinforcement_learning\skrl\play.py --task Isaac-Reach-Franka-v0 --headless --video --video_length 200 + isaaclab.bat -p scripts\reinforcement_learning\skrl\play.py --task Isaac-Reach-Franka-v0 --visualizer none --video --video_length 200 .. tab-item:: JAX @@ -274,7 +274,7 @@ SKRL # run script for playing with 32 environments ./isaaclab.sh -p scripts/reinforcement_learning/skrl/play.py --task Isaac-Reach-Franka-v0 --num_envs 32 --ml_framework jax --checkpoint /PATH/TO/model.pt # run script for recording video of a trained agent (requires installing `ffmpeg`) - ./isaaclab.sh -p scripts/reinforcement_learning/skrl/play.py --task Isaac-Reach-Franka-v0 --headless --ml_framework jax --video --video_length 200 + ./isaaclab.sh -p scripts/reinforcement_learning/skrl/play.py --task Isaac-Reach-Franka-v0 --visualizer none --ml_framework jax --video --video_length 200 - Training the multi-agent environment ``Isaac-Shadow-Hand-Over-Direct-v0`` with skrl: @@ -289,7 +289,7 @@ SKRL # install python module (for skrl) ./isaaclab.sh -i skrl # run script for training with the MAPPO algorithm (IPPO is also supported) - ./isaaclab.sh -p scripts/reinforcement_learning/skrl/train.py --task Isaac-Shadow-Hand-Over-Direct-v0 --headless --algorithm MAPPO + ./isaaclab.sh -p scripts/reinforcement_learning/skrl/train.py --task Isaac-Shadow-Hand-Over-Direct-v0 --visualizer none --algorithm MAPPO # run script for playing with 32 environments with the MAPPO algorithm (IPPO is also supported) ./isaaclab.sh -p scripts/reinforcement_learning/skrl/play.py --task Isaac-Shadow-Hand-Over-Direct-v0 --num_envs 32 --algorithm MAPPO --checkpoint /PATH/TO/model.pt @@ -301,7 +301,7 @@ SKRL :: install python module (for skrl) isaaclab.bat -i skrl :: run script for training with the MAPPO algorithm (IPPO is also supported) - isaaclab.bat -p scripts\reinforcement_learning\skrl\train.py --task Isaac-Shadow-Hand-Over-Direct-v0 --headless --algorithm MAPPO + isaaclab.bat -p scripts\reinforcement_learning\skrl\train.py --task Isaac-Shadow-Hand-Over-Direct-v0 --visualizer none --algorithm MAPPO :: run script for playing with 32 environments with the MAPPO algorithm (IPPO is also supported) isaaclab.bat -p scripts\reinforcement_learning\skrl\play.py --task Isaac-Shadow-Hand-Over-Direct-v0 --num_envs 32 --algorithm MAPPO --checkpoint /PATH/TO/model.pt @@ -329,7 +329,7 @@ Stable-Baselines3 # run script for playing with 32 environments ./isaaclab.sh -p scripts/reinforcement_learning/sb3/play.py --task Isaac-Velocity-Flat-Unitree-A1-v0 --num_envs 32 --checkpoint /PATH/TO/model.zip # run script for recording video of a trained agent (requires installing `ffmpeg`) - ./isaaclab.sh -p scripts/reinforcement_learning/sb3/play.py --task Isaac-Velocity-Flat-Unitree-A1-v0 --headless --video --video_length 200 + ./isaaclab.sh -p scripts/reinforcement_learning/sb3/play.py --task Isaac-Velocity-Flat-Unitree-A1-v0 --visualizer none --video --video_length 200 .. tab-item:: :icon:`fa-brands fa-windows` Windows :sync: windows @@ -345,7 +345,7 @@ Stable-Baselines3 :: run script for playing with 32 environments isaaclab.bat -p scripts\reinforcement_learning\sb3\play.py --task Isaac-Velocity-Flat-Unitree-A1-v0 --num_envs 32 --checkpoint /PATH/TO/model.zip :: run script for recording video of a trained agent (requires installing `ffmpeg`) - isaaclab.bat -p scripts\reinforcement_learning\sb3\play.py --task Isaac-Velocity-Flat-Unitree-A1-v0 --headless --video --video_length 200 + isaaclab.bat -p scripts\reinforcement_learning\sb3\play.py --task Isaac-Velocity-Flat-Unitree-A1-v0 --visualizer none --video --video_length 200 RLinf ----- diff --git a/docs/source/overview/reinforcement-learning/rl_frameworks.rst b/docs/source/overview/reinforcement-learning/rl_frameworks.rst index 605ee7fd93d..5a3027e7cad 100644 --- a/docs/source/overview/reinforcement-learning/rl_frameworks.rst +++ b/docs/source/overview/reinforcement-learning/rl_frameworks.rst @@ -87,7 +87,7 @@ Training Performance -------------------- We performed training with each RL library on the same ``Isaac-Humanoid-v0`` environment -with ``--headless`` on a single NVIDIA GeForce RTX 4090 and logged the total training time +with ``--visualizer none`` on a single NVIDIA GeForce RTX 4090 and logged the total training time for 65.5M steps (4096 environments x 32 rollout steps x 500 iterations). +--------------------+-----------------+ @@ -106,7 +106,7 @@ Training commands (check for the *'Training time: XXX seconds'* line in the term .. code:: bash - python scripts/reinforcement_learning/rl_games/train.py --task Isaac-Humanoid-v0 --max_iterations 500 --headless - python scripts/reinforcement_learning/skrl/train.py --task Isaac-Humanoid-v0 --max_iterations 500 --headless - python scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Humanoid-v0 --max_iterations 500 --headless - python scripts/reinforcement_learning/sb3/train.py --task Isaac-Humanoid-v0 --max_iterations 500 --headless + python scripts/reinforcement_learning/rl_games/train.py --task Isaac-Humanoid-v0 --max_iterations 500 --visualizer none + python scripts/reinforcement_learning/skrl/train.py --task Isaac-Humanoid-v0 --max_iterations 500 --visualizer none + python scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Humanoid-v0 --max_iterations 500 --visualizer none + python scripts/reinforcement_learning/sb3/train.py --task Isaac-Humanoid-v0 --max_iterations 500 --visualizer none diff --git a/docs/source/policy_deployment/00_hover/hover_policy.rst b/docs/source/policy_deployment/00_hover/hover_policy.rst index b7efd80a15e..2f770622003 100644 --- a/docs/source/policy_deployment/00_hover/hover_policy.rst +++ b/docs/source/policy_deployment/00_hover/hover_policy.rst @@ -60,7 +60,7 @@ Execute the following command from the ``HOVER`` directory to train the teacher ${ISAACLAB_PATH:?}/isaaclab.sh -p scripts/rsl_rl/train_teacher_policy.py \ --num_envs 1024 \ --reference_motion_path neural_wbc/data/data/motions/stable_punch.pkl \ - --headless + --visualizer none The teacher policy is trained for 10000000 iterations, or until the user interrupts the training. The resulting checkpoint is stored in ``neural_wbc/data/data/policy/h1:teacher/`` and the filename is ``model_.pt``. @@ -76,7 +76,7 @@ Execute the following command from the ``HOVER`` directory to train the student --reference_motion_path neural_wbc/data/data/motions/stable_punch.pkl \ --teacher_policy.resume_path neural_wbc/data/data/policy/h1:teacher \ --teacher_policy.checkpoint model_.pt \ - --headless + --visualizer none This assumes that you have already trained the teacher policy as there is no provided teacher policy in the repo. @@ -148,7 +148,7 @@ Use the provided `Mujoco Environment`_ for conducting sim-to-sim validation of t ${ISAACLAB_PATH:?}/isaaclab.sh -p neural_wbc/inference_env/scripts/eval.py \ --num_envs 1 \ - --headless \ + --visualizer none \ --student_path neural_wbc/data/data/policy/h1:student/ \ --student_checkpoint model_.pt @@ -171,7 +171,7 @@ To deploy the trained policy on the H1 robot, --robot unitree_h1 \ --max_iterations 5000 \ --num_envs 1 \ - --headless + --visualizer none .. note:: diff --git a/docs/source/policy_deployment/02_gear_assembly/gear_assembly_policy.rst b/docs/source/policy_deployment/02_gear_assembly/gear_assembly_policy.rst index de8497f181b..9d069e5f551 100644 --- a/docs/source/policy_deployment/02_gear_assembly/gear_assembly_policy.rst +++ b/docs/source/policy_deployment/02_gear_assembly/gear_assembly_policy.rst @@ -211,7 +211,7 @@ These friction values (0.75) were determined through iterative visual comparison python scripts/reinforcement_learning/rsl_rl/train.py \ --task Isaac-Deploy-GearAssembly-UR10e-2F140-v0 \ - --headless \ + --visualizer none \ --video --video_length 800 --video_interval 5000 8. Review the recorded videos and compare with real hardware videos to verify physics behavior @@ -461,7 +461,7 @@ Now launch the full training run with more parallel environments in headless mod # Full training with video recording python scripts/reinforcement_learning/rsl_rl/train.py \ --task Isaac-Deploy-GearAssembly-UR10e-2F140-v0 \ - --headless \ + --visualizer none \ --num_envs 256 \ --video --video_length 800 --video_interval 5000 @@ -557,7 +557,7 @@ CUDA Out of Memory python scripts/reinforcement_learning/rsl_rl/train.py \ --task Isaac-Deploy-GearAssembly-UR10e-2F140-v0 \ - --headless \ + --visualizer none \ --num_envs 128 # Reduce from 256 to 128, 64, etc. **Trade-off:** Using fewer environments will reduce sample diversity per training iteration and may slow down training convergence. You may need to train for more iterations to achieve the same performance. However, the final policy quality should be similar. @@ -588,7 +588,7 @@ CUDA Out of Memory python scripts/reinforcement_learning/rsl_rl/train.py \ --task Isaac-Deploy-GearAssembly-UR10e-2F140-v0 \ - --headless \ + --visualizer none \ --num_envs 256 You can always evaluate the trained policy later with visualization. diff --git a/docs/source/refs/release_notes.rst b/docs/source/refs/release_notes.rst index 3ba7d7a9868..c33763256e2 100644 --- a/docs/source/refs/release_notes.rst +++ b/docs/source/refs/release_notes.rst @@ -1762,13 +1762,13 @@ Before: .. code:: bash - ./isaaclab.sh -p source/standalone/workflows/sb3/train.py --task Isaac-Cartpole-v0 --headless --cpu + ./isaaclab.sh -p source/standalone/workflows/sb3/train.py --task Isaac-Cartpole-v0 --visualizer none --cpu Now: .. code:: bash - ./isaaclab.sh -p source/standalone/workflows/sb3/train.py --task Isaac-Cartpole-v0 --headless --device cpu + ./isaaclab.sh -p source/standalone/workflows/sb3/train.py --task Isaac-Cartpole-v0 --visualizer none --device cpu Renaming of teleoperation device CLI in standalone scripts ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/source/refs/troubleshooting.rst b/docs/source/refs/troubleshooting.rst index 20094c617bf..cedff13c0a7 100644 --- a/docs/source/refs/troubleshooting.rst +++ b/docs/source/refs/troubleshooting.rst @@ -97,7 +97,7 @@ To enable OmniPVD capture in Isaac Lab, add the relevant kit arguments to the co .. code:: bash - ./isaaclab.sh -p scripts/demos/bipeds.py --kit_args "--/persistent/physics/omniPvdOvdRecordingDirectory=/tmp/ --/physics/omniPvdOutputEnabled=true" --headless + ./isaaclab.sh -p scripts/demos/bipeds.py --kit_args "--/persistent/physics/omniPvdOvdRecordingDirectory=/tmp/ --/physics/omniPvdOutputEnabled=true" --visualizer none Checking the internal logs from the simulator @@ -142,7 +142,7 @@ For instance, to run a standalone script with verbose logging, you can use the f .. code-block:: bash # Run the standalone script with info logging - ./isaaclab.sh -p scripts/tutorials/00_sim/create_empty.py --headless --info + ./isaaclab.sh -p scripts/tutorials/00_sim/create_empty.py --visualizer none --info For more fine-grained control, you can modify the logging channels through the ``logger`` module. For more information, please refer to its `documentation `__. diff --git a/docs/source/setup/installation/include/src_verify_isaaclab.rst b/docs/source/setup/installation/include/src_verify_isaaclab.rst index a747a1ccdc3..8b3715f717e 100644 --- a/docs/source/setup/installation/include/src_verify_isaaclab.rst +++ b/docs/source/setup/installation/include/src_verify_isaaclab.rst @@ -55,7 +55,7 @@ Train a robot! ~~~~~~~~~~~~~~ You can now use Isaac Lab to train a robot through Reinforcement Learning! The quickest way to use Isaac Lab is through the predefined workflows using one of our **Batteries-included** robot tasks. Execute the following command to quickly train an ant to walk! -We recommend adding ``--headless`` for faster training. +We recommend adding ``--visualizer none`` for faster training. .. tab-set:: :sync-group: os @@ -65,14 +65,14 @@ We recommend adding ``--headless`` for faster training. .. code:: bash - ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Ant-v0 --headless + ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Ant-v0 --visualizer none .. tab-item:: :icon:`fa-brands fa-windows` Windows :sync: windows .. code:: batch - isaaclab.bat -p scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Ant-v0 --headless + isaaclab.bat -p scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Ant-v0 --visualizer none ... Or a robot dog! @@ -84,14 +84,14 @@ We recommend adding ``--headless`` for faster training. .. code:: bash - ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Velocity-Rough-Anymal-C-v0 --headless + ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Velocity-Rough-Anymal-C-v0 --visualizer none .. tab-item:: :icon:`fa-brands fa-windows` Windows :sync: windows .. code:: batch - isaaclab.bat -p scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Velocity-Rough-Anymal-C-v0 --headless + isaaclab.bat -p scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Velocity-Rough-Anymal-C-v0 --visualizer none Isaac Lab provides the tools you'll need to create your own **Tasks** and **Workflows** for whatever your project needs may be. Take a look at our :ref:`how-to` guides like :ref:`Adding your own learning Library ` or :ref:`Wrapping Environments ` for details. diff --git a/docs/source/setup/quickstart.rst b/docs/source/setup/quickstart.rst index 54fb0378f36..f814b5df8ff 100644 --- a/docs/source/setup/quickstart.rst +++ b/docs/source/setup/quickstart.rst @@ -162,7 +162,7 @@ Invoking these scripts will require a **Task Name** and a corresponding **Entry python scripts/reinforcement_learning/skrl/train.py --task=Isaac-Ant-v0 -This will train the mujoco ant to "run". You can see the various launch option available to you with the ``--help`` flag. Note specifically the ``--num_envs`` option and the ``--headless`` flag, +This will train the mujoco ant to "run". You can see the various launch option available to you with the ``--help`` flag. Note specifically the ``--num_envs`` option and the ``--visualizer none`` flag, both of which can be useful when trying to develop and debug a new environment. Options specified at this level automatically overwrite any configuration equivalent that may be defined in the code (so long as those definitions are part of a ``@configclass``, see below). diff --git a/docs/source/testing/benchmarks.rst b/docs/source/testing/benchmarks.rst index 0225569f175..d7209feba0c 100644 --- a/docs/source/testing/benchmarks.rst +++ b/docs/source/testing/benchmarks.rst @@ -113,7 +113,7 @@ Measure environment stepping performance without training: --task Isaac-Cartpole-v0 \ --num_envs 4096 \ --num_frames 100 \ - --headless \ + --visualizer none \ --benchmark_backend json \ --output_path ./results @@ -132,7 +132,7 @@ Measure training performance with RSL-RL: --task Isaac-Cartpole-v0 \ --num_envs 4096 \ --max_iterations 500 \ - --headless \ + --visualizer none \ --benchmark_backend json \ --output_path ./results @@ -173,7 +173,7 @@ Common Arguments * - ``--output_path`` - ``./`` - Directory for output files - * - ``--headless`` + * - ``--visualizer none`` - ``false`` - Run without rendering diff --git a/docs/source/tutorials/00_sim/create_empty.rst b/docs/source/tutorials/00_sim/create_empty.rst index 1a9740ab93a..beaca411a7d 100644 --- a/docs/source/tutorials/00_sim/create_empty.rst +++ b/docs/source/tutorials/00_sim/create_empty.rst @@ -156,7 +156,7 @@ following: .. code-block:: bash - ./isaaclab.sh -p scripts/tutorials/00_sim/create_empty.py --headless + ./isaaclab.sh -p scripts/tutorials/00_sim/create_empty.py --visualizer none Now that we have a basic understanding of how to run a simulation, let's move on to the diff --git a/docs/source/tutorials/03_envs/configuring_rl_training.rst b/docs/source/tutorials/03_envs/configuring_rl_training.rst index 2eb2b0b5e76..c77effbcc7d 100644 --- a/docs/source/tutorials/03_envs/configuring_rl_training.rst +++ b/docs/source/tutorials/03_envs/configuring_rl_training.rst @@ -113,7 +113,7 @@ we can use the ``--agent`` argument to specify the configuration instance to use .. code-block:: bash # standard PPO training - ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Cartpole-v0 --headless \ + ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Cartpole-v0 --visualizer none \ --run_name ppo * Training with the PPO configuration with symmetry augmentation: @@ -121,12 +121,12 @@ we can use the ``--agent`` argument to specify the configuration instance to use .. code-block:: bash # PPO training with symmetry augmentation - ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Cartpole-v0 --headless \ + ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Cartpole-v0 --visualizer none \ --agent rsl_rl_with_symmetry_cfg_entry_point \ --run_name ppo_with_symmetry_data_augmentation # you can use hydra to disable symmetry augmentation but enable mirror loss computation - ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Cartpole-v0 --headless \ + ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Cartpole-v0 --visualizer none \ --agent rsl_rl_with_symmetry_cfg_entry_point \ --run_name ppo_without_symmetry_data_augmentation \ agent.algorithm.symmetry_cfg.use_data_augmentation=false diff --git a/docs/source/tutorials/03_envs/modify_direct_rl_env.rst b/docs/source/tutorials/03_envs/modify_direct_rl_env.rst index a93fa0789ca..de6a5450f5c 100644 --- a/docs/source/tutorials/03_envs/modify_direct_rl_env.rst +++ b/docs/source/tutorials/03_envs/modify_direct_rl_env.rst @@ -111,7 +111,7 @@ After the minor modification has been done, and similar to the previous tutorial .. code-block:: bash - ./isaaclab.sh -p scripts/reinforcement_learning/rl_games/train.py --task Isaac-H1-Direct-v0 --headless + ./isaaclab.sh -p scripts/reinforcement_learning/rl_games/train.py --task Isaac-H1-Direct-v0 --visualizer none When the training is finished, we can visualize the result with the following command. To stop the simulation, you can either close the window, or press ``Ctrl+C`` in the terminal diff --git a/docs/source/tutorials/03_envs/policy_inference_in_usd.rst b/docs/source/tutorials/03_envs/policy_inference_in_usd.rst index ddae4511ff3..d39962e4b9f 100644 --- a/docs/source/tutorials/03_envs/policy_inference_in_usd.rst +++ b/docs/source/tutorials/03_envs/policy_inference_in_usd.rst @@ -42,7 +42,7 @@ First, we need to train the ``Isaac-Velocity-Rough-H1-v0`` task by running the f .. code-block:: bash - ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Velocity-Rough-H1-v0 --headless + ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Velocity-Rough-H1-v0 --visualizer none When the training is finished, we can visualize the result with the following command. To stop the simulation, you can either close the window, or press ``Ctrl+C`` in the terminal diff --git a/source/isaaclab/isaaclab/app/app_launcher.py b/source/isaaclab/isaaclab/app/app_launcher.py index 597714267c2..ae24215016b 100644 --- a/source/isaaclab/isaaclab/app/app_launcher.py +++ b/source/isaaclab/isaaclab/app/app_launcher.py @@ -203,8 +203,8 @@ def __init__(self, launcher_args: argparse.Namespace | dict | None = None, **kwa self._load_extensions() # Hide the stop button in the toolbar self._hide_stop_button() - # Set settings from the given rendering mode - self._set_rendering_mode_settings(launcher_args) + # Set settings from rendering quality selection + self._set_rendering_quality_settings(launcher_args) # Set animation recording settings self._set_animation_recording_settings(launcher_args) # Set visualizer settings (if requested) @@ -425,16 +425,22 @@ def add_app_launcher_args(parser: argparse.ArgumentParser) -> None: ), ) arg_group.add_argument( - "--rendering_mode", + "--rendering_quality", type=str, action=ExplicitAction, - choices={"performance", "balanced", "quality"}, + choices={"performance", "balanced", "high"}, help=( - "Sets the rendering mode. Preset settings files can be found in apps/rendering_modes." - ' Can be "performance", "balanced", or "quality".' - " Individual settings can be overwritten by using the RenderCfg class." + "Select rendering quality profile and override visualizer_cfg.rendering_quality." + ' Can be "performance", "balanced", or "high".' ), ) + arg_group.add_argument( + "--rendering_mode", + type=str, + action=ExplicitAction, + choices={"performance", "balanced", "quality"}, + help=argparse.SUPPRESS, + ) arg_group.add_argument( "--kit_args", type=str, diff --git a/source/isaaclab/isaaclab/renderer/__init__.py b/source/isaaclab/isaaclab/renderer/__init__.py new file mode 100644 index 00000000000..1fc7afa0f14 --- /dev/null +++ b/source/isaaclab/isaaclab/renderer/__init__.py @@ -0,0 +1,5 @@ +"""Renderer-related utilities and configuration helpers.""" + +from .rendering_quality_presets import get_kit_rendering_preset + +__all__ = ["get_kit_rendering_preset"] diff --git a/source/isaaclab/isaaclab/renderer/rendering_quality_presets.py b/source/isaaclab/isaaclab/renderer/rendering_quality_presets.py new file mode 100644 index 00000000000..d816252c151 --- /dev/null +++ b/source/isaaclab/isaaclab/renderer/rendering_quality_presets.py @@ -0,0 +1,82 @@ +"""Built-in rendering quality presets for RTX/Kit rendering. + +Presets are sourced from the latest Isaac Lab app rendering profiles (apps/rendering_modes). +""" + +from __future__ import annotations + +from copy import deepcopy +from typing import Any + +# Latest preset values sourced from apps/rendering_modes/*.kit. +_KIT_PRESETS: dict[str, dict[str, Any]] = { + "performance": { + "/rtx/rtpt/cached/enabled": False, + "/rtx/rtpt/lightcache/cached/enabled": False, + "/rtx/rtpt/translucency/virtualMotion/enabled": False, + "/rtx/rtpt/maxBounces": 2, + "/rtx/rtpt/splitGlass": False, + "/rtx/rtpt/splitClearcoat": False, + "/rtx/rtpt/splitRoughReflection": True, + "/rtx/rtpt/useAmbientOcclusionForAmbientLight": False, + "/rtx/sceneDb/ambientLightIntensity": 1.0, + "/rtx/shadows/enabled": True, + "/rtx/domeLight/upperLowerStrategy": 3, + "/rtx/ambientOcclusion/enabled": False, + "/rtx/ambientOcclusion/denoiserMode": 1, + "/rtx/raytracing/subpixel/mode": 0, + "/rtx/raytracing/cached/enabled": False, + "/rtx-transient/dlssg/enabled": False, + "/rtx-transient/dldenoiser/enabled": False, + "/rtx/post/dlss/execMode": 0, + "/rtx/pathtracing/maxSamplesPerLaunch": 1_000_000, + "/rtx/viewTile/limit": 1_000_000, + }, + "balanced": { + "/rtx/rtpt/cached/enabled": False, + "/rtx/rtpt/lightcache/cached/enabled": False, + "/rtx/rtpt/translucency/virtualMotion/enabled": False, + "/rtx/rtpt/maxBounces": 2, + "/rtx/rtpt/splitGlass": False, + "/rtx/rtpt/splitClearcoat": False, + "/rtx/rtpt/splitRoughReflection": True, + "/rtx/rtpt/useAmbientOcclusionForAmbientLight": False, + "/rtx/sceneDb/ambientLightIntensity": 1.0, + "/rtx/shadows/enabled": True, + "/rtx/ambientOcclusion/enabled": False, + "/rtx/ambientOcclusion/denoiserMode": 1, + "/rtx/raytracing/subpixel/mode": 0, + "/rtx/raytracing/cached/enabled": True, + "/rtx-transient/dlssg/enabled": False, + "/rtx-transient/dldenoiser/enabled": True, + "/rtx/post/dlss/execMode": 1, + "/rtx/pathtracing/maxSamplesPerLaunch": 1_000_000, + "/rtx/viewTile/limit": 1_000_000, + }, + "high": { + "/rtx/rtpt/maxBounces": 3, + "/rtx/rtpt/cached/enabled": False, + "/rtx/rtpt/lightcache/cached/enabled": False, + "/rtx/rtpt/translucency/virtualMotion/enabled": False, + "/rtx/rtpt/splitRoughReflection": True, + "/rtx/rtpt/adaptiveSampling/disocclusion/enabled": True, + "/rtx/rtpt/adaptiveSampling/disocclusion/spp": 4, + "/rtx/sceneDb/ambientLightIntensity": 1.0, + "/rtx/shadows/enabled": True, + "/rtx/ambientOcclusion/enabled": True, + "/rtx/ambientOcclusion/denoiserMode": 0, + "/rtx/raytracing/subpixel/mode": 1, + "/rtx/raytracing/cached/enabled": True, + "/rtx-transient/dlssg/enabled": False, + "/rtx/post/dlss/execMode": 2, + "/rtx/pathtracing/maxSamplesPerLaunch": 1_000_000, + "/rtx/viewTile/limit": 1_000_000, + }, +} + + +def get_kit_rendering_preset(preset_name: str) -> dict[str, Any]: + """Return a deep copy of the requested rendering preset.""" + if preset_name not in {"performance", "balanced", "high"}: + raise ValueError(f"Unknown preset '{preset_name}'.") + return deepcopy(_KIT_PRESETS[preset_name]) diff --git a/source/isaaclab/isaaclab/sim/simulation_cfg.py b/source/isaaclab/isaaclab/sim/simulation_cfg.py index 6c2e97bb7e8..05df0ea1561 100644 --- a/source/isaaclab/isaaclab/sim/simulation_cfg.py +++ b/source/isaaclab/isaaclab/sim/simulation_cfg.py @@ -11,7 +11,7 @@ from __future__ import annotations -from typing import Any, Literal # Literal used by RenderCfg +from typing import Literal from isaaclab.physics import PhysicsCfg from isaaclab.sim.spawners.materials.physics_materials_cfg import RigidBodyMaterialCfg @@ -20,150 +20,76 @@ @configclass -class RenderCfg: - """Configuration for Omniverse RTX Renderer. +class RenderingQualityCfg: + """Shared rendering quality profile for visualizers and renderers. - These parameters are used to configure the Omniverse RTX Renderer. - - The defaults for IsaacLab are set in the experience files: - - * ``apps/isaaclab.python.rendering.kit``: Setting used when running the simulation with the GUI enabled. - * ``apps/isaaclab.python.headless.rendering.kit``: Setting used when running the simulation in headless mode. - - Setting any value here will override the defaults of the experience files. - - For more information, see the `Omniverse RTX Renderer documentation`_. - - .. _Omniverse RTX Renderer documentation: https://docs.omniverse.nvidia.com/materials-and-rendering/latest/rtx-renderer.html + This profile keeps backend-specific fields in one place using explicit prefixes: + - ``kit_*`` for Omniverse/RTX quality controls + - ``newton_*`` for Newton visual quality controls """ - enable_translucency: bool | None = None - """Enables translucency for specular transmissive surfaces such as glass. + kit_rendering_preset: Literal["performance", "balanced", "high"] | None = None + """Optional built-in preset profile. - This comes at the cost of some performance. Default is False. - This is set by the variable: ``/rtx/translucency/enabled``. + Preset values are defined in :mod:`isaaclab.renderer.rendering_quality_presets`. """ - enable_reflections: bool | None = None - """Enables reflections at the cost of some performance. Default is False. + kit_enable_translucency: bool | None = None + """Maps to ``/rtx/translucency/enabled``.""" - This is set by the variable: ``/rtx/reflections/enabled``. - """ + kit_enable_reflections: bool | None = None + """Maps to ``/rtx/reflections/enabled``.""" - enable_global_illumination: bool | None = None - """Enables Diffused Global Illumination at the cost of some performance. Default is False. + kit_enable_global_illumination: bool | None = None + """Maps to ``/rtx/indirectDiffuse/enabled``.""" - This is set by the variable: ``/rtx/indirectDiffuse/enabled``. - """ + kit_antialiasing_mode: Literal["Off", "FXAA", "DLSS", "TAA", "DLAA"] | None = None + """Optional anti-aliasing mode applied via Replicator settings helper.""" - antialiasing_mode: Literal["Off", "FXAA", "DLSS", "TAA", "DLAA"] | None = None - """Selects the anti-aliasing mode to use. Defaults to DLSS. + kit_enable_dlssg: bool | None = None + """Maps to ``/rtx-transient/dlssg/enabled``.""" - - **DLSS**: Boosts performance by using AI to output higher resolution frames from a lower resolution input. - DLSS samples multiple lower resolution images and uses motion data and feedback from prior frames to reconstruct - native quality images. - - **DLAA**: Provides higher image quality with an AI-based anti-aliasing technique. DLAA uses the same - Super Resolution technology developed for DLSS, reconstructing a native resolution image to maximize - image quality. + kit_enable_dl_denoiser: bool | None = None + """Maps to ``/rtx-transient/dldenoiser/enabled``.""" - This is set by the variable: ``/rtx/post/dlss/execMode``. - """ + kit_dlss_mode: Literal[0, 1, 2, 3] | None = None + """Maps to ``/rtx/post/dlss/execMode``.""" - enable_dlssg: bool | None = None - """"Enables the use of DLSS-G. Default is False. + kit_enable_direct_lighting: bool | None = None + """Maps to ``/rtx/directLighting/enabled``.""" - DLSS Frame Generation boosts performance by using AI to generate more frames. DLSS analyzes sequential frames - and motion data to create additional high quality frames. + kit_samples_per_pixel: int | None = None + """Maps to ``/rtx/directLighting/sampledLighting/samplesPerPixel``.""" - .. note:: + kit_enable_shadows: bool | None = None + """Maps to ``/rtx/shadows/enabled``.""" - This feature requires an Ada Lovelace architecture GPU. Enabling this feature also enables additional - thread-related activities, which can hurt performance. + kit_enable_ambient_occlusion: bool | None = None + """Maps to ``/rtx/ambientOcclusion/enabled``.""" - This is set by the variable: ``/rtx-transient/dlssg/enabled``. - """ + kit_dome_light_upper_lower_strategy: Literal[0, 3, 4] | None = None + """Maps to ``/rtx/domeLight/upperLowerStrategy``.""" - enable_dl_denoiser: bool | None = None - """Enables the use of a DL denoiser. + newton_enable_shadows: bool | None = None + """Overrides Newton visualizer shadow rendering.""" - The DL denoiser can help improve the quality of renders, but comes at a cost of performance. + newton_enable_sky: bool | None = None + """Overrides Newton visualizer sky rendering.""" - This is set by the variable: ``/rtx-transient/dldenoiser/enabled``. - """ + newton_enable_wireframe: bool | None = None + """Overrides Newton visualizer wireframe rendering.""" - dlss_mode: Literal[0, 1, 2, 3] | None = None - """For DLSS anti-aliasing, selects the performance/quality tradeoff mode. Default is 0. + newton_sky_upper_color: tuple[float, float, float] | None = None + """Overrides Newton visualizer upper sky color.""" - Valid values are: + newton_sky_lower_color: tuple[float, float, float] | None = None + """Overrides Newton visualizer lower sky color.""" - * 0 (Performance) - * 1 (Balanced) - * 2 (Quality) - * 3 (Auto) - - This is set by the variable: ``/rtx/post/dlss/execMode``. - """ - - enable_direct_lighting: bool | None = None - """Enable direct light contributions from lights. Default is False. - - This is set by the variable: ``/rtx/directLighting/enabled``. - """ - - samples_per_pixel: int | None = None - """Defines the Direct Lighting samples per pixel. Default is 1. - - A higher value increases the direct lighting quality at the cost of performance. - - This is set by the variable: ``/rtx/directLighting/sampledLighting/samplesPerPixel``. - """ + newton_light_color: tuple[float, float, float] | None = None + """Overrides Newton visualizer light color.""" - enable_shadows: bool | None = None - """Enables shadows at the cost of performance. Defaults to True. - - When disabled, lights will not cast shadows. - - This is set by the variable: ``/rtx/shadows/enabled``. - """ - - enable_ambient_occlusion: bool | None = None - """Enables ambient occlusion at the cost of some performance. Default is False. - - This is set by the variable: ``/rtx/ambientOcclusion/enabled``. - """ - - dome_light_upper_lower_strategy: Literal[0, 3, 4] | None = None - """Selects how to sample the Dome Light. Default is 0. - For more information, refer to the `documentation`_. - - .. _documentation: https://docs.omniverse.nvidia.com/materials-and-rendering/latest/rtx-renderer_common.html#dome-light - - Valid values are: - - * 0: **Image-Based Lighting (IBL)** - Most accurate even for high-frequency Dome Light textures. - Can introduce sampling artifacts in real-time mode. - * 3: **Limited Image-Based Lighting** - Only sampled for reflection and refraction. Fastest, but least - accurate. Good for cases where the Dome Light contributes less than other light sources. - * 4: **Approximated Image-Based Lighting** - Fast and artifacts-free sampling in real-time mode but only - works well with a low-frequency texture (e.g., a sky with no sun disc where the sun is instead a separate - Distant Light). Requires enabling Direct Lighting denoiser. - - This is set by the variable: ``/rtx/domeLight/upperLowerStrategy``. - """ - - carb_settings: dict[str, Any] | None = None - """A general dictionary for users to supply all carb rendering settings with native names. - - The keys of the dictionary can be formatted like a carb setting, .kit file setting, or python variable. - For instance, a key value pair can be ``/rtx/translucency/enabled: False`` (carb), - ``rtx.translucency.enabled: False`` (.kit), or ``rtx_translucency_enabled: False`` (python). - """ - - rendering_mode: Literal["performance", "balanced", "quality"] | None = None - """The rendering mode. - - This behaves the same as the passing the CLI arg ``--rendering_mode`` to an executable script. - """ + # TODO: Consider supporting additional raw backend settings dictionaries and + # inline RenderingQualityCfg objects in VisualizerCfg/RendererCfg. @configclass @@ -238,8 +164,12 @@ class SimulationCfg: a different config (e.g., NewtonManagerCfg) to use a different physics backend. """ - render: RenderCfg = RenderCfg() - """Render settings. Default is RenderCfg().""" + rendering_quality_cfgs: dict[str, RenderingQualityCfg] = { + "performance": RenderingQualityCfg(kit_rendering_preset="performance"), + "balanced": RenderingQualityCfg(kit_rendering_preset="balanced"), + "high": RenderingQualityCfg(kit_rendering_preset="high"), + } + """Named rendering quality profiles available to visualizers/renderers.""" create_stage_in_memory: bool = False """If stage is first created in memory. Default is False. diff --git a/source/isaaclab/isaaclab/sim/simulation_context.py b/source/isaaclab/isaaclab/sim/simulation_context.py index 27e41f69a8b..127d159db33 100644 --- a/source/isaaclab/isaaclab/sim/simulation_context.py +++ b/source/isaaclab/isaaclab/sim/simulation_context.py @@ -7,18 +7,17 @@ import gc import logging -import os import traceback from collections.abc import Iterator from contextlib import contextmanager from typing import Any -import toml import torch from pxr import Gf, Usd, UsdGeom, UsdPhysics, UsdUtils import isaaclab.sim as sim_utils +from isaaclab.renderer.rendering_quality_presets import get_kit_rendering_preset import isaaclab.sim.utils.stage as stage_utils from isaaclab.app.settings_manager import SettingsManager from isaaclab.physics import BaseSceneDataProvider, PhysicsManager, SceneDataProvider @@ -164,7 +163,6 @@ def __init__(self, cfg: SimulationCfg | None = None): self.cfg.physics = self._physics self.physics_manager: type[PhysicsManager] = self._physics.class_type self.physics_manager.initialize(self) - self._apply_render_cfg_settings() # Initialize visualizer state (provider/visualizers are created lazily during initialize_visualizers()). self._scene_data_provider: BaseSceneDataProvider | None = None @@ -191,19 +189,14 @@ def __init__(self, cfg: SimulationCfg | None = None): type(self)._instance = self # Mark as valid singleton only after successful init - def _apply_render_cfg_settings(self) -> None: - """Apply render preset and overrides from SimulationCfg.render.""" - # TODO: Refactor render preset + override handling to a dedicated RenderingQualityCfg - # (name subject to change) to keep quality profiles and carb mappings centralized. - render_cfg = getattr(self.cfg, "render", None) - if render_cfg is None: - return + def _apply_kit_rendering_preset(self, preset_name: str) -> None: + preset = get_kit_rendering_preset(preset_name) + for key, value in preset.items(): + self.set_setting(key, value) - # Priority: - # 1) CLI/AppLauncher setting if present, 2) SimulationCfg.render.rendering_mode. - rendering_mode = self.get_setting("/isaaclab/rendering/rendering_mode") - if not rendering_mode: - rendering_mode = getattr(render_cfg, "rendering_mode", None) + def _apply_kit_rendering_quality_cfg(self, quality_cfg: RenderingQualityCfg) -> None: + if quality_cfg.kit_rendering_preset: + self._apply_kit_rendering_preset(quality_cfg.kit_rendering_preset) if rendering_mode: supported_rendering_modes = {"performance", "balanced", "quality"} @@ -276,10 +269,88 @@ def _apply_nested(data: dict[str, Any], path: str = "") -> None: try: import omni.replicator.core as rep - rep.settings.set_render_rtx_realtime(antialiasing=antialiasing_mode) + rep.settings.set_render_rtx_realtime(antialiasing=quality_cfg.kit_antialiasing_mode) except Exception: pass + def _apply_newton_quality_cfg_to_visualizer_cfg(self, visualizer_cfg: Any, quality_cfg: RenderingQualityCfg) -> None: + override_fields = { + "newton_enable_shadows": "enable_shadows", + "newton_enable_sky": "enable_sky", + "newton_enable_wireframe": "enable_wireframe", + "newton_sky_upper_color": "sky_upper_color", + "newton_sky_lower_color": "sky_lower_color", + "newton_light_color": "light_color", + } + for quality_field, viz_field in override_fields.items(): + value = getattr(quality_cfg, quality_field, None) + if value is not None and hasattr(visualizer_cfg, viz_field): + setattr(visualizer_cfg, viz_field, value) + + def _resolve_rendering_quality_name_for_visualizer_cfg(self, visualizer_cfg: Any) -> str | None: + cli_quality_explicit = bool(self.get_setting("/isaaclab/rendering/rendering_quality/explicit")) + cli_quality = self.get_setting("/isaaclab/rendering/rendering_quality") + if cli_quality_explicit: + return cli_quality if cli_quality else None + quality_name = getattr(visualizer_cfg, "rendering_quality", None) + return quality_name if quality_name else None + + def _resolve_rendering_quality_cfg(self, quality_name: str | None) -> RenderingQualityCfg | None: + if not quality_name: + return None + quality_cfgs = getattr(self.cfg, "rendering_quality_cfgs", None) or {} + quality_cfg = quality_cfgs.get(quality_name) + if quality_cfg is None: + logger.warning( + "[SimulationContext] Rendering quality '%s' not found in SimulationCfg.rendering_quality_cfgs.", + quality_name, + ) + return None + return quality_cfg + + def _apply_quality_profile_to_visualizer_cfg(self, visualizer_cfg: Any) -> None: + quality_name = self._resolve_rendering_quality_name_for_visualizer_cfg(visualizer_cfg) + quality_cfg = self._resolve_rendering_quality_cfg(quality_name) + if quality_cfg is None: + return + if getattr(visualizer_cfg, "visualizer_type", None) == "kit": + self._apply_kit_rendering_quality_cfg(quality_cfg) + elif getattr(visualizer_cfg, "visualizer_type", None) == "newton": + self._apply_newton_quality_cfg_to_visualizer_cfg(visualizer_cfg, quality_cfg) + + def _apply_runtime_quality_profile_to_visualizer(self, viz: Visualizer, force: bool = False) -> None: + quality_name = self._resolve_rendering_quality_name_for_visualizer_cfg(viz.cfg) + viz_id = id(viz) + if not force and self._visualizer_quality_keys.get(viz_id) == quality_name: + return + quality_cfg = self._resolve_rendering_quality_cfg(quality_name) + if quality_cfg is None: + self._visualizer_quality_keys[viz_id] = quality_name + return + + viz_type = getattr(viz.cfg, "visualizer_type", None) + if viz_type == "kit": + self._apply_kit_rendering_quality_cfg(quality_cfg) + elif viz_type == "newton": + self._apply_newton_quality_cfg_to_visualizer_cfg(viz.cfg, quality_cfg) + viewer = getattr(viz, "_viewer", None) + if viewer is not None and hasattr(viewer, "renderer"): + if quality_cfg.newton_enable_shadows is not None: + viewer.renderer.draw_shadows = quality_cfg.newton_enable_shadows + if quality_cfg.newton_enable_sky is not None: + viewer.renderer.draw_sky = quality_cfg.newton_enable_sky + if quality_cfg.newton_enable_wireframe is not None: + viewer.renderer.draw_wireframe = quality_cfg.newton_enable_wireframe + if quality_cfg.newton_sky_upper_color is not None: + viewer.renderer.sky_upper = quality_cfg.newton_sky_upper_color + if quality_cfg.newton_sky_lower_color is not None: + viewer.renderer.sky_lower = quality_cfg.newton_sky_lower_color + if quality_cfg.newton_light_color is not None: + viewer.renderer._light_color = quality_cfg.newton_light_color + + # Store last applied quality key so runtime hot swapping can be detected per visualizer. + self._visualizer_quality_keys[viz_id] = quality_name + def _init_usd_physics_scene(self) -> None: """Create and configure the USD physics scene.""" cfg = self.cfg @@ -447,6 +518,14 @@ def _is_cli_visualizer_disable_all(self) -> bool: """Return ``True`` when CLI requested ``--viz none`` semantics.""" return bool(self.get_setting("/isaaclab/visualizer/disable_all")) + def _is_cli_visualizer_explicit(self) -> bool: + """Return whether --visualizer/--viz was explicitly provided.""" + return bool(self.get_setting("/isaaclab/visualizer/explicit")) + + def _is_cli_visualizer_disable_all(self) -> bool: + """Return whether CLI explicitly disabled all visualizers.""" + return bool(self.get_setting("/isaaclab/visualizer/disable_all")) + def resolve_visualizer_types(self) -> list[str]: """Resolve visualizer types from config or CLI settings.""" if self._is_cli_visualizer_disable_all(): @@ -561,8 +640,10 @@ def initialize_visualizers(self) -> None: for cfg in visualizer_cfgs: try: + self._apply_quality_profile_to_visualizer_cfg(cfg) visualizer = cfg.create_visualizer() visualizer.initialize(self._scene_data_provider) + self._apply_runtime_quality_profile_to_visualizer(visualizer, force=True) self._visualizers.append(visualizer) except Exception as exc: if cli_explicit: @@ -704,6 +785,7 @@ def update_visualizers(self, dt: float) -> None: for viz in visualizers_to_remove: try: + self._visualizer_quality_keys.pop(id(viz), None) viz.close() self._visualizers.remove(viz) logger.info("Removed visualizer: %s", type(viz).__name__) @@ -778,6 +860,7 @@ def clear_instance(cls) -> None: # Close all visualizers for viz in cls._instance._visualizers: + cls._instance._visualizer_quality_keys.pop(id(viz), None) viz.close() cls._instance._visualizers.clear() if cls._instance._scene_data_provider is not None: diff --git a/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py b/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py index a96e3c04d2b..1a16e53eb7b 100644 --- a/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py +++ b/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py @@ -62,6 +62,13 @@ class VisualizerCfg: Note, OV visualizer only applies a cosmetic visibility toggle (no performance gain). """ + rendering_quality: str | None = None + """Name of the rendering quality profile for this visualizer. + + Selects an entry from :class:`isaaclab.sim.SimulationCfg.rendering_quality_cfgs`. + If None, no rendering quality overrides are applied and backend/native defaults are used. + """ + def get_visualizer_type(self) -> str | None: """Get the visualizer type identifier. diff --git a/source/isaaclab/test/sim/test_simulation_render_config.py b/source/isaaclab/test/sim/test_simulation_render_config.py index e5ad4274d18..388e59adc04 100644 --- a/source/isaaclab/test/sim/test_simulation_render_config.py +++ b/source/isaaclab/test/sim/test_simulation_render_config.py @@ -14,11 +14,7 @@ """Rest everything follows.""" -import os - -import flatdict import pytest -import toml from isaaclab.app.settings_manager import get_settings_manager from isaaclab.sim.simulation_cfg import RenderCfg, SimulationCfg @@ -90,40 +86,31 @@ def test_render_cfg(): @pytest.mark.isaacsim_ci def test_render_cfg_presets(): - """Test that the simulation context is created with the correct render cfg preset with overrides.""" + """Test that quality presets are applied and can be overridden via RenderingQualityCfg.""" - # carb setting dictionary overrides - carb_settings = {"/rtx/raytracing/subpixel/mode": 3, "/rtx/pathtracing/maxSamplesPerLaunch": 999999} - # user-friendly setting overrides + # user-friendly field override dlss_mode = ("/rtx/post/dlss/execMode", 5) - rendering_modes = ["performance", "balanced", "quality"] + rendering_modes = ["performance", "balanced", "high"] for rendering_mode in rendering_modes: # Clear any existing simulation context before creating a new one SimulationContext.clear_instance() - # grab isaac lab apps path - isaaclab_app_exp_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), *[".."] * 4, "apps") - # for Isaac Sim 5 compatibility, we use the 5 rendering mode app files in a different folder - if get_isaac_sim_version().major < 6: - isaaclab_app_exp_path = os.path.join(isaaclab_app_exp_path, "isaacsim_5") - - # grab preset settings - preset_filename = os.path.join(isaaclab_app_exp_path, f"rendering_modes/{rendering_mode}.kit") - with open(preset_filename) as file: - preset_dict = toml.load(file) - preset_dict = dict(flatdict.FlatDict(preset_dict, delimiter=".")) - - render_cfg = RenderCfg( - rendering_mode=rendering_mode, - dlss_mode=dlss_mode[1], - carb_settings=carb_settings, - ) + preset_dict = get_kit_rendering_preset(rendering_mode) - cfg = SimulationCfg(render=render_cfg) + profile_name = f"profile_{rendering_mode}" + quality_cfg = RenderingQualityCfg( + kit_rendering_preset=rendering_mode, + kit_dlss_mode=dlss_mode[1], + ) + cfg = SimulationCfg( + rendering_quality_cfgs={profile_name: quality_cfg}, + visualizer_cfgs=KitVisualizerCfg(rendering_quality=profile_name), + ) - SimulationContext(cfg) + sim = SimulationContext(cfg) + sim.reset() settings = get_settings_manager() for key, val in preset_dict.items(): @@ -149,49 +136,27 @@ def test_render_cfg_presets(): @pytest.mark.skip(reason="Timeline not stopped") @pytest.mark.isaacsim_ci -def test_render_cfg_defaults(): - """Test that the simulation context is created with the correct render cfg.""" - enable_translucency = False - enable_reflections = False - enable_global_illumination = False - antialiasing_mode = "DLSS" - enable_dlssg = False - enable_dl_denoiser = False - dlss_mode = 2 - enable_direct_lighting = False - samples_per_pixel = 1 - enable_shadows = False - enable_ambient_occlusion = False - - render_cfg = RenderCfg( - enable_translucency=enable_translucency, - enable_reflections=enable_reflections, - enable_global_illumination=enable_global_illumination, - antialiasing_mode=antialiasing_mode, - enable_dlssg=enable_dlssg, - enable_dl_denoiser=enable_dl_denoiser, - dlss_mode=dlss_mode, - enable_direct_lighting=enable_direct_lighting, - samples_per_pixel=samples_per_pixel, - enable_shadows=enable_shadows, - enable_ambient_occlusion=enable_ambient_occlusion, +def test_rendering_quality_cfg_field_overrides(): + """Test that explicit RenderingQualityCfg fields map to carb settings.""" + quality_cfg = RenderingQualityCfg( + kit_enable_translucency=True, + kit_enable_reflections=True, + kit_enable_global_illumination=True, + kit_antialiasing_mode="DLAA", + kit_enable_dlssg=True, + kit_enable_dl_denoiser=True, + kit_dlss_mode=0, + kit_enable_direct_lighting=True, + kit_samples_per_pixel=4, + kit_enable_shadows=True, + kit_enable_ambient_occlusion=True, + ) + cfg = SimulationCfg( + rendering_quality_cfgs={"custom": quality_cfg}, + visualizer_cfgs=KitVisualizerCfg(rendering_quality="custom"), ) - - cfg = SimulationCfg(render=render_cfg) - sim = SimulationContext(cfg) - - assert sim.cfg.render.enable_translucency == enable_translucency - assert sim.cfg.render.enable_reflections == enable_reflections - assert sim.cfg.render.enable_global_illumination == enable_global_illumination - assert sim.cfg.render.antialiasing_mode == antialiasing_mode - assert sim.cfg.render.enable_dlssg == enable_dlssg - assert sim.cfg.render.enable_dl_denoiser == enable_dl_denoiser - assert sim.cfg.render.dlss_mode == dlss_mode - assert sim.cfg.render.enable_direct_lighting == enable_direct_lighting - assert sim.cfg.render.samples_per_pixel == samples_per_pixel - assert sim.cfg.render.enable_shadows == enable_shadows - assert sim.cfg.render.enable_ambient_occlusion == enable_ambient_occlusion + sim.reset() assert sim.get_setting("/rtx/translucency/enabled") == sim.cfg.render.enable_translucency assert sim.get_setting("/rtx/reflections/enabled") == sim.cfg.render.enable_reflections diff --git a/source/isaaclab_mimic/test/test_generate_dataset.py b/source/isaaclab_mimic/test/test_generate_dataset.py index 63aceb95a67..8ba8efb52d2 100644 --- a/source/isaaclab_mimic/test/test_generate_dataset.py +++ b/source/isaaclab_mimic/test/test_generate_dataset.py @@ -121,7 +121,8 @@ def setup_test_environment(): "--output_file", annotated_output_path, "--auto", - "--headless", + "--visualizer", + "none", ] print(config_command) @@ -191,7 +192,8 @@ def test_generate_dataset(setup_test_environment): generated_output_path, "--generation_num_trials", "1", - "--headless", + "--visualizer", + "none", ] result = _run_script(command) diff --git a/source/isaaclab_mimic/test/test_generate_dataset_skillgen.py b/source/isaaclab_mimic/test/test_generate_dataset_skillgen.py index 6603b9ffcce..2e958244e62 100644 --- a/source/isaaclab_mimic/test/test_generate_dataset_skillgen.py +++ b/source/isaaclab_mimic/test/test_generate_dataset_skillgen.py @@ -127,7 +127,8 @@ def test_generate_dataset_skillgen(setup_skillgen_test_environment): "--generation_num_trials", "1", "--use_skillgen", - "--headless", + "--visualizer", + "none", "--task", "Isaac-Stack-Cube-Franka-IK-Rel-Skillgen-v0", ] diff --git a/source/isaaclab_tasks/test/benchmarking/test_environments_training.py b/source/isaaclab_tasks/test/benchmarking/test_environments_training.py index 51df662d7ec..cb5e3b833a5 100644 --- a/source/isaaclab_tasks/test/benchmarking/test_environments_training.py +++ b/source/isaaclab_tasks/test/benchmarking/test_environments_training.py @@ -45,7 +45,8 @@ def train_job(workflow, task, env_config, num_gpus): "--task", task, "--enable_cameras", - "--headless", + "--visualizer", + "none", ] # Add max iterations if specified From b8ae62c173c56caaab2e7d72c3a01a5b0dc62d22 Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Sat, 21 Feb 2026 00:44:53 +0000 Subject: [PATCH 02/34] update docs --- docs/source/how-to/configure_rendering.rst | 136 +++++++++++-------- source/isaaclab/isaaclab/app/app_launcher.py | 3 +- 2 files changed, 78 insertions(+), 61 deletions(-) diff --git a/docs/source/how-to/configure_rendering.rst b/docs/source/how-to/configure_rendering.rst index ee2510fdc44..a3348d10fe5 100644 --- a/docs/source/how-to/configure_rendering.rst +++ b/docs/source/how-to/configure_rendering.rst @@ -14,39 +14,56 @@ Isaac Lab's RTX renderer offers 3 preset rendering modes: performance, balanced, You can select a mode via a command line argument or from within a script, and customize settings as needed. Adjust and fine-tune rendering to achieve the ideal balance for your workflow. -Selecting a Rendering Mode --------------------------- +Selecting a Rendering Quality Profile +------------------------------------- -Rendering modes can be selected in 2 ways. +Rendering quality can be selected in 2 ways. -1. using the ``rendering_mode`` input class argument in :class:`~sim.RenderCfg` +1. setting ``rendering_quality`` in a visualizer config, which selects an entry from + :attr:`~sim.SimulationCfg.rendering_quality_cfgs` .. code-block:: python - # for an example of how this can be used, checkout the tutorial script - # scripts/tutorials/00_sim/set_rendering_mode.py - render_cfg = sim_utils.RenderCfg(rendering_mode="performance") - -2. using the ``--rendering_mode`` CLI argument, which takes precedence over the ``rendering_mode`` argument in :class:`~sim.RenderCfg`. + import isaaclab.sim as sim_utils + from isaaclab.visualizers import KitVisualizerCfg + + sim_cfg = sim_utils.SimulationCfg( + rendering_quality_cfgs={ + "performance": sim_utils.RenderingQualityCfg(kit_rendering_preset="performance"), + "balanced": sim_utils.RenderingQualityCfg(kit_rendering_preset="balanced"), + "high": sim_utils.RenderingQualityCfg(kit_rendering_preset="high"), + }, + visualizer_cfgs=[ + KitVisualizerCfg( + rendering_quality="performance", + ), + ], + ) + +2. using the ``--rendering_quality`` CLI argument, which takes precedence over + ``visualizer_cfg.rendering_quality`` .. code-block:: bash - ./isaaclab.sh -p scripts/tutorials/00_sim/set_rendering_mode.py --rendering_mode {performance/balanced/quality} + ./isaaclab.sh -p scripts/tutorials/00_sim/set_rendering_mode.py --rendering_quality {performance/balanced/high} + +Notes: -Note, the ``rendering_mode`` defaults to ``balanced``. -However, in the case where the launcher argument ``--enable_cameras`` is not set, then -the default ``rendering_mode`` is not applied and, instead, the default kit rendering settings are used. +* If ``rendering_quality=None`` for a visualizer, Isaac Lab does not apply rendering overrides + for that visualizer, and backend/native defaults (for Kit, USD-authored settings) are used. +* ``--rendering_mode`` is deprecated. If used, it maps to ``--rendering_quality`` + (legacy ``quality`` maps to ``high``). Example renders from the ``set_rendering_mode.py`` script. To help assess rendering, the example scene includes some reflections, translucency, direct and ambient lighting, and several material types. -- Quality Mode +- High Mode .. image:: ../_static/how-to/howto_rendering_example_quality.jpg :width: 100% - :alt: Quality Rendering Mode Example + :alt: High Rendering Mode Example - Balanced Mode @@ -60,41 +77,42 @@ To help assess rendering, the example scene includes some reflections, transluce :width: 100% :alt: Performance Rendering Mode Example -Overwriting Specific Rendering Settings ---------------------------------------- +Overwriting Specific Rendering Quality Settings +----------------------------------------------- -Preset rendering settings can be overwritten via the :class:`~sim.RenderCfg` class. +Preset rendering settings can be overwritten via :class:`~sim.RenderingQualityCfg`. There are 2 ways to provide settings that overwrite presets. -1. :class:`~sim.RenderCfg` supports overwriting specific settings via user-friendly setting names that map to underlying RTX settings. +1. :class:`~sim.RenderingQualityCfg` supports overwriting specific settings via explicit + ``kit_*`` fields that map to underlying RTX settings. For example: .. code-block:: python - render_cfg = sim_utils.RenderCfg( - rendering_mode="performance", - # user friendly setting overwrites - enable_translucency=True, # defaults to False in performance mode - enable_reflections=True, # defaults to False in performance mode - dlss_mode="3", # defaults to 1 in performance mode + quality_cfg = sim_utils.RenderingQualityCfg( + kit_rendering_preset="performance", + # explicit field overrides + kit_enable_translucency=True, # defaults to False in performance mode + kit_enable_reflections=True, # defaults to False in performance mode + kit_dlss_mode=3, # defaults to 0 in performance mode ) - List of user-friendly settings. + List of Kit settings. .. table:: :widths: 25 75 - +----------------------------+--------------------------------------------------------------------------+ - | enable_translucency | Bool. Enables translucency for specular transmissive surfaces such as | - | | glass at the cost of some performance. | - +----------------------------+--------------------------------------------------------------------------+ - | enable_reflections | Bool. Enables reflections at the cost of some performance. | - +----------------------------+--------------------------------------------------------------------------+ - | enable_global_illumination | Bool. Enables Diffused Global Illumination at the cost of some | - | | performance. | - +----------------------------+--------------------------------------------------------------------------+ - | antialiasing_mode | Literal["Off", "FXAA", "DLSS", "TAA", "DLAA"]. | + +------------------------------------+-------------------------------------------------------------------------+ + | kit_enable_translucency | Bool. Enables translucency for specular transmissive surfaces such as | + | | glass at the cost of some performance. | + +------------------------------------+-------------------------------------------------------------------------+ + | kit_enable_reflections | Bool. Enables reflections at the cost of some performance. | + +------------------------------------+-------------------------------------------------------------------------+ + | kit_enable_global_illumination | Bool. Enables Diffused Global Illumination at the cost of some | + | | performance. | + +------------------------------------+-------------------------------------------------------------------------+ + | kit_antialiasing_mode | Literal["Off", "FXAA", "DLSS", "TAA", "DLAA"]. | | | | | | DLSS: Boosts performance by using AI to output higher resolution frames | | | from a lower resolution input. DLSS samples multiple lower resolution | @@ -103,29 +121,29 @@ There are 2 ways to provide settings that overwrite presets. | | DLAA: Provides higher image quality with an AI-based anti-aliasing | | | technique. DLAA uses the same Super Resolution technology developed for | | | DLSS, reconstructing a native resolution image to maximize image quality.| - +----------------------------+--------------------------------------------------------------------------+ - | enable_dlssg | Bool. Enables the use of DLSS-G. DLSS Frame Generation boosts performance| - | | by using AI to generate more frames. This feature requires an Ada | - | | Lovelace architecture GPU and can hurt performance due to additional | - | | thread-related activities. | - +----------------------------+--------------------------------------------------------------------------+ - | enable_dl_denoiser | Bool. Enables the use of a DL denoiser, which improves the quality of | - | | renders at the cost of performance. | - +----------------------------+--------------------------------------------------------------------------+ - | dlss_mode | Literal[0, 1, 2, 3]. For DLSS anti-aliasing, selects the performance/ | - | | quality tradeoff mode. Valid values are 0 (Performance), 1 (Balanced), | - | | 2 (Quality), or 3 (Auto). | - +----------------------------+--------------------------------------------------------------------------+ - | enable_direct_lighting | Bool. Enable direct light contributions from lights. | - +----------------------------+--------------------------------------------------------------------------+ - | samples_per_pixel | Int. Defines the Direct Lighting samples per pixel. Higher values | - | | increase the direct lighting quality at the cost of performance. | - +----------------------------+--------------------------------------------------------------------------+ - | enable_shadows | Bool. Enables shadows at the cost of performance. When disabled, lights | - | | will not cast shadows. | - +----------------------------+--------------------------------------------------------------------------+ - | enable_ambient_occlusion | Bool. Enables ambient occlusion at the cost of some performance. | - +----------------------------+--------------------------------------------------------------------------+ + +------------------------------------+-------------------------------------------------------------------------+ + | kit_enable_dlssg | Bool. Enables the use of DLSS-G. DLSS Frame Generation boosts | + | | performance by using AI to generate more frames. This feature | + | | requires an Ada Lovelace architecture GPU and can hurt performance | + | | due to additional thread-related activities. | + +------------------------------------+-------------------------------------------------------------------------+ + | kit_enable_dl_denoiser | Bool. Enables the use of a DL denoiser, which improves render quality | + | | at the cost of performance. | + +------------------------------------+-------------------------------------------------------------------------+ + | kit_dlss_mode | Literal[0, 1, 2, 3]. For DLSS anti-aliasing, selects the | + | | performance/quality tradeoff mode: 0 (Performance), 1 (Balanced), | + | | 2 (Quality), 3 (Auto). | + +------------------------------------+-------------------------------------------------------------------------+ + | kit_enable_direct_lighting | Bool. Enable direct light contributions from lights. | + +------------------------------------+-------------------------------------------------------------------------+ + | kit_samples_per_pixel | Int. Defines direct lighting samples per pixel. Higher values increase | + | | quality at the cost of performance. | + +------------------------------------+-------------------------------------------------------------------------+ + | kit_enable_shadows | Bool. Enables shadows at the cost of performance. When disabled, lights | + | | will not cast shadows. | + +------------------------------------+-------------------------------------------------------------------------+ + | kit_enable_ambient_occlusion | Bool. Enables ambient occlusion at the cost of some performance. | + +------------------------------------+-------------------------------------------------------------------------+ 2. For more control, :class:`~sim.RenderCfg` allows you to overwrite any RTX setting by using the ``carb_settings`` argument. diff --git a/source/isaaclab/isaaclab/app/app_launcher.py b/source/isaaclab/isaaclab/app/app_launcher.py index ae24215016b..2c433bd6ca1 100644 --- a/source/isaaclab/isaaclab/app/app_launcher.py +++ b/source/isaaclab/isaaclab/app/app_launcher.py @@ -361,7 +361,7 @@ def add_app_launcher_args(parser: argparse.ArgumentParser) -> None: ) arg_group.add_argument( "--headless", - action=ExplicitTrueAction, + action="store_true", default=AppLauncher._APPLAUNCHER_CFG_INFO["headless"][1], help=( "[DEPRECATED] Disable visualizers and force headless mode (display off)." @@ -691,7 +691,6 @@ def _resolve_headless_settings(self, launcher_args: dict, livestream_arg: int, l # the bool of headless_arg to avoid messy string processing, headless_env = int(os.environ.get("HEADLESS", 0)) headless_arg = launcher_args.pop("headless", AppLauncher._APPLAUNCHER_CFG_INFO["headless"][1]) - headless_arg_explicit = launcher_args.pop("headless_explicit", False) headless_valid_vals = {0, 1} # Value checking on HEADLESS if headless_env not in headless_valid_vals: From 5400d951a5586dc30e2a1620d254c01923b9714b Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Sat, 21 Feb 2026 01:09:20 +0000 Subject: [PATCH 03/34] disentangle headless stuff --- docs/source/deployment/cluster.rst | 2 +- docs/source/deployment/docker.rst | 2 +- docs/source/deployment/run_docker_example.rst | 4 +-- docs/source/features/hydra.rst | 8 +++--- docs/source/features/multi_gpu.rst | 24 ++++++++--------- .../features/population_based_training.rst | 2 +- docs/source/features/visualization.rst | 6 ++--- .../estimate_how_many_cameras_can_run.rst | 2 +- docs/source/how-to/import_new_asset.rst | 2 +- docs/source/how-to/record_video.rst | 2 +- docs/source/how-to/save_camera_output.rst | 2 +- docs/source/how-to/simulation_performance.rst | 2 +- .../migration/migrating_from_isaacgymenvs.rst | 2 +- .../migrating_from_omniisaacgymenvs.rst | 2 +- docs/source/overview/environments.rst | 2 +- .../augmented_imitation.rst | 2 +- .../overview/imitation-learning/skillgen.rst | 16 ++++++------ .../performance_benchmarks.rst | 8 +++--- .../rl_existing_scripts.rst | 26 +++++++++---------- .../reinforcement-learning/rl_frameworks.rst | 10 +++---- .../00_hover/hover_policy.rst | 8 +++--- .../02_gear_assembly/gear_assembly_policy.rst | 8 +++--- docs/source/refs/release_notes.rst | 4 +-- docs/source/refs/troubleshooting.rst | 4 +-- .../include/src_verify_isaaclab.rst | 10 +++---- docs/source/setup/quickstart.rst | 2 +- docs/source/testing/benchmarks.rst | 6 ++--- docs/source/tutorials/00_sim/create_empty.rst | 2 +- .../03_envs/configuring_rl_training.rst | 6 ++--- .../03_envs/modify_direct_rl_env.rst | 2 +- .../03_envs/policy_inference_in_usd.rst | 2 +- source/isaaclab/isaaclab/app/app_launcher.py | 20 +++++--------- .../isaaclab/sim/simulation_context.py | 13 ---------- .../test/test_generate_dataset.py | 6 ++--- .../test/test_generate_dataset_skillgen.py | 3 +-- .../test_environments_training.py | 3 +-- 36 files changed, 101 insertions(+), 124 deletions(-) diff --git a/docs/source/deployment/cluster.rst b/docs/source/deployment/cluster.rst index 5374cc88d50..ab9e03874e7 100644 --- a/docs/source/deployment/cluster.rst +++ b/docs/source/deployment/cluster.rst @@ -199,7 +199,7 @@ ANYmal rough terrain locomotion training can be executed with the following comm .. code:: bash - ./docker/cluster/cluster_interface.sh job --task Isaac-Velocity-Rough-Anymal-C-v0 --visualizer none --video --enable_cameras + ./docker/cluster/cluster_interface.sh job --task Isaac-Velocity-Rough-Anymal-C-v0 --headless --video --enable_cameras The above will, in addition, also render videos of the training progress and store them under ``isaaclab/logs`` directory. diff --git a/docs/source/deployment/docker.rst b/docs/source/deployment/docker.rst index 37cf18ee57e..65e22e2aef7 100644 --- a/docs/source/deployment/docker.rst +++ b/docs/source/deployment/docker.rst @@ -349,7 +349,7 @@ To run an example within the container, run: .. code:: bash - ./isaaclab.sh -p scripts/tutorials/00_sim/log_time.py --visualizer none + ./isaaclab.sh -p scripts/tutorials/00_sim/log_time.py --headless .. _`NVIDIA Software License Agreement`: https://www.nvidia.com/en-us/agreements/enterprise-software/nvidia-software-license-agreement diff --git a/docs/source/deployment/run_docker_example.rst b/docs/source/deployment/run_docker_example.rst index a42baf13c59..8da716585f7 100644 --- a/docs/source/deployment/run_docker_example.rst +++ b/docs/source/deployment/run_docker_example.rst @@ -92,11 +92,11 @@ The output will be a file, ``log.txt``, with the ``sim_time`` written on a newli Executing the Script ~~~~~~~~~~~~~~~~~~~~ -We will execute the script to produce a log, adding a ``--visualizer none`` flag to our execution to prevent a GUI: +We will execute the script to produce a log, adding a ``--headless`` flag to our execution to prevent a GUI: .. code-block:: bash - isaaclab -p scripts/tutorials/00_sim/log_time.py --visualizer none + isaaclab -p scripts/tutorials/00_sim/log_time.py --headless Now ``log.txt`` will have been produced at ``/workspace/isaaclab/logs/docker_tutorial``. If we exit the container diff --git a/docs/source/features/hydra.rst b/docs/source/features/hydra.rst index 0ea0cd6f33d..0e3ddc34181 100644 --- a/docs/source/features/hydra.rst +++ b/docs/source/features/hydra.rst @@ -25,28 +25,28 @@ As a result, training with hydra arguments can be run with the following syntax: .. code-block:: shell - python scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Cartpole-v0 --visualizer none env.actions.joint_effort.scale=10.0 agent.seed=2024 + python scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Cartpole-v0 --headless env.actions.joint_effort.scale=10.0 agent.seed=2024 .. tab-item:: rl_games :sync: rl_games .. code-block:: shell - python scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-v0 --visualizer none env.actions.joint_effort.scale=10.0 agent.params.seed=2024 + python scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-v0 --headless env.actions.joint_effort.scale=10.0 agent.params.seed=2024 .. tab-item:: skrl :sync: skrl .. code-block:: shell - python scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --visualizer none env.actions.joint_effort.scale=10.0 agent.seed=2024 + python scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --headless env.actions.joint_effort.scale=10.0 agent.seed=2024 .. tab-item:: sb3 :sync: sb3 .. code-block:: shell - python scripts/reinforcement_learning/sb3/train.py --task=Isaac-Cartpole-v0 --visualizer none env.actions.joint_effort.scale=10.0 agent.seed=2024 + python scripts/reinforcement_learning/sb3/train.py --task=Isaac-Cartpole-v0 --headless env.actions.joint_effort.scale=10.0 agent.seed=2024 The above command will run the training script with the task ``Isaac-Cartpole-v0`` in headless mode, and set the ``env.actions.joint_effort.scale`` parameter to 10.0 and the ``agent.seed`` parameter to 2024. diff --git a/docs/source/features/multi_gpu.rst b/docs/source/features/multi_gpu.rst index 7c3e58d6f90..2537e5eff25 100644 --- a/docs/source/features/multi_gpu.rst +++ b/docs/source/features/multi_gpu.rst @@ -96,14 +96,14 @@ To train with multiple GPUs, use the following command, where ``--nproc_per_node .. code-block:: shell - python -m torch.distributed.run --nnodes=1 --nproc_per_node=2 scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-v0 --visualizer none --distributed + python -m torch.distributed.run --nnodes=1 --nproc_per_node=2 scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-v0 --headless --distributed .. tab-item:: rsl_rl :sync: rsl_rl .. code-block:: shell - python -m torch.distributed.run --nnodes=1 --nproc_per_node=2 scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Cartpole-v0 --visualizer none --distributed + python -m torch.distributed.run --nnodes=1 --nproc_per_node=2 scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Cartpole-v0 --headless --distributed .. tab-item:: skrl :sync: skrl @@ -115,14 +115,14 @@ To train with multiple GPUs, use the following command, where ``--nproc_per_node .. code-block:: shell - python -m torch.distributed.run --nnodes=1 --nproc_per_node=2 scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --visualizer none --distributed + python -m torch.distributed.run --nnodes=1 --nproc_per_node=2 scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --headless --distributed .. tab-item:: JAX :sync: jax .. code-block:: shell - python -m skrl.utils.distributed.jax --nnodes=1 --nproc_per_node=2 scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --visualizer none --distributed --ml_framework jax + python -m skrl.utils.distributed.jax --nnodes=1 --nproc_per_node=2 scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --headless --distributed --ml_framework jax Multi-Node Training ------------------- @@ -141,14 +141,14 @@ For the master node, use the following command, where ``--nproc_per_node`` repre .. code-block:: shell - python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=0 --master_addr= --master_port=5555 scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-v0 --visualizer none --distributed + python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=0 --master_addr= --master_port=5555 scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-v0 --headless --distributed .. tab-item:: rsl_rl :sync: rsl_rl .. code-block:: shell - python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=0 --master_addr= --master_port=5555 scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Cartpole-v0 --visualizer none --distributed + python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=0 --master_addr= --master_port=5555 scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Cartpole-v0 --headless --distributed .. tab-item:: skrl :sync: skrl @@ -160,14 +160,14 @@ For the master node, use the following command, where ``--nproc_per_node`` repre .. code-block:: shell - python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=0 --master_addr= --master_port=5555 scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --visualizer none --distributed + python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=0 --master_addr= --master_port=5555 scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --headless --distributed .. tab-item:: JAX :sync: jax .. code-block:: shell - python -m skrl.utils.distributed.jax --nproc_per_node=2 --nnodes=2 --node_rank=0 --coordinator_address=ip_of_master_machine:5555 scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --visualizer none --distributed --ml_framework jax + python -m skrl.utils.distributed.jax --nproc_per_node=2 --nnodes=2 --node_rank=0 --coordinator_address=ip_of_master_machine:5555 scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --headless --distributed --ml_framework jax Note that the port (``5555``) can be replaced with any other available port. @@ -181,14 +181,14 @@ For non-master nodes, use the following command, replacing ``--node_rank`` with .. code-block:: shell - python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=1 --master_addr= --master_port=5555 scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-v0 --visualizer none --distributed + python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=1 --master_addr= --master_port=5555 scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-v0 --headless --distributed .. tab-item:: rsl_rl :sync: rsl_rl .. code-block:: shell - python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=1 --master_addr= --master_port=5555 scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Cartpole-v0 --visualizer none --distributed + python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=1 --master_addr= --master_port=5555 scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Cartpole-v0 --headless --distributed .. tab-item:: skrl :sync: skrl @@ -200,14 +200,14 @@ For non-master nodes, use the following command, replacing ``--node_rank`` with .. code-block:: shell - python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=1 --master_addr= --master_port=5555 scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --visualizer none --distributed + python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=1 --master_addr= --master_port=5555 scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --headless --distributed .. tab-item:: JAX :sync: jax .. code-block:: shell - python -m skrl.utils.distributed.jax --nproc_per_node=2 --nnodes=2 --node_rank=1 --coordinator_address=ip_of_master_machine:5555 scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --visualizer none --distributed --ml_framework jax + python -m skrl.utils.distributed.jax --nproc_per_node=2 --nnodes=2 --node_rank=1 --coordinator_address=ip_of_master_machine:5555 scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --headless --distributed --ml_framework jax For more details on multi-node training with PyTorch, please visit the `PyTorch documentation `_. diff --git a/docs/source/features/population_based_training.rst b/docs/source/features/population_based_training.rst index 8efc77f04c1..1de85bb57c5 100644 --- a/docs/source/features/population_based_training.rst +++ b/docs/source/features/population_based_training.rst @@ -118,7 +118,7 @@ Launch *N* workers, where *n* indicates each worker index: --seed= \ --task=Isaac-Repose-Cube-Shadow-Direct-v0 \ --num_envs=8192 \ - --visualizer none \ + --headless \ --track \ --wandb-name=idx \ --wandb-entity=<**entity**> \ diff --git a/docs/source/features/visualization.rst b/docs/source/features/visualization.rst index 40c28d584e5..d46ff6bd015 100644 --- a/docs/source/features/visualization.rst +++ b/docs/source/features/visualization.rst @@ -103,7 +103,7 @@ You can also configure custom visualizers in the code by defining ``VisualizerCf sim_cfg = SimulationCfg( visualizer_cfgs=[ - KitVisualizerCfg( + OVVisualizerCfg( viewport_name="Visualizer Viewport", create_viewport=True, dock_position="SAME", @@ -176,7 +176,7 @@ For the migration-focused summary and deprecation context, see Visualizer Backends ------------------- -Kit Visualizer +Omniverse Visualizer ~~~~~~~~~~~~~~~~~~~~ **Main Features:** @@ -192,7 +192,7 @@ Kit Visualizer from isaaclab_visualizers.kit import KitVisualizerCfg - visualizer_cfg = KitVisualizerCfg( + visualizer_cfg = OVVisualizerCfg( # Viewport settings viewport_name="Visualizer Viewport", # Viewport window name create_viewport=True, # Create new viewport vs. use existing diff --git a/docs/source/how-to/estimate_how_many_cameras_can_run.rst b/docs/source/how-to/estimate_how_many_cameras_can_run.rst index 6a6dc8ce781..ec9fa72cfb6 100644 --- a/docs/source/how-to/estimate_how_many_cameras_can_run.rst +++ b/docs/source/how-to/estimate_how_many_cameras_can_run.rst @@ -109,7 +109,7 @@ to live monitor resources while running this script, and in Windows, you can use If your system has a hard time handling the desired cameras, you can try the following - - Switch to headless mode (supply ``--visualizer none``) + - Switch to headless mode (supply ``--headless``) - Ensure you are using the GPU pipeline not CPU! - If you aren't using Tiled Cameras, switch to Tiled Cameras - Decrease camera resolution diff --git a/docs/source/how-to/import_new_asset.rst b/docs/source/how-to/import_new_asset.rst index b62015a2942..e241be44e96 100644 --- a/docs/source/how-to/import_new_asset.rst +++ b/docs/source/how-to/import_new_asset.rst @@ -140,7 +140,7 @@ is derived automatically from the robot name in the URDF): * ``anymal.usda`` - This is the main asset file. -To run the script headless, you can add the ``--visualizer none`` flag. This will not open the GUI and +To run the script headless, you can add the ``--headless`` flag. This will not open the GUI and exit the script after the conversion is complete. You can press play on the opened window to see the asset in the scene. The asset should fall under gravity. If it blows up, then it might be that you have self-collisions present in the URDF. diff --git a/docs/source/how-to/record_video.rst b/docs/source/how-to/record_video.rst index 7339f532c31..aba74363129 100644 --- a/docs/source/how-to/record_video.rst +++ b/docs/source/how-to/record_video.rst @@ -18,7 +18,7 @@ Example usage: .. code-block:: shell - python scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-v0 --visualizer none --video --video_length 100 --video_interval 500 + python scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-v0 --headless --video --video_length 100 --video_interval 500 The recorded videos will be saved in the same directory as the training checkpoints, under diff --git a/docs/source/how-to/save_camera_output.rst b/docs/source/how-to/save_camera_output.rst index cf294b2315c..f92f9bcc93d 100644 --- a/docs/source/how-to/save_camera_output.rst +++ b/docs/source/how-to/save_camera_output.rst @@ -92,7 +92,7 @@ To run the accompanying script, execute the following command: ./isaaclab.sh -p scripts/tutorials/04_sensors/run_usd_camera.py --save --draw --enable_cameras # Usage with saving only in headless mode - ./isaaclab.sh -p scripts/tutorials/04_sensors/run_usd_camera.py --save --visualizer none --enable_cameras + ./isaaclab.sh -p scripts/tutorials/04_sensors/run_usd_camera.py --save --headless --enable_cameras The simulation should start, and you can observe different objects falling down. An output folder will be created diff --git a/docs/source/how-to/simulation_performance.rst b/docs/source/how-to/simulation_performance.rst index 76985156148..bab04b6e8c1 100644 --- a/docs/source/how-to/simulation_performance.rst +++ b/docs/source/how-to/simulation_performance.rst @@ -13,7 +13,7 @@ of objects in the scene, the complexity of the physics simulation, and the hardw Here are some tips to improve performance: 1. **Use Headless Mode**: Running the simulation in headless mode can significantly improve performance, especially - when rendering is not required. You can enable headless mode by using the ``--visualizer none`` flag when running the + when rendering is not required. You can enable headless mode by using the ``--headless`` flag when running the simulator. 2. **Avoid Unnecessary Collisions**: If possible, reduce the number of object overlaps to reduce overhead in the simulation. Excessive contacts and collisions in the simulation can be expensive in the collision phase in the simulation. diff --git a/docs/source/migration/migrating_from_isaacgymenvs.rst b/docs/source/migration/migrating_from_isaacgymenvs.rst index ef14354adc3..db6371c40c9 100644 --- a/docs/source/migration/migrating_from_isaacgymenvs.rst +++ b/docs/source/migration/migrating_from_isaacgymenvs.rst @@ -916,7 +916,7 @@ To launch a training in Isaac Lab, use the command: .. code-block:: bash - python scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-Direct-v0 --visualizer none + python scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-Direct-v0 --headless Launching Inferencing ~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/source/migration/migrating_from_omniisaacgymenvs.rst b/docs/source/migration/migrating_from_omniisaacgymenvs.rst index 12f11ff9283..b3a46f0a518 100644 --- a/docs/source/migration/migrating_from_omniisaacgymenvs.rst +++ b/docs/source/migration/migrating_from_omniisaacgymenvs.rst @@ -983,7 +983,7 @@ To launch a training in Isaac Lab, use the command: .. code-block:: bash - python scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-Direct-v0 --visualizer none + python scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-Direct-v0 --headless Launching Inferencing ~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/source/overview/environments.rst b/docs/source/overview/environments.rst index 163a7f28329..95c29a33e8e 100644 --- a/docs/source/overview/environments.rst +++ b/docs/source/overview/environments.rst @@ -312,7 +312,7 @@ We provide environments for both disassembly and assembly. * |disassembly-link|: The plug starts inserted in the socket. A low-level controller lifts the plug out and moves it to a random position. This process is purely scripted and does not involve any learned policy. Therefore, it does not require policy training or evaluation. The resulting trajectories serve as demonstrations for the reverse process, i.e., learning to assemble. To run disassembly for a specific task: ``python source/isaaclab_tasks/isaaclab_tasks/direct/automate/run_disassembly_w_id.py --assembly_id=ASSEMBLY_ID --disassembly_dir=DISASSEMBLY_DIR``. All generated trajectories are saved to a local directory ``DISASSEMBLY_DIR``. * |assembly-link|: The goal is to insert the plug into the socket. You can use this environment to train a policy via reinforcement learning or evaluate a pre-trained checkpoint. - * To train an assembly policy, we run the command ``python source/isaaclab_tasks/isaaclab_tasks/direct/automate/run_w_id.py --assembly_id=ASSEMBLY_ID --train``. We can customize the training process using the optional flags: ``--visualizer none`` to run without opening the GUI windows, ``--max_iterations=MAX_ITERATIONS`` to set the number of training iterations, ``--num_envs=NUM_ENVS`` to set the number of parallel environments during training, ``--seed=SEED`` to assign the random seed. The policy checkpoints will be saved automatically during training in the directory ``logs/rl_games/Assembly/test``. + * To train an assembly policy, we run the command ``python source/isaaclab_tasks/isaaclab_tasks/direct/automate/run_w_id.py --assembly_id=ASSEMBLY_ID --train``. We can customize the training process using the optional flags: ``--headless`` to run without opening the GUI windows, ``--max_iterations=MAX_ITERATIONS`` to set the number of training iterations, ``--num_envs=NUM_ENVS`` to set the number of parallel environments during training, ``--seed=SEED`` to assign the random seed. The policy checkpoints will be saved automatically during training in the directory ``logs/rl_games/Assembly/test``. * To evaluate an assembly policy, we run the command ``python source/isaaclab_tasks/isaaclab_tasks/direct/automate/run_w_id.py --assembly_id=ASSEMBLY_ID --checkpoint=CHECKPOINT --log_eval``. The evaluation results are stored in ``evaluation_{ASSEMBLY_ID}.h5``. .. table:: diff --git a/docs/source/overview/imitation-learning/augmented_imitation.rst b/docs/source/overview/imitation-learning/augmented_imitation.rst index 2db54c8a2f4..376f447f97a 100644 --- a/docs/source/overview/imitation-learning/augmented_imitation.rst +++ b/docs/source/overview/imitation-learning/augmented_imitation.rst @@ -21,7 +21,7 @@ In the following example, we will show you how to use Isaac Lab Mimic to generat .. code:: bash ./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \ - --device cpu --enable_cameras --visualizer none --num_envs 10 --generation_num_trials 1000 \ + --device cpu --enable_cameras --headless --num_envs 10 --generation_num_trials 1000 \ --input_file ./datasets/annotated_dataset.hdf5 --output_file ./datasets/mimic_dataset_1k.hdf5 \ --task Isaac-Stack-Cube-Franka-IK-Rel-Visuomotor-Cosmos-Mimic-v0 \ --rendering_mode performance diff --git a/docs/source/overview/imitation-learning/skillgen.rst b/docs/source/overview/imitation-learning/skillgen.rst index 431eef4fa60..be8382b5c5e 100644 --- a/docs/source/overview/imitation-learning/skillgen.rst +++ b/docs/source/overview/imitation-learning/skillgen.rst @@ -96,7 +96,7 @@ For trajectory visualization during development: * Enable trajectory visualization by setting ``visualize_plan = True`` in the cuRobo planner configuration * When enabled, cuRobo planner interface will stream planned end-effector trajectories, waypoints, and collision data to Rerun for interactive inspection * Visualization helps identify planning issues, collision problems, and trajectory smoothness before full dataset generation - * Can also be ran with ``--visualizer none`` to disable isaacsim visualization but still visualize and debug end effector trajectories + * Can also be ran with ``--headless`` to disable isaacsim visualization but still visualize and debug end effector trajectories Step 4: Verify Installation ^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -250,7 +250,7 @@ Key parameters for SkillGen data generation: * ``--generation_num_trials``: Number of demonstrations to generate * ``--num_envs``: Parallel environments (tune based on GPU memory) * ``--device``: Computation device (cpu/cuda). Use cpu for stable physics -* ``--visualizer none``: Disable visualization for faster generation +* ``--headless``: Disable visualization for faster generation .. _task-basic-cube-stacking: @@ -296,7 +296,7 @@ Once satisfied with small-scale results, generate a full training dataset: ./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \ --device cpu \ - --visualizer none \ + --headless \ --num_envs 1 \ --generation_num_trials 1000 \ --input_file ./datasets/annotated_dataset_skillgen.hdf5 \ @@ -306,9 +306,9 @@ Once satisfied with small-scale results, generate a full training dataset: .. note:: - * Use ``--visualizer none`` to disable visualization for faster generation. Rerun visualization can be enabled by setting ``visualize_plan = True`` in the cuRobo planner configuration with ``--visualizer none`` enabled as well for debugging. + * Use ``--headless`` to disable visualization for faster generation. Rerun visualization can be enabled by setting ``visualize_plan = True`` in the cuRobo planner configuration with ``--headless`` enabled as well for debugging. * Adjust ``--num_envs`` based on your GPU memory (start with 1, increase gradually). The performance gain is not very significant when num_envs is greater than 1. A value of 5 seems to be a sweet spot for most GPUs to balance performance and memory usage between cuRobo instances and simulation environments. - * Generation time: ~90 to 120 minutes for one environment with ``--visualizer none`` enabled for 1000 demonstrations on a RTX 6000 Ada GPU. Time depends on the GPU, the number of environments, and the success rate of the demonstrations (which depends on quality of the annotated dataset). + * Generation time: ~90 to 120 minutes for one environment with ``--headless`` enabled for 1000 demonstrations on a RTX 6000 Ada GPU. Time depends on the GPU, the number of environments, and the success rate of the demonstrations (which depends on quality of the annotated dataset). * cuRobo planner interface and configurations are described in :ref:`cuRobo-interface-features`. .. _task-bin-cube-stacking: @@ -350,7 +350,7 @@ Generate the complete adaptive stacking dataset: ./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \ --device cpu \ - --visualizer none \ + --headless \ --num_envs 1 \ --generation_num_trials 1000 \ --input_file ./datasets/annotated_dataset_skillgen.hdf5 \ @@ -364,7 +364,7 @@ Generate the complete adaptive stacking dataset: .. note:: - If the pre-annotated dataset is used and the data generation command is run with ``--visualizer none`` enabled, the generation time is typically around ~220 minutes for 1000 demonstrations for a single environment on a RTX 6000 Ada GPU. + If the pre-annotated dataset is used and the data generation command is run with ``--headless`` enabled, the generation time is typically around ~220 minutes for 1000 demonstrations for a single environment on a RTX 6000 Ada GPU. .. note:: @@ -374,7 +374,7 @@ Generate the complete adaptive stacking dataset: * Vanilla Cube Stacking: 1 env ~9.3–9.6 GB steady; 5 envs ~21.8–22.2 GB steady (briefly higher during initialization). * Adaptive Bin Cube Stacking: 1 env ~9.3–9.6 GB steady; 5 envs ~22.0–22.3 GB steady (briefly higher during initialization). * Minimum recommended GPU: ≥24 GB VRAM for ``--num_envs`` 1–2; ≥48 GB VRAM for ``--num_envs`` up to ~5. - * To reduce VRAM: prefer ``--visualizer none`` and keep ``--num_envs`` modest. Numbers can vary with scene assets and number of demonstrations. + * To reduce VRAM: prefer ``--headless`` and keep ``--num_envs`` modest. Numbers can vary with scene assets and number of demonstrations. Learning Policies from SkillGen Data ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/source/overview/reinforcement-learning/performance_benchmarks.rst b/docs/source/overview/reinforcement-learning/performance_benchmarks.rst index aad8bc06521..61615126ee3 100644 --- a/docs/source/overview/reinforcement-learning/performance_benchmarks.rst +++ b/docs/source/overview/reinforcement-learning/performance_benchmarks.rst @@ -11,7 +11,7 @@ Multi-GPU and multi-node training performance results are also outlined. Benchmark Results ----------------- -All benchmarking results were performed with the RL Games library with ``--visualizer none`` flag on Ubuntu 22.04. +All benchmarking results were performed with the RL Games library with ``--headless`` flag on Ubuntu 22.04. ``Isaac-Velocity-Rough-G1-v0`` environment benchmarks were performed with the RSL RL library. The PhysX backend was used for all benchmarks. @@ -138,13 +138,13 @@ Example scripts can be run similarly to training scripts: .. code-block:: bash # benchmark with RSL RL - python scripts/benchmarks/benchmark_rsl_rl.py --task=Isaac-Cartpole-v0 --visualizer none + python scripts/benchmarks/benchmark_rsl_rl.py --task=Isaac-Cartpole-v0 --headless # benchmark with RL Games - python scripts/benchmarks/benchmark_rlgames.py --task=Isaac-Cartpole-v0 --visualizer none + python scripts/benchmarks/benchmark_rlgames.py --task=Isaac-Cartpole-v0 --headless # benchmark without RL libraries - python scripts/benchmarks/benchmark_non_rl.py --task=Isaac-Cartpole-v0 --visualizer none + python scripts/benchmarks/benchmark_non_rl.py --task=Isaac-Cartpole-v0 --headless Each script will generate a set of KPI files at the end of the run, which includes data on the startup times, runtime statistics, such as the time taken for each simulation or rendering step, diff --git a/docs/source/overview/reinforcement-learning/rl_existing_scripts.rst b/docs/source/overview/reinforcement-learning/rl_existing_scripts.rst index 81e645006b5..66eb5948397 100644 --- a/docs/source/overview/reinforcement-learning/rl_existing_scripts.rst +++ b/docs/source/overview/reinforcement-learning/rl_existing_scripts.rst @@ -98,7 +98,7 @@ RL-Games # run script for playing with 32 environments ./isaaclab.sh -p scripts/reinforcement_learning/rl_games/play.py --task Isaac-Ant-v0 --num_envs 32 --checkpoint /PATH/TO/model.pth # run script for recording video of a trained agent (requires installing `ffmpeg`) - ./isaaclab.sh -p scripts/reinforcement_learning/rl_games/play.py --task Isaac-Ant-v0 --visualizer none --video --video_length 200 + ./isaaclab.sh -p scripts/reinforcement_learning/rl_games/play.py --task Isaac-Ant-v0 --headless --video --video_length 200 .. tab-item:: :icon:`fa-brands fa-windows` Windows :sync: windows @@ -114,7 +114,7 @@ RL-Games :: run script for playing with 32 environments isaaclab.bat -p scripts\reinforcement_learning\rl_games\play.py --task Isaac-Ant-v0 --num_envs 32 --checkpoint /PATH/TO/model.pth :: run script for recording video of a trained agent (requires installing `ffmpeg`) - isaaclab.bat -p scripts\reinforcement_learning\rl_games\play.py --task Isaac-Ant-v0 --visualizer none --video --video_length 200 + isaaclab.bat -p scripts\reinforcement_learning\rl_games\play.py --task Isaac-Ant-v0 --headless --video --video_length 200 RSL-RL ------ @@ -139,7 +139,7 @@ RSL-RL # run script for playing with 32 environments ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/play.py --task Isaac-Reach-Franka-v0 --num_envs 32 --load_run run_folder_name --checkpoint /PATH/TO/model.pt # run script for recording video of a trained agent (requires installing `ffmpeg`) - ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/play.py --task Isaac-Reach-Franka-v0 --visualizer none --video --video_length 200 + ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/play.py --task Isaac-Reach-Franka-v0 --headless --video --video_length 200 .. tab-item:: :icon:`fa-brands fa-windows` Windows :sync: windows @@ -155,7 +155,7 @@ RSL-RL :: run script for playing with 32 environments isaaclab.bat -p scripts\reinforcement_learning\rsl_rl\play.py --task Isaac-Reach-Franka-v0 --num_envs 32 --load_run run_folder_name --checkpoint /PATH/TO/model.pt :: run script for recording video of a trained agent (requires installing `ffmpeg`) - isaaclab.bat -p scripts\reinforcement_learning\rsl_rl\play.py --task Isaac-Reach-Franka-v0 --visualizer none --video --video_length 200 + isaaclab.bat -p scripts\reinforcement_learning\rsl_rl\play.py --task Isaac-Reach-Franka-v0 --headless --video --video_length 200 - Training and distilling an agent with `RSL-RL `__ on ``Isaac-Velocity-Flat-Anymal-D-v0``: @@ -175,7 +175,7 @@ RSL-RL # run script for rl training of the teacher agent with Newton backend ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Velocity-Flat-Anymal-D-v0 --headless presets=newton # run script for distilling the teacher agent into a student agent - ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Velocity-Flat-Anymal-D-v0 --visualizer none --agent rsl_rl_distillation_cfg_entry_point --load_run teacher_run_folder_name + ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Velocity-Flat-Anymal-D-v0 --headless --agent rsl_rl_distillation_cfg_entry_point --load_run teacher_run_folder_name # run script for playing the student with 64 environments ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/play.py --task Isaac-Velocity-Flat-Anymal-D-v0 --num_envs 64 --agent rsl_rl_distillation_cfg_entry_point @@ -191,7 +191,7 @@ RSL-RL :: run script for rl training of the teacher agent with Newton backend isaaclab.bat -p scripts\reinforcement_learning\rsl_rl\train.py --task Isaac-Velocity-Flat-Anymal-D-v0 --headless presets=newton :: run script for distilling the teacher agent into a student agent - isaaclab.bat -p scripts\reinforcement_learning\rsl_rl\train.py --task Isaac-Velocity-Flat-Anymal-D-v0 --visualizer none --agent rsl_rl_distillation_cfg_entry_point --load_run teacher_run_folder_name + isaaclab.bat -p scripts\reinforcement_learning\rsl_rl\train.py --task Isaac-Velocity-Flat-Anymal-D-v0 --headless --agent rsl_rl_distillation_cfg_entry_point --load_run teacher_run_folder_name :: run script for playing the student with 64 environments isaaclab.bat -p scripts\reinforcement_learning\rsl_rl\play.py --task Isaac-Velocity-Flat-Anymal-D-v0 --num_envs 64 --agent rsl_rl_distillation_cfg_entry_point @@ -222,7 +222,7 @@ SKRL # run script for playing with 32 environments ./isaaclab.sh -p scripts/reinforcement_learning/skrl/play.py --task Isaac-Reach-Franka-v0 --num_envs 32 --checkpoint /PATH/TO/model.pt # run script for recording video of a trained agent (requires installing `ffmpeg`) - ./isaaclab.sh -p scripts/reinforcement_learning/skrl/play.py --task Isaac-Reach-Franka-v0 --visualizer none --video --video_length 200 + ./isaaclab.sh -p scripts/reinforcement_learning/skrl/play.py --task Isaac-Reach-Franka-v0 --headless --video --video_length 200 .. tab-item:: :icon:`fa-brands fa-windows` Windows :sync: windows @@ -238,7 +238,7 @@ SKRL :: run script for playing with 32 environments isaaclab.bat -p scripts\reinforcement_learning\skrl\play.py --task Isaac-Reach-Franka-v0 --num_envs 32 --checkpoint /PATH/TO/model.pt :: run script for recording video of a trained agent (requires installing `ffmpeg`) - isaaclab.bat -p scripts\reinforcement_learning\skrl\play.py --task Isaac-Reach-Franka-v0 --visualizer none --video --video_length 200 + isaaclab.bat -p scripts\reinforcement_learning\skrl\play.py --task Isaac-Reach-Franka-v0 --headless --video --video_length 200 .. tab-item:: JAX @@ -274,7 +274,7 @@ SKRL # run script for playing with 32 environments ./isaaclab.sh -p scripts/reinforcement_learning/skrl/play.py --task Isaac-Reach-Franka-v0 --num_envs 32 --ml_framework jax --checkpoint /PATH/TO/model.pt # run script for recording video of a trained agent (requires installing `ffmpeg`) - ./isaaclab.sh -p scripts/reinforcement_learning/skrl/play.py --task Isaac-Reach-Franka-v0 --visualizer none --ml_framework jax --video --video_length 200 + ./isaaclab.sh -p scripts/reinforcement_learning/skrl/play.py --task Isaac-Reach-Franka-v0 --headless --ml_framework jax --video --video_length 200 - Training the multi-agent environment ``Isaac-Shadow-Hand-Over-Direct-v0`` with skrl: @@ -289,7 +289,7 @@ SKRL # install python module (for skrl) ./isaaclab.sh -i skrl # run script for training with the MAPPO algorithm (IPPO is also supported) - ./isaaclab.sh -p scripts/reinforcement_learning/skrl/train.py --task Isaac-Shadow-Hand-Over-Direct-v0 --visualizer none --algorithm MAPPO + ./isaaclab.sh -p scripts/reinforcement_learning/skrl/train.py --task Isaac-Shadow-Hand-Over-Direct-v0 --headless --algorithm MAPPO # run script for playing with 32 environments with the MAPPO algorithm (IPPO is also supported) ./isaaclab.sh -p scripts/reinforcement_learning/skrl/play.py --task Isaac-Shadow-Hand-Over-Direct-v0 --num_envs 32 --algorithm MAPPO --checkpoint /PATH/TO/model.pt @@ -301,7 +301,7 @@ SKRL :: install python module (for skrl) isaaclab.bat -i skrl :: run script for training with the MAPPO algorithm (IPPO is also supported) - isaaclab.bat -p scripts\reinforcement_learning\skrl\train.py --task Isaac-Shadow-Hand-Over-Direct-v0 --visualizer none --algorithm MAPPO + isaaclab.bat -p scripts\reinforcement_learning\skrl\train.py --task Isaac-Shadow-Hand-Over-Direct-v0 --headless --algorithm MAPPO :: run script for playing with 32 environments with the MAPPO algorithm (IPPO is also supported) isaaclab.bat -p scripts\reinforcement_learning\skrl\play.py --task Isaac-Shadow-Hand-Over-Direct-v0 --num_envs 32 --algorithm MAPPO --checkpoint /PATH/TO/model.pt @@ -329,7 +329,7 @@ Stable-Baselines3 # run script for playing with 32 environments ./isaaclab.sh -p scripts/reinforcement_learning/sb3/play.py --task Isaac-Velocity-Flat-Unitree-A1-v0 --num_envs 32 --checkpoint /PATH/TO/model.zip # run script for recording video of a trained agent (requires installing `ffmpeg`) - ./isaaclab.sh -p scripts/reinforcement_learning/sb3/play.py --task Isaac-Velocity-Flat-Unitree-A1-v0 --visualizer none --video --video_length 200 + ./isaaclab.sh -p scripts/reinforcement_learning/sb3/play.py --task Isaac-Velocity-Flat-Unitree-A1-v0 --headless --video --video_length 200 .. tab-item:: :icon:`fa-brands fa-windows` Windows :sync: windows @@ -345,7 +345,7 @@ Stable-Baselines3 :: run script for playing with 32 environments isaaclab.bat -p scripts\reinforcement_learning\sb3\play.py --task Isaac-Velocity-Flat-Unitree-A1-v0 --num_envs 32 --checkpoint /PATH/TO/model.zip :: run script for recording video of a trained agent (requires installing `ffmpeg`) - isaaclab.bat -p scripts\reinforcement_learning\sb3\play.py --task Isaac-Velocity-Flat-Unitree-A1-v0 --visualizer none --video --video_length 200 + isaaclab.bat -p scripts\reinforcement_learning\sb3\play.py --task Isaac-Velocity-Flat-Unitree-A1-v0 --headless --video --video_length 200 RLinf ----- diff --git a/docs/source/overview/reinforcement-learning/rl_frameworks.rst b/docs/source/overview/reinforcement-learning/rl_frameworks.rst index 5a3027e7cad..605ee7fd93d 100644 --- a/docs/source/overview/reinforcement-learning/rl_frameworks.rst +++ b/docs/source/overview/reinforcement-learning/rl_frameworks.rst @@ -87,7 +87,7 @@ Training Performance -------------------- We performed training with each RL library on the same ``Isaac-Humanoid-v0`` environment -with ``--visualizer none`` on a single NVIDIA GeForce RTX 4090 and logged the total training time +with ``--headless`` on a single NVIDIA GeForce RTX 4090 and logged the total training time for 65.5M steps (4096 environments x 32 rollout steps x 500 iterations). +--------------------+-----------------+ @@ -106,7 +106,7 @@ Training commands (check for the *'Training time: XXX seconds'* line in the term .. code:: bash - python scripts/reinforcement_learning/rl_games/train.py --task Isaac-Humanoid-v0 --max_iterations 500 --visualizer none - python scripts/reinforcement_learning/skrl/train.py --task Isaac-Humanoid-v0 --max_iterations 500 --visualizer none - python scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Humanoid-v0 --max_iterations 500 --visualizer none - python scripts/reinforcement_learning/sb3/train.py --task Isaac-Humanoid-v0 --max_iterations 500 --visualizer none + python scripts/reinforcement_learning/rl_games/train.py --task Isaac-Humanoid-v0 --max_iterations 500 --headless + python scripts/reinforcement_learning/skrl/train.py --task Isaac-Humanoid-v0 --max_iterations 500 --headless + python scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Humanoid-v0 --max_iterations 500 --headless + python scripts/reinforcement_learning/sb3/train.py --task Isaac-Humanoid-v0 --max_iterations 500 --headless diff --git a/docs/source/policy_deployment/00_hover/hover_policy.rst b/docs/source/policy_deployment/00_hover/hover_policy.rst index 2f770622003..b7efd80a15e 100644 --- a/docs/source/policy_deployment/00_hover/hover_policy.rst +++ b/docs/source/policy_deployment/00_hover/hover_policy.rst @@ -60,7 +60,7 @@ Execute the following command from the ``HOVER`` directory to train the teacher ${ISAACLAB_PATH:?}/isaaclab.sh -p scripts/rsl_rl/train_teacher_policy.py \ --num_envs 1024 \ --reference_motion_path neural_wbc/data/data/motions/stable_punch.pkl \ - --visualizer none + --headless The teacher policy is trained for 10000000 iterations, or until the user interrupts the training. The resulting checkpoint is stored in ``neural_wbc/data/data/policy/h1:teacher/`` and the filename is ``model_.pt``. @@ -76,7 +76,7 @@ Execute the following command from the ``HOVER`` directory to train the student --reference_motion_path neural_wbc/data/data/motions/stable_punch.pkl \ --teacher_policy.resume_path neural_wbc/data/data/policy/h1:teacher \ --teacher_policy.checkpoint model_.pt \ - --visualizer none + --headless This assumes that you have already trained the teacher policy as there is no provided teacher policy in the repo. @@ -148,7 +148,7 @@ Use the provided `Mujoco Environment`_ for conducting sim-to-sim validation of t ${ISAACLAB_PATH:?}/isaaclab.sh -p neural_wbc/inference_env/scripts/eval.py \ --num_envs 1 \ - --visualizer none \ + --headless \ --student_path neural_wbc/data/data/policy/h1:student/ \ --student_checkpoint model_.pt @@ -171,7 +171,7 @@ To deploy the trained policy on the H1 robot, --robot unitree_h1 \ --max_iterations 5000 \ --num_envs 1 \ - --visualizer none + --headless .. note:: diff --git a/docs/source/policy_deployment/02_gear_assembly/gear_assembly_policy.rst b/docs/source/policy_deployment/02_gear_assembly/gear_assembly_policy.rst index 9d069e5f551..de8497f181b 100644 --- a/docs/source/policy_deployment/02_gear_assembly/gear_assembly_policy.rst +++ b/docs/source/policy_deployment/02_gear_assembly/gear_assembly_policy.rst @@ -211,7 +211,7 @@ These friction values (0.75) were determined through iterative visual comparison python scripts/reinforcement_learning/rsl_rl/train.py \ --task Isaac-Deploy-GearAssembly-UR10e-2F140-v0 \ - --visualizer none \ + --headless \ --video --video_length 800 --video_interval 5000 8. Review the recorded videos and compare with real hardware videos to verify physics behavior @@ -461,7 +461,7 @@ Now launch the full training run with more parallel environments in headless mod # Full training with video recording python scripts/reinforcement_learning/rsl_rl/train.py \ --task Isaac-Deploy-GearAssembly-UR10e-2F140-v0 \ - --visualizer none \ + --headless \ --num_envs 256 \ --video --video_length 800 --video_interval 5000 @@ -557,7 +557,7 @@ CUDA Out of Memory python scripts/reinforcement_learning/rsl_rl/train.py \ --task Isaac-Deploy-GearAssembly-UR10e-2F140-v0 \ - --visualizer none \ + --headless \ --num_envs 128 # Reduce from 256 to 128, 64, etc. **Trade-off:** Using fewer environments will reduce sample diversity per training iteration and may slow down training convergence. You may need to train for more iterations to achieve the same performance. However, the final policy quality should be similar. @@ -588,7 +588,7 @@ CUDA Out of Memory python scripts/reinforcement_learning/rsl_rl/train.py \ --task Isaac-Deploy-GearAssembly-UR10e-2F140-v0 \ - --visualizer none \ + --headless \ --num_envs 256 You can always evaluate the trained policy later with visualization. diff --git a/docs/source/refs/release_notes.rst b/docs/source/refs/release_notes.rst index c33763256e2..3ba7d7a9868 100644 --- a/docs/source/refs/release_notes.rst +++ b/docs/source/refs/release_notes.rst @@ -1762,13 +1762,13 @@ Before: .. code:: bash - ./isaaclab.sh -p source/standalone/workflows/sb3/train.py --task Isaac-Cartpole-v0 --visualizer none --cpu + ./isaaclab.sh -p source/standalone/workflows/sb3/train.py --task Isaac-Cartpole-v0 --headless --cpu Now: .. code:: bash - ./isaaclab.sh -p source/standalone/workflows/sb3/train.py --task Isaac-Cartpole-v0 --visualizer none --device cpu + ./isaaclab.sh -p source/standalone/workflows/sb3/train.py --task Isaac-Cartpole-v0 --headless --device cpu Renaming of teleoperation device CLI in standalone scripts ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/source/refs/troubleshooting.rst b/docs/source/refs/troubleshooting.rst index cedff13c0a7..20094c617bf 100644 --- a/docs/source/refs/troubleshooting.rst +++ b/docs/source/refs/troubleshooting.rst @@ -97,7 +97,7 @@ To enable OmniPVD capture in Isaac Lab, add the relevant kit arguments to the co .. code:: bash - ./isaaclab.sh -p scripts/demos/bipeds.py --kit_args "--/persistent/physics/omniPvdOvdRecordingDirectory=/tmp/ --/physics/omniPvdOutputEnabled=true" --visualizer none + ./isaaclab.sh -p scripts/demos/bipeds.py --kit_args "--/persistent/physics/omniPvdOvdRecordingDirectory=/tmp/ --/physics/omniPvdOutputEnabled=true" --headless Checking the internal logs from the simulator @@ -142,7 +142,7 @@ For instance, to run a standalone script with verbose logging, you can use the f .. code-block:: bash # Run the standalone script with info logging - ./isaaclab.sh -p scripts/tutorials/00_sim/create_empty.py --visualizer none --info + ./isaaclab.sh -p scripts/tutorials/00_sim/create_empty.py --headless --info For more fine-grained control, you can modify the logging channels through the ``logger`` module. For more information, please refer to its `documentation `__. diff --git a/docs/source/setup/installation/include/src_verify_isaaclab.rst b/docs/source/setup/installation/include/src_verify_isaaclab.rst index 8b3715f717e..a747a1ccdc3 100644 --- a/docs/source/setup/installation/include/src_verify_isaaclab.rst +++ b/docs/source/setup/installation/include/src_verify_isaaclab.rst @@ -55,7 +55,7 @@ Train a robot! ~~~~~~~~~~~~~~ You can now use Isaac Lab to train a robot through Reinforcement Learning! The quickest way to use Isaac Lab is through the predefined workflows using one of our **Batteries-included** robot tasks. Execute the following command to quickly train an ant to walk! -We recommend adding ``--visualizer none`` for faster training. +We recommend adding ``--headless`` for faster training. .. tab-set:: :sync-group: os @@ -65,14 +65,14 @@ We recommend adding ``--visualizer none`` for faster training. .. code:: bash - ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Ant-v0 --visualizer none + ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Ant-v0 --headless .. tab-item:: :icon:`fa-brands fa-windows` Windows :sync: windows .. code:: batch - isaaclab.bat -p scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Ant-v0 --visualizer none + isaaclab.bat -p scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Ant-v0 --headless ... Or a robot dog! @@ -84,14 +84,14 @@ We recommend adding ``--visualizer none`` for faster training. .. code:: bash - ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Velocity-Rough-Anymal-C-v0 --visualizer none + ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Velocity-Rough-Anymal-C-v0 --headless .. tab-item:: :icon:`fa-brands fa-windows` Windows :sync: windows .. code:: batch - isaaclab.bat -p scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Velocity-Rough-Anymal-C-v0 --visualizer none + isaaclab.bat -p scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Velocity-Rough-Anymal-C-v0 --headless Isaac Lab provides the tools you'll need to create your own **Tasks** and **Workflows** for whatever your project needs may be. Take a look at our :ref:`how-to` guides like :ref:`Adding your own learning Library ` or :ref:`Wrapping Environments ` for details. diff --git a/docs/source/setup/quickstart.rst b/docs/source/setup/quickstart.rst index f814b5df8ff..54fb0378f36 100644 --- a/docs/source/setup/quickstart.rst +++ b/docs/source/setup/quickstart.rst @@ -162,7 +162,7 @@ Invoking these scripts will require a **Task Name** and a corresponding **Entry python scripts/reinforcement_learning/skrl/train.py --task=Isaac-Ant-v0 -This will train the mujoco ant to "run". You can see the various launch option available to you with the ``--help`` flag. Note specifically the ``--num_envs`` option and the ``--visualizer none`` flag, +This will train the mujoco ant to "run". You can see the various launch option available to you with the ``--help`` flag. Note specifically the ``--num_envs`` option and the ``--headless`` flag, both of which can be useful when trying to develop and debug a new environment. Options specified at this level automatically overwrite any configuration equivalent that may be defined in the code (so long as those definitions are part of a ``@configclass``, see below). diff --git a/docs/source/testing/benchmarks.rst b/docs/source/testing/benchmarks.rst index d7209feba0c..0225569f175 100644 --- a/docs/source/testing/benchmarks.rst +++ b/docs/source/testing/benchmarks.rst @@ -113,7 +113,7 @@ Measure environment stepping performance without training: --task Isaac-Cartpole-v0 \ --num_envs 4096 \ --num_frames 100 \ - --visualizer none \ + --headless \ --benchmark_backend json \ --output_path ./results @@ -132,7 +132,7 @@ Measure training performance with RSL-RL: --task Isaac-Cartpole-v0 \ --num_envs 4096 \ --max_iterations 500 \ - --visualizer none \ + --headless \ --benchmark_backend json \ --output_path ./results @@ -173,7 +173,7 @@ Common Arguments * - ``--output_path`` - ``./`` - Directory for output files - * - ``--visualizer none`` + * - ``--headless`` - ``false`` - Run without rendering diff --git a/docs/source/tutorials/00_sim/create_empty.rst b/docs/source/tutorials/00_sim/create_empty.rst index beaca411a7d..1a9740ab93a 100644 --- a/docs/source/tutorials/00_sim/create_empty.rst +++ b/docs/source/tutorials/00_sim/create_empty.rst @@ -156,7 +156,7 @@ following: .. code-block:: bash - ./isaaclab.sh -p scripts/tutorials/00_sim/create_empty.py --visualizer none + ./isaaclab.sh -p scripts/tutorials/00_sim/create_empty.py --headless Now that we have a basic understanding of how to run a simulation, let's move on to the diff --git a/docs/source/tutorials/03_envs/configuring_rl_training.rst b/docs/source/tutorials/03_envs/configuring_rl_training.rst index c77effbcc7d..2eb2b0b5e76 100644 --- a/docs/source/tutorials/03_envs/configuring_rl_training.rst +++ b/docs/source/tutorials/03_envs/configuring_rl_training.rst @@ -113,7 +113,7 @@ we can use the ``--agent`` argument to specify the configuration instance to use .. code-block:: bash # standard PPO training - ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Cartpole-v0 --visualizer none \ + ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Cartpole-v0 --headless \ --run_name ppo * Training with the PPO configuration with symmetry augmentation: @@ -121,12 +121,12 @@ we can use the ``--agent`` argument to specify the configuration instance to use .. code-block:: bash # PPO training with symmetry augmentation - ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Cartpole-v0 --visualizer none \ + ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Cartpole-v0 --headless \ --agent rsl_rl_with_symmetry_cfg_entry_point \ --run_name ppo_with_symmetry_data_augmentation # you can use hydra to disable symmetry augmentation but enable mirror loss computation - ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Cartpole-v0 --visualizer none \ + ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Cartpole-v0 --headless \ --agent rsl_rl_with_symmetry_cfg_entry_point \ --run_name ppo_without_symmetry_data_augmentation \ agent.algorithm.symmetry_cfg.use_data_augmentation=false diff --git a/docs/source/tutorials/03_envs/modify_direct_rl_env.rst b/docs/source/tutorials/03_envs/modify_direct_rl_env.rst index de6a5450f5c..a93fa0789ca 100644 --- a/docs/source/tutorials/03_envs/modify_direct_rl_env.rst +++ b/docs/source/tutorials/03_envs/modify_direct_rl_env.rst @@ -111,7 +111,7 @@ After the minor modification has been done, and similar to the previous tutorial .. code-block:: bash - ./isaaclab.sh -p scripts/reinforcement_learning/rl_games/train.py --task Isaac-H1-Direct-v0 --visualizer none + ./isaaclab.sh -p scripts/reinforcement_learning/rl_games/train.py --task Isaac-H1-Direct-v0 --headless When the training is finished, we can visualize the result with the following command. To stop the simulation, you can either close the window, or press ``Ctrl+C`` in the terminal diff --git a/docs/source/tutorials/03_envs/policy_inference_in_usd.rst b/docs/source/tutorials/03_envs/policy_inference_in_usd.rst index d39962e4b9f..ddae4511ff3 100644 --- a/docs/source/tutorials/03_envs/policy_inference_in_usd.rst +++ b/docs/source/tutorials/03_envs/policy_inference_in_usd.rst @@ -42,7 +42,7 @@ First, we need to train the ``Isaac-Velocity-Rough-H1-v0`` task by running the f .. code-block:: bash - ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Velocity-Rough-H1-v0 --visualizer none + ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Velocity-Rough-H1-v0 --headless When the training is finished, we can visualize the result with the following command. To stop the simulation, you can either close the window, or press ``Ctrl+C`` in the terminal diff --git a/source/isaaclab/isaaclab/app/app_launcher.py b/source/isaaclab/isaaclab/app/app_launcher.py index 2c433bd6ca1..17942b7d748 100644 --- a/source/isaaclab/isaaclab/app/app_launcher.py +++ b/source/isaaclab/isaaclab/app/app_launcher.py @@ -203,8 +203,8 @@ def __init__(self, launcher_args: argparse.Namespace | dict | None = None, **kwa self._load_extensions() # Hide the stop button in the toolbar self._hide_stop_button() - # Set settings from rendering quality selection - self._set_rendering_quality_settings(launcher_args) + # Set settings from the given rendering mode + self._set_rendering_mode_settings(launcher_args) # Set animation recording settings self._set_animation_recording_settings(launcher_args) # Set visualizer settings (if requested) @@ -424,22 +424,16 @@ def add_app_launcher_args(parser: argparse.ArgumentParser) -> None: " it is resolved relative to the `apps` folder in Isaac Sim and Isaac Lab (in that order)." ), ) - arg_group.add_argument( - "--rendering_quality", - type=str, - action=ExplicitAction, - choices={"performance", "balanced", "high"}, - help=( - "Select rendering quality profile and override visualizer_cfg.rendering_quality." - ' Can be "performance", "balanced", or "high".' - ), - ) arg_group.add_argument( "--rendering_mode", type=str, action=ExplicitAction, choices={"performance", "balanced", "quality"}, - help=argparse.SUPPRESS, + help=( + "Sets the rendering mode. Preset settings files can be found in apps/rendering_modes." + ' Can be "performance", "balanced", or "quality".' + " Individual settings can be overwritten by using the RenderCfg class." + ), ) arg_group.add_argument( "--kit_args", diff --git a/source/isaaclab/isaaclab/sim/simulation_context.py b/source/isaaclab/isaaclab/sim/simulation_context.py index 127d159db33..05702b4a529 100644 --- a/source/isaaclab/isaaclab/sim/simulation_context.py +++ b/source/isaaclab/isaaclab/sim/simulation_context.py @@ -518,21 +518,8 @@ def _is_cli_visualizer_disable_all(self) -> bool: """Return ``True`` when CLI requested ``--viz none`` semantics.""" return bool(self.get_setting("/isaaclab/visualizer/disable_all")) - def _is_cli_visualizer_explicit(self) -> bool: - """Return whether --visualizer/--viz was explicitly provided.""" - return bool(self.get_setting("/isaaclab/visualizer/explicit")) - - def _is_cli_visualizer_disable_all(self) -> bool: - """Return whether CLI explicitly disabled all visualizers.""" - return bool(self.get_setting("/isaaclab/visualizer/disable_all")) - def resolve_visualizer_types(self) -> list[str]: """Resolve visualizer types from config or CLI settings.""" - if self._is_cli_visualizer_disable_all(): - return [] - if self._is_cli_visualizer_explicit(): - return self._get_cli_visualizer_types() - visualizer_cfgs = self.cfg.visualizer_cfgs if visualizer_cfgs is None: return [] diff --git a/source/isaaclab_mimic/test/test_generate_dataset.py b/source/isaaclab_mimic/test/test_generate_dataset.py index 8ba8efb52d2..63aceb95a67 100644 --- a/source/isaaclab_mimic/test/test_generate_dataset.py +++ b/source/isaaclab_mimic/test/test_generate_dataset.py @@ -121,8 +121,7 @@ def setup_test_environment(): "--output_file", annotated_output_path, "--auto", - "--visualizer", - "none", + "--headless", ] print(config_command) @@ -192,8 +191,7 @@ def test_generate_dataset(setup_test_environment): generated_output_path, "--generation_num_trials", "1", - "--visualizer", - "none", + "--headless", ] result = _run_script(command) diff --git a/source/isaaclab_mimic/test/test_generate_dataset_skillgen.py b/source/isaaclab_mimic/test/test_generate_dataset_skillgen.py index 2e958244e62..6603b9ffcce 100644 --- a/source/isaaclab_mimic/test/test_generate_dataset_skillgen.py +++ b/source/isaaclab_mimic/test/test_generate_dataset_skillgen.py @@ -127,8 +127,7 @@ def test_generate_dataset_skillgen(setup_skillgen_test_environment): "--generation_num_trials", "1", "--use_skillgen", - "--visualizer", - "none", + "--headless", "--task", "Isaac-Stack-Cube-Franka-IK-Rel-Skillgen-v0", ] diff --git a/source/isaaclab_tasks/test/benchmarking/test_environments_training.py b/source/isaaclab_tasks/test/benchmarking/test_environments_training.py index cb5e3b833a5..51df662d7ec 100644 --- a/source/isaaclab_tasks/test/benchmarking/test_environments_training.py +++ b/source/isaaclab_tasks/test/benchmarking/test_environments_training.py @@ -45,8 +45,7 @@ def train_job(workflow, task, env_config, num_gpus): "--task", task, "--enable_cameras", - "--visualizer", - "none", + "--headless", ] # Add max iterations if specified From 16eec15d2e7cc880d9578d8a98c78921c4420c2c Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Tue, 24 Feb 2026 01:01:10 +0000 Subject: [PATCH 04/34] reorg --- source/isaaclab/isaaclab/renderer/__init__.py | 9 +- .../renderer/rendering_quality_presets.py | 86 ++--------------- .../isaaclab/isaaclab/rendering/__init__.py | 17 ++++ .../isaaclab/rendering/renderers/__init__.py | 8 ++ .../rendering/renderers/renderer_cfg.py | 38 ++++++++ .../rendering/rendering_quality_cfg.py | 83 ++++++++++++++++ .../rendering/rendering_quality_presets.py | 87 +++++++++++++++++ .../rendering/rendering_quality_utils.py | 94 +++++++++++++++++++ .../rendering/visualizers/__init__.py | 24 +++++ .../rendering/visualizers/kit_visualizer.py | 1 + .../visualizers/kit_visualizer_cfg.py | 1 + .../visualizers/newton_visualizer.py | 1 + .../visualizers/newton_visualizer_cfg.py | 1 + .../rendering/visualizers/rerun_visualizer.py | 1 + .../visualizers/rerun_visualizer_cfg.py | 1 + .../rendering/visualizers/visualizer.py | 1 + .../rendering/visualizers/visualizer_cfg.py | 1 + .../isaaclab/isaaclab/sim/simulation_cfg.py | 77 +-------------- .../isaaclab/sim/simulation_context.py | 26 +---- .../isaaclab/visualizers/visualizer_cfg.py | 6 +- 20 files changed, 382 insertions(+), 181 deletions(-) create mode 100644 source/isaaclab/isaaclab/rendering/__init__.py create mode 100644 source/isaaclab/isaaclab/rendering/renderers/__init__.py create mode 100644 source/isaaclab/isaaclab/rendering/renderers/renderer_cfg.py create mode 100644 source/isaaclab/isaaclab/rendering/rendering_quality_cfg.py create mode 100644 source/isaaclab/isaaclab/rendering/rendering_quality_presets.py create mode 100644 source/isaaclab/isaaclab/rendering/rendering_quality_utils.py create mode 100644 source/isaaclab/isaaclab/rendering/visualizers/__init__.py create mode 100644 source/isaaclab/isaaclab/rendering/visualizers/kit_visualizer.py create mode 100644 source/isaaclab/isaaclab/rendering/visualizers/kit_visualizer_cfg.py create mode 100644 source/isaaclab/isaaclab/rendering/visualizers/newton_visualizer.py create mode 100644 source/isaaclab/isaaclab/rendering/visualizers/newton_visualizer_cfg.py create mode 100644 source/isaaclab/isaaclab/rendering/visualizers/rerun_visualizer.py create mode 100644 source/isaaclab/isaaclab/rendering/visualizers/rerun_visualizer_cfg.py create mode 100644 source/isaaclab/isaaclab/rendering/visualizers/visualizer.py create mode 100644 source/isaaclab/isaaclab/rendering/visualizers/visualizer_cfg.py diff --git a/source/isaaclab/isaaclab/renderer/__init__.py b/source/isaaclab/isaaclab/renderer/__init__.py index 1fc7afa0f14..44c20efc2fa 100644 --- a/source/isaaclab/isaaclab/renderer/__init__.py +++ b/source/isaaclab/isaaclab/renderer/__init__.py @@ -1,5 +1,10 @@ -"""Renderer-related utilities and configuration helpers.""" +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause -from .rendering_quality_presets import get_kit_rendering_preset +"""Compatibility wrapper for relocated rendering package.""" + +from isaaclab.rendering.rendering_quality_presets import get_kit_rendering_preset __all__ = ["get_kit_rendering_preset"] diff --git a/source/isaaclab/isaaclab/renderer/rendering_quality_presets.py b/source/isaaclab/isaaclab/renderer/rendering_quality_presets.py index d816252c151..882cf8f5ac2 100644 --- a/source/isaaclab/isaaclab/renderer/rendering_quality_presets.py +++ b/source/isaaclab/isaaclab/renderer/rendering_quality_presets.py @@ -1,82 +1,8 @@ -"""Built-in rendering quality presets for RTX/Kit rendering. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause -Presets are sourced from the latest Isaac Lab app rendering profiles (apps/rendering_modes). -""" +"""Compatibility wrapper for relocated rendering presets module.""" -from __future__ import annotations - -from copy import deepcopy -from typing import Any - -# Latest preset values sourced from apps/rendering_modes/*.kit. -_KIT_PRESETS: dict[str, dict[str, Any]] = { - "performance": { - "/rtx/rtpt/cached/enabled": False, - "/rtx/rtpt/lightcache/cached/enabled": False, - "/rtx/rtpt/translucency/virtualMotion/enabled": False, - "/rtx/rtpt/maxBounces": 2, - "/rtx/rtpt/splitGlass": False, - "/rtx/rtpt/splitClearcoat": False, - "/rtx/rtpt/splitRoughReflection": True, - "/rtx/rtpt/useAmbientOcclusionForAmbientLight": False, - "/rtx/sceneDb/ambientLightIntensity": 1.0, - "/rtx/shadows/enabled": True, - "/rtx/domeLight/upperLowerStrategy": 3, - "/rtx/ambientOcclusion/enabled": False, - "/rtx/ambientOcclusion/denoiserMode": 1, - "/rtx/raytracing/subpixel/mode": 0, - "/rtx/raytracing/cached/enabled": False, - "/rtx-transient/dlssg/enabled": False, - "/rtx-transient/dldenoiser/enabled": False, - "/rtx/post/dlss/execMode": 0, - "/rtx/pathtracing/maxSamplesPerLaunch": 1_000_000, - "/rtx/viewTile/limit": 1_000_000, - }, - "balanced": { - "/rtx/rtpt/cached/enabled": False, - "/rtx/rtpt/lightcache/cached/enabled": False, - "/rtx/rtpt/translucency/virtualMotion/enabled": False, - "/rtx/rtpt/maxBounces": 2, - "/rtx/rtpt/splitGlass": False, - "/rtx/rtpt/splitClearcoat": False, - "/rtx/rtpt/splitRoughReflection": True, - "/rtx/rtpt/useAmbientOcclusionForAmbientLight": False, - "/rtx/sceneDb/ambientLightIntensity": 1.0, - "/rtx/shadows/enabled": True, - "/rtx/ambientOcclusion/enabled": False, - "/rtx/ambientOcclusion/denoiserMode": 1, - "/rtx/raytracing/subpixel/mode": 0, - "/rtx/raytracing/cached/enabled": True, - "/rtx-transient/dlssg/enabled": False, - "/rtx-transient/dldenoiser/enabled": True, - "/rtx/post/dlss/execMode": 1, - "/rtx/pathtracing/maxSamplesPerLaunch": 1_000_000, - "/rtx/viewTile/limit": 1_000_000, - }, - "high": { - "/rtx/rtpt/maxBounces": 3, - "/rtx/rtpt/cached/enabled": False, - "/rtx/rtpt/lightcache/cached/enabled": False, - "/rtx/rtpt/translucency/virtualMotion/enabled": False, - "/rtx/rtpt/splitRoughReflection": True, - "/rtx/rtpt/adaptiveSampling/disocclusion/enabled": True, - "/rtx/rtpt/adaptiveSampling/disocclusion/spp": 4, - "/rtx/sceneDb/ambientLightIntensity": 1.0, - "/rtx/shadows/enabled": True, - "/rtx/ambientOcclusion/enabled": True, - "/rtx/ambientOcclusion/denoiserMode": 0, - "/rtx/raytracing/subpixel/mode": 1, - "/rtx/raytracing/cached/enabled": True, - "/rtx-transient/dlssg/enabled": False, - "/rtx/post/dlss/execMode": 2, - "/rtx/pathtracing/maxSamplesPerLaunch": 1_000_000, - "/rtx/viewTile/limit": 1_000_000, - }, -} - - -def get_kit_rendering_preset(preset_name: str) -> dict[str, Any]: - """Return a deep copy of the requested rendering preset.""" - if preset_name not in {"performance", "balanced", "high"}: - raise ValueError(f"Unknown preset '{preset_name}'.") - return deepcopy(_KIT_PRESETS[preset_name]) +from isaaclab.rendering.rendering_quality_presets import * # noqa: F401, F403 diff --git a/source/isaaclab/isaaclab/rendering/__init__.py b/source/isaaclab/isaaclab/rendering/__init__.py new file mode 100644 index 00000000000..3270a165a68 --- /dev/null +++ b/source/isaaclab/isaaclab/rendering/__init__.py @@ -0,0 +1,17 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Rendering domain package (renderers, visualizers, quality config/presets).""" + +from .rendering_quality_cfg import RenderingQualityCfg +from .rendering_quality_presets import get_kit_rendering_preset +from .renderers import RTXRendererCfg, WarpRendererCfg + +__all__ = [ + "RenderingQualityCfg", + "get_kit_rendering_preset", + "RTXRendererCfg", + "WarpRendererCfg", +] diff --git a/source/isaaclab/isaaclab/rendering/renderers/__init__.py b/source/isaaclab/isaaclab/rendering/renderers/__init__.py new file mode 100644 index 00000000000..90420aeda56 --- /dev/null +++ b/source/isaaclab/isaaclab/rendering/renderers/__init__.py @@ -0,0 +1,8 @@ +"""Renderer runtime backends namespace. + +This package is intentionally created now as part of rendering-domain consolidation. +""" + +from .renderer_cfg import RTXRendererCfg, WarpRendererCfg + +__all__ = ["RTXRendererCfg", "WarpRendererCfg"] diff --git a/source/isaaclab/isaaclab/rendering/renderers/renderer_cfg.py b/source/isaaclab/isaaclab/rendering/renderers/renderer_cfg.py new file mode 100644 index 00000000000..0672597644f --- /dev/null +++ b/source/isaaclab/isaaclab/rendering/renderers/renderer_cfg.py @@ -0,0 +1,38 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Stub renderer config classes. + +These are intentionally lightweight placeholders so the rendering domain can +stabilize around explicit renderer config names before full implementation. +""" + +from __future__ import annotations + +from isaaclab.utils import configclass + + +@configclass +class RTXRendererCfg: + """Stub config for future RTX renderer integration. + + TODO: Implement renderer lifecycle, sensor/render-product routing, and + backend-specific settings application. + """ + + renderer_type: str = "rtx" + rendering_quality: str | None = None + + +@configclass +class WarpRendererCfg: + """Stub config for future Warp/Newton renderer integration. + + TODO: Implement renderer lifecycle, sensor/render-product routing, and + backend-specific settings application. + """ + + renderer_type: str = "warp" + rendering_quality: str | None = None diff --git a/source/isaaclab/isaaclab/rendering/rendering_quality_cfg.py b/source/isaaclab/isaaclab/rendering/rendering_quality_cfg.py new file mode 100644 index 00000000000..fefb47078dc --- /dev/null +++ b/source/isaaclab/isaaclab/rendering/rendering_quality_cfg.py @@ -0,0 +1,83 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from __future__ import annotations + +from typing import Literal + +from isaaclab.utils import configclass + + +@configclass +class RenderingQualityCfg: + """Shared rendering quality profile for visualizers and renderers. + + This profile keeps backend-specific fields in one place using explicit prefixes: + - ``kit_*`` for Omniverse/RTX quality controls + - ``newton_*`` for Newton visual quality controls + """ + + kit_rendering_preset: Literal["performance", "balanced", "high"] | None = None + """Optional built-in preset profile. + + Preset values are defined in :mod:`isaaclab.rendering.rendering_quality_presets`. + """ + + kit_enable_translucency: bool | None = None + """Maps to ``/rtx/translucency/enabled``.""" + + kit_enable_reflections: bool | None = None + """Maps to ``/rtx/reflections/enabled``.""" + + kit_enable_global_illumination: bool | None = None + """Maps to ``/rtx/indirectDiffuse/enabled``.""" + + kit_antialiasing_mode: Literal["Off", "FXAA", "DLSS", "TAA", "DLAA"] | None = None + """Optional anti-aliasing mode applied via Replicator settings helper.""" + + kit_enable_dlssg: bool | None = None + """Maps to ``/rtx-transient/dlssg/enabled``.""" + + kit_enable_dl_denoiser: bool | None = None + """Maps to ``/rtx-transient/dldenoiser/enabled``.""" + + kit_dlss_mode: Literal[0, 1, 2, 3] | None = None + """Maps to ``/rtx/post/dlss/execMode``.""" + + kit_enable_direct_lighting: bool | None = None + """Maps to ``/rtx/directLighting/enabled``.""" + + kit_samples_per_pixel: int | None = None + """Maps to ``/rtx/directLighting/sampledLighting/samplesPerPixel``.""" + + kit_enable_shadows: bool | None = None + """Maps to ``/rtx/shadows/enabled``.""" + + kit_enable_ambient_occlusion: bool | None = None + """Maps to ``/rtx/ambientOcclusion/enabled``.""" + + kit_dome_light_upper_lower_strategy: Literal[0, 3, 4] | None = None + """Maps to ``/rtx/domeLight/upperLowerStrategy``.""" + + newton_enable_shadows: bool | None = None + """Overrides Newton visualizer shadow rendering.""" + + newton_enable_sky: bool | None = None + """Overrides Newton visualizer sky rendering.""" + + newton_enable_wireframe: bool | None = None + """Overrides Newton visualizer wireframe rendering.""" + + newton_sky_upper_color: tuple[float, float, float] | None = None + """Overrides Newton visualizer upper sky color.""" + + newton_sky_lower_color: tuple[float, float, float] | None = None + """Overrides Newton visualizer lower sky color.""" + + newton_light_color: tuple[float, float, float] | None = None + """Overrides Newton visualizer light color.""" + + # TODO: Consider supporting additional raw backend settings dictionaries and + # inline RenderingQualityCfg objects in VisualizerCfg/RendererCfg. diff --git a/source/isaaclab/isaaclab/rendering/rendering_quality_presets.py b/source/isaaclab/isaaclab/rendering/rendering_quality_presets.py new file mode 100644 index 00000000000..a741a545355 --- /dev/null +++ b/source/isaaclab/isaaclab/rendering/rendering_quality_presets.py @@ -0,0 +1,87 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Built-in rendering quality presets for RTX/Kit rendering. + +Presets are sourced from the latest Isaac Lab app rendering profiles (apps/rendering_modes). +""" + +from __future__ import annotations + +from copy import deepcopy +from typing import Any + +# Latest preset values sourced from apps/rendering_modes/*.kit. +_KIT_PRESETS: dict[str, dict[str, Any]] = { + "performance": { + "/rtx/rtpt/cached/enabled": False, + "/rtx/rtpt/lightcache/cached/enabled": False, + "/rtx/rtpt/translucency/virtualMotion/enabled": False, + "/rtx/rtpt/maxBounces": 2, + "/rtx/rtpt/splitGlass": False, + "/rtx/rtpt/splitClearcoat": False, + "/rtx/rtpt/splitRoughReflection": True, + "/rtx/rtpt/useAmbientOcclusionForAmbientLight": False, + "/rtx/sceneDb/ambientLightIntensity": 1.0, + "/rtx/shadows/enabled": True, + "/rtx/domeLight/upperLowerStrategy": 3, + "/rtx/ambientOcclusion/enabled": False, + "/rtx/ambientOcclusion/denoiserMode": 1, + "/rtx/raytracing/subpixel/mode": 0, + "/rtx/raytracing/cached/enabled": False, + "/rtx-transient/dlssg/enabled": False, + "/rtx-transient/dldenoiser/enabled": False, + "/rtx/post/dlss/execMode": 0, + "/rtx/pathtracing/maxSamplesPerLaunch": 1_000_000, + "/rtx/viewTile/limit": 1_000_000, + }, + "balanced": { + "/rtx/rtpt/cached/enabled": False, + "/rtx/rtpt/lightcache/cached/enabled": False, + "/rtx/rtpt/translucency/virtualMotion/enabled": False, + "/rtx/rtpt/maxBounces": 2, + "/rtx/rtpt/splitGlass": False, + "/rtx/rtpt/splitClearcoat": False, + "/rtx/rtpt/splitRoughReflection": True, + "/rtx/rtpt/useAmbientOcclusionForAmbientLight": False, + "/rtx/sceneDb/ambientLightIntensity": 1.0, + "/rtx/shadows/enabled": True, + "/rtx/ambientOcclusion/enabled": False, + "/rtx/ambientOcclusion/denoiserMode": 1, + "/rtx/raytracing/subpixel/mode": 0, + "/rtx/raytracing/cached/enabled": True, + "/rtx-transient/dlssg/enabled": False, + "/rtx-transient/dldenoiser/enabled": True, + "/rtx/post/dlss/execMode": 1, + "/rtx/pathtracing/maxSamplesPerLaunch": 1_000_000, + "/rtx/viewTile/limit": 1_000_000, + }, + "high": { + "/rtx/rtpt/maxBounces": 3, + "/rtx/rtpt/cached/enabled": False, + "/rtx/rtpt/lightcache/cached/enabled": False, + "/rtx/rtpt/translucency/virtualMotion/enabled": False, + "/rtx/rtpt/splitRoughReflection": True, + "/rtx/rtpt/adaptiveSampling/disocclusion/enabled": True, + "/rtx/rtpt/adaptiveSampling/disocclusion/spp": 4, + "/rtx/sceneDb/ambientLightIntensity": 1.0, + "/rtx/shadows/enabled": True, + "/rtx/ambientOcclusion/enabled": True, + "/rtx/ambientOcclusion/denoiserMode": 0, + "/rtx/raytracing/subpixel/mode": 1, + "/rtx/raytracing/cached/enabled": True, + "/rtx-transient/dlssg/enabled": False, + "/rtx/post/dlss/execMode": 2, + "/rtx/pathtracing/maxSamplesPerLaunch": 1_000_000, + "/rtx/viewTile/limit": 1_000_000, + }, +} + + +def get_kit_rendering_preset(preset_name: str) -> dict[str, Any]: + """Return a deep copy of the requested rendering preset.""" + if preset_name not in {"performance", "balanced", "high"}: + raise ValueError(f"Unknown preset '{preset_name}'.") + return deepcopy(_KIT_PRESETS[preset_name]) diff --git a/source/isaaclab/isaaclab/rendering/rendering_quality_utils.py b/source/isaaclab/isaaclab/rendering/rendering_quality_utils.py new file mode 100644 index 00000000000..4fd1431e28c --- /dev/null +++ b/source/isaaclab/isaaclab/rendering/rendering_quality_utils.py @@ -0,0 +1,94 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Utility helpers for applying rendering quality profiles.""" + +from __future__ import annotations + +from typing import Any + +from .rendering_quality_cfg import RenderingQualityCfg +from .rendering_quality_presets import get_kit_rendering_preset + + +def apply_kit_rendering_preset(set_setting: Any, preset_name: str) -> None: + """Apply a named kit preset via provided setting setter.""" + preset = get_kit_rendering_preset(preset_name) + for key, value in preset.items(): + set_setting(key, value) + + +def apply_kit_rendering_quality_cfg(set_setting: Any, quality_cfg: RenderingQualityCfg) -> None: + """Apply kit-specific quality fields.""" + if quality_cfg.kit_rendering_preset: + apply_kit_rendering_preset(set_setting, quality_cfg.kit_rendering_preset) + + field_to_carb = { + "kit_enable_translucency": "/rtx/translucency/enabled", + "kit_enable_reflections": "/rtx/reflections/enabled", + "kit_enable_global_illumination": "/rtx/indirectDiffuse/enabled", + "kit_enable_dlssg": "/rtx-transient/dlssg/enabled", + "kit_enable_dl_denoiser": "/rtx-transient/dldenoiser/enabled", + "kit_dlss_mode": "/rtx/post/dlss/execMode", + "kit_enable_direct_lighting": "/rtx/directLighting/enabled", + "kit_samples_per_pixel": "/rtx/directLighting/sampledLighting/samplesPerPixel", + "kit_enable_shadows": "/rtx/shadows/enabled", + "kit_enable_ambient_occlusion": "/rtx/ambientOcclusion/enabled", + "kit_dome_light_upper_lower_strategy": "/rtx/domeLight/upperLowerStrategy", + } + for field_name, carb_key in field_to_carb.items(): + value = getattr(quality_cfg, field_name, None) + if value is not None: + set_setting(carb_key, value) + + if quality_cfg.kit_antialiasing_mode is not None: + try: + import omni.replicator.core as rep + + rep.settings.set_render_rtx_realtime(antialiasing=quality_cfg.kit_antialiasing_mode) + except Exception: + pass + + +def apply_newton_quality_cfg_to_visualizer_cfg(visualizer_cfg: Any, quality_cfg: RenderingQualityCfg) -> None: + """Apply Newton quality values to a visualizer cfg object.""" + override_fields = { + "newton_enable_shadows": "enable_shadows", + "newton_enable_sky": "enable_sky", + "newton_enable_wireframe": "enable_wireframe", + "newton_sky_upper_color": "sky_upper_color", + "newton_sky_lower_color": "sky_lower_color", + "newton_light_color": "light_color", + } + for quality_field, viz_field in override_fields.items(): + value = getattr(quality_cfg, quality_field, None) + if value is not None and hasattr(visualizer_cfg, viz_field): + setattr(visualizer_cfg, viz_field, value) + + +def resolve_rendering_quality_name_for_visualizer_cfg(get_setting: Any, visualizer_cfg: Any) -> str | None: + """Resolve effective quality profile name for a visualizer cfg.""" + cli_quality_explicit = bool(get_setting("/isaaclab/rendering/rendering_quality/explicit")) + cli_quality = get_setting("/isaaclab/rendering/rendering_quality") + if cli_quality_explicit: + return cli_quality if cli_quality else None + quality_name = getattr(visualizer_cfg, "rendering_quality", None) + return quality_name if quality_name else None + + +def resolve_rendering_quality_cfg( + quality_name: str | None, quality_cfgs: dict[str, RenderingQualityCfg], logger: Any +) -> RenderingQualityCfg | None: + """Fetch quality cfg by name and log if missing.""" + if not quality_name: + return None + quality_cfg = quality_cfgs.get(quality_name) + if quality_cfg is None: + logger.warning( + "[SimulationContext] Rendering quality '%s' not found in SimulationCfg.rendering_quality_cfgs.", + quality_name, + ) + return None + return quality_cfg diff --git a/source/isaaclab/isaaclab/rendering/visualizers/__init__.py b/source/isaaclab/isaaclab/rendering/visualizers/__init__.py new file mode 100644 index 00000000000..edbb4a8ba29 --- /dev/null +++ b/source/isaaclab/isaaclab/rendering/visualizers/__init__.py @@ -0,0 +1,24 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Rendering-domain visualizer namespace.""" + +from isaaclab.visualizers import ( + KitVisualizerCfg, + NewtonVisualizerCfg, + RerunVisualizerCfg, + Visualizer, + VisualizerCfg, + get_visualizer_class, +) + +__all__ = [ + "Visualizer", + "VisualizerCfg", + "NewtonVisualizerCfg", + "KitVisualizerCfg", + "RerunVisualizerCfg", + "get_visualizer_class", +] diff --git a/source/isaaclab/isaaclab/rendering/visualizers/kit_visualizer.py b/source/isaaclab/isaaclab/rendering/visualizers/kit_visualizer.py new file mode 100644 index 00000000000..771177ffc1d --- /dev/null +++ b/source/isaaclab/isaaclab/rendering/visualizers/kit_visualizer.py @@ -0,0 +1 @@ +from isaaclab.visualizers.kit_visualizer import * # noqa: F401, F403 diff --git a/source/isaaclab/isaaclab/rendering/visualizers/kit_visualizer_cfg.py b/source/isaaclab/isaaclab/rendering/visualizers/kit_visualizer_cfg.py new file mode 100644 index 00000000000..a7302fd0e33 --- /dev/null +++ b/source/isaaclab/isaaclab/rendering/visualizers/kit_visualizer_cfg.py @@ -0,0 +1 @@ +from isaaclab.visualizers.kit_visualizer_cfg import * # noqa: F401, F403 diff --git a/source/isaaclab/isaaclab/rendering/visualizers/newton_visualizer.py b/source/isaaclab/isaaclab/rendering/visualizers/newton_visualizer.py new file mode 100644 index 00000000000..6d0ff4202da --- /dev/null +++ b/source/isaaclab/isaaclab/rendering/visualizers/newton_visualizer.py @@ -0,0 +1 @@ +from isaaclab.visualizers.newton_visualizer import * # noqa: F401, F403 diff --git a/source/isaaclab/isaaclab/rendering/visualizers/newton_visualizer_cfg.py b/source/isaaclab/isaaclab/rendering/visualizers/newton_visualizer_cfg.py new file mode 100644 index 00000000000..bad4c9358f1 --- /dev/null +++ b/source/isaaclab/isaaclab/rendering/visualizers/newton_visualizer_cfg.py @@ -0,0 +1 @@ +from isaaclab.visualizers.newton_visualizer_cfg import * # noqa: F401, F403 diff --git a/source/isaaclab/isaaclab/rendering/visualizers/rerun_visualizer.py b/source/isaaclab/isaaclab/rendering/visualizers/rerun_visualizer.py new file mode 100644 index 00000000000..4673add93f5 --- /dev/null +++ b/source/isaaclab/isaaclab/rendering/visualizers/rerun_visualizer.py @@ -0,0 +1 @@ +from isaaclab.visualizers.rerun_visualizer import * # noqa: F401, F403 diff --git a/source/isaaclab/isaaclab/rendering/visualizers/rerun_visualizer_cfg.py b/source/isaaclab/isaaclab/rendering/visualizers/rerun_visualizer_cfg.py new file mode 100644 index 00000000000..1f96fa84120 --- /dev/null +++ b/source/isaaclab/isaaclab/rendering/visualizers/rerun_visualizer_cfg.py @@ -0,0 +1 @@ +from isaaclab.visualizers.rerun_visualizer_cfg import * # noqa: F401, F403 diff --git a/source/isaaclab/isaaclab/rendering/visualizers/visualizer.py b/source/isaaclab/isaaclab/rendering/visualizers/visualizer.py new file mode 100644 index 00000000000..131e9bdb60a --- /dev/null +++ b/source/isaaclab/isaaclab/rendering/visualizers/visualizer.py @@ -0,0 +1 @@ +from isaaclab.visualizers.visualizer import * # noqa: F401, F403 diff --git a/source/isaaclab/isaaclab/rendering/visualizers/visualizer_cfg.py b/source/isaaclab/isaaclab/rendering/visualizers/visualizer_cfg.py new file mode 100644 index 00000000000..e084ebc3284 --- /dev/null +++ b/source/isaaclab/isaaclab/rendering/visualizers/visualizer_cfg.py @@ -0,0 +1 @@ +from isaaclab.visualizers.visualizer_cfg import * # noqa: F401, F403 diff --git a/source/isaaclab/isaaclab/sim/simulation_cfg.py b/source/isaaclab/isaaclab/sim/simulation_cfg.py index 05df0ea1561..7b337a6fecc 100644 --- a/source/isaaclab/isaaclab/sim/simulation_cfg.py +++ b/source/isaaclab/isaaclab/sim/simulation_cfg.py @@ -14,82 +14,11 @@ from typing import Literal from isaaclab.physics import PhysicsCfg +from isaaclab.rendering.rendering_quality_cfg import RenderingQualityCfg +from isaaclab.rendering.renderers import RTXRendererCfg, WarpRendererCfg +from isaaclab.rendering.visualizers import VisualizerCfg from isaaclab.sim.spawners.materials.physics_materials_cfg import RigidBodyMaterialCfg from isaaclab.utils import configclass -from isaaclab.visualizers import VisualizerCfg - - -@configclass -class RenderingQualityCfg: - """Shared rendering quality profile for visualizers and renderers. - - This profile keeps backend-specific fields in one place using explicit prefixes: - - ``kit_*`` for Omniverse/RTX quality controls - - ``newton_*`` for Newton visual quality controls - """ - - kit_rendering_preset: Literal["performance", "balanced", "high"] | None = None - """Optional built-in preset profile. - - Preset values are defined in :mod:`isaaclab.renderer.rendering_quality_presets`. - """ - - kit_enable_translucency: bool | None = None - """Maps to ``/rtx/translucency/enabled``.""" - - kit_enable_reflections: bool | None = None - """Maps to ``/rtx/reflections/enabled``.""" - - kit_enable_global_illumination: bool | None = None - """Maps to ``/rtx/indirectDiffuse/enabled``.""" - - kit_antialiasing_mode: Literal["Off", "FXAA", "DLSS", "TAA", "DLAA"] | None = None - """Optional anti-aliasing mode applied via Replicator settings helper.""" - - kit_enable_dlssg: bool | None = None - """Maps to ``/rtx-transient/dlssg/enabled``.""" - - kit_enable_dl_denoiser: bool | None = None - """Maps to ``/rtx-transient/dldenoiser/enabled``.""" - - kit_dlss_mode: Literal[0, 1, 2, 3] | None = None - """Maps to ``/rtx/post/dlss/execMode``.""" - - kit_enable_direct_lighting: bool | None = None - """Maps to ``/rtx/directLighting/enabled``.""" - - kit_samples_per_pixel: int | None = None - """Maps to ``/rtx/directLighting/sampledLighting/samplesPerPixel``.""" - - kit_enable_shadows: bool | None = None - """Maps to ``/rtx/shadows/enabled``.""" - - kit_enable_ambient_occlusion: bool | None = None - """Maps to ``/rtx/ambientOcclusion/enabled``.""" - - kit_dome_light_upper_lower_strategy: Literal[0, 3, 4] | None = None - """Maps to ``/rtx/domeLight/upperLowerStrategy``.""" - - newton_enable_shadows: bool | None = None - """Overrides Newton visualizer shadow rendering.""" - - newton_enable_sky: bool | None = None - """Overrides Newton visualizer sky rendering.""" - - newton_enable_wireframe: bool | None = None - """Overrides Newton visualizer wireframe rendering.""" - - newton_sky_upper_color: tuple[float, float, float] | None = None - """Overrides Newton visualizer upper sky color.""" - - newton_sky_lower_color: tuple[float, float, float] | None = None - """Overrides Newton visualizer lower sky color.""" - - newton_light_color: tuple[float, float, float] | None = None - """Overrides Newton visualizer light color.""" - - # TODO: Consider supporting additional raw backend settings dictionaries and - # inline RenderingQualityCfg objects in VisualizerCfg/RendererCfg. @configclass diff --git a/source/isaaclab/isaaclab/sim/simulation_context.py b/source/isaaclab/isaaclab/sim/simulation_context.py index 05702b4a529..4ef69e86129 100644 --- a/source/isaaclab/isaaclab/sim/simulation_context.py +++ b/source/isaaclab/isaaclab/sim/simulation_context.py @@ -17,7 +17,6 @@ from pxr import Gf, Usd, UsdGeom, UsdPhysics, UsdUtils import isaaclab.sim as sim_utils -from isaaclab.renderer.rendering_quality_presets import get_kit_rendering_preset import isaaclab.sim.utils.stage as stage_utils from isaaclab.app.settings_manager import SettingsManager from isaaclab.physics import BaseSceneDataProvider, PhysicsManager, SceneDataProvider @@ -190,13 +189,10 @@ def __init__(self, cfg: SimulationCfg | None = None): type(self)._instance = self # Mark as valid singleton only after successful init def _apply_kit_rendering_preset(self, preset_name: str) -> None: - preset = get_kit_rendering_preset(preset_name) - for key, value in preset.items(): - self.set_setting(key, value) + apply_kit_rendering_preset(self.set_setting, preset_name) def _apply_kit_rendering_quality_cfg(self, quality_cfg: RenderingQualityCfg) -> None: - if quality_cfg.kit_rendering_preset: - self._apply_kit_rendering_preset(quality_cfg.kit_rendering_preset) + apply_kit_rendering_quality_cfg(self.set_setting, quality_cfg) if rendering_mode: supported_rendering_modes = {"performance", "balanced", "quality"} @@ -288,25 +284,11 @@ def _apply_newton_quality_cfg_to_visualizer_cfg(self, visualizer_cfg: Any, quali setattr(visualizer_cfg, viz_field, value) def _resolve_rendering_quality_name_for_visualizer_cfg(self, visualizer_cfg: Any) -> str | None: - cli_quality_explicit = bool(self.get_setting("/isaaclab/rendering/rendering_quality/explicit")) - cli_quality = self.get_setting("/isaaclab/rendering/rendering_quality") - if cli_quality_explicit: - return cli_quality if cli_quality else None - quality_name = getattr(visualizer_cfg, "rendering_quality", None) - return quality_name if quality_name else None + return resolve_rendering_quality_name_for_visualizer_cfg(self.get_setting, visualizer_cfg) def _resolve_rendering_quality_cfg(self, quality_name: str | None) -> RenderingQualityCfg | None: - if not quality_name: - return None quality_cfgs = getattr(self.cfg, "rendering_quality_cfgs", None) or {} - quality_cfg = quality_cfgs.get(quality_name) - if quality_cfg is None: - logger.warning( - "[SimulationContext] Rendering quality '%s' not found in SimulationCfg.rendering_quality_cfgs.", - quality_name, - ) - return None - return quality_cfg + return resolve_rendering_quality_cfg(quality_name, quality_cfgs, logger) def _apply_quality_profile_to_visualizer_cfg(self, visualizer_cfg: Any) -> None: quality_name = self._resolve_rendering_quality_name_for_visualizer_cfg(visualizer_cfg) diff --git a/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py b/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py index 1a16e53eb7b..27d5359f53d 100644 --- a/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py +++ b/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py @@ -46,8 +46,8 @@ class VisualizerCfg: camera_usd_path: str = "/World/envs/env_0/Camera" """Absolute USD path to a camera prim when camera_source='usd_path'.""" - env_filter_mode: Literal["none", "env_ids", "random_n"] = "none" - """Env filter mode: 'none', 'env_ids', or 'random_n'.""" + env_filter_mode: Literal["none", "env_filter_ids", "random_n"] = "none" + """Env filter mode: 'none', 'env_filter_ids', or 'random_n'.""" env_filter_random_n: int = 64 """If env_filter_mode='random_n', number of envs to sample.""" @@ -56,7 +56,7 @@ class VisualizerCfg: """Seed for deterministic env sampling.""" env_filter_ids: list[int] = [i for i in range(0, 64, 4)] - """If env_filter_mode='env_ids', only these env indices are shown. + """If env_filter_mode='env_filter_ids', only these env indices are shown. This improves performance, particularly for large-scale training, by reducing scene updates sent to visualizers. Note, OV visualizer only applies a cosmetic visibility toggle (no performance gain). From cd1f82d418ee8d7e5c8443c3752b9ce614ecdeb0 Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Tue, 24 Feb 2026 01:05:17 +0000 Subject: [PATCH 05/34] add Renderer base class --- .../isaaclab/isaaclab/rendering/__init__.py | 3 +- .../isaaclab/rendering/renderers/__init__.py | 20 ++++++- .../rendering/renderers/renderer_cfg.py | 52 +++++++++++++++++-- .../isaaclab/isaaclab/sim/simulation_cfg.py | 2 +- 4 files changed, 70 insertions(+), 7 deletions(-) diff --git a/source/isaaclab/isaaclab/rendering/__init__.py b/source/isaaclab/isaaclab/rendering/__init__.py index 3270a165a68..54f7a60eb28 100644 --- a/source/isaaclab/isaaclab/rendering/__init__.py +++ b/source/isaaclab/isaaclab/rendering/__init__.py @@ -7,11 +7,12 @@ from .rendering_quality_cfg import RenderingQualityCfg from .rendering_quality_presets import get_kit_rendering_preset -from .renderers import RTXRendererCfg, WarpRendererCfg +from .renderers import RTXRendererCfg, RendererCfg, WarpRendererCfg __all__ = [ "RenderingQualityCfg", "get_kit_rendering_preset", + "RendererCfg", "RTXRendererCfg", "WarpRendererCfg", ] diff --git a/source/isaaclab/isaaclab/rendering/renderers/__init__.py b/source/isaaclab/isaaclab/rendering/renderers/__init__.py index 90420aeda56..60de2c7ca18 100644 --- a/source/isaaclab/isaaclab/rendering/renderers/__init__.py +++ b/source/isaaclab/isaaclab/rendering/renderers/__init__.py @@ -3,6 +3,22 @@ This package is intentionally created now as part of rendering-domain consolidation. """ -from .renderer_cfg import RTXRendererCfg, WarpRendererCfg +from __future__ import annotations -__all__ = ["RTXRendererCfg", "WarpRendererCfg"] +from typing import Any + +from .renderer_cfg import RTXRendererCfg, RendererCfg, WarpRendererCfg + +_RENDERER_REGISTRY: dict[str, Any] = {} + +__all__ = ["RendererCfg", "RTXRendererCfg", "WarpRendererCfg", "get_renderer_class"] + + +def get_renderer_class(name: str) -> Any | None: + """Get a renderer class by name (lazy-loaded). + + TODO: Wire real renderer runtime classes into this registry. + """ + if name in _RENDERER_REGISTRY: + return _RENDERER_REGISTRY[name] + return None diff --git a/source/isaaclab/isaaclab/rendering/renderers/renderer_cfg.py b/source/isaaclab/isaaclab/rendering/renderers/renderer_cfg.py index 0672597644f..93e20139f31 100644 --- a/source/isaaclab/isaaclab/rendering/renderers/renderer_cfg.py +++ b/source/isaaclab/isaaclab/rendering/renderers/renderer_cfg.py @@ -11,11 +11,58 @@ from __future__ import annotations +from typing import TYPE_CHECKING + from isaaclab.utils import configclass +if TYPE_CHECKING: + from typing import Any + + +@configclass +class RendererCfg: + """Base configuration for all renderer backends. + + Note: + This is an abstract base class and should not be instantiated directly. + Use specific renderer configs like RTXRendererCfg or WarpRendererCfg. + """ + + renderer_type: str | None = None + """Type identifier (e.g., 'rtx', 'warp'). Must be overridden by subclasses.""" + + rendering_quality: str | None = None + """Name of the rendering quality profile to use with this renderer.""" + + def get_renderer_type(self) -> str | None: + """Get the renderer type identifier.""" + return self.renderer_type + + def create_renderer(self) -> Any: + """Create renderer instance using the renderer registry. + + TODO: Replace Any with concrete renderer protocol/base class once runtime + renderer implementations are introduced. + """ + from . import get_renderer_class + + if self.renderer_type is None: + raise ValueError( + "Cannot create renderer from base RendererCfg class. " + "Use a specific renderer config: RTXRendererCfg or WarpRendererCfg." + ) + + renderer_class = get_renderer_class(self.renderer_type) + if renderer_class is None: + raise ValueError( + f"Renderer type '{self.renderer_type}' is not registered. " + "Valid types: 'rtx', 'warp'." + ) + return renderer_class(self) + @configclass -class RTXRendererCfg: +class RTXRendererCfg(RendererCfg): """Stub config for future RTX renderer integration. TODO: Implement renderer lifecycle, sensor/render-product routing, and @@ -27,7 +74,7 @@ class RTXRendererCfg: @configclass -class WarpRendererCfg: +class WarpRendererCfg(RendererCfg): """Stub config for future Warp/Newton renderer integration. TODO: Implement renderer lifecycle, sensor/render-product routing, and @@ -35,4 +82,3 @@ class WarpRendererCfg: """ renderer_type: str = "warp" - rendering_quality: str | None = None diff --git a/source/isaaclab/isaaclab/sim/simulation_cfg.py b/source/isaaclab/isaaclab/sim/simulation_cfg.py index 7b337a6fecc..c5cd5e343e3 100644 --- a/source/isaaclab/isaaclab/sim/simulation_cfg.py +++ b/source/isaaclab/isaaclab/sim/simulation_cfg.py @@ -15,7 +15,7 @@ from isaaclab.physics import PhysicsCfg from isaaclab.rendering.rendering_quality_cfg import RenderingQualityCfg -from isaaclab.rendering.renderers import RTXRendererCfg, WarpRendererCfg +from isaaclab.rendering.renderers import RendererCfg from isaaclab.rendering.visualizers import VisualizerCfg from isaaclab.sim.spawners.materials.physics_materials_cfg import RigidBodyMaterialCfg from isaaclab.utils import configclass From 9022a34e77ee01b0e40c87f12ac43f8405508de0 Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Tue, 24 Feb 2026 01:42:09 +0000 Subject: [PATCH 06/34] more cleanpu --- .../isaaclab/rendering/renderers/__init__.py | 5 ++ .../rendering/renderers/renderer_cfg.py | 31 --------- .../rendering/rendering_quality_cfg.py | 31 ++++----- .../rendering/rendering_quality_utils.py | 69 +++++++++++++++++++ .../rendering/visualizers/kit_visualizer.py | 5 ++ .../visualizers/kit_visualizer_cfg.py | 5 ++ .../visualizers/newton_visualizer.py | 5 ++ .../visualizers/newton_visualizer_cfg.py | 5 ++ .../rendering/visualizers/rerun_visualizer.py | 5 ++ .../visualizers/rerun_visualizer_cfg.py | 5 ++ .../rendering/visualizers/visualizer.py | 5 ++ .../rendering/visualizers/visualizer_cfg.py | 5 ++ .../isaaclab/isaaclab/sim/simulation_cfg.py | 2 +- .../isaaclab/sim/simulation_context.py | 57 +++++---------- .../test/sim/test_simulation_render_config.py | 4 +- .../newton/newton_visualizer_cfg.py | 18 ----- 16 files changed, 150 insertions(+), 107 deletions(-) diff --git a/source/isaaclab/isaaclab/rendering/renderers/__init__.py b/source/isaaclab/isaaclab/rendering/renderers/__init__.py index 60de2c7ca18..317d777e888 100644 --- a/source/isaaclab/isaaclab/rendering/renderers/__init__.py +++ b/source/isaaclab/isaaclab/rendering/renderers/__init__.py @@ -1,3 +1,8 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + """Renderer runtime backends namespace. This package is intentionally created now as part of rendering-domain consolidation. diff --git a/source/isaaclab/isaaclab/rendering/renderers/renderer_cfg.py b/source/isaaclab/isaaclab/rendering/renderers/renderer_cfg.py index 93e20139f31..3b48a9fb540 100644 --- a/source/isaaclab/isaaclab/rendering/renderers/renderer_cfg.py +++ b/source/isaaclab/isaaclab/rendering/renderers/renderer_cfg.py @@ -11,13 +11,8 @@ from __future__ import annotations -from typing import TYPE_CHECKING - from isaaclab.utils import configclass -if TYPE_CHECKING: - from typing import Any - @configclass class RendererCfg: @@ -34,32 +29,6 @@ class RendererCfg: rendering_quality: str | None = None """Name of the rendering quality profile to use with this renderer.""" - def get_renderer_type(self) -> str | None: - """Get the renderer type identifier.""" - return self.renderer_type - - def create_renderer(self) -> Any: - """Create renderer instance using the renderer registry. - - TODO: Replace Any with concrete renderer protocol/base class once runtime - renderer implementations are introduced. - """ - from . import get_renderer_class - - if self.renderer_type is None: - raise ValueError( - "Cannot create renderer from base RendererCfg class. " - "Use a specific renderer config: RTXRendererCfg or WarpRendererCfg." - ) - - renderer_class = get_renderer_class(self.renderer_type) - if renderer_class is None: - raise ValueError( - f"Renderer type '{self.renderer_type}' is not registered. " - "Valid types: 'rtx', 'warp'." - ) - return renderer_class(self) - @configclass class RTXRendererCfg(RendererCfg): diff --git a/source/isaaclab/isaaclab/rendering/rendering_quality_cfg.py b/source/isaaclab/isaaclab/rendering/rendering_quality_cfg.py index fefb47078dc..6854640ba53 100644 --- a/source/isaaclab/isaaclab/rendering/rendering_quality_cfg.py +++ b/source/isaaclab/isaaclab/rendering/rendering_quality_cfg.py @@ -15,51 +15,51 @@ class RenderingQualityCfg: """Shared rendering quality profile for visualizers and renderers. This profile keeps backend-specific fields in one place using explicit prefixes: - - ``kit_*`` for Omniverse/RTX quality controls - - ``newton_*`` for Newton visual quality controls + - 'kit_*' for Omniverse/RTX quality controls + - 'newton_*' for Newton visual quality controls """ kit_rendering_preset: Literal["performance", "balanced", "high"] | None = None """Optional built-in preset profile. - Preset values are defined in :mod:`isaaclab.rendering.rendering_quality_presets`. + Preset values are defined in 'isaaclab.rendering.rendering_quality_presets'. """ kit_enable_translucency: bool | None = None - """Maps to ``/rtx/translucency/enabled``.""" + """Maps to '/rtx/translucency/enabled'.""" kit_enable_reflections: bool | None = None - """Maps to ``/rtx/reflections/enabled``.""" + """Maps to '/rtx/reflections/enabled'.""" kit_enable_global_illumination: bool | None = None - """Maps to ``/rtx/indirectDiffuse/enabled``.""" + """Maps to '/rtx/indirectDiffuse/enabled'.""" kit_antialiasing_mode: Literal["Off", "FXAA", "DLSS", "TAA", "DLAA"] | None = None """Optional anti-aliasing mode applied via Replicator settings helper.""" kit_enable_dlssg: bool | None = None - """Maps to ``/rtx-transient/dlssg/enabled``.""" + """Maps to '/rtx-transient/dlssg/enabled'.""" kit_enable_dl_denoiser: bool | None = None - """Maps to ``/rtx-transient/dldenoiser/enabled``.""" + """Maps to '/rtx-transient/dldenoiser/enabled'.""" kit_dlss_mode: Literal[0, 1, 2, 3] | None = None - """Maps to ``/rtx/post/dlss/execMode``.""" + """Maps to '/rtx/post/dlss/execMode'.""" kit_enable_direct_lighting: bool | None = None - """Maps to ``/rtx/directLighting/enabled``.""" + """Maps to '/rtx/directLighting/enabled'.""" kit_samples_per_pixel: int | None = None - """Maps to ``/rtx/directLighting/sampledLighting/samplesPerPixel``.""" + """Maps to '/rtx/directLighting/sampledLighting/samplesPerPixel'.""" kit_enable_shadows: bool | None = None - """Maps to ``/rtx/shadows/enabled``.""" + """Maps to '/rtx/shadows/enabled'.""" kit_enable_ambient_occlusion: bool | None = None - """Maps to ``/rtx/ambientOcclusion/enabled``.""" + """Maps to '/rtx/ambientOcclusion/enabled'.""" kit_dome_light_upper_lower_strategy: Literal[0, 3, 4] | None = None - """Maps to ``/rtx/domeLight/upperLowerStrategy``.""" + """Maps to '/rtx/domeLight/upperLowerStrategy'.""" newton_enable_shadows: bool | None = None """Overrides Newton visualizer shadow rendering.""" @@ -79,5 +79,4 @@ class RenderingQualityCfg: newton_light_color: tuple[float, float, float] | None = None """Overrides Newton visualizer light color.""" - # TODO: Consider supporting additional raw backend settings dictionaries and - # inline RenderingQualityCfg objects in VisualizerCfg/RendererCfg. + # TODO: Consider supporting additional raw backend settings dictionaries. diff --git a/source/isaaclab/isaaclab/rendering/rendering_quality_utils.py b/source/isaaclab/isaaclab/rendering/rendering_quality_utils.py index 4fd1431e28c..24bda68f2f3 100644 --- a/source/isaaclab/isaaclab/rendering/rendering_quality_utils.py +++ b/source/isaaclab/isaaclab/rendering/rendering_quality_utils.py @@ -68,6 +68,25 @@ def apply_newton_quality_cfg_to_visualizer_cfg(visualizer_cfg: Any, quality_cfg: setattr(visualizer_cfg, viz_field, value) +def apply_newton_quality_cfg_to_viewer(viewer: Any, quality_cfg: RenderingQualityCfg) -> None: + """Apply Newton quality values to a live Newton viewer renderer, if available.""" + if viewer is None or not hasattr(viewer, "renderer"): + return + + if quality_cfg.newton_enable_shadows is not None: + viewer.renderer.draw_shadows = quality_cfg.newton_enable_shadows + if quality_cfg.newton_enable_sky is not None: + viewer.renderer.draw_sky = quality_cfg.newton_enable_sky + if quality_cfg.newton_enable_wireframe is not None: + viewer.renderer.draw_wireframe = quality_cfg.newton_enable_wireframe + if quality_cfg.newton_sky_upper_color is not None: + viewer.renderer.sky_upper = quality_cfg.newton_sky_upper_color + if quality_cfg.newton_sky_lower_color is not None: + viewer.renderer.sky_lower = quality_cfg.newton_sky_lower_color + if quality_cfg.newton_light_color is not None: + viewer.renderer._light_color = quality_cfg.newton_light_color + + def resolve_rendering_quality_name_for_visualizer_cfg(get_setting: Any, visualizer_cfg: Any) -> str | None: """Resolve effective quality profile name for a visualizer cfg.""" cli_quality_explicit = bool(get_setting("/isaaclab/rendering/rendering_quality/explicit")) @@ -92,3 +111,53 @@ def resolve_rendering_quality_cfg( ) return None return quality_cfg + + +def apply_quality_profile_to_visualizer_cfg( + get_setting: Any, + set_setting: Any, + visualizer_cfg: Any, + quality_cfgs: dict[str, RenderingQualityCfg], + logger: Any, +) -> None: + """Resolve and apply quality profile to a visualizer config.""" + quality_name = resolve_rendering_quality_name_for_visualizer_cfg(get_setting, visualizer_cfg) + quality_cfg = resolve_rendering_quality_cfg(quality_name, quality_cfgs, logger) + if quality_cfg is None: + return + + visualizer_type = getattr(visualizer_cfg, "visualizer_type", None) + if visualizer_type == "kit": + apply_kit_rendering_quality_cfg(set_setting, quality_cfg) + elif visualizer_type == "newton": + apply_newton_quality_cfg_to_visualizer_cfg(visualizer_cfg, quality_cfg) + + +def apply_runtime_quality_profile_to_visualizer( + get_setting: Any, + set_setting: Any, + viz: Any, + visualizer_quality_keys: dict[int, str | None], + quality_cfgs: dict[str, RenderingQualityCfg], + logger: Any, + force: bool = False, +) -> None: + """Resolve and apply runtime quality profile to an active visualizer.""" + quality_name = resolve_rendering_quality_name_for_visualizer_cfg(get_setting, viz.cfg) + viz_id = id(viz) + if not force and visualizer_quality_keys.get(viz_id) == quality_name: + return + + quality_cfg = resolve_rendering_quality_cfg(quality_name, quality_cfgs, logger) + if quality_cfg is None: + visualizer_quality_keys[viz_id] = quality_name + return + + viz_type = getattr(viz.cfg, "visualizer_type", None) + if viz_type == "kit": + apply_kit_rendering_quality_cfg(set_setting, quality_cfg) + elif viz_type == "newton": + apply_newton_quality_cfg_to_visualizer_cfg(viz.cfg, quality_cfg) + apply_newton_quality_cfg_to_viewer(getattr(viz, "_viewer", None), quality_cfg) + + visualizer_quality_keys[viz_id] = quality_name diff --git a/source/isaaclab/isaaclab/rendering/visualizers/kit_visualizer.py b/source/isaaclab/isaaclab/rendering/visualizers/kit_visualizer.py index 771177ffc1d..851b2feb9e2 100644 --- a/source/isaaclab/isaaclab/rendering/visualizers/kit_visualizer.py +++ b/source/isaaclab/isaaclab/rendering/visualizers/kit_visualizer.py @@ -1 +1,6 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + from isaaclab.visualizers.kit_visualizer import * # noqa: F401, F403 diff --git a/source/isaaclab/isaaclab/rendering/visualizers/kit_visualizer_cfg.py b/source/isaaclab/isaaclab/rendering/visualizers/kit_visualizer_cfg.py index a7302fd0e33..1540cfa2869 100644 --- a/source/isaaclab/isaaclab/rendering/visualizers/kit_visualizer_cfg.py +++ b/source/isaaclab/isaaclab/rendering/visualizers/kit_visualizer_cfg.py @@ -1 +1,6 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + from isaaclab.visualizers.kit_visualizer_cfg import * # noqa: F401, F403 diff --git a/source/isaaclab/isaaclab/rendering/visualizers/newton_visualizer.py b/source/isaaclab/isaaclab/rendering/visualizers/newton_visualizer.py index 6d0ff4202da..74a5cbf17b3 100644 --- a/source/isaaclab/isaaclab/rendering/visualizers/newton_visualizer.py +++ b/source/isaaclab/isaaclab/rendering/visualizers/newton_visualizer.py @@ -1 +1,6 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + from isaaclab.visualizers.newton_visualizer import * # noqa: F401, F403 diff --git a/source/isaaclab/isaaclab/rendering/visualizers/newton_visualizer_cfg.py b/source/isaaclab/isaaclab/rendering/visualizers/newton_visualizer_cfg.py index bad4c9358f1..4679020d629 100644 --- a/source/isaaclab/isaaclab/rendering/visualizers/newton_visualizer_cfg.py +++ b/source/isaaclab/isaaclab/rendering/visualizers/newton_visualizer_cfg.py @@ -1 +1,6 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + from isaaclab.visualizers.newton_visualizer_cfg import * # noqa: F401, F403 diff --git a/source/isaaclab/isaaclab/rendering/visualizers/rerun_visualizer.py b/source/isaaclab/isaaclab/rendering/visualizers/rerun_visualizer.py index 4673add93f5..ff32ae3b1ca 100644 --- a/source/isaaclab/isaaclab/rendering/visualizers/rerun_visualizer.py +++ b/source/isaaclab/isaaclab/rendering/visualizers/rerun_visualizer.py @@ -1 +1,6 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + from isaaclab.visualizers.rerun_visualizer import * # noqa: F401, F403 diff --git a/source/isaaclab/isaaclab/rendering/visualizers/rerun_visualizer_cfg.py b/source/isaaclab/isaaclab/rendering/visualizers/rerun_visualizer_cfg.py index 1f96fa84120..31245b4e940 100644 --- a/source/isaaclab/isaaclab/rendering/visualizers/rerun_visualizer_cfg.py +++ b/source/isaaclab/isaaclab/rendering/visualizers/rerun_visualizer_cfg.py @@ -1 +1,6 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + from isaaclab.visualizers.rerun_visualizer_cfg import * # noqa: F401, F403 diff --git a/source/isaaclab/isaaclab/rendering/visualizers/visualizer.py b/source/isaaclab/isaaclab/rendering/visualizers/visualizer.py index 131e9bdb60a..10a836fa8c8 100644 --- a/source/isaaclab/isaaclab/rendering/visualizers/visualizer.py +++ b/source/isaaclab/isaaclab/rendering/visualizers/visualizer.py @@ -1 +1,6 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + from isaaclab.visualizers.visualizer import * # noqa: F401, F403 diff --git a/source/isaaclab/isaaclab/rendering/visualizers/visualizer_cfg.py b/source/isaaclab/isaaclab/rendering/visualizers/visualizer_cfg.py index e084ebc3284..85bce562dee 100644 --- a/source/isaaclab/isaaclab/rendering/visualizers/visualizer_cfg.py +++ b/source/isaaclab/isaaclab/rendering/visualizers/visualizer_cfg.py @@ -1 +1,6 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + from isaaclab.visualizers.visualizer_cfg import * # noqa: F401, F403 diff --git a/source/isaaclab/isaaclab/sim/simulation_cfg.py b/source/isaaclab/isaaclab/sim/simulation_cfg.py index c5cd5e343e3..651795a4978 100644 --- a/source/isaaclab/isaaclab/sim/simulation_cfg.py +++ b/source/isaaclab/isaaclab/sim/simulation_cfg.py @@ -14,8 +14,8 @@ from typing import Literal from isaaclab.physics import PhysicsCfg -from isaaclab.rendering.rendering_quality_cfg import RenderingQualityCfg from isaaclab.rendering.renderers import RendererCfg +from isaaclab.rendering.rendering_quality_cfg import RenderingQualityCfg from isaaclab.rendering.visualizers import VisualizerCfg from isaaclab.sim.spawners.materials.physics_materials_cfg import RigidBodyMaterialCfg from isaaclab.utils import configclass diff --git a/source/isaaclab/isaaclab/sim/simulation_context.py b/source/isaaclab/isaaclab/sim/simulation_context.py index 4ef69e86129..f61a6de4906 100644 --- a/source/isaaclab/isaaclab/sim/simulation_context.py +++ b/source/isaaclab/isaaclab/sim/simulation_context.py @@ -291,47 +291,26 @@ def _resolve_rendering_quality_cfg(self, quality_name: str | None) -> RenderingQ return resolve_rendering_quality_cfg(quality_name, quality_cfgs, logger) def _apply_quality_profile_to_visualizer_cfg(self, visualizer_cfg: Any) -> None: - quality_name = self._resolve_rendering_quality_name_for_visualizer_cfg(visualizer_cfg) - quality_cfg = self._resolve_rendering_quality_cfg(quality_name) - if quality_cfg is None: - return - if getattr(visualizer_cfg, "visualizer_type", None) == "kit": - self._apply_kit_rendering_quality_cfg(quality_cfg) - elif getattr(visualizer_cfg, "visualizer_type", None) == "newton": - self._apply_newton_quality_cfg_to_visualizer_cfg(visualizer_cfg, quality_cfg) + quality_cfgs = getattr(self.cfg, "rendering_quality_cfgs", None) or {} + apply_quality_profile_to_visualizer_cfg( + self.get_setting, + self.set_setting, + visualizer_cfg, + quality_cfgs, + logger, + ) def _apply_runtime_quality_profile_to_visualizer(self, viz: Visualizer, force: bool = False) -> None: - quality_name = self._resolve_rendering_quality_name_for_visualizer_cfg(viz.cfg) - viz_id = id(viz) - if not force and self._visualizer_quality_keys.get(viz_id) == quality_name: - return - quality_cfg = self._resolve_rendering_quality_cfg(quality_name) - if quality_cfg is None: - self._visualizer_quality_keys[viz_id] = quality_name - return - - viz_type = getattr(viz.cfg, "visualizer_type", None) - if viz_type == "kit": - self._apply_kit_rendering_quality_cfg(quality_cfg) - elif viz_type == "newton": - self._apply_newton_quality_cfg_to_visualizer_cfg(viz.cfg, quality_cfg) - viewer = getattr(viz, "_viewer", None) - if viewer is not None and hasattr(viewer, "renderer"): - if quality_cfg.newton_enable_shadows is not None: - viewer.renderer.draw_shadows = quality_cfg.newton_enable_shadows - if quality_cfg.newton_enable_sky is not None: - viewer.renderer.draw_sky = quality_cfg.newton_enable_sky - if quality_cfg.newton_enable_wireframe is not None: - viewer.renderer.draw_wireframe = quality_cfg.newton_enable_wireframe - if quality_cfg.newton_sky_upper_color is not None: - viewer.renderer.sky_upper = quality_cfg.newton_sky_upper_color - if quality_cfg.newton_sky_lower_color is not None: - viewer.renderer.sky_lower = quality_cfg.newton_sky_lower_color - if quality_cfg.newton_light_color is not None: - viewer.renderer._light_color = quality_cfg.newton_light_color - - # Store last applied quality key so runtime hot swapping can be detected per visualizer. - self._visualizer_quality_keys[viz_id] = quality_name + quality_cfgs = getattr(self.cfg, "rendering_quality_cfgs", None) or {} + apply_runtime_quality_profile_to_visualizer( + self.get_setting, + self.set_setting, + viz, + self._visualizer_quality_keys, + quality_cfgs, + logger, + force=force, + ) def _init_usd_physics_scene(self) -> None: """Create and configure the USD physics scene.""" diff --git a/source/isaaclab/test/sim/test_simulation_render_config.py b/source/isaaclab/test/sim/test_simulation_render_config.py index 388e59adc04..42189536e64 100644 --- a/source/isaaclab/test/sim/test_simulation_render_config.py +++ b/source/isaaclab/test/sim/test_simulation_render_config.py @@ -84,7 +84,7 @@ def test_render_cfg(): assert sim.get_setting("/rtx/post/aa/op") == 4 # dlss = 3, dlaa=4 -@pytest.mark.isaacsim_ci +# @pytest.mark.isaacsim_ci def test_render_cfg_presets(): """Test that quality presets are applied and can be overridden via RenderingQualityCfg.""" @@ -135,7 +135,7 @@ def test_render_cfg_presets(): @pytest.mark.skip(reason="Timeline not stopped") -@pytest.mark.isaacsim_ci +# @pytest.mark.isaacsim_ci def test_rendering_quality_cfg_field_overrides(): """Test that explicit RenderingQualityCfg fields map to carb settings.""" quality_cfg = RenderingQualityCfg( diff --git a/source/isaaclab_visualizers/isaaclab_visualizers/newton/newton_visualizer_cfg.py b/source/isaaclab_visualizers/isaaclab_visualizers/newton/newton_visualizer_cfg.py index 2449db73b5e..654d0c641a1 100644 --- a/source/isaaclab_visualizers/isaaclab_visualizers/newton/newton_visualizer_cfg.py +++ b/source/isaaclab_visualizers/isaaclab_visualizers/newton/newton_visualizer_cfg.py @@ -45,21 +45,3 @@ class NewtonVisualizerCfg(VisualizerCfg): show_com: bool = False """Show center of mass visualization.""" - - enable_shadows: bool = True - """Enable shadow rendering.""" - - enable_sky: bool = True - """Enable sky rendering.""" - - enable_wireframe: bool = False - """Enable wireframe rendering.""" - - sky_upper_color: tuple[float, float, float] = (0.2, 0.4, 0.6) - """Sky upper color RGB [0,1].""" - - sky_lower_color: tuple[float, float, float] = (0.5, 0.6, 0.7) - """Sky lower color RGB [0,1].""" - - light_color: tuple[float, float, float] = (1.0, 1.0, 1.0) - """Light color RGB [0,1].""" From a2cf8e87d767242fdf676546f57063b2e712170f Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Tue, 24 Feb 2026 02:15:16 +0000 Subject: [PATCH 07/34] reorgn --- source/isaaclab/isaaclab/rendering/__init__.py | 5 ++--- .../isaaclab/isaaclab/rendering/quality/__init__.py | 11 +++++++++++ .../rendering/{ => quality}/rendering_quality_cfg.py | 2 +- .../{ => quality}/rendering_quality_presets.py | 0 .../{ => quality}/rendering_quality_utils.py | 0 source/isaaclab/isaaclab/sim/simulation_cfg.py | 2 +- 6 files changed, 15 insertions(+), 5 deletions(-) create mode 100644 source/isaaclab/isaaclab/rendering/quality/__init__.py rename source/isaaclab/isaaclab/rendering/{ => quality}/rendering_quality_cfg.py (96%) rename source/isaaclab/isaaclab/rendering/{ => quality}/rendering_quality_presets.py (100%) rename source/isaaclab/isaaclab/rendering/{ => quality}/rendering_quality_utils.py (100%) diff --git a/source/isaaclab/isaaclab/rendering/__init__.py b/source/isaaclab/isaaclab/rendering/__init__.py index 54f7a60eb28..8210246925b 100644 --- a/source/isaaclab/isaaclab/rendering/__init__.py +++ b/source/isaaclab/isaaclab/rendering/__init__.py @@ -3,10 +3,9 @@ # # SPDX-License-Identifier: BSD-3-Clause -"""Rendering domain package (renderers, visualizers, quality config/presets).""" +"""Rendering domain package (renderers, visualizers, rendering quality).""" -from .rendering_quality_cfg import RenderingQualityCfg -from .rendering_quality_presets import get_kit_rendering_preset +from .quality import RenderingQualityCfg, get_kit_rendering_preset from .renderers import RTXRendererCfg, RendererCfg, WarpRendererCfg __all__ = [ diff --git a/source/isaaclab/isaaclab/rendering/quality/__init__.py b/source/isaaclab/isaaclab/rendering/quality/__init__.py new file mode 100644 index 00000000000..8ef7c4c6db2 --- /dev/null +++ b/source/isaaclab/isaaclab/rendering/quality/__init__.py @@ -0,0 +1,11 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Rendering quality config, presets, and application helpers.""" + +from .rendering_quality_cfg import RenderingQualityCfg +from .rendering_quality_presets import get_kit_rendering_preset + +__all__ = ["RenderingQualityCfg", "get_kit_rendering_preset"] diff --git a/source/isaaclab/isaaclab/rendering/rendering_quality_cfg.py b/source/isaaclab/isaaclab/rendering/quality/rendering_quality_cfg.py similarity index 96% rename from source/isaaclab/isaaclab/rendering/rendering_quality_cfg.py rename to source/isaaclab/isaaclab/rendering/quality/rendering_quality_cfg.py index 6854640ba53..c6068aa9522 100644 --- a/source/isaaclab/isaaclab/rendering/rendering_quality_cfg.py +++ b/source/isaaclab/isaaclab/rendering/quality/rendering_quality_cfg.py @@ -22,7 +22,7 @@ class RenderingQualityCfg: kit_rendering_preset: Literal["performance", "balanced", "high"] | None = None """Optional built-in preset profile. - Preset values are defined in 'isaaclab.rendering.rendering_quality_presets'. + Preset values are defined in 'isaaclab.rendering.quality.rendering_quality_presets'. """ kit_enable_translucency: bool | None = None diff --git a/source/isaaclab/isaaclab/rendering/rendering_quality_presets.py b/source/isaaclab/isaaclab/rendering/quality/rendering_quality_presets.py similarity index 100% rename from source/isaaclab/isaaclab/rendering/rendering_quality_presets.py rename to source/isaaclab/isaaclab/rendering/quality/rendering_quality_presets.py diff --git a/source/isaaclab/isaaclab/rendering/rendering_quality_utils.py b/source/isaaclab/isaaclab/rendering/quality/rendering_quality_utils.py similarity index 100% rename from source/isaaclab/isaaclab/rendering/rendering_quality_utils.py rename to source/isaaclab/isaaclab/rendering/quality/rendering_quality_utils.py diff --git a/source/isaaclab/isaaclab/sim/simulation_cfg.py b/source/isaaclab/isaaclab/sim/simulation_cfg.py index 651795a4978..8deeb7e40c5 100644 --- a/source/isaaclab/isaaclab/sim/simulation_cfg.py +++ b/source/isaaclab/isaaclab/sim/simulation_cfg.py @@ -14,8 +14,8 @@ from typing import Literal from isaaclab.physics import PhysicsCfg +from isaaclab.rendering.quality.rendering_quality_cfg import RenderingQualityCfg from isaaclab.rendering.renderers import RendererCfg -from isaaclab.rendering.rendering_quality_cfg import RenderingQualityCfg from isaaclab.rendering.visualizers import VisualizerCfg from isaaclab.sim.spawners.materials.physics_materials_cfg import RigidBodyMaterialCfg from isaaclab.utils import configclass From 44fff54c260e5d158aacdcb100bc1e88a101d456 Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Tue, 24 Feb 2026 02:25:42 +0000 Subject: [PATCH 08/34] clean up empty dirs --- source/isaaclab/isaaclab/rendering/__init__.py | 2 +- .../rendering/{quality => rendering_quality}/__init__.py | 0 .../{quality => rendering_quality}/rendering_quality_cfg.py | 2 +- .../{quality => rendering_quality}/rendering_quality_presets.py | 0 .../{quality => rendering_quality}/rendering_quality_utils.py | 0 source/isaaclab/isaaclab/sim/simulation_cfg.py | 2 +- 6 files changed, 3 insertions(+), 3 deletions(-) rename source/isaaclab/isaaclab/rendering/{quality => rendering_quality}/__init__.py (100%) rename source/isaaclab/isaaclab/rendering/{quality => rendering_quality}/rendering_quality_cfg.py (96%) rename source/isaaclab/isaaclab/rendering/{quality => rendering_quality}/rendering_quality_presets.py (100%) rename source/isaaclab/isaaclab/rendering/{quality => rendering_quality}/rendering_quality_utils.py (100%) diff --git a/source/isaaclab/isaaclab/rendering/__init__.py b/source/isaaclab/isaaclab/rendering/__init__.py index 8210246925b..497890b1654 100644 --- a/source/isaaclab/isaaclab/rendering/__init__.py +++ b/source/isaaclab/isaaclab/rendering/__init__.py @@ -5,7 +5,7 @@ """Rendering domain package (renderers, visualizers, rendering quality).""" -from .quality import RenderingQualityCfg, get_kit_rendering_preset +from .rendering_quality import RenderingQualityCfg, get_kit_rendering_preset from .renderers import RTXRendererCfg, RendererCfg, WarpRendererCfg __all__ = [ diff --git a/source/isaaclab/isaaclab/rendering/quality/__init__.py b/source/isaaclab/isaaclab/rendering/rendering_quality/__init__.py similarity index 100% rename from source/isaaclab/isaaclab/rendering/quality/__init__.py rename to source/isaaclab/isaaclab/rendering/rendering_quality/__init__.py diff --git a/source/isaaclab/isaaclab/rendering/quality/rendering_quality_cfg.py b/source/isaaclab/isaaclab/rendering/rendering_quality/rendering_quality_cfg.py similarity index 96% rename from source/isaaclab/isaaclab/rendering/quality/rendering_quality_cfg.py rename to source/isaaclab/isaaclab/rendering/rendering_quality/rendering_quality_cfg.py index c6068aa9522..99ca64bdd6e 100644 --- a/source/isaaclab/isaaclab/rendering/quality/rendering_quality_cfg.py +++ b/source/isaaclab/isaaclab/rendering/rendering_quality/rendering_quality_cfg.py @@ -22,7 +22,7 @@ class RenderingQualityCfg: kit_rendering_preset: Literal["performance", "balanced", "high"] | None = None """Optional built-in preset profile. - Preset values are defined in 'isaaclab.rendering.quality.rendering_quality_presets'. + Preset values are defined in 'isaaclab.rendering.rendering_quality.rendering_quality_presets'. """ kit_enable_translucency: bool | None = None diff --git a/source/isaaclab/isaaclab/rendering/quality/rendering_quality_presets.py b/source/isaaclab/isaaclab/rendering/rendering_quality/rendering_quality_presets.py similarity index 100% rename from source/isaaclab/isaaclab/rendering/quality/rendering_quality_presets.py rename to source/isaaclab/isaaclab/rendering/rendering_quality/rendering_quality_presets.py diff --git a/source/isaaclab/isaaclab/rendering/quality/rendering_quality_utils.py b/source/isaaclab/isaaclab/rendering/rendering_quality/rendering_quality_utils.py similarity index 100% rename from source/isaaclab/isaaclab/rendering/quality/rendering_quality_utils.py rename to source/isaaclab/isaaclab/rendering/rendering_quality/rendering_quality_utils.py diff --git a/source/isaaclab/isaaclab/sim/simulation_cfg.py b/source/isaaclab/isaaclab/sim/simulation_cfg.py index 8deeb7e40c5..7d6d4d34297 100644 --- a/source/isaaclab/isaaclab/sim/simulation_cfg.py +++ b/source/isaaclab/isaaclab/sim/simulation_cfg.py @@ -14,7 +14,7 @@ from typing import Literal from isaaclab.physics import PhysicsCfg -from isaaclab.rendering.quality.rendering_quality_cfg import RenderingQualityCfg +from isaaclab.rendering.rendering_quality.rendering_quality_cfg import RenderingQualityCfg from isaaclab.rendering.renderers import RendererCfg from isaaclab.rendering.visualizers import VisualizerCfg from isaaclab.sim.spawners.materials.physics_materials_cfg import RigidBodyMaterialCfg From 9ef6e276c5e26f0c0ea9b9265ce17766bec26c1a Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Tue, 24 Feb 2026 02:33:15 +0000 Subject: [PATCH 09/34] move renderercfg subclasses into separate files --- .../isaaclab/rendering/renderers/__init__.py | 4 +++- .../rendering/renderers/renderer_cfg.py | 23 ------------------- .../rendering/renderers/rtx_renderer_cfg.py | 22 ++++++++++++++++++ .../rendering/renderers/warp_renderer_cfg.py | 21 +++++++++++++++++ .../rendering_quality_cfg.py | 12 +++++----- 5 files changed, 52 insertions(+), 30 deletions(-) create mode 100644 source/isaaclab/isaaclab/rendering/renderers/rtx_renderer_cfg.py create mode 100644 source/isaaclab/isaaclab/rendering/renderers/warp_renderer_cfg.py diff --git a/source/isaaclab/isaaclab/rendering/renderers/__init__.py b/source/isaaclab/isaaclab/rendering/renderers/__init__.py index 317d777e888..61a297c4910 100644 --- a/source/isaaclab/isaaclab/rendering/renderers/__init__.py +++ b/source/isaaclab/isaaclab/rendering/renderers/__init__.py @@ -12,7 +12,9 @@ from typing import Any -from .renderer_cfg import RTXRendererCfg, RendererCfg, WarpRendererCfg +from .renderer_cfg import RendererCfg +from .rtx_renderer_cfg import RTXRendererCfg +from .warp_renderer_cfg import WarpRendererCfg _RENDERER_REGISTRY: dict[str, Any] = {} diff --git a/source/isaaclab/isaaclab/rendering/renderers/renderer_cfg.py b/source/isaaclab/isaaclab/rendering/renderers/renderer_cfg.py index 3b48a9fb540..6219f864025 100644 --- a/source/isaaclab/isaaclab/rendering/renderers/renderer_cfg.py +++ b/source/isaaclab/isaaclab/rendering/renderers/renderer_cfg.py @@ -28,26 +28,3 @@ class RendererCfg: rendering_quality: str | None = None """Name of the rendering quality profile to use with this renderer.""" - - -@configclass -class RTXRendererCfg(RendererCfg): - """Stub config for future RTX renderer integration. - - TODO: Implement renderer lifecycle, sensor/render-product routing, and - backend-specific settings application. - """ - - renderer_type: str = "rtx" - rendering_quality: str | None = None - - -@configclass -class WarpRendererCfg(RendererCfg): - """Stub config for future Warp/Newton renderer integration. - - TODO: Implement renderer lifecycle, sensor/render-product routing, and - backend-specific settings application. - """ - - renderer_type: str = "warp" diff --git a/source/isaaclab/isaaclab/rendering/renderers/rtx_renderer_cfg.py b/source/isaaclab/isaaclab/rendering/renderers/rtx_renderer_cfg.py new file mode 100644 index 00000000000..137a74b7bf0 --- /dev/null +++ b/source/isaaclab/isaaclab/rendering/renderers/rtx_renderer_cfg.py @@ -0,0 +1,22 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Stub config for future RTX renderer integration.""" + +from isaaclab.utils import configclass + +from .renderer_cfg import RendererCfg + + +@configclass +class RTXRendererCfg(RendererCfg): + """Stub config for future RTX renderer integration. + + TODO: Implement renderer lifecycle, sensor/render-product routing, and + backend-specific settings application. + """ + + renderer_type: str = "rtx" + rendering_quality: str | None = None diff --git a/source/isaaclab/isaaclab/rendering/renderers/warp_renderer_cfg.py b/source/isaaclab/isaaclab/rendering/renderers/warp_renderer_cfg.py new file mode 100644 index 00000000000..5d870cd5e82 --- /dev/null +++ b/source/isaaclab/isaaclab/rendering/renderers/warp_renderer_cfg.py @@ -0,0 +1,21 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Stub config for future Warp/Newton renderer integration.""" + +from isaaclab.utils import configclass + +from .renderer_cfg import RendererCfg + + +@configclass +class WarpRendererCfg(RendererCfg): + """Stub config for future Warp/Newton renderer integration. + + TODO: Implement renderer lifecycle, sensor/render-product routing, and + backend-specific settings application. + """ + + renderer_type: str = "warp" diff --git a/source/isaaclab/isaaclab/rendering/rendering_quality/rendering_quality_cfg.py b/source/isaaclab/isaaclab/rendering/rendering_quality/rendering_quality_cfg.py index 99ca64bdd6e..8ada17b355e 100644 --- a/source/isaaclab/isaaclab/rendering/rendering_quality/rendering_quality_cfg.py +++ b/source/isaaclab/isaaclab/rendering/rendering_quality/rendering_quality_cfg.py @@ -61,22 +61,22 @@ class RenderingQualityCfg: kit_dome_light_upper_lower_strategy: Literal[0, 3, 4] | None = None """Maps to '/rtx/domeLight/upperLowerStrategy'.""" - newton_enable_shadows: bool | None = None + newton_enable_shadows: bool | None = True """Overrides Newton visualizer shadow rendering.""" - newton_enable_sky: bool | None = None + newton_enable_sky: bool | None = True """Overrides Newton visualizer sky rendering.""" - newton_enable_wireframe: bool | None = None + newton_enable_wireframe: bool | None = False """Overrides Newton visualizer wireframe rendering.""" - newton_sky_upper_color: tuple[float, float, float] | None = None + newton_sky_upper_color: tuple[float, float, float] | None = (0.2, 0.4, 0.6) """Overrides Newton visualizer upper sky color.""" - newton_sky_lower_color: tuple[float, float, float] | None = None + newton_sky_lower_color: tuple[float, float, float] | None = (0.5, 0.6, 0.7) """Overrides Newton visualizer lower sky color.""" - newton_light_color: tuple[float, float, float] | None = None + newton_light_color: tuple[float, float, float] | None = (1.0, 1.0, 1.0) """Overrides Newton visualizer light color.""" # TODO: Consider supporting additional raw backend settings dictionaries. From 7fadcce1e525bbbb25c4b665bcfb8f7522aff3bd Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Tue, 24 Feb 2026 19:50:09 +0000 Subject: [PATCH 10/34] wip --- .../physx_scene_data_provider.py | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/source/isaaclab_physx/isaaclab_physx/scene_data_providers/physx_scene_data_provider.py b/source/isaaclab_physx/isaaclab_physx/scene_data_providers/physx_scene_data_provider.py index 19aa1eb3498..a3c5677f610 100644 --- a/source/isaaclab_physx/isaaclab_physx/scene_data_providers/physx_scene_data_provider.py +++ b/source/isaaclab_physx/isaaclab_physx/scene_data_providers/physx_scene_data_provider.py @@ -364,6 +364,58 @@ def _build_filtered_newton_model(self, env_ids: list[int]) -> None: self._filtered_newton_model = None self._filtered_newton_state = None self._filtered_body_indices = [] + + def _extract_model_path_list(self, model: Any, attr_candidates: list[str]) -> list[str]: + """Extract a list of prim paths from the first supported model attribute.""" + for attr_name in attr_candidates: + if not hasattr(model, attr_name): + continue + raw = getattr(model, attr_name) + if raw is None: + continue + + # Dict-like containers may map index->path or path->index. + if isinstance(raw, dict): + keys = [k for k in raw.keys() if isinstance(k, str) and k.startswith("/")] + vals = [v for v in raw.values() if isinstance(v, str) and v.startswith("/")] + paths = keys if keys else vals + if paths: + return list(paths) + continue + + try: + values = list(raw) + except Exception: + continue + + paths = [v for v in values if isinstance(v, str) and v.startswith("/")] + if paths: + return paths + + return [] + + def _discover_physics_paths_from_stage(self) -> tuple[list[str], list[str]]: + """Fallback discovery of rigid-body and articulation paths from USD stage.""" + if self._stage is None: + return [], [] + + rigid_paths: list[str] = [] + articulation_paths: list[str] = [] + for prim in self._stage.Traverse(): + path = prim.GetPath().pathString + if prim.HasAPI(UsdPhysics.RigidBodyAPI): + rigid_paths.append(path) + if prim.HasAPI(UsdPhysics.ArticulationRootAPI): + articulation_paths.append(path) + + if rigid_paths or articulation_paths: + logger.warning( + "[PhysxSceneDataProvider] Falling back to USD-discovered physics paths " + "(rigid=%d, articulations=%d).", + len(rigid_paths), + len(articulation_paths), + ) + return rigid_paths, articulation_paths except Exception as exc: logger.error(f"[PhysxSceneDataProvider] Failed to build filtered Newton model from USD: {exc}") self._filtered_newton_model = None From 2199482fc9b4eb0659331295de57e0630a1ae711 Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Tue, 24 Feb 2026 20:24:28 +0000 Subject: [PATCH 11/34] soadifj --- source/isaaclab/isaaclab/sim/simulation_cfg.py | 2 +- source/isaaclab/test/envs/test_env_rendering_logic.py | 2 ++ .../scene_data_providers/physx_scene_data_provider.py | 3 +-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/source/isaaclab/isaaclab/sim/simulation_cfg.py b/source/isaaclab/isaaclab/sim/simulation_cfg.py index 7d6d4d34297..312b20f100f 100644 --- a/source/isaaclab/isaaclab/sim/simulation_cfg.py +++ b/source/isaaclab/isaaclab/sim/simulation_cfg.py @@ -14,8 +14,8 @@ from typing import Literal from isaaclab.physics import PhysicsCfg -from isaaclab.rendering.rendering_quality.rendering_quality_cfg import RenderingQualityCfg from isaaclab.rendering.renderers import RendererCfg +from isaaclab.rendering.rendering_quality.rendering_quality_cfg import RenderingQualityCfg from isaaclab.rendering.visualizers import VisualizerCfg from isaaclab.sim.spawners.materials.physics_materials_cfg import RigidBodyMaterialCfg from isaaclab.utils import configclass diff --git a/source/isaaclab/test/envs/test_env_rendering_logic.py b/source/isaaclab/test/envs/test_env_rendering_logic.py index 3a553116510..923aa86e737 100644 --- a/source/isaaclab/test/envs/test_env_rendering_logic.py +++ b/source/isaaclab/test/envs/test_env_rendering_logic.py @@ -27,6 +27,8 @@ ManagerBasedRLEnv, ManagerBasedRLEnvCfg, ) +from isaaclab.rendering.visualizers.kit_visualizer import KitVisualizer +from isaaclab.rendering.visualizers.kit_visualizer_cfg import KitVisualizerCfg from isaaclab.scene import InteractiveSceneCfg from isaaclab.sim import SimulationCfg, SimulationContext from isaaclab.utils import configclass diff --git a/source/isaaclab_physx/isaaclab_physx/scene_data_providers/physx_scene_data_provider.py b/source/isaaclab_physx/isaaclab_physx/scene_data_providers/physx_scene_data_provider.py index a3c5677f610..67f1918c0a3 100644 --- a/source/isaaclab_physx/isaaclab_physx/scene_data_providers/physx_scene_data_provider.py +++ b/source/isaaclab_physx/isaaclab_physx/scene_data_providers/physx_scene_data_provider.py @@ -410,8 +410,7 @@ def _discover_physics_paths_from_stage(self) -> tuple[list[str], list[str]]: if rigid_paths or articulation_paths: logger.warning( - "[PhysxSceneDataProvider] Falling back to USD-discovered physics paths " - "(rigid=%d, articulations=%d).", + "[PhysxSceneDataProvider] Falling back to USD-discovered physics paths (rigid=%d, articulations=%d).", len(rigid_paths), len(articulation_paths), ) From 0dc8e0adf3a711fc128358070e521ae58bfd8f99 Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Tue, 24 Feb 2026 23:04:05 +0000 Subject: [PATCH 12/34] change rendering quality -> rendering mode --- source/isaaclab/isaaclab/app/app_launcher.py | 5 ++++- .../isaaclab/isaaclab/rendering/__init__.py | 6 ++--- .../rendering/rendering_mode/__init__.py | 11 ++++++++++ .../rendering_mode_cfg.py} | 8 +++---- .../rendering_mode_presets.py} | 6 ++--- .../rendering_mode_utils.py} | 22 +++++++++---------- .../rendering/rendering_quality/__init__.py | 11 ---------- .../isaaclab/isaaclab/sim/simulation_cfg.py | 10 ++++----- .../test/sim/test_simulation_render_config.py | 10 ++++----- 9 files changed, 46 insertions(+), 43 deletions(-) create mode 100644 source/isaaclab/isaaclab/rendering/rendering_mode/__init__.py rename source/isaaclab/isaaclab/rendering/{rendering_quality/rendering_quality_cfg.py => rendering_mode/rendering_mode_cfg.py} (90%) rename source/isaaclab/isaaclab/rendering/{rendering_quality/rendering_quality_presets.py => rendering_mode/rendering_mode_presets.py} (96%) rename source/isaaclab/isaaclab/rendering/{rendering_quality/rendering_quality_utils.py => rendering_mode/rendering_mode_utils.py} (92%) delete mode 100644 source/isaaclab/isaaclab/rendering/rendering_quality/__init__.py diff --git a/source/isaaclab/isaaclab/app/app_launcher.py b/source/isaaclab/isaaclab/app/app_launcher.py index 17942b7d748..8a6bcfda44e 100644 --- a/source/isaaclab/isaaclab/app/app_launcher.py +++ b/source/isaaclab/isaaclab/app/app_launcher.py @@ -1099,6 +1099,7 @@ def _hide_stop_button(self): def _set_rendering_mode_settings(self, launcher_args: dict) -> None: """Store RTX rendering mode in settings.""" + rendering_mode_explicit = launcher_args.pop("rendering_mode_explicit", False) rendering_mode = launcher_args.get("rendering_mode") if rendering_mode is None: @@ -1107,7 +1108,9 @@ def _set_rendering_mode_settings(self, launcher_args: dict) -> None: return rendering_mode = "" - get_settings_manager().set_string("/isaaclab/rendering/rendering_mode", rendering_mode) + settings = get_settings_manager() + settings.set_string("/isaaclab/rendering/rendering_mode", rendering_mode) + settings.set_bool("/isaaclab/rendering/rendering_mode/explicit", bool(rendering_mode_explicit)) def _set_animation_recording_settings(self, launcher_args: dict) -> None: """Store animation recording settings in settings.""" diff --git a/source/isaaclab/isaaclab/rendering/__init__.py b/source/isaaclab/isaaclab/rendering/__init__.py index 497890b1654..a870d3c5bb9 100644 --- a/source/isaaclab/isaaclab/rendering/__init__.py +++ b/source/isaaclab/isaaclab/rendering/__init__.py @@ -3,13 +3,13 @@ # # SPDX-License-Identifier: BSD-3-Clause -"""Rendering domain package (renderers, visualizers, rendering quality).""" +"""Rendering domain package (renderers, visualizers, rendering mode).""" -from .rendering_quality import RenderingQualityCfg, get_kit_rendering_preset +from .rendering_mode import RenderingModeCfg, get_kit_rendering_preset from .renderers import RTXRendererCfg, RendererCfg, WarpRendererCfg __all__ = [ - "RenderingQualityCfg", + "RenderingModeCfg", "get_kit_rendering_preset", "RendererCfg", "RTXRendererCfg", diff --git a/source/isaaclab/isaaclab/rendering/rendering_mode/__init__.py b/source/isaaclab/isaaclab/rendering/rendering_mode/__init__.py new file mode 100644 index 00000000000..da49b16f62a --- /dev/null +++ b/source/isaaclab/isaaclab/rendering/rendering_mode/__init__.py @@ -0,0 +1,11 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Rendering mode config, presets, and application helpers.""" + +from .rendering_mode_cfg import RenderingModeCfg +from .rendering_mode_presets import get_kit_rendering_preset + +__all__ = ["RenderingModeCfg", "get_kit_rendering_preset"] diff --git a/source/isaaclab/isaaclab/rendering/rendering_quality/rendering_quality_cfg.py b/source/isaaclab/isaaclab/rendering/rendering_mode/rendering_mode_cfg.py similarity index 90% rename from source/isaaclab/isaaclab/rendering/rendering_quality/rendering_quality_cfg.py rename to source/isaaclab/isaaclab/rendering/rendering_mode/rendering_mode_cfg.py index 8ada17b355e..830861035aa 100644 --- a/source/isaaclab/isaaclab/rendering/rendering_quality/rendering_quality_cfg.py +++ b/source/isaaclab/isaaclab/rendering/rendering_mode/rendering_mode_cfg.py @@ -11,18 +11,18 @@ @configclass -class RenderingQualityCfg: - """Shared rendering quality profile for visualizers and renderers. +class RenderingModeCfg: + """Shared rendering mode profile for visualizers and renderers. This profile keeps backend-specific fields in one place using explicit prefixes: - 'kit_*' for Omniverse/RTX quality controls - 'newton_*' for Newton visual quality controls """ - kit_rendering_preset: Literal["performance", "balanced", "high"] | None = None + kit_rendering_preset: Literal["performance", "balanced", "quality"] | None = None """Optional built-in preset profile. - Preset values are defined in 'isaaclab.rendering.rendering_quality.rendering_quality_presets'. + Preset values are defined in 'isaaclab.rendering.rendering_mode.rendering_mode_presets'. """ kit_enable_translucency: bool | None = None diff --git a/source/isaaclab/isaaclab/rendering/rendering_quality/rendering_quality_presets.py b/source/isaaclab/isaaclab/rendering/rendering_mode/rendering_mode_presets.py similarity index 96% rename from source/isaaclab/isaaclab/rendering/rendering_quality/rendering_quality_presets.py rename to source/isaaclab/isaaclab/rendering/rendering_mode/rendering_mode_presets.py index a741a545355..8996e6b7955 100644 --- a/source/isaaclab/isaaclab/rendering/rendering_quality/rendering_quality_presets.py +++ b/source/isaaclab/isaaclab/rendering/rendering_mode/rendering_mode_presets.py @@ -3,7 +3,7 @@ # # SPDX-License-Identifier: BSD-3-Clause -"""Built-in rendering quality presets for RTX/Kit rendering. +"""Built-in rendering mode presets for RTX/Kit rendering. Presets are sourced from the latest Isaac Lab app rendering profiles (apps/rendering_modes). """ @@ -58,7 +58,7 @@ "/rtx/pathtracing/maxSamplesPerLaunch": 1_000_000, "/rtx/viewTile/limit": 1_000_000, }, - "high": { + "quality": { "/rtx/rtpt/maxBounces": 3, "/rtx/rtpt/cached/enabled": False, "/rtx/rtpt/lightcache/cached/enabled": False, @@ -82,6 +82,6 @@ def get_kit_rendering_preset(preset_name: str) -> dict[str, Any]: """Return a deep copy of the requested rendering preset.""" - if preset_name not in {"performance", "balanced", "high"}: + if preset_name not in {"performance", "balanced", "quality"}: raise ValueError(f"Unknown preset '{preset_name}'.") return deepcopy(_KIT_PRESETS[preset_name]) diff --git a/source/isaaclab/isaaclab/rendering/rendering_quality/rendering_quality_utils.py b/source/isaaclab/isaaclab/rendering/rendering_mode/rendering_mode_utils.py similarity index 92% rename from source/isaaclab/isaaclab/rendering/rendering_quality/rendering_quality_utils.py rename to source/isaaclab/isaaclab/rendering/rendering_mode/rendering_mode_utils.py index 24bda68f2f3..2b6aef5f124 100644 --- a/source/isaaclab/isaaclab/rendering/rendering_quality/rendering_quality_utils.py +++ b/source/isaaclab/isaaclab/rendering/rendering_mode/rendering_mode_utils.py @@ -9,8 +9,8 @@ from typing import Any -from .rendering_quality_cfg import RenderingQualityCfg -from .rendering_quality_presets import get_kit_rendering_preset +from .rendering_mode_cfg import RenderingModeCfg +from .rendering_mode_presets import get_kit_rendering_preset def apply_kit_rendering_preset(set_setting: Any, preset_name: str) -> None: @@ -20,7 +20,7 @@ def apply_kit_rendering_preset(set_setting: Any, preset_name: str) -> None: set_setting(key, value) -def apply_kit_rendering_quality_cfg(set_setting: Any, quality_cfg: RenderingQualityCfg) -> None: +def apply_kit_rendering_quality_cfg(set_setting: Any, quality_cfg: RenderingModeCfg) -> None: """Apply kit-specific quality fields.""" if quality_cfg.kit_rendering_preset: apply_kit_rendering_preset(set_setting, quality_cfg.kit_rendering_preset) @@ -52,7 +52,7 @@ def apply_kit_rendering_quality_cfg(set_setting: Any, quality_cfg: RenderingQual pass -def apply_newton_quality_cfg_to_visualizer_cfg(visualizer_cfg: Any, quality_cfg: RenderingQualityCfg) -> None: +def apply_newton_quality_cfg_to_visualizer_cfg(visualizer_cfg: Any, quality_cfg: RenderingModeCfg) -> None: """Apply Newton quality values to a visualizer cfg object.""" override_fields = { "newton_enable_shadows": "enable_shadows", @@ -68,7 +68,7 @@ def apply_newton_quality_cfg_to_visualizer_cfg(visualizer_cfg: Any, quality_cfg: setattr(visualizer_cfg, viz_field, value) -def apply_newton_quality_cfg_to_viewer(viewer: Any, quality_cfg: RenderingQualityCfg) -> None: +def apply_newton_quality_cfg_to_viewer(viewer: Any, quality_cfg: RenderingModeCfg) -> None: """Apply Newton quality values to a live Newton viewer renderer, if available.""" if viewer is None or not hasattr(viewer, "renderer"): return @@ -89,8 +89,8 @@ def apply_newton_quality_cfg_to_viewer(viewer: Any, quality_cfg: RenderingQualit def resolve_rendering_quality_name_for_visualizer_cfg(get_setting: Any, visualizer_cfg: Any) -> str | None: """Resolve effective quality profile name for a visualizer cfg.""" - cli_quality_explicit = bool(get_setting("/isaaclab/rendering/rendering_quality/explicit")) - cli_quality = get_setting("/isaaclab/rendering/rendering_quality") + cli_quality_explicit = bool(get_setting("/isaaclab/rendering/rendering_mode/explicit")) + cli_quality = get_setting("/isaaclab/rendering/rendering_mode") if cli_quality_explicit: return cli_quality if cli_quality else None quality_name = getattr(visualizer_cfg, "rendering_quality", None) @@ -98,8 +98,8 @@ def resolve_rendering_quality_name_for_visualizer_cfg(get_setting: Any, visualiz def resolve_rendering_quality_cfg( - quality_name: str | None, quality_cfgs: dict[str, RenderingQualityCfg], logger: Any -) -> RenderingQualityCfg | None: + quality_name: str | None, quality_cfgs: dict[str, RenderingModeCfg], logger: Any +) -> RenderingModeCfg | None: """Fetch quality cfg by name and log if missing.""" if not quality_name: return None @@ -117,7 +117,7 @@ def apply_quality_profile_to_visualizer_cfg( get_setting: Any, set_setting: Any, visualizer_cfg: Any, - quality_cfgs: dict[str, RenderingQualityCfg], + quality_cfgs: dict[str, RenderingModeCfg], logger: Any, ) -> None: """Resolve and apply quality profile to a visualizer config.""" @@ -138,7 +138,7 @@ def apply_runtime_quality_profile_to_visualizer( set_setting: Any, viz: Any, visualizer_quality_keys: dict[int, str | None], - quality_cfgs: dict[str, RenderingQualityCfg], + quality_cfgs: dict[str, RenderingModeCfg], logger: Any, force: bool = False, ) -> None: diff --git a/source/isaaclab/isaaclab/rendering/rendering_quality/__init__.py b/source/isaaclab/isaaclab/rendering/rendering_quality/__init__.py deleted file mode 100644 index 8ef7c4c6db2..00000000000 --- a/source/isaaclab/isaaclab/rendering/rendering_quality/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). -# All rights reserved. -# -# SPDX-License-Identifier: BSD-3-Clause - -"""Rendering quality config, presets, and application helpers.""" - -from .rendering_quality_cfg import RenderingQualityCfg -from .rendering_quality_presets import get_kit_rendering_preset - -__all__ = ["RenderingQualityCfg", "get_kit_rendering_preset"] diff --git a/source/isaaclab/isaaclab/sim/simulation_cfg.py b/source/isaaclab/isaaclab/sim/simulation_cfg.py index 312b20f100f..252525025a3 100644 --- a/source/isaaclab/isaaclab/sim/simulation_cfg.py +++ b/source/isaaclab/isaaclab/sim/simulation_cfg.py @@ -15,7 +15,7 @@ from isaaclab.physics import PhysicsCfg from isaaclab.rendering.renderers import RendererCfg -from isaaclab.rendering.rendering_quality.rendering_quality_cfg import RenderingQualityCfg +from isaaclab.rendering.rendering_mode.rendering_mode_cfg import RenderingModeCfg from isaaclab.rendering.visualizers import VisualizerCfg from isaaclab.sim.spawners.materials.physics_materials_cfg import RigidBodyMaterialCfg from isaaclab.utils import configclass @@ -93,10 +93,10 @@ class SimulationCfg: a different config (e.g., NewtonManagerCfg) to use a different physics backend. """ - rendering_quality_cfgs: dict[str, RenderingQualityCfg] = { - "performance": RenderingQualityCfg(kit_rendering_preset="performance"), - "balanced": RenderingQualityCfg(kit_rendering_preset="balanced"), - "high": RenderingQualityCfg(kit_rendering_preset="high"), + rendering_quality_cfgs: dict[str, RenderingModeCfg] = { + "performance": RenderingModeCfg(kit_rendering_preset="performance"), + "balanced": RenderingModeCfg(kit_rendering_preset="balanced"), + "quality": RenderingModeCfg(kit_rendering_preset="quality"), } """Named rendering quality profiles available to visualizers/renderers.""" diff --git a/source/isaaclab/test/sim/test_simulation_render_config.py b/source/isaaclab/test/sim/test_simulation_render_config.py index 42189536e64..fc8d4d31087 100644 --- a/source/isaaclab/test/sim/test_simulation_render_config.py +++ b/source/isaaclab/test/sim/test_simulation_render_config.py @@ -86,12 +86,12 @@ def test_render_cfg(): # @pytest.mark.isaacsim_ci def test_render_cfg_presets(): - """Test that quality presets are applied and can be overridden via RenderingQualityCfg.""" + """Test that quality presets are applied and can be overridden via RenderingModeCfg.""" # user-friendly field override dlss_mode = ("/rtx/post/dlss/execMode", 5) - rendering_modes = ["performance", "balanced", "high"] + rendering_modes = ["performance", "balanced", "quality"] for rendering_mode in rendering_modes: # Clear any existing simulation context before creating a new one @@ -100,7 +100,7 @@ def test_render_cfg_presets(): preset_dict = get_kit_rendering_preset(rendering_mode) profile_name = f"profile_{rendering_mode}" - quality_cfg = RenderingQualityCfg( + quality_cfg = RenderingModeCfg( kit_rendering_preset=rendering_mode, kit_dlss_mode=dlss_mode[1], ) @@ -137,8 +137,8 @@ def test_render_cfg_presets(): @pytest.mark.skip(reason="Timeline not stopped") # @pytest.mark.isaacsim_ci def test_rendering_quality_cfg_field_overrides(): - """Test that explicit RenderingQualityCfg fields map to carb settings.""" - quality_cfg = RenderingQualityCfg( + """Test that explicit RenderingModeCfg fields map to carb settings.""" + quality_cfg = RenderingModeCfg( kit_enable_translucency=True, kit_enable_reflections=True, kit_enable_global_illumination=True, From a7644ec7fea1da39d0fe3a93af185cf7238e9e3a Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Tue, 24 Feb 2026 23:53:56 +0000 Subject: [PATCH 13/34] reorg to reflect Piotrs change --- .../isaaclab/isaaclab/rendering/__init__.py | 17 ---------- .../isaaclab/rendering/renderers/__init__.py | 31 ------------------- .../rendering/renderers/renderer_cfg.py | 30 ------------------ .../rendering/renderers/warp_renderer_cfg.py | 21 ------------- .../rendering/visualizers/__init__.py | 24 -------------- .../rendering/visualizers/visualizer_cfg.py | 6 ---- .../rendering_mode/__init__.py | 0 .../rendering_mode/rendering_mode_cfg.py | 2 +- .../rendering_mode/rendering_mode_presets.py | 0 .../rendering_mode/rendering_mode_utils.py | 0 .../isaaclab/isaaclab/sim/simulation_cfg.py | 6 ++-- .../test/envs/test_env_rendering_logic.py | 4 +-- .../renderers/newton_warp_renderer.py | 1 + .../isaaclab_newton/visualizers/__init__.py | 13 ++++++++ .../visualizers/newton_visualizer.py | 0 .../visualizers/newton_visualizer_cfg.py | 0 .../visualizers/rerun_visualizer.py | 0 .../visualizers/rerun_visualizer_cfg.py | 0 .../renderers/rtx_renderer_cfg.py | 3 +- .../isaaclab_physx/visualizers/__init__.py} | 7 ++++- .../visualizers/kit_visualizer.py | 0 .../visualizers/kit_visualizer_cfg.py | 0 22 files changed, 27 insertions(+), 138 deletions(-) delete mode 100644 source/isaaclab/isaaclab/rendering/__init__.py delete mode 100644 source/isaaclab/isaaclab/rendering/renderers/__init__.py delete mode 100644 source/isaaclab/isaaclab/rendering/renderers/renderer_cfg.py delete mode 100644 source/isaaclab/isaaclab/rendering/renderers/warp_renderer_cfg.py delete mode 100644 source/isaaclab/isaaclab/rendering/visualizers/__init__.py delete mode 100644 source/isaaclab/isaaclab/rendering/visualizers/visualizer_cfg.py rename source/isaaclab/isaaclab/{rendering => }/rendering_mode/__init__.py (100%) rename source/isaaclab/isaaclab/{rendering => }/rendering_mode/rendering_mode_cfg.py (96%) rename source/isaaclab/isaaclab/{rendering => }/rendering_mode/rendering_mode_presets.py (100%) rename source/isaaclab/isaaclab/{rendering => }/rendering_mode/rendering_mode_utils.py (100%) create mode 100644 source/isaaclab_newton/isaaclab_newton/visualizers/__init__.py rename source/{isaaclab/isaaclab/rendering => isaaclab_newton/isaaclab_newton}/visualizers/newton_visualizer.py (100%) rename source/{isaaclab/isaaclab/rendering => isaaclab_newton/isaaclab_newton}/visualizers/newton_visualizer_cfg.py (100%) rename source/{isaaclab/isaaclab/rendering => isaaclab_newton/isaaclab_newton}/visualizers/rerun_visualizer.py (100%) rename source/{isaaclab/isaaclab/rendering => isaaclab_newton/isaaclab_newton}/visualizers/rerun_visualizer_cfg.py (100%) rename source/{isaaclab/isaaclab/rendering => isaaclab_physx/isaaclab_physx}/renderers/rtx_renderer_cfg.py (93%) rename source/{isaaclab/isaaclab/rendering/visualizers/visualizer.py => isaaclab_physx/isaaclab_physx/visualizers/__init__.py} (50%) rename source/{isaaclab/isaaclab/rendering => isaaclab_physx/isaaclab_physx}/visualizers/kit_visualizer.py (100%) rename source/{isaaclab/isaaclab/rendering => isaaclab_physx/isaaclab_physx}/visualizers/kit_visualizer_cfg.py (100%) diff --git a/source/isaaclab/isaaclab/rendering/__init__.py b/source/isaaclab/isaaclab/rendering/__init__.py deleted file mode 100644 index a870d3c5bb9..00000000000 --- a/source/isaaclab/isaaclab/rendering/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). -# All rights reserved. -# -# SPDX-License-Identifier: BSD-3-Clause - -"""Rendering domain package (renderers, visualizers, rendering mode).""" - -from .rendering_mode import RenderingModeCfg, get_kit_rendering_preset -from .renderers import RTXRendererCfg, RendererCfg, WarpRendererCfg - -__all__ = [ - "RenderingModeCfg", - "get_kit_rendering_preset", - "RendererCfg", - "RTXRendererCfg", - "WarpRendererCfg", -] diff --git a/source/isaaclab/isaaclab/rendering/renderers/__init__.py b/source/isaaclab/isaaclab/rendering/renderers/__init__.py deleted file mode 100644 index 61a297c4910..00000000000 --- a/source/isaaclab/isaaclab/rendering/renderers/__init__.py +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). -# All rights reserved. -# -# SPDX-License-Identifier: BSD-3-Clause - -"""Renderer runtime backends namespace. - -This package is intentionally created now as part of rendering-domain consolidation. -""" - -from __future__ import annotations - -from typing import Any - -from .renderer_cfg import RendererCfg -from .rtx_renderer_cfg import RTXRendererCfg -from .warp_renderer_cfg import WarpRendererCfg - -_RENDERER_REGISTRY: dict[str, Any] = {} - -__all__ = ["RendererCfg", "RTXRendererCfg", "WarpRendererCfg", "get_renderer_class"] - - -def get_renderer_class(name: str) -> Any | None: - """Get a renderer class by name (lazy-loaded). - - TODO: Wire real renderer runtime classes into this registry. - """ - if name in _RENDERER_REGISTRY: - return _RENDERER_REGISTRY[name] - return None diff --git a/source/isaaclab/isaaclab/rendering/renderers/renderer_cfg.py b/source/isaaclab/isaaclab/rendering/renderers/renderer_cfg.py deleted file mode 100644 index 6219f864025..00000000000 --- a/source/isaaclab/isaaclab/rendering/renderers/renderer_cfg.py +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). -# All rights reserved. -# -# SPDX-License-Identifier: BSD-3-Clause - -"""Stub renderer config classes. - -These are intentionally lightweight placeholders so the rendering domain can -stabilize around explicit renderer config names before full implementation. -""" - -from __future__ import annotations - -from isaaclab.utils import configclass - - -@configclass -class RendererCfg: - """Base configuration for all renderer backends. - - Note: - This is an abstract base class and should not be instantiated directly. - Use specific renderer configs like RTXRendererCfg or WarpRendererCfg. - """ - - renderer_type: str | None = None - """Type identifier (e.g., 'rtx', 'warp'). Must be overridden by subclasses.""" - - rendering_quality: str | None = None - """Name of the rendering quality profile to use with this renderer.""" diff --git a/source/isaaclab/isaaclab/rendering/renderers/warp_renderer_cfg.py b/source/isaaclab/isaaclab/rendering/renderers/warp_renderer_cfg.py deleted file mode 100644 index 5d870cd5e82..00000000000 --- a/source/isaaclab/isaaclab/rendering/renderers/warp_renderer_cfg.py +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). -# All rights reserved. -# -# SPDX-License-Identifier: BSD-3-Clause - -"""Stub config for future Warp/Newton renderer integration.""" - -from isaaclab.utils import configclass - -from .renderer_cfg import RendererCfg - - -@configclass -class WarpRendererCfg(RendererCfg): - """Stub config for future Warp/Newton renderer integration. - - TODO: Implement renderer lifecycle, sensor/render-product routing, and - backend-specific settings application. - """ - - renderer_type: str = "warp" diff --git a/source/isaaclab/isaaclab/rendering/visualizers/__init__.py b/source/isaaclab/isaaclab/rendering/visualizers/__init__.py deleted file mode 100644 index edbb4a8ba29..00000000000 --- a/source/isaaclab/isaaclab/rendering/visualizers/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). -# All rights reserved. -# -# SPDX-License-Identifier: BSD-3-Clause - -"""Rendering-domain visualizer namespace.""" - -from isaaclab.visualizers import ( - KitVisualizerCfg, - NewtonVisualizerCfg, - RerunVisualizerCfg, - Visualizer, - VisualizerCfg, - get_visualizer_class, -) - -__all__ = [ - "Visualizer", - "VisualizerCfg", - "NewtonVisualizerCfg", - "KitVisualizerCfg", - "RerunVisualizerCfg", - "get_visualizer_class", -] diff --git a/source/isaaclab/isaaclab/rendering/visualizers/visualizer_cfg.py b/source/isaaclab/isaaclab/rendering/visualizers/visualizer_cfg.py deleted file mode 100644 index 85bce562dee..00000000000 --- a/source/isaaclab/isaaclab/rendering/visualizers/visualizer_cfg.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). -# All rights reserved. -# -# SPDX-License-Identifier: BSD-3-Clause - -from isaaclab.visualizers.visualizer_cfg import * # noqa: F401, F403 diff --git a/source/isaaclab/isaaclab/rendering/rendering_mode/__init__.py b/source/isaaclab/isaaclab/rendering_mode/__init__.py similarity index 100% rename from source/isaaclab/isaaclab/rendering/rendering_mode/__init__.py rename to source/isaaclab/isaaclab/rendering_mode/__init__.py diff --git a/source/isaaclab/isaaclab/rendering/rendering_mode/rendering_mode_cfg.py b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py similarity index 96% rename from source/isaaclab/isaaclab/rendering/rendering_mode/rendering_mode_cfg.py rename to source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py index 830861035aa..a36be301290 100644 --- a/source/isaaclab/isaaclab/rendering/rendering_mode/rendering_mode_cfg.py +++ b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py @@ -22,7 +22,7 @@ class RenderingModeCfg: kit_rendering_preset: Literal["performance", "balanced", "quality"] | None = None """Optional built-in preset profile. - Preset values are defined in 'isaaclab.rendering.rendering_mode.rendering_mode_presets'. + Preset values are defined in 'isaaclab.rendering_mode.rendering_mode_presets'. """ kit_enable_translucency: bool | None = None diff --git a/source/isaaclab/isaaclab/rendering/rendering_mode/rendering_mode_presets.py b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_presets.py similarity index 100% rename from source/isaaclab/isaaclab/rendering/rendering_mode/rendering_mode_presets.py rename to source/isaaclab/isaaclab/rendering_mode/rendering_mode_presets.py diff --git a/source/isaaclab/isaaclab/rendering/rendering_mode/rendering_mode_utils.py b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py similarity index 100% rename from source/isaaclab/isaaclab/rendering/rendering_mode/rendering_mode_utils.py rename to source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py diff --git a/source/isaaclab/isaaclab/sim/simulation_cfg.py b/source/isaaclab/isaaclab/sim/simulation_cfg.py index 252525025a3..a2360df32d0 100644 --- a/source/isaaclab/isaaclab/sim/simulation_cfg.py +++ b/source/isaaclab/isaaclab/sim/simulation_cfg.py @@ -14,9 +14,9 @@ from typing import Literal from isaaclab.physics import PhysicsCfg -from isaaclab.rendering.renderers import RendererCfg -from isaaclab.rendering.rendering_mode.rendering_mode_cfg import RenderingModeCfg -from isaaclab.rendering.visualizers import VisualizerCfg +from isaaclab.renderers import RendererCfg +from isaaclab.rendering_mode.rendering_mode_cfg import RenderingModeCfg +from isaaclab.visualizers import VisualizerCfg from isaaclab.sim.spawners.materials.physics_materials_cfg import RigidBodyMaterialCfg from isaaclab.utils import configclass diff --git a/source/isaaclab/test/envs/test_env_rendering_logic.py b/source/isaaclab/test/envs/test_env_rendering_logic.py index 923aa86e737..a645a6215ee 100644 --- a/source/isaaclab/test/envs/test_env_rendering_logic.py +++ b/source/isaaclab/test/envs/test_env_rendering_logic.py @@ -27,8 +27,8 @@ ManagerBasedRLEnv, ManagerBasedRLEnvCfg, ) -from isaaclab.rendering.visualizers.kit_visualizer import KitVisualizer -from isaaclab.rendering.visualizers.kit_visualizer_cfg import KitVisualizerCfg +from isaaclab_physx.visualizers.kit_visualizer import KitVisualizer +from isaaclab_physx.visualizers.kit_visualizer_cfg import KitVisualizerCfg from isaaclab.scene import InteractiveSceneCfg from isaaclab.sim import SimulationCfg, SimulationContext from isaaclab.utils import configclass diff --git a/source/isaaclab_newton/isaaclab_newton/renderers/newton_warp_renderer.py b/source/isaaclab_newton/isaaclab_newton/renderers/newton_warp_renderer.py index 6a616d3b8c4..7778da10bf7 100644 --- a/source/isaaclab_newton/isaaclab_newton/renderers/newton_warp_renderer.py +++ b/source/isaaclab_newton/isaaclab_newton/renderers/newton_warp_renderer.py @@ -19,6 +19,7 @@ from isaaclab.renderers import BaseRenderer from isaaclab.sim import SimulationContext from isaaclab.utils.math import convert_camera_frame_orientation_convention +from isaaclab.visualizers import VisualizerCfg from .newton_warp_renderer_cfg import NewtonWarpRendererCfg diff --git a/source/isaaclab_newton/isaaclab_newton/visualizers/__init__.py b/source/isaaclab_newton/isaaclab_newton/visualizers/__init__.py new file mode 100644 index 00000000000..acf90d731cf --- /dev/null +++ b/source/isaaclab_newton/isaaclab_newton/visualizers/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Newton-backed visualizer implementations.""" + +from .newton_visualizer import NewtonVisualizer +from .newton_visualizer_cfg import NewtonVisualizerCfg +from .rerun_visualizer import RerunVisualizer +from .rerun_visualizer_cfg import RerunVisualizerCfg + +__all__ = ["NewtonVisualizer", "NewtonVisualizerCfg", "RerunVisualizer", "RerunVisualizerCfg"] diff --git a/source/isaaclab/isaaclab/rendering/visualizers/newton_visualizer.py b/source/isaaclab_newton/isaaclab_newton/visualizers/newton_visualizer.py similarity index 100% rename from source/isaaclab/isaaclab/rendering/visualizers/newton_visualizer.py rename to source/isaaclab_newton/isaaclab_newton/visualizers/newton_visualizer.py diff --git a/source/isaaclab/isaaclab/rendering/visualizers/newton_visualizer_cfg.py b/source/isaaclab_newton/isaaclab_newton/visualizers/newton_visualizer_cfg.py similarity index 100% rename from source/isaaclab/isaaclab/rendering/visualizers/newton_visualizer_cfg.py rename to source/isaaclab_newton/isaaclab_newton/visualizers/newton_visualizer_cfg.py diff --git a/source/isaaclab/isaaclab/rendering/visualizers/rerun_visualizer.py b/source/isaaclab_newton/isaaclab_newton/visualizers/rerun_visualizer.py similarity index 100% rename from source/isaaclab/isaaclab/rendering/visualizers/rerun_visualizer.py rename to source/isaaclab_newton/isaaclab_newton/visualizers/rerun_visualizer.py diff --git a/source/isaaclab/isaaclab/rendering/visualizers/rerun_visualizer_cfg.py b/source/isaaclab_newton/isaaclab_newton/visualizers/rerun_visualizer_cfg.py similarity index 100% rename from source/isaaclab/isaaclab/rendering/visualizers/rerun_visualizer_cfg.py rename to source/isaaclab_newton/isaaclab_newton/visualizers/rerun_visualizer_cfg.py diff --git a/source/isaaclab/isaaclab/rendering/renderers/rtx_renderer_cfg.py b/source/isaaclab_physx/isaaclab_physx/renderers/rtx_renderer_cfg.py similarity index 93% rename from source/isaaclab/isaaclab/rendering/renderers/rtx_renderer_cfg.py rename to source/isaaclab_physx/isaaclab_physx/renderers/rtx_renderer_cfg.py index 137a74b7bf0..54990b0c764 100644 --- a/source/isaaclab/isaaclab/rendering/renderers/rtx_renderer_cfg.py +++ b/source/isaaclab_physx/isaaclab_physx/renderers/rtx_renderer_cfg.py @@ -5,10 +5,9 @@ """Stub config for future RTX renderer integration.""" +from isaaclab.renderers import RendererCfg from isaaclab.utils import configclass -from .renderer_cfg import RendererCfg - @configclass class RTXRendererCfg(RendererCfg): diff --git a/source/isaaclab/isaaclab/rendering/visualizers/visualizer.py b/source/isaaclab_physx/isaaclab_physx/visualizers/__init__.py similarity index 50% rename from source/isaaclab/isaaclab/rendering/visualizers/visualizer.py rename to source/isaaclab_physx/isaaclab_physx/visualizers/__init__.py index 10a836fa8c8..c831ff4bf28 100644 --- a/source/isaaclab/isaaclab/rendering/visualizers/visualizer.py +++ b/source/isaaclab_physx/isaaclab_physx/visualizers/__init__.py @@ -3,4 +3,9 @@ # # SPDX-License-Identifier: BSD-3-Clause -from isaaclab.visualizers.visualizer import * # noqa: F401, F403 +"""PhysX-backed visualizer implementations.""" + +from .kit_visualizer import KitVisualizer +from .kit_visualizer_cfg import KitVisualizerCfg + +__all__ = ["KitVisualizer", "KitVisualizerCfg"] diff --git a/source/isaaclab/isaaclab/rendering/visualizers/kit_visualizer.py b/source/isaaclab_physx/isaaclab_physx/visualizers/kit_visualizer.py similarity index 100% rename from source/isaaclab/isaaclab/rendering/visualizers/kit_visualizer.py rename to source/isaaclab_physx/isaaclab_physx/visualizers/kit_visualizer.py diff --git a/source/isaaclab/isaaclab/rendering/visualizers/kit_visualizer_cfg.py b/source/isaaclab_physx/isaaclab_physx/visualizers/kit_visualizer_cfg.py similarity index 100% rename from source/isaaclab/isaaclab/rendering/visualizers/kit_visualizer_cfg.py rename to source/isaaclab_physx/isaaclab_physx/visualizers/kit_visualizer_cfg.py From 7d6a8e7d58caa438200e842e60a6052daf6b4094 Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Tue, 24 Feb 2026 23:59:31 +0000 Subject: [PATCH 14/34] rename field name --- docs/source/how-to/configure_rendering.rst | 5 ----- .../isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py | 2 +- .../isaaclab/rendering_mode/rendering_mode_utils.py | 4 ++-- source/isaaclab/isaaclab/sim/simulation_cfg.py | 6 +++--- 4 files changed, 6 insertions(+), 11 deletions(-) diff --git a/docs/source/how-to/configure_rendering.rst b/docs/source/how-to/configure_rendering.rst index a3348d10fe5..a295511edc2 100644 --- a/docs/source/how-to/configure_rendering.rst +++ b/docs/source/how-to/configure_rendering.rst @@ -28,11 +28,6 @@ Rendering quality can be selected in 2 ways. from isaaclab.visualizers import KitVisualizerCfg sim_cfg = sim_utils.SimulationCfg( - rendering_quality_cfgs={ - "performance": sim_utils.RenderingQualityCfg(kit_rendering_preset="performance"), - "balanced": sim_utils.RenderingQualityCfg(kit_rendering_preset="balanced"), - "high": sim_utils.RenderingQualityCfg(kit_rendering_preset="high"), - }, visualizer_cfgs=[ KitVisualizerCfg( rendering_quality="performance", diff --git a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py index a36be301290..717f2129809 100644 --- a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py +++ b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py @@ -19,7 +19,7 @@ class RenderingModeCfg: - 'newton_*' for Newton visual quality controls """ - kit_rendering_preset: Literal["performance", "balanced", "quality"] | None = None + rendering_mode_preset: Literal["performance", "balanced", "quality"] | None = None """Optional built-in preset profile. Preset values are defined in 'isaaclab.rendering_mode.rendering_mode_presets'. diff --git a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py index 2b6aef5f124..7cc76002a72 100644 --- a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py +++ b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py @@ -22,8 +22,8 @@ def apply_kit_rendering_preset(set_setting: Any, preset_name: str) -> None: def apply_kit_rendering_quality_cfg(set_setting: Any, quality_cfg: RenderingModeCfg) -> None: """Apply kit-specific quality fields.""" - if quality_cfg.kit_rendering_preset: - apply_kit_rendering_preset(set_setting, quality_cfg.kit_rendering_preset) + if quality_cfg.rendering_mode_preset: + apply_kit_rendering_preset(set_setting, quality_cfg.rendering_mode_preset) field_to_carb = { "kit_enable_translucency": "/rtx/translucency/enabled", diff --git a/source/isaaclab/isaaclab/sim/simulation_cfg.py b/source/isaaclab/isaaclab/sim/simulation_cfg.py index a2360df32d0..c87c6df61f2 100644 --- a/source/isaaclab/isaaclab/sim/simulation_cfg.py +++ b/source/isaaclab/isaaclab/sim/simulation_cfg.py @@ -94,9 +94,9 @@ class SimulationCfg: """ rendering_quality_cfgs: dict[str, RenderingModeCfg] = { - "performance": RenderingModeCfg(kit_rendering_preset="performance"), - "balanced": RenderingModeCfg(kit_rendering_preset="balanced"), - "quality": RenderingModeCfg(kit_rendering_preset="quality"), + "performance": RenderingModeCfg(rendering_mode_preset="performance"), + "balanced": RenderingModeCfg(rendering_mode_preset="balanced"), + "quality": RenderingModeCfg(rendering_mode_preset="quality"), } """Named rendering quality profiles available to visualizers/renderers.""" From 48a43431d0f229cb87719a8975770fbc36424b2f Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Tue, 24 Feb 2026 23:59:40 +0000 Subject: [PATCH 15/34] rename field name --- docs/source/how-to/configure_rendering.rst | 2 +- source/isaaclab/test/sim/test_simulation_render_config.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/how-to/configure_rendering.rst b/docs/source/how-to/configure_rendering.rst index a295511edc2..d0ef9be8768 100644 --- a/docs/source/how-to/configure_rendering.rst +++ b/docs/source/how-to/configure_rendering.rst @@ -86,7 +86,7 @@ There are 2 ways to provide settings that overwrite presets. .. code-block:: python quality_cfg = sim_utils.RenderingQualityCfg( - kit_rendering_preset="performance", + rendering_mode_preset="performance", # explicit field overrides kit_enable_translucency=True, # defaults to False in performance mode kit_enable_reflections=True, # defaults to False in performance mode diff --git a/source/isaaclab/test/sim/test_simulation_render_config.py b/source/isaaclab/test/sim/test_simulation_render_config.py index fc8d4d31087..5a7461ca982 100644 --- a/source/isaaclab/test/sim/test_simulation_render_config.py +++ b/source/isaaclab/test/sim/test_simulation_render_config.py @@ -101,7 +101,7 @@ def test_render_cfg_presets(): profile_name = f"profile_{rendering_mode}" quality_cfg = RenderingModeCfg( - kit_rendering_preset=rendering_mode, + rendering_mode_preset=rendering_mode, kit_dlss_mode=dlss_mode[1], ) cfg = SimulationCfg( From b4996c29c1b2607a7b0456f077ea3c610335dcbf Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Wed, 25 Feb 2026 00:03:12 +0000 Subject: [PATCH 16/34] update docs --- docs/source/how-to/configure_rendering.rst | 105 ++++++++---------- .../isaaclab/isaaclab/sim/simulation_cfg.py | 2 +- .../test/envs/test_env_rendering_logic.py | 2 - .../test/sim/test_simulation_render_config.py | 1 + 4 files changed, 46 insertions(+), 64 deletions(-) diff --git a/docs/source/how-to/configure_rendering.rst b/docs/source/how-to/configure_rendering.rst index d0ef9be8768..d83fc17d77f 100644 --- a/docs/source/how-to/configure_rendering.rst +++ b/docs/source/how-to/configure_rendering.rst @@ -14,51 +14,48 @@ Isaac Lab's RTX renderer offers 3 preset rendering modes: performance, balanced, You can select a mode via a command line argument or from within a script, and customize settings as needed. Adjust and fine-tune rendering to achieve the ideal balance for your workflow. -Selecting a Rendering Quality Profile -------------------------------------- +Selecting a Rendering Mode Profile +---------------------------------- -Rendering quality can be selected in 2 ways. +Rendering mode can be selected in two ways: -1. setting ``rendering_quality`` in a visualizer config, which selects an entry from - :attr:`~sim.SimulationCfg.rendering_quality_cfgs` +1. Set ``rendering_quality`` in a visualizer config, which selects an entry from + :attr:`~sim.SimulationCfg.rendering_quality_cfgs`. .. code-block:: python - import isaaclab.sim as sim_utils - from isaaclab.visualizers import KitVisualizerCfg + import isaaclab.sim as sim_utils + from isaaclab_physx.visualizers import KitVisualizerCfg - sim_cfg = sim_utils.SimulationCfg( - visualizer_cfgs=[ - KitVisualizerCfg( - rendering_quality="performance", - ), - ], - ) + sim_cfg = sim_utils.SimulationCfg( + visualizer_cfgs=[ + KitVisualizerCfg( + rendering_quality="performance", + ), + ], + ) -2. using the ``--rendering_quality`` CLI argument, which takes precedence over - ``visualizer_cfg.rendering_quality`` +2. Use the ``--rendering_mode`` CLI argument, which takes precedence over + ``visualizer_cfg.rendering_quality``. .. code-block:: bash - ./isaaclab.sh -p scripts/tutorials/00_sim/set_rendering_mode.py --rendering_quality {performance/balanced/high} - + ./isaaclab.sh -p scripts/tutorials/00_sim/set_rendering_mode.py --rendering_mode {performance/balanced/quality} Notes: * If ``rendering_quality=None`` for a visualizer, Isaac Lab does not apply rendering overrides for that visualizer, and backend/native defaults (for Kit, USD-authored settings) are used. -* ``--rendering_mode`` is deprecated. If used, it maps to ``--rendering_quality`` - (legacy ``quality`` maps to ``high``). - +* ``--rendering_mode`` is the supported CLI entry point. Example renders from the ``set_rendering_mode.py`` script. -To help assess rendering, the example scene includes some reflections, translucency, direct and ambient lighting, and several material types. +To help assess rendering, the example scene includes reflections, translucency, direct and ambient lighting, and several material types. -- High Mode +- Quality Mode .. image:: ../_static/how-to/howto_rendering_example_quality.jpg :width: 100% - :alt: High Rendering Mode Example + :alt: Quality Rendering Mode Example - Balanced Mode @@ -72,25 +69,26 @@ To help assess rendering, the example scene includes some reflections, transluce :width: 100% :alt: Performance Rendering Mode Example -Overwriting Specific Rendering Quality Settings ------------------------------------------------ +Overwriting Specific Rendering Settings +--------------------------------------- -Preset rendering settings can be overwritten via :class:`~sim.RenderingQualityCfg`. +Preset rendering settings can be overwritten via :class:`~sim.RenderingModeCfg`. -There are 2 ways to provide settings that overwrite presets. +There are two ways to provide settings that overwrite presets: -1. :class:`~sim.RenderingQualityCfg` supports overwriting specific settings via explicit +1. :class:`~sim.RenderingModeCfg` supports overwriting specific settings via explicit ``kit_*`` fields that map to underlying RTX settings. - For example: .. code-block:: python - quality_cfg = sim_utils.RenderingQualityCfg( - rendering_mode_preset="performance", - # explicit field overrides - kit_enable_translucency=True, # defaults to False in performance mode - kit_enable_reflections=True, # defaults to False in performance mode - kit_dlss_mode=3, # defaults to 0 in performance mode + import isaaclab.sim as sim_utils + + mode_cfg = sim_utils.RenderingModeCfg( + rendering_mode_preset="performance", + # explicit field overrides + kit_enable_translucency=True, # defaults to False in performance mode + kit_enable_reflections=True, # defaults to False in performance mode + kit_dlss_mode=3, # defaults to 0 in performance mode ) List of Kit settings. @@ -104,40 +102,26 @@ There are 2 ways to provide settings that overwrite presets. +------------------------------------+-------------------------------------------------------------------------+ | kit_enable_reflections | Bool. Enables reflections at the cost of some performance. | +------------------------------------+-------------------------------------------------------------------------+ - | kit_enable_global_illumination | Bool. Enables Diffused Global Illumination at the cost of some | + | kit_enable_global_illumination | Bool. Enables Diffuse Global Illumination at the cost of some | | | performance. | +------------------------------------+-------------------------------------------------------------------------+ | kit_antialiasing_mode | Literal["Off", "FXAA", "DLSS", "TAA", "DLAA"]. | - | | | - | | DLSS: Boosts performance by using AI to output higher resolution frames | - | | from a lower resolution input. DLSS samples multiple lower resolution | - | | images and uses motion data and feedback from prior frames to reconstruct| - | | native quality images. | - | | DLAA: Provides higher image quality with an AI-based anti-aliasing | - | | technique. DLAA uses the same Super Resolution technology developed for | - | | DLSS, reconstructing a native resolution image to maximize image quality.| + | | DLSS boosts performance by reconstructing higher-resolution frames. | + | | DLAA prioritizes image quality using the same SR technology as DLSS. | +------------------------------------+-------------------------------------------------------------------------+ - | kit_enable_dlssg | Bool. Enables the use of DLSS-G. DLSS Frame Generation boosts | - | | performance by using AI to generate more frames. This feature | - | | requires an Ada Lovelace architecture GPU and can hurt performance | - | | due to additional thread-related activities. | + | kit_enable_dlssg | Bool. Enables DLSS-G frame generation (Ada Lovelace GPU required). | +------------------------------------+-------------------------------------------------------------------------+ - | kit_enable_dl_denoiser | Bool. Enables the use of a DL denoiser, which improves render quality | - | | at the cost of performance. | + | kit_enable_dl_denoiser | Bool. Enables DL denoiser (quality up, performance down). | +------------------------------------+-------------------------------------------------------------------------+ - | kit_dlss_mode | Literal[0, 1, 2, 3]. For DLSS anti-aliasing, selects the | - | | performance/quality tradeoff mode: 0 (Performance), 1 (Balanced), | - | | 2 (Quality), 3 (Auto). | + | kit_dlss_mode | Literal[0, 1, 2, 3] = Performance, Balanced, Quality, Auto. | +------------------------------------+-------------------------------------------------------------------------+ - | kit_enable_direct_lighting | Bool. Enable direct light contributions from lights. | + | kit_enable_direct_lighting | Bool. Enables direct light contributions from lights. | +------------------------------------+-------------------------------------------------------------------------+ - | kit_samples_per_pixel | Int. Defines direct lighting samples per pixel. Higher values increase | - | | quality at the cost of performance. | + | kit_samples_per_pixel | Int. Direct lighting samples-per-pixel (higher = better, slower). | +------------------------------------+-------------------------------------------------------------------------+ - | kit_enable_shadows | Bool. Enables shadows at the cost of performance. When disabled, lights | - | | will not cast shadows. | + | kit_enable_shadows | Bool. Enables shadows at performance cost. | +------------------------------------+-------------------------------------------------------------------------+ - | kit_enable_ambient_occlusion | Bool. Enables ambient occlusion at the cost of some performance. | + | kit_enable_ambient_occlusion | Bool. Enables ambient occlusion at performance cost. | +------------------------------------+-------------------------------------------------------------------------+ @@ -162,7 +146,6 @@ There are 2 ways to provide settings that overwrite presets. } ) - Current Limitations ------------------- diff --git a/source/isaaclab/isaaclab/sim/simulation_cfg.py b/source/isaaclab/isaaclab/sim/simulation_cfg.py index c87c6df61f2..a73ba325548 100644 --- a/source/isaaclab/isaaclab/sim/simulation_cfg.py +++ b/source/isaaclab/isaaclab/sim/simulation_cfg.py @@ -16,9 +16,9 @@ from isaaclab.physics import PhysicsCfg from isaaclab.renderers import RendererCfg from isaaclab.rendering_mode.rendering_mode_cfg import RenderingModeCfg -from isaaclab.visualizers import VisualizerCfg from isaaclab.sim.spawners.materials.physics_materials_cfg import RigidBodyMaterialCfg from isaaclab.utils import configclass +from isaaclab.visualizers import VisualizerCfg @configclass diff --git a/source/isaaclab/test/envs/test_env_rendering_logic.py b/source/isaaclab/test/envs/test_env_rendering_logic.py index a645a6215ee..3a553116510 100644 --- a/source/isaaclab/test/envs/test_env_rendering_logic.py +++ b/source/isaaclab/test/envs/test_env_rendering_logic.py @@ -27,8 +27,6 @@ ManagerBasedRLEnv, ManagerBasedRLEnvCfg, ) -from isaaclab_physx.visualizers.kit_visualizer import KitVisualizer -from isaaclab_physx.visualizers.kit_visualizer_cfg import KitVisualizerCfg from isaaclab.scene import InteractiveSceneCfg from isaaclab.sim import SimulationCfg, SimulationContext from isaaclab.utils import configclass diff --git a/source/isaaclab/test/sim/test_simulation_render_config.py b/source/isaaclab/test/sim/test_simulation_render_config.py index 5a7461ca982..67ee0a43cfb 100644 --- a/source/isaaclab/test/sim/test_simulation_render_config.py +++ b/source/isaaclab/test/sim/test_simulation_render_config.py @@ -15,6 +15,7 @@ """Rest everything follows.""" import pytest +from isaaclab_physx.visualizers import KitVisualizerCfg from isaaclab.app.settings_manager import get_settings_manager from isaaclab.sim.simulation_cfg import RenderCfg, SimulationCfg From 0ca6864de02638a0ed26790d0678ea8cfe73c03d Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Wed, 25 Feb 2026 00:09:42 +0000 Subject: [PATCH 17/34] complete renaming --- docs/source/how-to/configure_rendering.rst | 10 +- .../rendering_mode/rendering_mode_utils.py | 136 +++++++++--------- .../isaaclab/isaaclab/sim/simulation_cfg.py | 4 +- .../isaaclab/sim/simulation_context.py | 20 +-- .../test/sim/test_simulation_render_config.py | 16 +-- .../renderers/rtx_renderer_cfg.py | 2 +- 6 files changed, 94 insertions(+), 94 deletions(-) diff --git a/docs/source/how-to/configure_rendering.rst b/docs/source/how-to/configure_rendering.rst index d83fc17d77f..4f2dc1e1b73 100644 --- a/docs/source/how-to/configure_rendering.rst +++ b/docs/source/how-to/configure_rendering.rst @@ -19,8 +19,8 @@ Selecting a Rendering Mode Profile Rendering mode can be selected in two ways: -1. Set ``rendering_quality`` in a visualizer config, which selects an entry from - :attr:`~sim.SimulationCfg.rendering_quality_cfgs`. +1. Set the visualizer profile selector field ``rendering_mode``, which selects an entry from + :attr:`~sim.SimulationCfg.rendering_mode_cfgs`. .. code-block:: python @@ -30,13 +30,13 @@ Rendering mode can be selected in two ways: sim_cfg = sim_utils.SimulationCfg( visualizer_cfgs=[ KitVisualizerCfg( - rendering_quality="performance", + rendering_mode="performance", ), ], ) 2. Use the ``--rendering_mode`` CLI argument, which takes precedence over - ``visualizer_cfg.rendering_quality``. + ``visualizer_cfg.rendering_mode``. .. code-block:: bash @@ -44,7 +44,7 @@ Rendering mode can be selected in two ways: Notes: -* If ``rendering_quality=None`` for a visualizer, Isaac Lab does not apply rendering overrides +* If ``rendering_mode=None`` for a visualizer, Isaac Lab does not apply rendering overrides for that visualizer, and backend/native defaults (for Kit, USD-authored settings) are used. * ``--rendering_mode`` is the supported CLI entry point. diff --git a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py index 7cc76002a72..ed9229fcf30 100644 --- a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py +++ b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py @@ -3,7 +3,7 @@ # # SPDX-License-Identifier: BSD-3-Clause -"""Utility helpers for applying rendering quality profiles.""" +"""Utility helpers for applying rendering mode profiles.""" from __future__ import annotations @@ -20,10 +20,10 @@ def apply_kit_rendering_preset(set_setting: Any, preset_name: str) -> None: set_setting(key, value) -def apply_kit_rendering_quality_cfg(set_setting: Any, quality_cfg: RenderingModeCfg) -> None: - """Apply kit-specific quality fields.""" - if quality_cfg.rendering_mode_preset: - apply_kit_rendering_preset(set_setting, quality_cfg.rendering_mode_preset) +def apply_kit_rendering_mode_cfg(set_setting: Any, mode_cfg: RenderingModeCfg) -> None: + """Apply kit-specific rendering mode fields.""" + if mode_cfg.rendering_mode_preset: + apply_kit_rendering_preset(set_setting, mode_cfg.rendering_mode_preset) field_to_carb = { "kit_enable_translucency": "/rtx/translucency/enabled", @@ -39,21 +39,21 @@ def apply_kit_rendering_quality_cfg(set_setting: Any, quality_cfg: RenderingMode "kit_dome_light_upper_lower_strategy": "/rtx/domeLight/upperLowerStrategy", } for field_name, carb_key in field_to_carb.items(): - value = getattr(quality_cfg, field_name, None) + value = getattr(mode_cfg, field_name, None) if value is not None: set_setting(carb_key, value) - if quality_cfg.kit_antialiasing_mode is not None: + if mode_cfg.kit_antialiasing_mode is not None: try: import omni.replicator.core as rep - rep.settings.set_render_rtx_realtime(antialiasing=quality_cfg.kit_antialiasing_mode) + rep.settings.set_render_rtx_realtime(antialiasing=mode_cfg.kit_antialiasing_mode) except Exception: pass -def apply_newton_quality_cfg_to_visualizer_cfg(visualizer_cfg: Any, quality_cfg: RenderingModeCfg) -> None: - """Apply Newton quality values to a visualizer cfg object.""" +def apply_newton_mode_cfg_to_visualizer_cfg(visualizer_cfg: Any, mode_cfg: RenderingModeCfg) -> None: + """Apply Newton rendering mode values to a visualizer cfg object.""" override_fields = { "newton_enable_shadows": "enable_shadows", "newton_enable_sky": "enable_sky", @@ -62,102 +62,102 @@ def apply_newton_quality_cfg_to_visualizer_cfg(visualizer_cfg: Any, quality_cfg: "newton_sky_lower_color": "sky_lower_color", "newton_light_color": "light_color", } - for quality_field, viz_field in override_fields.items(): - value = getattr(quality_cfg, quality_field, None) + for mode_field, viz_field in override_fields.items(): + value = getattr(mode_cfg, mode_field, None) if value is not None and hasattr(visualizer_cfg, viz_field): setattr(visualizer_cfg, viz_field, value) -def apply_newton_quality_cfg_to_viewer(viewer: Any, quality_cfg: RenderingModeCfg) -> None: - """Apply Newton quality values to a live Newton viewer renderer, if available.""" +def apply_newton_mode_cfg_to_viewer(viewer: Any, mode_cfg: RenderingModeCfg) -> None: + """Apply Newton rendering mode values to a live Newton viewer renderer, if available.""" if viewer is None or not hasattr(viewer, "renderer"): return - if quality_cfg.newton_enable_shadows is not None: - viewer.renderer.draw_shadows = quality_cfg.newton_enable_shadows - if quality_cfg.newton_enable_sky is not None: - viewer.renderer.draw_sky = quality_cfg.newton_enable_sky - if quality_cfg.newton_enable_wireframe is not None: - viewer.renderer.draw_wireframe = quality_cfg.newton_enable_wireframe - if quality_cfg.newton_sky_upper_color is not None: - viewer.renderer.sky_upper = quality_cfg.newton_sky_upper_color - if quality_cfg.newton_sky_lower_color is not None: - viewer.renderer.sky_lower = quality_cfg.newton_sky_lower_color - if quality_cfg.newton_light_color is not None: - viewer.renderer._light_color = quality_cfg.newton_light_color - - -def resolve_rendering_quality_name_for_visualizer_cfg(get_setting: Any, visualizer_cfg: Any) -> str | None: - """Resolve effective quality profile name for a visualizer cfg.""" - cli_quality_explicit = bool(get_setting("/isaaclab/rendering/rendering_mode/explicit")) - cli_quality = get_setting("/isaaclab/rendering/rendering_mode") - if cli_quality_explicit: - return cli_quality if cli_quality else None - quality_name = getattr(visualizer_cfg, "rendering_quality", None) - return quality_name if quality_name else None - - -def resolve_rendering_quality_cfg( - quality_name: str | None, quality_cfgs: dict[str, RenderingModeCfg], logger: Any + if mode_cfg.newton_enable_shadows is not None: + viewer.renderer.draw_shadows = mode_cfg.newton_enable_shadows + if mode_cfg.newton_enable_sky is not None: + viewer.renderer.draw_sky = mode_cfg.newton_enable_sky + if mode_cfg.newton_enable_wireframe is not None: + viewer.renderer.draw_wireframe = mode_cfg.newton_enable_wireframe + if mode_cfg.newton_sky_upper_color is not None: + viewer.renderer.sky_upper = mode_cfg.newton_sky_upper_color + if mode_cfg.newton_sky_lower_color is not None: + viewer.renderer.sky_lower = mode_cfg.newton_sky_lower_color + if mode_cfg.newton_light_color is not None: + viewer.renderer._light_color = mode_cfg.newton_light_color + + +def resolve_rendering_mode_name_for_visualizer_cfg(get_setting: Any, visualizer_cfg: Any) -> str | None: + """Resolve effective rendering mode profile name for a visualizer cfg.""" + cli_mode_explicit = bool(get_setting("/isaaclab/rendering/rendering_mode/explicit")) + cli_mode = get_setting("/isaaclab/rendering/rendering_mode") + if cli_mode_explicit: + return cli_mode if cli_mode else None + mode_name = getattr(visualizer_cfg, "rendering_mode", None) + return mode_name if mode_name else None + + +def resolve_rendering_mode_cfg( + mode_name: str | None, mode_cfgs: dict[str, RenderingModeCfg], logger: Any ) -> RenderingModeCfg | None: - """Fetch quality cfg by name and log if missing.""" - if not quality_name: + """Fetch rendering mode cfg by name and log if missing.""" + if not mode_name: return None - quality_cfg = quality_cfgs.get(quality_name) - if quality_cfg is None: + mode_cfg = mode_cfgs.get(mode_name) + if mode_cfg is None: logger.warning( - "[SimulationContext] Rendering quality '%s' not found in SimulationCfg.rendering_quality_cfgs.", - quality_name, + "[SimulationContext] Rendering mode '%s' not found in SimulationCfg.rendering_mode_cfgs.", + mode_name, ) return None - return quality_cfg + return mode_cfg -def apply_quality_profile_to_visualizer_cfg( +def apply_mode_profile_to_visualizer_cfg( get_setting: Any, set_setting: Any, visualizer_cfg: Any, - quality_cfgs: dict[str, RenderingModeCfg], + mode_cfgs: dict[str, RenderingModeCfg], logger: Any, ) -> None: - """Resolve and apply quality profile to a visualizer config.""" - quality_name = resolve_rendering_quality_name_for_visualizer_cfg(get_setting, visualizer_cfg) - quality_cfg = resolve_rendering_quality_cfg(quality_name, quality_cfgs, logger) - if quality_cfg is None: + """Resolve and apply rendering mode profile to a visualizer config.""" + mode_name = resolve_rendering_mode_name_for_visualizer_cfg(get_setting, visualizer_cfg) + mode_cfg = resolve_rendering_mode_cfg(mode_name, mode_cfgs, logger) + if mode_cfg is None: return visualizer_type = getattr(visualizer_cfg, "visualizer_type", None) if visualizer_type == "kit": - apply_kit_rendering_quality_cfg(set_setting, quality_cfg) + apply_kit_rendering_mode_cfg(set_setting, mode_cfg) elif visualizer_type == "newton": - apply_newton_quality_cfg_to_visualizer_cfg(visualizer_cfg, quality_cfg) + apply_newton_mode_cfg_to_visualizer_cfg(visualizer_cfg, mode_cfg) -def apply_runtime_quality_profile_to_visualizer( +def apply_runtime_mode_profile_to_visualizer( get_setting: Any, set_setting: Any, viz: Any, - visualizer_quality_keys: dict[int, str | None], - quality_cfgs: dict[str, RenderingModeCfg], + visualizer_mode_keys: dict[int, str | None], + mode_cfgs: dict[str, RenderingModeCfg], logger: Any, force: bool = False, ) -> None: - """Resolve and apply runtime quality profile to an active visualizer.""" - quality_name = resolve_rendering_quality_name_for_visualizer_cfg(get_setting, viz.cfg) + """Resolve and apply runtime rendering mode profile to an active visualizer.""" + mode_name = resolve_rendering_mode_name_for_visualizer_cfg(get_setting, viz.cfg) viz_id = id(viz) - if not force and visualizer_quality_keys.get(viz_id) == quality_name: + if not force and visualizer_mode_keys.get(viz_id) == mode_name: return - quality_cfg = resolve_rendering_quality_cfg(quality_name, quality_cfgs, logger) - if quality_cfg is None: - visualizer_quality_keys[viz_id] = quality_name + mode_cfg = resolve_rendering_mode_cfg(mode_name, mode_cfgs, logger) + if mode_cfg is None: + visualizer_mode_keys[viz_id] = mode_name return viz_type = getattr(viz.cfg, "visualizer_type", None) if viz_type == "kit": - apply_kit_rendering_quality_cfg(set_setting, quality_cfg) + apply_kit_rendering_mode_cfg(set_setting, mode_cfg) elif viz_type == "newton": - apply_newton_quality_cfg_to_visualizer_cfg(viz.cfg, quality_cfg) - apply_newton_quality_cfg_to_viewer(getattr(viz, "_viewer", None), quality_cfg) + apply_newton_mode_cfg_to_visualizer_cfg(viz.cfg, mode_cfg) + apply_newton_mode_cfg_to_viewer(getattr(viz, "_viewer", None), mode_cfg) - visualizer_quality_keys[viz_id] = quality_name + visualizer_mode_keys[viz_id] = mode_name diff --git a/source/isaaclab/isaaclab/sim/simulation_cfg.py b/source/isaaclab/isaaclab/sim/simulation_cfg.py index a73ba325548..a644bea52af 100644 --- a/source/isaaclab/isaaclab/sim/simulation_cfg.py +++ b/source/isaaclab/isaaclab/sim/simulation_cfg.py @@ -93,12 +93,12 @@ class SimulationCfg: a different config (e.g., NewtonManagerCfg) to use a different physics backend. """ - rendering_quality_cfgs: dict[str, RenderingModeCfg] = { + rendering_mode_cfgs: dict[str, RenderingModeCfg] = { "performance": RenderingModeCfg(rendering_mode_preset="performance"), "balanced": RenderingModeCfg(rendering_mode_preset="balanced"), "quality": RenderingModeCfg(rendering_mode_preset="quality"), } - """Named rendering quality profiles available to visualizers/renderers.""" + """Named rendering mode profiles available to visualizers/renderers.""" create_stage_in_memory: bool = False """If stage is first created in memory. Default is False. diff --git a/source/isaaclab/isaaclab/sim/simulation_context.py b/source/isaaclab/isaaclab/sim/simulation_context.py index f61a6de4906..973f584dde8 100644 --- a/source/isaaclab/isaaclab/sim/simulation_context.py +++ b/source/isaaclab/isaaclab/sim/simulation_context.py @@ -296,18 +296,18 @@ def _apply_quality_profile_to_visualizer_cfg(self, visualizer_cfg: Any) -> None: self.get_setting, self.set_setting, visualizer_cfg, - quality_cfgs, + mode_cfgs, logger, ) - def _apply_runtime_quality_profile_to_visualizer(self, viz: Visualizer, force: bool = False) -> None: - quality_cfgs = getattr(self.cfg, "rendering_quality_cfgs", None) or {} - apply_runtime_quality_profile_to_visualizer( + def _apply_runtime_mode_profile_to_visualizer(self, viz: Visualizer, force: bool = False) -> None: + mode_cfgs = getattr(self.cfg, "rendering_mode_cfgs", None) or {} + apply_runtime_mode_profile_to_visualizer( self.get_setting, self.set_setting, viz, - self._visualizer_quality_keys, - quality_cfgs, + self._visualizer_mode_keys, + mode_cfgs, logger, force=force, ) @@ -588,10 +588,10 @@ def initialize_visualizers(self) -> None: for cfg in visualizer_cfgs: try: - self._apply_quality_profile_to_visualizer_cfg(cfg) + self._apply_mode_profile_to_visualizer_cfg(cfg) visualizer = cfg.create_visualizer() visualizer.initialize(self._scene_data_provider) - self._apply_runtime_quality_profile_to_visualizer(visualizer, force=True) + self._apply_runtime_mode_profile_to_visualizer(visualizer, force=True) self._visualizers.append(visualizer) except Exception as exc: if cli_explicit: @@ -733,7 +733,7 @@ def update_visualizers(self, dt: float) -> None: for viz in visualizers_to_remove: try: - self._visualizer_quality_keys.pop(id(viz), None) + self._visualizer_mode_keys.pop(id(viz), None) viz.close() self._visualizers.remove(viz) logger.info("Removed visualizer: %s", type(viz).__name__) @@ -808,7 +808,7 @@ def clear_instance(cls) -> None: # Close all visualizers for viz in cls._instance._visualizers: - cls._instance._visualizer_quality_keys.pop(id(viz), None) + cls._instance._visualizer_mode_keys.pop(id(viz), None) viz.close() cls._instance._visualizers.clear() if cls._instance._scene_data_provider is not None: diff --git a/source/isaaclab/test/sim/test_simulation_render_config.py b/source/isaaclab/test/sim/test_simulation_render_config.py index 67ee0a43cfb..2931088f2f5 100644 --- a/source/isaaclab/test/sim/test_simulation_render_config.py +++ b/source/isaaclab/test/sim/test_simulation_render_config.py @@ -87,7 +87,7 @@ def test_render_cfg(): # @pytest.mark.isaacsim_ci def test_render_cfg_presets(): - """Test that quality presets are applied and can be overridden via RenderingModeCfg.""" + """Test that rendering mode presets are applied and can be overridden via RenderingModeCfg.""" # user-friendly field override dlss_mode = ("/rtx/post/dlss/execMode", 5) @@ -101,13 +101,13 @@ def test_render_cfg_presets(): preset_dict = get_kit_rendering_preset(rendering_mode) profile_name = f"profile_{rendering_mode}" - quality_cfg = RenderingModeCfg( + mode_cfg = RenderingModeCfg( rendering_mode_preset=rendering_mode, kit_dlss_mode=dlss_mode[1], ) cfg = SimulationCfg( - rendering_quality_cfgs={profile_name: quality_cfg}, - visualizer_cfgs=KitVisualizerCfg(rendering_quality=profile_name), + rendering_mode_cfgs={profile_name: mode_cfg}, + visualizer_cfgs=KitVisualizerCfg(rendering_mode=profile_name), ) sim = SimulationContext(cfg) @@ -137,9 +137,9 @@ def test_render_cfg_presets(): @pytest.mark.skip(reason="Timeline not stopped") # @pytest.mark.isaacsim_ci -def test_rendering_quality_cfg_field_overrides(): +def test_rendering_mode_cfg_field_overrides(): """Test that explicit RenderingModeCfg fields map to carb settings.""" - quality_cfg = RenderingModeCfg( + mode_cfg = RenderingModeCfg( kit_enable_translucency=True, kit_enable_reflections=True, kit_enable_global_illumination=True, @@ -153,8 +153,8 @@ def test_rendering_quality_cfg_field_overrides(): kit_enable_ambient_occlusion=True, ) cfg = SimulationCfg( - rendering_quality_cfgs={"custom": quality_cfg}, - visualizer_cfgs=KitVisualizerCfg(rendering_quality="custom"), + rendering_mode_cfgs={"custom": mode_cfg}, + visualizer_cfgs=KitVisualizerCfg(rendering_mode="custom"), ) sim = SimulationContext(cfg) sim.reset() diff --git a/source/isaaclab_physx/isaaclab_physx/renderers/rtx_renderer_cfg.py b/source/isaaclab_physx/isaaclab_physx/renderers/rtx_renderer_cfg.py index 54990b0c764..5bd6c7e2644 100644 --- a/source/isaaclab_physx/isaaclab_physx/renderers/rtx_renderer_cfg.py +++ b/source/isaaclab_physx/isaaclab_physx/renderers/rtx_renderer_cfg.py @@ -18,4 +18,4 @@ class RTXRendererCfg(RendererCfg): """ renderer_type: str = "rtx" - rendering_quality: str | None = None + rendering_mode: str | None = None From 6b2c0269181efaadcafd2817e0d56085ec4335f4 Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Tue, 24 Mar 2026 19:43:10 +0000 Subject: [PATCH 18/34] resync --- source/isaaclab/isaaclab/renderer/__init__.py | 4 +- .../renderer/rendering_quality_presets.py | 4 +- .../isaaclab/renderers/renderer_cfg.py | 6 +- .../isaaclab/sim/simulation_context.py | 123 +++------------ .../isaaclab/visualizers/visualizer_cfg.py | 14 +- .../test/sim/test_simulation_render_config.py | 144 ++++-------------- 6 files changed, 65 insertions(+), 230 deletions(-) diff --git a/source/isaaclab/isaaclab/renderer/__init__.py b/source/isaaclab/isaaclab/renderer/__init__.py index 44c20efc2fa..5f9eb9b3f8f 100644 --- a/source/isaaclab/isaaclab/renderer/__init__.py +++ b/source/isaaclab/isaaclab/renderer/__init__.py @@ -3,8 +3,8 @@ # # SPDX-License-Identifier: BSD-3-Clause -"""Compatibility wrapper for relocated rendering package.""" +"""Compatibility wrapper for relocated rendering-mode package.""" -from isaaclab.rendering.rendering_quality_presets import get_kit_rendering_preset +from isaaclab.rendering_mode.rendering_mode_presets import get_kit_rendering_preset __all__ = ["get_kit_rendering_preset"] diff --git a/source/isaaclab/isaaclab/renderer/rendering_quality_presets.py b/source/isaaclab/isaaclab/renderer/rendering_quality_presets.py index 882cf8f5ac2..fe222f6492c 100644 --- a/source/isaaclab/isaaclab/renderer/rendering_quality_presets.py +++ b/source/isaaclab/isaaclab/renderer/rendering_quality_presets.py @@ -3,6 +3,6 @@ # # SPDX-License-Identifier: BSD-3-Clause -"""Compatibility wrapper for relocated rendering presets module.""" +"""Compatibility wrapper for relocated rendering-mode presets module.""" -from isaaclab.rendering.rendering_quality_presets import * # noqa: F401, F403 +from isaaclab.rendering_mode.rendering_mode_presets import * # noqa: F401, F403 diff --git a/source/isaaclab/isaaclab/renderers/renderer_cfg.py b/source/isaaclab/isaaclab/renderers/renderer_cfg.py index 334fa3f070a..c4bceb0dc1f 100644 --- a/source/isaaclab/isaaclab/renderers/renderer_cfg.py +++ b/source/isaaclab/isaaclab/renderers/renderer_cfg.py @@ -12,4 +12,8 @@ class RendererCfg: """Configuration for a renderer.""" - renderer_type: str = "default" + renderer_type: str | None = None + """Type identifier for selecting a renderer backend implementation.""" + + rendering_mode: str | None = None + """Name of the rendering mode profile to use with this renderer.""" diff --git a/source/isaaclab/isaaclab/sim/simulation_context.py b/source/isaaclab/isaaclab/sim/simulation_context.py index 973f584dde8..13e82f7bee1 100644 --- a/source/isaaclab/isaaclab/sim/simulation_context.py +++ b/source/isaaclab/isaaclab/sim/simulation_context.py @@ -25,6 +25,10 @@ VisualizerPrebuiltArtifacts, resolve_scene_data_requirements, ) +from isaaclab.rendering_mode.rendering_mode_utils import ( + apply_mode_profile_to_visualizer_cfg, + apply_runtime_mode_profile_to_visualizer, +) from isaaclab.sim.utils import create_new_stage from isaaclab.utils.version import has_kit from isaaclab.visualizers.base_visualizer import BaseVisualizer @@ -166,6 +170,7 @@ def __init__(self, cfg: SimulationCfg | None = None): # Initialize visualizer state (provider/visualizers are created lazily during initialize_visualizers()). self._scene_data_provider: BaseSceneDataProvider | None = None self._visualizers: list[BaseVisualizer] = [] + self._visualizer_mode_keys: dict[int, str | None] = {} self._scene_data_requirements = SceneDataRequirement() self._visualizer_prebuilt_artifact: VisualizerPrebuiltArtifacts | None = None self._visualizer_step_counter = 0 @@ -188,111 +193,10 @@ def __init__(self, cfg: SimulationCfg | None = None): type(self)._instance = self # Mark as valid singleton only after successful init - def _apply_kit_rendering_preset(self, preset_name: str) -> None: - apply_kit_rendering_preset(self.set_setting, preset_name) - - def _apply_kit_rendering_quality_cfg(self, quality_cfg: RenderingQualityCfg) -> None: - apply_kit_rendering_quality_cfg(self.set_setting, quality_cfg) - - if rendering_mode: - supported_rendering_modes = {"performance", "balanced", "quality"} - if rendering_mode not in supported_rendering_modes: - raise ValueError( - f"RenderCfg rendering mode '{rendering_mode}' not in supported modes " - f"{sorted(supported_rendering_modes)}." - ) - - isaaclab_app_exp_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), *[".."] * 4, "apps") - from isaaclab.utils.version import get_isaac_sim_version - - if get_isaac_sim_version().major < 6: - isaaclab_app_exp_path = os.path.join(isaaclab_app_exp_path, "isaacsim_5") - - preset_filename = os.path.join(isaaclab_app_exp_path, f"rendering_modes/{rendering_mode}.kit") - if os.path.exists(preset_filename): - with open(preset_filename) as file: - preset_dict = toml.load(file) - - def _apply_nested(data: dict[str, Any], path: str = "") -> None: - for key, value in data.items(): - key_path = f"{path}/{key}" if path else f"/{key}" - if isinstance(value, dict): - _apply_nested(value, key_path) - else: - self.set_setting(key_path.replace(".", "/"), value) - - _apply_nested(preset_dict) - else: - logger.warning("[SimulationContext] Render preset file not found: %s", preset_filename) - - # RenderCfg fields mapped to setting paths (stored via SettingsManager) - field_to_setting = { - "enable_translucency": "/rtx/translucency/enabled", - "enable_reflections": "/rtx/reflections/enabled", - "enable_global_illumination": "/rtx/indirectDiffuse/enabled", - "enable_dlssg": "/rtx-transient/dlssg/enabled", - "enable_dl_denoiser": "/rtx-transient/dldenoiser/enabled", - "dlss_mode": "/rtx/post/dlss/execMode", - "enable_direct_lighting": "/rtx/directLighting/enabled", - "samples_per_pixel": "/rtx/directLighting/sampledLighting/samplesPerPixel", - "enable_shadows": "/rtx/shadows/enabled", - "enable_ambient_occlusion": "/rtx/ambientOcclusion/enabled", - "dome_light_upper_lower_strategy": "/rtx/domeLight/upperLowerStrategy", - } - - for key, value in vars(render_cfg).items(): - if value is None or key in {"rendering_mode", "carb_settings", "antialiasing_mode"}: - continue - setting_path = field_to_setting.get(key) - if setting_path is not None: - self.set_setting(setting_path, value) - - # Raw overrides from render_cfg (stored via SettingsManager) - extra_settings = getattr(render_cfg, "carb_settings", None) - if extra_settings: - for key, value in extra_settings.items(): - if "_" in key: - path = "/" + key.replace("_", "/") - elif "." in key: - path = "/" + key.replace(".", "/") - else: - path = key - self.set_setting(path, value) - - # Optional anti-aliasing mode via Replicator (best-effort, may use Omniverse APIs) - antialiasing_mode = getattr(render_cfg, "antialiasing_mode", None) - if antialiasing_mode is not None: - try: - import omni.replicator.core as rep - - rep.settings.set_render_rtx_realtime(antialiasing=quality_cfg.kit_antialiasing_mode) - except Exception: - pass - - def _apply_newton_quality_cfg_to_visualizer_cfg(self, visualizer_cfg: Any, quality_cfg: RenderingQualityCfg) -> None: - override_fields = { - "newton_enable_shadows": "enable_shadows", - "newton_enable_sky": "enable_sky", - "newton_enable_wireframe": "enable_wireframe", - "newton_sky_upper_color": "sky_upper_color", - "newton_sky_lower_color": "sky_lower_color", - "newton_light_color": "light_color", - } - for quality_field, viz_field in override_fields.items(): - value = getattr(quality_cfg, quality_field, None) - if value is not None and hasattr(visualizer_cfg, viz_field): - setattr(visualizer_cfg, viz_field, value) - - def _resolve_rendering_quality_name_for_visualizer_cfg(self, visualizer_cfg: Any) -> str | None: - return resolve_rendering_quality_name_for_visualizer_cfg(self.get_setting, visualizer_cfg) - - def _resolve_rendering_quality_cfg(self, quality_name: str | None) -> RenderingQualityCfg | None: - quality_cfgs = getattr(self.cfg, "rendering_quality_cfgs", None) or {} - return resolve_rendering_quality_cfg(quality_name, quality_cfgs, logger) - - def _apply_quality_profile_to_visualizer_cfg(self, visualizer_cfg: Any) -> None: - quality_cfgs = getattr(self.cfg, "rendering_quality_cfgs", None) or {} - apply_quality_profile_to_visualizer_cfg( + def _apply_mode_profile_to_visualizer_cfg(self, visualizer_cfg: Any) -> None: + """Apply resolved rendering-mode profile to a visualizer config.""" + mode_cfgs = getattr(self.cfg, "rendering_mode_cfgs", None) or {} + apply_mode_profile_to_visualizer_cfg( self.get_setting, self.set_setting, visualizer_cfg, @@ -300,7 +204,8 @@ def _apply_quality_profile_to_visualizer_cfg(self, visualizer_cfg: Any) -> None: logger, ) - def _apply_runtime_mode_profile_to_visualizer(self, viz: Visualizer, force: bool = False) -> None: + def _apply_runtime_mode_profile_to_visualizer(self, viz: BaseVisualizer, force: bool = False) -> None: + """Apply rendering-mode profile updates to an active visualizer instance.""" mode_cfgs = getattr(self.cfg, "rendering_mode_cfgs", None) or {} apply_runtime_mode_profile_to_visualizer( self.get_setting, @@ -481,6 +386,11 @@ def _is_cli_visualizer_disable_all(self) -> bool: def resolve_visualizer_types(self) -> list[str]: """Resolve visualizer types from config or CLI settings.""" + if self._is_cli_visualizer_disable_all(): + return [] + if self._is_cli_visualizer_explicit(): + return self._get_cli_visualizer_types() + visualizer_cfgs = self.cfg.visualizer_cfgs if visualizer_cfgs is None: return [] @@ -715,6 +625,7 @@ def update_visualizers(self, dt: float) -> None: visualizers_to_remove = [] for viz in self._visualizers: try: + self._apply_runtime_mode_profile_to_visualizer(viz) if viz.is_closed or not viz.is_running(): if viz.is_closed: logger.info("Visualizer closed: %s", type(viz).__name__) diff --git a/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py b/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py index 27d5359f53d..264edacd072 100644 --- a/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py +++ b/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py @@ -46,8 +46,8 @@ class VisualizerCfg: camera_usd_path: str = "/World/envs/env_0/Camera" """Absolute USD path to a camera prim when camera_source='usd_path'.""" - env_filter_mode: Literal["none", "env_filter_ids", "random_n"] = "none" - """Env filter mode: 'none', 'env_filter_ids', or 'random_n'.""" + env_filter_mode: Literal["none", "env_ids", "random_n"] = "none" + """Env filter mode: 'none', 'env_ids', or 'random_n'.""" env_filter_random_n: int = 64 """If env_filter_mode='random_n', number of envs to sample.""" @@ -56,17 +56,17 @@ class VisualizerCfg: """Seed for deterministic env sampling.""" env_filter_ids: list[int] = [i for i in range(0, 64, 4)] - """If env_filter_mode='env_filter_ids', only these env indices are shown. + """If env_filter_mode='env_ids', only these env indices are shown. This improves performance, particularly for large-scale training, by reducing scene updates sent to visualizers. Note, OV visualizer only applies a cosmetic visibility toggle (no performance gain). """ - rendering_quality: str | None = None - """Name of the rendering quality profile for this visualizer. + rendering_mode: str | None = None + """Name of the rendering mode profile for this visualizer. - Selects an entry from :class:`isaaclab.sim.SimulationCfg.rendering_quality_cfgs`. - If None, no rendering quality overrides are applied and backend/native defaults are used. + Selects an entry from :class:`isaaclab.sim.SimulationCfg.rendering_mode_cfgs`. + If None, no rendering mode overrides are applied and backend/native defaults are used. """ def get_visualizer_type(self) -> str | None: diff --git a/source/isaaclab/test/sim/test_simulation_render_config.py b/source/isaaclab/test/sim/test_simulation_render_config.py index 2931088f2f5..b65e707ca78 100644 --- a/source/isaaclab/test/sim/test_simulation_render_config.py +++ b/source/isaaclab/test/sim/test_simulation_render_config.py @@ -18,127 +18,48 @@ from isaaclab_physx.visualizers import KitVisualizerCfg from isaaclab.app.settings_manager import get_settings_manager -from isaaclab.sim.simulation_cfg import RenderCfg, SimulationCfg +from isaaclab.rendering_mode import RenderingModeCfg, get_kit_rendering_preset +from isaaclab.sim.simulation_cfg import SimulationCfg from isaaclab.sim.simulation_context import SimulationContext -from isaaclab.utils.version import get_isaac_sim_version -@pytest.mark.skip(reason="Timeline not stopped") @pytest.mark.isaacsim_ci -def test_render_cfg(): - """Test that the simulation context is created with the correct render cfg.""" - enable_translucency = True - enable_reflections = True - enable_global_illumination = True - antialiasing_mode = "DLAA" - enable_dlssg = True - enable_dl_denoiser = True - dlss_mode = 0 - enable_direct_lighting = True - samples_per_pixel = 4 - enable_shadows = True - enable_ambient_occlusion = True - - render_cfg = RenderCfg( - enable_translucency=enable_translucency, - enable_reflections=enable_reflections, - enable_global_illumination=enable_global_illumination, - antialiasing_mode=antialiasing_mode, - enable_dlssg=enable_dlssg, - dlss_mode=dlss_mode, - enable_dl_denoiser=enable_dl_denoiser, - enable_direct_lighting=enable_direct_lighting, - samples_per_pixel=samples_per_pixel, - enable_shadows=enable_shadows, - enable_ambient_occlusion=enable_ambient_occlusion, - ) - - cfg = SimulationCfg(render=render_cfg) - - # FIXME: when running all tests, the timeline is not stopped, force stop it here but also that does not the timeline - # omni.timeline.get_timeline_interface().stop() +def test_rendering_mode_presets(): + """Preset profiles should apply and allow explicit field overrides.""" + dlss_override = 3 - sim = SimulationContext(cfg) - - assert sim.cfg.render.enable_translucency == enable_translucency - assert sim.cfg.render.enable_reflections == enable_reflections - assert sim.cfg.render.enable_global_illumination == enable_global_illumination - assert sim.cfg.render.antialiasing_mode == antialiasing_mode - assert sim.cfg.render.enable_dlssg == enable_dlssg - assert sim.cfg.render.dlss_mode == dlss_mode - assert sim.cfg.render.enable_dl_denoiser == enable_dl_denoiser - assert sim.cfg.render.enable_direct_lighting == enable_direct_lighting - assert sim.cfg.render.samples_per_pixel == samples_per_pixel - assert sim.cfg.render.enable_shadows == enable_shadows - assert sim.cfg.render.enable_ambient_occlusion == enable_ambient_occlusion - - assert sim.get_setting("/rtx/translucency/enabled") == sim.cfg.render.enable_translucency - assert sim.get_setting("/rtx/reflections/enabled") == sim.cfg.render.enable_reflections - assert sim.get_setting("/rtx/indirectDiffuse/enabled") == sim.cfg.render.enable_global_illumination - assert sim.get_setting("/rtx-transient/dlssg/enabled") == sim.cfg.render.enable_dlssg - assert sim.get_setting("/rtx-transient/dldenoiser/enabled") == sim.cfg.render.enable_dl_denoiser - assert sim.get_setting("/rtx/post/dlss/execMode") == sim.cfg.render.dlss_mode - assert sim.get_setting("/rtx/directLighting/enabled") == sim.cfg.render.enable_direct_lighting - assert sim.get_setting("/rtx/directLighting/sampledLighting/samplesPerPixel") == sim.cfg.render.samples_per_pixel - assert sim.get_setting("/rtx/shadows/enabled") == sim.cfg.render.enable_shadows - assert sim.get_setting("/rtx/ambientOcclusion/enabled") == sim.cfg.render.enable_ambient_occlusion - assert sim.get_setting("/rtx/post/aa/op") == 4 # dlss = 3, dlaa=4 - - -# @pytest.mark.isaacsim_ci -def test_render_cfg_presets(): - """Test that rendering mode presets are applied and can be overridden via RenderingModeCfg.""" - - # user-friendly field override - dlss_mode = ("/rtx/post/dlss/execMode", 5) - - rendering_modes = ["performance", "balanced", "quality"] - - for rendering_mode in rendering_modes: - # Clear any existing simulation context before creating a new one + for mode_name in ["performance", "balanced", "quality"]: SimulationContext.clear_instance() + preset_dict = get_kit_rendering_preset(mode_name) + profile_name = f"profile_{mode_name}" - preset_dict = get_kit_rendering_preset(rendering_mode) - - profile_name = f"profile_{rendering_mode}" - mode_cfg = RenderingModeCfg( - rendering_mode_preset=rendering_mode, - kit_dlss_mode=dlss_mode[1], - ) cfg = SimulationCfg( - rendering_mode_cfgs={profile_name: mode_cfg}, + rendering_mode_cfgs={ + profile_name: RenderingModeCfg( + rendering_mode_preset=mode_name, + kit_dlss_mode=dlss_override, + ) + }, visualizer_cfgs=KitVisualizerCfg(rendering_mode=profile_name), ) - sim = SimulationContext(cfg) sim.reset() settings = get_settings_manager() for key, val in preset_dict.items(): - setting_name = "/" + key.replace(".", "/") # convert to setting path format - - if setting_name in carb_settings: - setting_gt = carb_settings[setting_name] - elif setting_name == dlss_mode[0]: - setting_gt = dlss_mode[1] - else: - setting_gt = val - - setting_val = settings.get(setting_name) - - assert setting_gt == setting_val, ( - f"Mismatch for '{setting_name}' in mode '{rendering_mode}': " - f"expected {setting_gt!r}, got {setting_val!r}" + setting_name = "/" + key.replace(".", "/") + expected = dlss_override if setting_name == "/rtx/post/dlss/execMode" else val + assert settings.get(setting_name) == expected, ( + f"Mismatch for '{setting_name}' in mode '{mode_name}': " + f"expected {expected!r}, got {settings.get(setting_name)!r}" ) - # Clean up after the test SimulationContext.clear_instance() -@pytest.mark.skip(reason="Timeline not stopped") -# @pytest.mark.isaacsim_ci -def test_rendering_mode_cfg_field_overrides(): - """Test that explicit RenderingModeCfg fields map to carb settings.""" +@pytest.mark.isaacsim_ci +def test_rendering_mode_field_overrides(): + """Explicit RenderingModeCfg kit_* fields should map to carb settings.""" mode_cfg = RenderingModeCfg( kit_enable_translucency=True, kit_enable_reflections=True, @@ -159,14 +80,13 @@ def test_rendering_mode_cfg_field_overrides(): sim = SimulationContext(cfg) sim.reset() - assert sim.get_setting("/rtx/translucency/enabled") == sim.cfg.render.enable_translucency - assert sim.get_setting("/rtx/reflections/enabled") == sim.cfg.render.enable_reflections - assert sim.get_setting("/rtx/indirectDiffuse/enabled") == sim.cfg.render.enable_global_illumination - assert sim.get_setting("/rtx-transient/dlssg/enabled") == sim.cfg.render.enable_dlssg - assert sim.get_setting("/rtx-transient/dldenoiser/enabled") == sim.cfg.render.enable_dl_denoiser - assert sim.get_setting("/rtx/post/dlss/execMode") == sim.cfg.render.dlss_mode - assert sim.get_setting("/rtx/directLighting/enabled") == sim.cfg.render.enable_direct_lighting - assert sim.get_setting("/rtx/directLighting/sampledLighting/samplesPerPixel") == sim.cfg.render.samples_per_pixel - assert sim.get_setting("/rtx/shadows/enabled") == sim.cfg.render.enable_shadows - assert sim.get_setting("/rtx/ambientOcclusion/enabled") == sim.cfg.render.enable_ambient_occlusion - assert sim.get_setting("/rtx/post/aa/op") == 3 # dlss = 3, dlaa=4 + assert sim.get_setting("/rtx/translucency/enabled") is True + assert sim.get_setting("/rtx/reflections/enabled") is True + assert sim.get_setting("/rtx/indirectDiffuse/enabled") is True + assert sim.get_setting("/rtx-transient/dlssg/enabled") is True + assert sim.get_setting("/rtx-transient/dldenoiser/enabled") is True + assert sim.get_setting("/rtx/post/dlss/execMode") == 0 + assert sim.get_setting("/rtx/directLighting/enabled") is True + assert sim.get_setting("/rtx/directLighting/sampledLighting/samplesPerPixel") == 4 + assert sim.get_setting("/rtx/shadows/enabled") is True + assert sim.get_setting("/rtx/ambientOcclusion/enabled") is True From 36731de6b19e90d2e902e37a3cd36f438f73f19d Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Tue, 24 Mar 2026 20:29:45 +0000 Subject: [PATCH 19/34] sync --- docs/source/how-to/configure_rendering.rst | 73 +++++++++---------- .../tutorials/00_sim/set_rendering_mode.py | 20 ++--- source/isaaclab/isaaclab/app/app_launcher.py | 3 +- .../isaaclab/isaaclab/sim/simulation_cfg.py | 1 - .../renderers/newton_warp_renderer.py | 1 - .../physx_scene_data_provider.py | 10 +-- 6 files changed, 51 insertions(+), 57 deletions(-) diff --git a/docs/source/how-to/configure_rendering.rst b/docs/source/how-to/configure_rendering.rst index 4f2dc1e1b73..2eb97ab1224 100644 --- a/docs/source/how-to/configure_rendering.rst +++ b/docs/source/how-to/configure_rendering.rst @@ -49,7 +49,8 @@ Notes: * ``--rendering_mode`` is the supported CLI entry point. Example renders from the ``set_rendering_mode.py`` script. -To help assess rendering, the example scene includes reflections, translucency, direct and ambient lighting, and several material types. +To help assess rendering, the example scene includes reflections, translucency, +direct and ambient lighting, and several material types. - Quality Mode @@ -69,21 +70,23 @@ To help assess rendering, the example scene includes reflections, translucency, :width: 100% :alt: Performance Rendering Mode Example -Overwriting Specific Rendering Settings ---------------------------------------- +Overriding Rendering Mode Settings +---------------------------------- -Preset rendering settings can be overwritten via :class:`~sim.RenderingModeCfg`. +Preset rendering settings can be overwritten via +:class:`~isaaclab.rendering_mode.RenderingModeCfg`. There are two ways to provide settings that overwrite presets: -1. :class:`~sim.RenderingModeCfg` supports overwriting specific settings via explicit +1. :class:`~isaaclab.rendering_mode.RenderingModeCfg` supports overwriting specific settings via explicit ``kit_*`` fields that map to underlying RTX settings. .. code-block:: python import isaaclab.sim as sim_utils + from isaaclab.rendering_mode import RenderingModeCfg - mode_cfg = sim_utils.RenderingModeCfg( + mode_cfg = RenderingModeCfg( rendering_mode_preset="performance", # explicit field overrides kit_enable_translucency=True, # defaults to False in performance mode @@ -125,25 +128,24 @@ There are two ways to provide settings that overwrite presets: +------------------------------------+-------------------------------------------------------------------------+ -2. For more control, :class:`~sim.RenderCfg` allows you to overwrite any RTX setting by using the ``carb_settings`` argument. - - Examples of RTX settings can be found from within the repo, in the render mode preset files located in ``apps/rendering_modes``. - - In addition, the full NVIDIA RTX renderer documentation can be found at - https://docs.omniverse.nvidia.com/materials-and-rendering/latest/rtx-renderer.html. - - An example usage of ``carb_settings``. +2. If you need a custom profile, define your own named entry in + :attr:`~sim.SimulationCfg.rendering_mode_cfgs` and select it from each visualizer. .. code-block:: python - render_cfg = sim_utils.RenderCfg( - rendering_mode="quality", - # carb setting overwrites - carb_settings={ - "rtx.translucency.enabled": False, - "rtx.reflections.enabled": False, - "rtx.domeLight.upperLowerStrategy": 3, - } + import isaaclab.sim as sim_utils + from isaaclab.rendering_mode import RenderingModeCfg + from isaaclab_physx.visualizers import KitVisualizerCfg + + sim_cfg = sim_utils.SimulationCfg( + rendering_mode_cfgs={ + "my_profile": RenderingModeCfg( + rendering_mode_preset="balanced", + kit_enable_reflections=True, + kit_dlss_mode=2, + ), + }, + visualizer_cfgs=[KitVisualizerCfg(rendering_mode="my_profile")], ) Current Limitations @@ -152,22 +154,22 @@ Current Limitations For performance reasons, we default to using DLSS for denoising, which generally provides better performance. This may result in renders of lower quality, which may be especially evident at lower resolutions. Due to this, we recommend using per-tile or per-camera resolution of at least 100 x 100. -For renders at lower resolutions, we advice setting the ``antialiasing_mode`` attribute in :class:`~sim.RenderCfg` to -``DLAA``, and also potentially enabling ``enable_dl_denoiser``. Both of these settings should help improve render -quality, but also comes at a cost of performance. Additional rendering parameters can also be specified in :class:`~sim.RenderCfg`. +For renders at lower resolutions, we advise setting +``kit_antialiasing_mode="DLAA"`` in +:class:`~isaaclab.rendering_mode.RenderingModeCfg`, and potentially enabling +``kit_enable_dl_denoiser=True``. Both settings can improve quality at a cost +of performance. If you observe visual artifacts such as ghosting or disocclusion issues when using tiled rendering, you can try adjusting the ``disocclusionScale`` parameter. This setting controls how aggressively the renderer handles areas that become newly visible between frames: -.. code-block:: python +.. note:: - render_cfg = sim_utils.RenderCfg( - carb_settings={ - "/rtx/aovConverter/disocclusionScale": 10000, - } - ) + Low-level carb rendering settings (for example, + ``/rtx/aovConverter/disocclusionScale``) are not currently exposed through + :class:`~isaaclab.rendering_mode.RenderingModeCfg`. .. note:: @@ -183,13 +185,10 @@ When using UsdVol volumes with 3D Gaussian particles (e.g. exported from `3DGRUT `_) in **multiple environments**, you must set the following so the renderer uses the correct compositing path: -.. code-block:: python +.. note:: - render_cfg = sim_utils.RenderCfg( - carb_settings={ - "omni.rtx.nre.compositing.rendererHints": 3, - } - ) + This setting is not currently exposed through + :class:`~isaaclab.rendering_mode.RenderingModeCfg`. .. warning:: diff --git a/scripts/tutorials/00_sim/set_rendering_mode.py b/scripts/tutorials/00_sim/set_rendering_mode.py index 38a1d5b2ba8..ba1d94c3f11 100644 --- a/scripts/tutorials/00_sim/set_rendering_mode.py +++ b/scripts/tutorials/00_sim/set_rendering_mode.py @@ -33,6 +33,8 @@ """Rest everything follows.""" +from isaaclab_physx.visualizers import KitVisualizerCfg + import isaaclab.sim as sim_utils from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR @@ -41,21 +43,15 @@ def main(): """Main function.""" # rendering modes include performance, balanced, and quality - # note, the rendering_mode specified in the CLI argument (--rendering_mode) takes precedence over - # this Render Config setting + # note: the CLI argument (--rendering_mode) takes precedence over this visualizer setting rendering_mode = "performance" - # carb setting dictionary can include any rtx carb setting which will overwrite the native preset setting - carb_settings = {"rtx.reflections.enabled": True} - - # Initialize render config - render_cfg = sim_utils.RenderCfg( - rendering_mode=rendering_mode, - carb_settings=carb_settings, + # Initialize simulation config with a Kit visualizer rendering profile. + sim_cfg = sim_utils.SimulationCfg( + visualizer_cfgs=[ + KitVisualizerCfg(rendering_mode=rendering_mode), + ] ) - - # Initialize the simulation context with render coofig - sim_cfg = sim_utils.SimulationCfg(render=render_cfg) sim = sim_utils.SimulationContext(sim_cfg) # Pose camera in the hospital lobby area diff --git a/source/isaaclab/isaaclab/app/app_launcher.py b/source/isaaclab/isaaclab/app/app_launcher.py index 8a6bcfda44e..aa4db167ec9 100644 --- a/source/isaaclab/isaaclab/app/app_launcher.py +++ b/source/isaaclab/isaaclab/app/app_launcher.py @@ -361,7 +361,7 @@ def add_app_launcher_args(parser: argparse.ArgumentParser) -> None: ) arg_group.add_argument( "--headless", - action="store_true", + action=ExplicitTrueAction, default=AppLauncher._APPLAUNCHER_CFG_INFO["headless"][1], help=( "[DEPRECATED] Disable visualizers and force headless mode (display off)." @@ -685,6 +685,7 @@ def _resolve_headless_settings(self, launcher_args: dict, livestream_arg: int, l # the bool of headless_arg to avoid messy string processing, headless_env = int(os.environ.get("HEADLESS", 0)) headless_arg = launcher_args.pop("headless", AppLauncher._APPLAUNCHER_CFG_INFO["headless"][1]) + headless_arg_explicit = bool(launcher_args.pop("headless_explicit", False)) headless_valid_vals = {0, 1} # Value checking on HEADLESS if headless_env not in headless_valid_vals: diff --git a/source/isaaclab/isaaclab/sim/simulation_cfg.py b/source/isaaclab/isaaclab/sim/simulation_cfg.py index a644bea52af..e7bafd70e6f 100644 --- a/source/isaaclab/isaaclab/sim/simulation_cfg.py +++ b/source/isaaclab/isaaclab/sim/simulation_cfg.py @@ -14,7 +14,6 @@ from typing import Literal from isaaclab.physics import PhysicsCfg -from isaaclab.renderers import RendererCfg from isaaclab.rendering_mode.rendering_mode_cfg import RenderingModeCfg from isaaclab.sim.spawners.materials.physics_materials_cfg import RigidBodyMaterialCfg from isaaclab.utils import configclass diff --git a/source/isaaclab_newton/isaaclab_newton/renderers/newton_warp_renderer.py b/source/isaaclab_newton/isaaclab_newton/renderers/newton_warp_renderer.py index 7778da10bf7..6a616d3b8c4 100644 --- a/source/isaaclab_newton/isaaclab_newton/renderers/newton_warp_renderer.py +++ b/source/isaaclab_newton/isaaclab_newton/renderers/newton_warp_renderer.py @@ -19,7 +19,6 @@ from isaaclab.renderers import BaseRenderer from isaaclab.sim import SimulationContext from isaaclab.utils.math import convert_camera_frame_orientation_convention -from isaaclab.visualizers import VisualizerCfg from .newton_warp_renderer_cfg import NewtonWarpRendererCfg diff --git a/source/isaaclab_physx/isaaclab_physx/scene_data_providers/physx_scene_data_provider.py b/source/isaaclab_physx/isaaclab_physx/scene_data_providers/physx_scene_data_provider.py index 67f1918c0a3..e0afdf1e94a 100644 --- a/source/isaaclab_physx/isaaclab_physx/scene_data_providers/physx_scene_data_provider.py +++ b/source/isaaclab_physx/isaaclab_physx/scene_data_providers/physx_scene_data_provider.py @@ -364,6 +364,11 @@ def _build_filtered_newton_model(self, env_ids: list[int]) -> None: self._filtered_newton_model = None self._filtered_newton_state = None self._filtered_body_indices = [] + except Exception as exc: + logger.error(f"[PhysxSceneDataProvider] Failed to build filtered Newton model from USD: {exc}") + self._filtered_newton_model = None + self._filtered_newton_state = None + self._filtered_body_indices = [] def _extract_model_path_list(self, model: Any, attr_candidates: list[str]) -> list[str]: """Extract a list of prim paths from the first supported model attribute.""" @@ -415,11 +420,6 @@ def _discover_physics_paths_from_stage(self) -> tuple[list[str], list[str]]: len(articulation_paths), ) return rigid_paths, articulation_paths - except Exception as exc: - logger.error(f"[PhysxSceneDataProvider] Failed to build filtered Newton model from USD: {exc}") - self._filtered_newton_model = None - self._filtered_newton_state = None - self._filtered_body_indices = [] def _build_env_id_to_body_indices(self) -> None: """Build mapping env_id -> list of body indices from rigid_body_paths.""" From 21043ab488032137a97575ca185219c2dbf458d3 Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Tue, 7 Apr 2026 23:57:29 +0000 Subject: [PATCH 20/34] resync --- docs/source/how-to/configure_rendering.rst | 11 ++- .../rendering_mode/rendering_mode_cfg.py | 18 +++++ .../rendering_mode/rendering_mode_utils.py | 46 +++++++++++++ .../isaaclab/sensors/camera/camera.py | 13 ++++ .../isaaclab/sensors/camera/tiled_camera.py | 13 ++++ .../test_rendering_mode_renderer_bridge.py | 69 +++++++++++++++++++ 6 files changed, 169 insertions(+), 1 deletion(-) create mode 100644 source/isaaclab/test/rendering_mode/test_rendering_mode_renderer_bridge.py diff --git a/docs/source/how-to/configure_rendering.rst b/docs/source/how-to/configure_rendering.rst index 2eb97ab1224..db3b1c5b4ff 100644 --- a/docs/source/how-to/configure_rendering.rst +++ b/docs/source/how-to/configure_rendering.rst @@ -36,16 +36,25 @@ Rendering mode can be selected in two ways: ) 2. Use the ``--rendering_mode`` CLI argument, which takes precedence over - ``visualizer_cfg.rendering_mode``. + ``visualizer_cfg.rendering_mode`` and over ``camera_cfg.renderer_cfg.rendering_mode``. .. code-block:: bash ./isaaclab.sh -p scripts/tutorials/00_sim/set_rendering_mode.py --rendering_mode {performance/balanced/quality} +3. For tiled or classic camera sensors, set ``rendering_mode`` on + :attr:`~sensors.camera.camera_cfg.CameraCfg.renderer_cfg` to select the same named profile. + Kit-style renderers (``isaac_rtx``, ``rtx``, or ``default``) receive the profile's ``kit_*`` preset and + overrides via global RTX settings. The Newton Warp renderer (``newton_warp``) receives optional + ``newton_warp_*`` fields from the profile, which map to + ``isaaclab_newton.renderers.NewtonWarpRendererCfg``. + Notes: * If ``rendering_mode=None`` for a visualizer, Isaac Lab does not apply rendering overrides for that visualizer, and backend/native defaults (for Kit, USD-authored settings) are used. +* If ``rendering_mode=None`` on ``renderer_cfg`` and the CLI did not set an explicit mode, no profile + is applied for that camera's renderer. * ``--rendering_mode`` is the supported CLI entry point. Example renders from the ``set_rendering_mode.py`` script. diff --git a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py index 717f2129809..fb58fb14a4d 100644 --- a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py +++ b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py @@ -79,4 +79,22 @@ class RenderingModeCfg: newton_light_color: tuple[float, float, float] | None = (1.0, 1.0, 1.0) """Overrides Newton visualizer light color.""" + newton_warp_enable_textures: bool | None = None + """When set, overrides the Newton Warp tiled camera renderer ``enable_textures`` field.""" + + newton_warp_enable_shadows: bool | None = None + """When set, overrides the Newton Warp tiled camera renderer ``enable_shadows`` field.""" + + newton_warp_enable_ambient_lighting: bool | None = None + """When set, overrides the Newton Warp tiled camera renderer ``enable_ambient_lighting`` field.""" + + newton_warp_enable_backface_culling: bool | None = None + """When set, overrides the Newton Warp tiled camera renderer ``enable_backface_culling`` field.""" + + newton_warp_max_distance: float | None = None + """When set, overrides the Newton Warp tiled camera renderer ``max_distance`` field.""" + + newton_warp_create_default_light: bool | None = None + """When set, overrides the Newton Warp tiled camera renderer ``create_default_light`` field.""" + # TODO: Consider supporting additional raw backend settings dictionaries. diff --git a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py index ed9229fcf30..a797fb7fb64 100644 --- a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py +++ b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py @@ -52,6 +52,52 @@ def apply_kit_rendering_mode_cfg(set_setting: Any, mode_cfg: RenderingModeCfg) - pass +def resolve_rendering_mode_name_for_renderer_cfg(get_setting: Any, renderer_cfg: Any) -> str | None: + """Resolve effective rendering mode profile name for a camera/renderer cfg.""" + cli_mode_explicit = bool(get_setting("/isaaclab/rendering/rendering_mode/explicit")) + cli_mode = get_setting("/isaaclab/rendering/rendering_mode") + if cli_mode_explicit: + return cli_mode if cli_mode else None + mode_name = getattr(renderer_cfg, "rendering_mode", None) + return mode_name if mode_name else None + + +def apply_newton_warp_mode_cfg_to_renderer_cfg(renderer_cfg: Any, mode_cfg: RenderingModeCfg) -> None: + """Apply Newton Warp tiled-camera fields from a rendering mode profile onto renderer cfg.""" + override_fields = { + "newton_warp_enable_textures": "enable_textures", + "newton_warp_enable_shadows": "enable_shadows", + "newton_warp_enable_ambient_lighting": "enable_ambient_lighting", + "newton_warp_enable_backface_culling": "enable_backface_culling", + "newton_warp_max_distance": "max_distance", + "newton_warp_create_default_light": "create_default_light", + } + for mode_field, ren_field in override_fields.items(): + value = getattr(mode_cfg, mode_field, None) + if value is not None and hasattr(renderer_cfg, ren_field): + setattr(renderer_cfg, ren_field, value) + + +def apply_mode_profile_to_renderer_cfg( + get_setting: Any, + set_setting: Any, + renderer_cfg: Any, + mode_cfgs: dict[str, RenderingModeCfg], + logger: Any, +) -> None: + """Resolve and apply a rendering mode profile to a :class:`~isaaclab.renderers.RendererCfg` (in place).""" + mode_name = resolve_rendering_mode_name_for_renderer_cfg(get_setting, renderer_cfg) + mode_cfg = resolve_rendering_mode_cfg(mode_name, mode_cfgs, logger) + if mode_cfg is None: + return + + rtype = getattr(renderer_cfg, "renderer_type", None) + if rtype in ("default", "isaac_rtx", "rtx"): + apply_kit_rendering_mode_cfg(set_setting, mode_cfg) + elif rtype == "newton_warp": + apply_newton_warp_mode_cfg_to_renderer_cfg(renderer_cfg, mode_cfg) + + def apply_newton_mode_cfg_to_visualizer_cfg(visualizer_cfg: Any, mode_cfg: RenderingModeCfg) -> None: """Apply Newton rendering mode values to a visualizer cfg object.""" override_fields = { diff --git a/source/isaaclab/isaaclab/sensors/camera/camera.py b/source/isaaclab/isaaclab/sensors/camera/camera.py index 70ccc6c14dd..c7905a3db0a 100644 --- a/source/isaaclab/isaaclab/sensors/camera/camera.py +++ b/source/isaaclab/isaaclab/sensors/camera/camera.py @@ -20,6 +20,8 @@ import isaaclab.sim as sim_utils import isaaclab.utils.sensors as sensor_utils from isaaclab.app.settings_manager import get_settings_manager +from isaaclab.rendering_mode.rendering_mode_utils import apply_mode_profile_to_renderer_cfg +from isaaclab.sim import SimulationContext from isaaclab.sim.views import XformPrimView from isaaclab.utils import has_kit, to_camel_case from isaaclab.utils.array import convert_to_torch @@ -443,6 +445,17 @@ def _initialize_impl(self): " rendering." ) + sim = SimulationContext.instance() + if sim is not None: + mode_cfgs = getattr(sim.cfg, "rendering_mode_cfgs", None) or {} + apply_mode_profile_to_renderer_cfg( + sim.get_setting, + sim.set_setting, + self.cfg.renderer_cfg, + mode_cfgs, + logger, + ) + import omni.replicator.core as rep from omni.syntheticdata.scripts.SyntheticData import SyntheticData diff --git a/source/isaaclab/isaaclab/sensors/camera/tiled_camera.py b/source/isaaclab/isaaclab/sensors/camera/tiled_camera.py index e6ae56adaa5..db4d46c0df3 100644 --- a/source/isaaclab/isaaclab/sensors/camera/tiled_camera.py +++ b/source/isaaclab/isaaclab/sensors/camera/tiled_camera.py @@ -17,6 +17,8 @@ from isaaclab.app.settings_manager import get_settings_manager from isaaclab.renderers import Renderer +from isaaclab.rendering_mode.rendering_mode_utils import apply_mode_profile_to_renderer_cfg +from isaaclab.sim import SimulationContext from isaaclab.sim.views import XformPrimView from ..sensor_base import SensorBase @@ -163,6 +165,17 @@ def _initialize_impl(self): # Initialize parent class SensorBase._initialize_impl(self) + sim = SimulationContext.instance() + if sim is not None: + mode_cfgs = getattr(sim.cfg, "rendering_mode_cfgs", None) or {} + apply_mode_profile_to_renderer_cfg( + sim.get_setting, + sim.set_setting, + self.cfg.renderer_cfg, + mode_cfgs, + logger, + ) + self.renderer = Renderer(self.cfg.renderer_cfg) logger.info("Using renderer: %s", type(self.renderer).__name__) diff --git a/source/isaaclab/test/rendering_mode/test_rendering_mode_renderer_bridge.py b/source/isaaclab/test/rendering_mode/test_rendering_mode_renderer_bridge.py new file mode 100644 index 00000000000..1e932afe0e7 --- /dev/null +++ b/source/isaaclab/test/rendering_mode/test_rendering_mode_renderer_bridge.py @@ -0,0 +1,69 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Unit tests for rendering mode resolution on renderer configs (no Kit required).""" + +from __future__ import annotations + +from isaaclab.renderers.renderer_cfg import RendererCfg +from isaaclab.rendering_mode.rendering_mode_cfg import RenderingModeCfg +from isaaclab.rendering_mode.rendering_mode_utils import ( + apply_mode_profile_to_renderer_cfg, + apply_newton_warp_mode_cfg_to_renderer_cfg, + resolve_rendering_mode_name_for_renderer_cfg, +) + + +class _FakeSettings: + def __init__(self, explicit: bool, mode: str): + self._data = { + "/isaaclab/rendering/rendering_mode/explicit": explicit, + "/isaaclab/rendering/rendering_mode": mode, + } + + def get(self, key: str): + return self._data[key] + + +def test_resolve_renderer_mode_cli_explicit_overrides_cfg(): + r_cfg = RendererCfg(renderer_type="isaac_rtx", rendering_mode="quality") + settings = _FakeSettings(explicit=True, mode="performance") + assert resolve_rendering_mode_name_for_renderer_cfg(settings.get, r_cfg) == "performance" + + +def test_resolve_renderer_mode_uses_cfg_when_cli_not_explicit(): + r_cfg = RendererCfg(renderer_type="isaac_rtx", rendering_mode="balanced") + settings = _FakeSettings(explicit=False, mode="") + assert resolve_rendering_mode_name_for_renderer_cfg(settings.get, r_cfg) == "balanced" + + +def test_apply_newton_warp_overrides_mutate_cfg(): + mode_cfg = RenderingModeCfg( + newton_warp_enable_shadows=True, + newton_warp_max_distance=42.0, + ) + from isaaclab_newton.renderers.newton_warp_renderer_cfg import NewtonWarpRendererCfg + + ren = NewtonWarpRendererCfg() + assert ren.enable_shadows is False + assert ren.max_distance == 1000.0 + apply_newton_warp_mode_cfg_to_renderer_cfg(ren, mode_cfg) + assert ren.enable_shadows is True + assert ren.max_distance == 42.0 + + +def test_apply_mode_profile_kit_branch_calls_set_setting(): + recorded: list[tuple[str, object]] = [] + + def get_setting(key: str): + return _FakeSettings(explicit=False, mode="").get(key) + + def set_setting(name: str, value: object) -> None: + recorded.append((name, value)) + + r_cfg = RendererCfg(renderer_type="isaac_rtx", rendering_mode="performance") + mode_cfgs = {"performance": RenderingModeCfg(rendering_mode_preset="performance")} + apply_mode_profile_to_renderer_cfg(get_setting, set_setting, r_cfg, mode_cfgs, logger=__import__("logging").getLogger(__name__)) + assert any(k == "/rtx/shadows/enabled" for k, _ in recorded) From c965da5c6d6b1d4fb5aebaad81fdbf10610ad7f2 Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Wed, 8 Apr 2026 22:11:01 +0000 Subject: [PATCH 21/34] debuggin --- docs/source/how-to/configure_rendering.rst | 18 +++ source/isaaclab/isaaclab/app/app_launcher.py | 14 +- .../isaaclab/isaaclab/app/settings_manager.py | 11 ++ .../rendering_mode/rendering_mode_utils.py | 147 ++++++++++++++++-- .../test_rendering_mode_renderer_bridge.py | 36 ++++- .../test/sim/test_simulation_render_config.py | 3 +- .../visualizers/kit_visualizer.py | 2 +- .../visualizers/kit_visualizer_cfg.py | 2 +- .../newton/newton_visualizer_cfg.py | 18 +++ .../viser/viser_visualizer.py | 56 +++++++ source/isaaclab_visualizers/setup.py | 2 + 11 files changed, 283 insertions(+), 26 deletions(-) diff --git a/docs/source/how-to/configure_rendering.rst b/docs/source/how-to/configure_rendering.rst index db3b1c5b4ff..9447f1d3f7e 100644 --- a/docs/source/how-to/configure_rendering.rst +++ b/docs/source/how-to/configure_rendering.rst @@ -57,6 +57,20 @@ Notes: is applied for that camera's renderer. * ``--rendering_mode`` is the supported CLI entry point. +.. note:: + + The built-in profiles ``performance``, ``balanced``, and ``quality`` set :attr:`rendering_mode_preset + `, which applies **Kit / RTX** carb + settings. Those preset differences therefore show up for the Kit viewport and for Kit-style camera + renderers (``default``, ``isaac_rtx``, ``rtx``). + + Other targets read only their own fields on :class:`~isaaclab.rendering_mode.RenderingModeCfg` — for + example the Newton visualizer uses ``newton_*``, and the Newton Warp tiled camera uses + ``newton_warp_*``. Switching only the profile **name** may not change appearance for those paths + unless you define separate entries in :attr:`~sim.SimulationCfg.rendering_mode_cfgs` with different + values for those fields. Additional preset-driven behavior for other visualizers and renderers may + be added in future releases. + Example renders from the ``set_rendering_mode.py`` script. To help assess rendering, the example scene includes reflections, translucency, direct and ambient lighting, and several material types. @@ -135,6 +149,10 @@ There are two ways to provide settings that overwrite presets: +------------------------------------+-------------------------------------------------------------------------+ | kit_enable_ambient_occlusion | Bool. Enables ambient occlusion at performance cost. | +------------------------------------+-------------------------------------------------------------------------+ + | kit_dome_light_upper_lower_strategy | Literal[0, 3, 4]. Maps to ``/rtx/domeLight/upperLowerStrategy`` (dome | + | | light upper/lower hemisphere handling; see Omniverse RTX docs for | + | | semantics of each value). | + +------------------------------------+-------------------------------------------------------------------------+ 2. If you need a custom profile, define your own named entry in diff --git a/source/isaaclab/isaaclab/app/app_launcher.py b/source/isaaclab/isaaclab/app/app_launcher.py index ad4dbf1a10a..dd966af526a 100644 --- a/source/isaaclab/isaaclab/app/app_launcher.py +++ b/source/isaaclab/isaaclab/app/app_launcher.py @@ -28,7 +28,11 @@ import isaacsim # noqa: F401 from isaacsim import SimulationApp -from isaaclab.app.settings_manager import get_settings_manager, initialize_carb_settings +from isaaclab.app.settings_manager import ( + ISAACLAB_RENDERING_MODE_PROFILE_MIRROR_PATH, + get_settings_manager, + initialize_carb_settings, +) # import logger logger = logging.getLogger(__name__) @@ -446,9 +450,9 @@ def add_app_launcher_args(parser: argparse.ArgumentParser) -> None: action=ExplicitAction, choices={"performance", "balanced", "quality"}, help=( - "Sets the rendering mode. Preset settings files can be found in apps/rendering_modes." - ' Can be "performance", "balanced", or "quality".' - " Individual settings can be overwritten by using the RenderCfg class." + "Selects a named profile from SimulationCfg.rendering_mode_cfgs (default: performance, " + "balanced, quality). Overrides per-visualizer and per-camera rendering_mode when set. " + "Customize profiles with isaaclab.rendering_mode.RenderingModeCfg." ), ) arg_group.add_argument( @@ -1128,6 +1132,8 @@ def _set_rendering_mode_settings(self, launcher_args: dict) -> None: settings = get_settings_manager() settings.set_string("/isaaclab/rendering/rendering_mode", rendering_mode) settings.set_bool("/isaaclab/rendering/rendering_mode/explicit", bool(rendering_mode_explicit)) + # carb.settings.get() may return a subtree dict for the path above; mirror the CLI string for readers. + settings.set_isaaclab_override(ISAACLAB_RENDERING_MODE_PROFILE_MIRROR_PATH, rendering_mode or "") def _set_animation_recording_settings(self, launcher_args: dict) -> None: """Store animation recording settings in settings.""" diff --git a/source/isaaclab/isaaclab/app/settings_manager.py b/source/isaaclab/isaaclab/app/settings_manager.py index 8281c627a91..360900c9dd2 100644 --- a/source/isaaclab/isaaclab/app/settings_manager.py +++ b/source/isaaclab/isaaclab/app/settings_manager.py @@ -19,6 +19,9 @@ # Key for storing singleton in sys.modules to survive module reloads (e.g., from Hydra) _SINGLETON_KEY = "__isaaclab_settings_manager_singleton__" +# Mirrors :obj:`/isaaclab/rendering/rendering_mode` as a plain string; carb ``get()`` may return a subtree dict. +ISAACLAB_RENDERING_MODE_PROFILE_MIRROR_PATH = "/isaaclab/rendering/rendering_mode_profile" + class SettingsManager: """A settings manager that provides a carb.settings-like interface without requiring Omniverse. @@ -58,6 +61,8 @@ def __init__(self): self._standalone_settings: dict[str, Any] = {} self._carb_settings = None self._use_carb = False + # Python-side overrides read first in :meth:`get` (e.g. CLI string mirror when carb returns dicts). + self._isaaclab_overrides: dict[str, Any] = {} self._needs_init = False @classmethod @@ -114,6 +119,10 @@ def set(self, path: str, value: Any) -> None: # Standalone mode - use dictionary self._standalone_settings[path] = value + def set_isaaclab_override(self, path: str, value: Any) -> None: + """Store a value that :meth:`get` resolves before carb/standalone (for paths carb returns as dicts).""" + self._isaaclab_overrides[path] = value + def get(self, path: str, default: Any = None) -> Any: """Get a setting value at the given path. @@ -124,6 +133,8 @@ def get(self, path: str, default: Any = None) -> Any: Returns: The value at the path, or default if not found """ + if path in self._isaaclab_overrides: + return self._isaaclab_overrides[path] if self._use_carb and self._carb_settings is not None: # Delegate to carb.settings value = self._carb_settings.get(path) diff --git a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py index a797fb7fb64..11f01d01cb4 100644 --- a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py +++ b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py @@ -7,11 +7,122 @@ from __future__ import annotations +import logging from typing import Any +from isaaclab.app.settings_manager import ISAACLAB_RENDERING_MODE_PROFILE_MIRROR_PATH + from .rendering_mode_cfg import RenderingModeCfg from .rendering_mode_presets import get_kit_rendering_preset +_logger = logging.getLogger(__name__) + +# Log at most once if carb + heuristics cannot resolve CLI mode (mirror path should prevent this). +_cli_rendering_mode_resolution_warned = False + +_KNOWN_RENDERING_MODE_PRESETS = frozenset({"performance", "balanced", "quality"}) + + +def _collect_str_leaves(obj: Any, out: list[str], depth: int = 0) -> None: + """Collect non-empty strings from nested dict/list structures (carb subtrees).""" + if depth > 12: + return + if isinstance(obj, str): + s = obj.strip() + if s: + out.append(s) + return + if isinstance(obj, dict): + for v in obj.values(): + _collect_str_leaves(v, out, depth + 1) + elif isinstance(obj, (list, tuple, set)): + for v in obj: + _collect_str_leaves(v, out, depth + 1) + + +def _coerce_carb_rendering_mode_value(raw: Any) -> str | None: + """Best-effort string profile name from carb get()/subtree dicts.""" + if raw is None: + return None + if isinstance(raw, str): + out = raw.strip() + return out if out else None + strings: list[str] = [] + _collect_str_leaves(raw, strings) + if not strings: + return None + for s in strings: + if s in _KNOWN_RENDERING_MODE_PRESETS: + return s + return strings[0] + + +def _read_cli_rendering_mode_profile_name(get_setting: Any) -> str | None: + """Read CLI rendering mode profile name. + + :data:`ISAACLAB_RENDERING_MODE_PROFILE_MIRROR_PATH` is set by :class:`~isaaclab.app.AppLauncher` with the + same string passed to carb ``set_string``, because :meth:`carb.settings.ISettings.get` may return a + subtree ``dict`` for ``/isaaclab/rendering/rendering_mode`` instead of the profile string. + """ + global _cli_rendering_mode_resolution_warned + + mirror = get_setting(ISAACLAB_RENDERING_MODE_PROFILE_MIRROR_PATH) + if isinstance(mirror, str) and mirror.strip(): + return mirror.strip() + + raw = get_setting("/isaaclab/rendering/rendering_mode") + coerced = _coerce_carb_rendering_mode_value(raw) + if coerced: + return coerced + + # Typed carb reads (leaf path and common alternates some Kit builds use). + try: + import carb + + gs = carb.settings.get_settings() + if gs is not None and hasattr(gs, "get_string"): + for path in ( + "/isaaclab/rendering/rendering_mode", + "/isaaclab/rendering/rendering_mode/value", + "/isaaclab/rendering/rendering_mode/default", + ): + try: + s = gs.get_string(path) + if s is not None: + out = str(s).strip() + if out: + return out + except Exception: + continue + except Exception: + pass + + if raw is not None and not isinstance(raw, str): + if not _cli_rendering_mode_resolution_warned: + _cli_rendering_mode_resolution_warned = True + _logger.warning( + "Could not read /isaaclab/rendering/rendering_mode as a profile name (got %s). " + "CLI rendering mode override may be ignored. " + "Expected mirror at %s (set by AppLauncher).", + type(raw).__name__, + ISAACLAB_RENDERING_MODE_PROFILE_MIRROR_PATH, + ) + return None + + +def _normalize_rendering_mode_profile_name(name: Any) -> str | None: + """Return a non-empty string profile name, or None if invalid.""" + if name is None: + return None + if isinstance(name, str): + out = name.strip() + return out if out else None + _logger.warning( + "rendering_mode must be a non-empty str, got %s; ignoring.", + type(name).__name__, + ) + return None + def apply_kit_rendering_preset(set_setting: Any, preset_name: str) -> None: """Apply a named kit preset via provided setting setter.""" @@ -25,6 +136,16 @@ def apply_kit_rendering_mode_cfg(set_setting: Any, mode_cfg: RenderingModeCfg) - if mode_cfg.rendering_mode_preset: apply_kit_rendering_preset(set_setting, mode_cfg.rendering_mode_preset) + # Replicator's set_render_rtx_realtime() can reset other RTX carb flags. Run it before applying + # explicit kit_* carb paths so user overrides remain authoritative. + if mode_cfg.kit_antialiasing_mode is not None: + try: + import omni.replicator.core as rep + + rep.settings.set_render_rtx_realtime(antialiasing=mode_cfg.kit_antialiasing_mode) + except Exception: + pass + field_to_carb = { "kit_enable_translucency": "/rtx/translucency/enabled", "kit_enable_reflections": "/rtx/reflections/enabled", @@ -43,23 +164,13 @@ def apply_kit_rendering_mode_cfg(set_setting: Any, mode_cfg: RenderingModeCfg) - if value is not None: set_setting(carb_key, value) - if mode_cfg.kit_antialiasing_mode is not None: - try: - import omni.replicator.core as rep - - rep.settings.set_render_rtx_realtime(antialiasing=mode_cfg.kit_antialiasing_mode) - except Exception: - pass - def resolve_rendering_mode_name_for_renderer_cfg(get_setting: Any, renderer_cfg: Any) -> str | None: """Resolve effective rendering mode profile name for a camera/renderer cfg.""" cli_mode_explicit = bool(get_setting("/isaaclab/rendering/rendering_mode/explicit")) - cli_mode = get_setting("/isaaclab/rendering/rendering_mode") if cli_mode_explicit: - return cli_mode if cli_mode else None - mode_name = getattr(renderer_cfg, "rendering_mode", None) - return mode_name if mode_name else None + return _read_cli_rendering_mode_profile_name(get_setting) + return _normalize_rendering_mode_profile_name(getattr(renderer_cfg, "rendering_mode", None)) def apply_newton_warp_mode_cfg_to_renderer_cfg(renderer_cfg: Any, mode_cfg: RenderingModeCfg) -> None: @@ -136,11 +247,9 @@ def apply_newton_mode_cfg_to_viewer(viewer: Any, mode_cfg: RenderingModeCfg) -> def resolve_rendering_mode_name_for_visualizer_cfg(get_setting: Any, visualizer_cfg: Any) -> str | None: """Resolve effective rendering mode profile name for a visualizer cfg.""" cli_mode_explicit = bool(get_setting("/isaaclab/rendering/rendering_mode/explicit")) - cli_mode = get_setting("/isaaclab/rendering/rendering_mode") if cli_mode_explicit: - return cli_mode if cli_mode else None - mode_name = getattr(visualizer_cfg, "rendering_mode", None) - return mode_name if mode_name else None + return _read_cli_rendering_mode_profile_name(get_setting) + return _normalize_rendering_mode_profile_name(getattr(visualizer_cfg, "rendering_mode", None)) def resolve_rendering_mode_cfg( @@ -149,6 +258,12 @@ def resolve_rendering_mode_cfg( """Fetch rendering mode cfg by name and log if missing.""" if not mode_name: return None + if not isinstance(mode_name, str): + logger.warning( + "[SimulationContext] Rendering mode name must be str, got %s; skipping profile lookup.", + type(mode_name).__name__, + ) + return None mode_cfg = mode_cfgs.get(mode_name) if mode_cfg is None: logger.warning( diff --git a/source/isaaclab/test/rendering_mode/test_rendering_mode_renderer_bridge.py b/source/isaaclab/test/rendering_mode/test_rendering_mode_renderer_bridge.py index 1e932afe0e7..94d08db98a6 100644 --- a/source/isaaclab/test/rendering_mode/test_rendering_mode_renderer_bridge.py +++ b/source/isaaclab/test/rendering_mode/test_rendering_mode_renderer_bridge.py @@ -7,24 +7,28 @@ from __future__ import annotations +from isaaclab.app.settings_manager import ISAACLAB_RENDERING_MODE_PROFILE_MIRROR_PATH from isaaclab.renderers.renderer_cfg import RendererCfg from isaaclab.rendering_mode.rendering_mode_cfg import RenderingModeCfg from isaaclab.rendering_mode.rendering_mode_utils import ( apply_mode_profile_to_renderer_cfg, apply_newton_warp_mode_cfg_to_renderer_cfg, + resolve_rendering_mode_cfg, resolve_rendering_mode_name_for_renderer_cfg, ) class _FakeSettings: - def __init__(self, explicit: bool, mode: str): - self._data = { + def __init__(self, explicit: bool, mode, mirror: str | None = None): + self._data: dict[str, object] = { "/isaaclab/rendering/rendering_mode/explicit": explicit, "/isaaclab/rendering/rendering_mode": mode, } + if mirror is not None: + self._data[ISAACLAB_RENDERING_MODE_PROFILE_MIRROR_PATH] = mirror def get(self, key: str): - return self._data[key] + return self._data.get(key) def test_resolve_renderer_mode_cli_explicit_overrides_cfg(): @@ -33,12 +37,38 @@ def test_resolve_renderer_mode_cli_explicit_overrides_cfg(): assert resolve_rendering_mode_name_for_renderer_cfg(settings.get, r_cfg) == "performance" +def test_resolve_renderer_mode_cli_explicit_coerces_carb_dict(): + """Some Kit builds return a subtree dict from carb get(); profile name may be embedded.""" + r_cfg = RendererCfg(renderer_type="isaac_rtx", rendering_mode="performance") + settings = _FakeSettings(explicit=True, mode={"leaf": "quality"}) + assert resolve_rendering_mode_name_for_renderer_cfg(settings.get, r_cfg) == "quality" + + +def test_resolve_renderer_mode_cli_explicit_coerces_nested_carb_dict(): + r_cfg = RendererCfg(renderer_type="isaac_rtx", rendering_mode="performance") + settings = _FakeSettings(explicit=True, mode={"outer": {"inner": "balanced"}}) + assert resolve_rendering_mode_name_for_renderer_cfg(settings.get, r_cfg) == "balanced" + + +def test_cli_profile_mirror_overrides_unreadable_carb_dict(): + """AppLauncher mirrors the profile string; it wins when carb get() has no string leaves.""" + r_cfg = RendererCfg(renderer_type="isaac_rtx", rendering_mode="performance") + settings = _FakeSettings(explicit=True, mode={"flags": True, "count": 2}, mirror="quality") + assert resolve_rendering_mode_name_for_renderer_cfg(settings.get, r_cfg) == "quality" + + def test_resolve_renderer_mode_uses_cfg_when_cli_not_explicit(): r_cfg = RendererCfg(renderer_type="isaac_rtx", rendering_mode="balanced") settings = _FakeSettings(explicit=False, mode="") assert resolve_rendering_mode_name_for_renderer_cfg(settings.get, r_cfg) == "balanced" +def test_resolve_rendering_mode_cfg_rejects_non_str_mode_name(): + """Profile lookup keys must be str (guards against bad carb.get() types).""" + log = __import__("logging").getLogger(__name__) + assert resolve_rendering_mode_cfg({}, {"q": RenderingModeCfg()}, log) is None + + def test_apply_newton_warp_overrides_mutate_cfg(): mode_cfg = RenderingModeCfg( newton_warp_enable_shadows=True, diff --git a/source/isaaclab/test/sim/test_simulation_render_config.py b/source/isaaclab/test/sim/test_simulation_render_config.py index b65e707ca78..4eb7d111a99 100644 --- a/source/isaaclab/test/sim/test_simulation_render_config.py +++ b/source/isaaclab/test/sim/test_simulation_render_config.py @@ -47,7 +47,8 @@ def test_rendering_mode_presets(): settings = get_settings_manager() for key, val in preset_dict.items(): - setting_name = "/" + key.replace(".", "/") + # Preset keys are already absolute carb paths (e.g. "/rtx/..."); avoid a double leading slash. + setting_name = key if key.startswith("/") else "/" + key.replace(".", "/") expected = dlss_override if setting_name == "/rtx/post/dlss/execMode" else val assert settings.get(setting_name) == expected, ( f"Mismatch for '{setting_name}' in mode '{mode_name}': " diff --git a/source/isaaclab_physx/isaaclab_physx/visualizers/kit_visualizer.py b/source/isaaclab_physx/isaaclab_physx/visualizers/kit_visualizer.py index 851b2feb9e2..150cf030ce6 100644 --- a/source/isaaclab_physx/isaaclab_physx/visualizers/kit_visualizer.py +++ b/source/isaaclab_physx/isaaclab_physx/visualizers/kit_visualizer.py @@ -3,4 +3,4 @@ # # SPDX-License-Identifier: BSD-3-Clause -from isaaclab.visualizers.kit_visualizer import * # noqa: F401, F403 +from isaaclab_visualizers.kit.kit_visualizer import * # noqa: F401, F403 diff --git a/source/isaaclab_physx/isaaclab_physx/visualizers/kit_visualizer_cfg.py b/source/isaaclab_physx/isaaclab_physx/visualizers/kit_visualizer_cfg.py index 1540cfa2869..35b1622287f 100644 --- a/source/isaaclab_physx/isaaclab_physx/visualizers/kit_visualizer_cfg.py +++ b/source/isaaclab_physx/isaaclab_physx/visualizers/kit_visualizer_cfg.py @@ -3,4 +3,4 @@ # # SPDX-License-Identifier: BSD-3-Clause -from isaaclab.visualizers.kit_visualizer_cfg import * # noqa: F401, F403 +from isaaclab_visualizers.kit.kit_visualizer_cfg import * # noqa: F401, F403 diff --git a/source/isaaclab_visualizers/isaaclab_visualizers/newton/newton_visualizer_cfg.py b/source/isaaclab_visualizers/isaaclab_visualizers/newton/newton_visualizer_cfg.py index 654d0c641a1..15694169a31 100644 --- a/source/isaaclab_visualizers/isaaclab_visualizers/newton/newton_visualizer_cfg.py +++ b/source/isaaclab_visualizers/isaaclab_visualizers/newton/newton_visualizer_cfg.py @@ -45,3 +45,21 @@ class NewtonVisualizerCfg(VisualizerCfg): show_com: bool = False """Show center of mass visualization.""" + + enable_shadows: bool = True + """Enable shadow rendering in the Newton GL viewer.""" + + enable_sky: bool = True + """Enable sky gradient rendering.""" + + enable_wireframe: bool = False + """Enable wireframe overlay.""" + + sky_upper_color: tuple[float, float, float] = (0.2, 0.4, 0.6) + """Upper sky gradient color (RGB).""" + + sky_lower_color: tuple[float, float, float] = (0.5, 0.6, 0.7) + """Lower sky gradient color (RGB).""" + + light_color: tuple[float, float, float] = (1.0, 1.0, 1.0) + """Directional light color (RGB).""" diff --git a/source/isaaclab_visualizers/isaaclab_visualizers/viser/viser_visualizer.py b/source/isaaclab_visualizers/isaaclab_visualizers/viser/viser_visualizer.py index c20bfcd85a9..684751b2c0a 100644 --- a/source/isaaclab_visualizers/isaaclab_visualizers/viser/viser_visualizer.py +++ b/source/isaaclab_visualizers/isaaclab_visualizers/viser/viser_visualizer.py @@ -11,10 +11,66 @@ import io import logging import os +import sys import webbrowser from pathlib import Path from typing import TYPE_CHECKING, Any + +def _prioritize_site_packages_over_kit_prebundle() -> None: + """Put conda/venv site-packages before Isaac Sim ``pip_prebundle`` on ``sys.path``. + + Kit ships an older ``websockets`` in ``omni.kit.pip_archive``; ``viser`` needs a modern API + (e.g. ``SERVER`` in ``websockets.http11``). Without this, imports can mix prebundle and PyPI + submodules and raise ``ImportError`` at runtime. + """ + try: + import site + except Exception: + return + + paths: list[str] = [] + if hasattr(site, "getusersitepackages"): + u = site.getusersitepackages() + if u: + paths.append(u) + try: + paths.extend(site.getsitepackages()) + except Exception: + pass + + seen: set[str] = set() + ordered: list[str] = [] + for p in paths: + if p and p not in seen and p in sys.path: + seen.add(p) + ordered.append(p) + + for p in ordered: + try: + sys.path.remove(p) + except ValueError: + continue + for p in reversed(ordered): + sys.path.insert(0, p) + + +def _drop_websockets_if_from_prebundle() -> None: + """If ``websockets`` was already loaded from Kit prebundle, drop it so it reloads from site-packages.""" + mod = sys.modules.get("websockets") + if mod is None: + return + f = getattr(mod, "__file__", "") or "" + if "pip_prebundle" not in f: + return + for k in list(sys.modules): + if k == "websockets" or k.startswith("websockets."): + del sys.modules[k] + + +_prioritize_site_packages_over_kit_prebundle() +_drop_websockets_if_from_prebundle() + from newton.viewer import ViewerViser from isaaclab.visualizers.base_visualizer import BaseVisualizer diff --git a/source/isaaclab_visualizers/setup.py b/source/isaaclab_visualizers/setup.py index 5b0c24cffa6..729b9a9e8cc 100644 --- a/source/isaaclab_visualizers/setup.py +++ b/source/isaaclab_visualizers/setup.py @@ -28,6 +28,8 @@ "viser": [ "newton @ git+https://github.com/newton-physics/newton.git@2684d75bfa4bb8b058a93b81c458a74b7701c997", "viser>=1.0.16", + # Viser requires a current websockets API; Isaac Sim's pip_prebundle may ship an older copy. + "websockets>=13.0", ], } From f0c275c12c5483620d8b55ce60cc170c289aa0ed Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Wed, 8 Apr 2026 22:46:49 +0000 Subject: [PATCH 22/34] clean --- docs/source/features/visualization.rst | 4 +-- .../tutorials/00_sim/set_rendering_mode.py | 7 ++++++ source/isaaclab/isaaclab/app/app_launcher.py | 8 +----- .../isaaclab/isaaclab/app/settings_manager.py | 25 +++++++++++-------- .../rendering_mode/rendering_mode_utils.py | 21 ++++++---------- .../isaaclab/visualizers/visualizer_cfg.py | 2 +- .../test_rendering_mode_renderer_bridge.py | 13 ++++------ 7 files changed, 37 insertions(+), 43 deletions(-) diff --git a/docs/source/features/visualization.rst b/docs/source/features/visualization.rst index d46ff6bd015..13d573308ef 100644 --- a/docs/source/features/visualization.rst +++ b/docs/source/features/visualization.rst @@ -103,7 +103,7 @@ You can also configure custom visualizers in the code by defining ``VisualizerCf sim_cfg = SimulationCfg( visualizer_cfgs=[ - OVVisualizerCfg( + KitVisualizerCfg( viewport_name="Visualizer Viewport", create_viewport=True, dock_position="SAME", @@ -192,7 +192,7 @@ Omniverse Visualizer from isaaclab_visualizers.kit import KitVisualizerCfg - visualizer_cfg = OVVisualizerCfg( + visualizer_cfg = KitVisualizerCfg( # Viewport settings viewport_name="Visualizer Viewport", # Viewport window name create_viewport=True, # Create new viewport vs. use existing diff --git a/scripts/tutorials/00_sim/set_rendering_mode.py b/scripts/tutorials/00_sim/set_rendering_mode.py index ba1d94c3f11..0fe702b7ffe 100644 --- a/scripts/tutorials/00_sim/set_rendering_mode.py +++ b/scripts/tutorials/00_sim/set_rendering_mode.py @@ -65,6 +65,13 @@ def main(): # Play the simulator sim.reset() + # Extra RTX carb overrides (dot keys -> ``/rtx/...`` paths). Applied after reset so they are not + # replaced by rendering-mode profile application during ``initialize_visualizers()``. + carb_settings = {"rtx.reflections.enabled": True} + for key, value in carb_settings.items(): + path = key if key.startswith("/") else "/" + key.replace(".", "/") + sim.set_setting(path, value) + # Now we are ready! print("[INFO]: Setup complete...") diff --git a/source/isaaclab/isaaclab/app/app_launcher.py b/source/isaaclab/isaaclab/app/app_launcher.py index dd966af526a..3dca67a7b7f 100644 --- a/source/isaaclab/isaaclab/app/app_launcher.py +++ b/source/isaaclab/isaaclab/app/app_launcher.py @@ -28,11 +28,7 @@ import isaacsim # noqa: F401 from isaacsim import SimulationApp -from isaaclab.app.settings_manager import ( - ISAACLAB_RENDERING_MODE_PROFILE_MIRROR_PATH, - get_settings_manager, - initialize_carb_settings, -) +from isaaclab.app.settings_manager import get_settings_manager, initialize_carb_settings # import logger logger = logging.getLogger(__name__) @@ -1132,8 +1128,6 @@ def _set_rendering_mode_settings(self, launcher_args: dict) -> None: settings = get_settings_manager() settings.set_string("/isaaclab/rendering/rendering_mode", rendering_mode) settings.set_bool("/isaaclab/rendering/rendering_mode/explicit", bool(rendering_mode_explicit)) - # carb.settings.get() may return a subtree dict for the path above; mirror the CLI string for readers. - settings.set_isaaclab_override(ISAACLAB_RENDERING_MODE_PROFILE_MIRROR_PATH, rendering_mode or "") def _set_animation_recording_settings(self, launcher_args: dict) -> None: """Store animation recording settings in settings.""" diff --git a/source/isaaclab/isaaclab/app/settings_manager.py b/source/isaaclab/isaaclab/app/settings_manager.py index 360900c9dd2..ab394fd09bd 100644 --- a/source/isaaclab/isaaclab/app/settings_manager.py +++ b/source/isaaclab/isaaclab/app/settings_manager.py @@ -19,8 +19,9 @@ # Key for storing singleton in sys.modules to survive module reloads (e.g., from Hydra) _SINGLETON_KEY = "__isaaclab_settings_manager_singleton__" -# Mirrors :obj:`/isaaclab/rendering/rendering_mode` as a plain string; carb ``get()`` may return a subtree dict. -ISAACLAB_RENDERING_MODE_PROFILE_MIRROR_PATH = "/isaaclab/rendering/rendering_mode_profile" +# CLI rendering mode profile (``performance`` / ``balanced`` / ``quality``). Generic carb ``get()`` can +# return a subtree dict for this path; ``get_string()`` reads the leaf value set by ``set_string``. +_ISAACLAB_RENDERING_MODE_PATH = "/isaaclab/rendering/rendering_mode" class SettingsManager: @@ -61,8 +62,6 @@ def __init__(self): self._standalone_settings: dict[str, Any] = {} self._carb_settings = None self._use_carb = False - # Python-side overrides read first in :meth:`get` (e.g. CLI string mirror when carb returns dicts). - self._isaaclab_overrides: dict[str, Any] = {} self._needs_init = False @classmethod @@ -119,10 +118,6 @@ def set(self, path: str, value: Any) -> None: # Standalone mode - use dictionary self._standalone_settings[path] = value - def set_isaaclab_override(self, path: str, value: Any) -> None: - """Store a value that :meth:`get` resolves before carb/standalone (for paths carb returns as dicts).""" - self._isaaclab_overrides[path] = value - def get(self, path: str, default: Any = None) -> Any: """Get a setting value at the given path. @@ -133,10 +128,18 @@ def get(self, path: str, default: Any = None) -> Any: Returns: The value at the path, or default if not found """ - if path in self._isaaclab_overrides: - return self._isaaclab_overrides[path] if self._use_carb and self._carb_settings is not None: - # Delegate to carb.settings + # Prefer typed string read for CLI rendering mode: generic ``get()`` may return a subtree dict. + if path == _ISAACLAB_RENDERING_MODE_PATH: + try: + if hasattr(self._carb_settings, "get_string"): + s = self._carb_settings.get_string(path) + if s is not None: + out = str(s).strip() + if out: + return out + except Exception: + pass value = self._carb_settings.get(path) return value if value is not None else default else: diff --git a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py index 11f01d01cb4..a74951ad913 100644 --- a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py +++ b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py @@ -10,14 +10,12 @@ import logging from typing import Any -from isaaclab.app.settings_manager import ISAACLAB_RENDERING_MODE_PROFILE_MIRROR_PATH - from .rendering_mode_cfg import RenderingModeCfg from .rendering_mode_presets import get_kit_rendering_preset _logger = logging.getLogger(__name__) -# Log at most once if carb + heuristics cannot resolve CLI mode (mirror path should prevent this). +# Log at most once if carb + heuristics cannot resolve CLI mode. _cli_rendering_mode_resolution_warned = False _KNOWN_RENDERING_MODE_PRESETS = frozenset({"performance", "balanced", "quality"}) @@ -58,18 +56,15 @@ def _coerce_carb_rendering_mode_value(raw: Any) -> str | None: def _read_cli_rendering_mode_profile_name(get_setting: Any) -> str | None: - """Read CLI rendering mode profile name. + """Read CLI rendering mode profile name (``performance`` / ``balanced`` / ``quality``). - :data:`ISAACLAB_RENDERING_MODE_PROFILE_MIRROR_PATH` is set by :class:`~isaaclab.app.AppLauncher` with the - same string passed to carb ``set_string``, because :meth:`carb.settings.ISettings.get` may return a - subtree ``dict`` for ``/isaaclab/rendering/rendering_mode`` instead of the profile string. + :class:`~isaaclab.app.settings_manager.SettingsManager` and :class:`~isaaclab.sim.simulation_context.SettingsHelper` resolve + ``/isaaclab/rendering/rendering_mode`` via ``get_string`` when using carb so readers see the string + set by ``set_string``. Generic ``carb.settings.get()`` may still return a subtree ``dict``; we coerce + that below and try alternate leaf paths. """ global _cli_rendering_mode_resolution_warned - mirror = get_setting(ISAACLAB_RENDERING_MODE_PROFILE_MIRROR_PATH) - if isinstance(mirror, str) and mirror.strip(): - return mirror.strip() - raw = get_setting("/isaaclab/rendering/rendering_mode") coerced = _coerce_carb_rendering_mode_value(raw) if coerced: @@ -102,10 +97,8 @@ def _read_cli_rendering_mode_profile_name(get_setting: Any) -> str | None: _cli_rendering_mode_resolution_warned = True _logger.warning( "Could not read /isaaclab/rendering/rendering_mode as a profile name (got %s). " - "CLI rendering mode override may be ignored. " - "Expected mirror at %s (set by AppLauncher).", + "CLI rendering mode override may be ignored.", type(raw).__name__, - ISAACLAB_RENDERING_MODE_PROFILE_MIRROR_PATH, ) return None diff --git a/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py b/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py index 264edacd072..1f7abf723da 100644 --- a/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py +++ b/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py @@ -59,7 +59,7 @@ class VisualizerCfg: """If env_filter_mode='env_ids', only these env indices are shown. This improves performance, particularly for large-scale training, by reducing scene updates sent to visualizers. - Note, OV visualizer only applies a cosmetic visibility toggle (no performance gain). + Note, the Kit visualizer only applies a cosmetic visibility toggle (no performance gain). """ rendering_mode: str | None = None diff --git a/source/isaaclab/test/rendering_mode/test_rendering_mode_renderer_bridge.py b/source/isaaclab/test/rendering_mode/test_rendering_mode_renderer_bridge.py index 94d08db98a6..d61b4516e3d 100644 --- a/source/isaaclab/test/rendering_mode/test_rendering_mode_renderer_bridge.py +++ b/source/isaaclab/test/rendering_mode/test_rendering_mode_renderer_bridge.py @@ -7,7 +7,6 @@ from __future__ import annotations -from isaaclab.app.settings_manager import ISAACLAB_RENDERING_MODE_PROFILE_MIRROR_PATH from isaaclab.renderers.renderer_cfg import RendererCfg from isaaclab.rendering_mode.rendering_mode_cfg import RenderingModeCfg from isaaclab.rendering_mode.rendering_mode_utils import ( @@ -19,13 +18,11 @@ class _FakeSettings: - def __init__(self, explicit: bool, mode, mirror: str | None = None): + def __init__(self, explicit: bool, mode): self._data: dict[str, object] = { "/isaaclab/rendering/rendering_mode/explicit": explicit, "/isaaclab/rendering/rendering_mode": mode, } - if mirror is not None: - self._data[ISAACLAB_RENDERING_MODE_PROFILE_MIRROR_PATH] = mirror def get(self, key: str): return self._data.get(key) @@ -50,11 +47,11 @@ def test_resolve_renderer_mode_cli_explicit_coerces_nested_carb_dict(): assert resolve_rendering_mode_name_for_renderer_cfg(settings.get, r_cfg) == "balanced" -def test_cli_profile_mirror_overrides_unreadable_carb_dict(): - """AppLauncher mirrors the profile string; it wins when carb get() has no string leaves.""" +def test_cli_explicit_unreadable_carb_dict_without_profile_string_returns_none(): + """When generic get() yields a dict with no embedded profile strings, resolution fails.""" r_cfg = RendererCfg(renderer_type="isaac_rtx", rendering_mode="performance") - settings = _FakeSettings(explicit=True, mode={"flags": True, "count": 2}, mirror="quality") - assert resolve_rendering_mode_name_for_renderer_cfg(settings.get, r_cfg) == "quality" + settings = _FakeSettings(explicit=True, mode={"flags": True, "count": 2}) + assert resolve_rendering_mode_name_for_renderer_cfg(settings.get, r_cfg) is None def test_resolve_renderer_mode_uses_cfg_when_cli_not_explicit(): From a34788256b687dd7fc116839c5774335e7aa87b7 Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Wed, 8 Apr 2026 23:48:27 +0000 Subject: [PATCH 23/34] prep --- docs/source/how-to/configure_rendering.rst | 63 +++++----- source/isaaclab/isaaclab/app/app_launcher.py | 18 ++- .../isaaclab/isaaclab/app/settings_manager.py | 15 --- .../physics/base_scene_data_provider.py | 2 +- .../isaaclab/renderers/renderer_cfg.py | 5 +- .../rendering_mode/rendering_mode_cfg.py | 42 +------ .../rendering_mode/rendering_mode_presets.py | 2 +- .../rendering_mode/rendering_mode_utils.py | 119 +++++------------- .../isaaclab/sensors/camera/camera.py | 2 +- .../isaaclab/sensors/camera/tiled_camera.py | 2 +- .../isaaclab/isaaclab/sim/simulation_cfg.py | 2 +- .../isaaclab/sim/simulation_context.py | 12 +- .../isaaclab/visualizers/visualizer_cfg.py | 7 +- .../test_rendering_mode_renderer_bridge.py | 23 ++-- .../newton_scene_data_provider.py | 2 +- .../physx_scene_data_provider.py | 2 +- 16 files changed, 112 insertions(+), 206 deletions(-) diff --git a/docs/source/how-to/configure_rendering.rst b/docs/source/how-to/configure_rendering.rst index 9447f1d3f7e..4028e778ce8 100644 --- a/docs/source/how-to/configure_rendering.rst +++ b/docs/source/how-to/configure_rendering.rst @@ -14,13 +14,20 @@ Isaac Lab's RTX renderer offers 3 preset rendering modes: performance, balanced, You can select a mode via a command line argument or from within a script, and customize settings as needed. Adjust and fine-tune rendering to achieve the ideal balance for your workflow. -Selecting a Rendering Mode Profile ----------------------------------- +Selecting a Rendering Mode +-------------------------- + +Rendering mode is selected as follows: -Rendering mode can be selected in two ways: +1. **Camera sensors.** Classic and tiled cameras do not define ``rendering_mode`` on the camera config itself; set + it on the nested :attr:`~sensors.camera.camera_cfg.CameraCfg.renderer_cfg` (a :class:`~isaaclab.renderers.RendererCfg`). + Use the same profile names as keys in :attr:`~sim.SimulationCfg.rendering_mode_cfgs`. When the CLI does not set + an explicit mode, this field selects the profile; otherwise the CLI wins (see item 3 below). For Kit-style + renderers (``default``, ``isaac_rtx``, ``rtx``), the profile applies RTX settings; for Newton Warp tiled cameras, + configure :class:`~isaaclab_newton.renderers.newton_warp_renderer_cfg.NewtonWarpRendererCfg` directly instead. -1. Set the visualizer profile selector field ``rendering_mode``, which selects an entry from - :attr:`~sim.SimulationCfg.rendering_mode_cfgs`. +2. **Kit visualizer.** On :class:`~isaaclab_physx.visualizers.kit_visualizer_cfg.KitVisualizerCfg`, set ``rendering_mode`` + to an entry from :attr:`~sim.SimulationCfg.rendering_mode_cfgs` (RTX / viewport settings). .. code-block:: python @@ -35,41 +42,30 @@ Rendering mode can be selected in two ways: ], ) -2. Use the ``--rendering_mode`` CLI argument, which takes precedence over - ``visualizer_cfg.rendering_mode`` and over ``camera_cfg.renderer_cfg.rendering_mode``. +3. Use the ``--rendering_mode`` CLI argument, which takes precedence over + ``camera_cfg.renderer_cfg.rendering_mode`` and over ``visualizer_cfg.rendering_mode``. .. code-block:: bash ./isaaclab.sh -p scripts/tutorials/00_sim/set_rendering_mode.py --rendering_mode {performance/balanced/quality} -3. For tiled or classic camera sensors, set ``rendering_mode`` on - :attr:`~sensors.camera.camera_cfg.CameraCfg.renderer_cfg` to select the same named profile. - Kit-style renderers (``isaac_rtx``, ``rtx``, or ``default``) receive the profile's ``kit_*`` preset and - overrides via global RTX settings. The Newton Warp renderer (``newton_warp``) receives optional - ``newton_warp_*`` fields from the profile, which map to - ``isaaclab_newton.renderers.NewtonWarpRendererCfg``. - Notes: -* If ``rendering_mode=None`` for a visualizer, Isaac Lab does not apply rendering overrides - for that visualizer, and backend/native defaults (for Kit, USD-authored settings) are used. -* If ``rendering_mode=None`` on ``renderer_cfg`` and the CLI did not set an explicit mode, no profile - is applied for that camera's renderer. +* If ``rendering_mode=None`` on ``renderer_cfg`` and the CLI did not set an explicit mode, no RTX profile + is applied for Kit-style camera renderers; other renderer types ignore ``rendering_mode``. +* If ``rendering_mode=None`` on a Kit visualizer, Isaac Lab does not apply RTX profile overrides + (USD-authored / native defaults apply). Other visualizers ignore ``rendering_mode``; use their own config classes + (for example :class:`~isaaclab_visualizers.newton.newton_visualizer_cfg.NewtonVisualizerCfg` for Newton GL). * ``--rendering_mode`` is the supported CLI entry point. .. note:: - The built-in profiles ``performance``, ``balanced``, and ``quality`` set :attr:`rendering_mode_preset - `, which applies **Kit / RTX** carb - settings. Those preset differences therefore show up for the Kit viewport and for Kit-style camera - renderers (``default``, ``isaac_rtx``, ``rtx``). - - Other targets read only their own fields on :class:`~isaaclab.rendering_mode.RenderingModeCfg` — for - example the Newton visualizer uses ``newton_*``, and the Newton Warp tiled camera uses - ``newton_warp_*``. Switching only the profile **name** may not change appearance for those paths - unless you define separate entries in :attr:`~sim.SimulationCfg.rendering_mode_cfgs` with different - values for those fields. Additional preset-driven behavior for other visualizers and renderers may - be added in future releases. + :class:`~isaaclab.rendering_mode.RenderingModeCfg` only carries ``kit_*`` fields and built-in + ``rendering_mode_preset`` values (``performance``, ``balanced``, ``quality``). Those profiles drive **Kit / RTX** + carb settings for the Kit viewport and for Kit-style camera renderers (``default``, ``isaac_rtx``, ``rtx``). + Newton GL and Newton Warp are configured on :class:`~isaaclab_visualizers.newton.newton_visualizer_cfg.NewtonVisualizerCfg` + and :class:`~isaaclab_newton.renderers.newton_warp_renderer_cfg.NewtonWarpRendererCfg` respectively, not via + ``SimulationCfg.rendering_mode_cfgs``. Example renders from the ``set_rendering_mode.py`` script. To help assess rendering, the example scene includes reflections, translucency, @@ -99,6 +95,12 @@ Overriding Rendering Mode Settings Preset rendering settings can be overwritten via :class:`~isaaclab.rendering_mode.RenderingModeCfg`. +The built-in ``rendering_mode_preset`` field only accepts ``performance``, ``balanced``, or ``quality``; those map to +fixed RTX baselines in ``isaaclab.rendering_mode.rendering_mode_presets``. Isaac Lab does not provide a supported +way to register additional preset baselines. Customization is done by adding a **named profile** to +:attr:`~sim.SimulationCfg.rendering_mode_cfgs` that picks one of the three baselines and overrides it with ``kit_*`` +fields—see item 2 below. + There are two ways to provide settings that overwrite presets: 1. :class:`~isaaclab.rendering_mode.RenderingModeCfg` supports overwriting specific settings via explicit @@ -156,7 +158,8 @@ There are two ways to provide settings that overwrite presets: 2. If you need a custom profile, define your own named entry in - :attr:`~sim.SimulationCfg.rendering_mode_cfgs` and select it from each visualizer. + :attr:`~sim.SimulationCfg.rendering_mode_cfgs` and reference that name from + ``camera_cfg.renderer_cfg.rendering_mode`` (Kit-style renderers) and/or ``KitVisualizerCfg.rendering_mode``. .. code-block:: python diff --git a/source/isaaclab/isaaclab/app/app_launcher.py b/source/isaaclab/isaaclab/app/app_launcher.py index 3dca67a7b7f..a999f0cf2a6 100644 --- a/source/isaaclab/isaaclab/app/app_launcher.py +++ b/source/isaaclab/isaaclab/app/app_launcher.py @@ -29,6 +29,7 @@ from isaacsim import SimulationApp from isaaclab.app.settings_manager import get_settings_manager, initialize_carb_settings +from isaaclab.rendering_mode.rendering_mode_utils import apply_kit_rendering_preset # import logger logger = logging.getLogger(__name__) @@ -447,7 +448,7 @@ def add_app_launcher_args(parser: argparse.ArgumentParser) -> None: choices={"performance", "balanced", "quality"}, help=( "Selects a named profile from SimulationCfg.rendering_mode_cfgs (default: performance, " - "balanced, quality). Overrides per-visualizer and per-camera rendering_mode when set. " + "balanced, quality). Overrides per-camera and per-visualizer rendering_mode when set. " "Customize profiles with isaaclab.rendering_mode.RenderingModeCfg." ), ) @@ -1129,6 +1130,21 @@ def _set_rendering_mode_settings(self, launcher_args: dict) -> None: settings.set_string("/isaaclab/rendering/rendering_mode", rendering_mode) settings.set_bool("/isaaclab/rendering/rendering_mode/explicit", bool(rendering_mode_explicit)) + # Apply built-in Kit presets at launch so RTX matches the CLI before SimulationContext runs. + if ( + rendering_mode_explicit + and rendering_mode in {"performance", "balanced", "quality"} + and settings.is_omniverse_mode + ): + try: + apply_kit_rendering_preset(settings.set, rendering_mode) + except Exception as e: + logger.warning( + "Could not apply Kit rendering preset %r to carb settings at launch: %s", + rendering_mode, + e, + ) + def _set_animation_recording_settings(self, launcher_args: dict) -> None: """Store animation recording settings in settings.""" recording_enabled = launcher_args.get("anim_recording_enabled", False) diff --git a/source/isaaclab/isaaclab/app/settings_manager.py b/source/isaaclab/isaaclab/app/settings_manager.py index ab394fd09bd..5abbe9b392d 100644 --- a/source/isaaclab/isaaclab/app/settings_manager.py +++ b/source/isaaclab/isaaclab/app/settings_manager.py @@ -19,10 +19,6 @@ # Key for storing singleton in sys.modules to survive module reloads (e.g., from Hydra) _SINGLETON_KEY = "__isaaclab_settings_manager_singleton__" -# CLI rendering mode profile (``performance`` / ``balanced`` / ``quality``). Generic carb ``get()`` can -# return a subtree dict for this path; ``get_string()`` reads the leaf value set by ``set_string``. -_ISAACLAB_RENDERING_MODE_PATH = "/isaaclab/rendering/rendering_mode" - class SettingsManager: """A settings manager that provides a carb.settings-like interface without requiring Omniverse. @@ -129,17 +125,6 @@ def get(self, path: str, default: Any = None) -> Any: The value at the path, or default if not found """ if self._use_carb and self._carb_settings is not None: - # Prefer typed string read for CLI rendering mode: generic ``get()`` may return a subtree dict. - if path == _ISAACLAB_RENDERING_MODE_PATH: - try: - if hasattr(self._carb_settings, "get_string"): - s = self._carb_settings.get_string(path) - if s is not None: - out = str(s).strip() - if out: - return out - except Exception: - pass value = self._carb_settings.get(path) return value if value is not None else default else: diff --git a/source/isaaclab/isaaclab/physics/base_scene_data_provider.py b/source/isaaclab/isaaclab/physics/base_scene_data_provider.py index e5b709da0ce..d03a3322863 100644 --- a/source/isaaclab/isaaclab/physics/base_scene_data_provider.py +++ b/source/isaaclab/isaaclab/physics/base_scene_data_provider.py @@ -3,7 +3,7 @@ # # SPDX-License-Identifier: BSD-3-Clause -"""Scene data provider interface for visualizers and renderers.""" +"""Scene data provider interface for renderers and visualizers.""" from __future__ import annotations diff --git a/source/isaaclab/isaaclab/renderers/renderer_cfg.py b/source/isaaclab/isaaclab/renderers/renderer_cfg.py index c4bceb0dc1f..20c414c2b15 100644 --- a/source/isaaclab/isaaclab/renderers/renderer_cfg.py +++ b/source/isaaclab/isaaclab/renderers/renderer_cfg.py @@ -16,4 +16,7 @@ class RendererCfg: """Type identifier for selecting a renderer backend implementation.""" rendering_mode: str | None = None - """Name of the rendering mode profile to use with this renderer.""" + """Name of the Kit/RTX rendering mode profile (``default``, ``isaac_rtx``, ``rtx`` only). + + Ignored for other renderer types; configure those via their dedicated cfg classes. + """ diff --git a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py index fb58fb14a4d..1728837cfd8 100644 --- a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py +++ b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py @@ -12,11 +12,9 @@ @configclass class RenderingModeCfg: - """Shared rendering mode profile for visualizers and renderers. + """Shared rendering mode profile for renderers and visualizers. - This profile keeps backend-specific fields in one place using explicit prefixes: - - 'kit_*' for Omniverse/RTX quality controls - - 'newton_*' for Newton visual quality controls + This profile keeps Omniverse/RTX controls in one place using ``kit_*`` fields. """ rendering_mode_preset: Literal["performance", "balanced", "quality"] | None = None @@ -61,40 +59,4 @@ class RenderingModeCfg: kit_dome_light_upper_lower_strategy: Literal[0, 3, 4] | None = None """Maps to '/rtx/domeLight/upperLowerStrategy'.""" - newton_enable_shadows: bool | None = True - """Overrides Newton visualizer shadow rendering.""" - - newton_enable_sky: bool | None = True - """Overrides Newton visualizer sky rendering.""" - - newton_enable_wireframe: bool | None = False - """Overrides Newton visualizer wireframe rendering.""" - - newton_sky_upper_color: tuple[float, float, float] | None = (0.2, 0.4, 0.6) - """Overrides Newton visualizer upper sky color.""" - - newton_sky_lower_color: tuple[float, float, float] | None = (0.5, 0.6, 0.7) - """Overrides Newton visualizer lower sky color.""" - - newton_light_color: tuple[float, float, float] | None = (1.0, 1.0, 1.0) - """Overrides Newton visualizer light color.""" - - newton_warp_enable_textures: bool | None = None - """When set, overrides the Newton Warp tiled camera renderer ``enable_textures`` field.""" - - newton_warp_enable_shadows: bool | None = None - """When set, overrides the Newton Warp tiled camera renderer ``enable_shadows`` field.""" - - newton_warp_enable_ambient_lighting: bool | None = None - """When set, overrides the Newton Warp tiled camera renderer ``enable_ambient_lighting`` field.""" - - newton_warp_enable_backface_culling: bool | None = None - """When set, overrides the Newton Warp tiled camera renderer ``enable_backface_culling`` field.""" - - newton_warp_max_distance: float | None = None - """When set, overrides the Newton Warp tiled camera renderer ``max_distance`` field.""" - - newton_warp_create_default_light: bool | None = None - """When set, overrides the Newton Warp tiled camera renderer ``create_default_light`` field.""" - # TODO: Consider supporting additional raw backend settings dictionaries. diff --git a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_presets.py b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_presets.py index 8996e6b7955..99fb8739380 100644 --- a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_presets.py +++ b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_presets.py @@ -33,7 +33,7 @@ "/rtx/raytracing/cached/enabled": False, "/rtx-transient/dlssg/enabled": False, "/rtx-transient/dldenoiser/enabled": False, - "/rtx/post/dlss/execMode": 0, + "/rtx/post/dlss/execMode": 1, "/rtx/pathtracing/maxSamplesPerLaunch": 1_000_000, "/rtx/viewTile/limit": 1_000_000, }, diff --git a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py index a74951ad913..75ff9cb5b51 100644 --- a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py +++ b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py @@ -39,12 +39,23 @@ def _collect_str_leaves(obj: Any, out: list[str], depth: int = 0) -> None: def _coerce_carb_rendering_mode_value(raw: Any) -> str | None: - """Best-effort string profile name from carb get()/subtree dicts.""" + """Best-effort profile name from carb ``get()`` (often a ``dict`` subtree for ``/isaaclab/rendering/rendering_mode``).""" if raw is None: return None if isinstance(raw, str): out = raw.strip() return out if out else None + if isinstance(raw, dict): + for key in ("value", "default", "profile", "name", "rendering_mode"): + v = raw.get(key) + if isinstance(v, str): + s = v.strip() + if s: + return s + if isinstance(v, dict): + nested = _coerce_carb_rendering_mode_value(v) + if nested: + return nested strings: list[str] = [] _collect_str_leaves(raw, strings) if not strings: @@ -58,19 +69,11 @@ def _coerce_carb_rendering_mode_value(raw: Any) -> str | None: def _read_cli_rendering_mode_profile_name(get_setting: Any) -> str | None: """Read CLI rendering mode profile name (``performance`` / ``balanced`` / ``quality``). - :class:`~isaaclab.app.settings_manager.SettingsManager` and :class:`~isaaclab.sim.simulation_context.SettingsHelper` resolve - ``/isaaclab/rendering/rendering_mode`` via ``get_string`` when using carb so readers see the string - set by ``set_string``. Generic ``carb.settings.get()`` may still return a subtree ``dict``; we coerce - that below and try alternate leaf paths. + ``AppLauncher`` stores the profile with ``set_string``; ``carb.settings.get()`` on the same path may + return a subtree ``dict``. Prefer ``get_string`` on the leaf path first, then :func:`_coerce_carb_rendering_mode_value`. """ global _cli_rendering_mode_resolution_warned - raw = get_setting("/isaaclab/rendering/rendering_mode") - coerced = _coerce_carb_rendering_mode_value(raw) - if coerced: - return coerced - - # Typed carb reads (leaf path and common alternates some Kit builds use). try: import carb @@ -92,6 +95,11 @@ def _read_cli_rendering_mode_profile_name(get_setting: Any) -> str | None: except Exception: pass + raw = get_setting("/isaaclab/rendering/rendering_mode") + coerced = _coerce_carb_rendering_mode_value(raw) + if coerced: + return coerced + if raw is not None and not isinstance(raw, str): if not _cli_rendering_mode_resolution_warned: _cli_rendering_mode_resolution_warned = True @@ -166,22 +174,6 @@ def resolve_rendering_mode_name_for_renderer_cfg(get_setting: Any, renderer_cfg: return _normalize_rendering_mode_profile_name(getattr(renderer_cfg, "rendering_mode", None)) -def apply_newton_warp_mode_cfg_to_renderer_cfg(renderer_cfg: Any, mode_cfg: RenderingModeCfg) -> None: - """Apply Newton Warp tiled-camera fields from a rendering mode profile onto renderer cfg.""" - override_fields = { - "newton_warp_enable_textures": "enable_textures", - "newton_warp_enable_shadows": "enable_shadows", - "newton_warp_enable_ambient_lighting": "enable_ambient_lighting", - "newton_warp_enable_backface_culling": "enable_backface_culling", - "newton_warp_max_distance": "max_distance", - "newton_warp_create_default_light": "create_default_light", - } - for mode_field, ren_field in override_fields.items(): - value = getattr(mode_cfg, mode_field, None) - if value is not None and hasattr(renderer_cfg, ren_field): - setattr(renderer_cfg, ren_field, value) - - def apply_mode_profile_to_renderer_cfg( get_setting: Any, set_setting: Any, @@ -189,52 +181,15 @@ def apply_mode_profile_to_renderer_cfg( mode_cfgs: dict[str, RenderingModeCfg], logger: Any, ) -> None: - """Resolve and apply a rendering mode profile to a :class:`~isaaclab.renderers.RendererCfg` (in place).""" + """Resolve and apply a rendering mode profile to a Kit/RTX :class:`~isaaclab.renderers.RendererCfg` (in place).""" + rtype = getattr(renderer_cfg, "renderer_type", None) + if rtype not in ("default", "isaac_rtx", "rtx"): + return mode_name = resolve_rendering_mode_name_for_renderer_cfg(get_setting, renderer_cfg) mode_cfg = resolve_rendering_mode_cfg(mode_name, mode_cfgs, logger) if mode_cfg is None: return - - rtype = getattr(renderer_cfg, "renderer_type", None) - if rtype in ("default", "isaac_rtx", "rtx"): - apply_kit_rendering_mode_cfg(set_setting, mode_cfg) - elif rtype == "newton_warp": - apply_newton_warp_mode_cfg_to_renderer_cfg(renderer_cfg, mode_cfg) - - -def apply_newton_mode_cfg_to_visualizer_cfg(visualizer_cfg: Any, mode_cfg: RenderingModeCfg) -> None: - """Apply Newton rendering mode values to a visualizer cfg object.""" - override_fields = { - "newton_enable_shadows": "enable_shadows", - "newton_enable_sky": "enable_sky", - "newton_enable_wireframe": "enable_wireframe", - "newton_sky_upper_color": "sky_upper_color", - "newton_sky_lower_color": "sky_lower_color", - "newton_light_color": "light_color", - } - for mode_field, viz_field in override_fields.items(): - value = getattr(mode_cfg, mode_field, None) - if value is not None and hasattr(visualizer_cfg, viz_field): - setattr(visualizer_cfg, viz_field, value) - - -def apply_newton_mode_cfg_to_viewer(viewer: Any, mode_cfg: RenderingModeCfg) -> None: - """Apply Newton rendering mode values to a live Newton viewer renderer, if available.""" - if viewer is None or not hasattr(viewer, "renderer"): - return - - if mode_cfg.newton_enable_shadows is not None: - viewer.renderer.draw_shadows = mode_cfg.newton_enable_shadows - if mode_cfg.newton_enable_sky is not None: - viewer.renderer.draw_sky = mode_cfg.newton_enable_sky - if mode_cfg.newton_enable_wireframe is not None: - viewer.renderer.draw_wireframe = mode_cfg.newton_enable_wireframe - if mode_cfg.newton_sky_upper_color is not None: - viewer.renderer.sky_upper = mode_cfg.newton_sky_upper_color - if mode_cfg.newton_sky_lower_color is not None: - viewer.renderer.sky_lower = mode_cfg.newton_sky_lower_color - if mode_cfg.newton_light_color is not None: - viewer.renderer._light_color = mode_cfg.newton_light_color + apply_kit_rendering_mode_cfg(set_setting, mode_cfg) def resolve_rendering_mode_name_for_visualizer_cfg(get_setting: Any, visualizer_cfg: Any) -> str | None: @@ -274,17 +229,14 @@ def apply_mode_profile_to_visualizer_cfg( mode_cfgs: dict[str, RenderingModeCfg], logger: Any, ) -> None: - """Resolve and apply rendering mode profile to a visualizer config.""" + """Resolve and apply rendering mode profile to a Kit visualizer config (RTX / carb settings).""" + if getattr(visualizer_cfg, "visualizer_type", None) != "kit": + return mode_name = resolve_rendering_mode_name_for_visualizer_cfg(get_setting, visualizer_cfg) mode_cfg = resolve_rendering_mode_cfg(mode_name, mode_cfgs, logger) if mode_cfg is None: return - - visualizer_type = getattr(visualizer_cfg, "visualizer_type", None) - if visualizer_type == "kit": - apply_kit_rendering_mode_cfg(set_setting, mode_cfg) - elif visualizer_type == "newton": - apply_newton_mode_cfg_to_visualizer_cfg(visualizer_cfg, mode_cfg) + apply_kit_rendering_mode_cfg(set_setting, mode_cfg) def apply_runtime_mode_profile_to_visualizer( @@ -294,12 +246,13 @@ def apply_runtime_mode_profile_to_visualizer( visualizer_mode_keys: dict[int, str | None], mode_cfgs: dict[str, RenderingModeCfg], logger: Any, - force: bool = False, ) -> None: - """Resolve and apply runtime rendering mode profile to an active visualizer.""" + """Resolve and apply runtime rendering mode profile to an active Kit visualizer.""" + if getattr(viz.cfg, "visualizer_type", None) != "kit": + return mode_name = resolve_rendering_mode_name_for_visualizer_cfg(get_setting, viz.cfg) viz_id = id(viz) - if not force and visualizer_mode_keys.get(viz_id) == mode_name: + if visualizer_mode_keys.get(viz_id) == mode_name: return mode_cfg = resolve_rendering_mode_cfg(mode_name, mode_cfgs, logger) @@ -307,11 +260,5 @@ def apply_runtime_mode_profile_to_visualizer( visualizer_mode_keys[viz_id] = mode_name return - viz_type = getattr(viz.cfg, "visualizer_type", None) - if viz_type == "kit": - apply_kit_rendering_mode_cfg(set_setting, mode_cfg) - elif viz_type == "newton": - apply_newton_mode_cfg_to_visualizer_cfg(viz.cfg, mode_cfg) - apply_newton_mode_cfg_to_viewer(getattr(viz, "_viewer", None), mode_cfg) - + apply_kit_rendering_mode_cfg(set_setting, mode_cfg) visualizer_mode_keys[viz_id] = mode_name diff --git a/source/isaaclab/isaaclab/sensors/camera/camera.py b/source/isaaclab/isaaclab/sensors/camera/camera.py index c7905a3db0a..a3dbe1e6fc9 100644 --- a/source/isaaclab/isaaclab/sensors/camera/camera.py +++ b/source/isaaclab/isaaclab/sensors/camera/camera.py @@ -447,7 +447,7 @@ def _initialize_impl(self): sim = SimulationContext.instance() if sim is not None: - mode_cfgs = getattr(sim.cfg, "rendering_mode_cfgs", None) or {} + mode_cfgs = sim.cfg.rendering_mode_cfgs apply_mode_profile_to_renderer_cfg( sim.get_setting, sim.set_setting, diff --git a/source/isaaclab/isaaclab/sensors/camera/tiled_camera.py b/source/isaaclab/isaaclab/sensors/camera/tiled_camera.py index db4d46c0df3..aedd7af0e33 100644 --- a/source/isaaclab/isaaclab/sensors/camera/tiled_camera.py +++ b/source/isaaclab/isaaclab/sensors/camera/tiled_camera.py @@ -167,7 +167,7 @@ def _initialize_impl(self): sim = SimulationContext.instance() if sim is not None: - mode_cfgs = getattr(sim.cfg, "rendering_mode_cfgs", None) or {} + mode_cfgs = sim.cfg.rendering_mode_cfgs apply_mode_profile_to_renderer_cfg( sim.get_setting, sim.set_setting, diff --git a/source/isaaclab/isaaclab/sim/simulation_cfg.py b/source/isaaclab/isaaclab/sim/simulation_cfg.py index e7bafd70e6f..a05fd16c2e8 100644 --- a/source/isaaclab/isaaclab/sim/simulation_cfg.py +++ b/source/isaaclab/isaaclab/sim/simulation_cfg.py @@ -97,7 +97,7 @@ class SimulationCfg: "balanced": RenderingModeCfg(rendering_mode_preset="balanced"), "quality": RenderingModeCfg(rendering_mode_preset="quality"), } - """Named rendering mode profiles available to visualizers/renderers.""" + """Named rendering mode profiles available to renderers and visualizers.""" create_stage_in_memory: bool = False """If stage is first created in memory. Default is False. diff --git a/source/isaaclab/isaaclab/sim/simulation_context.py b/source/isaaclab/isaaclab/sim/simulation_context.py index 3842cb3bb43..33f14a82486 100644 --- a/source/isaaclab/isaaclab/sim/simulation_context.py +++ b/source/isaaclab/isaaclab/sim/simulation_context.py @@ -195,7 +195,7 @@ def __init__(self, cfg: SimulationCfg | None = None): def _apply_mode_profile_to_visualizer_cfg(self, visualizer_cfg: Any) -> None: """Apply resolved rendering-mode profile to a visualizer config.""" - mode_cfgs = getattr(self.cfg, "rendering_mode_cfgs", None) or {} + mode_cfgs = self.cfg.rendering_mode_cfgs apply_mode_profile_to_visualizer_cfg( self.get_setting, self.set_setting, @@ -204,9 +204,9 @@ def _apply_mode_profile_to_visualizer_cfg(self, visualizer_cfg: Any) -> None: logger, ) - def _apply_runtime_mode_profile_to_visualizer(self, viz: BaseVisualizer, force: bool = False) -> None: - """Apply rendering-mode profile updates to an active visualizer instance.""" - mode_cfgs = getattr(self.cfg, "rendering_mode_cfgs", None) or {} + def _apply_runtime_mode_profile_to_visualizer(self, viz: BaseVisualizer) -> None: + """Apply rendering-mode profile updates to an active Kit visualizer instance.""" + mode_cfgs = self.cfg.rendering_mode_cfgs apply_runtime_mode_profile_to_visualizer( self.get_setting, self.set_setting, @@ -214,7 +214,6 @@ def _apply_runtime_mode_profile_to_visualizer(self, viz: BaseVisualizer, force: self._visualizer_mode_keys, mode_cfgs, logger, - force=force, ) def _init_usd_physics_scene(self) -> None: @@ -501,7 +500,6 @@ def initialize_visualizers(self) -> None: self._apply_mode_profile_to_visualizer_cfg(cfg) visualizer = cfg.create_visualizer() visualizer.initialize(self._scene_data_provider) - self._apply_runtime_mode_profile_to_visualizer(visualizer, force=True) self._visualizers.append(visualizer) except Exception as exc: if cli_explicit: @@ -528,7 +526,7 @@ def initialize_scene_data_provider(self) -> BaseSceneDataProvider: return self._scene_data_provider def get_scene_data_requirements(self) -> SceneDataRequirement: - """Return scene-data requirements resolved from visualizers/renderers.""" + """Return scene-data requirements resolved from renderers/visualizers.""" return self._scene_data_requirements def update_scene_data_requirements(self, requirements: SceneDataRequirement) -> None: diff --git a/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py b/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py index 1f7abf723da..7a37d9e9961 100644 --- a/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py +++ b/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py @@ -63,10 +63,11 @@ class VisualizerCfg: """ rendering_mode: str | None = None - """Name of the rendering mode profile for this visualizer. + """Name of the rendering mode profile (Kit / RTX only). - Selects an entry from :class:`isaaclab.sim.SimulationCfg.rendering_mode_cfgs`. - If None, no rendering mode overrides are applied and backend/native defaults are used. + Used when :attr:`visualizer_type` is ``kit``; selects an entry from + :class:`isaaclab.sim.SimulationCfg.rendering_mode_cfgs`. Ignored for other visualizers. + If None, no RTX profile overrides are applied for Kit and native defaults are used. """ def get_visualizer_type(self) -> str | None: diff --git a/source/isaaclab/test/rendering_mode/test_rendering_mode_renderer_bridge.py b/source/isaaclab/test/rendering_mode/test_rendering_mode_renderer_bridge.py index d61b4516e3d..eab731ad91a 100644 --- a/source/isaaclab/test/rendering_mode/test_rendering_mode_renderer_bridge.py +++ b/source/isaaclab/test/rendering_mode/test_rendering_mode_renderer_bridge.py @@ -11,7 +11,6 @@ from isaaclab.rendering_mode.rendering_mode_cfg import RenderingModeCfg from isaaclab.rendering_mode.rendering_mode_utils import ( apply_mode_profile_to_renderer_cfg, - apply_newton_warp_mode_cfg_to_renderer_cfg, resolve_rendering_mode_cfg, resolve_rendering_mode_name_for_renderer_cfg, ) @@ -47,6 +46,13 @@ def test_resolve_renderer_mode_cli_explicit_coerces_nested_carb_dict(): assert resolve_rendering_mode_name_for_renderer_cfg(settings.get, r_cfg) == "balanced" +def test_resolve_renderer_mode_cli_explicit_coerces_carb_dict_value_key(): + """Carb may expose the profile under a ``value`` (or similar) leaf.""" + r_cfg = RendererCfg(renderer_type="isaac_rtx", rendering_mode="balanced") + settings = _FakeSettings(explicit=True, mode={"value": "performance"}) + assert resolve_rendering_mode_name_for_renderer_cfg(settings.get, r_cfg) == "performance" + + def test_cli_explicit_unreadable_carb_dict_without_profile_string_returns_none(): """When generic get() yields a dict with no embedded profile strings, resolution fails.""" r_cfg = RendererCfg(renderer_type="isaac_rtx", rendering_mode="performance") @@ -66,21 +72,6 @@ def test_resolve_rendering_mode_cfg_rejects_non_str_mode_name(): assert resolve_rendering_mode_cfg({}, {"q": RenderingModeCfg()}, log) is None -def test_apply_newton_warp_overrides_mutate_cfg(): - mode_cfg = RenderingModeCfg( - newton_warp_enable_shadows=True, - newton_warp_max_distance=42.0, - ) - from isaaclab_newton.renderers.newton_warp_renderer_cfg import NewtonWarpRendererCfg - - ren = NewtonWarpRendererCfg() - assert ren.enable_shadows is False - assert ren.max_distance == 1000.0 - apply_newton_warp_mode_cfg_to_renderer_cfg(ren, mode_cfg) - assert ren.enable_shadows is True - assert ren.max_distance == 42.0 - - def test_apply_mode_profile_kit_branch_calls_set_setting(): recorded: list[tuple[str, object]] = [] diff --git a/source/isaaclab_newton/isaaclab_newton/scene_data_providers/newton_scene_data_provider.py b/source/isaaclab_newton/isaaclab_newton/scene_data_providers/newton_scene_data_provider.py index f3b10dc4004..0ea94fe4fa3 100644 --- a/source/isaaclab_newton/isaaclab_newton/scene_data_providers/newton_scene_data_provider.py +++ b/source/isaaclab_newton/isaaclab_newton/scene_data_providers/newton_scene_data_provider.py @@ -24,7 +24,7 @@ class NewtonSceneDataProvider(BaseSceneDataProvider): """Scene data provider for Newton physics backend. - Provides access to Newton model, state, and USD stage for visualizers and renderers. + Provides access to Newton model, state, and USD stage for renderers and visualizers. Unlike PhysxSceneDataProvider which must build its own Newton model from USD and sync PhysX transforms into it, this provider delegates directly to NewtonManager since the Newton backend already owns the authoritative model and state. diff --git a/source/isaaclab_physx/isaaclab_physx/scene_data_providers/physx_scene_data_provider.py b/source/isaaclab_physx/isaaclab_physx/scene_data_providers/physx_scene_data_provider.py index e0afdf1e94a..b2323354c06 100644 --- a/source/isaaclab_physx/isaaclab_physx/scene_data_providers/physx_scene_data_provider.py +++ b/source/isaaclab_physx/isaaclab_physx/scene_data_providers/physx_scene_data_provider.py @@ -967,7 +967,7 @@ def get_camera_transforms(self) -> dict[str, Any] | None: return {"order": shared_paths, "positions": positions, "orientations": orientations, "num_envs": num_envs} def get_metadata(self) -> dict[str, Any]: - """Return provider metadata for visualizers and renderers. + """Return provider metadata for renderers and visualizers. Returns: Metadata dictionary with backend and environment count. From e5e7a18aa2c3472ee49d8a2e2e2480b7d3d2cd28 Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Wed, 8 Apr 2026 23:52:51 +0000 Subject: [PATCH 24/34] lint --- .../isaaclab/rendering_mode/rendering_mode_utils.py | 10 +++++++--- .../test_rendering_mode_renderer_bridge.py | 4 +++- .../isaaclab_visualizers/viser/viser_visualizer.py | 4 +--- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py index 75ff9cb5b51..6093ac5bb6b 100644 --- a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py +++ b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py @@ -39,7 +39,10 @@ def _collect_str_leaves(obj: Any, out: list[str], depth: int = 0) -> None: def _coerce_carb_rendering_mode_value(raw: Any) -> str | None: - """Best-effort profile name from carb ``get()`` (often a ``dict`` subtree for ``/isaaclab/rendering/rendering_mode``).""" + """Best-effort profile name from carb ``get()`` (often a ``dict`` subtree). + + Path is typically ``/isaaclab/rendering/rendering_mode``. + """ if raw is None: return None if isinstance(raw, str): @@ -69,8 +72,9 @@ def _coerce_carb_rendering_mode_value(raw: Any) -> str | None: def _read_cli_rendering_mode_profile_name(get_setting: Any) -> str | None: """Read CLI rendering mode profile name (``performance`` / ``balanced`` / ``quality``). - ``AppLauncher`` stores the profile with ``set_string``; ``carb.settings.get()`` on the same path may - return a subtree ``dict``. Prefer ``get_string`` on the leaf path first, then :func:`_coerce_carb_rendering_mode_value`. + ``AppLauncher`` stores the profile with ``set_string``; ``carb.settings.get()`` on the same path + may return a subtree ``dict``. Prefer ``get_string`` on the leaf path first, then + :func:`_coerce_carb_rendering_mode_value`. """ global _cli_rendering_mode_resolution_warned diff --git a/source/isaaclab/test/rendering_mode/test_rendering_mode_renderer_bridge.py b/source/isaaclab/test/rendering_mode/test_rendering_mode_renderer_bridge.py index eab731ad91a..3681c9d0096 100644 --- a/source/isaaclab/test/rendering_mode/test_rendering_mode_renderer_bridge.py +++ b/source/isaaclab/test/rendering_mode/test_rendering_mode_renderer_bridge.py @@ -83,5 +83,7 @@ def set_setting(name: str, value: object) -> None: r_cfg = RendererCfg(renderer_type="isaac_rtx", rendering_mode="performance") mode_cfgs = {"performance": RenderingModeCfg(rendering_mode_preset="performance")} - apply_mode_profile_to_renderer_cfg(get_setting, set_setting, r_cfg, mode_cfgs, logger=__import__("logging").getLogger(__name__)) + apply_mode_profile_to_renderer_cfg( + get_setting, set_setting, r_cfg, mode_cfgs, logger=__import__("logging").getLogger(__name__) + ) assert any(k == "/rtx/shadows/enabled" for k, _ in recorded) diff --git a/source/isaaclab_visualizers/isaaclab_visualizers/viser/viser_visualizer.py b/source/isaaclab_visualizers/isaaclab_visualizers/viser/viser_visualizer.py index 684751b2c0a..550ef497e24 100644 --- a/source/isaaclab_visualizers/isaaclab_visualizers/viser/viser_visualizer.py +++ b/source/isaaclab_visualizers/isaaclab_visualizers/viser/viser_visualizer.py @@ -34,10 +34,8 @@ def _prioritize_site_packages_over_kit_prebundle() -> None: u = site.getusersitepackages() if u: paths.append(u) - try: + with contextlib.suppress(Exception): paths.extend(site.getsitepackages()) - except Exception: - pass seen: set[str] = set() ordered: list[str] = [] From c96b27e103e249605659097320d4bc27192c3613 Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Thu, 9 Apr 2026 05:06:22 +0000 Subject: [PATCH 25/34] clean --- docs/source/how-to/configure_rendering.rst | 81 ++++-- source/isaaclab/isaaclab/app/app_launcher.py | 6 +- .../rendering_mode/rendering_mode_cfg.py | 117 +++++++-- .../rendering_mode/rendering_mode_utils.py | 107 ++++---- .../isaaclab/visualizers/visualizer_cfg.py | 8 +- .../test/rendering/test_rendering_mode.py | 236 ++++++++++++++++++ .../test_rendering_mode_renderer_bridge.py | 89 ------- .../test/sim/test_simulation_render_config.py | 93 ------- tools/test_settings.py | 2 +- 9 files changed, 454 insertions(+), 285 deletions(-) create mode 100644 source/isaaclab/test/rendering/test_rendering_mode.py delete mode 100644 source/isaaclab/test/rendering_mode/test_rendering_mode_renderer_bridge.py delete mode 100644 source/isaaclab/test/sim/test_simulation_render_config.py diff --git a/docs/source/how-to/configure_rendering.rst b/docs/source/how-to/configure_rendering.rst index 4028e778ce8..98ff15bb71b 100644 --- a/docs/source/how-to/configure_rendering.rst +++ b/docs/source/how-to/configure_rendering.rst @@ -17,17 +17,24 @@ Adjust and fine-tune rendering to achieve the ideal balance for your workflow. Selecting a Rendering Mode -------------------------- -Rendering mode is selected as follows: +At present, rendering-mode profiles are wired for :mod:`isaaclab_physx.visualizers` (``KitVisualizerCfg`` and the Kit +viewport) and for RTX camera renderers under :mod:`isaaclab_physx.renderers` (for example ``IsaacRtxRendererCfg``). Other +visualizer or renderer integrations are not supported for this feature yet. -1. **Camera sensors.** Classic and tiled cameras do not define ``rendering_mode`` on the camera config itself; set - it on the nested :attr:`~sensors.camera.camera_cfg.CameraCfg.renderer_cfg` (a :class:`~isaaclab.renderers.RendererCfg`). - Use the same profile names as keys in :attr:`~sim.SimulationCfg.rendering_mode_cfgs`. When the CLI does not set - an explicit mode, this field selects the profile; otherwise the CLI wins (see item 3 below). For Kit-style - renderers (``default``, ``isaac_rtx``, ``rtx``), the profile applies RTX settings; for Newton Warp tiled cameras, - configure :class:`~isaaclab_newton.renderers.newton_warp_renderer_cfg.NewtonWarpRendererCfg` directly instead. +You can pick ``performance``, ``balanced``, or ``quality`` (or a custom name you added under +:attr:`~sim.SimulationCfg.rendering_mode_cfgs`) in a few places: from the **command line**, through **visualizers**, or +through **camera renderers**. -2. **Kit visualizer.** On :class:`~isaaclab_physx.visualizers.kit_visualizer_cfg.KitVisualizerCfg`, set ``rendering_mode`` - to an entry from :attr:`~sim.SimulationCfg.rendering_mode_cfgs` (RTX / viewport settings). +1. **Command line.** ``--rendering_mode`` sets the mode at launch and overrides visualizer and RTX camera renderer + settings when you pass it. + + .. code-block:: bash + + ./isaaclab.sh -p scripts/tutorials/00_sim/set_rendering_mode.py --rendering_mode {performance/balanced/quality} + +2. **Visualizers.** On :class:`~isaaclab_physx.visualizers.kit_visualizer_cfg.KitVisualizerCfg`, set ``rendering_mode`` + to a profile from :attr:`~sim.SimulationCfg.rendering_mode_cfgs`. This controls RTX settings for the interactive + viewport. .. code-block:: python @@ -42,29 +49,44 @@ Rendering mode is selected as follows: ], ) -3. Use the ``--rendering_mode`` CLI argument, which takes precedence over - ``camera_cfg.renderer_cfg.rendering_mode`` and over ``visualizer_cfg.rendering_mode``. +3. **Renderers.** Set ``rendering_mode`` on :attr:`~sensors.camera.camera_cfg.CameraCfg.renderer_cfg` to a profile + name from :attr:`~sim.SimulationCfg.rendering_mode_cfgs`. Use an RTX renderer configuration (for example + :class:`~isaaclab_physx.renderers.isaac_rtx_renderer_cfg.IsaacRtxRendererCfg`). - .. code-block:: bash + The profile name is a **string key**; defaults include ``performance``, ``balanced``, and ``quality``. - ./isaaclab.sh -p scripts/tutorials/00_sim/set_rendering_mode.py --rendering_mode {performance/balanced/quality} + .. code-block:: python + + import isaaclab.sim as sim_utils + from isaaclab.sensors.camera import CameraCfg + from isaaclab_physx.renderers import IsaacRtxRendererCfg + + # Default SimulationCfg already defines rendering_mode_cfgs["performance"|"balanced"|"quality"]. + camera_cfg = CameraCfg( + prim_path="/World/envs/env_.*/Camera", + height=480, + width=640, + renderer_cfg=IsaacRtxRendererCfg(rendering_mode="quality"), + ) + + sim_cfg = sim_utils.SimulationCfg() + # Register camera_cfg on your scene / task as usual; RTX settings apply when the camera initializes. Notes: -* If ``rendering_mode=None`` on ``renderer_cfg`` and the CLI did not set an explicit mode, no RTX profile - is applied for Kit-style camera renderers; other renderer types ignore ``rendering_mode``. -* If ``rendering_mode=None`` on a Kit visualizer, Isaac Lab does not apply RTX profile overrides - (USD-authored / native defaults apply). Other visualizers ignore ``rendering_mode``; use their own config classes - (for example :class:`~isaaclab_visualizers.newton.newton_visualizer_cfg.NewtonVisualizerCfg` for Newton GL). +* If ``rendering_mode=None`` on :class:`~isaaclab_physx.visualizers.kit_visualizer_cfg.KitVisualizerCfg`, Isaac Lab does + not apply RTX profile overrides (USD / Kit defaults apply). Other visualizers ignore ``rendering_mode``; for example + use :class:`~isaaclab_visualizers.newton.newton_visualizer_cfg.NewtonVisualizerCfg` for Newton GL. * ``--rendering_mode`` is the supported CLI entry point. .. note:: :class:`~isaaclab.rendering_mode.RenderingModeCfg` only carries ``kit_*`` fields and built-in ``rendering_mode_preset`` values (``performance``, ``balanced``, ``quality``). Those profiles drive **Kit / RTX** - carb settings for the Kit viewport and for Kit-style camera renderers (``default``, ``isaac_rtx``, ``rtx``). - Newton GL and Newton Warp are configured on :class:`~isaaclab_visualizers.newton.newton_visualizer_cfg.NewtonVisualizerCfg` - and :class:`~isaaclab_newton.renderers.newton_warp_renderer_cfg.NewtonWarpRendererCfg` respectively, not via + carb settings on the Kit viewport (via :mod:`isaaclab_physx.visualizers`) and on RTX camera renderers (``default``, + ``isaac_rtx``, ``rtx`` under :mod:`isaaclab_physx.renderers`). Newton GL and Newton Warp are configured on + :class:`~isaaclab_visualizers.newton.newton_visualizer_cfg.NewtonVisualizerCfg` and + :class:`~isaaclab_newton.renderers.newton_warp_renderer_cfg.NewtonWarpRendererCfg` respectively, not via ``SimulationCfg.rendering_mode_cfgs``. Example renders from the ``set_rendering_mode.py`` script. @@ -99,7 +121,7 @@ The built-in ``rendering_mode_preset`` field only accepts ``performance``, ``bal fixed RTX baselines in ``isaaclab.rendering_mode.rendering_mode_presets``. Isaac Lab does not provide a supported way to register additional preset baselines. Customization is done by adding a **named profile** to :attr:`~sim.SimulationCfg.rendering_mode_cfgs` that picks one of the three baselines and overrides it with ``kit_*`` -fields—see item 2 below. +fields—see the **custom profile** step (item 2) below. There are two ways to provide settings that overwrite presets: @@ -158,13 +180,16 @@ There are two ways to provide settings that overwrite presets: 2. If you need a custom profile, define your own named entry in - :attr:`~sim.SimulationCfg.rendering_mode_cfgs` and reference that name from - ``camera_cfg.renderer_cfg.rendering_mode`` (Kit-style renderers) and/or ``KitVisualizerCfg.rendering_mode``. + :attr:`~sim.SimulationCfg.rendering_mode_cfgs` and reference that name from ``KitVisualizerCfg.rendering_mode`` + (:mod:`isaaclab_physx.visualizers`) and/or ``camera_cfg.renderer_cfg.rendering_mode`` (RTX renderers under + :mod:`isaaclab_physx.renderers`). .. code-block:: python import isaaclab.sim as sim_utils from isaaclab.rendering_mode import RenderingModeCfg + from isaaclab.sensors.camera import CameraCfg + from isaaclab_physx.renderers import IsaacRtxRendererCfg from isaaclab_physx.visualizers import KitVisualizerCfg sim_cfg = sim_utils.SimulationCfg( @@ -178,6 +203,14 @@ There are two ways to provide settings that overwrite presets: visualizer_cfgs=[KitVisualizerCfg(rendering_mode="my_profile")], ) + camera_cfg = CameraCfg( + prim_path="/World/envs/env_.*/Camera", + height=480, + width=640, + renderer_cfg=IsaacRtxRendererCfg(rendering_mode="my_profile"), + ) + # Same profile string on ``KitVisualizerCfg`` and on RTX ``renderer_cfg``; attach camera_cfg in your scene. + Current Limitations ------------------- diff --git a/source/isaaclab/isaaclab/app/app_launcher.py b/source/isaaclab/isaaclab/app/app_launcher.py index a999f0cf2a6..03d2d131466 100644 --- a/source/isaaclab/isaaclab/app/app_launcher.py +++ b/source/isaaclab/isaaclab/app/app_launcher.py @@ -447,9 +447,9 @@ def add_app_launcher_args(parser: argparse.ArgumentParser) -> None: action=ExplicitAction, choices={"performance", "balanced", "quality"}, help=( - "Selects a named profile from SimulationCfg.rendering_mode_cfgs (default: performance, " - "balanced, quality). Overrides per-camera and per-visualizer rendering_mode when set. " - "Customize profiles with isaaclab.rendering_mode.RenderingModeCfg." + "RTX rendering preset: performance, balanced, or quality. When set, overrides " + "rendering_mode on cameras and on the Kit visualizer. Add or adjust named profiles in " + "SimulationCfg.rendering_mode_cfgs using RenderingModeCfg." ), ) arg_group.add_argument( diff --git a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py index 1728837cfd8..142b6f446dc 100644 --- a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py +++ b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py @@ -12,51 +12,134 @@ @configclass class RenderingModeCfg: - """Shared rendering mode profile for renderers and visualizers. + """Omniverse RTX rendering controls for Kit profiles (viewport and Kit-style camera renderers). - This profile keeps Omniverse/RTX controls in one place using ``kit_*`` fields. + These parameters configure the `Omniverse RTX Renderer`_. When you attach a profile to + :attr:`~isaaclab.sim.SimulationCfg.rendering_mode_cfgs` and reference it from a renderer or + :class:`~isaaclab_physx.visualizers.kit_visualizer_cfg.KitVisualizerCfg`, Isaac Lab applies the + corresponding ``kit_*`` fields (and optional :attr:`rendering_mode_preset`) via carb settings. + + Default Kit/RTX behavior for Isaac Lab still comes from the experience files: + + * ``apps/isaaclab.python.rendering.kit`` — simulation with the GUI enabled. + * ``apps/isaaclab.python.headless.rendering.kit`` — headless simulation. + + Non-``None`` fields here override those defaults for the active profile. Built-in preset names + (``performance``, ``balanced``, ``quality``) match the baselines in + :mod:`isaaclab.rendering_mode.rendering_mode_presets`. Choosing a preset via + :attr:`rendering_mode_preset` or the CLI flag ``--rendering_mode`` behaves like selecting that + profile for the run. + + .. _Omniverse RTX Renderer: https://docs.omniverse.nvidia.com/materials-and-rendering/latest/rtx-renderer.html """ rendering_mode_preset: Literal["performance", "balanced", "quality"] | None = None - """Optional built-in preset profile. + """Optional built-in RTX baseline (performance, balanced, or quality). - Preset values are defined in 'isaaclab.rendering_mode.rendering_mode_presets'. + Values are defined in :mod:`isaaclab.rendering_mode.rendering_mode_presets`. This is the same + conceptual knob as passing ``--rendering_mode`` to a script: it selects one of the three + packaged profiles before any per-field ``kit_*`` overrides below are applied. """ kit_enable_translucency: bool | None = None - """Maps to '/rtx/translucency/enabled'.""" + """Enables translucency for specular transmissive surfaces such as glass. + + This comes at the cost of some performance. Default in experience files is typically ``False``. + Carb path: ``/rtx/translucency/enabled``. + """ kit_enable_reflections: bool | None = None - """Maps to '/rtx/reflections/enabled'.""" + """Enables reflections at the cost of some performance. Default is often ``False`` in presets. + + Carb path: ``/rtx/reflections/enabled``. + """ kit_enable_global_illumination: bool | None = None - """Maps to '/rtx/indirectDiffuse/enabled'.""" + """Enables diffuse global illumination at the cost of some performance. Default is often ``False``. + + Carb path: ``/rtx/indirectDiffuse/enabled``. + """ kit_antialiasing_mode: Literal["Off", "FXAA", "DLSS", "TAA", "DLAA"] | None = None - """Optional anti-aliasing mode applied via Replicator settings helper.""" + """Anti-aliasing mode (defaults in experience files often favor DLSS where available). + + - **DLSS**: Uses AI to reconstruct higher-resolution frames from a lower-resolution input, using + motion data and prior-frame feedback. + - **DLAA**: Uses the same super-resolution stack as DLSS to anti-alias at native resolution for + maximum image quality. + + Applied through ``omni.replicator.core`` (``set_render_rtx_realtime``) so it stays consistent + with Replicator; other ``kit_*`` paths are set directly on carb after this call. + """ kit_enable_dlssg: bool | None = None - """Maps to '/rtx-transient/dlssg/enabled'.""" + """Enables DLSS Frame Generation. Default is typically ``False``. + + DLSS-G boosts performance by synthesizing additional frames from sequential frames and motion + data. + + .. note:: + + Requires an Ada Lovelace GPU. Can add thread-related overhead. + + Carb path: ``/rtx-transient/dlssg/enabled``. + """ kit_enable_dl_denoiser: bool | None = None - """Maps to '/rtx-transient/dldenoiser/enabled'.""" + """Enables the DL denoiser (quality up, performance down). + + Carb path: ``/rtx-transient/dldenoiser/enabled``. + """ kit_dlss_mode: Literal[0, 1, 2, 3] | None = None - """Maps to '/rtx/post/dlss/execMode'.""" + """When using DLSS anti-aliasing, selects the performance/quality tradeoff. Default is often ``0``. + + * ``0`` — Performance + * ``1`` — Balanced + * ``2`` — Quality + * ``3`` — Auto + + Carb path: ``/rtx/post/dlss/execMode``. + """ kit_enable_direct_lighting: bool | None = None - """Maps to '/rtx/directLighting/enabled'.""" + """Enables direct light contributions from lights. Default is often ``False`` in tight presets. + + Carb path: ``/rtx/directLighting/enabled``. + """ kit_samples_per_pixel: int | None = None - """Maps to '/rtx/directLighting/sampledLighting/samplesPerPixel'.""" + """Direct lighting samples per pixel (higher improves quality, costs performance). Default is often ``1``. + + Carb path: ``/rtx/directLighting/sampledLighting/samplesPerPixel``. + """ kit_enable_shadows: bool | None = None - """Maps to '/rtx/shadows/enabled'.""" + """Enables shadows (performance cost). Defaults are often ``True`` when lighting is on. + + Carb path: ``/rtx/shadows/enabled``. + """ kit_enable_ambient_occlusion: bool | None = None - """Maps to '/rtx/ambientOcclusion/enabled'.""" + """Enables ambient occlusion at a performance cost. Default is often ``False`` in performance presets. + + Carb path: ``/rtx/ambientOcclusion/enabled``. + """ kit_dome_light_upper_lower_strategy: Literal[0, 3, 4] | None = None - """Maps to '/rtx/domeLight/upperLowerStrategy'.""" + """How the dome light is sampled. Default is often ``0``. + + See `dome light sampling`_ in the Omniverse RTX docs for semantics. + + * ``0`` — **Image-based lighting (IBL)** — Most accurate for high-frequency dome textures; can show + sampling artifacts in real time. + * ``3`` — **Limited IBL** — Fastest, least accurate; good when the dome is a minor contributor. + * ``4`` — **Approximated IBL** — Fast, artifact-free in real time for low-frequency domes; pairs + with the direct-lighting denoiser. + + Carb path: ``/rtx/domeLight/upperLowerStrategy``. + + .. _dome light sampling: https://docs.omniverse.nvidia.com/materials-and-rendering/latest/rtx-renderer_common.html#dome-light + """ - # TODO: Consider supporting additional raw backend settings dictionaries. + # TODO: Optional passthrough dict for arbitrary carb keys (cf. legacy RenderCfg.carb_settings). diff --git a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py index 6093ac5bb6b..b6f8b289950 100644 --- a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py +++ b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py @@ -7,6 +7,7 @@ from __future__ import annotations +import contextlib import logging from typing import Any @@ -20,22 +21,26 @@ _KNOWN_RENDERING_MODE_PRESETS = frozenset({"performance", "balanced", "quality"}) - -def _collect_str_leaves(obj: Any, out: list[str], depth: int = 0) -> None: - """Collect non-empty strings from nested dict/list structures (carb subtrees).""" - if depth > 12: - return - if isinstance(obj, str): - s = obj.strip() - if s: - out.append(s) - return - if isinstance(obj, dict): - for v in obj.values(): - _collect_str_leaves(v, out, depth + 1) - elif isinstance(obj, (list, tuple, set)): - for v in obj: - _collect_str_leaves(v, out, depth + 1) +# Try leaf paths first: AppLauncher uses set_string; generic get() may return a dict subtree. +_CLI_MODE_STRING_PATHS = ( + "/isaaclab/rendering/rendering_mode", + "/isaaclab/rendering/rendering_mode/value", + "/isaaclab/rendering/rendering_mode/default", +) + +_KIT_FIELD_TO_CARB: dict[str, str] = { + "kit_enable_translucency": "/rtx/translucency/enabled", + "kit_enable_reflections": "/rtx/reflections/enabled", + "kit_enable_global_illumination": "/rtx/indirectDiffuse/enabled", + "kit_enable_dlssg": "/rtx-transient/dlssg/enabled", + "kit_enable_dl_denoiser": "/rtx-transient/dldenoiser/enabled", + "kit_dlss_mode": "/rtx/post/dlss/execMode", + "kit_enable_direct_lighting": "/rtx/directLighting/enabled", + "kit_samples_per_pixel": "/rtx/directLighting/sampledLighting/samplesPerPixel", + "kit_enable_shadows": "/rtx/shadows/enabled", + "kit_enable_ambient_occlusion": "/rtx/ambientOcclusion/enabled", + "kit_dome_light_upper_lower_strategy": "/rtx/domeLight/upperLowerStrategy", +} def _coerce_carb_rendering_mode_value(raw: Any) -> str | None: @@ -43,6 +48,22 @@ def _coerce_carb_rendering_mode_value(raw: Any) -> str | None: Path is typically ``/isaaclab/rendering/rendering_mode``. """ + + def collect_str_leaves(obj: Any, out: list[str], depth: int = 0) -> None: + if depth > 12: + return + if isinstance(obj, str): + s = obj.strip() + if s: + out.append(s) + return + if isinstance(obj, dict): + for v in obj.values(): + collect_str_leaves(v, out, depth + 1) + elif isinstance(obj, (list, tuple, set)): + for v in obj: + collect_str_leaves(v, out, depth + 1) + if raw is None: return None if isinstance(raw, str): @@ -60,7 +81,7 @@ def _coerce_carb_rendering_mode_value(raw: Any) -> str | None: if nested: return nested strings: list[str] = [] - _collect_str_leaves(raw, strings) + collect_str_leaves(raw, strings) if not strings: return None for s in strings: @@ -78,26 +99,18 @@ def _read_cli_rendering_mode_profile_name(get_setting: Any) -> str | None: """ global _cli_rendering_mode_resolution_warned - try: + with contextlib.suppress(Exception): import carb gs = carb.settings.get_settings() if gs is not None and hasattr(gs, "get_string"): - for path in ( - "/isaaclab/rendering/rendering_mode", - "/isaaclab/rendering/rendering_mode/value", - "/isaaclab/rendering/rendering_mode/default", - ): - try: + for path in _CLI_MODE_STRING_PATHS: + with contextlib.suppress(Exception): s = gs.get_string(path) if s is not None: out = str(s).strip() if out: return out - except Exception: - continue - except Exception: - pass raw = get_setting("/isaaclab/rendering/rendering_mode") coerced = _coerce_carb_rendering_mode_value(raw) @@ -129,6 +142,13 @@ def _normalize_rendering_mode_profile_name(name: Any) -> str | None: return None +def _resolve_effective_rendering_mode_name(get_setting: Any, cfg: Any) -> str | None: + """CLI explicit flag wins; otherwise use ``cfg.rendering_mode``.""" + if bool(get_setting("/isaaclab/rendering/rendering_mode/explicit")): + return _read_cli_rendering_mode_profile_name(get_setting) + return _normalize_rendering_mode_profile_name(getattr(cfg, "rendering_mode", None)) + + def apply_kit_rendering_preset(set_setting: Any, preset_name: str) -> None: """Apply a named kit preset via provided setting setter.""" preset = get_kit_rendering_preset(preset_name) @@ -144,27 +164,12 @@ def apply_kit_rendering_mode_cfg(set_setting: Any, mode_cfg: RenderingModeCfg) - # Replicator's set_render_rtx_realtime() can reset other RTX carb flags. Run it before applying # explicit kit_* carb paths so user overrides remain authoritative. if mode_cfg.kit_antialiasing_mode is not None: - try: + with contextlib.suppress(Exception): import omni.replicator.core as rep rep.settings.set_render_rtx_realtime(antialiasing=mode_cfg.kit_antialiasing_mode) - except Exception: - pass - - field_to_carb = { - "kit_enable_translucency": "/rtx/translucency/enabled", - "kit_enable_reflections": "/rtx/reflections/enabled", - "kit_enable_global_illumination": "/rtx/indirectDiffuse/enabled", - "kit_enable_dlssg": "/rtx-transient/dlssg/enabled", - "kit_enable_dl_denoiser": "/rtx-transient/dldenoiser/enabled", - "kit_dlss_mode": "/rtx/post/dlss/execMode", - "kit_enable_direct_lighting": "/rtx/directLighting/enabled", - "kit_samples_per_pixel": "/rtx/directLighting/sampledLighting/samplesPerPixel", - "kit_enable_shadows": "/rtx/shadows/enabled", - "kit_enable_ambient_occlusion": "/rtx/ambientOcclusion/enabled", - "kit_dome_light_upper_lower_strategy": "/rtx/domeLight/upperLowerStrategy", - } - for field_name, carb_key in field_to_carb.items(): + + for field_name, carb_key in _KIT_FIELD_TO_CARB.items(): value = getattr(mode_cfg, field_name, None) if value is not None: set_setting(carb_key, value) @@ -172,10 +177,7 @@ def apply_kit_rendering_mode_cfg(set_setting: Any, mode_cfg: RenderingModeCfg) - def resolve_rendering_mode_name_for_renderer_cfg(get_setting: Any, renderer_cfg: Any) -> str | None: """Resolve effective rendering mode profile name for a camera/renderer cfg.""" - cli_mode_explicit = bool(get_setting("/isaaclab/rendering/rendering_mode/explicit")) - if cli_mode_explicit: - return _read_cli_rendering_mode_profile_name(get_setting) - return _normalize_rendering_mode_profile_name(getattr(renderer_cfg, "rendering_mode", None)) + return _resolve_effective_rendering_mode_name(get_setting, renderer_cfg) def apply_mode_profile_to_renderer_cfg( @@ -198,10 +200,7 @@ def apply_mode_profile_to_renderer_cfg( def resolve_rendering_mode_name_for_visualizer_cfg(get_setting: Any, visualizer_cfg: Any) -> str | None: """Resolve effective rendering mode profile name for a visualizer cfg.""" - cli_mode_explicit = bool(get_setting("/isaaclab/rendering/rendering_mode/explicit")) - if cli_mode_explicit: - return _read_cli_rendering_mode_profile_name(get_setting) - return _normalize_rendering_mode_profile_name(getattr(visualizer_cfg, "rendering_mode", None)) + return _resolve_effective_rendering_mode_name(get_setting, visualizer_cfg) def resolve_rendering_mode_cfg( diff --git a/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py b/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py index 7a37d9e9961..a70bccb0d0b 100644 --- a/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py +++ b/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py @@ -63,11 +63,11 @@ class VisualizerCfg: """ rendering_mode: str | None = None - """Name of the rendering mode profile (Kit / RTX only). + """Name of the rendering mode profile for selecting rendering settings. - Used when :attr:`visualizer_type` is ``kit``; selects an entry from - :class:`isaaclab.sim.SimulationCfg.rendering_mode_cfgs`. Ignored for other visualizers. - If None, no RTX profile overrides are applied for Kit and native defaults are used. + Note, currently supports rendering settings for Kit Visualizer. + + If set None, default rendering settings are used. """ def get_visualizer_type(self) -> str | None: diff --git a/source/isaaclab/test/rendering/test_rendering_mode.py b/source/isaaclab/test/rendering/test_rendering_mode.py new file mode 100644 index 00000000000..75b9941c727 --- /dev/null +++ b/source/isaaclab/test/rendering/test_rendering_mode.py @@ -0,0 +1,236 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Rendering mode: offline resolution checks and Isaac Sim integration tests. + +**Import order:** Do not import Isaac Sim / USD / ``pxr`` at module scope. Pytest loads this file +before the ``simulation_app`` fixture runs :class:`~isaaclab.app.AppLauncher`; loading ``pxr`` from +conda before Kit starts causes USD extension failures. Integration tests import sim APIs *inside* +the test body (after the fixture has launched SimulationApp). + +Offline tests only use lightweight imports below. +""" + +import logging + +import pytest + +from isaaclab.renderers.renderer_cfg import RendererCfg +from isaaclab.rendering_mode import RenderingModeCfg +from isaaclab.rendering_mode.rendering_mode_utils import ( + apply_mode_profile_to_renderer_cfg, + resolve_rendering_mode_name_for_renderer_cfg, +) + + +@pytest.fixture(scope="module") +def simulation_app(): + """Launch Kit once for Isaac Sim tests in this module (must run before any ``pxr`` import).""" + from isaaclab.app import AppLauncher + + return AppLauncher(headless=True, enable_cameras=True).app + + +# --------------------------------------------------------------------------- +# Offline: resolution / gating (no live Kit session) +# --------------------------------------------------------------------------- + + +class _FakeSettings: + """Minimal carb settings view for CLI explicit + rendering_mode paths.""" + + def __init__(self, explicit: bool, mode): + self._data: dict[str, object] = { + "/isaaclab/rendering/rendering_mode/explicit": explicit, + "/isaaclab/rendering/rendering_mode": mode, + } + + def get(self, key: str): + return self._data.get(key) + + +def test_cli_explicit_rendering_mode_overrides_renderer_cfg(): + """CLI explicit flag should win over ``RendererCfg.rendering_mode`` (Kit RTX path).""" + r_cfg = RendererCfg(renderer_type="isaac_rtx", rendering_mode="quality") + settings = _FakeSettings(explicit=True, mode="performance") + assert resolve_rendering_mode_name_for_renderer_cfg(settings.get, r_cfg) == "performance" + + +def test_cli_explicit_coerces_carb_subtree_to_profile_name(): + """Some Kit builds return a dict subtree from ``get()``; profile name must still resolve.""" + r_cfg = RendererCfg(renderer_type="isaac_rtx", rendering_mode="performance") + settings = _FakeSettings(explicit=True, mode={"outer": {"inner": "balanced"}}) + assert resolve_rendering_mode_name_for_renderer_cfg(settings.get, r_cfg) == "balanced" + + +def test_apply_rtx_profile_skips_non_rtx_renderer_backend(): + """Only default / isaac_rtx / rtx renderers receive ``SimulationCfg.rendering_mode_cfgs`` RTX applies.""" + recorded: list[tuple[str, object]] = [] + + def get_setting(key: str): + return _FakeSettings(explicit=False, mode="").get(key) + + def set_setting(name: str, value: object) -> None: + recorded.append((name, value)) + + r_cfg = RendererCfg(renderer_type="newton_warp", rendering_mode="performance") + apply_mode_profile_to_renderer_cfg( + get_setting, + set_setting, + r_cfg, + {"performance": RenderingModeCfg(rendering_mode_preset="performance")}, + logger=logging.getLogger(__name__), + ) + assert recorded == [] + + +# --------------------------------------------------------------------------- +# Isaac Sim: presets and overrides via visualizer and via RTX camera renderer +# --------------------------------------------------------------------------- + + +@pytest.mark.isaacsim_ci +@pytest.mark.usefixtures("simulation_app") +def test_rendering_mode_presets_apply_via_visualizer(): + """Built-in presets + ``kit_*`` overrides should propagate to carb via Kit visualizer init.""" + from isaaclab_physx.visualizers import KitVisualizerCfg + + from isaaclab.app.settings_manager import get_settings_manager + from isaaclab.rendering_mode import get_kit_rendering_preset + from isaaclab.sim.simulation_cfg import SimulationCfg + from isaaclab.sim.simulation_context import SimulationContext + + dlss_override = 3 + + for mode_name in ["performance", "balanced", "quality"]: + SimulationContext.clear_instance() + preset_dict = get_kit_rendering_preset(mode_name) + profile_name = f"profile_{mode_name}" + + cfg = SimulationCfg( + rendering_mode_cfgs={ + profile_name: RenderingModeCfg( + rendering_mode_preset=mode_name, + kit_dlss_mode=dlss_override, + ) + }, + visualizer_cfgs=KitVisualizerCfg(rendering_mode=profile_name), + ) + sim = SimulationContext(cfg) + sim.reset() + + settings = get_settings_manager() + for key, val in preset_dict.items(): + setting_name = key if key.startswith("/") else "/" + key.replace(".", "/") + expected = dlss_override if setting_name == "/rtx/post/dlss/execMode" else val + assert settings.get(setting_name) == expected, ( + f"Mismatch for '{setting_name}' in mode '{mode_name}': " + f"expected {expected!r}, got {settings.get(setting_name)!r}" + ) + + SimulationContext.clear_instance() + + +@pytest.mark.isaacsim_ci +@pytest.mark.usefixtures("simulation_app") +def test_rendering_mode_kit_field_overrides_via_visualizer(): + """Explicit ``RenderingModeCfg`` fields should map to carb when the Kit visualizer applies the profile.""" + from isaaclab_physx.visualizers import KitVisualizerCfg + + from isaaclab.sim.simulation_cfg import SimulationCfg + from isaaclab.sim.simulation_context import SimulationContext + + mode_cfg = RenderingModeCfg( + kit_enable_translucency=True, + kit_enable_reflections=True, + kit_enable_global_illumination=True, + kit_antialiasing_mode="DLAA", + kit_enable_dlssg=True, + kit_enable_dl_denoiser=True, + kit_dlss_mode=0, + kit_enable_direct_lighting=True, + kit_samples_per_pixel=4, + kit_enable_shadows=True, + kit_enable_ambient_occlusion=True, + ) + cfg = SimulationCfg( + rendering_mode_cfgs={"custom": mode_cfg}, + visualizer_cfgs=KitVisualizerCfg(rendering_mode="custom"), + ) + sim = SimulationContext(cfg) + sim.reset() + + assert sim.get_setting("/rtx/translucency/enabled") is True + assert sim.get_setting("/rtx/reflections/enabled") is True + assert sim.get_setting("/rtx/indirectDiffuse/enabled") is True + assert sim.get_setting("/rtx-transient/dlssg/enabled") is True + assert sim.get_setting("/rtx-transient/dldenoiser/enabled") is True + assert sim.get_setting("/rtx/post/dlss/execMode") == 0 + assert sim.get_setting("/rtx/directLighting/enabled") is True + assert sim.get_setting("/rtx/directLighting/sampledLighting/samplesPerPixel") == 4 + assert sim.get_setting("/rtx/shadows/enabled") is True + assert sim.get_setting("/rtx/ambientOcclusion/enabled") is True + + SimulationContext.clear_instance() + + +@pytest.mark.isaacsim_ci +@pytest.mark.usefixtures("simulation_app") +def test_rendering_mode_kit_field_overrides_via_camera_renderer(): + """Same ``RenderingModeCfg`` profile should apply when a Kit RTX camera initializes (renderer path).""" + from isaaclab_physx.renderers import IsaacRtxRendererCfg + + import isaaclab.sim as sim_utils + from isaaclab.sensors.camera import Camera, CameraCfg + from isaaclab.sim.simulation_cfg import SimulationCfg + from isaaclab.sim.simulation_context import SimulationContext + + SimulationContext.clear_instance() + sim_utils.create_new_stage() + cfg_ground = sim_utils.GroundPlaneCfg() + cfg_ground.func("/World/defaultGroundPlane", cfg_ground) + + mode_cfg = RenderingModeCfg( + kit_enable_translucency=True, + kit_enable_reflections=True, + kit_enable_global_illumination=True, + kit_dlss_mode=0, + kit_enable_direct_lighting=True, + kit_samples_per_pixel=4, + kit_enable_shadows=True, + kit_enable_ambient_occlusion=True, + ) + sim_cfg = SimulationCfg( + dt=0.01, + rendering_mode_cfgs={"cam_profile": mode_cfg}, + ) + sim = SimulationContext(sim_cfg) + sim_utils.update_stage() + + camera_cfg = CameraCfg( + height=64, + width=64, + prim_path="/World/Camera", + update_period=0, + data_types=["distance_to_image_plane"], + spawn=sim_utils.PinholeCameraCfg( + focal_length=24.0, focus_distance=400.0, horizontal_aperture=20.955, clipping_range=(0.1, 1.0e5) + ), + renderer_cfg=IsaacRtxRendererCfg(rendering_mode="cam_profile"), + ) + camera = Camera(camera_cfg) + sim.reset() + assert camera.is_initialized + + assert sim.get_setting("/rtx/translucency/enabled") is True + assert sim.get_setting("/rtx/reflections/enabled") is True + assert sim.get_setting("/rtx/indirectDiffuse/enabled") is True + assert sim.get_setting("/rtx/post/dlss/execMode") == 0 + assert sim.get_setting("/rtx/directLighting/enabled") is True + assert sim.get_setting("/rtx/directLighting/sampledLighting/samplesPerPixel") == 4 + assert sim.get_setting("/rtx/shadows/enabled") is True + assert sim.get_setting("/rtx/ambientOcclusion/enabled") is True + + SimulationContext.clear_instance() diff --git a/source/isaaclab/test/rendering_mode/test_rendering_mode_renderer_bridge.py b/source/isaaclab/test/rendering_mode/test_rendering_mode_renderer_bridge.py deleted file mode 100644 index 3681c9d0096..00000000000 --- a/source/isaaclab/test/rendering_mode/test_rendering_mode_renderer_bridge.py +++ /dev/null @@ -1,89 +0,0 @@ -# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). -# All rights reserved. -# -# SPDX-License-Identifier: BSD-3-Clause - -"""Unit tests for rendering mode resolution on renderer configs (no Kit required).""" - -from __future__ import annotations - -from isaaclab.renderers.renderer_cfg import RendererCfg -from isaaclab.rendering_mode.rendering_mode_cfg import RenderingModeCfg -from isaaclab.rendering_mode.rendering_mode_utils import ( - apply_mode_profile_to_renderer_cfg, - resolve_rendering_mode_cfg, - resolve_rendering_mode_name_for_renderer_cfg, -) - - -class _FakeSettings: - def __init__(self, explicit: bool, mode): - self._data: dict[str, object] = { - "/isaaclab/rendering/rendering_mode/explicit": explicit, - "/isaaclab/rendering/rendering_mode": mode, - } - - def get(self, key: str): - return self._data.get(key) - - -def test_resolve_renderer_mode_cli_explicit_overrides_cfg(): - r_cfg = RendererCfg(renderer_type="isaac_rtx", rendering_mode="quality") - settings = _FakeSettings(explicit=True, mode="performance") - assert resolve_rendering_mode_name_for_renderer_cfg(settings.get, r_cfg) == "performance" - - -def test_resolve_renderer_mode_cli_explicit_coerces_carb_dict(): - """Some Kit builds return a subtree dict from carb get(); profile name may be embedded.""" - r_cfg = RendererCfg(renderer_type="isaac_rtx", rendering_mode="performance") - settings = _FakeSettings(explicit=True, mode={"leaf": "quality"}) - assert resolve_rendering_mode_name_for_renderer_cfg(settings.get, r_cfg) == "quality" - - -def test_resolve_renderer_mode_cli_explicit_coerces_nested_carb_dict(): - r_cfg = RendererCfg(renderer_type="isaac_rtx", rendering_mode="performance") - settings = _FakeSettings(explicit=True, mode={"outer": {"inner": "balanced"}}) - assert resolve_rendering_mode_name_for_renderer_cfg(settings.get, r_cfg) == "balanced" - - -def test_resolve_renderer_mode_cli_explicit_coerces_carb_dict_value_key(): - """Carb may expose the profile under a ``value`` (or similar) leaf.""" - r_cfg = RendererCfg(renderer_type="isaac_rtx", rendering_mode="balanced") - settings = _FakeSettings(explicit=True, mode={"value": "performance"}) - assert resolve_rendering_mode_name_for_renderer_cfg(settings.get, r_cfg) == "performance" - - -def test_cli_explicit_unreadable_carb_dict_without_profile_string_returns_none(): - """When generic get() yields a dict with no embedded profile strings, resolution fails.""" - r_cfg = RendererCfg(renderer_type="isaac_rtx", rendering_mode="performance") - settings = _FakeSettings(explicit=True, mode={"flags": True, "count": 2}) - assert resolve_rendering_mode_name_for_renderer_cfg(settings.get, r_cfg) is None - - -def test_resolve_renderer_mode_uses_cfg_when_cli_not_explicit(): - r_cfg = RendererCfg(renderer_type="isaac_rtx", rendering_mode="balanced") - settings = _FakeSettings(explicit=False, mode="") - assert resolve_rendering_mode_name_for_renderer_cfg(settings.get, r_cfg) == "balanced" - - -def test_resolve_rendering_mode_cfg_rejects_non_str_mode_name(): - """Profile lookup keys must be str (guards against bad carb.get() types).""" - log = __import__("logging").getLogger(__name__) - assert resolve_rendering_mode_cfg({}, {"q": RenderingModeCfg()}, log) is None - - -def test_apply_mode_profile_kit_branch_calls_set_setting(): - recorded: list[tuple[str, object]] = [] - - def get_setting(key: str): - return _FakeSettings(explicit=False, mode="").get(key) - - def set_setting(name: str, value: object) -> None: - recorded.append((name, value)) - - r_cfg = RendererCfg(renderer_type="isaac_rtx", rendering_mode="performance") - mode_cfgs = {"performance": RenderingModeCfg(rendering_mode_preset="performance")} - apply_mode_profile_to_renderer_cfg( - get_setting, set_setting, r_cfg, mode_cfgs, logger=__import__("logging").getLogger(__name__) - ) - assert any(k == "/rtx/shadows/enabled" for k, _ in recorded) diff --git a/source/isaaclab/test/sim/test_simulation_render_config.py b/source/isaaclab/test/sim/test_simulation_render_config.py deleted file mode 100644 index 4eb7d111a99..00000000000 --- a/source/isaaclab/test/sim/test_simulation_render_config.py +++ /dev/null @@ -1,93 +0,0 @@ -# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). -# All rights reserved. -# -# SPDX-License-Identifier: BSD-3-Clause - - -"""Launch Isaac Sim Simulator first.""" - -from isaaclab.app import AppLauncher - -# launch omniverse app -simulation_app = AppLauncher(headless=True, enable_cameras=True).app - - -"""Rest everything follows.""" - -import pytest -from isaaclab_physx.visualizers import KitVisualizerCfg - -from isaaclab.app.settings_manager import get_settings_manager -from isaaclab.rendering_mode import RenderingModeCfg, get_kit_rendering_preset -from isaaclab.sim.simulation_cfg import SimulationCfg -from isaaclab.sim.simulation_context import SimulationContext - - -@pytest.mark.isaacsim_ci -def test_rendering_mode_presets(): - """Preset profiles should apply and allow explicit field overrides.""" - dlss_override = 3 - - for mode_name in ["performance", "balanced", "quality"]: - SimulationContext.clear_instance() - preset_dict = get_kit_rendering_preset(mode_name) - profile_name = f"profile_{mode_name}" - - cfg = SimulationCfg( - rendering_mode_cfgs={ - profile_name: RenderingModeCfg( - rendering_mode_preset=mode_name, - kit_dlss_mode=dlss_override, - ) - }, - visualizer_cfgs=KitVisualizerCfg(rendering_mode=profile_name), - ) - sim = SimulationContext(cfg) - sim.reset() - - settings = get_settings_manager() - for key, val in preset_dict.items(): - # Preset keys are already absolute carb paths (e.g. "/rtx/..."); avoid a double leading slash. - setting_name = key if key.startswith("/") else "/" + key.replace(".", "/") - expected = dlss_override if setting_name == "/rtx/post/dlss/execMode" else val - assert settings.get(setting_name) == expected, ( - f"Mismatch for '{setting_name}' in mode '{mode_name}': " - f"expected {expected!r}, got {settings.get(setting_name)!r}" - ) - - SimulationContext.clear_instance() - - -@pytest.mark.isaacsim_ci -def test_rendering_mode_field_overrides(): - """Explicit RenderingModeCfg kit_* fields should map to carb settings.""" - mode_cfg = RenderingModeCfg( - kit_enable_translucency=True, - kit_enable_reflections=True, - kit_enable_global_illumination=True, - kit_antialiasing_mode="DLAA", - kit_enable_dlssg=True, - kit_enable_dl_denoiser=True, - kit_dlss_mode=0, - kit_enable_direct_lighting=True, - kit_samples_per_pixel=4, - kit_enable_shadows=True, - kit_enable_ambient_occlusion=True, - ) - cfg = SimulationCfg( - rendering_mode_cfgs={"custom": mode_cfg}, - visualizer_cfgs=KitVisualizerCfg(rendering_mode="custom"), - ) - sim = SimulationContext(cfg) - sim.reset() - - assert sim.get_setting("/rtx/translucency/enabled") is True - assert sim.get_setting("/rtx/reflections/enabled") is True - assert sim.get_setting("/rtx/indirectDiffuse/enabled") is True - assert sim.get_setting("/rtx-transient/dlssg/enabled") is True - assert sim.get_setting("/rtx-transient/dldenoiser/enabled") is True - assert sim.get_setting("/rtx/post/dlss/execMode") == 0 - assert sim.get_setting("/rtx/directLighting/enabled") is True - assert sim.get_setting("/rtx/directLighting/sampledLighting/samplesPerPixel") == 4 - assert sim.get_setting("/rtx/shadows/enabled") is True - assert sim.get_setting("/rtx/ambientOcclusion/enabled") is True diff --git a/tools/test_settings.py b/tools/test_settings.py index 12d4bf5bcf9..65e1e574b29 100644 --- a/tools/test_settings.py +++ b/tools/test_settings.py @@ -39,7 +39,7 @@ "test_teleop_environments_with_stage_in_memory.py": 5000, "test_cartpole_showcase_environments.py": 5000, "test_cartpole_showcase_environments_with_stage_in_memory.py": 5000, - "test_simulation_render_config.py": 1000, + "test_rendering_mode.py": 1000, "test_operational_space.py": 1000, "test_non_headless_launch.py": 1000, # This test launches the app in non-headless mode and starts simulation "test_rl_games_wrapper.py": 1000, From 371becd0cae8e58cc3f27856ab589e430cc0f751 Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Thu, 9 Apr 2026 17:25:52 +0000 Subject: [PATCH 26/34] prep --- docs/source/how-to/configure_rendering.rst | 83 +++++-------------- source/isaaclab/isaaclab/app/app_launcher.py | 5 +- .../isaaclab/renderers/renderer_cfg.py | 4 +- .../isaaclab/visualizers/visualizer_cfg.py | 7 +- .../renderers/rtx_renderer_cfg.py | 1 - .../kit/kit_visualizer_cfg.py | 6 ++ 6 files changed, 33 insertions(+), 73 deletions(-) diff --git a/docs/source/how-to/configure_rendering.rst b/docs/source/how-to/configure_rendering.rst index 98ff15bb71b..80a214852d3 100644 --- a/docs/source/how-to/configure_rendering.rst +++ b/docs/source/how-to/configure_rendering.rst @@ -17,51 +17,39 @@ Adjust and fine-tune rendering to achieve the ideal balance for your workflow. Selecting a Rendering Mode -------------------------- -At present, rendering-mode profiles are wired for :mod:`isaaclab_physx.visualizers` (``KitVisualizerCfg`` and the Kit -viewport) and for RTX camera renderers under :mod:`isaaclab_physx.renderers` (for example ``IsaacRtxRendererCfg``). Other -visualizer or renderer integrations are not supported for this feature yet. +Note, at present, rendering-mode profiles are supported for Kit Visualizers and RTX based Renderers You can pick ``performance``, ``balanced``, or ``quality`` (or a custom name you added under -:attr:`~sim.SimulationCfg.rendering_mode_cfgs`) in a few places: from the **command line**, through **visualizers**, or -through **camera renderers**. +:attr:`~sim.SimulationCfg.rendering_mode_cfgs`) in a few places: from the **command line**, through **visualizer configs**, or +through **renderer configs**. -1. **Command line.** ``--rendering_mode`` sets the mode at launch and overrides visualizer and RTX camera renderer - settings when you pass it. +1. **Command Line.** ``--rendering_mode`` sets the mode at launch and overrides visualizer and RTX camera renderer + config settings when you pass it. .. code-block:: bash ./isaaclab.sh -p scripts/tutorials/00_sim/set_rendering_mode.py --rendering_mode {performance/balanced/quality} -2. **Visualizers.** On :class:`~isaaclab_physx.visualizers.kit_visualizer_cfg.KitVisualizerCfg`, set ``rendering_mode`` - to a profile from :attr:`~sim.SimulationCfg.rendering_mode_cfgs`. This controls RTX settings for the interactive - viewport. +2. **Visualizer Configs.** From a Visualizer Config, set the ``rendering_mode`` field to a profile name defined by the + the RenderingMode Configs. There are 3 presets: ``performance``, ``balanced``, and ``quality``. Users can also define + custom profiles by adding a named entry to :attr:`~sim.SimulationCfg.rendering_mode_cfgs` (see **Overriding Rendering Mode Settings** + below). Visualizers are set to performance mode by default. .. code-block:: python - - import isaaclab.sim as sim_utils - from isaaclab_physx.visualizers import KitVisualizerCfg - + # Set KitVisualizer to balanced rendering mode sim_cfg = sim_utils.SimulationCfg( visualizer_cfgs=[ KitVisualizerCfg( - rendering_mode="performance", + rendering_mode="balanced", ), ], ) -3. **Renderers.** Set ``rendering_mode`` on :attr:`~sensors.camera.camera_cfg.CameraCfg.renderer_cfg` to a profile - name from :attr:`~sim.SimulationCfg.rendering_mode_cfgs`. Use an RTX renderer configuration (for example - :class:`~isaaclab_physx.renderers.isaac_rtx_renderer_cfg.IsaacRtxRendererCfg`). - - The profile name is a **string key**; defaults include ``performance``, ``balanced``, and ``quality``. +3. **Renderer Configs.** Similar to Visualizer Configs, from a Renderer Config, set the ``rendering_mode`` field to a profile + name defined by the RenderingMode Configs. There are 3 presets: ``performance``, ``balanced``, and ``quality``. .. code-block:: python - - import isaaclab.sim as sim_utils - from isaaclab.sensors.camera import CameraCfg - from isaaclab_physx.renderers import IsaacRtxRendererCfg - - # Default SimulationCfg already defines rendering_mode_cfgs["performance"|"balanced"|"quality"]. + # Set RTX Renderer to quality rendering mode. camera_cfg = CameraCfg( prim_path="/World/envs/env_.*/Camera", height=480, @@ -69,25 +57,8 @@ through **camera renderers**. renderer_cfg=IsaacRtxRendererCfg(rendering_mode="quality"), ) - sim_cfg = sim_utils.SimulationCfg() - # Register camera_cfg on your scene / task as usual; RTX settings apply when the camera initializes. - -Notes: - -* If ``rendering_mode=None`` on :class:`~isaaclab_physx.visualizers.kit_visualizer_cfg.KitVisualizerCfg`, Isaac Lab does - not apply RTX profile overrides (USD / Kit defaults apply). Other visualizers ignore ``rendering_mode``; for example - use :class:`~isaaclab_visualizers.newton.newton_visualizer_cfg.NewtonVisualizerCfg` for Newton GL. -* ``--rendering_mode`` is the supported CLI entry point. - .. note:: - - :class:`~isaaclab.rendering_mode.RenderingModeCfg` only carries ``kit_*`` fields and built-in - ``rendering_mode_preset`` values (``performance``, ``balanced``, ``quality``). Those profiles drive **Kit / RTX** - carb settings on the Kit viewport (via :mod:`isaaclab_physx.visualizers`) and on RTX camera renderers (``default``, - ``isaac_rtx``, ``rtx`` under :mod:`isaaclab_physx.renderers`). Newton GL and Newton Warp are configured on - :class:`~isaaclab_visualizers.newton.newton_visualizer_cfg.NewtonVisualizerCfg` and - :class:`~isaaclab_newton.renderers.newton_warp_renderer_cfg.NewtonWarpRendererCfg` respectively, not via - ``SimulationCfg.rendering_mode_cfgs``. + If ``rendering_mode=None``, Isaac Lab uses the native rendering settings of the workflow Example renders from the ``set_rendering_mode.py`` script. To help assess rendering, the example scene includes reflections, translucency, @@ -118,21 +89,15 @@ Preset rendering settings can be overwritten via :class:`~isaaclab.rendering_mode.RenderingModeCfg`. The built-in ``rendering_mode_preset`` field only accepts ``performance``, ``balanced``, or ``quality``; those map to -fixed RTX baselines in ``isaaclab.rendering_mode.rendering_mode_presets``. Isaac Lab does not provide a supported -way to register additional preset baselines. Customization is done by adding a **named profile** to -:attr:`~sim.SimulationCfg.rendering_mode_cfgs` that picks one of the three baselines and overrides it with ``kit_*`` -fields—see the **custom profile** step (item 2) below. +fixed RTX baselines in ``isaaclab.rendering_mode.rendering_mode_presets``. -There are two ways to provide settings that overwrite presets: +Rendering settings can be customized by either overwriting +specific settings of presets via ``kit_*`` fields (option 1) or by defining and adding a new **named profile** to :attr:`~sim.SimulationCfg.rendering_mode_cfgs` (option 2). 1. :class:`~isaaclab.rendering_mode.RenderingModeCfg` supports overwriting specific settings via explicit ``kit_*`` fields that map to underlying RTX settings. .. code-block:: python - - import isaaclab.sim as sim_utils - from isaaclab.rendering_mode import RenderingModeCfg - mode_cfg = RenderingModeCfg( rendering_mode_preset="performance", # explicit field overrides @@ -185,13 +150,6 @@ There are two ways to provide settings that overwrite presets: :mod:`isaaclab_physx.renderers`). .. code-block:: python - - import isaaclab.sim as sim_utils - from isaaclab.rendering_mode import RenderingModeCfg - from isaaclab.sensors.camera import CameraCfg - from isaaclab_physx.renderers import IsaacRtxRendererCfg - from isaaclab_physx.visualizers import KitVisualizerCfg - sim_cfg = sim_utils.SimulationCfg( rendering_mode_cfgs={ "my_profile": RenderingModeCfg( @@ -209,13 +167,12 @@ There are two ways to provide settings that overwrite presets: width=640, renderer_cfg=IsaacRtxRendererCfg(rendering_mode="my_profile"), ) - # Same profile string on ``KitVisualizerCfg`` and on RTX ``renderer_cfg``; attach camera_cfg in your scene. Current Limitations ------------------- -For performance reasons, we default to using DLSS for denoising, which generally provides better performance. -This may result in renders of lower quality, which may be especially evident at lower resolutions. +For performance reasons, we default to using DLSS for denoising, which generally runs faster. +This may result in renders of lower quality, especially at lower resolutions. Due to this, we recommend using per-tile or per-camera resolution of at least 100 x 100. For renders at lower resolutions, we advise setting ``kit_antialiasing_mode="DLAA"`` in diff --git a/source/isaaclab/isaaclab/app/app_launcher.py b/source/isaaclab/isaaclab/app/app_launcher.py index 03d2d131466..d33cd0c5059 100644 --- a/source/isaaclab/isaaclab/app/app_launcher.py +++ b/source/isaaclab/isaaclab/app/app_launcher.py @@ -447,9 +447,8 @@ def add_app_launcher_args(parser: argparse.ArgumentParser) -> None: action=ExplicitAction, choices={"performance", "balanced", "quality"}, help=( - "RTX rendering preset: performance, balanced, or quality. When set, overrides " - "rendering_mode on cameras and on the Kit visualizer. Add or adjust named profiles in " - "SimulationCfg.rendering_mode_cfgs using RenderingModeCfg." + "When passed, selects RenderingModeCfg presets for overwriting rendering settings of all Renderers" + "and Visualizers." ), ) arg_group.add_argument( diff --git a/source/isaaclab/isaaclab/renderers/renderer_cfg.py b/source/isaaclab/isaaclab/renderers/renderer_cfg.py index 20c414c2b15..e646caf161f 100644 --- a/source/isaaclab/isaaclab/renderers/renderer_cfg.py +++ b/source/isaaclab/isaaclab/renderers/renderer_cfg.py @@ -16,7 +16,7 @@ class RendererCfg: """Type identifier for selecting a renderer backend implementation.""" rendering_mode: str | None = None - """Name of the Kit/RTX rendering mode profile (``default``, ``isaac_rtx``, ``rtx`` only). + """Name of the rendering mode profile for selecting rendering settings. - Ignored for other renderer types; configure those via their dedicated cfg classes. + Set to None by default, which uses the native rendering settings of the workflow. """ diff --git a/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py b/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py index a70bccb0d0b..7729eb3b1b8 100644 --- a/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py +++ b/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py @@ -63,11 +63,10 @@ class VisualizerCfg: """ rendering_mode: str | None = None - """Name of the rendering mode profile for selecting rendering settings. + """Key into :attr:`~isaaclab.sim.SimulationCfg.rendering_mode_cfgs` (e.g. ``performance``, ``balanced``). - Note, currently supports rendering settings for Kit Visualizer. - - If set None, default rendering settings are used. + Kit visualizers apply this profile; other backends ignore it. ``None`` skips a named profile. + An explicit CLI ``--rendering_mode`` overrides this for the run. """ def get_visualizer_type(self) -> str | None: diff --git a/source/isaaclab_physx/isaaclab_physx/renderers/rtx_renderer_cfg.py b/source/isaaclab_physx/isaaclab_physx/renderers/rtx_renderer_cfg.py index 5bd6c7e2644..3b7324c001f 100644 --- a/source/isaaclab_physx/isaaclab_physx/renderers/rtx_renderer_cfg.py +++ b/source/isaaclab_physx/isaaclab_physx/renderers/rtx_renderer_cfg.py @@ -18,4 +18,3 @@ class RTXRendererCfg(RendererCfg): """ renderer_type: str = "rtx" - rendering_mode: str | None = None diff --git a/source/isaaclab_visualizers/isaaclab_visualizers/kit/kit_visualizer_cfg.py b/source/isaaclab_visualizers/isaaclab_visualizers/kit/kit_visualizer_cfg.py index 88112a6f20b..de8d666d2ab 100644 --- a/source/isaaclab_visualizers/isaaclab_visualizers/kit/kit_visualizer_cfg.py +++ b/source/isaaclab_visualizers/isaaclab_visualizers/kit/kit_visualizer_cfg.py @@ -33,3 +33,9 @@ class KitVisualizerCfg(VisualizerCfg): window_height: int = 720 """Viewport height in pixels.""" + + rendering_mode: str | None = "performance" + """Kit/RTX profile name from :attr:`~isaaclab.sim.SimulationCfg.rendering_mode_cfgs` (default ``performance``). + + Set to ``None`` to skip applying a named profile (USD / Kit defaults). + """ From 7a131e7adba03cb4a836214efe4736c8b09675cd Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Thu, 9 Apr 2026 18:46:40 +0000 Subject: [PATCH 27/34] preppin --- .../tutorials/00_sim/set_rendering_mode.py | 21 ++- source/isaaclab/isaaclab/app/app_launcher.py | 7 +- source/isaaclab/isaaclab/renderer/__init__.py | 10 -- .../renderer/rendering_quality_presets.py | 8 - .../isaaclab/rendering_mode/__init__.py | 8 +- .../rendering_mode/rendering_mode_cfg.py | 5 +- .../rendering_mode/rendering_mode_utils.py | 169 +++++------------- .../isaaclab/sim/simulation_context.py | 12 +- .../isaaclab/visualizers/visualizer_cfg.py | 5 +- .../test/rendering/test_rendering_mode.py | 23 +-- .../physx_scene_data_provider.py | 51 ------ .../viser/viser_visualizer.py | 54 ------ 12 files changed, 80 insertions(+), 293 deletions(-) delete mode 100644 source/isaaclab/isaaclab/renderer/__init__.py delete mode 100644 source/isaaclab/isaaclab/renderer/rendering_quality_presets.py diff --git a/scripts/tutorials/00_sim/set_rendering_mode.py b/scripts/tutorials/00_sim/set_rendering_mode.py index 0fe702b7ffe..73c96b032db 100644 --- a/scripts/tutorials/00_sim/set_rendering_mode.py +++ b/scripts/tutorials/00_sim/set_rendering_mode.py @@ -36,6 +36,7 @@ from isaaclab_physx.visualizers import KitVisualizerCfg import isaaclab.sim as sim_utils +from isaaclab.rendering_mode import RenderingModeCfg from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR @@ -46,11 +47,20 @@ def main(): # note: the CLI argument (--rendering_mode) takes precedence over this visualizer setting rendering_mode = "performance" - # Initialize simulation config with a Kit visualizer rendering profile. + # RTX tuning uses :class:`RenderingModeCfg` profiles on ``SimulationCfg.rendering_mode_cfgs`` + # (not raw carb paths). Here we extend the ``performance`` preset with reflections for this scene. sim_cfg = sim_utils.SimulationCfg( + rendering_mode_cfgs={ + "performance": RenderingModeCfg( + rendering_mode_preset="performance", + kit_enable_reflections=True, + ), + "balanced": RenderingModeCfg(rendering_mode_preset="balanced"), + "quality": RenderingModeCfg(rendering_mode_preset="quality"), + }, visualizer_cfgs=[ KitVisualizerCfg(rendering_mode=rendering_mode), - ] + ], ) sim = sim_utils.SimulationContext(sim_cfg) @@ -65,13 +75,6 @@ def main(): # Play the simulator sim.reset() - # Extra RTX carb overrides (dot keys -> ``/rtx/...`` paths). Applied after reset so they are not - # replaced by rendering-mode profile application during ``initialize_visualizers()``. - carb_settings = {"rtx.reflections.enabled": True} - for key, value in carb_settings.items(): - path = key if key.startswith("/") else "/" + key.replace(".", "/") - sim.set_setting(path, value) - # Now we are ready! print("[INFO]: Setup complete...") diff --git a/source/isaaclab/isaaclab/app/app_launcher.py b/source/isaaclab/isaaclab/app/app_launcher.py index d33cd0c5059..797c780445d 100644 --- a/source/isaaclab/isaaclab/app/app_launcher.py +++ b/source/isaaclab/isaaclab/app/app_launcher.py @@ -29,7 +29,10 @@ from isaacsim import SimulationApp from isaaclab.app.settings_manager import get_settings_manager, initialize_carb_settings -from isaaclab.rendering_mode.rendering_mode_utils import apply_kit_rendering_preset +from isaaclab.rendering_mode.rendering_mode_utils import ( + CLI_RENDERING_MODE_PROFILE_PATH, + apply_kit_rendering_preset, +) # import logger logger = logging.getLogger(__name__) @@ -1126,7 +1129,7 @@ def _set_rendering_mode_settings(self, launcher_args: dict) -> None: rendering_mode = "" settings = get_settings_manager() - settings.set_string("/isaaclab/rendering/rendering_mode", rendering_mode) + settings.set_string(CLI_RENDERING_MODE_PROFILE_PATH, rendering_mode) settings.set_bool("/isaaclab/rendering/rendering_mode/explicit", bool(rendering_mode_explicit)) # Apply built-in Kit presets at launch so RTX matches the CLI before SimulationContext runs. diff --git a/source/isaaclab/isaaclab/renderer/__init__.py b/source/isaaclab/isaaclab/renderer/__init__.py deleted file mode 100644 index 5f9eb9b3f8f..00000000000 --- a/source/isaaclab/isaaclab/renderer/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). -# All rights reserved. -# -# SPDX-License-Identifier: BSD-3-Clause - -"""Compatibility wrapper for relocated rendering-mode package.""" - -from isaaclab.rendering_mode.rendering_mode_presets import get_kit_rendering_preset - -__all__ = ["get_kit_rendering_preset"] diff --git a/source/isaaclab/isaaclab/renderer/rendering_quality_presets.py b/source/isaaclab/isaaclab/renderer/rendering_quality_presets.py deleted file mode 100644 index fe222f6492c..00000000000 --- a/source/isaaclab/isaaclab/renderer/rendering_quality_presets.py +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). -# All rights reserved. -# -# SPDX-License-Identifier: BSD-3-Clause - -"""Compatibility wrapper for relocated rendering-mode presets module.""" - -from isaaclab.rendering_mode.rendering_mode_presets import * # noqa: F401, F403 diff --git a/source/isaaclab/isaaclab/rendering_mode/__init__.py b/source/isaaclab/isaaclab/rendering_mode/__init__.py index da49b16f62a..8d833f476ea 100644 --- a/source/isaaclab/isaaclab/rendering_mode/__init__.py +++ b/source/isaaclab/isaaclab/rendering_mode/__init__.py @@ -7,5 +7,11 @@ from .rendering_mode_cfg import RenderingModeCfg from .rendering_mode_presets import get_kit_rendering_preset +from .rendering_mode_utils import CLI_RENDERING_MODE_PROFILE_PATH, resolve_effective_rendering_mode_name -__all__ = ["RenderingModeCfg", "get_kit_rendering_preset"] +__all__ = [ + "CLI_RENDERING_MODE_PROFILE_PATH", + "RenderingModeCfg", + "get_kit_rendering_preset", + "resolve_effective_rendering_mode_name", +] diff --git a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py index 142b6f446dc..ef313f19d41 100644 --- a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py +++ b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py @@ -24,8 +24,9 @@ class RenderingModeCfg: * ``apps/isaaclab.python.rendering.kit`` — simulation with the GUI enabled. * ``apps/isaaclab.python.headless.rendering.kit`` — headless simulation. - Non-``None`` fields here override those defaults for the active profile. Built-in preset names - (``performance``, ``balanced``, ``quality``) match the baselines in + Newton and other non-Kit visualizer settings belong on ``NewtonVisualizerCfg`` (or the matching cfg), not here. + Each non-``None`` ``kit_*`` field or :attr:`rendering_mode_preset` overrides Kit RTX defaults for that profile only. + The built-in names ``performance``, ``balanced``, and ``quality`` match the baselines in :mod:`isaaclab.rendering_mode.rendering_mode_presets`. Choosing a preset via :attr:`rendering_mode_preset` or the CLI flag ``--rendering_mode`` behaves like selecting that profile for the run. diff --git a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py index b6f8b289950..fbb1be39037 100644 --- a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py +++ b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py @@ -16,17 +16,13 @@ _logger = logging.getLogger(__name__) -# Log at most once if carb + heuristics cannot resolve CLI mode. +# Log at most once if carb cannot read the CLI profile leaf. _cli_rendering_mode_resolution_warned = False -_KNOWN_RENDERING_MODE_PRESETS = frozenset({"performance", "balanced", "quality"}) - -# Try leaf paths first: AppLauncher uses set_string; generic get() may return a dict subtree. -_CLI_MODE_STRING_PATHS = ( - "/isaaclab/rendering/rendering_mode", - "/isaaclab/rendering/rendering_mode/value", - "/isaaclab/rendering/rendering_mode/default", -) +# Leaf path for the CLI rendering-mode profile name (``performance`` / ``balanced`` / ``quality``, or empty). +# AppLauncher writes here with ``set_string`` only—never the parent ``.../rendering_mode`` path—so +# ``get_string`` / ``get_setting`` return a string instead of a dict subtree. +CLI_RENDERING_MODE_PROFILE_PATH = "/isaaclab/rendering/rendering_mode/profile" _KIT_FIELD_TO_CARB: dict[str, str] = { "kit_enable_translucency": "/rtx/translucency/enabled", @@ -43,59 +39,10 @@ } -def _coerce_carb_rendering_mode_value(raw: Any) -> str | None: - """Best-effort profile name from carb ``get()`` (often a ``dict`` subtree). - - Path is typically ``/isaaclab/rendering/rendering_mode``. - """ - - def collect_str_leaves(obj: Any, out: list[str], depth: int = 0) -> None: - if depth > 12: - return - if isinstance(obj, str): - s = obj.strip() - if s: - out.append(s) - return - if isinstance(obj, dict): - for v in obj.values(): - collect_str_leaves(v, out, depth + 1) - elif isinstance(obj, (list, tuple, set)): - for v in obj: - collect_str_leaves(v, out, depth + 1) - - if raw is None: - return None - if isinstance(raw, str): - out = raw.strip() - return out if out else None - if isinstance(raw, dict): - for key in ("value", "default", "profile", "name", "rendering_mode"): - v = raw.get(key) - if isinstance(v, str): - s = v.strip() - if s: - return s - if isinstance(v, dict): - nested = _coerce_carb_rendering_mode_value(v) - if nested: - return nested - strings: list[str] = [] - collect_str_leaves(raw, strings) - if not strings: - return None - for s in strings: - if s in _KNOWN_RENDERING_MODE_PRESETS: - return s - return strings[0] - - def _read_cli_rendering_mode_profile_name(get_setting: Any) -> str | None: """Read CLI rendering mode profile name (``performance`` / ``balanced`` / ``quality``). - ``AppLauncher`` stores the profile with ``set_string``; ``carb.settings.get()`` on the same path - may return a subtree ``dict``. Prefer ``get_string`` on the leaf path first, then - :func:`_coerce_carb_rendering_mode_value`. + Reads :data:`CLI_RENDERING_MODE_PROFILE_PATH` (a string leaf written by :class:`~isaaclab.app.AppLauncher`). """ global _cli_rendering_mode_resolution_warned @@ -104,49 +51,34 @@ def _read_cli_rendering_mode_profile_name(get_setting: Any) -> str | None: gs = carb.settings.get_settings() if gs is not None and hasattr(gs, "get_string"): - for path in _CLI_MODE_STRING_PATHS: - with contextlib.suppress(Exception): - s = gs.get_string(path) - if s is not None: - out = str(s).strip() - if out: - return out - - raw = get_setting("/isaaclab/rendering/rendering_mode") - coerced = _coerce_carb_rendering_mode_value(raw) - if coerced: - return coerced - - if raw is not None and not isinstance(raw, str): + with contextlib.suppress(Exception): + s = gs.get_string(CLI_RENDERING_MODE_PROFILE_PATH) + if s is not None: + out = str(s).strip() + if out: + return out + + raw = get_setting(CLI_RENDERING_MODE_PROFILE_PATH) + if isinstance(raw, str): + out = raw.strip() + return out if out else None + + if raw is not None: if not _cli_rendering_mode_resolution_warned: _cli_rendering_mode_resolution_warned = True _logger.warning( - "Could not read /isaaclab/rendering/rendering_mode as a profile name (got %s). " - "CLI rendering mode override may be ignored.", + "Could not read %s as a string profile name (got %s). CLI rendering mode override may be ignored.", + CLI_RENDERING_MODE_PROFILE_PATH, type(raw).__name__, ) return None -def _normalize_rendering_mode_profile_name(name: Any) -> str | None: - """Return a non-empty string profile name, or None if invalid.""" - if name is None: - return None - if isinstance(name, str): - out = name.strip() - return out if out else None - _logger.warning( - "rendering_mode must be a non-empty str, got %s; ignoring.", - type(name).__name__, - ) - return None - - -def _resolve_effective_rendering_mode_name(get_setting: Any, cfg: Any) -> str | None: +def resolve_effective_rendering_mode_name(get_setting: Any, cfg: Any) -> str | None: """CLI explicit flag wins; otherwise use ``cfg.rendering_mode``.""" if bool(get_setting("/isaaclab/rendering/rendering_mode/explicit")): return _read_cli_rendering_mode_profile_name(get_setting) - return _normalize_rendering_mode_profile_name(getattr(cfg, "rendering_mode", None)) + return getattr(cfg, "rendering_mode", None) def apply_kit_rendering_preset(set_setting: Any, preset_name: str) -> None: @@ -175,11 +107,6 @@ def apply_kit_rendering_mode_cfg(set_setting: Any, mode_cfg: RenderingModeCfg) - set_setting(carb_key, value) -def resolve_rendering_mode_name_for_renderer_cfg(get_setting: Any, renderer_cfg: Any) -> str | None: - """Resolve effective rendering mode profile name for a camera/renderer cfg.""" - return _resolve_effective_rendering_mode_name(get_setting, renderer_cfg) - - def apply_mode_profile_to_renderer_cfg( get_setting: Any, set_setting: Any, @@ -191,18 +118,13 @@ def apply_mode_profile_to_renderer_cfg( rtype = getattr(renderer_cfg, "renderer_type", None) if rtype not in ("default", "isaac_rtx", "rtx"): return - mode_name = resolve_rendering_mode_name_for_renderer_cfg(get_setting, renderer_cfg) + mode_name = resolve_effective_rendering_mode_name(get_setting, renderer_cfg) mode_cfg = resolve_rendering_mode_cfg(mode_name, mode_cfgs, logger) if mode_cfg is None: return apply_kit_rendering_mode_cfg(set_setting, mode_cfg) -def resolve_rendering_mode_name_for_visualizer_cfg(get_setting: Any, visualizer_cfg: Any) -> str | None: - """Resolve effective rendering mode profile name for a visualizer cfg.""" - return _resolve_effective_rendering_mode_name(get_setting, visualizer_cfg) - - def resolve_rendering_mode_cfg( mode_name: str | None, mode_cfgs: dict[str, RenderingModeCfg], logger: Any ) -> RenderingModeCfg | None: @@ -231,37 +153,32 @@ def apply_mode_profile_to_visualizer_cfg( visualizer_cfg: Any, mode_cfgs: dict[str, RenderingModeCfg], logger: Any, + *, + cache: dict[int, str | None] | None = None, + cache_key: int | None = None, ) -> None: - """Resolve and apply rendering mode profile to a Kit visualizer config (RTX / carb settings).""" + """Resolve and apply rendering mode profile for a Kit visualizer (RTX / carb settings). + + Pass ``cache`` and ``cache_key`` (typically ``id(viz)``) when updating an active visualizer each + frame so we skip redundant carb work when the effective profile name is unchanged—including + when the name is missing from ``mode_cfgs`` (avoids repeated warnings). + """ + if (cache is None) != (cache_key is None): + raise ValueError("apply_mode_profile_to_visualizer_cfg: pass both `cache` and `cache_key`, or neither.") if getattr(visualizer_cfg, "visualizer_type", None) != "kit": return - mode_name = resolve_rendering_mode_name_for_visualizer_cfg(get_setting, visualizer_cfg) - mode_cfg = resolve_rendering_mode_cfg(mode_name, mode_cfgs, logger) - if mode_cfg is None: - return - apply_kit_rendering_mode_cfg(set_setting, mode_cfg) - + mode_name = resolve_effective_rendering_mode_name(get_setting, visualizer_cfg) -def apply_runtime_mode_profile_to_visualizer( - get_setting: Any, - set_setting: Any, - viz: Any, - visualizer_mode_keys: dict[int, str | None], - mode_cfgs: dict[str, RenderingModeCfg], - logger: Any, -) -> None: - """Resolve and apply runtime rendering mode profile to an active Kit visualizer.""" - if getattr(viz.cfg, "visualizer_type", None) != "kit": - return - mode_name = resolve_rendering_mode_name_for_visualizer_cfg(get_setting, viz.cfg) - viz_id = id(viz) - if visualizer_mode_keys.get(viz_id) == mode_name: - return + if cache is not None and cache_key is not None: + if cache.get(cache_key) == mode_name: + return mode_cfg = resolve_rendering_mode_cfg(mode_name, mode_cfgs, logger) if mode_cfg is None: - visualizer_mode_keys[viz_id] = mode_name + if cache is not None and cache_key is not None: + cache[cache_key] = mode_name return apply_kit_rendering_mode_cfg(set_setting, mode_cfg) - visualizer_mode_keys[viz_id] = mode_name + if cache is not None and cache_key is not None: + cache[cache_key] = mode_name diff --git a/source/isaaclab/isaaclab/sim/simulation_context.py b/source/isaaclab/isaaclab/sim/simulation_context.py index 33f14a82486..ed745c489d1 100644 --- a/source/isaaclab/isaaclab/sim/simulation_context.py +++ b/source/isaaclab/isaaclab/sim/simulation_context.py @@ -25,10 +25,7 @@ VisualizerPrebuiltArtifacts, resolve_scene_data_requirements, ) -from isaaclab.rendering_mode.rendering_mode_utils import ( - apply_mode_profile_to_visualizer_cfg, - apply_runtime_mode_profile_to_visualizer, -) +from isaaclab.rendering_mode.rendering_mode_utils import apply_mode_profile_to_visualizer_cfg from isaaclab.sim.utils import create_new_stage from isaaclab.utils.version import has_kit from isaaclab.visualizers.base_visualizer import BaseVisualizer @@ -207,13 +204,14 @@ def _apply_mode_profile_to_visualizer_cfg(self, visualizer_cfg: Any) -> None: def _apply_runtime_mode_profile_to_visualizer(self, viz: BaseVisualizer) -> None: """Apply rendering-mode profile updates to an active Kit visualizer instance.""" mode_cfgs = self.cfg.rendering_mode_cfgs - apply_runtime_mode_profile_to_visualizer( + apply_mode_profile_to_visualizer_cfg( self.get_setting, self.set_setting, - viz, - self._visualizer_mode_keys, + viz.cfg, mode_cfgs, logger, + cache=self._visualizer_mode_keys, + cache_key=id(viz), ) def _init_usd_physics_scene(self) -> None: diff --git a/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py b/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py index 7729eb3b1b8..d344f325ebc 100644 --- a/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py +++ b/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py @@ -63,10 +63,9 @@ class VisualizerCfg: """ rendering_mode: str | None = None - """Key into :attr:`~isaaclab.sim.SimulationCfg.rendering_mode_cfgs` (e.g. ``performance``, ``balanced``). + """Name of the rendering mode profile for selecting rendering settings. - Kit visualizers apply this profile; other backends ignore it. ``None`` skips a named profile. - An explicit CLI ``--rendering_mode`` overrides this for the run. + Set to None by default, which uses the native rendering settings of the workflow. """ def get_visualizer_type(self) -> str | None: diff --git a/source/isaaclab/test/rendering/test_rendering_mode.py b/source/isaaclab/test/rendering/test_rendering_mode.py index 75b9941c727..1814fd7a17d 100644 --- a/source/isaaclab/test/rendering/test_rendering_mode.py +++ b/source/isaaclab/test/rendering/test_rendering_mode.py @@ -3,16 +3,6 @@ # # SPDX-License-Identifier: BSD-3-Clause -"""Rendering mode: offline resolution checks and Isaac Sim integration tests. - -**Import order:** Do not import Isaac Sim / USD / ``pxr`` at module scope. Pytest loads this file -before the ``simulation_app`` fixture runs :class:`~isaaclab.app.AppLauncher`; loading ``pxr`` from -conda before Kit starts causes USD extension failures. Integration tests import sim APIs *inside* -the test body (after the fixture has launched SimulationApp). - -Offline tests only use lightweight imports below. -""" - import logging import pytest @@ -21,7 +11,7 @@ from isaaclab.rendering_mode import RenderingModeCfg from isaaclab.rendering_mode.rendering_mode_utils import ( apply_mode_profile_to_renderer_cfg, - resolve_rendering_mode_name_for_renderer_cfg, + resolve_effective_rendering_mode_name, ) @@ -44,7 +34,7 @@ class _FakeSettings: def __init__(self, explicit: bool, mode): self._data: dict[str, object] = { "/isaaclab/rendering/rendering_mode/explicit": explicit, - "/isaaclab/rendering/rendering_mode": mode, + "/isaaclab/rendering/rendering_mode/profile": mode, } def get(self, key: str): @@ -55,14 +45,7 @@ def test_cli_explicit_rendering_mode_overrides_renderer_cfg(): """CLI explicit flag should win over ``RendererCfg.rendering_mode`` (Kit RTX path).""" r_cfg = RendererCfg(renderer_type="isaac_rtx", rendering_mode="quality") settings = _FakeSettings(explicit=True, mode="performance") - assert resolve_rendering_mode_name_for_renderer_cfg(settings.get, r_cfg) == "performance" - - -def test_cli_explicit_coerces_carb_subtree_to_profile_name(): - """Some Kit builds return a dict subtree from ``get()``; profile name must still resolve.""" - r_cfg = RendererCfg(renderer_type="isaac_rtx", rendering_mode="performance") - settings = _FakeSettings(explicit=True, mode={"outer": {"inner": "balanced"}}) - assert resolve_rendering_mode_name_for_renderer_cfg(settings.get, r_cfg) == "balanced" + assert resolve_effective_rendering_mode_name(settings.get, r_cfg) == "performance" def test_apply_rtx_profile_skips_non_rtx_renderer_backend(): diff --git a/source/isaaclab_physx/isaaclab_physx/scene_data_providers/physx_scene_data_provider.py b/source/isaaclab_physx/isaaclab_physx/scene_data_providers/physx_scene_data_provider.py index b2323354c06..6750ab5d998 100644 --- a/source/isaaclab_physx/isaaclab_physx/scene_data_providers/physx_scene_data_provider.py +++ b/source/isaaclab_physx/isaaclab_physx/scene_data_providers/physx_scene_data_provider.py @@ -370,57 +370,6 @@ def _build_filtered_newton_model(self, env_ids: list[int]) -> None: self._filtered_newton_state = None self._filtered_body_indices = [] - def _extract_model_path_list(self, model: Any, attr_candidates: list[str]) -> list[str]: - """Extract a list of prim paths from the first supported model attribute.""" - for attr_name in attr_candidates: - if not hasattr(model, attr_name): - continue - raw = getattr(model, attr_name) - if raw is None: - continue - - # Dict-like containers may map index->path or path->index. - if isinstance(raw, dict): - keys = [k for k in raw.keys() if isinstance(k, str) and k.startswith("/")] - vals = [v for v in raw.values() if isinstance(v, str) and v.startswith("/")] - paths = keys if keys else vals - if paths: - return list(paths) - continue - - try: - values = list(raw) - except Exception: - continue - - paths = [v for v in values if isinstance(v, str) and v.startswith("/")] - if paths: - return paths - - return [] - - def _discover_physics_paths_from_stage(self) -> tuple[list[str], list[str]]: - """Fallback discovery of rigid-body and articulation paths from USD stage.""" - if self._stage is None: - return [], [] - - rigid_paths: list[str] = [] - articulation_paths: list[str] = [] - for prim in self._stage.Traverse(): - path = prim.GetPath().pathString - if prim.HasAPI(UsdPhysics.RigidBodyAPI): - rigid_paths.append(path) - if prim.HasAPI(UsdPhysics.ArticulationRootAPI): - articulation_paths.append(path) - - if rigid_paths or articulation_paths: - logger.warning( - "[PhysxSceneDataProvider] Falling back to USD-discovered physics paths (rigid=%d, articulations=%d).", - len(rigid_paths), - len(articulation_paths), - ) - return rigid_paths, articulation_paths - def _build_env_id_to_body_indices(self) -> None: """Build mapping env_id -> list of body indices from rigid_body_paths.""" self._env_id_to_body_indices = {} diff --git a/source/isaaclab_visualizers/isaaclab_visualizers/viser/viser_visualizer.py b/source/isaaclab_visualizers/isaaclab_visualizers/viser/viser_visualizer.py index 550ef497e24..c20bfcd85a9 100644 --- a/source/isaaclab_visualizers/isaaclab_visualizers/viser/viser_visualizer.py +++ b/source/isaaclab_visualizers/isaaclab_visualizers/viser/viser_visualizer.py @@ -11,64 +11,10 @@ import io import logging import os -import sys import webbrowser from pathlib import Path from typing import TYPE_CHECKING, Any - -def _prioritize_site_packages_over_kit_prebundle() -> None: - """Put conda/venv site-packages before Isaac Sim ``pip_prebundle`` on ``sys.path``. - - Kit ships an older ``websockets`` in ``omni.kit.pip_archive``; ``viser`` needs a modern API - (e.g. ``SERVER`` in ``websockets.http11``). Without this, imports can mix prebundle and PyPI - submodules and raise ``ImportError`` at runtime. - """ - try: - import site - except Exception: - return - - paths: list[str] = [] - if hasattr(site, "getusersitepackages"): - u = site.getusersitepackages() - if u: - paths.append(u) - with contextlib.suppress(Exception): - paths.extend(site.getsitepackages()) - - seen: set[str] = set() - ordered: list[str] = [] - for p in paths: - if p and p not in seen and p in sys.path: - seen.add(p) - ordered.append(p) - - for p in ordered: - try: - sys.path.remove(p) - except ValueError: - continue - for p in reversed(ordered): - sys.path.insert(0, p) - - -def _drop_websockets_if_from_prebundle() -> None: - """If ``websockets`` was already loaded from Kit prebundle, drop it so it reloads from site-packages.""" - mod = sys.modules.get("websockets") - if mod is None: - return - f = getattr(mod, "__file__", "") or "" - if "pip_prebundle" not in f: - return - for k in list(sys.modules): - if k == "websockets" or k.startswith("websockets."): - del sys.modules[k] - - -_prioritize_site_packages_over_kit_prebundle() -_drop_websockets_if_from_prebundle() - from newton.viewer import ViewerViser from isaaclab.visualizers.base_visualizer import BaseVisualizer From 4590a6303557324b1734f02fefabc4a98fe1d986 Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Thu, 9 Apr 2026 19:03:51 +0000 Subject: [PATCH 28/34] preppin --- docs/source/how-to/configure_rendering.rst | 52 ++++++++++++------- .../tutorials/00_sim/set_rendering_mode.py | 14 +++-- .../rendering_mode/rendering_mode_cfg.py | 41 +++++++++------ .../rendering_mode/rendering_mode_utils.py | 6 +-- .../isaaclab_newton/visualizers/__init__.py | 13 ----- .../visualizers/newton_visualizer.py | 6 --- .../visualizers/newton_visualizer_cfg.py | 6 --- .../visualizers/rerun_visualizer.py | 6 --- .../visualizers/rerun_visualizer_cfg.py | 6 --- .../renderers/rtx_renderer_cfg.py | 20 ------- .../isaaclab_physx/visualizers/__init__.py | 11 ---- .../visualizers/kit_visualizer.py | 6 --- .../visualizers/kit_visualizer_cfg.py | 6 --- 13 files changed, 73 insertions(+), 120 deletions(-) delete mode 100644 source/isaaclab_newton/isaaclab_newton/visualizers/__init__.py delete mode 100644 source/isaaclab_newton/isaaclab_newton/visualizers/newton_visualizer.py delete mode 100644 source/isaaclab_newton/isaaclab_newton/visualizers/newton_visualizer_cfg.py delete mode 100644 source/isaaclab_newton/isaaclab_newton/visualizers/rerun_visualizer.py delete mode 100644 source/isaaclab_newton/isaaclab_newton/visualizers/rerun_visualizer_cfg.py delete mode 100644 source/isaaclab_physx/isaaclab_physx/renderers/rtx_renderer_cfg.py delete mode 100644 source/isaaclab_physx/isaaclab_physx/visualizers/__init__.py delete mode 100644 source/isaaclab_physx/isaaclab_physx/visualizers/kit_visualizer.py delete mode 100644 source/isaaclab_physx/isaaclab_physx/visualizers/kit_visualizer_cfg.py diff --git a/docs/source/how-to/configure_rendering.rst b/docs/source/how-to/configure_rendering.rst index 80a214852d3..69628b601f1 100644 --- a/docs/source/how-to/configure_rendering.rst +++ b/docs/source/how-to/configure_rendering.rst @@ -33,7 +33,7 @@ through **renderer configs**. 2. **Visualizer Configs.** From a Visualizer Config, set the ``rendering_mode`` field to a profile name defined by the the RenderingMode Configs. There are 3 presets: ``performance``, ``balanced``, and ``quality``. Users can also define custom profiles by adding a named entry to :attr:`~sim.SimulationCfg.rendering_mode_cfgs` (see **Overriding Rendering Mode Settings** - below). Visualizers are set to performance mode by default. + below). Rendering Modes of Visualizers are set to performance by default. .. code-block:: python # Set KitVisualizer to balanced rendering mode @@ -46,7 +46,7 @@ through **renderer configs**. ) 3. **Renderer Configs.** Similar to Visualizer Configs, from a Renderer Config, set the ``rendering_mode`` field to a profile - name defined by the RenderingMode Configs. There are 3 presets: ``performance``, ``balanced``, and ``quality``. + name defined by the RenderingMode Configs. Rendering Modes of Renderers are set to None by default, which uses the native rendering settings of the workflow. .. code-block:: python # Set RTX Renderer to quality rendering mode. @@ -142,6 +142,12 @@ specific settings of presets via ``kit_*`` fields (option 1) or by defining and | | light upper/lower hemisphere handling; see Omniverse RTX docs for | | | semantics of each value). | +------------------------------------+-------------------------------------------------------------------------+ + | kit_disocclusion_scale | Float. Aggressiveness of disocclusion handling for tiled rendering | + | | (maps to ``/rtx/aovConverter/disocclusionScale``). | + +------------------------------------+-------------------------------------------------------------------------+ + | kit_nre_compositing_renderer_hints | Int. NRE compositing hint (Isaac Lab apps use ``3``). Maps to | + | | ``/omni/rtx/nre/compositing/rendererHints``. | + +------------------------------------+-------------------------------------------------------------------------+ 2. If you need a custom profile, define your own named entry in @@ -181,21 +187,15 @@ For renders at lower resolutions, we advise setting of performance. -If you observe visual artifacts such as ghosting or disocclusion issues when using tiled rendering, you can try -adjusting the ``disocclusionScale`` parameter. This setting controls how aggressively the renderer handles -areas that become newly visible between frames: - -.. note:: - - Low-level carb rendering settings (for example, - ``/rtx/aovConverter/disocclusionScale``) are not currently exposed through - :class:`~isaaclab.rendering_mode.RenderingModeCfg`. +If you observe visual artifacts such as ghosting or disocclusion issues when using tiled rendering, you can set +:attr:`~isaaclab.rendering_mode.RenderingModeCfg.kit_disocclusion_scale` on your profile. It maps to carb +``/rtx/aovConverter/disocclusionScale`` and controls how aggressively the renderer handles areas that become +newly visible between frames. .. note:: - This parameter is not commonly exposed as it may have side effects in certain scenarios. - Only use it as a last resort if other quality settings do not resolve the visual artifacts. - The value can be adjusted to a very high value to reduce disocclusion artifacts. + This knob can have side effects in some scenarios. Prefer tuning other quality settings first; only raise + ``kit_disocclusion_scale`` (often to a very high value) if artifacts persist. Rendering UsdVol 3D Gaussian Scenes in Multiple Environments @@ -203,12 +203,28 @@ Rendering UsdVol 3D Gaussian Scenes in Multiple Environments When using UsdVol volumes with 3D Gaussian particles (e.g. exported from `3DGRUT `_) -in **multiple environments**, you must set the following so the renderer uses the correct compositing path: +in **multiple environments**, you must set ``kit_nre_compositing_renderer_hints=3`` (carb +``/omni/rtx/nre/compositing/rendererHints``) so the renderer uses the correct compositing path—the same value +Isaac Lab sets in its rendering experience files. -.. note:: +.. code-block:: python + + from isaaclab.rendering_mode import RenderingModeCfg + from isaaclab_physx.visualizers import KitVisualizerCfg + + sim_cfg = sim_utils.SimulationCfg( + rendering_mode_cfgs={ + "gaussian_multi_env": RenderingModeCfg( + kit_nre_compositing_renderer_hints=3, + ), + }, + visualizer_cfgs=[KitVisualizerCfg(rendering_mode="gaussian_multi_env")], + ) + + # RTX cameras: use the same profile name on ``renderer_cfg.rendering_mode``. - This setting is not currently exposed through - :class:`~isaaclab.rendering_mode.RenderingModeCfg`. +If tiled rendering shows ghosting or disocclusion artifacts with this content, you can add +:attr:`~isaaclab.rendering_mode.RenderingModeCfg.kit_disocclusion_scale` on the same profile (e.g. ``10000.0``). .. warning:: diff --git a/scripts/tutorials/00_sim/set_rendering_mode.py b/scripts/tutorials/00_sim/set_rendering_mode.py index 73c96b032db..e820e3ce1d5 100644 --- a/scripts/tutorials/00_sim/set_rendering_mode.py +++ b/scripts/tutorials/00_sim/set_rendering_mode.py @@ -48,15 +48,23 @@ def main(): rendering_mode = "performance" # RTX tuning uses :class:`RenderingModeCfg` profiles on ``SimulationCfg.rendering_mode_cfgs`` - # (not raw carb paths). Here we extend the ``performance`` preset with reflections for this scene. + # (not raw carb paths). Each built-in name starts from its preset, then applies optional ``kit_*`` overrides. sim_cfg = sim_utils.SimulationCfg( rendering_mode_cfgs={ "performance": RenderingModeCfg( rendering_mode_preset="performance", kit_enable_reflections=True, ), - "balanced": RenderingModeCfg(rendering_mode_preset="balanced"), - "quality": RenderingModeCfg(rendering_mode_preset="quality"), + "balanced": RenderingModeCfg( + rendering_mode_preset="balanced", + kit_enable_reflections=True, + kit_dlss_mode=1, + ), + "quality": RenderingModeCfg( + rendering_mode_preset="quality", + kit_antialiasing_mode="DLAA", + kit_disocclusion_scale=10_000.0, + ), }, visualizer_cfgs=[ KitVisualizerCfg(rendering_mode=rendering_mode), diff --git a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py index ef313f19d41..788a89ff844 100644 --- a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py +++ b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py @@ -12,26 +12,21 @@ @configclass class RenderingModeCfg: - """Omniverse RTX rendering controls for Kit profiles (viewport and Kit-style camera renderers). + """RTX/carb settings for `Omniverse RTX`_ (Kit viewport + Kit RTX camera renderers: ``default`` / ``isaac_rtx`` / ``rtx``). - These parameters configure the `Omniverse RTX Renderer`_. When you attach a profile to - :attr:`~isaaclab.sim.SimulationCfg.rendering_mode_cfgs` and reference it from a renderer or - :class:`~isaaclab_physx.visualizers.kit_visualizer_cfg.KitVisualizerCfg`, Isaac Lab applies the - corresponding ``kit_*`` fields (and optional :attr:`rendering_mode_preset`) via carb settings. + Put named profiles in :attr:`~isaaclab.sim.SimulationCfg.rendering_mode_cfgs`, then set the same name on + ``KitVisualizerCfg.rendering_mode`` or ``CameraCfg.renderer_cfg.rendering_mode`` (non-Kit renderers ignore it). - Default Kit/RTX behavior for Isaac Lab still comes from the experience files: + **Order:** optional :attr:`rendering_mode_preset` (``performance`` / ``balanced`` / ``quality``) loads the + matching baseline from :mod:`isaaclab.rendering_mode.rendering_mode_presets`—the same three choices as CLI + ``--rendering_mode``. Each non-``None`` ``kit_*`` field then overrides specific carb paths on top of that + baseline. - * ``apps/isaaclab.python.rendering.kit`` — simulation with the GUI enabled. - * ``apps/isaaclab.python.headless.rendering.kit`` — headless simulation. + Baselines before this config are defined by the app experience (e.g. ``apps/isaaclab.python.rendering.kit``, + ``apps/isaaclab.python.headless.rendering.kit``). Newton / non-Kit viewer options belong on ``NewtonVisualizerCfg``, + not here. - Newton and other non-Kit visualizer settings belong on ``NewtonVisualizerCfg`` (or the matching cfg), not here. - Each non-``None`` ``kit_*`` field or :attr:`rendering_mode_preset` overrides Kit RTX defaults for that profile only. - The built-in names ``performance``, ``balanced``, and ``quality`` match the baselines in - :mod:`isaaclab.rendering_mode.rendering_mode_presets`. Choosing a preset via - :attr:`rendering_mode_preset` or the CLI flag ``--rendering_mode`` behaves like selecting that - profile for the run. - - .. _Omniverse RTX Renderer: https://docs.omniverse.nvidia.com/materials-and-rendering/latest/rtx-renderer.html + .. _Omniverse RTX: https://docs.omniverse.nvidia.com/materials-and-rendering/latest/rtx-renderer.html """ rendering_mode_preset: Literal["performance", "balanced", "quality"] | None = None @@ -143,4 +138,18 @@ class RenderingModeCfg: .. _dome light sampling: https://docs.omniverse.nvidia.com/materials-and-rendering/latest/rtx-renderer_common.html#dome-light """ + kit_disocclusion_scale: float | None = None + """Scales disocclusion handling for tiled / per-camera rendering (ghosting, newly exposed regions). + + Higher values can reduce disocclusion artifacts at the cost of stability or side effects in some scenes. + Carb path: ``/rtx/aovConverter/disocclusionScale``. + """ + + kit_nre_compositing_renderer_hints: int | None = None + """NRE compositing renderer hints (Isaac Lab rendering experiences use ``3``). + + Required for correct compositing when using UsdVol 3D Gaussian content across multiple environments. + Carb path: ``/omni/rtx/nre/compositing/rendererHints`` (see also ``omni.rtx.nre.compositing.rendererHints`` in app ``.kit`` files). + """ + # TODO: Optional passthrough dict for arbitrary carb keys (cf. legacy RenderCfg.carb_settings). diff --git a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py index fbb1be39037..22e598eba78 100644 --- a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py +++ b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py @@ -19,9 +19,7 @@ # Log at most once if carb cannot read the CLI profile leaf. _cli_rendering_mode_resolution_warned = False -# Leaf path for the CLI rendering-mode profile name (``performance`` / ``balanced`` / ``quality``, or empty). -# AppLauncher writes here with ``set_string`` only—never the parent ``.../rendering_mode`` path—so -# ``get_string`` / ``get_setting`` return a string instead of a dict subtree. +# CLI profile name string; AppLauncher uses this leaf path (``set_string``). CLI_RENDERING_MODE_PROFILE_PATH = "/isaaclab/rendering/rendering_mode/profile" _KIT_FIELD_TO_CARB: dict[str, str] = { @@ -36,6 +34,8 @@ "kit_enable_shadows": "/rtx/shadows/enabled", "kit_enable_ambient_occlusion": "/rtx/ambientOcclusion/enabled", "kit_dome_light_upper_lower_strategy": "/rtx/domeLight/upperLowerStrategy", + "kit_disocclusion_scale": "/rtx/aovConverter/disocclusionScale", + "kit_nre_compositing_renderer_hints": "/omni/rtx/nre/compositing/rendererHints", } diff --git a/source/isaaclab_newton/isaaclab_newton/visualizers/__init__.py b/source/isaaclab_newton/isaaclab_newton/visualizers/__init__.py deleted file mode 100644 index acf90d731cf..00000000000 --- a/source/isaaclab_newton/isaaclab_newton/visualizers/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). -# All rights reserved. -# -# SPDX-License-Identifier: BSD-3-Clause - -"""Newton-backed visualizer implementations.""" - -from .newton_visualizer import NewtonVisualizer -from .newton_visualizer_cfg import NewtonVisualizerCfg -from .rerun_visualizer import RerunVisualizer -from .rerun_visualizer_cfg import RerunVisualizerCfg - -__all__ = ["NewtonVisualizer", "NewtonVisualizerCfg", "RerunVisualizer", "RerunVisualizerCfg"] diff --git a/source/isaaclab_newton/isaaclab_newton/visualizers/newton_visualizer.py b/source/isaaclab_newton/isaaclab_newton/visualizers/newton_visualizer.py deleted file mode 100644 index 74a5cbf17b3..00000000000 --- a/source/isaaclab_newton/isaaclab_newton/visualizers/newton_visualizer.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). -# All rights reserved. -# -# SPDX-License-Identifier: BSD-3-Clause - -from isaaclab.visualizers.newton_visualizer import * # noqa: F401, F403 diff --git a/source/isaaclab_newton/isaaclab_newton/visualizers/newton_visualizer_cfg.py b/source/isaaclab_newton/isaaclab_newton/visualizers/newton_visualizer_cfg.py deleted file mode 100644 index 4679020d629..00000000000 --- a/source/isaaclab_newton/isaaclab_newton/visualizers/newton_visualizer_cfg.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). -# All rights reserved. -# -# SPDX-License-Identifier: BSD-3-Clause - -from isaaclab.visualizers.newton_visualizer_cfg import * # noqa: F401, F403 diff --git a/source/isaaclab_newton/isaaclab_newton/visualizers/rerun_visualizer.py b/source/isaaclab_newton/isaaclab_newton/visualizers/rerun_visualizer.py deleted file mode 100644 index ff32ae3b1ca..00000000000 --- a/source/isaaclab_newton/isaaclab_newton/visualizers/rerun_visualizer.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). -# All rights reserved. -# -# SPDX-License-Identifier: BSD-3-Clause - -from isaaclab.visualizers.rerun_visualizer import * # noqa: F401, F403 diff --git a/source/isaaclab_newton/isaaclab_newton/visualizers/rerun_visualizer_cfg.py b/source/isaaclab_newton/isaaclab_newton/visualizers/rerun_visualizer_cfg.py deleted file mode 100644 index 31245b4e940..00000000000 --- a/source/isaaclab_newton/isaaclab_newton/visualizers/rerun_visualizer_cfg.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). -# All rights reserved. -# -# SPDX-License-Identifier: BSD-3-Clause - -from isaaclab.visualizers.rerun_visualizer_cfg import * # noqa: F401, F403 diff --git a/source/isaaclab_physx/isaaclab_physx/renderers/rtx_renderer_cfg.py b/source/isaaclab_physx/isaaclab_physx/renderers/rtx_renderer_cfg.py deleted file mode 100644 index 3b7324c001f..00000000000 --- a/source/isaaclab_physx/isaaclab_physx/renderers/rtx_renderer_cfg.py +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). -# All rights reserved. -# -# SPDX-License-Identifier: BSD-3-Clause - -"""Stub config for future RTX renderer integration.""" - -from isaaclab.renderers import RendererCfg -from isaaclab.utils import configclass - - -@configclass -class RTXRendererCfg(RendererCfg): - """Stub config for future RTX renderer integration. - - TODO: Implement renderer lifecycle, sensor/render-product routing, and - backend-specific settings application. - """ - - renderer_type: str = "rtx" diff --git a/source/isaaclab_physx/isaaclab_physx/visualizers/__init__.py b/source/isaaclab_physx/isaaclab_physx/visualizers/__init__.py deleted file mode 100644 index c831ff4bf28..00000000000 --- a/source/isaaclab_physx/isaaclab_physx/visualizers/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). -# All rights reserved. -# -# SPDX-License-Identifier: BSD-3-Clause - -"""PhysX-backed visualizer implementations.""" - -from .kit_visualizer import KitVisualizer -from .kit_visualizer_cfg import KitVisualizerCfg - -__all__ = ["KitVisualizer", "KitVisualizerCfg"] diff --git a/source/isaaclab_physx/isaaclab_physx/visualizers/kit_visualizer.py b/source/isaaclab_physx/isaaclab_physx/visualizers/kit_visualizer.py deleted file mode 100644 index 150cf030ce6..00000000000 --- a/source/isaaclab_physx/isaaclab_physx/visualizers/kit_visualizer.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). -# All rights reserved. -# -# SPDX-License-Identifier: BSD-3-Clause - -from isaaclab_visualizers.kit.kit_visualizer import * # noqa: F401, F403 diff --git a/source/isaaclab_physx/isaaclab_physx/visualizers/kit_visualizer_cfg.py b/source/isaaclab_physx/isaaclab_physx/visualizers/kit_visualizer_cfg.py deleted file mode 100644 index 35b1622287f..00000000000 --- a/source/isaaclab_physx/isaaclab_physx/visualizers/kit_visualizer_cfg.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). -# All rights reserved. -# -# SPDX-License-Identifier: BSD-3-Clause - -from isaaclab_visualizers.kit.kit_visualizer_cfg import * # noqa: F401, F403 From 49e8a19a4b7851ac66dd1b5ac992673c1f1c23c0 Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Thu, 9 Apr 2026 19:08:48 +0000 Subject: [PATCH 29/34] phrasin --- source/isaaclab/isaaclab/physics/base_scene_data_provider.py | 2 +- source/isaaclab/isaaclab/sim/simulation_cfg.py | 2 +- source/isaaclab/isaaclab/sim/simulation_context.py | 2 +- .../scene_data_providers/newton_scene_data_provider.py | 4 ++-- .../scene_data_providers/physx_scene_data_provider.py | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/source/isaaclab/isaaclab/physics/base_scene_data_provider.py b/source/isaaclab/isaaclab/physics/base_scene_data_provider.py index d03a3322863..e5b709da0ce 100644 --- a/source/isaaclab/isaaclab/physics/base_scene_data_provider.py +++ b/source/isaaclab/isaaclab/physics/base_scene_data_provider.py @@ -3,7 +3,7 @@ # # SPDX-License-Identifier: BSD-3-Clause -"""Scene data provider interface for renderers and visualizers.""" +"""Scene data provider interface for visualizers and renderers.""" from __future__ import annotations diff --git a/source/isaaclab/isaaclab/sim/simulation_cfg.py b/source/isaaclab/isaaclab/sim/simulation_cfg.py index a05fd16c2e8..82c762372ee 100644 --- a/source/isaaclab/isaaclab/sim/simulation_cfg.py +++ b/source/isaaclab/isaaclab/sim/simulation_cfg.py @@ -97,7 +97,7 @@ class SimulationCfg: "balanced": RenderingModeCfg(rendering_mode_preset="balanced"), "quality": RenderingModeCfg(rendering_mode_preset="quality"), } - """Named rendering mode profiles available to renderers and visualizers.""" + """Named rendering mode profiles available to visualizers and renderers.""" create_stage_in_memory: bool = False """If stage is first created in memory. Default is False. diff --git a/source/isaaclab/isaaclab/sim/simulation_context.py b/source/isaaclab/isaaclab/sim/simulation_context.py index ed745c489d1..4034e759395 100644 --- a/source/isaaclab/isaaclab/sim/simulation_context.py +++ b/source/isaaclab/isaaclab/sim/simulation_context.py @@ -524,7 +524,7 @@ def initialize_scene_data_provider(self) -> BaseSceneDataProvider: return self._scene_data_provider def get_scene_data_requirements(self) -> SceneDataRequirement: - """Return scene-data requirements resolved from renderers/visualizers.""" + """Return scene-data requirements resolved from visualizers/renderers.""" return self._scene_data_requirements def update_scene_data_requirements(self, requirements: SceneDataRequirement) -> None: diff --git a/source/isaaclab_newton/isaaclab_newton/scene_data_providers/newton_scene_data_provider.py b/source/isaaclab_newton/isaaclab_newton/scene_data_providers/newton_scene_data_provider.py index 0ea94fe4fa3..9b9ed5cfc6e 100644 --- a/source/isaaclab_newton/isaaclab_newton/scene_data_providers/newton_scene_data_provider.py +++ b/source/isaaclab_newton/isaaclab_newton/scene_data_providers/newton_scene_data_provider.py @@ -24,7 +24,7 @@ class NewtonSceneDataProvider(BaseSceneDataProvider): """Scene data provider for Newton physics backend. - Provides access to Newton model, state, and USD stage for renderers and visualizers. + Provides access to Newton model, state, and USD stage for visualizers and renderers. Unlike PhysxSceneDataProvider which must build its own Newton model from USD and sync PhysX transforms into it, this provider delegates directly to NewtonManager since the Newton backend already owns the authoritative model and state. @@ -43,7 +43,7 @@ def __init__(self, stage, simulation_context) -> None: self._num_envs: int | None = None self._warned_once: set[str] = set() - # Determine if usd stage sync is required for selected renderers and visualizers + # Determine if usd stage sync is required for selected visualizers and renderers requirements = self._simulation_context.get_scene_data_requirements() self._needs_usd_sync = bool(requirements.requires_usd_stage) diff --git a/source/isaaclab_physx/isaaclab_physx/scene_data_providers/physx_scene_data_provider.py b/source/isaaclab_physx/isaaclab_physx/scene_data_providers/physx_scene_data_provider.py index 6750ab5d998..970b404c47f 100644 --- a/source/isaaclab_physx/isaaclab_physx/scene_data_providers/physx_scene_data_provider.py +++ b/source/isaaclab_physx/isaaclab_physx/scene_data_providers/physx_scene_data_provider.py @@ -113,7 +113,7 @@ def __init__(self, stage, simulation_context) -> None: # Single source of truth: discovered from stage and cached once available. self._num_envs: int | None = None - # Determine if newton model sync is required for selected renderers and visualizers + # Determine if newton model sync is required for selected visualizers and renderers requirements = self._simulation_context.get_scene_data_requirements() self._needs_newton_sync = bool(requirements.requires_newton_model) @@ -916,7 +916,7 @@ def get_camera_transforms(self) -> dict[str, Any] | None: return {"order": shared_paths, "positions": positions, "orientations": orientations, "num_envs": num_envs} def get_metadata(self) -> dict[str, Any]: - """Return provider metadata for renderers and visualizers. + """Return provider metadata for visualizers and renderers. Returns: Metadata dictionary with backend and environment count. From 539ec39aaef3e9d27848a6032095d80533446e45 Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Thu, 9 Apr 2026 19:45:57 +0000 Subject: [PATCH 30/34] preppin --- .../rendering_mode/rendering_mode_utils.py | 22 +------------------ .../isaaclab/sim/simulation_context.py | 17 -------------- 2 files changed, 1 insertion(+), 38 deletions(-) diff --git a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py index 22e598eba78..af60200d8ff 100644 --- a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py +++ b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py @@ -153,32 +153,12 @@ def apply_mode_profile_to_visualizer_cfg( visualizer_cfg: Any, mode_cfgs: dict[str, RenderingModeCfg], logger: Any, - *, - cache: dict[int, str | None] | None = None, - cache_key: int | None = None, ) -> None: - """Resolve and apply rendering mode profile for a Kit visualizer (RTX / carb settings). - - Pass ``cache`` and ``cache_key`` (typically ``id(viz)``) when updating an active visualizer each - frame so we skip redundant carb work when the effective profile name is unchanged—including - when the name is missing from ``mode_cfgs`` (avoids repeated warnings). - """ - if (cache is None) != (cache_key is None): - raise ValueError("apply_mode_profile_to_visualizer_cfg: pass both `cache` and `cache_key`, or neither.") + """Resolve and apply rendering mode profile for a Kit visualizer (RTX / carb settings).""" if getattr(visualizer_cfg, "visualizer_type", None) != "kit": return mode_name = resolve_effective_rendering_mode_name(get_setting, visualizer_cfg) - - if cache is not None and cache_key is not None: - if cache.get(cache_key) == mode_name: - return - mode_cfg = resolve_rendering_mode_cfg(mode_name, mode_cfgs, logger) if mode_cfg is None: - if cache is not None and cache_key is not None: - cache[cache_key] = mode_name return - apply_kit_rendering_mode_cfg(set_setting, mode_cfg) - if cache is not None and cache_key is not None: - cache[cache_key] = mode_name diff --git a/source/isaaclab/isaaclab/sim/simulation_context.py b/source/isaaclab/isaaclab/sim/simulation_context.py index 4034e759395..902bb185a0d 100644 --- a/source/isaaclab/isaaclab/sim/simulation_context.py +++ b/source/isaaclab/isaaclab/sim/simulation_context.py @@ -167,7 +167,6 @@ def __init__(self, cfg: SimulationCfg | None = None): # Initialize visualizer state (provider/visualizers are created lazily during initialize_visualizers()). self._scene_data_provider: BaseSceneDataProvider | None = None self._visualizers: list[BaseVisualizer] = [] - self._visualizer_mode_keys: dict[int, str | None] = {} self._scene_data_requirements = SceneDataRequirement() self._visualizer_prebuilt_artifact: VisualizerPrebuiltArtifacts | None = None self._visualizer_step_counter = 0 @@ -201,19 +200,6 @@ def _apply_mode_profile_to_visualizer_cfg(self, visualizer_cfg: Any) -> None: logger, ) - def _apply_runtime_mode_profile_to_visualizer(self, viz: BaseVisualizer) -> None: - """Apply rendering-mode profile updates to an active Kit visualizer instance.""" - mode_cfgs = self.cfg.rendering_mode_cfgs - apply_mode_profile_to_visualizer_cfg( - self.get_setting, - self.set_setting, - viz.cfg, - mode_cfgs, - logger, - cache=self._visualizer_mode_keys, - cache_key=id(viz), - ) - def _init_usd_physics_scene(self) -> None: """Create and configure the USD physics scene.""" cfg = self.cfg @@ -622,7 +608,6 @@ def update_visualizers(self, dt: float) -> None: visualizers_to_remove = [] for viz in self._visualizers: try: - self._apply_runtime_mode_profile_to_visualizer(viz) if viz.is_closed or not viz.is_running(): if viz.is_closed: logger.info("Visualizer closed: %s", type(viz).__name__) @@ -641,7 +626,6 @@ def update_visualizers(self, dt: float) -> None: for viz in visualizers_to_remove: try: - self._visualizer_mode_keys.pop(id(viz), None) viz.close() self._visualizers.remove(viz) logger.info("Removed visualizer: %s", type(viz).__name__) @@ -716,7 +700,6 @@ def clear_instance(cls) -> None: # Close all visualizers for viz in cls._instance._visualizers: - cls._instance._visualizer_mode_keys.pop(id(viz), None) viz.close() cls._instance._visualizers.clear() if cls._instance._scene_data_provider is not None: From 7fb0a6a53484a1e79024284c79f84b2ae96cf6ff Mon Sep 17 00:00:00 2001 From: matthewtrepte Date: Thu, 9 Apr 2026 12:47:58 -0700 Subject: [PATCH 31/34] Apply suggestions from code review Co-authored-by: isaaclab-review-bot[bot] <270793704+isaaclab-review-bot[bot]@users.noreply.github.com> Signed-off-by: matthewtrepte --- source/isaaclab/isaaclab/app/app_launcher.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/isaaclab/isaaclab/app/app_launcher.py b/source/isaaclab/isaaclab/app/app_launcher.py index 797c780445d..ffad84ee2ee 100644 --- a/source/isaaclab/isaaclab/app/app_launcher.py +++ b/source/isaaclab/isaaclab/app/app_launcher.py @@ -451,7 +451,7 @@ def add_app_launcher_args(parser: argparse.ArgumentParser) -> None: choices={"performance", "balanced", "quality"}, help=( "When passed, selects RenderingModeCfg presets for overwriting rendering settings of all Renderers" - "and Visualizers." + "When passed, selects RenderingModeCfg presets for overwriting rendering settings of all Renderers " ), ) arg_group.add_argument( From 66de60393dd3723a2962052bc2d6084670ab0ad9 Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Thu, 9 Apr 2026 19:58:38 +0000 Subject: [PATCH 32/34] preppin --- docs/source/how-to/configure_rendering.rst | 55 ++++++++----------- .../newton_scene_data_provider.py | 2 +- .../physx_scene_data_provider.py | 2 +- 3 files changed, 26 insertions(+), 33 deletions(-) diff --git a/docs/source/how-to/configure_rendering.rst b/docs/source/how-to/configure_rendering.rst index 69628b601f1..74ef391f7bf 100644 --- a/docs/source/how-to/configure_rendering.rst +++ b/docs/source/how-to/configure_rendering.rst @@ -177,25 +177,31 @@ specific settings of presets via ``kit_*`` fields (option 1) or by defining and Current Limitations ------------------- -For performance reasons, we default to using DLSS for denoising, which generally runs faster. -This may result in renders of lower quality, especially at lower resolutions. +For performance reasons, we default to using DLSS for denoising, which generally provides better performance. +This may result in renders of lower quality, which may be especially evident at lower resolutions. Due to this, we recommend using per-tile or per-camera resolution of at least 100 x 100. -For renders at lower resolutions, we advise setting -``kit_antialiasing_mode="DLAA"`` in -:class:`~isaaclab.rendering_mode.RenderingModeCfg`, and potentially enabling -``kit_enable_dl_denoiser=True``. Both settings can improve quality at a cost -of performance. +For renders at lower resolutions, we advice setting the ``antialiasing_mode`` attribute in :class:`~sim.RenderCfg` to +``DLAA``, and also potentially enabling ``enable_dl_denoiser``. Both of these settings should help improve render +quality, but also comes at a cost of performance. Additional rendering parameters can also be specified in :class:`~sim.RenderCfg`. -If you observe visual artifacts such as ghosting or disocclusion issues when using tiled rendering, you can set -:attr:`~isaaclab.rendering_mode.RenderingModeCfg.kit_disocclusion_scale` on your profile. It maps to carb -``/rtx/aovConverter/disocclusionScale`` and controls how aggressively the renderer handles areas that become -newly visible between frames. +If you observe visual artifacts such as ghosting or disocclusion issues when using tiled rendering, you can try +adjusting the ``disocclusionScale`` parameter. This setting controls how aggressively the renderer handles +areas that become newly visible between frames: + +.. code-block:: python + + render_cfg = sim_utils.RenderCfg( + carb_settings={ + "/rtx/aovConverter/disocclusionScale": 10000, + } + ) .. note:: - This knob can have side effects in some scenarios. Prefer tuning other quality settings first; only raise - ``kit_disocclusion_scale`` (often to a very high value) if artifacts persist. + This parameter is not commonly exposed as it may have side effects in certain scenarios. + Only use it as a last resort if other quality settings do not resolve the visual artifacts. + The value can be adjusted to a very high value to reduce disocclusion artifacts. Rendering UsdVol 3D Gaussian Scenes in Multiple Environments @@ -203,29 +209,16 @@ Rendering UsdVol 3D Gaussian Scenes in Multiple Environments When using UsdVol volumes with 3D Gaussian particles (e.g. exported from `3DGRUT `_) -in **multiple environments**, you must set ``kit_nre_compositing_renderer_hints=3`` (carb -``/omni/rtx/nre/compositing/rendererHints``) so the renderer uses the correct compositing path—the same value -Isaac Lab sets in its rendering experience files. +in **multiple environments**, you must set the following so the renderer uses the correct compositing path: .. code-block:: python - from isaaclab.rendering_mode import RenderingModeCfg - from isaaclab_physx.visualizers import KitVisualizerCfg - - sim_cfg = sim_utils.SimulationCfg( - rendering_mode_cfgs={ - "gaussian_multi_env": RenderingModeCfg( - kit_nre_compositing_renderer_hints=3, - ), - }, - visualizer_cfgs=[KitVisualizerCfg(rendering_mode="gaussian_multi_env")], + render_cfg = sim_utils.RenderCfg( + carb_settings={ + "omni.rtx.nre.compositing.rendererHints": 3, + } ) - # RTX cameras: use the same profile name on ``renderer_cfg.rendering_mode``. - -If tiled rendering shows ghosting or disocclusion artifacts with this content, you can add -:attr:`~isaaclab.rendering_mode.RenderingModeCfg.kit_disocclusion_scale` on the same profile (e.g. ``10000.0``). - .. warning:: With multiple environments, each environment holds its own copy of the scene, increasing device memory use, diff --git a/source/isaaclab_newton/isaaclab_newton/scene_data_providers/newton_scene_data_provider.py b/source/isaaclab_newton/isaaclab_newton/scene_data_providers/newton_scene_data_provider.py index 9b9ed5cfc6e..f3b10dc4004 100644 --- a/source/isaaclab_newton/isaaclab_newton/scene_data_providers/newton_scene_data_provider.py +++ b/source/isaaclab_newton/isaaclab_newton/scene_data_providers/newton_scene_data_provider.py @@ -43,7 +43,7 @@ def __init__(self, stage, simulation_context) -> None: self._num_envs: int | None = None self._warned_once: set[str] = set() - # Determine if usd stage sync is required for selected visualizers and renderers + # Determine if usd stage sync is required for selected renderers and visualizers requirements = self._simulation_context.get_scene_data_requirements() self._needs_usd_sync = bool(requirements.requires_usd_stage) diff --git a/source/isaaclab_physx/isaaclab_physx/scene_data_providers/physx_scene_data_provider.py b/source/isaaclab_physx/isaaclab_physx/scene_data_providers/physx_scene_data_provider.py index 970b404c47f..19aa1eb3498 100644 --- a/source/isaaclab_physx/isaaclab_physx/scene_data_providers/physx_scene_data_provider.py +++ b/source/isaaclab_physx/isaaclab_physx/scene_data_providers/physx_scene_data_provider.py @@ -113,7 +113,7 @@ def __init__(self, stage, simulation_context) -> None: # Single source of truth: discovered from stage and cached once available. self._num_envs: int | None = None - # Determine if newton model sync is required for selected visualizers and renderers + # Determine if newton model sync is required for selected renderers and visualizers requirements = self._simulation_context.get_scene_data_requirements() self._needs_newton_sync = bool(requirements.requires_newton_model) From 1b50cd3d477f6729abb1bb38164769a7164fcc3d Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Thu, 9 Apr 2026 21:25:36 +0000 Subject: [PATCH 33/34] remove "kit" mentions from within isaaclab/rendering_mode" var naming --- source/isaaclab/isaaclab/app/app_launcher.py | 4 +-- .../isaaclab/rendering_mode/__init__.py | 4 +-- .../rendering_mode/rendering_mode_cfg.py | 6 ++-- .../rendering_mode/rendering_mode_presets.py | 14 +++++----- .../rendering_mode/rendering_mode_utils.py | 28 +++++++++---------- .../test/rendering/test_rendering_mode.py | 4 +-- 6 files changed, 31 insertions(+), 29 deletions(-) diff --git a/source/isaaclab/isaaclab/app/app_launcher.py b/source/isaaclab/isaaclab/app/app_launcher.py index ffad84ee2ee..8ad6886931a 100644 --- a/source/isaaclab/isaaclab/app/app_launcher.py +++ b/source/isaaclab/isaaclab/app/app_launcher.py @@ -31,7 +31,7 @@ from isaaclab.app.settings_manager import get_settings_manager, initialize_carb_settings from isaaclab.rendering_mode.rendering_mode_utils import ( CLI_RENDERING_MODE_PROFILE_PATH, - apply_kit_rendering_preset, + apply_rendering_mode_preset, ) # import logger @@ -1139,7 +1139,7 @@ def _set_rendering_mode_settings(self, launcher_args: dict) -> None: and settings.is_omniverse_mode ): try: - apply_kit_rendering_preset(settings.set, rendering_mode) + apply_rendering_mode_preset(settings.set, rendering_mode) except Exception as e: logger.warning( "Could not apply Kit rendering preset %r to carb settings at launch: %s", diff --git a/source/isaaclab/isaaclab/rendering_mode/__init__.py b/source/isaaclab/isaaclab/rendering_mode/__init__.py index 8d833f476ea..1087be0475a 100644 --- a/source/isaaclab/isaaclab/rendering_mode/__init__.py +++ b/source/isaaclab/isaaclab/rendering_mode/__init__.py @@ -6,12 +6,12 @@ """Rendering mode config, presets, and application helpers.""" from .rendering_mode_cfg import RenderingModeCfg -from .rendering_mode_presets import get_kit_rendering_preset +from .rendering_mode_presets import get_rendering_mode_preset from .rendering_mode_utils import CLI_RENDERING_MODE_PROFILE_PATH, resolve_effective_rendering_mode_name __all__ = [ "CLI_RENDERING_MODE_PROFILE_PATH", "RenderingModeCfg", - "get_kit_rendering_preset", + "get_rendering_mode_preset", "resolve_effective_rendering_mode_name", ] diff --git a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py index 788a89ff844..dc6d5e871b8 100644 --- a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py +++ b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py @@ -12,7 +12,8 @@ @configclass class RenderingModeCfg: - """RTX/carb settings for `Omniverse RTX`_ (Kit viewport + Kit RTX camera renderers: ``default`` / ``isaac_rtx`` / ``rtx``). + """RTX/carb settings for `Omniverse RTX`_ (viewport + RTX camera renderers: + ``default`` / ``isaac_rtx`` / ``rtx``). Put named profiles in :attr:`~isaaclab.sim.SimulationCfg.rendering_mode_cfgs`, then set the same name on ``KitVisualizerCfg.rendering_mode`` or ``CameraCfg.renderer_cfg.rendering_mode`` (non-Kit renderers ignore it). @@ -149,7 +150,8 @@ class RenderingModeCfg: """NRE compositing renderer hints (Isaac Lab rendering experiences use ``3``). Required for correct compositing when using UsdVol 3D Gaussian content across multiple environments. - Carb path: ``/omni/rtx/nre/compositing/rendererHints`` (see also ``omni.rtx.nre.compositing.rendererHints`` in app ``.kit`` files). + Carb path: ``/omni/rtx/nre/compositing/rendererHints`` (see also + ``omni.rtx.nre.compositing.rendererHints`` in application ``.kit`` files). """ # TODO: Optional passthrough dict for arbitrary carb keys (cf. legacy RenderCfg.carb_settings). diff --git a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_presets.py b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_presets.py index 99fb8739380..49587908c3e 100644 --- a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_presets.py +++ b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_presets.py @@ -3,9 +3,9 @@ # # SPDX-License-Identifier: BSD-3-Clause -"""Built-in rendering mode presets for RTX/Kit rendering. +"""Built-in RTX rendering mode presets (performance, balanced, quality). -Presets are sourced from the latest Isaac Lab app rendering profiles (apps/rendering_modes). +Carb path values align with Isaac Lab application rendering profiles under ``apps/rendering_modes/``. """ from __future__ import annotations @@ -13,8 +13,8 @@ from copy import deepcopy from typing import Any -# Latest preset values sourced from apps/rendering_modes/*.kit. -_KIT_PRESETS: dict[str, dict[str, Any]] = { +# Carb settings for each built-in preset; kept in sync with apps/rendering_modes application profiles. +_BUILTIN_RENDERING_MODE_PRESETS: dict[str, dict[str, Any]] = { "performance": { "/rtx/rtpt/cached/enabled": False, "/rtx/rtpt/lightcache/cached/enabled": False, @@ -80,8 +80,8 @@ } -def get_kit_rendering_preset(preset_name: str) -> dict[str, Any]: - """Return a deep copy of the requested rendering preset.""" +def get_rendering_mode_preset(preset_name: str) -> dict[str, Any]: + """Return a deep copy of the requested built-in rendering mode preset.""" if preset_name not in {"performance", "balanced", "quality"}: raise ValueError(f"Unknown preset '{preset_name}'.") - return deepcopy(_KIT_PRESETS[preset_name]) + return deepcopy(_BUILTIN_RENDERING_MODE_PRESETS[preset_name]) diff --git a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py index af60200d8ff..a74708c4f6d 100644 --- a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py +++ b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_utils.py @@ -12,7 +12,7 @@ from typing import Any from .rendering_mode_cfg import RenderingModeCfg -from .rendering_mode_presets import get_kit_rendering_preset +from .rendering_mode_presets import get_rendering_mode_preset _logger = logging.getLogger(__name__) @@ -22,7 +22,7 @@ # CLI profile name string; AppLauncher uses this leaf path (``set_string``). CLI_RENDERING_MODE_PROFILE_PATH = "/isaaclab/rendering/rendering_mode/profile" -_KIT_FIELD_TO_CARB: dict[str, str] = { +_RENDERING_MODE_FIELD_TO_CARB: dict[str, str] = { "kit_enable_translucency": "/rtx/translucency/enabled", "kit_enable_reflections": "/rtx/reflections/enabled", "kit_enable_global_illumination": "/rtx/indirectDiffuse/enabled", @@ -81,27 +81,27 @@ def resolve_effective_rendering_mode_name(get_setting: Any, cfg: Any) -> str | N return getattr(cfg, "rendering_mode", None) -def apply_kit_rendering_preset(set_setting: Any, preset_name: str) -> None: - """Apply a named kit preset via provided setting setter.""" - preset = get_kit_rendering_preset(preset_name) +def apply_rendering_mode_preset(set_setting: Any, preset_name: str) -> None: + """Apply a named built-in preset (performance / balanced / quality) via the provided setter.""" + preset = get_rendering_mode_preset(preset_name) for key, value in preset.items(): set_setting(key, value) -def apply_kit_rendering_mode_cfg(set_setting: Any, mode_cfg: RenderingModeCfg) -> None: - """Apply kit-specific rendering mode fields.""" +def apply_rendering_mode_cfg(set_setting: Any, mode_cfg: RenderingModeCfg) -> None: + """Apply :class:`RenderingModeCfg` fields to carb (preset baseline + per-field overrides).""" if mode_cfg.rendering_mode_preset: - apply_kit_rendering_preset(set_setting, mode_cfg.rendering_mode_preset) + apply_rendering_mode_preset(set_setting, mode_cfg.rendering_mode_preset) # Replicator's set_render_rtx_realtime() can reset other RTX carb flags. Run it before applying - # explicit kit_* carb paths so user overrides remain authoritative. + # explicit per-field carb overrides so user settings remain authoritative. if mode_cfg.kit_antialiasing_mode is not None: with contextlib.suppress(Exception): import omni.replicator.core as rep rep.settings.set_render_rtx_realtime(antialiasing=mode_cfg.kit_antialiasing_mode) - for field_name, carb_key in _KIT_FIELD_TO_CARB.items(): + for field_name, carb_key in _RENDERING_MODE_FIELD_TO_CARB.items(): value = getattr(mode_cfg, field_name, None) if value is not None: set_setting(carb_key, value) @@ -114,7 +114,7 @@ def apply_mode_profile_to_renderer_cfg( mode_cfgs: dict[str, RenderingModeCfg], logger: Any, ) -> None: - """Resolve and apply a rendering mode profile to a Kit/RTX :class:`~isaaclab.renderers.RendererCfg` (in place).""" + """Resolve and apply a rendering mode profile to an RTX :class:`~isaaclab.renderers.RendererCfg` (in place).""" rtype = getattr(renderer_cfg, "renderer_type", None) if rtype not in ("default", "isaac_rtx", "rtx"): return @@ -122,7 +122,7 @@ def apply_mode_profile_to_renderer_cfg( mode_cfg = resolve_rendering_mode_cfg(mode_name, mode_cfgs, logger) if mode_cfg is None: return - apply_kit_rendering_mode_cfg(set_setting, mode_cfg) + apply_rendering_mode_cfg(set_setting, mode_cfg) def resolve_rendering_mode_cfg( @@ -154,11 +154,11 @@ def apply_mode_profile_to_visualizer_cfg( mode_cfgs: dict[str, RenderingModeCfg], logger: Any, ) -> None: - """Resolve and apply rendering mode profile for a Kit visualizer (RTX / carb settings).""" + """Resolve and apply rendering mode profile for a viewport visualizer (RTX / carb settings).""" if getattr(visualizer_cfg, "visualizer_type", None) != "kit": return mode_name = resolve_effective_rendering_mode_name(get_setting, visualizer_cfg) mode_cfg = resolve_rendering_mode_cfg(mode_name, mode_cfgs, logger) if mode_cfg is None: return - apply_kit_rendering_mode_cfg(set_setting, mode_cfg) + apply_rendering_mode_cfg(set_setting, mode_cfg) diff --git a/source/isaaclab/test/rendering/test_rendering_mode.py b/source/isaaclab/test/rendering/test_rendering_mode.py index 1814fd7a17d..f19bcf43f0d 100644 --- a/source/isaaclab/test/rendering/test_rendering_mode.py +++ b/source/isaaclab/test/rendering/test_rendering_mode.py @@ -81,7 +81,7 @@ def test_rendering_mode_presets_apply_via_visualizer(): from isaaclab_physx.visualizers import KitVisualizerCfg from isaaclab.app.settings_manager import get_settings_manager - from isaaclab.rendering_mode import get_kit_rendering_preset + from isaaclab.rendering_mode import get_rendering_mode_preset from isaaclab.sim.simulation_cfg import SimulationCfg from isaaclab.sim.simulation_context import SimulationContext @@ -89,7 +89,7 @@ def test_rendering_mode_presets_apply_via_visualizer(): for mode_name in ["performance", "balanced", "quality"]: SimulationContext.clear_instance() - preset_dict = get_kit_rendering_preset(mode_name) + preset_dict = get_rendering_mode_preset(mode_name) profile_name = f"profile_{mode_name}" cfg = SimulationCfg( From b5a68a70e7529c4fefcbd715a2a8436d2b7a61ae Mon Sep 17 00:00:00 2001 From: Matthew Trepte Date: Mon, 13 Apr 2026 21:49:48 +0000 Subject: [PATCH 34/34] move preset settings to module dirs --- docs/source/how-to/configure_rendering.rst | 2 +- .../rendering_mode/rendering_mode_cfg.py | 5 +- .../rendering_mode/rendering_mode_presets.py | 89 ++++--------------- .../test/rendering/test_rendering_mode.py | 4 +- source/isaaclab_physx/docs/CHANGELOG.rst | 12 +++ .../isaaclab_physx/rendering/__init__.py | 10 +++ .../rendering/rtx_rendering_mode_presets.py | 88 ++++++++++++++++++ source/isaaclab_physx/setup.py | 1 + .../test_rtx_rendering_mode_presets.py | 24 +++++ .../kit/kit_visualizer_cfg.py | 4 + 10 files changed, 161 insertions(+), 78 deletions(-) create mode 100644 source/isaaclab_physx/isaaclab_physx/rendering/__init__.py create mode 100644 source/isaaclab_physx/isaaclab_physx/rendering/rtx_rendering_mode_presets.py create mode 100644 source/isaaclab_physx/test/rendering/test_rtx_rendering_mode_presets.py diff --git a/docs/source/how-to/configure_rendering.rst b/docs/source/how-to/configure_rendering.rst index 74ef391f7bf..9f20ae68011 100644 --- a/docs/source/how-to/configure_rendering.rst +++ b/docs/source/how-to/configure_rendering.rst @@ -89,7 +89,7 @@ Preset rendering settings can be overwritten via :class:`~isaaclab.rendering_mode.RenderingModeCfg`. The built-in ``rendering_mode_preset`` field only accepts ``performance``, ``balanced``, or ``quality``; those map to -fixed RTX baselines in ``isaaclab.rendering_mode.rendering_mode_presets``. +fixed RTX baselines in ``isaaclab_physx.rendering.rtx_rendering_mode_presets`` (also available via :func:`isaaclab.rendering_mode.get_rendering_mode_preset`). Rendering settings can be customized by either overwriting specific settings of presets via ``kit_*`` fields (option 1) or by defining and adding a new **named profile** to :attr:`~sim.SimulationCfg.rendering_mode_cfgs` (option 2). diff --git a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py index dc6d5e871b8..0621e17dbea 100644 --- a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py +++ b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_cfg.py @@ -19,7 +19,8 @@ class RenderingModeCfg: ``KitVisualizerCfg.rendering_mode`` or ``CameraCfg.renderer_cfg.rendering_mode`` (non-Kit renderers ignore it). **Order:** optional :attr:`rendering_mode_preset` (``performance`` / ``balanced`` / ``quality``) loads the - matching baseline from :mod:`isaaclab.rendering_mode.rendering_mode_presets`—the same three choices as CLI + matching baseline from :mod:`isaaclab_physx.rendering.rtx_rendering_mode_presets` (via + :func:`isaaclab.rendering_mode.get_rendering_mode_preset`)—the same three choices as CLI ``--rendering_mode``. Each non-``None`` ``kit_*`` field then overrides specific carb paths on top of that baseline. @@ -33,7 +34,7 @@ class RenderingModeCfg: rendering_mode_preset: Literal["performance", "balanced", "quality"] | None = None """Optional built-in RTX baseline (performance, balanced, or quality). - Values are defined in :mod:`isaaclab.rendering_mode.rendering_mode_presets`. This is the same + Values are defined in :mod:`isaaclab_physx.rendering.rtx_rendering_mode_presets`. This is the same conceptual knob as passing ``--rendering_mode`` to a script: it selects one of the three packaged profiles before any per-field ``kit_*`` overrides below are applied. """ diff --git a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_presets.py b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_presets.py index 49587908c3e..8b6d87f53d0 100644 --- a/source/isaaclab/isaaclab/rendering_mode/rendering_mode_presets.py +++ b/source/isaaclab/isaaclab/rendering_mode/rendering_mode_presets.py @@ -3,85 +3,28 @@ # # SPDX-License-Identifier: BSD-3-Clause -"""Built-in RTX rendering mode presets (performance, balanced, quality). +"""Stable entry point for built-in RTX presets. -Carb path values align with Isaac Lab application rendering profiles under ``apps/rendering_modes/``. +Preset tables are defined in :mod:`isaaclab_physx.rendering.rtx_rendering_mode_presets` and loaded here +so ``isaaclab.rendering_mode`` keeps a single public API. """ from __future__ import annotations -from copy import deepcopy from typing import Any -# Carb settings for each built-in preset; kept in sync with apps/rendering_modes application profiles. -_BUILTIN_RENDERING_MODE_PRESETS: dict[str, dict[str, Any]] = { - "performance": { - "/rtx/rtpt/cached/enabled": False, - "/rtx/rtpt/lightcache/cached/enabled": False, - "/rtx/rtpt/translucency/virtualMotion/enabled": False, - "/rtx/rtpt/maxBounces": 2, - "/rtx/rtpt/splitGlass": False, - "/rtx/rtpt/splitClearcoat": False, - "/rtx/rtpt/splitRoughReflection": True, - "/rtx/rtpt/useAmbientOcclusionForAmbientLight": False, - "/rtx/sceneDb/ambientLightIntensity": 1.0, - "/rtx/shadows/enabled": True, - "/rtx/domeLight/upperLowerStrategy": 3, - "/rtx/ambientOcclusion/enabled": False, - "/rtx/ambientOcclusion/denoiserMode": 1, - "/rtx/raytracing/subpixel/mode": 0, - "/rtx/raytracing/cached/enabled": False, - "/rtx-transient/dlssg/enabled": False, - "/rtx-transient/dldenoiser/enabled": False, - "/rtx/post/dlss/execMode": 1, - "/rtx/pathtracing/maxSamplesPerLaunch": 1_000_000, - "/rtx/viewTile/limit": 1_000_000, - }, - "balanced": { - "/rtx/rtpt/cached/enabled": False, - "/rtx/rtpt/lightcache/cached/enabled": False, - "/rtx/rtpt/translucency/virtualMotion/enabled": False, - "/rtx/rtpt/maxBounces": 2, - "/rtx/rtpt/splitGlass": False, - "/rtx/rtpt/splitClearcoat": False, - "/rtx/rtpt/splitRoughReflection": True, - "/rtx/rtpt/useAmbientOcclusionForAmbientLight": False, - "/rtx/sceneDb/ambientLightIntensity": 1.0, - "/rtx/shadows/enabled": True, - "/rtx/ambientOcclusion/enabled": False, - "/rtx/ambientOcclusion/denoiserMode": 1, - "/rtx/raytracing/subpixel/mode": 0, - "/rtx/raytracing/cached/enabled": True, - "/rtx-transient/dlssg/enabled": False, - "/rtx-transient/dldenoiser/enabled": True, - "/rtx/post/dlss/execMode": 1, - "/rtx/pathtracing/maxSamplesPerLaunch": 1_000_000, - "/rtx/viewTile/limit": 1_000_000, - }, - "quality": { - "/rtx/rtpt/maxBounces": 3, - "/rtx/rtpt/cached/enabled": False, - "/rtx/rtpt/lightcache/cached/enabled": False, - "/rtx/rtpt/translucency/virtualMotion/enabled": False, - "/rtx/rtpt/splitRoughReflection": True, - "/rtx/rtpt/adaptiveSampling/disocclusion/enabled": True, - "/rtx/rtpt/adaptiveSampling/disocclusion/spp": 4, - "/rtx/sceneDb/ambientLightIntensity": 1.0, - "/rtx/shadows/enabled": True, - "/rtx/ambientOcclusion/enabled": True, - "/rtx/ambientOcclusion/denoiserMode": 0, - "/rtx/raytracing/subpixel/mode": 1, - "/rtx/raytracing/cached/enabled": True, - "/rtx-transient/dlssg/enabled": False, - "/rtx/post/dlss/execMode": 2, - "/rtx/pathtracing/maxSamplesPerLaunch": 1_000_000, - "/rtx/viewTile/limit": 1_000_000, - }, -} - def get_rendering_mode_preset(preset_name: str) -> dict[str, Any]: - """Return a deep copy of the requested built-in rendering mode preset.""" - if preset_name not in {"performance", "balanced", "quality"}: - raise ValueError(f"Unknown preset '{preset_name}'.") - return deepcopy(_BUILTIN_RENDERING_MODE_PRESETS[preset_name]) + """Return a deep copy of the requested built-in rendering mode preset. + + Raises: + ImportError: If ``isaaclab_physx`` is not installed (RTX presets live in that package). + """ + try: + from isaaclab_physx.rendering.rtx_rendering_mode_presets import get_builtin_rtx_rendering_mode_preset + except ImportError as e: + raise ImportError( + "RTX rendering mode presets are provided by isaaclab_physx. " + "Install with: pip install 'isaaclab[physx]' or install the isaaclab_physx package." + ) from e + return get_builtin_rtx_rendering_mode_preset(preset_name) diff --git a/source/isaaclab/test/rendering/test_rendering_mode.py b/source/isaaclab/test/rendering/test_rendering_mode.py index f19bcf43f0d..ef595ce0e8f 100644 --- a/source/isaaclab/test/rendering/test_rendering_mode.py +++ b/source/isaaclab/test/rendering/test_rendering_mode.py @@ -78,7 +78,7 @@ def set_setting(name: str, value: object) -> None: @pytest.mark.usefixtures("simulation_app") def test_rendering_mode_presets_apply_via_visualizer(): """Built-in presets + ``kit_*`` overrides should propagate to carb via Kit visualizer init.""" - from isaaclab_physx.visualizers import KitVisualizerCfg + from isaaclab_visualizers.kit import KitVisualizerCfg from isaaclab.app.settings_manager import get_settings_manager from isaaclab.rendering_mode import get_rendering_mode_preset @@ -120,7 +120,7 @@ def test_rendering_mode_presets_apply_via_visualizer(): @pytest.mark.usefixtures("simulation_app") def test_rendering_mode_kit_field_overrides_via_visualizer(): """Explicit ``RenderingModeCfg`` fields should map to carb when the Kit visualizer applies the profile.""" - from isaaclab_physx.visualizers import KitVisualizerCfg + from isaaclab_visualizers.kit import KitVisualizerCfg from isaaclab.sim.simulation_cfg import SimulationCfg from isaaclab.sim.simulation_context import SimulationContext diff --git a/source/isaaclab_physx/docs/CHANGELOG.rst b/source/isaaclab_physx/docs/CHANGELOG.rst index 6ea71fa755c..65d5047c98d 100644 --- a/source/isaaclab_physx/docs/CHANGELOG.rst +++ b/source/isaaclab_physx/docs/CHANGELOG.rst @@ -1,6 +1,18 @@ Changelog --------- +0.5.14 (2026-04-08) +~~~~~~~~~~~~~~~~~~~ + +Changed +^^^^^^^ + +* Moved built-in RTX rendering mode preset tables (``performance`` / ``balanced`` / ``quality``) from the core + ``isaaclab`` package into :mod:`isaaclab_physx.rendering.rtx_rendering_mode_presets`. The public + :func:`isaaclab.rendering_mode.get_rendering_mode_preset` API still resolves these values when ``isaaclab_physx`` + is installed. + + 0.5.13 (2026-03-25) ~~~~~~~~~~~~~~~~~~~ diff --git a/source/isaaclab_physx/isaaclab_physx/rendering/__init__.py b/source/isaaclab_physx/isaaclab_physx/rendering/__init__.py new file mode 100644 index 00000000000..bd8e7df0725 --- /dev/null +++ b/source/isaaclab_physx/isaaclab_physx/rendering/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""RTX rendering resources for the PhysX / Isaac Sim stack.""" + +from .rtx_rendering_mode_presets import get_builtin_rtx_rendering_mode_preset + +__all__ = ["get_builtin_rtx_rendering_mode_preset"] diff --git a/source/isaaclab_physx/isaaclab_physx/rendering/rtx_rendering_mode_presets.py b/source/isaaclab_physx/isaaclab_physx/rendering/rtx_rendering_mode_presets.py new file mode 100644 index 00000000000..bed756586e9 --- /dev/null +++ b/source/isaaclab_physx/isaaclab_physx/rendering/rtx_rendering_mode_presets.py @@ -0,0 +1,88 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Built-in RTX rendering mode presets (performance, balanced, quality). + +Carb path values align with Isaac Lab application rendering profiles (e.g. under ``apps/``) where applicable. +These baselines are used by :class:`~isaaclab.rendering_mode.RenderingModeCfg` and +``isaaclab.rendering_mode`` helpers for Kit viewport and Isaac RTX camera renderers. +""" + +from __future__ import annotations + +from copy import deepcopy +from typing import Any + +_BUILTIN_RTX_RENDERING_MODE_PRESETS: dict[str, dict[str, Any]] = { + "performance": { + "/rtx/rtpt/cached/enabled": False, + "/rtx/rtpt/lightcache/cached/enabled": False, + "/rtx/rtpt/translucency/virtualMotion/enabled": False, + "/rtx/rtpt/maxBounces": 2, + "/rtx/rtpt/splitGlass": False, + "/rtx/rtpt/splitClearcoat": False, + "/rtx/rtpt/splitRoughReflection": True, + "/rtx/rtpt/useAmbientOcclusionForAmbientLight": False, + "/rtx/sceneDb/ambientLightIntensity": 1.0, + "/rtx/shadows/enabled": True, + "/rtx/domeLight/upperLowerStrategy": 3, + "/rtx/ambientOcclusion/enabled": False, + "/rtx/ambientOcclusion/denoiserMode": 1, + "/rtx/raytracing/subpixel/mode": 0, + "/rtx/raytracing/cached/enabled": False, + "/rtx-transient/dlssg/enabled": False, + "/rtx-transient/dldenoiser/enabled": False, + "/rtx/post/dlss/execMode": 1, + "/rtx/pathtracing/maxSamplesPerLaunch": 1_000_000, + "/rtx/viewTile/limit": 1_000_000, + }, + "balanced": { + "/rtx/rtpt/cached/enabled": False, + "/rtx/rtpt/lightcache/cached/enabled": False, + "/rtx/rtpt/translucency/virtualMotion/enabled": False, + "/rtx/rtpt/maxBounces": 2, + "/rtx/rtpt/splitGlass": False, + "/rtx/rtpt/splitClearcoat": False, + "/rtx/rtpt/splitRoughReflection": True, + "/rtx/rtpt/useAmbientOcclusionForAmbientLight": False, + "/rtx/sceneDb/ambientLightIntensity": 1.0, + "/rtx/shadows/enabled": True, + "/rtx/ambientOcclusion/enabled": False, + "/rtx/ambientOcclusion/denoiserMode": 1, + "/rtx/raytracing/subpixel/mode": 0, + "/rtx/raytracing/cached/enabled": True, + "/rtx-transient/dlssg/enabled": False, + "/rtx-transient/dldenoiser/enabled": True, + "/rtx/post/dlss/execMode": 1, + "/rtx/pathtracing/maxSamplesPerLaunch": 1_000_000, + "/rtx/viewTile/limit": 1_000_000, + }, + "quality": { + "/rtx/rtpt/maxBounces": 3, + "/rtx/rtpt/cached/enabled": False, + "/rtx/rtpt/lightcache/cached/enabled": False, + "/rtx/rtpt/translucency/virtualMotion/enabled": False, + "/rtx/rtpt/splitRoughReflection": True, + "/rtx/rtpt/adaptiveSampling/disocclusion/enabled": True, + "/rtx/rtpt/adaptiveSampling/disocclusion/spp": 4, + "/rtx/sceneDb/ambientLightIntensity": 1.0, + "/rtx/shadows/enabled": True, + "/rtx/ambientOcclusion/enabled": True, + "/rtx/ambientOcclusion/denoiserMode": 0, + "/rtx/raytracing/subpixel/mode": 1, + "/rtx/raytracing/cached/enabled": True, + "/rtx-transient/dlssg/enabled": False, + "/rtx/post/dlss/execMode": 2, + "/rtx/pathtracing/maxSamplesPerLaunch": 1_000_000, + "/rtx/viewTile/limit": 1_000_000, + }, +} + + +def get_builtin_rtx_rendering_mode_preset(preset_name: str) -> dict[str, Any]: + """Return a deep copy of the requested built-in RTX rendering mode preset.""" + if preset_name not in {"performance", "balanced", "quality"}: + raise ValueError(f"Unknown preset '{preset_name}'.") + return deepcopy(_BUILTIN_RTX_RENDERING_MODE_PRESETS[preset_name]) diff --git a/source/isaaclab_physx/setup.py b/source/isaaclab_physx/setup.py index d8e1b731b4b..3b3d434f3eb 100644 --- a/source/isaaclab_physx/setup.py +++ b/source/isaaclab_physx/setup.py @@ -47,6 +47,7 @@ "isaaclab_physx.cloner", "isaaclab_physx.physics", "isaaclab_physx.renderers", + "isaaclab_physx.rendering", "isaaclab_physx.scene_data_providers", "isaaclab_physx.sensors", "isaaclab_physx.sensors.contact_sensor", diff --git a/source/isaaclab_physx/test/rendering/test_rtx_rendering_mode_presets.py b/source/isaaclab_physx/test/rendering/test_rtx_rendering_mode_presets.py new file mode 100644 index 00000000000..9bdb4e27b0f --- /dev/null +++ b/source/isaaclab_physx/test/rendering/test_rtx_rendering_mode_presets.py @@ -0,0 +1,24 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Tests for built-in RTX rendering mode preset data.""" + +from __future__ import annotations + +import pytest + +from isaaclab_physx.rendering.rtx_rendering_mode_presets import get_builtin_rtx_rendering_mode_preset + + +def test_builtin_rtx_presets_cover_three_modes(): + for name in ("performance", "balanced", "quality"): + d = get_builtin_rtx_rendering_mode_preset(name) + assert isinstance(d, dict) + assert "/rtx/shadows/enabled" in d + + +def test_unknown_preset_raises(): + with pytest.raises(ValueError, match="Unknown preset"): + get_builtin_rtx_rendering_mode_preset("not_a_mode") diff --git a/source/isaaclab_visualizers/isaaclab_visualizers/kit/kit_visualizer_cfg.py b/source/isaaclab_visualizers/isaaclab_visualizers/kit/kit_visualizer_cfg.py index de8d666d2ab..cd1d042b58b 100644 --- a/source/isaaclab_visualizers/isaaclab_visualizers/kit/kit_visualizer_cfg.py +++ b/source/isaaclab_visualizers/isaaclab_visualizers/kit/kit_visualizer_cfg.py @@ -37,5 +37,9 @@ class KitVisualizerCfg(VisualizerCfg): rendering_mode: str | None = "performance" """Kit/RTX profile name from :attr:`~isaaclab.sim.SimulationCfg.rendering_mode_cfgs` (default ``performance``). + Built-in ``performance`` / ``balanced`` / ``quality`` baselines are defined in + :mod:`isaaclab_physx.rendering.rtx_rendering_mode_presets` and applied through the same mechanism as RTX camera + renderers; no separate copy lives under ``isaaclab_visualizers``. + Set to ``None`` to skip applying a named profile (USD / Kit defaults). """