Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ rerun = [
isaacsim = ["isaacsim[all,extscache]==6.0.0.1"]
# Omniverse renderer / physics backends (``ov[ovphysx|ovrtx|all]`` selectors).
ov = ["ovphysx>=0.4.13"]
rtx = ["ovrtx>=0.3.0,<0.4.0"]
rtx = ["ovrtx>=0.4.0,<0.5.0"]
mimic = [
"isaaclab-mimic",
"ipywidgets>=8.1.5",
Expand Down Expand Up @@ -167,7 +167,7 @@ torch = "2.11.0"
torchvision = "0.26.0"
torchaudio = "2.11.0"
ovphysx = ">=0.4.13"
ovrtx = ">=0.3.0,<0.4.0"
ovrtx = ">=0.4.0,<0.5.0"
# Newton git commit + matching warp-lang prerelease (upgraded together).
newton = "c7ae7c7648cd0717df39e5c94b95d5a02c997320"
warp = "1.15.0.dev20260626"
Expand Down
11 changes: 11 additions & 0 deletions source/isaaclab_ov/changelog.d/esekkin-ovrtx-bump-04.minor.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
Changed
^^^^^^^

* Updated the optional OVRTX runtime dependency to ``ovrtx>=0.4.0,<0.5.0``. Reinstall the OVRTX
extra with ``./isaaclab.sh -i 'ov[ovrtx]'`` to use the supported 0.4 runtime.

Fixed
^^^^^

* Worked around OVRTX 0.4 tiled RenderProducts retaining only cameras present at stage load by
rewriting the camera relationship after runtime cloning.
Original file line number Diff line number Diff line change
Expand Up @@ -419,13 +419,20 @@ def _initialize_from_spec(self, spec: CameraRenderSpec):
self._renderer.open_usd_from_string(combined_usd_string)
logger.info("OVRTX loaded USD from string successfully")

camera_paths = [f"/World/envs/env_{i}/{self._camera_rel_path}" for i in range(num_envs)]
if num_envs > 1:
self._clone_sources_in_ovrtx()
self._update_scene_partitions_after_clone(num_envs)
# OVRTX 0.4 keeps the initial Fabric camera relationship after clone_usd creates the remaining
# cameras. Rewrite it so the RenderProduct includes every camera in its tiled output.
self._renderer.write_array_attribute(
prim_paths=[render_product_path],
attribute_name="camera",
tensors=[camera_paths],
)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great workaround! It doesn't even look like a workaround from my perspective.

Maybe we should have this code path only for ovrtx 0.4, gating it with a ovrtx version check (ovrtx.__version__).

We'd better keep both 0.3 and 0.4 working separately for easier A/B testing in the short term.


self._initialized_scene = True

camera_paths = [f"/World/envs/env_{i}/{self._camera_rel_path}" for i in range(num_envs)]
self._camera_xform_binding = self._renderer.bind_attribute(
prim_paths=camera_paths,
attribute_name="omni:xform",
Expand Down
37 changes: 37 additions & 0 deletions source/isaaclab_ov/test/test_ovrtx_clone_plan.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ def _make_ovrtx_renderer_without_backend() -> OVRTXRenderer:
renderer._renderer = SimpleNamespace(
clone_usd=lambda *args, **kwargs: None,
read_attribute=lambda *args, **kwargs: None,
write_array_attribute=lambda *args, **kwargs: None,
write_attribute=lambda *args, **kwargs: None,
)
renderer._clone_plan = None
Expand Down Expand Up @@ -422,6 +423,42 @@ def test_initialize_from_spec_writes_combined_stage_dump(tmp_path: Path):
assert renderer._exported_usd_string is None


def test_initialize_from_spec_refreshes_camera_relationship_after_cloning():
"""Multi-environment initialization rewrites the RenderProduct cameras after cloning."""
num_envs = 4
renderer = _make_ovrtx_renderer_without_backend()
renderer._exported_usd_string = "#usda 1.0\n"

call_order: list[str] = []
write_array_calls: list[tuple[list[str], str, list[list[str]]]] = []

renderer._renderer.open_usd_from_string = lambda _usd_string: call_order.append("open")
renderer._clone_sources_in_ovrtx = lambda: call_order.append("clone")
renderer._update_scene_partitions_after_clone = lambda _num_envs: call_order.append("partitions")

def _write_array_attribute(prim_paths: list[str], attribute_name: str, tensors: list[list[str]]) -> None:
call_order.append("rewrite_cameras")
write_array_calls.append((prim_paths, attribute_name, tensors))

renderer._renderer.write_array_attribute = _write_array_attribute
renderer._renderer.bind_attribute = lambda **_kwargs: object()
renderer._renderer.write_attribute = lambda **_kwargs: None
renderer._setup_xform_bindings = lambda: None
renderer._setup_deformable_bindings = lambda _num_envs: None

spec = _make_camera_render_spec(num_envs=num_envs)
renderer._initialize_from_spec(spec)

assert call_order == ["open", "clone", "partitions", "rewrite_cameras"]
assert write_array_calls == [
(
["/Render/RenderProduct"],
"camera",
[[f"/World/envs/env_{env_id}/Camera" for env_id in range(num_envs)]],
)
]


def test_prepare_stage_stores_clone_plan_and_exports(monkeypatch: pytest.MonkeyPatch):
"""prepare_stage resolves the clone plan and exports a trimmed prototype stage."""
num_envs = 4
Expand Down
Empty file.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems the red background issue in albedo has been fixed.

@rilei-nvidia we have one bug ticket to close.

@huidongc huidongc Jul 21, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

However, I can't see the ground. Seems like a regression.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes thanks for flagging this. The ground looks missing in this, I can see the ground in the 'source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-rgb.png' from the same set

Image

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

@rilei-nvidia rilei-nvidia Jul 21, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a welcomed change and is expected. Relates to the fix from nvbug 6270556

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe we should assign a different diffuse color to the table so that it can be distinguished from the background.

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 5 additions & 5 deletions uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading