Skip to content

Commit 6907aaf

Browse files
committed
Use clone plan for shadow visualization layout
1 parent 579bd62 commit 6907aaf

5 files changed

Lines changed: 17 additions & 12 deletions

File tree

source/isaaclab/test/sim/test_newton_manager_visualization_state.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ def _make_standalone_stage():
5252

5353

5454
def _set_sim_context(monkeypatch, nm, clone_plan=_DEFAULT, scene_data_provider=_DEFAULT):
55-
clone_plan = SimpleNamespace() if clone_plan is _DEFAULT else clone_plan
55+
clone_plan = SimpleNamespace(clone_mask=np.ones((1, 1), dtype=np.bool_)) if clone_plan is _DEFAULT else clone_plan
5656
scene_data_provider = SimpleNamespace() if scene_data_provider is _DEFAULT else scene_data_provider
5757
sim = SimpleNamespace(
5858
get_clone_plan=lambda: clone_plan,
@@ -418,9 +418,9 @@ def test_ensure_visualization_model_populates_num_envs_when_backend_is_physx(mon
418418

419419
_reset_newton_manager_state()
420420
monkeypatch.setattr(NewtonManager, "_backend_is_newton", classmethod(lambda cls, scene_data_provider=None: False))
421-
monkeypatch.setattr(nm, "get_current_stage", lambda *args, **kwargs: _make_env_stage(num_envs=4))
421+
monkeypatch.setattr(nm, "get_current_stage", lambda *args, **kwargs: _make_env_stage())
422422
monkeypatch.setattr(nm.PhysicsManager, "_sim", None, raising=False)
423-
_set_sim_context(monkeypatch, nm)
423+
_set_sim_context(monkeypatch, nm, clone_plan=SimpleNamespace(clone_mask=np.ones((1, 4), dtype=np.bool_)))
424424
monkeypatch.setattr(nm.PhysicsManager, "_device", "cpu", raising=False)
425425

426426
builder = _make_finalize_builder(body_count=3)
@@ -835,6 +835,7 @@ def test_clone_visualization_builder_ignores_non_env_deformables_on_world_import
835835
destinations=("/World/envs/env_{}",),
836836
env_ids=np.asarray([0, 1], dtype=np.int64),
837837
clone_mask=np.asarray([[False, False]], dtype=np.bool_),
838+
positions=np.zeros((2, 3), dtype=np.float32),
838839
)
839840
monkeypatch.setattr(vb, "ModelBuilder", lambda up_axis="Z": fake_builder)
840841
monkeypatch.setattr(vb, "_restore_visible_colliders_without_visual_shapes", lambda *args, **kwargs: None)
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Fixed
2+
^^^^^
3+
4+
* Built Newton shadow visualization layouts from clone-plan positions when destination USD environment prims are absent.

source/isaaclab_newton/isaaclab_newton/physics/newton_manager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2902,7 +2902,7 @@ def _ensure_visualization_model(cls) -> None:
29022902
"deferring visualization model creation."
29032903
)
29042904
return
2905-
NewtonManager._num_envs = len(env_paths) if clone_plan is not None else 1
2905+
NewtonManager._num_envs = clone_plan.clone_mask.shape[1] if clone_plan is not None else 1
29062906
builder, (shadow_entities, registry_groups) = build_visualization_builder_from_stage_envs(
29072907
stage, env_paths, clone_plan, up_axis=up_axis, device=str(PhysicsManager._device or "cpu")
29082908
)

source/isaaclab_newton/isaaclab_newton/physics/visualization_builder.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
from pxr import Usd
1616

1717
from isaaclab.scene_data.deformable_discovery import DeformableStageEntry, discover_deformables_on_stage
18-
from isaaclab.sim.utils.transforms import resolve_prim_pose
1918

2019
from isaaclab_newton.cloner.newton_clone_utils import (
2120
_restore_visible_colliders_without_visual_shapes,
@@ -120,16 +119,15 @@ def build_visualization_builder_from_stage_envs(
120119
if not env_paths:
121120
raise ValueError("clone plan requires at least one environment path")
122121

123-
env_path_by_id = dict(env_paths)
124-
125122
sources = tuple(clone_plan.sources)
126123
destinations = tuple(clone_plan.destinations)
127124
env_ids = clone_plan.env_ids
128125
mapping = clone_plan.clone_mask
129-
130-
poses = [resolve_prim_pose(stage.GetPrimAtPath(env_path_by_id[int(env_id)])) for env_id in env_ids]
131-
positions = np.asarray([pos for pos, _ in poses], dtype=np.float32)
132-
quaternions = np.asarray([quat for _, quat in poses], dtype=np.float32)
126+
if env_ids is None or clone_plan.positions is None:
127+
raise ValueError("clone plan requires environment ids and positions for visualization")
128+
positions = clone_plan.positions.astype(np.float32, copy=False)
129+
quaternions = np.zeros((len(env_ids), 4), dtype=np.float32)
130+
quaternions[:, 3] = 1.0
133131
# Ignore every deformable on the stage for the world import — not only those under
134132
# clone sources. Otherwise a non-env deformable (e.g. ``/World/Assets/Cloth``) is
135133
# imported here and added again by ``add_shadow_deformables_to_builder``.

source/isaaclab_newton/test/cloner/test_rename_builder_labels.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,7 @@ def test_visualization_builder_disables_collision_pairs(self):
414414
destinations=("/World/envs/env_{}/Robot",),
415415
clone_mask=np.ones((1, 2), dtype=np.bool_),
416416
env_ids=np.arange(2, dtype=np.int64),
417+
positions=np.asarray(((0.0, 0.0, 0.0), (2.0, 0.0, 0.0)), dtype=np.float32),
417418
)
418419
for env_paths, plan, expected_shape_count in (
419420
([], None, 2),
@@ -451,7 +452,7 @@ def test_visualization_builder_uses_clone_plan_sources_and_rewrites_labels(self)
451452
UsdGeom.SetStageUpAxis(stage, UsdGeom.Tokens.z)
452453
self._define_xform(stage, "/World")
453454
self._define_xform(stage, "/World/envs")
454-
env_paths = [(env_id, f"/World/envs/env_{env_id}") for env_id in (0, 1, 2)]
455+
env_paths = [(env_id, f"/World/envs/env_{env_id}") for env_id in (0, 1)]
455456
for env_id, env_path in env_paths:
456457
self._define_xform(stage, env_path, (float(env_id) * 3.0, 0.0, 0.0))
457458
self._define_xform(stage, f"{env_path}/Object")
@@ -463,6 +464,7 @@ def test_visualization_builder_uses_clone_plan_sources_and_rewrites_labels(self)
463464
destinations=("/World/envs/env_{}/Object", "/World/envs/env_{}/Object"),
464465
clone_mask=np.array([[True, False, True], [False, True, False]], dtype=np.bool_),
465466
env_ids=np.array([0, 1, 2], dtype=np.int64),
467+
positions=np.asarray(((0.0, 0.0, 0.0), (3.0, 0.0, 0.0), (6.0, 0.0, 0.0)), dtype=np.float32),
466468
)
467469

468470
with (

0 commit comments

Comments
 (0)