From ae6e4d6dd83ece7487fdf05bd9c67ac4b8f1908f Mon Sep 17 00:00:00 2001 From: yuecideng Date: Fri, 23 Oct 2026 00:16:57 +0800 Subject: [PATCH 01/10] fix(sim)!: unify visual material identity and lifecycle Share PBR lowering and definition identity between runtime creation and Spawn, preserve native instance state, and restore assignments across reset and topology rebuilds. Bound randomization resources and isolate selected environments, with rc1 CPU/native regression coverage and an acceptance plan. BREAKING CHANGE: material color reads return RGB; unnamed materials no longer share default_mat; repeated instance creation preserves state; shared material randomization requires all environments. --- agent_context/MAP.yaml | 5 +- .../topics/randomization/randomization.md | 7 + .../topics/simulation-system/lifecycle.md | 3 +- .../topics/simulation-system/materials.md | 55 +++ .../simulation-system/simulation-system.md | 1 + .../visual-material-acceptance.md | 130 ++++++ .../gym/envs/managers/randomization/visual.py | 148 ++++--- embodichain/lab/sim/material.py | 281 +++++++++---- embodichain/lab/sim/objects/articulation.py | 15 +- embodichain/lab/sim/objects/rigid_object.py | 11 +- .../lab/sim/objects/rigid_object_group.py | 13 +- embodichain/lab/sim/sim_manager.py | 36 +- embodichain/lab/sim/spawn/descriptors.py | 33 +- embodichain/lab/sim/spawn/scene.py | 67 ++- .../test_randomize_visual_material.py | 121 +++++- tests/sim/objects/test_articulation.py | 18 +- .../test_articulation_reuse_material.py | 1 + .../test_asset_material_initialization.py | 1 + tests/sim/objects/test_rigid_object.py | 18 +- .../test_rigid_object_reuse_material.py | 4 + tests/sim/spawn/test_scene.py | 118 ++++++ tests/sim/test_material.py | 388 ++++++++++++++++++ tests/sim/test_material_integration.py | 242 +++++++++++ 23 files changed, 1509 insertions(+), 207 deletions(-) create mode 100644 agent_context/topics/simulation-system/materials.md create mode 100644 docs/architecture/visual-material-acceptance.md create mode 100644 tests/sim/test_material.py create mode 100644 tests/sim/test_material_integration.py diff --git a/agent_context/MAP.yaml b/agent_context/MAP.yaml index 3ee3cabf7..d22f9b0a8 100644 --- a/agent_context/MAP.yaml +++ b/agent_context/MAP.yaml @@ -11,7 +11,7 @@ topics: aliases: [simulation system, simulation manager, Newton physics backend, motion module, sim motion, camera attachment, 运动能力模块, 仿真系统, 仿真管理器] keywords: [SimulationManager, SimulationManagerCfg, RenderCfg, DenoisingCfg, DenoisingMode, DLSSCfg, NRDCfg, DLSS, NRD, frame_time_delta_ms, explicit physics stepping, arena, DexSim, PhysicsBackendCfg, - DefaultPhysicsCfg, NewtonPhysicsCfg, VisualObject, VisualObjectCfg, UsdSourceCfg, source_prim_path, add_visual_object, 纯渲染对象, AutoSolverCfg, DexUniSolverCfg, DexUni, runtime control, deformable, particle set, + DefaultPhysicsCfg, NewtonPhysicsCfg, VisualObject, VisualObjectCfg, VisualMaterial, VisualMaterialCfg, VisualMaterialInst, UsdSourceCfg, source_prim_path, add_visual_object, 纯渲染对象, AutoSolverCfg, DexUniSolverCfg, DexUni, runtime control, deformable, particle set, ArticulationJointKinematics, get_parent_joint_chain, asset_physics_mode, joint_drive_props, enable_gravity, fixed-cadence playback, quaternion, xyzw] paths: [topics/simulation-system/simulation-system.md] @@ -24,6 +24,7 @@ topics: - embodichain/lab/sim/cfg/ - embodichain/lab/sim/physics/ - embodichain/lab/sim/spawn/ + - embodichain/lab/sim/material.py - embodichain/lab/sim/common.py - embodichain/lab/sim/_startup_summary.py - embodichain/lab/sim/_runtime_controls.py @@ -34,7 +35,7 @@ topics: - embodichain/lab/sim/objects/gizmo.py - embodichain/lab/gym/envs/base_env.py watch_paths: [embodichain/lab/sim/sim_manager.py, embodichain/lab/sim/cfg/, embodichain/lab/sim/physics/, - embodichain/lab/sim/spawn/, embodichain/lab/sim/objects/, tests/sim/] + embodichain/lab/sim/spawn/, embodichain/lab/sim/material.py, embodichain/lab/sim/objects/, tests/sim/] related_topics: [env-framework, robot-system, sensor-system, sim-visualization, ik-solvers, motion-planning, atomic-actions, rl-learning, configclass-pattern, robot-workspace] status: active diff --git a/agent_context/topics/randomization/randomization.md b/agent_context/topics/randomization/randomization.md index 57ea08481..3d22d66a2 100644 --- a/agent_context/topics/randomization/randomization.md +++ b/agent_context/topics/randomization/randomization.md @@ -62,6 +62,13 @@ randomization remains active. See the owning - Camera extrinsics auto-detect the representation and frame: if `extrinsics.eye` is set → look-at mode (eye/target/up perturbation via `look_at`); otherwise → pose mode (pos/euler perturbation via `set_local_pose`), with `extrinsics.parent` selecting parent-relative pose and `parent=None` selecting arena-frame pose. - `set_rigid_object_visual_material` is deterministic (not random) but uses the same functor mechanism for fixed material assignment at reset. +- Visual material randomization preserves selected environments. Shared material + instances require a full-environment selection and are mutated once per call; + partial shared selections fail before mutation. Empty selections are no-ops. + Solid and library tiers apply configured scalar PBR ranges. Texture pools use + normalized source paths and remain bounded after initialization. See + [material identity and lifetime](../simulation-system/materials.md) for + configuration conversion, instance reuse and topology replay. - Light randomization applies the **same values across all envs** (documented limitation). - HDR indirect-lighting events inform the environment's automatic native-ground visibility; emissive mode does not. See the deployment-owned diff --git a/agent_context/topics/simulation-system/lifecycle.md b/agent_context/topics/simulation-system/lifecycle.md index 7031d6320..e696ada67 100644 --- a/agent_context/topics/simulation-system/lifecycle.md +++ b/agent_context/topics/simulation-system/lifecycle.md @@ -12,7 +12,8 @@ readiness; `spawn/scene.py` owns declaration coordination. The ordering is: native parents. Resolve/configure sources and commit Spawn topology. 2. Apply Default articulation root properties before Direct GPU buffers capture them. Delegate runtime setup to `PhysicsBackend.prepare_spawn_runtime()`. -3. Bind declared facades in place; publish their state through +3. Replay the current per-segment [material assignments](materials.md) captured + before rebuilding, then bind declared facades in place; publish their state through `PhysicsBackend.sync_render_state()` without a physics step. 4. Attach parented cameras and publish the ready topology revision only after every stage succeeds. diff --git a/agent_context/topics/simulation-system/materials.md b/agent_context/topics/simulation-system/materials.md new file mode 100644 index 000000000..7c8f1ec08 --- /dev/null +++ b/agent_context/topics/simulation-system/materials.md @@ -0,0 +1,55 @@ +# Visual materials + +`embodichain/lab/sim/material.py` owns `VisualMaterialCfg`, material templates, +native instance wrappers and segment assignment helpers. Its private +`_material_desc_from_cfg()` validates and normalizes both runtime creation and +`spawn/descriptors.py` lowering. Keep material type and emission semantics at +this shared boundary rather than duplicating conversion in callers. + +## Identity and state + +An unnamed configuration has no shared identity. Spawn derives its name from +the object and normalized appearance; the manager names standalone runtime +creations uniquely. Runtime and Spawn share the definition registry. Explicit +UIDs share only equivalent definitions; conflicting properties fail before +native writes. Equivalent aliases borrow current state without resetting it. +Definitions remain reserved for the World lifetime, including across native +unused-material cleanup. A template retains one wrapper per instance UID. Repeated +creation returns that wrapper without resetting properties; explicit +`set_default_properties()` applies a reset intentionally. + +Wrappers retain the exact native instance, including asset-parsed and reuse +instances. Every setter uses that handle. Scalar/color reads query native +state; DexSim's color getter supplies display-sRGB RGB, while configuration +and setters accept RGBA. Alpha cannot be verified through that getter. +Segment binding compares native material IDs rather than names. + +## Assignment lifetime + +Objects own their original per-segment assignments and selective reset +baselines. Before a topology rebuild, `SpawnScene` captures current assignments +of bound facades and replays them during binding. This preserves both deliberate +runtime replacements and completed restores even when retained native +descriptors still name an earlier replacement. A failed replay retains its +snapshot for preparation retry; successful replay and close release it. Removal +discards that object's pending entries before a same-UID replacement can bind. + +VisualObject additionally owns pose/visibility replay. Neither material replay +nor rendering advances physics. Native material handles and texture pools must +outlive their bindings and be released before their owning World. + +## Randomization boundary and validation + +[Visual randomization](../randomization/randomization.md) owns bounded native +texture pools, selected-environment sampling and tier choices. Imported asset +materials remain reset baselines; working instances are separate handles. +For repeated updates, prefer pre-created textures from the owning simulation +over per-call Tensor uploads. + +Primary CPU contracts are in `tests/sim/test_material.py`, +`tests/sim/spawn/test_scene.py` and +`tests/gym/envs/managers/test_randomize_visual_material.py`. Native parity, +selective mutation, stable instance capacity and topology replay live in +`tests/sim/test_material_integration.py`. The +[acceptance plan](../../../docs/architecture/visual-material-acceptance.md) +separates these checks from optical image and longer resource qualification. diff --git a/agent_context/topics/simulation-system/simulation-system.md b/agent_context/topics/simulation-system/simulation-system.md index a3ad31b6d..0dbd10542 100644 --- a/agent_context/topics/simulation-system/simulation-system.md +++ b/agent_context/topics/simulation-system/simulation-system.md @@ -10,6 +10,7 @@ | Manager-level backend hooks and capabilities | `embodichain/lab/sim/physics/` | | Object-level Scene batch adapters | `embodichain/lab/sim/objects/backends/scene.py`, `newton.py` | | Object, renderer and physics configuration | `embodichain/lab/sim/cfg/` (`cfg/__init__.py` is the public facade) | +| Visual material configuration, templates and native instances | `embodichain/lab/sim/material.py`; [material identity and lifetime](materials.md) | | Gym lifecycle and task scene construction | `embodichain/lab/gym/envs/base_env.py`, `embodied_env.py` | `embodichain.cli.sim` owns standalone simulation arguments without importing diff --git a/docs/architecture/visual-material-acceptance.md b/docs/architecture/visual-material-acceptance.md new file mode 100644 index 000000000..bf79e4b0f --- /dev/null +++ b/docs/architecture/visual-material-acceptance.md @@ -0,0 +1,130 @@ +# VisualMaterial 设计与正确性验收 + +## 适用版本与运行环境 + +本方案针对 `dexsim_engine==0.5.1rc1`,使用该版本要求的 +`warp-lang==1.17.0`、`newton[sim]==1.6.0`。验收必须读取实际导入环境的版本, +不能用修改包元数据、旧版替身或源码隔离探针替代原生集成结果。 + +本次复现环境为独立虚拟环境 `/tmp/embodichain-material-rc1`,底层 Python 3.10, +GPU 为 NVIDIA GeForce RTX 5090。本机 wheel 来自 +`~/Downloads/build_vcpkg-linux-cuda-py310/build_Release/lib/python_package/pip_package/`。 +其他机器使用同版本、匹配 Python ABI 的正式 wheel,并把下方 `python` 指向对应环境。 + +```bash +python -c 'from importlib.metadata import version; import dexsim; assert version("dexsim-engine") == "0.5.1rc1"; print(dexsim.__file__, version("warp-lang"), version("newton"))' +``` + +## 设计契约 + +- `VisualMaterialCfg` 描述材质;`material.py:_material_desc_from_cfg` 是运行时和 + Spawn 共用的属性校验、发光强度和材质类型转换边界。 +- 未命名材质的 `uid=None`。形状声明使用对象范围及标准化外观指纹生成名字,允许同 UID + 对象更换外观,并复用相同定义;独立运行时创建使用唯一名字。两条路径共用定义注册表, + 显式相同 UID 只允许等价定义复用,不同定义在原生写入前报错。等价别名保留已有运行时编辑。 +- 一个模板内每个 UID 对应一个稳定的 `VisualMaterialInst`。重复创建、查询不修改实例, + 不追加重复登记,也不重复写默认属性。需要重设时显式调用 `set_default_properties`; + 确定性刚体和群组 reset 事件负责这个操作。 +- 实例持有确定的原生句柄。包装导入资产、创建复用实例后,所有 setter 操作同一句柄。 + 材质身份使用原生 material ID,不能仅依赖模板名与实例名。 +- metallic、roughness、IOR 和颜色读取真实原生状态。`0.5.1rc1` 的颜色 getter 只暴露 + display-sRGB 的 RGB,因此 `instance.base_color` 返回 RGB;配置和 + `set_base_color` 继续接收 RGBA。不能根据 getter 声称验证了 alpha。 +- 发光 RGB 与非负强度相乘;零强度可恢复。两条创建路径使用同一转换, + `BRDF/BTDF/BSDF` 都传递给原生材质。 +- 非共享随机化仅影响所选环境;共享随机化要求选择全部环境,并且只采样、修改一次。 + 空选择是无操作;重复、越界或非整数环境索引必须在材质写入前失败。 +- 纯色分支保留有界纹理色板,同时应用配置的 metallic、roughness 和 IOR 范围。 + 相同规范化路径共享纹理缓存;不同路径即使目录同名也不能混用。 +- Spawn 在拓扑重建前保存已绑定对象的当前逐段材质,在绑定阶段重放。 + 保存的是当前状态,reset 基线仍由对象持有。重放失败时保留快照,成功后释放; + 移除对象时丢弃它的待重放记录,不能把旧对象快照写给同 UID 的新对象。 + +## 自动化验收矩阵 + +| 层级 | 用例与独立判据 | 覆盖入口 | 通过标准 | +|---|---|---|---| +| CPU:实例身份 | 同 UID 创建/查询 1,025 次;先修改属性再重复查询 | 模板、实例 | 包装器身份稳定;属性保留;登记容量只与唯一 UID 数有关;缓存命中无原生属性写入 | +| CPU:原生句柄 | 资产包装器对颜色、PBR 和各纹理通道写入 | `from_existing`、工作实例 | 原始句柄接收写入;不再按名字寻找替代实例 | +| CPU:身份比较 | 两个句柄名字相同、material ID 不同 | 逐段赋值 | 必须发生重新绑定;相同 ID 的等价句柄跳过重复绑定 | +| CPU:创建一致性 | 三种材质类型 × 强度 0、1、10;非默认颜色、roughness、metallic、IOR | 运行时与 Spawn | 两条路径提交相同属性;alpha 写入与启用标志保留 | +| CPU:非法输入 | 错误颜色维度、NaN、越界因子、非正 IOR、负发光强度、未知类型 | 两条创建路径 | 原生实例创建前失败 | +| CPU:命名与冲突 | 两个未命名红/蓝材质;显式同 UID 的等价与冲突定义 | Manager、Spawn | 独立材质不串色;等价复用;冲突失败且原注册不变 | +| CPU:跨入口别名 | 两个创建顺序;已有原生属性修改后创建等价运行时别名 | 共用定义注册表、原生默认实例 | 两个方向都拒绝冲突;等价别名不重置属性;Native 默认实例不出现未初始化灰色 | +| CPU:群组 reset | 群组实例修改属性后重放确定性事件 | 群组 setter、固定材质事件 | 所选环境恢复配置;未选环境保留修改 | +| CPU:环境选择 | 空集、非连续选择、共享局部选择、共享全量乱序选择 | 复用与回退路径 | 非目标环境无写入;共享局部选择拒绝;共享全量只修改一次 | +| CPU:随机化参数 | 固定 PBR 范围;仅重置一个关节体环境 | 纯色、纹理库、回退 | 固定范围精确生效;仅为所选环境/链接采样 | +| CPU:资源上界 | 多次调用与两个同名纹理目录 | 纹理缓存、色板 | 预热后无纹理创建;不同来源各自加载;同一来源复用 | +| CPU:重建与失败恢复 | 陈旧原生描述模拟重建;逐段重放中途失败 | 刚体、关节体、体/面可变形对象 | 当前材质逐段恢复;失败后重试成功;成功后快照释放 | +| CPU:失败后替换 | 重放失败后移除,再添加相同 UID、不同段数的新对象 | Spawn 移除与重试 | 旧快照被丢弃;新对象的材质与默认值不被污染 | +| 原生:Hybrid | 两环境,Default 与 Newton;独立红/蓝材质;临时赋值→恢复→增删其他对象 | Manager、Spawn、刚体、纯渲染对象 | 原生颜色/PBR 与配置一致;当前替换和 reset 结果在重建后保留;另一环境不变 | +| 原生:持续复用 | 每个后端执行 1,025 次局部随机化,读取原生模板实例数与最终属性 | 原生工作实例、PBR、选择隔离 | 预热后原生实例数不增长;所选范围生效;未选环境保留原材质 | +| 原生:替换与别名 | 同 UID 改色替换、相同定义重复替换、移除后重加、两个入口的等价别名 | Default 与 Newton | 外观正确改变;相同定义不新增登记;别名不重置已编辑原生属性 | + +浮点比较采用 `pytest.approx`;原生颜色往返绝对容差为 `1e-5`。 +随机化逻辑用固定范围验证参数生效,避免以随机采样“恰好不同”作为测试判据。 +纹理色板的颜色受 uint8 量化及有限色板分布影响,不应要求每次产生任意连续颜色。 + +## 执行命令 + +CPU 与原生测试分开执行,保持原生资源串行使用。 + +```bash +python -m pytest -q -m 'not requires_sim and not gpu' \ + tests/sim/test_material.py tests/sim/test_material_texture_obj.py \ + tests/sim/test_material_cache_config.py \ + tests/sim/objects/test_asset_material_initialization.py \ + tests/sim/objects/test_rigid_object_reuse_material.py \ + tests/sim/objects/test_articulation_reuse_material.py \ + tests/gym/envs/managers/test_randomize_visual_material.py \ + tests/sim/objects/test_visual_object.py \ + tests/sim/spawn tests/sim/test_cfg.py tests/gym/utils/test_gym_utils.py + +python -m pytest -q --run-gpu \ + tests/sim/test_material_integration.py \ + tests/sim/objects/test_visual_object_integration.py::test_render_only_object_native_lifecycle + +python -m black --check . +python docs/scripts/check_api_docs.py +python .agents/skills/project-dev-context/scripts/context.py check +``` + +## 本次执行记录(2026-10-23) + +使用上面的独立环境和真实 rc1 wheel;项目以 editable 方式安装,包含官方机器人与任务扩展。 +CPU 结果中的 4 个 deselected 用例由资源标签排除,不计入通过数。 + +| 检查 | 实际结果 | +|---|---| +| 扩展 CPU 回归(含 Spawn、配置与 Gym 配置加载) | 685 passed,4 deselected,12.37 s | +| 原生 Hybrid / Default + Newton | 4 passed,17.83 s;每个后端包含 1,025 次持续局部随机化 | +| 项目上下文测试 | 42 passed | +| Black 26.3.1 全仓检查 | 1,506 个 Python 文件无需更改 | +| 公共 API 文档覆盖 | 2,805 / 2,805,零遗漏 | +| 上下文链接与路由、diff 空白检查 | 通过 | + +API、引擎生命周期和 HPC 三个独立复核发现的群组 reset、跨入口身份、同 UID 替换、 +失败后快照和等价别名状态问题均已修正并补测。此记录不包含下面的光学图像和长期显存资格项目。 + +## 兼容性与后续发布验收 + +旧配置如果显式保存了 `uid: default_mat`,它现在是一个显式共享名字;需要独立外观时 +删除该字段或指定不同 UID。`get_instance` 和同 UID 的 `create_instance` 返回同一包装器, +不再隐式重置属性;旧调用者若依赖重复创建覆盖属性,应改为显式应用配置。 +读取颜色的调用者应接受原生 RGB;RGBA 写入保持支持。 +`clean_materials()` 清理运行时包装器和未使用的原生缓存,已登记的显式 UID 定义在 World +生命周期内保持身份,避免现有场景或原生句柄被同名不同属性的定义悄悄替换;不同定义使用新 UID。 + +这组测试验收的是材质状态、资源上界和生命周期,不能等同于完整光学图像验收。 +发布时还应在独立 FastRT 进程增加以下资格验证,并保存带环境信息的图片: + +1. 同一灯光、相机、曝光与几何下,BRDF/BTDF/BSDF 的反射和透射表现;透明物体后放置对照色块。 +2. 发光强度 0、1、10 的暗室对照;比较数值与图像,避免仅凭亮度饱和判断强度。 +3. 带多个材质段的 URDF/网格、关节体与可变形对象,在局部 reset 和拓扑重建后保持各段材质。 +4. 文件、Tensor 与原生 Texture 三种输入的颜色空间、法线贴图方向和重复绑定行为。 +5. 记录 10,000 次 reset 的原生实例数、纹理数和 VRAM。区分预热缓存与持续增长, + 不把 Torch 分配器统计当成全部 Vulkan/OptiX 显存。 + +每次验收记录:提交/工作树、实际 wheel 路径与版本、Python/Warp/Newton、GPU/驱动、 +后端与渲染器、命令、通过/失败/跳过项及原因。任何未执行的图像或后端矩阵保持待验证, +不能由 CPU mock 测试替代。 diff --git a/embodichain/lab/gym/envs/managers/randomization/visual.py b/embodichain/lab/gym/envs/managers/randomization/visual.py index 005d2e0d7..7cfa0c0ed 100644 --- a/embodichain/lab/gym/envs/managers/randomization/visual.py +++ b/embodichain/lab/gym/envs/managers/randomization/visual.py @@ -103,6 +103,8 @@ def set_rigid_object_visual_material( mat = env.sim.create_visual_material(mat_cfg) obj: RigidObject = env.sim.get_rigid_object(entity_cfg.uid) obj.set_visual_material(mat, env_ids=env_ids, update_default=True) + for instance in obj.get_visual_material_inst(env_ids=env_ids): + mat.set_default_properties(instance, mat_cfg) def set_rigid_object_group_visual_material( @@ -141,7 +143,7 @@ def set_rigid_object_group_visual_material( mat = env.sim.create_visual_material(mat_cfg) obj: RigidObjectGroup = env.sim.get_rigid_object_group(entity_cfg.uid) - obj.set_visual_material(mat, env_ids=env_ids) + obj.set_visual_material(mat, env_ids=env_ids, reset_properties=True) # Keyed by the camera object, so envs that reuse a camera uid each warn once. @@ -693,7 +695,7 @@ def __init__(self, cfg: FunctorCfg, env: EmbodiedEnv): if texture_path is not None: from embodichain.utils.utility import read_all_folder_images - texture_key = os.path.basename(texture_path) + texture_key = str(Path(texture_path).expanduser().resolve()) # check if the texture group is already loaded in the global texture cache if texture_key in env.sim.get_texture_cache(): logger.log_info( @@ -726,7 +728,9 @@ def __init__(self, cfg: FunctorCfg, env: EmbodiedEnv): self._library_textures: list = [] self._solid_textures: list = [] self._texture_key = ( - os.path.basename(texture_path) if texture_path is not None else "" + str(Path(texture_path).expanduser().resolve()) + if texture_path is not None + else "" ) can_reuse = ( @@ -875,13 +879,15 @@ def _init_legacy(self, env: EmbodiedEnv) -> None: ) self._legacy_mat = mat if isinstance(self.entity, RigidObject): - self.entity.set_visual_material(mat) + self.entity.set_visual_material(mat, shared=self._shared) elif isinstance(self.entity, Articulation): _, link_names = resolve_matching_names( self.entity_cfg.link_names, self.entity.link_names ) self.entity_cfg.link_names = link_names - self.entity.set_visual_material(mat, link_names=link_names) + self.entity.set_visual_material( + mat, link_names=link_names, shared=self._shared + ) self._mat_insts = None if self.entity_cfg.uid == "default_plane": @@ -944,12 +950,26 @@ def _randomize_mat_inst( self._randomize_texture(mat_inst) else: - # Use the bounded solid-color palette. Uploading a generated tensor - # here would allocate a fresh DexSim texture ID on every call. - texture_idx = torch.randint(0, len(self._solid_textures), (1,)).item() - mat_inst.set_base_color_texture( - texture_obj=self._solid_textures[texture_idx] + self._apply_solid_props(mat_inst, plan, idx) + + def _selected_env_ids( + self, env: EmbodiedEnv, env_ids: torch.Tensor | None + ) -> list[int]: + if env_ids is None: + ids = list(range(env.num_envs)) + else: + if env_ids.ndim != 1 or env_ids.dtype not in (torch.int32, torch.int64): + raise ValueError( + "Material environment indices must be a 1D integer tensor." + ) + ids = env_ids.detach().cpu().tolist() + if len(set(ids)) != len(ids) or any(i < 0 or i >= env.num_envs for i in ids): + raise ValueError( + "Material environment indices must be unique and in range." ) + if ids and self._shared and len(ids) != env.num_envs: + raise ValueError("Shared material randomization requires all environments.") + return ids def __call__( self, @@ -995,12 +1015,7 @@ def _call_reuse( ) -> None: if self.entity is None: return - if env_ids is None: - env_ids = torch.arange(env.num_envs, device="cpu") - else: - env_ids = env_ids.cpu() - - selected_env_ids = [int(env_idx) for env_idx in env_ids] + selected_env_ids = self._selected_env_ids(env, env_ids) num_reuse = len(self._reuse_state) # 1 if shared, else num_envs if num_reuse == 0 or not selected_env_ids: return @@ -1011,10 +1026,14 @@ def _call_reuse( is_articulation = isinstance(self.entity, Articulation) tiers = None if is_articulation else self._sample_tiers(num_plan) articulation_tiers = ( - self._sample_articulation_tiers() if is_articulation else None + self._sample_articulation_tiers([0] if self._shared else selected_env_ids) + if is_articulation + else None ) - def _apply(reuse_i: int, env_idx: int, plan_i: int) -> None: + def _apply( + reuse_i: int, env_idx: int, plan_i: int, update_properties: bool = True + ) -> None: if is_articulation: self._apply_tier_articulation( reuse_i, @@ -1022,21 +1041,26 @@ def _apply(reuse_i: int, env_idx: int, plan_i: int) -> None: articulation_tiers[reuse_i], plan, plan_i, + update_properties=update_properties, ) else: tier = int(tiers[plan_i].item()) self._apply_tier_rigid( - self._reuse_state[reuse_i], env_idx, tier, plan, plan_i + self._reuse_state[reuse_i], + env_idx, + tier, + plan, + plan_i, + update_properties=update_properties, ) if self._shared: - # single reuse state applied to every env - for env_idx in selected_env_ids: - _apply(0, env_idx, 0) + # Sample and mutate the shared instance once; only attachment repeats. + for i, env_idx in enumerate(selected_env_ids): + _apply(0, env_idx, 0, update_properties=i == 0) else: for plan_i, env_idx in enumerate(selected_env_ids): - reuse_i = env_idx if env_idx < num_reuse else 0 - _apply(reuse_i, env_idx, plan_i) + _apply(env_idx, env_idx, plan_i) def _sample_plan( self, num, base_color_range, metallic_range, roughness_range, ior_range @@ -1076,13 +1100,16 @@ def _sample_tiers(self, num_reuse: int) -> torch.Tensor: ) return torch.multinomial(probs, num_samples=num_reuse, replacement=True) - def _sample_articulation_tiers(self) -> list[dict[str, int]]: - """Sample an independent material tier for every articulation link.""" - tier_plans = [] - for link_map in self._reuse_state: + def _sample_articulation_tiers( + self, env_ids: list[int] + ) -> dict[int, dict[str, int]]: + """Sample only selected environments and their articulation links.""" + tier_plans = {} + for env_idx in env_ids: + link_map = self._reuse_state[env_idx] link_names = list(link_map) sampled = self._sample_tiers(len(link_names)).tolist() - tier_plans.append(dict(zip(link_names, sampled))) + tier_plans[env_idx] = dict(zip(link_names, sampled)) return tier_plans def _apply_inst(self, env_idx, mat_inst, mesh_id, link_name=None) -> None: @@ -1094,16 +1121,19 @@ def _apply_inst(self, env_idx, mat_inst, mesh_id, link_name=None) -> None: env_idx, mat_inst, link_name, mesh_id ) - def _apply_tier_rigid(self, segments, env_idx, tier, plan, idx) -> None: + def _apply_tier_rigid( + self, segments, env_idx, tier, plan, idx, *, update_properties: bool = True + ) -> None: if not segments: return if tier == 0: # original self._restore_original(segments, env_idx) return - if tier == 1 and self._library_textures: # library - self._apply_library_props(segments[0].working_inst, plan, idx) - else: # solid (or library with empty library) - self._apply_solid_props(segments[0].working_inst, plan, idx) + if update_properties: + if tier == 1 and self._library_textures: # library + self._apply_library_props(segments[0].working_inst, plan, idx) + else: # solid (or library with empty library) + self._apply_solid_props(segments[0].working_inst, plan, idx) self._attach_working(segments, env_idx) def _apply_library_props(self, working_inst, plan, idx) -> None: @@ -1114,8 +1144,14 @@ def _apply_library_props(self, working_inst, plan, idx) -> None: def _apply_solid_props(self, working_inst, plan, idx) -> None: texture_idx = torch.randint(0, len(self._solid_textures), (1,)).item() working_inst.set_base_color([1.0, 1.0, 1.0, 1.0]) - working_inst.set_metallic(0.0) - working_inst.set_roughness(0.7) + working_inst.set_metallic( + plan["metallic"][idx].item() if "metallic" in plan else 0.0 + ) + working_inst.set_roughness( + plan["roughness"][idx].item() if "roughness" in plan else 0.7 + ) + if "ior" in plan: + working_inst.set_ior(plan["ior"][idx].item()) working_inst.set_base_color_texture( texture_obj=self._solid_textures[texture_idx] ) @@ -1139,7 +1175,9 @@ def _apply_plan_props(self, working_inst, plan, idx) -> None: if "ior" in plan: working_inst.set_ior(plan["ior"][idx].item()) - def _apply_tier_articulation(self, reuse_i, env_idx, tiers, plan, plan_i) -> None: + def _apply_tier_articulation( + self, reuse_i, env_idx, tiers, plan, plan_i, *, update_properties: bool = True + ) -> None: link_map = self._reuse_state[reuse_i] # Dict[str, List[ReuseSegmentState]] for link_name, segments in link_map.items(): if not segments: @@ -1148,10 +1186,11 @@ def _apply_tier_articulation(self, reuse_i, env_idx, tiers, plan, plan_i) -> Non if tier == 0: # original self._restore_original(segments, env_idx, link_name) continue - if tier == 1 and self._library_textures: # library - self._apply_library_props(segments[0].working_inst, plan, plan_i) - else: # solid - self._apply_solid_props(segments[0].working_inst, plan, plan_i) + if update_properties: + if tier == 1 and self._library_textures: # library + self._apply_library_props(segments[0].working_inst, plan, plan_i) + else: # solid + self._apply_solid_props(segments[0].working_inst, plan, plan_i) self._attach_working(segments, env_idx, link_name) def _call_legacy( @@ -1168,11 +1207,9 @@ def _call_legacy( if self.entity_cfg.uid != "default_plane" and self.entity is None: return - if env_ids is None: - env_ids = torch.arange(env.num_envs, device="cpu") - else: - env_ids = env_ids.cpu() - + env_ids = self._selected_env_ids(env, env_ids) + if not env_ids: + return if self.entity_cfg.uid == "default_plane": env_ids = [0] @@ -1181,30 +1218,30 @@ def _call_legacy( base_color = sample_uniform( lower=torch.tensor(base_color_range[0], dtype=torch.float32), upper=torch.tensor(base_color_range[1], dtype=torch.float32), - size=(len(env_ids), 3), + size=(1 if self._shared else len(env_ids), 3), ) - alpha_channel = torch.ones((len(env_ids), 1), dtype=torch.float32) + alpha_channel = torch.ones((base_color.shape[0], 1), dtype=torch.float32) base_color = torch.cat((base_color, alpha_channel), dim=1) randomize_plan["base_color"] = base_color if metallic_range: metallic = sample_uniform( lower=torch.tensor(metallic_range[0], dtype=torch.float32), upper=torch.tensor(metallic_range[1], dtype=torch.float32), - size=(len(env_ids), 1), + size=(1 if self._shared else len(env_ids), 1), ) randomize_plan["metallic"] = metallic if roughness_range: roughness = sample_uniform( lower=torch.tensor(roughness_range[0], dtype=torch.float32), upper=torch.tensor(roughness_range[1], dtype=torch.float32), - size=(len(env_ids), 1), + size=(1 if self._shared else len(env_ids), 1), ) randomize_plan["roughness"] = roughness if ior_range: ior = sample_uniform( lower=torch.tensor(ior_range[0], dtype=torch.float32), upper=torch.tensor(ior_range[1], dtype=torch.float32), - size=(len(env_ids), 1), + size=(1 if self._shared else len(env_ids), 1), ) randomize_plan["ior"] = ior @@ -1222,7 +1259,9 @@ def _call_legacy( selected_env_ids = [int(env_idx) for env_idx in env_ids] if isinstance(self.entity, RigidObject): - self.entity.set_visual_material(self._legacy_mat, env_ids=selected_env_ids) + self.entity.set_visual_material( + self._legacy_mat, env_ids=selected_env_ids, shared=self._shared + ) self._mat_insts = self.entity.get_visual_material_inst( env_ids=selected_env_ids ) @@ -1231,13 +1270,16 @@ def _call_legacy( self._legacy_mat, env_ids=selected_env_ids, link_names=self.entity_cfg.link_names, + shared=self._shared, ) self._mat_insts = self.entity.get_visual_material_inst( env_ids=selected_env_ids, link_names=self.entity_cfg.link_names, ) - for i, data in enumerate(self._mat_insts): + for i, data in enumerate( + self._mat_insts[:1] if self._shared else self._mat_insts + ): if isinstance(self.entity, RigidObject): mat: VisualMaterialInst = data elif isinstance(self.entity, Articulation): diff --git a/embodichain/lab/sim/material.py b/embodichain/lab/sim/material.py index d88c0410f..3a85db3e1 100644 --- a/embodichain/lab/sim/material.py +++ b/embodichain/lab/sim/material.py @@ -17,17 +17,22 @@ from __future__ import annotations import copy +import math import torch import dexsim import numpy as np from dataclasses import dataclass -from typing import Dict, Union -from functools import cached_property +from collections.abc import Sequence +from typing import TYPE_CHECKING +from uuid import uuid4 from dexsim.engine import MaterialInst, Material from embodichain.utils import configclass, logger +if TYPE_CHECKING: + from dexsim.spawn import MaterialDesc + __all__ = [ "VisualMaterialCfg", "VisualMaterial", @@ -40,10 +45,11 @@ class VisualMaterialCfg: """Configuration for visual material with PBR properties for rasterization and ray tracing.""" - uid: str = "default_mat" + uid: str | None = None + """Explicit shared identity, or None for an automatically named material.""" # Basic PBR properties - base_color: list = [0.5, 0.5, 0.5, 1.0] + base_color: list[float] = [0.5, 0.5, 0.5, 1.0] """Base color/diffuse color (RGBA)""" metallic: float = 0.0 @@ -53,23 +59,23 @@ class VisualMaterialCfg: """Surface roughness (0.0 = smooth, 1.0 = rough)""" # Additional PBR properties - emissive: list = [0.0, 0.0, 0.0] # Emissive color (RGB) + emissive: list[float] = [0.0, 0.0, 0.0] # Emissive color (RGB) emissive_intensity: float = 1.0 # Emissive intensity multiplier # Texture maps - base_color_texture: str = None + base_color_texture: str | None = None """Base color texture map""" - metallic_texture: str = None + metallic_texture: str | None = None """Metallic map""" - roughness_texture: str = None + roughness_texture: str | None = None """Roughness map""" - normal_texture: str = None + normal_texture: str | None = None """Normal map""" - ao_texture: str = None + ao_texture: str | None = None """Ambient occlusion map""" # Ray tracing specific properties @@ -94,6 +100,67 @@ def from_dict(cls, cfg_dict: dict) -> VisualMaterialCfg: return base +_MATERIAL_TYPES = { + "BRDF": "BRDF_GGX_SMITH", + "BTDF": "BTDF_GGX_SMITH", + "BSDF": "BSDF_GGX_SMITH", +} + + +def _material_scalar( + value: float, name: str, *, lower: float = 0.0, upper: float | None = None +) -> float: + value = float(value) + if ( + not math.isfinite(value) + or value < lower + or (upper is not None and value > upper) + ): + raise ValueError(f"Visual material {name} has an invalid value: {value}.") + return value + + +def _material_color(value: Sequence[float], name: str, size: int) -> tuple[float, ...]: + if len(value) != size: + raise ValueError(f"Visual material {name} must have {size} components.") + return tuple(_material_scalar(v, name) for v in value) + + +def _material_desc_from_cfg(cfg: VisualMaterialCfg, uid: str) -> MaterialDesc: + """Normalize both declaration and runtime material creation at one boundary.""" + from dexsim.spawn import MaterialDesc + + if not isinstance(uid, str) or not uid.strip(): + raise ValueError("Visual material uid must be a nonempty string.") + if cfg.material_type not in _MATERIAL_TYPES: + raise ValueError(f"Invalid visual material_type {cfg.material_type!r}.") + color = _material_color(cfg.base_color, "base_color (RGBA)", 4) + _material_scalar(color[3], "base_color alpha", upper=1.0) + emissive = _material_color(cfg.emissive, "emissive (RGB)", 3) + intensity = _material_scalar(cfg.emissive_intensity, "emissive_intensity") + ior = _material_scalar(cfg.ior, "ior") + if ior == 0: + raise ValueError("Visual material ior must be positive.") + return MaterialDesc( + name=uid, + base_color=color, + base_color_map=cfg.base_color_texture, + metallic=_material_scalar(cfg.metallic, "metallic", upper=1.0), + metallic_map=cfg.metallic_texture, + roughness=_material_scalar(cfg.roughness, "roughness", upper=1.0), + roughness_map=cfg.roughness_texture, + normal_map=cfg.normal_texture, + ao_map=cfg.ao_texture, + emissive=( + *(_material_scalar(v * intensity, "emissive") for v in emissive), + 1.0, + ), + ior=ior, + material_type=_MATERIAL_TYPES[cfg.material_type], + has_alpha=True, + ) + + class VisualMaterial: """Visual material definition in the simulation environment. @@ -107,25 +174,34 @@ class VisualMaterial: "BSDF", ] - MAT_TYPE_MAPPING: Dict[str, str] = { - "BRDF": "BRDF_GGX_SMITH", - "BTDF": "BTDF_GGX_SMITH", - "BSDF": "BSDF_GGX_SMITH", - } - - def __init__(self, cfg: VisualMaterialCfg, mat: Material): - if cfg.material_type not in self.RT_MATERIAL_TYPES: - logger.log_error( - f"Invalid material_type '{cfg.material_type}'. " - f"Supported types: {self.RT_MATERIAL_TYPES}" - ) + MAT_TYPE_MAPPING: dict[str, str] = _MATERIAL_TYPES - self.uid = cfg.uid + def __init__( + self, cfg: VisualMaterialCfg, mat: Material, *, initialize_default: bool = True + ) -> None: + """Create a template wrapper or borrow an already configured native one. + + Args: + cfg: Defaults for newly created material instances. + mat: Native template owned by the simulation. + initialize_default: Apply configuration to the native default instance. + Disable for a known existing template to preserve runtime edits. + """ + self.uid = cfg.uid or f"visual_material_{uuid4().hex}" + _material_desc_from_cfg(cfg, self.uid) self.cfg = copy.deepcopy(cfg) + self.cfg.uid = self.uid self._mat = mat - self._mat_inst_list: list[str] = [] + self._instances: dict[str, VisualMaterialInst] = {} - self._default_mat_inst = self.create_instance(self.uid) + # Spawn resolves a named template through its native default instance. + # Keep that entry configured too when runtime and declarations share a UID. + self._default_mat_inst = VisualMaterialInst( + self.uid, self._mat, mat_inst=self._mat.get_inst() + ) + if initialize_default: + self.set_default_properties(self._default_mat_inst, self.cfg) + self._instances[self.uid] = self._default_mat_inst @property def mat(self) -> Material: @@ -138,11 +214,17 @@ def inst(self) -> VisualMaterialInst: def set_default_properties( self, mat_inst: VisualMaterialInst, cfg: VisualMaterialCfg ) -> None: - mat_inst.set_base_color(cfg.base_color) - mat_inst.set_metallic(cfg.metallic) - mat_inst.set_roughness(cfg.roughness) - mat_inst.set_emissive(cfg.emissive) - # mat_inst.set_emissive_intensity(self.cfg.emissive_intensity) # Unimplemented + """Explicitly apply validated configuration to an existing instance. + + Args: + mat_inst: Instance whose properties will be replaced. + cfg: Material properties to apply. + """ + desc = _material_desc_from_cfg(cfg, self.uid) + mat_inst.set_base_color(desc.base_color) + mat_inst.set_metallic(desc.metallic) + mat_inst.set_roughness(desc.roughness) + mat_inst._set_emissive(cfg.emissive, cfg.emissive_intensity) mat_inst.set_base_color_texture(cfg.base_color_texture) mat_inst.set_metallic_texture(cfg.metallic_texture) @@ -150,8 +232,8 @@ def set_default_properties( mat_inst.set_normal_texture(cfg.normal_texture) mat_inst.set_ao_texture(cfg.ao_texture) - mat_inst.set_ior(cfg.ior) - mat_inst.mat.update_pbr_material_type(self.MAT_TYPE_MAPPING[cfg.material_type]) + mat_inst.set_ior(desc.ior) + mat_inst.mat.update_pbr_material_type(desc.material_type) def create_instance(self, uid: str) -> VisualMaterialInst: """Create a new material instance from this material template. @@ -165,11 +247,11 @@ def create_instance(self, uid: str) -> VisualMaterialInst: Returns: VisualMaterialInst: The created material instance. """ + if uid in self._instances: + return self._instances[uid] inst = VisualMaterialInst(uid, self._mat) - # TODO: Support change default properties for material. - # This will improve the instance creation efficiency. self.set_default_properties(inst, self.cfg) - self._mat_inst_list.append(uid) + self._instances[uid] = inst return inst def get_default_instance(self) -> VisualMaterialInst: @@ -189,9 +271,9 @@ def get_instance(self, uid: str) -> VisualMaterialInst: Returns: VisualMaterialInst: The material instance. """ - if uid not in self._mat_inst_list: + if uid not in self._instances: logger.log_error(f"Material instance with uid '{uid}' does not exist.") - return VisualMaterialInst(uid, self._mat) + return self._instances[uid] class VisualMaterialInst: @@ -205,21 +287,14 @@ def __init__( ) -> None: self.uid = uid self._mat = mat - self._mat_inst = mat_inst - - # Init properties with default values - self.base_color = [0.5, 0.5, 0.5, 1.0] - self.metallic = 0.0 - self.roughness = 0.5 - self.emissive = [0.0, 0.0, 0.0] - self.emissive_intensity = 1.0 - self.base_color_texture = None + self._mat_inst = mat_inst if mat_inst is not None else mat.get_inst(uid) + self._emissive_rgb: tuple[float, ...] | None = None + self._emissive_intensity = 1.0 + self.base_color_texture = self.mat.get_base_color_map() self.metallic_texture = None self.roughness_texture = None self.normal_texture = None self.ao_texture = None - self.ior = 1.5 - # self.subsurface = 0.0 @classmethod def from_existing(cls, mat_inst: MaterialInst) -> VisualMaterialInst: @@ -241,39 +316,71 @@ def from_existing(cls, mat_inst: MaterialInst) -> VisualMaterialInst: @property def mat(self) -> MaterialInst: - existing_inst = getattr(self, "_mat_inst", None) - if existing_inst is not None: - return existing_inst - return self._mat.get_inst(self.uid) + return self._mat_inst + + @property + def base_color(self) -> list[float]: + """Current native display-sRGB color (RGB); DexSim exposes no alpha getter.""" + return [float(v) for v in self.mat.get_base_color()[:3]] + + @property + def metallic(self) -> float: + """Current native metallic factor.""" + return float(self.mat.get_metallic()) + + @property + def roughness(self) -> float: + """Current native roughness.""" + return float(self.mat.get_roughness()) - def set_base_color(self, color: list) -> None: + @property + def ior(self) -> float: + """Current native index of refraction.""" + return float(self.mat.get_ior()) + + @property + def emissive(self) -> list[float]: + """Unscaled emissive RGB, including when intensity is zero.""" + if self._emissive_intensity == 0 and self._emissive_rgb is not None: + return list(self._emissive_rgb) + return [ + float(v) / self._emissive_intensity for v in self.mat.get_emissive()[:3] + ] + + @property + def emissive_intensity(self) -> float: + """Multiplier applied to emissive RGB by this wrapper.""" + return self._emissive_intensity + + def set_base_color(self, color: Sequence[float]) -> None: """Set base color/diffuse color.""" - self.base_color = color - self.mat.set_base_color(color) + color = _material_color(color, "base_color (RGBA)", 4) + _material_scalar(color[3], "base_color alpha", upper=1.0) + self.mat.set_base_color(list(color)) def set_metallic(self, metallic: float) -> None: """Set metallic factor.""" - self.metallic = metallic - inst = self._mat.get_inst(self.uid) - inst.set_metallic(metallic) + self.mat.set_metallic(_material_scalar(metallic, "metallic", upper=1.0)) def set_roughness(self, roughness: float) -> None: """Set surface roughness.""" - self.roughness = roughness - inst = self._mat.get_inst(self.uid) - inst.set_roughness(roughness) + self.mat.set_roughness(_material_scalar(roughness, "roughness", upper=1.0)) - def set_emissive(self, emissive: list) -> None: + def set_emissive(self, emissive: Sequence[float]) -> None: """Set emissive color.""" - self.emissive = emissive - value = np.zeros(4) - value[0:3] = emissive - inst = self._mat.get_inst(self.uid) - inst.set_emissive(value) + self._set_emissive(emissive, self._emissive_intensity) + + def _set_emissive(self, emissive: Sequence[float], intensity: float) -> None: + rgb = _material_color(emissive, "emissive (RGB)", 3) + intensity = _material_scalar(intensity, "emissive_intensity") + value = [_material_scalar(v * intensity, "emissive") for v in rgb] + self.mat.set_emissive(np.asarray([*value, 1.0])) + self._emissive_rgb = rgb + self._emissive_intensity = intensity def set_emissive_intensity(self, intensity: float) -> None: """Set emissive intensity multiplier.""" - logger.log_error("Unimplemented: set_emissive_intensity") + self._set_emissive(self.emissive, intensity) def set_base_color_texture( self, @@ -298,15 +405,15 @@ def set_base_color_texture( if texture_path is not None: self.base_color_texture = texture_path - inst = self._mat.get_inst(self.uid) + inst = self.mat inst.set_base_color_map(texture_path) elif texture_obj is not None: self.base_color_texture = texture_obj - inst = self._mat.get_inst(self.uid) + inst = self.mat inst.set_base_color_map(texture_obj) elif texture_data is not None: self.base_color_texture = texture_data - inst = self._mat.get_inst(self.uid) + inst = self.mat # TODO: Optimize texture creation method. world = dexsim.default_world() @@ -332,11 +439,11 @@ def set_metallic_texture( if texture_path is not None: self.metallic_texture = texture_path - inst = self._mat.get_inst(self.uid) + inst = self.mat inst.set_metallic_map(texture_path) elif texture_data is not None: self.metallic_texture = texture_data - inst = self._mat.get_inst(self.uid) + inst = self.mat # TODO: Optimize texture creation method. world = dexsim.default_world() @@ -362,11 +469,11 @@ def set_roughness_texture( if texture_path is not None: self.roughness_texture = texture_path - inst = self._mat.get_inst(self.uid) + inst = self.mat inst.set_roughness_map(texture_path) elif texture_data is not None: self.roughness_texture = texture_data - inst = self._mat.get_inst(self.uid) + inst = self.mat # TODO: Optimize texture creation method. world = dexsim.default_world() @@ -392,11 +499,11 @@ def set_normal_texture( if texture_path is not None: self.normal_texture = texture_path - inst = self._mat.get_inst(self.uid) + inst = self.mat inst.set_normal_map(texture_path) elif texture_data is not None: self.normal_texture = texture_data - inst = self._mat.get_inst(self.uid) + inst = self.mat # TODO: Optimize texture creation method. world = dexsim.default_world() @@ -422,11 +529,11 @@ def set_ao_texture( if texture_path is not None: self.ao_texture = texture_path - inst = self._mat.get_inst(self.uid) + inst = self.mat inst.set_ao_map(texture_path) elif texture_data is not None: self.ao_texture = texture_data - inst = self._mat.get_inst(self.uid) + inst = self.mat # TODO: Optimize texture creation method. world = dexsim.default_world() @@ -439,9 +546,10 @@ def set_ao_texture( def set_ior(self, ior: float) -> None: """Set index of refraction.""" - self.ior = ior - inst = self._mat.get_inst(self.uid) - inst.set_pbr_param("ior", ior) + ior = _material_scalar(ior, "ior") + if ior == 0: + raise ValueError("Visual material ior must be positive.") + self.mat.set_pbr_param("ior", ior) @dataclass @@ -492,14 +600,7 @@ def _is_same_material_inst( return True if current_inst is None or original_inst is None: return False - current_template = current_inst.get_template() - original_template = original_inst.get_template() - return ( - current_inst.get_name() == original_inst.get_name() - and current_template is not None - and original_template is not None - and current_template.get_name() == original_template.get_name() - ) + return current_inst.get_material_id() == original_inst.get_material_id() def _set_render_material(render_body, mesh_id: int, mat_inst: MaterialInst) -> None: diff --git a/embodichain/lab/sim/objects/articulation.py b/embodichain/lab/sim/objects/articulation.py index a17c39fd6..902e3296e 100644 --- a/embodichain/lab/sim/objects/articulation.py +++ b/embodichain/lab/sim/objects/articulation.py @@ -38,6 +38,7 @@ from embodichain.lab.sim import VisualMaterialInst, VisualMaterial, ReuseSegmentState from embodichain.lab.sim.material import ( _capture_render_materials, + _is_same_material_inst, _restore_render_materials, _set_render_material, _wrap_first_render_material, @@ -3407,8 +3408,10 @@ def get_existing_visual_material( ) if working_inst is None: working_name = f"{self.uid}_reuse_{env_idx}_{link_name}" - template.create_inst(working_name) - working_inst = VisualMaterialInst(working_name, template) + native_inst = template.create_inst(working_name) + working_inst = VisualMaterialInst( + working_name, template, mat_inst=native_inst + ) segments.append( ReuseSegmentState( mesh_id=mesh_id, @@ -3438,6 +3441,14 @@ def apply_render_material_inst( _set_render_material( self._entities[env_idx].get_render_body(link_name), mesh_id, mat_inst ) + if mesh_id == 0: + current = self._visual_material[env_idx].get(link_name) + if current is None or not _is_same_material_inst(current.mat, mat_inst): + wrapped = _wrap_first_render_material([mat_inst]) + if wrapped is None: + self._visual_material[env_idx].pop(link_name, None) + else: + self._visual_material[env_idx][link_name] = wrapped def set_physical_visible( self, diff --git a/embodichain/lab/sim/objects/rigid_object.py b/embodichain/lab/sim/objects/rigid_object.py index 64ea84d4b..e56ca6abc 100644 --- a/embodichain/lab/sim/objects/rigid_object.py +++ b/embodichain/lab/sim/objects/rigid_object.py @@ -72,6 +72,7 @@ ) from embodichain.lab.sim.material import ( _capture_render_materials, + _is_same_material_inst, _restore_render_materials, _set_render_material, _wrap_first_render_material, @@ -1585,8 +1586,10 @@ def get_existing_visual_material( ) if working_inst is None: working_name = f"{self.uid}_reuse_{env_idx}" - template.create_inst(working_name) - working_inst = VisualMaterialInst(working_name, template) + native_inst = template.create_inst(working_name) + working_inst = VisualMaterialInst( + working_name, template, mat_inst=native_inst + ) segments.append( ReuseSegmentState( mesh_id=mesh_id, @@ -1613,6 +1616,10 @@ def apply_render_material_inst( _set_render_material( self._entities[env_idx].get_render_body(), mesh_id, mat_inst ) + if mesh_id == 0: + current = self._visual_material[env_idx] + if current is None or not _is_same_material_inst(current.mat, mat_inst): + self._visual_material[env_idx] = _wrap_first_render_material([mat_inst]) def share_visual_material_inst(self, mat_insts: List[VisualMaterialInst]) -> None: """Share material instances for the rigid object. diff --git a/embodichain/lab/sim/objects/rigid_object_group.py b/embodichain/lab/sim/objects/rigid_object_group.py index 16eb3ac3d..5d17b1374 100644 --- a/embodichain/lab/sim/objects/rigid_object_group.py +++ b/embodichain/lab/sim/objects/rigid_object_group.py @@ -648,11 +648,22 @@ def set_visual_material( self, mat: VisualMaterial, env_ids: Sequence[int] | None = None, + *, + reset_properties: bool = False, ) -> None: - """Assign one material instance to all members in each selected env.""" + """Assign one material instance to all members in each selected env. + + Args: + mat: Material template to assign. + env_ids: Environments to change, or all environments. + reset_properties: Explicitly restore template properties on selected + instances, as required by deterministic material reset events. + """ env, _, _ = self._selected_indices(env_ids) for env_id in env: material = mat.create_instance(f"{mat.uid}_{self.uid}_{env_id}") + if reset_properties: + mat.set_default_properties(material, mat.cfg) for entity in self._entities[env_id]: entity.set_material(material.mat) diff --git a/embodichain/lab/sim/sim_manager.py b/embodichain/lab/sim/sim_manager.py index 2e0fcbb20..934f27518 100644 --- a/embodichain/lab/sim/sim_manager.py +++ b/embodichain/lab/sim/sim_manager.py @@ -29,6 +29,7 @@ import warp as wp from pathlib import Path +from uuid import uuid4 from copy import deepcopy from datetime import datetime from functools import cached_property, partial @@ -134,6 +135,7 @@ def _is_usd_path(path: object | None) -> bool: ) from embodichain.lab.sim.spawn.scene import SpawnScene from embodichain.lab.sim import VisualMaterial, VisualMaterialCfg +from embodichain.lab.sim.material import _material_desc_from_cfg from embodichain.lab.sim.profiler import Profiler, ProfilerCfg from embodichain.lab.visualization.cfg import VisualizationCfg from embodichain.utils import configclass, logger @@ -4814,19 +4816,31 @@ def create_visual_material(self, cfg: VisualMaterialCfg) -> VisualMaterial: """ self._require_native_renderer("Native visual materials") + cfg = cfg.replace(uid=cfg.uid or f"visual_material_{uuid4().hex}") + descriptor = _material_desc_from_cfg(cfg, cfg.uid) + definitions = self._spawn_scene.builder.materials + registered = definitions.get(cfg.uid) + if registered is not None and registered != descriptor: + raise ValueError(f"Conflicting visual material definition for {cfg.uid!r}.") if cfg.uid in self._visual_materials: - logger.log_warning( - f"Visual material {cfg.uid} already exists. Returning the existing one." - ) - return self._visual_materials[cfg.uid] + existing = self._visual_materials[cfg.uid] + if _material_desc_from_cfg(existing.cfg, cfg.uid) != descriptor: + raise ValueError( + f"Conflicting visual material definition for {cfg.uid!r}." + ) + return existing - mat: Material = self._env.create_pbr_material(cfg.uid, True) - visual_mat = VisualMaterial(cfg, mat) + mat: Material | None = self._env.find_material(cfg.uid) + initialize_default = mat is None or registered is None + if mat is None: + mat = self._env.create_pbr_material(cfg.uid, True) + visual_mat = VisualMaterial(cfg, mat, initialize_default=initialize_default) + definitions[cfg.uid] = descriptor self._visual_materials[cfg.uid] = visual_mat return visual_mat - def get_visual_material(self, uid: str) -> VisualMaterial: + def get_visual_material(self, uid: str) -> VisualMaterial | None: """Get visual material by UID. Args: @@ -4838,7 +4852,13 @@ def get_visual_material(self, uid: str) -> VisualMaterial: return self._visual_materials[uid] - def clean_materials(self): + def clean_materials(self) -> None: + """Clear runtime wrappers and ask the native owner to release unused materials. + + Explicit material definitions remain reserved in the Scene for the World + lifetime. Cleaning does not permit a conflicting definition to replace a + UID that declarations or live native handles may still reference. + """ self._visual_materials = {} if self._env: self._env.clean_materials() diff --git a/embodichain/lab/sim/spawn/descriptors.py b/embodichain/lab/sim/spawn/descriptors.py index e3088a8de..a580e1239 100644 --- a/embodichain/lab/sim/spawn/descriptors.py +++ b/embodichain/lab/sim/spawn/descriptors.py @@ -33,6 +33,7 @@ from collections.abc import Sequence from dataclasses import MISSING, dataclass, field, fields, replace import math +import hashlib import numbers import os import warnings @@ -1723,28 +1724,16 @@ def _compile_visual_material( ) -> tuple[str | None, tuple[str, MaterialDesc] | None]: if cfg is None: return None, None - key = str(cfg.uid or f"{object_uid}_material") - base_color = tuple(float(value) for value in cfg.base_color) - if len(base_color) != 4: - raise ValueError("VisualMaterialCfg.base_color must be RGBA.") - emissive_rgb = tuple( - float(value) * float(cfg.emissive_intensity) for value in cfg.emissive - ) - if len(emissive_rgb) != 3: - raise ValueError("VisualMaterialCfg.emissive must be RGB.") - desc = MaterialDesc( - name=key, - base_color=base_color, - base_color_map=cfg.base_color_texture, - normal_map=cfg.normal_texture, - emissive=(*emissive_rgb, 1.0), - roughness=float(cfg.roughness), - roughness_map=cfg.roughness_texture, - metallic=float(cfg.metallic), - metallic_map=cfg.metallic_texture, - ao_map=cfg.ao_texture, - ior=float(cfg.ior), - ) + from embodichain.lab.sim.material import _material_desc_from_cfg + + key = cfg.uid or f"{object_uid}_material" + desc = _material_desc_from_cfg(cfg, key) + if not cfg.uid: + # Replacements may keep the object UID while changing appearance. Reuse + # an implicit template only for the same normalized material definition. + digest = hashlib.sha256(repr(desc).encode("utf-8")).hexdigest()[:16] + key = f"{key}_{digest}" + desc.name = key return key, (key, desc) diff --git a/embodichain/lab/sim/spawn/scene.py b/embodichain/lab/sim/spawn/scene.py index 7d22f1667..7f3f047c9 100644 --- a/embodichain/lab/sim/spawn/scene.py +++ b/embodichain/lab/sim/spawn/scene.py @@ -70,10 +70,18 @@ def __init__( ) self._assets: dict[str, _AssetDeclaration] = {} self._usd_texture_files = _UsdTextureFiles() + self._pending_material_assignments: ( + dict[tuple[str, int, str | None], list[Any]] | None + ) = None def _resolve_materials(self, materials: dict[str, Any]) -> dict[str, Any]: """Resolve package images before DexSim creates native materials.""" - return self._usd_texture_files.resolve(materials) + resolved = self._usd_texture_files.resolve(materials) + for uid, descriptor in resolved.items(): + existing = self.builder.materials.get(uid) + if existing is not None and existing != descriptor: + raise ValueError(f"Conflicting visual material definition for {uid!r}.") + return resolved @property def arena_names(self) -> tuple[str, ...]: @@ -202,6 +210,11 @@ def remove(self, uid: str) -> None: if removed is None: raise KeyError(f"Spawn asset is absent from SceneBuilder: {uid!r}.") del self._assets[uid] + pending = getattr(self, "_pending_material_assignments", None) + if pending is not None: + self._pending_material_assignments = { + key: materials for key, materials in pending.items() if key[0] != uid + } def commit(self) -> Any: """Finalize once or let the current ``Scene`` consume pending changes.""" @@ -212,6 +225,10 @@ def commit(self) -> Any: result = self.builder.result assert result is not None if self.builder.has_pending_changes or result.needs_rebuild: + if getattr(self, "_pending_material_assignments", None) is None: + self._pending_material_assignments = ( + self._capture_material_assignments() + ) result = result.rebuild(self.builder) for uid in self._assets: @@ -219,6 +236,52 @@ def commit(self) -> Any: self.builder.result = result return result + def _capture_material_assignments( + self, + ) -> dict[tuple[str, int, str | None], list[Any]]: + """Snapshot current per-segment assignments before native resources rebuild.""" + from embodichain.lab.sim.material import _capture_render_materials + + assignments = {} + for uid, declaration in self._assets.items(): + facade = declaration.facade + if facade is None or not getattr(facade, "is_spawn_bound", False): + continue + links = facade.link_names if declaration.kind == "articulation" else [None] + for instance_idx, entity in enumerate(self.handles(uid)): + for link in links: + render_body = ( + entity.get_render_body() + if link is None + else entity.get_render_body(link) + ) + if render_body is not None: + assignments[(uid, instance_idx, link)] = ( + _capture_render_materials(render_body) + ) + return assignments + + def _restore_material_assignments(self) -> None: + """Replay current assignments; retain the snapshot when preparation must retry.""" + from embodichain.lab.sim.material import _restore_render_materials + + assignments = getattr(self, "_pending_material_assignments", None) + if assignments is None: + return + for (uid, instance_idx, link), materials in assignments.items(): + if uid not in self._assets: + continue + entity = self.handles(uid)[instance_idx] + render_body = ( + entity.get_render_body() + if link is None + else entity.get_render_body(link) + ) + if render_body is None or render_body.get_mesh_count() != len(materials): + raise RuntimeError(f"Render material topology changed for {uid!r}.") + _restore_render_materials(render_body, materials) + self._pending_material_assignments = None + def bind(self) -> None: """Complete post-finalize runtime binding for declared facades. @@ -232,6 +295,7 @@ def bind(self) -> None: if result is None or not self.builder.is_finalized: raise RuntimeError("Spawn scene must be materialized before binding.") + self._restore_material_assignments() for uid, declaration in self._assets.items(): facade = declaration.facade if facade is None or not facade.is_declared: @@ -262,6 +326,7 @@ def prepare_runtime_config(self, result: Any) -> None: def close(self) -> None: """Release Spawn resources and facade references.""" result = self.builder.result + self._pending_material_assignments = None try: if result is not None: result.close() diff --git a/tests/gym/envs/managers/test_randomize_visual_material.py b/tests/gym/envs/managers/test_randomize_visual_material.py index 85cb3c821..333f0638a 100644 --- a/tests/gym/envs/managers/test_randomize_visual_material.py +++ b/tests/gym/envs/managers/test_randomize_visual_material.py @@ -184,7 +184,7 @@ def _force_tier(functor, tier: int) -> None: def _run(functor, env, env_ids: torch.Tensor | None = None) -> None: env_ids = torch.arange(env.num_envs) if env_ids is None else env_ids - functor(env, env_ids, entity_cfg=functor.entity_cfg) + functor(env, env_ids, **functor.cfg.params) def test_fallback_to_new_preserves_legacy_path(): @@ -437,3 +437,122 @@ def test_empty_reuse_state_is_a_noop(): assert functor._new_mode is True obj.apply_render_material_inst.assert_not_called() + + +@pytest.mark.parametrize("fallback", [False, True]) +def test_solid_tier_applies_requested_pbr_ranges(fallback): + env, obj, functor = _make_rigid_functor( + { + "fallback_to_new": fallback, + "random_texture_prob": 0.0, + "metallic_range": (0.9, 0.9), + "roughness_range": (0.2, 0.2), + "ior_range": (2.0, 2.0), + } + ) + _force_tier(functor, 2) + + _run(functor, env) + + instance = ( + obj.get_visual_material_inst.return_value[0] + if fallback + else functor._reuse_state[0][0].working_inst + ) + assert instance.set_metallic.call_args.args[0] == pytest.approx(0.9) + assert instance.set_roughness.call_args.args[0] == pytest.approx(0.2) + instance.set_ior.assert_called_once_with(2.0) + + +@pytest.mark.parametrize("fallback", [False, True]) +def test_shared_partial_randomization_rejects_before_any_material_write(fallback): + state = [[_segment()]] + env, obj, functor = _make_rigid_functor( + {"shared": True, "fallback_to_new": fallback}, num_envs=2, states=state + ) + obj.set_visual_material.reset_mock() + + with pytest.raises(ValueError, match="requires all environments"): + _run(functor, env, torch.tensor([0])) + + obj.set_visual_material.assert_not_called() + obj.apply_render_material_inst.assert_not_called() + state[0][0].working_inst.set_base_color.assert_not_called() + + +def test_shared_full_randomization_mutates_once_and_attaches_all_selected_rows(): + segment = _segment() + env, obj, functor = _make_rigid_functor( + {"shared": True}, num_envs=3, states=[[segment]] + ) + _force_tier(functor, 2) + + _run(functor, env, torch.tensor([2, 0, 1])) + + segment.working_inst.set_base_color_texture.assert_called_once() + assert [c.args[0] for c in obj.apply_render_material_inst.call_args_list] == [ + 2, + 0, + 1, + ] + + +@pytest.mark.parametrize("fallback", [False, True]) +def test_empty_material_selection_does_not_mutate_or_allocate(fallback): + env, obj, functor = _make_rigid_functor({"fallback_to_new": fallback}) + obj.set_visual_material.reset_mock() + env.sim.env.reset_mock() + + _run(functor, env, torch.tensor([], dtype=torch.int64)) + + obj.set_visual_material.assert_not_called() + obj.apply_render_material_inst.assert_not_called() + env.sim.env.create_color_texture.assert_not_called() + env.sim.env.clean_materials.assert_not_called() + + +def test_partial_articulation_randomization_samples_only_selected_links(): + env = _MockEnv(num_envs=3) + art = _MockArticulation(["arm", "eef"], num_envs=3) + states = [{name: [_segment()] for name in art.link_names} for _ in range(3)] + art.get_existing_visual_material = MagicMock(return_value=states) + env.sim._asset = art + env.sim.asset_uids = ["art"] + cfg = _make_cfg(uid="art") + cfg.params["entity_cfg"].link_names = art.link_names + functor = randomize_visual_material(cfg, env) + functor._sample_tiers = MagicMock(return_value=torch.tensor([2, 2])) + + _run(functor, env, torch.tensor([2])) + + functor._sample_tiers.assert_called_once_with(2) + assert all(c.args[0] == 2 for c in art.apply_render_material_inst.call_args_list) + for unselected in states[:2]: + for segments in unselected.values(): + segments[0].working_inst.set_base_color_texture.assert_not_called() + + +def test_texture_libraries_with_same_basename_remain_independent(monkeypatch, tmp_path): + first_path = tmp_path / "a" / "textures" + second_path = tmp_path / "b" / "textures" + pixels = { + str(first_path): torch.zeros((2, 2, 4), dtype=torch.uint8), + str(second_path): torch.full((2, 2, 4), 255, dtype=torch.uint8), + } + loads = [] + + def load_images(path): + loads.append(path) + return [pixels[path]] + + monkeypatch.setattr("embodichain.utils.utility.read_all_folder_images", load_images) + env = _MockEnv() + first = randomize_visual_material(_make_cfg({"texture_path": str(first_path)}), env) + second = randomize_visual_material( + _make_cfg({"texture_path": str(second_path)}), env + ) + + assert loads == [str(first_path), str(second_path)] + assert first.textures[0] is pixels[str(first_path)] + assert second.textures[0] is pixels[str(second_path)] + assert first._library_textures is not second._library_textures diff --git a/tests/sim/objects/test_articulation.py b/tests/sim/objects/test_articulation.py index 8b5ff0b33..102ea2aa3 100644 --- a/tests/sim/objects/test_articulation.py +++ b/tests/sim/objects/test_articulation.py @@ -963,18 +963,12 @@ def test_set_visual_material(self): assert ( "handle_xpos" in mat_insts[0] ), "FAIL: 'handle_xpos' not in material instances" - assert mat_insts[0]["outer_box"].base_color == [ - 0.0, - 0.0, - 1.0, - 1.0, - ], f"FAIL: 'outer_box' base color not set correctly: {mat_insts[0]['outer_box'].base_color}" - assert mat_insts[0]["handle_xpos"].base_color == [ - 0.0, - 0.0, - 1.0, - 1.0, - ], f"FAIL: 'handle_xpos' base color not set correctly: {mat_insts[0]['handle_xpos'].base_color}" + assert mat_insts[0]["outer_box"].base_color == pytest.approx( + [0.0, 0.0, 1.0] + ), f"FAIL: 'outer_box' base color not set correctly: {mat_insts[0]['outer_box'].base_color}" + assert mat_insts[0]["handle_xpos"].base_color == pytest.approx( + [0.0, 0.0, 1.0] + ), f"FAIL: 'handle_xpos' base color not set correctly: {mat_insts[0]['handle_xpos'].base_color}" # TODO: Open this test will cause segfault in CI env # def test_get_link_pose(self): diff --git a/tests/sim/objects/test_articulation_reuse_material.py b/tests/sim/objects/test_articulation_reuse_material.py index 7fed2f8a8..0ee23e6c6 100644 --- a/tests/sim/objects/test_articulation_reuse_material.py +++ b/tests/sim/objects/test_articulation_reuse_material.py @@ -30,6 +30,7 @@ def __init__(self, entities, uid, link_names): # num_instances is a read-only property on BatchEntity, driven by _entities. self._entities = entities self._all_indices = list(range(len(entities))) + self._visual_material = [{} for _ in entities] self.uid = uid self.link_names = link_names diff --git a/tests/sim/objects/test_asset_material_initialization.py b/tests/sim/objects/test_asset_material_initialization.py index a4ab33ac4..10a149d41 100644 --- a/tests/sim/objects/test_asset_material_initialization.py +++ b/tests/sim/objects/test_asset_material_initialization.py @@ -45,6 +45,7 @@ def asset_type(request): def _material(name: str): material = MagicMock(name=name) material.get_name.return_value = name + material.get_material_id.return_value = hash(name) template = MagicMock(name=f"{name}_template") template.get_name.return_value = f"{name}_template" material.get_template.return_value = template diff --git a/tests/sim/objects/test_rigid_object.py b/tests/sim/objects/test_rigid_object.py index 42e688ca5..b064bdf3e 100644 --- a/tests/sim/objects/test_rigid_object.py +++ b/tests/sim/objects/test_rigid_object.py @@ -447,12 +447,9 @@ def test_set_visual_material(self): len(material_list) == NUM_ARENAS ), f"Expected {NUM_ARENAS} materials, got {len(material_list)}" for mat_inst in material_list: - assert mat_inst.base_color == [ - 0.0, - 0.0, - 1.0, - 1.0, - ], f"Material base color incorrect: {mat_inst.base_color}" + assert mat_inst.base_color == pytest.approx( + [0.0, 0.0, 1.0] + ), f"Material base color incorrect: {mat_inst.base_color}" def test_add_cube(self): cfg_dict = { @@ -864,12 +861,9 @@ def test_misc_properties(self): len(cube_materials) == NUM_ARENAS ), f"Cube should have {NUM_ARENAS} material instances" for i in range(NUM_ARENAS): - assert cube_materials[i].base_color == [ - 0.0, - 0.0, - 1.0, - 1.0, - ], f"Material {i} base color incorrect" + assert cube_materials[i].base_color == pytest.approx( + [0.0, 0.0, 1.0] + ), f"Material {i} base color incorrect" def test_geometry_data(self): """Test mesh-level read APIs: get_triangles and scaled get_vertices. diff --git a/tests/sim/objects/test_rigid_object_reuse_material.py b/tests/sim/objects/test_rigid_object_reuse_material.py index 2571d8e09..36c6b41f0 100644 --- a/tests/sim/objects/test_rigid_object_reuse_material.py +++ b/tests/sim/objects/test_rigid_object_reuse_material.py @@ -30,6 +30,7 @@ def __init__(self, entities, uid): # num_instances is a read-only property on BatchEntity, driven by _entities. self._entities = entities self._all_indices = list(range(len(entities))) + self._visual_material = [None] * len(entities) self.uid = uid @@ -64,6 +65,8 @@ def test_get_existing_visual_material_builds_state_per_segment(): assert states[0][0].working_inst is states[0][1].working_inst seg_mats[0][1].create_inst.assert_called_once() seg_mats[1][1].create_inst.assert_not_called() + assert states[0][0].working_inst.mat is seg_mats[0][1].create_inst.return_value + seg_mats[0][1].get_inst.assert_not_called() def test_get_existing_visual_material_shared_returns_single_env(): @@ -104,3 +107,4 @@ def test_apply_render_material_inst_skips_attached_material(): obj.apply_render_material_inst(0, inst) render_body.set_material.assert_not_called() + assert obj.get_visual_material_inst()[0].mat is inst diff --git a/tests/sim/spawn/test_scene.py b/tests/sim/spawn/test_scene.py index aeea7eb87..53ef4c2ad 100644 --- a/tests/sim/spawn/test_scene.py +++ b/tests/sim/spawn/test_scene.py @@ -31,10 +31,24 @@ Robot, ) from embodichain.lab.sim.spawn.scene import SpawnScene +from dexsim.spawn import MaterialDesc pytestmark = pytest.mark.no_sim +def test_material_resolution_rejects_conflicting_explicit_definitions(): + scene = object.__new__(SpawnScene) + original = MaterialDesc(name="shared", roughness=0.2) + scene.builder = SimpleNamespace(materials={"shared": original}) + scene._usd_texture_files = SimpleNamespace(resolve=lambda materials: materials) + + assert scene._resolve_materials({"shared": original}) == {"shared": original} + with pytest.raises(ValueError, match="Conflicting visual material"): + scene._resolve_materials({"shared": MaterialDesc(name="shared", roughness=0.9)}) + + assert scene.builder.materials["shared"] is original + + def _make_scene(handles: dict[str, object]) -> SpawnScene: scene = object.__new__(SpawnScene) scene._num_envs = 1 @@ -46,6 +60,110 @@ def _make_scene(handles: dict[str, object]) -> SpawnScene: return scene +def _material_assignment_scene(kind: str): + originals = [MagicMock(name=f"original_{i}") for i in range(2)] + stale = MagicMock(name="stale_descriptor_material") + for i, material in enumerate([*originals, stale]): + material.get_name.return_value = str(i) + material.get_template.return_value.get_name.return_value = "template" + current = list(originals) + body = MagicMock(name="render_body") + body.get_mesh_count.return_value = len(current) + body.get_material.side_effect = lambda mesh_id: current[mesh_id] + body.set_material.side_effect = lambda mesh_id, material: current.__setitem__( + mesh_id, material + ) + entity = SimpleNamespace(get_render_body=lambda *args: body) + scene = _make_scene({"asset": entity}) + facade = SimpleNamespace( + is_spawn_bound=True, + is_declared=False, + link_names=["link"], + attach_spawn_handles=lambda handles: None, + ) + scene.track( + kind, "asset", SimpleNamespace(name="asset", per_env=False), facade=facade + ) + result = scene.builder.result + result.needs_rebuild = True + scene.builder.has_pending_changes = True + + def rebuild(builder): + current[:] = [stale] * len(current) + builder.has_pending_changes = False + result.needs_rebuild = False + return result + + result.rebuild = rebuild + return scene, body, current, originals + + +@pytest.mark.parametrize( + "kind", ["rigid_object", "articulation", "soft_object", "cloth_object"] +) +def test_rebuild_preserves_current_per_segment_materials_over_stale_descriptors(kind): + scene, _, current, originals = _material_assignment_scene(kind) + + scene.commit() + assert ( + current != originals + ) # Model the native rebuild consuming stale descriptions. + scene.bind() + + assert current == originals + assert scene._pending_material_assignments is None + + +def test_material_replay_retries_after_partial_native_failure(): + scene, body, current, originals = _material_assignment_scene("rigid_object") + scene.commit() + body.set_material.side_effect = RuntimeError("native assignment failed") + + with pytest.raises(RuntimeError, match="native assignment failed"): + scene.bind() + + assert scene._pending_material_assignments is not None + body.set_material.side_effect = lambda mesh_id, material: current.__setitem__( + mesh_id, material + ) + scene.bind() + assert current == originals + assert scene._pending_material_assignments is None + + +def test_removing_failed_replay_discards_materials_before_same_uid_replacement(): + scene, body, _, _ = _material_assignment_scene("rigid_object") + scene.commit() + body.set_material.side_effect = RuntimeError("native assignment failed") + with pytest.raises(RuntimeError, match="native assignment failed"): + scene.bind() + + scene.builder.remove_object = lambda name: scene._assets[name].descriptor + scene.remove("asset") + replacement_material = MagicMock(name="replacement_material") + replacement_body = MagicMock() + replacement_body.get_mesh_count.return_value = ( + 1 # Different topology from the removed object. + ) + replacement_body.get_material.return_value = replacement_material + scene.builder.result.handles["asset"] = SimpleNamespace( + get_render_body=lambda: replacement_body + ) + facade = _RetryableFacade() + scene.track( + "rigid_object", + "asset", + SimpleNamespace(name="asset", per_env=False), + facade=facade, + ) + + scene.bind() + + assert facade.bind_attempts == 1 + replacement_body.set_material.assert_not_called() + assert scene._pending_material_assignments is None + + class _RetryableFacade: def __init__(self, *, fail_first: bool = False) -> None: self._entities: list[object] = [] diff --git a/tests/sim/test_material.py b/tests/sim/test_material.py new file mode 100644 index 000000000..fd958204c --- /dev/null +++ b/tests/sim/test_material.py @@ -0,0 +1,388 @@ +# ---------------------------------------------------------------------------- +# Copyright (c) 2021-2026 DexForce Technology Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ---------------------------------------------------------------------------- + +"""Material identity, native state, and configuration-lowering contracts.""" + +from __future__ import annotations + +from unittest.mock import MagicMock +from types import SimpleNamespace + +import numpy as np +import pytest +import torch + +from embodichain.lab.sim.material import ( + VisualMaterial, + VisualMaterialCfg, + VisualMaterialInst, +) +from embodichain.lab.sim.material import _set_render_material +from embodichain.lab.sim.sim_manager import SimulationManager +from embodichain.lab.sim.spawn.descriptors import _compile_visual_material +from embodichain.lab.sim.spawn.scene import SpawnScene +from embodichain.lab.sim.objects.rigid_object_group import RigidObjectGroup +from embodichain.lab.gym.envs.managers.cfg import SceneEntityCfg +from embodichain.lab.gym.envs.managers.randomization.visual import ( + set_rigid_object_group_visual_material, +) + +pytestmark = pytest.mark.no_sim + + +def test_material_assignment_uses_native_identity_even_when_names_match(): + original = MagicMock(name="original_handle") + replacement = MagicMock(name="replacement_handle") + for native in (original, replacement): + native.get_name.return_value = "same_name" + native.get_template.return_value.get_name.return_value = "same_template" + original.get_material_id.return_value = 1 + replacement.get_material_id.return_value = 2 + body = MagicMock() + body.get_material.return_value = original + + _set_render_material(body, 0, replacement) + + body.set_material.assert_called_once_with(0, replacement) + + +def _native_template() -> MagicMock: + template = MagicMock(name="template") + instances = {} + + def get_instance(uid=""): + if uid not in instances: + state = { + "base_color": [0.5, 0.5, 0.5, 1.0], + "metallic": 0.0, + "roughness": 0.7, + "ior": 1.5, + "emissive": [0.0, 0.0, 0.0, 1.0], + } + native = MagicMock(name=uid) + native.get_name.return_value = uid + native.get_template.return_value = template + native.get_base_color_map.return_value = None + for field in state: + getattr(native, f"get_{field}").side_effect = lambda key=field: state[ + key + ] + getattr(native, f"set_{field}").side_effect = ( + lambda value, key=field: state.__setitem__(key, value) + ) + native.set_pbr_param.side_effect = lambda key, value: state.__setitem__( + key, value + ) + instances[uid] = native + return instances[uid] + + template.get_inst.side_effect = get_instance + return template + + +def test_repeated_instance_creation_preserves_identity_properties_and_capacity(): + material = VisualMaterial(VisualMaterialCfg(uid="paint"), _native_template()) + instance = material.create_instance("object") + instance.set_roughness(0.2) + instance.mat.reset_mock() + + for _ in range(1025): # Exceeds the historical bounded-texture stress case. + assert material.create_instance("object") is instance + assert material.get_instance("object") is instance + + assert instance.roughness == pytest.approx(0.2) + assert len(material._instances) == 2 # Template default plus one object instance. + instance.mat.set_roughness.assert_not_called() + + +def test_instance_properties_read_current_native_values(): + material = VisualMaterial(VisualMaterialCfg(uid="paint"), _native_template()) + instance = material.create_instance("object") + instance.mat.set_roughness(0.9) + instance.mat.set_metallic(0.6) + instance.mat.set_base_color([0.1, 0.2, 0.3, 1.0]) + instance.mat.set_pbr_param("ior", 2.0) + + queried = material.get_instance("object") + + assert queried.roughness == pytest.approx(0.9) + assert queried.metallic == pytest.approx(0.6) + assert queried.ior == pytest.approx(2.0) + assert queried.base_color == pytest.approx([0.1, 0.2, 0.3]) + + +@pytest.mark.parametrize( + ("setter", "value", "native_setter"), + [ + ("set_base_color", [0.1, 0.2, 0.3, 1.0], "set_base_color"), + ("set_metallic", 0.8, "set_metallic"), + ("set_roughness", 0.2, "set_roughness"), + ("set_emissive", [0.1, 0.2, 0.3], "set_emissive"), + ("set_ior", 2.0, "set_pbr_param"), + ("set_base_color_texture", "color.png", "set_base_color_map"), + ("set_metallic_texture", "metal.png", "set_metallic_map"), + ("set_roughness_texture", "rough.png", "set_roughness_map"), + ("set_normal_texture", "normal.png", "set_normal_map"), + ("set_ao_texture", "ao.png", "set_ao_map"), + ], +) +def test_asset_wrapper_setters_use_exact_existing_handle(setter, value, native_setter): + template = _native_template() + original = template.get_inst("parsed") + wrapper = VisualMaterialInst.from_existing(original) + template.reset_mock() + + getattr(wrapper, setter)(value) + + assert wrapper.mat is original + template.get_inst.assert_not_called() + getattr(original, native_setter).assert_called_once() + + +@pytest.mark.parametrize("intensity", [0.0, 1.0, 10.0]) +@pytest.mark.parametrize("material_type", ["BRDF", "BTDF", "BSDF"]) +def test_runtime_and_spawn_lower_identical_material_properties( + intensity, material_type +): + cfg = VisualMaterialCfg( + uid="paint", + base_color=[0.1, 0.2, 0.3, 0.5], + metallic=0.8, + roughness=0.2, + emissive=[0.2, 0.3, 0.4], + emissive_intensity=intensity, + material_type=material_type, + ior=2.0, + ) + _, (_, descriptor) = _compile_visual_material("object", cfg) + material = VisualMaterial(cfg, _native_template()) + native = material.inst.mat + + assert material.inst.base_color == pytest.approx(descriptor.base_color[:3]) + assert material.inst.metallic == pytest.approx(descriptor.metallic) + assert material.inst.roughness == pytest.approx(descriptor.roughness) + assert material.inst.ior == pytest.approx(descriptor.ior) + np.testing.assert_allclose( + native.set_emissive.call_args.args[0], descriptor.emissive + ) + native.update_pbr_material_type.assert_called_once_with(descriptor.material_type) + assert descriptor.has_alpha is True + + +def test_emissive_intensity_can_be_zero_then_restored_without_losing_rgb(): + instance = VisualMaterial( + VisualMaterialCfg(uid="glow", emissive=[0.2, 0.3, 0.4]), _native_template() + ).inst + + instance.set_emissive_intensity(0.0) + np.testing.assert_allclose(instance.mat.get_emissive(), [0.0, 0.0, 0.0, 1.0]) + instance.set_emissive_intensity(2.0) + + np.testing.assert_allclose(instance.mat.get_emissive(), [0.4, 0.6, 0.8, 1.0]) + assert instance.emissive == pytest.approx([0.2, 0.3, 0.4]) + + +@pytest.mark.parametrize( + "properties", + [ + {"base_color": [1.0, 0.0, 0.0]}, + {"base_color": [1.0, 0.0, 0.0, 2.0]}, + {"emissive": [0.0, 0.0]}, + {"metallic": float("nan")}, + {"roughness": 1.1}, + {"ior": 0.0}, + {"emissive_intensity": -1.0}, + {"emissive": [1e308, 0.0, 0.0], "emissive_intensity": 1e308}, + {"material_type": "unknown"}, + ], +) +def test_invalid_material_config_is_rejected_before_native_instance_creation( + properties, +): + cfg = VisualMaterialCfg(uid="invalid", **properties) + template = _native_template() + + with pytest.raises(ValueError): + VisualMaterial(cfg, template) + with pytest.raises(ValueError): + _compile_visual_material("object", cfg) + + template.get_inst.assert_not_called() + + +def test_unnamed_inline_materials_have_independent_object_scoped_names(): + red_ref, (_, red) = _compile_visual_material( + "red", VisualMaterialCfg(base_color=[1, 0, 0, 1]) + ) + blue_ref, (_, blue) = _compile_visual_material( + "blue", VisualMaterialCfg(base_color=[0, 0, 1, 1]) + ) + definitions = {red_ref: red, blue_ref: blue} + + assert len(definitions) == 2 + assert definitions[red_ref].base_color == (1.0, 0.0, 0.0, 1.0) + assert definitions[blue_ref].base_color == (0.0, 0.0, 1.0, 1.0) + + +def _material_manager(): + manager = SimulationManager.__new__(SimulationManager) + manager._visual_materials = {} + manager._require_native_renderer = MagicMock() + manager._env = MagicMock() + manager._env.find_material.return_value = None + manager._env.create_pbr_material.side_effect = lambda *args: _native_template() + scene = SpawnScene.__new__(SpawnScene) + scene.builder = SimpleNamespace(materials={}) + scene._usd_texture_files = SimpleNamespace(resolve=lambda materials: materials) + manager._spawn_scene = scene + return manager + + +def test_explicit_runtime_uid_reuses_only_equivalent_definitions(): + manager = _material_manager() + cfg = VisualMaterialCfg(uid="shared") + + first = manager.create_visual_material(cfg) + assert manager.create_visual_material(cfg.copy()) is first + with pytest.raises(ValueError, match="Conflicting visual material"): + manager.create_visual_material(cfg.replace(roughness=0.1)) + + manager._env.create_pbr_material.assert_called_once() + + +def test_unnamed_runtime_materials_receive_distinct_ids_without_mutating_config(): + manager = _material_manager() + cfg = VisualMaterialCfg() + + first = manager.create_visual_material(cfg) + second = manager.create_visual_material(cfg) + + assert first.uid != second.uid + assert cfg.uid is None + + +@pytest.mark.parametrize("runtime_first", [False, True]) +def test_explicit_uid_conflicts_are_rejected_across_creation_paths(runtime_first): + manager = _material_manager() + runtime_cfg = VisualMaterialCfg(uid="shared", base_color=[1, 0, 0, 1]) + _, (uid, inline_desc) = _compile_visual_material( + "object", VisualMaterialCfg(uid="shared", base_color=[0, 0, 1, 1]) + ) + scene = manager._spawn_scene + if runtime_first: + manager.create_visual_material(runtime_cfg) + with pytest.raises(ValueError, match="Conflicting visual material"): + scene._resolve_materials({uid: inline_desc}) + else: + scene.builder.materials.update(scene._resolve_materials({uid: inline_desc})) + with pytest.raises(ValueError, match="Conflicting visual material"): + manager.create_visual_material(runtime_cfg) + manager._env.create_pbr_material.assert_not_called() + + +def test_equivalent_inline_material_uses_configured_native_default_after_runtime_creation(): + from dexsim.spawn.adapters.common import _create_render_material + + manager = _material_manager() + cfg = VisualMaterialCfg(uid="shared", base_color=[1, 0, 0, 1]) + runtime = manager.create_visual_material(cfg) + manager._env.find_material.return_value = runtime.mat + _, (_, descriptor) = _compile_visual_material("object", cfg) + manager._spawn_scene._resolve_materials({"shared": descriptor}) + + native = _create_render_material( + SimpleNamespace(get_env=lambda: manager._env), descriptor + ) + + assert native is runtime.inst.mat + assert list(native.get_base_color())[:3] == [1.0, 0.0, 0.0] + + +def test_equivalent_runtime_alias_preserves_native_state_from_inline_material(): + manager = _material_manager() + cfg = VisualMaterialCfg(uid="shared", roughness=0.2) + _, (_, descriptor) = _compile_visual_material("object", cfg) + manager._spawn_scene.builder.materials["shared"] = descriptor + native = _native_template() + native.get_inst().set_roughness(0.8) + native.get_inst().reset_mock() + manager._env.find_material.return_value = native + + alias = manager.create_visual_material(cfg) + + assert alias.inst.roughness == pytest.approx(0.8) + alias.inst.mat.set_roughness.assert_not_called() + manager._env.create_pbr_material.assert_not_called() + + +def test_cleaning_materials_preserves_world_lifetime_definition_identity(): + manager = _material_manager() + cfg = VisualMaterialCfg(uid="reserved", roughness=0.2) + manager.create_visual_material(cfg) + + manager.clean_materials() + + assert manager.get_visual_material("reserved") is None + manager._env.clean_materials.assert_called_once() + with pytest.raises(ValueError, match="Conflicting visual material"): + manager.create_visual_material(cfg.replace(roughness=0.9)) + assert manager.create_visual_material(cfg).cfg.roughness == 0.2 + + +def test_implicit_names_allow_replacement_and_reuse_equal_material_definitions(): + cfg = VisualMaterialCfg(base_color=[1, 0, 0, 1]) + first_ref, first_entry = _compile_visual_material("object", cfg) + second_ref, second_entry = _compile_visual_material( + "object", cfg.replace(base_color=[0, 0, 1, 1]) + ) + repeated_ref, _ = _compile_visual_material("object", cfg.copy()) + scene = _material_manager()._spawn_scene + scene.builder.materials.update(scene._resolve_materials(dict([first_entry]))) + scene.builder.materials.update(scene._resolve_materials(dict([second_entry]))) + + assert first_ref != second_ref + assert repeated_ref == first_ref + assert len(scene.builder.materials) == 2 + + +def test_deterministic_group_reset_reapplies_properties_only_to_selected_environments(): + material = VisualMaterial( + VisualMaterialCfg(uid="fixed", roughness=0.2), _native_template() + ) + group = RigidObjectGroup.__new__(RigidObjectGroup) + group.uid = "group" + group._entities = [[MagicMock()], [MagicMock()]] + group._selected_indices = lambda env_ids: (env_ids, None, None) + sim = SimpleNamespace( + get_rigid_object_group_uid_list=lambda: ["group"], + get_rigid_object_group=lambda uid: group, + create_visual_material=lambda cfg: material, + ) + env = SimpleNamespace(sim=sim, num_envs=2) + set_rigid_object_group_visual_material( + env, None, SceneEntityCfg(uid="group"), material.cfg + ) + first = material.get_instance("fixed_group_0") + second = material.get_instance("fixed_group_1") + first.set_roughness(0.9) + second.set_roughness(0.9) + + set_rigid_object_group_visual_material( + env, torch.tensor([1]), SceneEntityCfg(uid="group"), material.cfg + ) + + assert first.roughness == pytest.approx(0.9) + assert second.roughness == pytest.approx(0.2) diff --git a/tests/sim/test_material_integration.py b/tests/sim/test_material_integration.py new file mode 100644 index 000000000..eacb842be --- /dev/null +++ b/tests/sim/test_material_integration.py @@ -0,0 +1,242 @@ +# ---------------------------------------------------------------------------- +# Copyright (c) 2021-2026 DexForce Technology Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ---------------------------------------------------------------------------- + +"""Native material parity and restore/rebuild qualification for DexSim 0.5.1rc1.""" + +from __future__ import annotations + +import numpy as np +import pytest +import torch +from types import SimpleNamespace + +from embodichain.lab.sim import ( + SimulationManager, + SimulationManagerCfg, + VisualMaterialCfg, +) +from embodichain.lab.sim.cfg import ( + RenderCfg, + RigidObjectCfg, + VisualObjectCfg, + physics_cfg_for_backend, +) +from embodichain.lab.sim.shapes import CubeCfg +from embodichain.lab.gym.envs.managers import FunctorCfg +from embodichain.lab.gym.envs.managers.cfg import SceneEntityCfg +from embodichain.lab.gym.envs.managers.randomization.visual import ( + randomize_visual_material, +) + +pytestmark = [pytest.mark.requires_sim, pytest.mark.renderer] + + +@pytest.mark.parametrize("physics", ["default", "newton"]) +def test_native_material_creation_reset_and_topology_rebuild(physics): + sim = SimulationManager( + SimulationManagerCfg( + headless=True, + device="cpu", + num_envs=2, + scene_node_capacity=128, + physics_cfg=physics_cfg_for_backend(physics), + render_cfg=RenderCfg(renderer="hybrid"), + ) + ) + obj = other = runtime = None + cfg = VisualMaterialCfg( + base_color=[0.8, 0.1, 0.2, 1.0], + metallic=0.3, + roughness=0.2, + emissive=[0.1, 0.2, 0.3], + emissive_intensity=2.0, + ior=1.7, + ) + try: + obj = sim.add_rigid_object( + RigidObjectCfg( + uid="red", + body_type="static", + init_pos=(0.0, 0.0, 0.5), + shape=CubeCfg(size=(0.1, 0.1, 0.1), visual_material=cfg), + ) + ) + other = sim.add_visual_object( + VisualObjectCfg( + uid="blue", + shape=CubeCfg( + size=(0.1, 0.1, 0.1), + visual_material=VisualMaterialCfg(base_color=[0.1, 0.2, 0.8, 1.0]), + ), + ) + ) + sim.prepare() + initial_names = [m.mat.get_name() for m in obj.get_visual_material_inst()] + assert obj.get_visual_material_inst()[0].base_color == pytest.approx( + cfg.base_color[:3], abs=1e-5 + ) + assert other.get_visual_material_inst()[0].base_color == pytest.approx( + [0.1, 0.2, 0.8], abs=1e-5 + ) + + runtime = sim.create_visual_material(cfg.replace(uid="runtime")) + shared_visual = sim.add_visual_object( + VisualObjectCfg( + uid="runtime_copy", + shape=CubeCfg( + size=(0.1, 0.1, 0.1), visual_material=cfg.replace(uid="runtime") + ), + ) + ) + assert shared_visual.get_visual_material_inst()[0].base_color == pytest.approx( + cfg.base_color[:3], abs=1e-5 + ) + assert sim.remove_asset("runtime_copy") + del shared_visual + borrowed_cfg = VisualMaterialCfg(uid="borrowed_state", roughness=0.2) + borrowed_visual = sim.add_visual_object( + VisualObjectCfg( + uid="borrowed_visual", + shape=CubeCfg(size=(0.1, 0.1, 0.1), visual_material=borrowed_cfg), + ) + ) + native_template = sim.get_env().find_material("borrowed_state") + native_template.get_inst().set_roughness(0.8) + borrowed = sim.create_visual_material(borrowed_cfg) + assert borrowed.inst.roughness == pytest.approx(0.8) + assert native_template.get_inst().get_roughness() == pytest.approx(0.8) + assert sim.remove_asset("borrowed_visual") + del borrowed, borrowed_visual, native_template + parsed = obj.get_visual_material_inst()[0] + assert parsed.roughness == pytest.approx(runtime.inst.roughness) + assert parsed.metallic == pytest.approx(runtime.inst.metallic) + assert parsed.ior == pytest.approx(runtime.inst.ior) + np.testing.assert_allclose( + parsed.mat.get_emissive(), runtime.inst.mat.get_emissive(), atol=1e-5 + ) + del parsed + + obj.set_visual_material(runtime, [1]) + selected = obj.get_visual_material_inst([1])[0] + selected.set_roughness(0.6) + assert selected.mat.get_roughness() == pytest.approx(0.6) + assert runtime.get_instance(selected.uid) is selected + del selected + obj.restore_visual_material([1]) + + # Adding/removing a different asset rebuilds Newton's native render resources. + extra = sim.add_visual_object( + VisualObjectCfg(uid="extra", shape=CubeCfg(size=(0.1, 0.1, 0.1))) + ) + assert [ + m.mat.get_name() for m in obj.get_visual_material_inst() + ] == initial_names + assert [ + entity.get_render_body().get_material(0).get_name() + for entity in obj._entities + ] == initial_names + assert sim.remove_asset("extra") + del extra + sim.prepare() + assert [ + entity.get_render_body().get_material(0).get_name() + for entity in obj._entities + ] == initial_names + + # A current, intentional replacement must also survive a later rebuild. + obj.set_visual_material(runtime, [1]) + selected_name = obj.get_visual_material_inst([1])[0].mat.get_name() + assert sim.remove_asset("blue") + sim.prepare() + assert ( + obj._entities[0].get_render_body().get_material(0).get_name() + == initial_names[0] + ) + assert ( + obj._entities[1].get_render_body().get_material(0).get_name() + == selected_name + ) + obj.reset([1]) + assert ( + obj._entities[1].get_render_body().get_material(0).get_name() + == initial_names[1] + ) + + # Repeated partial randomization retains native instance capacity and the other row. + event_cfg = FunctorCfg(func=randomize_visual_material) + event_cfg.params = { + "entity_cfg": SceneEntityCfg(uid="red"), + "p_solid": 1.0, + "solid_texture_count": 2, + "metallic_range": (0.9, 0.9), + "roughness_range": (0.2, 0.2), + "ior_range": (2.0, 2.0), + } + env = SimpleNamespace(sim=sim, num_envs=2, device=torch.device("cpu")) + randomizer = randomize_visual_material(event_cfg, env) + selected_ids = torch.tensor([1]) + randomizer(env, selected_ids, **event_cfg.params) + template_counts = [ + segments[0].working_inst.mat.get_template().inst_count() + for segments in randomizer._reuse_state + ] + for _ in range(1025): + randomizer(env, selected_ids, **event_cfg.params) + assert [ + segments[0].working_inst.mat.get_template().inst_count() + for segments in randomizer._reuse_state + ] == template_counts + assert obj.get_visual_material_inst([1])[0].metallic == pytest.approx(0.9) + assert obj.get_visual_material_inst([1])[0].roughness == pytest.approx(0.2) + assert obj.get_visual_material_inst([1])[0].ior == pytest.approx(2.0) + assert ( + obj._entities[0].get_render_body().get_material(0).get_name() + == initial_names[0] + ) + del randomizer, env + + replacement_cfg = RigidObjectCfg( + uid="red", + body_type="static", + init_pos=(0.0, 0.0, 0.5), + shape=CubeCfg( + size=(0.1, 0.1, 0.1), + visual_material=VisualMaterialCfg(base_color=[0.1, 0.2, 0.8, 1.0]), + ), + ) + obj = sim.replace_rigid_object(replacement_cfg) + assert obj.get_visual_material_inst()[0].base_color == pytest.approx( + [0.1, 0.2, 0.8], abs=1e-5 + ) + definition_count = len(sim._spawn_scene.builder.materials) + obj = sim.replace_rigid_object(replacement_cfg.copy()) + assert len(sim._spawn_scene.builder.materials) == definition_count + assert sim.remove_asset("red") + obj = sim.add_rigid_object( + replacement_cfg.replace( + shape=CubeCfg( + size=(0.1, 0.1, 0.1), + visual_material=VisualMaterialCfg(base_color=[0.1, 0.8, 0.2, 1.0]), + ) + ) + ) + assert obj.get_visual_material_inst()[0].base_color == pytest.approx( + [0.1, 0.8, 0.2], abs=1e-5 + ) + finally: + sim.destroy(exit_process=False) + del obj, other, runtime + SimulationManager.flush_cleanup_queue() From 178a421f03ca7e89758109b3dedd3fedeacd6409 Mon Sep 17 00:00:00 2001 From: yuecideng Date: Fri, 23 Oct 2026 00:46:47 +0800 Subject: [PATCH 02/10] docs(sim): streamline material acceptance guidance --- .../visual-material-acceptance.md | 157 ++++++------------ 1 file changed, 53 insertions(+), 104 deletions(-) diff --git a/docs/architecture/visual-material-acceptance.md b/docs/architecture/visual-material-acceptance.md index bf79e4b0f..160dfc4b3 100644 --- a/docs/architecture/visual-material-acceptance.md +++ b/docs/architecture/visual-material-acceptance.md @@ -1,75 +1,35 @@ -# VisualMaterial 设计与正确性验收 +# Visual material acceptance -## 适用版本与运行环境 +Target `dexsim_engine==0.5.1rc1` with its matching Python wheel, Warp `1.17.0` +and Newton `1.6.0`. Install the repository with its bundled extensions before +running the checks. See [material contracts](../../agent_context/topics/simulation-system/materials.md) +for implementation ownership and lifecycle rules. -本方案针对 `dexsim_engine==0.5.1rc1`,使用该版本要求的 -`warp-lang==1.17.0`、`newton[sim]==1.6.0`。验收必须读取实际导入环境的版本, -不能用修改包元数据、旧版替身或源码隔离探针替代原生集成结果。 +## Acceptance criteria -本次复现环境为独立虚拟环境 `/tmp/embodichain-material-rc1`,底层 Python 3.10, -GPU 为 NVIDIA GeForce RTX 5090。本机 wheel 来自 -`~/Downloads/build_vcpkg-linux-cuda-py310/build_Release/lib/python_package/pip_package/`。 -其他机器使用同版本、匹配 Python ABI 的正式 wheel,并把下方 `python` 指向对应环境。 +| Boundary | Required behavior | +| --- | --- | +| Identity and aliases | Unnamed materials keep independent appearances. Explicit UID conflicts fail across runtime and Spawn creation in either order. Equivalent aliases and repeated instance creation preserve native state. | +| PBR conversion | Both creation paths agree for BRDF/BTDF/BSDF, emission intensities 0/1/10 and nondefault scalar properties. Invalid values fail before native writes. RGBA writes retain alpha; RGB getters cannot verify it. | +| Native handles | Imported and working instances update their exact native handles. Material IDs distinguish different instances with identical names. | +| Selection and reset | Empty selections do nothing; invalid indices and partial shared selections fail before writes. Independent updates affect selected environments only. Deterministic rigid-object and group resets restore selected properties. | +| Randomization resources | Solid and library tiers honor scalar PBR ranges. Shared instances are mutated once per call. Different source directories remain separate; warmed texture pools and instance registries do not grow on repeated calls. | +| Rebuilds and replacement | Current per-segment assignments survive reset and topology rebuilds. Failed replay can retry; removal discards old snapshots before same-UID replacement. Equal replacement definitions reuse registration. | +| Native qualification | Hybrid scenes with two environments pass on Default and Newton. After 1,025 partial randomizations per backend, native instance counts remain stable, requested properties hold, and the other environment is unchanged. | -```bash -python -c 'from importlib.metadata import version; import dexsim; assert version("dexsim-engine") == "0.5.1rc1"; print(dexsim.__file__, version("warp-lang"), version("newton"))' -``` +Use fixed sampling ranges to test requested properties deterministically. +Use floating-point comparisons with an absolute tolerance of `1e-5` for native +color round trips. Solid palette colors include uint8 quantization and finite +palette sampling; they do not represent arbitrary continuous colors. -## 设计契约 - -- `VisualMaterialCfg` 描述材质;`material.py:_material_desc_from_cfg` 是运行时和 - Spawn 共用的属性校验、发光强度和材质类型转换边界。 -- 未命名材质的 `uid=None`。形状声明使用对象范围及标准化外观指纹生成名字,允许同 UID - 对象更换外观,并复用相同定义;独立运行时创建使用唯一名字。两条路径共用定义注册表, - 显式相同 UID 只允许等价定义复用,不同定义在原生写入前报错。等价别名保留已有运行时编辑。 -- 一个模板内每个 UID 对应一个稳定的 `VisualMaterialInst`。重复创建、查询不修改实例, - 不追加重复登记,也不重复写默认属性。需要重设时显式调用 `set_default_properties`; - 确定性刚体和群组 reset 事件负责这个操作。 -- 实例持有确定的原生句柄。包装导入资产、创建复用实例后,所有 setter 操作同一句柄。 - 材质身份使用原生 material ID,不能仅依赖模板名与实例名。 -- metallic、roughness、IOR 和颜色读取真实原生状态。`0.5.1rc1` 的颜色 getter 只暴露 - display-sRGB 的 RGB,因此 `instance.base_color` 返回 RGB;配置和 - `set_base_color` 继续接收 RGBA。不能根据 getter 声称验证了 alpha。 -- 发光 RGB 与非负强度相乘;零强度可恢复。两条创建路径使用同一转换, - `BRDF/BTDF/BSDF` 都传递给原生材质。 -- 非共享随机化仅影响所选环境;共享随机化要求选择全部环境,并且只采样、修改一次。 - 空选择是无操作;重复、越界或非整数环境索引必须在材质写入前失败。 -- 纯色分支保留有界纹理色板,同时应用配置的 metallic、roughness 和 IOR 范围。 - 相同规范化路径共享纹理缓存;不同路径即使目录同名也不能混用。 -- Spawn 在拓扑重建前保存已绑定对象的当前逐段材质,在绑定阶段重放。 - 保存的是当前状态,reset 基线仍由对象持有。重放失败时保留快照,成功后释放; - 移除对象时丢弃它的待重放记录,不能把旧对象快照写给同 UID 的新对象。 - -## 自动化验收矩阵 - -| 层级 | 用例与独立判据 | 覆盖入口 | 通过标准 | -|---|---|---|---| -| CPU:实例身份 | 同 UID 创建/查询 1,025 次;先修改属性再重复查询 | 模板、实例 | 包装器身份稳定;属性保留;登记容量只与唯一 UID 数有关;缓存命中无原生属性写入 | -| CPU:原生句柄 | 资产包装器对颜色、PBR 和各纹理通道写入 | `from_existing`、工作实例 | 原始句柄接收写入;不再按名字寻找替代实例 | -| CPU:身份比较 | 两个句柄名字相同、material ID 不同 | 逐段赋值 | 必须发生重新绑定;相同 ID 的等价句柄跳过重复绑定 | -| CPU:创建一致性 | 三种材质类型 × 强度 0、1、10;非默认颜色、roughness、metallic、IOR | 运行时与 Spawn | 两条路径提交相同属性;alpha 写入与启用标志保留 | -| CPU:非法输入 | 错误颜色维度、NaN、越界因子、非正 IOR、负发光强度、未知类型 | 两条创建路径 | 原生实例创建前失败 | -| CPU:命名与冲突 | 两个未命名红/蓝材质;显式同 UID 的等价与冲突定义 | Manager、Spawn | 独立材质不串色;等价复用;冲突失败且原注册不变 | -| CPU:跨入口别名 | 两个创建顺序;已有原生属性修改后创建等价运行时别名 | 共用定义注册表、原生默认实例 | 两个方向都拒绝冲突;等价别名不重置属性;Native 默认实例不出现未初始化灰色 | -| CPU:群组 reset | 群组实例修改属性后重放确定性事件 | 群组 setter、固定材质事件 | 所选环境恢复配置;未选环境保留修改 | -| CPU:环境选择 | 空集、非连续选择、共享局部选择、共享全量乱序选择 | 复用与回退路径 | 非目标环境无写入;共享局部选择拒绝;共享全量只修改一次 | -| CPU:随机化参数 | 固定 PBR 范围;仅重置一个关节体环境 | 纯色、纹理库、回退 | 固定范围精确生效;仅为所选环境/链接采样 | -| CPU:资源上界 | 多次调用与两个同名纹理目录 | 纹理缓存、色板 | 预热后无纹理创建;不同来源各自加载;同一来源复用 | -| CPU:重建与失败恢复 | 陈旧原生描述模拟重建;逐段重放中途失败 | 刚体、关节体、体/面可变形对象 | 当前材质逐段恢复;失败后重试成功;成功后快照释放 | -| CPU:失败后替换 | 重放失败后移除,再添加相同 UID、不同段数的新对象 | Spawn 移除与重试 | 旧快照被丢弃;新对象的材质与默认值不被污染 | -| 原生:Hybrid | 两环境,Default 与 Newton;独立红/蓝材质;临时赋值→恢复→增删其他对象 | Manager、Spawn、刚体、纯渲染对象 | 原生颜色/PBR 与配置一致;当前替换和 reset 结果在重建后保留;另一环境不变 | -| 原生:持续复用 | 每个后端执行 1,025 次局部随机化,读取原生模板实例数与最终属性 | 原生工作实例、PBR、选择隔离 | 预热后原生实例数不增长;所选范围生效;未选环境保留原材质 | -| 原生:替换与别名 | 同 UID 改色替换、相同定义重复替换、移除后重加、两个入口的等价别名 | Default 与 Newton | 外观正确改变;相同定义不新增登记;别名不重置已编辑原生属性 | - -浮点比较采用 `pytest.approx`;原生颜色往返绝对容差为 `1e-5`。 -随机化逻辑用固定范围验证参数生效,避免以随机采样“恰好不同”作为测试判据。 -纹理色板的颜色受 uint8 量化及有限色板分布影响,不应要求每次产生任意连续颜色。 - -## 执行命令 - -CPU 与原生测试分开执行,保持原生资源串行使用。 +## Commands + +Verify the actual runtime, then run CPU and native checks separately. Keep +native resource tests serial. ```bash +python -c 'from importlib.metadata import version; import dexsim; assert version("dexsim-engine") == "0.5.1rc1"; print(version("warp-lang"), version("newton"))' + python -m pytest -q -m 'not requires_sim and not gpu' \ tests/sim/test_material.py tests/sim/test_material_texture_obj.py \ tests/sim/test_material_cache_config.py \ @@ -89,42 +49,31 @@ python docs/scripts/check_api_docs.py python .agents/skills/project-dev-context/scripts/context.py check ``` -## 本次执行记录(2026-10-23) - -使用上面的独立环境和真实 rc1 wheel;项目以 editable 方式安装,包含官方机器人与任务扩展。 -CPU 结果中的 4 个 deselected 用例由资源标签排除,不计入通过数。 - -| 检查 | 实际结果 | -|---|---| -| 扩展 CPU 回归(含 Spawn、配置与 Gym 配置加载) | 685 passed,4 deselected,12.37 s | -| 原生 Hybrid / Default + Newton | 4 passed,17.83 s;每个后端包含 1,025 次持续局部随机化 | -| 项目上下文测试 | 42 passed | -| Black 26.3.1 全仓检查 | 1,506 个 Python 文件无需更改 | -| 公共 API 文档覆盖 | 2,805 / 2,805,零遗漏 | -| 上下文链接与路由、diff 空白检查 | 通过 | - -API、引擎生命周期和 HPC 三个独立复核发现的群组 reset、跨入口身份、同 UID 替换、 -失败后快照和等价别名状态问题均已修正并补测。此记录不包含下面的光学图像和长期显存资格项目。 - -## 兼容性与后续发布验收 - -旧配置如果显式保存了 `uid: default_mat`,它现在是一个显式共享名字;需要独立外观时 -删除该字段或指定不同 UID。`get_instance` 和同 UID 的 `create_instance` 返回同一包装器, -不再隐式重置属性;旧调用者若依赖重复创建覆盖属性,应改为显式应用配置。 -读取颜色的调用者应接受原生 RGB;RGBA 写入保持支持。 -`clean_materials()` 清理运行时包装器和未使用的原生缓存,已登记的显式 UID 定义在 World -生命周期内保持身份,避免现有场景或原生句柄被同名不同属性的定义悄悄替换;不同定义使用新 UID。 - -这组测试验收的是材质状态、资源上界和生命周期,不能等同于完整光学图像验收。 -发布时还应在独立 FastRT 进程增加以下资格验证,并保存带环境信息的图片: - -1. 同一灯光、相机、曝光与几何下,BRDF/BTDF/BSDF 的反射和透射表现;透明物体后放置对照色块。 -2. 发光强度 0、1、10 的暗室对照;比较数值与图像,避免仅凭亮度饱和判断强度。 -3. 带多个材质段的 URDF/网格、关节体与可变形对象,在局部 reset 和拓扑重建后保持各段材质。 -4. 文件、Tensor 与原生 Texture 三种输入的颜色空间、法线贴图方向和重复绑定行为。 -5. 记录 10,000 次 reset 的原生实例数、纹理数和 VRAM。区分预热缓存与持续增长, - 不把 Torch 分配器统计当成全部 Vulkan/OptiX 显存。 - -每次验收记录:提交/工作树、实际 wheel 路径与版本、Python/Warp/Newton、GPU/驱动、 -后端与渲染器、命令、通过/失败/跳过项及原因。任何未执行的图像或后端矩阵保持待验证, -不能由 CPU mock 测试替代。 +## Compatibility + +- `base_color` reads return native display-sRGB RGB; configuration and writes + still accept RGBA. +- Unnamed configurations use `uid=None`. Remove an old explicit + `uid: default_mat` or assign distinct UIDs when independent appearances are required. +- Repeated `create_instance(uid)` preserves identity and state. Use + `set_default_properties()` for an explicit property reset. +- Explicit definitions remain reserved for the World lifetime, including after + `clean_materials()` releases runtime wrappers and unused native resources. +- Shared material randomization requires all environments; partial selections + are rejected. + +## Release qualification + +State and lifecycle checks do not establish optical correctness. Before release: + +- Compare BRDF/BTDF/BSDF reflection, transmission, alpha and emission intensities + 0/1/10 in a separate FastRT process with controlled lighting, camera and exposure. +- Check multi-material meshes, URDF articulations and deformables across partial + reset and rebuilds. Compare file, Tensor and native Texture inputs for color + space, normal-map direction and rebinding behavior. +- Run 10,000 resets while recording native instance counts, texture counts and + VRAM. Distinguish warmup caches from sustained growth; Torch allocator statistics + do not cover all Vulkan/OptiX memory. + +Record run-specific environment details, timings, results and unexecuted checks +in the PR description. From 6a421715ef7e8ed16abbcfa27ece5df710401b20 Mon Sep 17 00:00:00 2001 From: yuecideng Date: Fri, 23 Oct 2026 17:08:50 +0800 Subject: [PATCH 03/10] feat(sim): unify default material presets with VisualMaterialCfg --- agent_context/MAP.yaml | 8 +- .../topics/data-assets/data-assets.md | 21 + .../topics/simulation-system/materials.md | 26 +- .../visual-material-acceptance.md | 39 + .../embodichain.lab.sim.material.rst | 80 ++ docs/source/api_reference/public_api.rst | 48 ++ embodichain/data/__init__.py | 3 + embodichain/data/assets/materials.py | 114 ++- embodichain/data/default_materials.json | 787 ++++++++++++++++++ embodichain/data/default_materials.py | 69 ++ embodichain/data/download.py | 8 +- embodichain/lab/sim/_material_presets.py | 391 +++++++++ embodichain/lab/sim/material.py | 183 +++- embodichain/lab/sim/sim_manager.py | 25 +- embodichain/lab/sim/spawn/scene.py | 86 +- examples/sim/rendering/default_materials.py | 356 ++++++++ setup.py | 1 + tests/data/test_default_materials.py | 137 +++ tests/sim/spawn/test_scene.py | 20 + tests/sim/test_material.py | 171 ++++ tests/sim/test_material_integration.py | 102 +++ 21 files changed, 2632 insertions(+), 43 deletions(-) create mode 100644 embodichain/data/default_materials.json create mode 100644 embodichain/data/default_materials.py create mode 100644 embodichain/lab/sim/_material_presets.py create mode 100644 examples/sim/rendering/default_materials.py create mode 100644 tests/data/test_default_materials.py diff --git a/agent_context/MAP.yaml b/agent_context/MAP.yaml index d22f9b0a8..902193def 100644 --- a/agent_context/MAP.yaml +++ b/agent_context/MAP.yaml @@ -25,6 +25,7 @@ topics: - embodichain/lab/sim/physics/ - embodichain/lab/sim/spawn/ - embodichain/lab/sim/material.py + - embodichain/lab/sim/_material_presets.py - embodichain/lab/sim/common.py - embodichain/lab/sim/_startup_summary.py - embodichain/lab/sim/_runtime_controls.py @@ -35,7 +36,7 @@ topics: - embodichain/lab/sim/objects/gizmo.py - embodichain/lab/gym/envs/base_env.py watch_paths: [embodichain/lab/sim/sim_manager.py, embodichain/lab/sim/cfg/, embodichain/lab/sim/physics/, - embodichain/lab/sim/spawn/, embodichain/lab/sim/material.py, embodichain/lab/sim/objects/, tests/sim/] + embodichain/lab/sim/spawn/, embodichain/lab/sim/material.py, embodichain/lab/sim/_material_presets.py, embodichain/lab/sim/objects/, tests/sim/] related_topics: [env-framework, robot-system, sensor-system, sim-visualization, ik-solvers, motion-planning, atomic-actions, rl-learning, configclass-pattern, robot-workspace] status: active @@ -421,7 +422,7 @@ topics: title: Data Assets aliases: [data assets, data path, asset download, 数据资产, 资产下载, 数据路径] keywords: [get_data_path, get_data_class, EmbodiChainDataset, TabletopFourBases, demo assets, EMBODICHAIN_DATA_ROOT, EMBODICHAIN_DATASET_ROOT, - CATEGORY_MODULES, download lock, get_registry] + CATEGORY_MODULES, download lock, get_registry, DefaultMaterials, list_default_materials, get_default_material_info] paths: [topics/data-assets/data-assets.md] source_of_truth: - embodichain/data/dataset.py @@ -429,6 +430,9 @@ topics: - embodichain/data/download.py - embodichain/data/__init__.py - embodichain/data/assets/__init__.py + - embodichain/data/assets/materials.py + - embodichain/data/default_materials.py + - embodichain/data/default_materials.json watch_paths: [embodichain/data/, embodichain/cli/main.py, tests/data/] related_topics: [gen-sim, robot-system, data-pipeline] status: active diff --git a/agent_context/topics/data-assets/data-assets.md b/agent_context/topics/data-assets/data-assets.md index 83fa3d919..25f0c1645 100644 --- a/agent_context/topics/data-assets/data-assets.md +++ b/agent_context/topics/data-assets/data-assets.md @@ -12,6 +12,8 @@ Online sampling and demonstration persistence belong to | Cache roots / mirror prefix | `embodichain/data/constants.py` | | Locked download and ZIP integrity | `embodichain/data/dataset.py`: `EmbodiChainDataset`, `_dataset_download_lock()` | | CLI list/download | `embodichain/data/download.py`: `CATEGORY_MODULES`, `get_registry()`, `download_asset()` | +| Default material catalog / provenance | `embodichain/data/default_materials.py`, `default_materials.json` | +| Default material archive | `embodichain/data/assets/materials.py`: `DefaultMaterials` | | Dataset class visibility | `embodichain/data/__init__.py`, `embodichain/data/assets/__init__.py` | | Pretrained policy bundles | `embodichain/data/assets/policy_assets.py`: `download_pretrained_policy()` | | Unified CLI registration | `embodichain/cli/main.py`: `embodichain data` | @@ -44,6 +46,8 @@ Keep the lock outside the directory repair may delete. POSIX uses `flock`; Windows uses a polled byte lock. Direct Open3D subclasses do not automatically receive the project's locking/repair behavior. +The CLI honors an asset class's optional `cache_prefix` when checking readiness +and ensuring extraction; otherwise the class name is the cache entry. The CLI imports the fixed `CATEGORY_MODULES` and finds `DownloadDataset` subclasses defined in each module. Adding an asset module alone does not add a CLI category. `get_registry()` also appends public classes from @@ -67,6 +71,23 @@ The registered descriptor respects the configured host and falls back to the official Hugging Face dataset. The scene tutorial downloads by asset reference by default and accepts local exports through `--source`. +## Default material resources + +`list_default_materials()` and `get_default_material_info()` are exported from +`embodichain.data` and query wheel-packaged metadata without a World or download. +`setup.py` must include that catalog explicitly. `DefaultMaterials` uses a +revision-specific cache prefix and the shared dataset lock, verifies archive +SHA256 and member digests, and repairs extraction from the verified archive. +Its data CLI registration follows the existing materials category. + +The original DexSim archive is currently on its internal resource server; an +explicit `EMBODICHAIN_DOWNLOAD_PREFIX` selects the catalog's versioned mirror +path. Do not substitute an unverified public URL or depend on a DexSim source +checkout. Preserve upstream manifests, relative auxiliary texture dependencies +and attribution. The material runtime stages JSON only and does not copy PNGs; +see [visual materials](../simulation-system/materials.md) for renderer, override +and native ownership rules. + ## Pretrained policy bundles `eval-policy --pretrained` reads the official model index at a pinned HF commit, diff --git a/agent_context/topics/simulation-system/materials.md b/agent_context/topics/simulation-system/materials.md index 7c8f1ec08..d2b8a9af5 100644 --- a/agent_context/topics/simulation-system/materials.md +++ b/agent_context/topics/simulation-system/materials.md @@ -3,8 +3,30 @@ `embodichain/lab/sim/material.py` owns `VisualMaterialCfg`, material templates, native instance wrappers and segment assignment helpers. Its private `_material_desc_from_cfg()` validates and normalizes both runtime creation and -`spawn/descriptors.py` lowering. Keep material type and emission semantics at -this shared boundary rather than duplicating conversion in callers. +`spawn/descriptors.py` lowering. Handwritten configurations fill historical +defaults during construction. Preset configurations keep unspecified fields +as `None`; only explicit values override resources. `from_dict()` constructs in +that mode before filling defaults. Do not infer override intent from equality +with a default, or modify generic `configclass` for this policy. + +`_material_presets.py` owns validated schema-v1 overrides, renderer preflight and +World-scoped manifest/template caches. `SpawnScene._resolve_materials()` shares +that path with runtime creation. Its resource definition registry reserves UIDs +alongside native Spawn's simplified material registry; full resource definitions +must not pass through the simplified `MaterialDesc` initializer. Bind the exact +loaded child on `RenderDesc.material`, including across rebuilds. NoRender keeps +resource definitions without downloading or creating native materials. Render-only +facades stay declared and are skipped by runtime binding/reset in that mode. + +Resource templates remain immutable. Each public UID and instance receives a +separate child; canonical revision/preset/overrides select shared templates. +Stage parameter variations before binding and keep texture paths in the shared +resource cache. Full resource reset uses native `Material.reset_inst()` instead +of rewriting only common fields. Native model changes after binding and NRD +resource fixes are outside this contract. Catalog/distribution ownership lives +in [data assets](../data-assets/data-assets.md); public usage and renderer limits +are documented in the +[material API](../../../docs/source/api_reference/embodichain/embodichain.lab.sim.material.rst). ## Identity and state diff --git a/docs/architecture/visual-material-acceptance.md b/docs/architecture/visual-material-acceptance.md index 160dfc4b3..7ac7b9454 100644 --- a/docs/architecture/visual-material-acceptance.md +++ b/docs/architecture/visual-material-acceptance.md @@ -49,6 +49,45 @@ python docs/scripts/check_api_docs.py python .agents/skills/project-dev-context/scripts/context.py check ``` +## Default material package + +In addition to the legacy handwritten-material checks above, qualify the unified +`VisualMaterialCfg.from_preset()` route: + +| Boundary | Acceptance | +| --- | --- | +| Inheritance | GlassClear inherits IOR 1.52; explicit 1.5 overrides it. Zero/false are explicit; `replace(ior=None)` restores inheritance. No flat/native duplicate properties or invalid parameters reach native loading. | +| Round trips | Constructor, factory, Python/YAML, copy, replace and dictionary round trips retain the preset and unspecified state. Manual construction retains historical concrete defaults. | +| Distribution | Offline queries list 18 public presets, with SoapBubbleInterior available explicitly. Build/install a wheel away from the source checkout. With an empty data cache, download the pinned archive; repeat without network, repair a missing/corrupt member, and verify auxiliary texture references. | +| Renderer preflight | Ten basic presets load on Hybrid/FastRT/OfflineRT. Eight advanced presets, the helper and advanced parameter variations require OfflineRT. Reject before download/native loading. NoRender preserves declarations and does neither. | +| Native resources | Runtime-first and inline-first aliases share exact handles. Different UIDs use separate children of immutable templates. Repeated creation preserves state and bounded native instance counts. Variants stage JSON only, never duplicate PNGs. | +| Lifecycle | Complete native template reset restores properties beyond the flattened fields. Default/Newton selection, reset, topology rebuild and cleanup preserve identity and expected assignments. | +| Optical parity | Render all 18 on OfflineRT and the ten basic presets on Hybrid and FastRT. Compare the package route to direct native loading with identical geometry/camera/lights, plus a native-repeat noise control. Use closed glass meshes, explicit double shells for bubbles and optional segmented face geometry. | + +```bash +python -m pytest -q tests/data/test_default_materials.py tests/sim/test_material.py +python -m pytest -q --run-gpu tests/sim/test_material_integration.py + +# Each renderer requires a separate process. Run native checks serially. +python examples/sim/rendering/default_materials.py --all --compare-native --renderer rt +python examples/sim/rendering/default_materials.py --all --compare-native --renderer hybrid +python examples/sim/rendering/default_materials.py --all --compare-native --renderer fast-rt +# Optionally add --model /path/to/skin_face.glb for SkinHumanLight. +``` + +The preview writes candidate/native/repeat images and `results.json`. Its center +crop RMSE tolerance is max(3/255, three times native-repeat RMSE plus 0.5/255). +Inspect the images as well as the metric: similar dark or empty frames alone do +not establish material correctness. The first material load includes data-cache +verification; creation timings are descriptive, not a render-throughput claim. +The current pinned upstream address is internal; public mirrors must provide +exactly the archive and versioned path documented in the material API. Asset +redistribution/provenance must be retained when deploying a mirror. + +Parameter variants must be created before binding. Qualification does not cover +cross-model hot shader mutation, NRD packaging fixes, automatic geometry/UV +changes or a global removal of the legacy manual `material_type` interface. + ## Compatibility - `base_color` reads return native display-sRGB RGB; configuration and writes diff --git a/docs/source/api_reference/embodichain/embodichain.lab.sim.material.rst b/docs/source/api_reference/embodichain/embodichain.lab.sim.material.rst index 0d97feb63..3c1377694 100644 --- a/docs/source/api_reference/embodichain/embodichain.lab.sim.material.rst +++ b/docs/source/api_reference/embodichain/embodichain.lab.sim.material.rst @@ -14,6 +14,86 @@ passes; :class:`VisualMaterial` is the resolved material definition and :class:`ReuseSegmentState` tracks per-render-body segment reuse so that segmentation masks stay consistent across replicated environments. +Default material presets +------------------------ + +Handwritten and asset-based materials use the same configuration type:: + + from embodichain.data import list_default_materials, get_default_material_info + from embodichain.lab.sim import VisualMaterialCfg + from embodichain.lab.sim.shapes import SphereCfg + + cfg = VisualMaterialCfg.from_preset( + "GlassClear", uid="glass", ior=1.6, + parameters={"volume_attenuation_distance": 8.0}, + ) + material = sim.create_visual_material(cfg) + shape = SphereCfg(radius=0.25, visual_material=cfg) + +The equivalent YAML is: + +.. code-block:: yaml + + visual_material: + preset: GlassClear + uid: glass + ior: 1.6 + parameters: + volume_attenuation_distance: 8.0 + +With a preset, unspecified common fields remain ``None`` and inherit authored +values. GlassClear therefore retains IOR 1.52 unless an override is supplied; +explicit ``ior=1.5`` sets 1.5. Zero and false values are explicit overrides. +``cfg.replace(ior=None)`` restores inheritance. ``copy()``, ``replace()`` and +dictionary/YAML round trips preserve the other explicit fields. Construct a +new source with ``from_preset()``; ``replace()`` retains the original fields. +Handwritten configurations still fill the historical defaults at construction. + +Common fields stay flat; native schema-v1 advanced parameters belong in +``parameters``. ``emissive_intensity`` normalizes to ``emission_intensity``. +Specifying the same native property in both places is an error. Unknown, +nonfinite, incorrectly typed and out-of-range parameters fail before native +loading. Presets reject ``material_type`` and texture replacement; their native +parameters select scattering. The manual ``material_type`` interface remains +available. Manual configurations with advanced parameters also use a complete +native manifest and retain the manual material-type policy. + +``BrickRed``, ``WoodOak``, ``CeramicTileWhite``, ``MarbleWhite``, ``AsphaltDark``, +``FabricGray``, ``LeatherBrown``, ``PlasticABSBlack``, ``RubberBlack`` and +``SteelBrushed`` support ``hybrid``, ``fast-rt`` and ``rt``. ``ChromePolished``, +``GoldPolished``, ``CopperPolished``, ``GlassClear``, ``GlassFrosted``, +``GlassSmoke``, ``SkinHumanLight`` and ``SoapBubble`` require ``rt`` (OfflineRT). +Advanced parameter variations of a basic preset also require ``rt``; the +factory rejects incompatible renderers before downloading or loading assets. +NoRender stores declarations without downloading or creating native materials. +Render-only VisualObject facades remain unbound in that mode; their declarations +are retained, while physics assets still prepare normally. + +Variants stage only JSON before binding. Textures stay in the shared resource +cache. Equivalent definitions reuse immutable native templates, while each UID +has a separate child instance. Explicit resets restore the entire template, +including advanced parameters and textures. Repeated creation preserves state. +Native shader-model changes after binding are outside this interface's scope; +pre-create variants and bind their instances instead. + +Catalog queries do not require a World or asset download. The archive is lazy, +revisioned and checksum-verified. Pre-download with +``embodichain data download --name DefaultMaterials``. The current upstream +archive is hosted on the DexSim internal resource server. To use a mirror, set +``EMBODICHAIN_DOWNLOAD_PREFIX`` before importing EmbodiChain and place the same +archive at +``materials/default-materials/ec9f748242c50b85/offlinert_materials.zip`` below +that prefix. The wheel contains metadata, not PNGs. The downloaded archive +retains the upstream README and manifests; source attribution and file digests +are recorded in ``embodichain/data/default_materials.json``. + +The optional ``SoapBubbleInterior`` auxiliary material references SoapBubble's +textures. Hollow bubble shells and segmented skin meshes belong to preview +geometry. The factory neither creates those shapes nor changes UVs. +``SkinHumanLight`` approximates diffuse transmission rather than random-walk +subsurface scattering. Run ``examples/sim/rendering/default_materials.py`` for +previews, optional segmented-face geometry and direct-native image comparisons. + .. rubric:: Classes .. autosummary:: diff --git a/docs/source/api_reference/public_api.rst b/docs/source/api_reference/public_api.rst index ea1f17cc6..a729a8cd6 100644 --- a/docs/source/api_reference/public_api.rst +++ b/docs/source/api_reference/public_api.rst @@ -40,6 +40,26 @@ EmbodiChain data cache. ScoopIceNewEnv TabletopFourBases +embodichain.data.assets.materials +------------------------------------ + +Material, environment-map and background bundles use the shared asset cache. +``DefaultMaterials`` downloads the pinned 18-preset collection and its auxiliary +soap-film layer; it does not create a simulator World. + +.. currentmodule:: embodichain.data.assets.materials + +.. autosummary:: + + SimResources + EnvMapHDR + CocoBackground + BackgroundTexture + DefaultMaterials + +.. autoclass:: DefaultMaterials + :members: get_material_path + embodichain.data.assets.planner_assets -------------------------------------- @@ -118,6 +138,34 @@ corrected full-body definition. .. autoclass:: DexforceW1RightArmV021 +embodichain.data.default_materials +------------------------------------ + +The wheel includes catalog metadata so these functions work offline without +asset downloads. Both functions are also available from ``embodichain.data``. +Metadata includes compatible renderer names, source revision, dependencies, +auxiliary resources and suggested physical texture dimensions. Dimensions do +not change geometry or UVs. + +.. currentmodule:: embodichain.data.default_materials + +.. autosummary:: + + list_default_materials + get_default_material_info + +.. autofunction:: list_default_materials + +.. autofunction:: get_default_material_info + +.. currentmodule:: embodichain.data + +.. autofunction:: list_default_materials + :no-index: + +.. autofunction:: get_default_material_info + :no-index: + embodichain.data_pipeline ------------------------- diff --git a/embodichain/data/__init__.py b/embodichain/data/__init__.py index 69479b009..668bf2cb0 100644 --- a/embodichain/data/__init__.py +++ b/embodichain/data/__init__.py @@ -16,6 +16,8 @@ """Dataset resolution, asset-download helpers, preset asset registries, and shared constants/enums used by simulation tasks and training pipelines.""" +from __future__ import annotations + import os from .constants import EMBODICHAIN_DEFAULT_DATABASE_ROOT @@ -27,3 +29,4 @@ from . import assets from .dataset import * +from .default_materials import list_default_materials, get_default_material_info diff --git a/embodichain/data/assets/materials.py b/embodichain/data/assets/materials.py index a627e2673..1c94e072c 100644 --- a/embodichain/data/assets/materials.py +++ b/embodichain/data/assets/materials.py @@ -14,11 +14,16 @@ # limitations under the License. # ---------------------------------------------------------------------------- +from __future__ import annotations + import os +import hashlib +import shutil +import zipfile import open3d as o3d from pathlib import Path -from typing import List +from typing import ClassVar, List from embodichain.data.dataset import EmbodiChainDataset from embodichain.utils import logger @@ -26,10 +31,117 @@ EMBODICHAIN_DOWNLOAD_PREFIX, EMBODICHAIN_DEFAULT_DATA_ROOT, ) +from embodichain.data.default_materials import _catalog, get_default_material_info + +__all__ = [ + "SimResources", + "EnvMapHDR", + "CocoBackground", + "BackgroundTexture", + "DefaultMaterials", +] material_assets = "materials" +class DefaultMaterials(EmbodiChainDataset): + """Lazily download the pinned default-material collection. + + Args: + data_root: Optional data cache root. Each resource revision has its own + locked cache entry. ``EMBODICHAIN_DOWNLOAD_PREFIX`` selects a mirror + containing the catalog's versioned archive path; otherwise the + original DexSim resource server is used (requires network access). + """ + + cache_prefix: ClassVar[str] = f"DefaultMaterials_{_catalog()['bundle']['revision']}" + """Revision-specific cache identity, also used by the data CLI.""" + + def __init__(self, data_root: str | None = None) -> None: + bundle = _catalog()["bundle"] + url = ( + EMBODICHAIN_DOWNLOAD_PREFIX + bundle["mirror_path"] + if os.environ.get("EMBODICHAIN_DOWNLOAD_PREFIX") + else bundle["upstream_url"] + ) + root = EMBODICHAIN_DEFAULT_DATA_ROOT if data_root is None else data_root + prefix = self.cache_prefix + super().__init__(prefix, o3d.data.DataDescriptor(url, bundle["md5"]), root) + archive = Path(self.download_dir) / bundle["archive_name"] + if self._sha256(archive) != bundle["sha256"]: + raise ValueError( + "DefaultMaterials archive does not match its pinned SHA256." + ) + self._verify_files(Path(self.extract_dir)) + + @staticmethod + def _sha256(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as stream: + for block in iter(lambda: stream.read(1024 * 1024), b""): + digest.update(block) + return digest.hexdigest() + + @classmethod + def _verify_files(cls, root: Path) -> None: + for name, info in _catalog()["bundle"]["files"].items(): + path = root / name + if ( + not path.is_file() + or path.stat().st_size != info["size_bytes"] + or cls._sha256(path) != info["sha256"] + ): + raise ValueError( + f"Incomplete or corrupt DefaultMaterials resource: {path}." + ) + + def check_zip( + self, prefix: str, data_descriptor: o3d.data.DataDescriptor, path: str + ) -> None: + """Validate or repair this revision while the dataset lock is held. + + Args: + prefix: Versioned cache entry owned by this dataset. + data_descriptor: Native download descriptor with the pinned MD5. + path: Data cache root, including caller-provided roots. + """ + # Called under EmbodiChainDataset's existing interprocess lock. Repair + # only this revision's extraction, including caches with custom roots. + archive = ( + Path(path) / "download" / prefix / _catalog()["bundle"]["archive_name"] + ) + extracted = Path(path) / "extract" / prefix + if not archive.is_file(): + if extracted.exists(): + shutil.rmtree(extracted) + return + if self._sha256(archive) != _catalog()["bundle"]["sha256"]: + archive.unlink() + if extracted.exists(): + shutil.rmtree(extracted) + return + try: + self._verify_files(extracted) + except ValueError: + if extracted.exists(): + shutil.rmtree(extracted) + # The archive was verified against a built-in immutable digest. + with zipfile.ZipFile(archive) as bundle: + bundle.extractall(extracted) + + def get_material_path(self, name: str) -> str: + """Get an authored preset directory in this verified resource revision. + + Args: + name: Public preset name or ``SoapBubbleInterior``. + + Returns: + Absolute path suitable for DexSim's native material loader. + """ + get_default_material_info(name) + return str(Path(self.extract_dir) / "Material" / name) + + class SimResources(EmbodiChainDataset): def __init__(self, data_root: str = None): data_descriptor = o3d.data.DataDescriptor( diff --git a/embodichain/data/default_materials.json b/embodichain/data/default_materials.json new file mode 100644 index 000000000..2c272debd --- /dev/null +++ b/embodichain/data/default_materials.json @@ -0,0 +1,787 @@ +{ + "schema_version": 1, + "texture_resolution": [ + 1024, + 1024 + ], + "filename_pattern": "{name}_{channel}.png", + "auto_loaded_channels": [ + "Color", + "AmbientOcclusion", + "Roughness", + "Metallic", + "Normal" + ], + "authoring_only_channels": [ + "Displacement" + ], + "advanced_parameters_manifest": "material.json", + "advanced_texture_channels": [ + "Transmission", + "Clearcoat", + "ClearcoatRoughness", + "ClearcoatNormal", + "SheenColor", + "SheenRoughness", + "Iridescence", + "IridescenceThickness", + "SpecularColor", + "SpecularStrength", + "DiffuseTransmissionColor", + "DiffuseTransmissionStrength", + "VolumeAttenuationStrength" + ], + "materials": [ + { + "name": "BrickRed", + "category": "architecture", + "description": "Red fired brick with gray mortar", + "nominal_size_m": [ + 1.2, + 0.84 + ], + "renderers": [ + "hybrid", + "fast-rt", + "rt" + ], + "dependencies": [], + "auxiliary": false, + "geometry_notes": "", + "auxiliary_resources": [] + }, + { + "name": "WoodOak", + "category": "wood", + "description": "Warm oak wood grain", + "nominal_size_m": [ + 0.8, + 0.8 + ], + "renderers": [ + "hybrid", + "fast-rt", + "rt" + ], + "dependencies": [], + "auxiliary": false, + "geometry_notes": "", + "auxiliary_resources": [] + }, + { + "name": "CeramicTileWhite", + "category": "architecture", + "description": "White glazed ceramic tiles with gray grout", + "nominal_size_m": [ + 1.0, + 1.0 + ], + "renderers": [ + "hybrid", + "fast-rt", + "rt" + ], + "dependencies": [], + "auxiliary": false, + "geometry_notes": "", + "auxiliary_resources": [] + }, + { + "name": "MarbleWhite", + "category": "stone", + "description": "Polished white marble with gray veins", + "nominal_size_m": [ + 1.5, + 1.5 + ], + "renderers": [ + "hybrid", + "fast-rt", + "rt" + ], + "dependencies": [], + "auxiliary": false, + "geometry_notes": "", + "auxiliary_resources": [] + }, + { + "name": "AsphaltDark", + "category": "ground", + "description": "Dark asphalt with fine aggregate", + "nominal_size_m": [ + 2.0, + 2.0 + ], + "renderers": [ + "hybrid", + "fast-rt", + "rt" + ], + "dependencies": [], + "auxiliary": false, + "geometry_notes": "", + "auxiliary_resources": [] + }, + { + "name": "FabricGray", + "category": "fabric", + "description": "Fine woven gray fabric", + "nominal_size_m": [ + 0.25, + 0.25 + ], + "renderers": [ + "hybrid", + "fast-rt", + "rt" + ], + "dependencies": [], + "auxiliary": false, + "geometry_notes": "", + "auxiliary_resources": [] + }, + { + "name": "LeatherBrown", + "category": "leather", + "description": "Brown grained leather", + "nominal_size_m": [ + 0.35, + 0.35 + ], + "renderers": [ + "hybrid", + "fast-rt", + "rt" + ], + "dependencies": [], + "auxiliary": false, + "geometry_notes": "", + "auxiliary_resources": [] + }, + { + "name": "PlasticABSBlack", + "category": "polymer", + "description": "Black ABS plastic with a subtle orange-peel finish", + "nominal_size_m": [ + 0.25, + 0.25 + ], + "renderers": [ + "hybrid", + "fast-rt", + "rt" + ], + "dependencies": [], + "auxiliary": false, + "geometry_notes": "", + "auxiliary_resources": [] + }, + { + "name": "RubberBlack", + "category": "polymer", + "description": "Rough black rubber", + "nominal_size_m": [ + 0.25, + 0.25 + ], + "renderers": [ + "hybrid", + "fast-rt", + "rt" + ], + "dependencies": [], + "auxiliary": false, + "geometry_notes": "", + "auxiliary_resources": [] + }, + { + "name": "SteelBrushed", + "category": "metal", + "description": "Directional brushed steel", + "nominal_size_m": [ + 0.5, + 0.5 + ], + "renderers": [ + "hybrid", + "fast-rt", + "rt" + ], + "dependencies": [], + "auxiliary": false, + "geometry_notes": "", + "auxiliary_resources": [] + }, + { + "name": "ChromePolished", + "category": "metal", + "description": "Highly reflective polished chrome", + "nominal_size_m": [ + 0.35, + 0.35 + ], + "renderers": [ + "rt" + ], + "dependencies": [], + "auxiliary": false, + "geometry_notes": "", + "auxiliary_resources": [] + }, + { + "name": "GoldPolished", + "category": "metal", + "description": "Polished gold", + "nominal_size_m": [ + 0.35, + 0.35 + ], + "renderers": [ + "rt" + ], + "dependencies": [], + "auxiliary": false, + "geometry_notes": "", + "auxiliary_resources": [] + }, + { + "name": "CopperPolished", + "category": "metal", + "description": "Polished copper", + "nominal_size_m": [ + 0.35, + 0.35 + ], + "renderers": [ + "rt" + ], + "dependencies": [], + "auxiliary": false, + "geometry_notes": "", + "auxiliary_resources": [] + }, + { + "name": "GlassClear", + "category": "glass", + "description": "Clear solid glass with weak volume absorption", + "nominal_size_m": [ + 0.5, + 0.5 + ], + "renderers": [ + "rt" + ], + "dependencies": [], + "auxiliary": false, + "geometry_notes": "", + "auxiliary_resources": [] + }, + { + "name": "GlassFrosted", + "category": "glass", + "description": "Rough transmitting frosted glass", + "nominal_size_m": [ + 0.5, + 0.5 + ], + "renderers": [ + "rt" + ], + "dependencies": [], + "auxiliary": false, + "geometry_notes": "", + "auxiliary_resources": [] + }, + { + "name": "GlassSmoke", + "category": "glass", + "description": "Gray-blue absorbing smoke glass", + "nominal_size_m": [ + 0.5, + 0.5 + ], + "renderers": [ + "rt" + ], + "dependencies": [], + "auxiliary": false, + "geometry_notes": "", + "auxiliary_resources": [] + }, + { + "name": "SkinHumanLight", + "category": "organic", + "description": "Light human skin with pores and approximate diffuse transmission", + "nominal_size_m": [ + 0.18, + 0.18 + ], + "renderers": [ + "rt" + ], + "dependencies": [], + "auxiliary": false, + "geometry_notes": "Segmented face geometry belongs to the preview; this preset does not provide random-walk subsurface scattering.", + "auxiliary_resources": [] + }, + { + "name": "SoapBubble", + "category": "thin-film", + "description": "Soap film with spatially varying iridescence", + "nominal_size_m": [ + 0.5, + 0.5 + ], + "renderers": [ + "rt" + ], + "dependencies": [], + "auxiliary": false, + "geometry_notes": "For a hollow bubble, bind SoapBubbleInterior to a separate inward-facing inner shell.", + "auxiliary_resources": [ + "SoapBubbleInterior" + ] + }, + { + "name": "SoapBubbleInterior", + "category": "thin-film", + "description": "Inward-facing auxiliary layer for a hollow soap film", + "nominal_size_m": [ + 0.5, + 0.5 + ], + "renderers": [ + "rt" + ], + "dependencies": [ + "SoapBubble" + ], + "auxiliary": true, + "geometry_notes": "Bind to a separately authored inward-facing inner shell.", + "auxiliary_resources": [] + } + ], + "bundle": { + "revision": "ec9f748242c50b85", + "source_repository": "https://github.com/DexForce/dexverse", + "source_commit": "c31dccd3d4a8ef98367e1a95c92c842e0a773596", + "source_path": "modules/dexsim/resources/Material", + "upstream_url": "http://192.168.3.120/CoreEngine/DexSim/resources/offlinert_materials.zip", + "mirror_path": "materials/default-materials/ec9f748242c50b85/offlinert_materials.zip", + "archive_name": "offlinert_materials.zip", + "md5": "f9795c6706dbe0540052e0df9b5b835b", + "sha256": "ec9f748242c50b85b9a99d068836d7231570dfca51f788b9e005b6022c92623d", + "size_bytes": 29949936, + "attribution": "DexForce DexSim OfflineRT material collection. Authored source README and manifests are retained unmodified in the downloaded archive. No separate asset license is present in that source archive.", + "files": { + "Material/AsphaltDark/AsphaltDark_Metallic.png": { + "size_bytes": 13922, + "sha256": "6dc277ac7171be615c76ca0ffe7a721b2f0692c07b51120a0e28824da4c685ad" + }, + "Material/AsphaltDark/AsphaltDark_Color.png": { + "size_bytes": 466078, + "sha256": "bea2dd69577b3058c19ef708ee475205a9fd57cc5cc1d7eabea0b904e2b9f2c5" + }, + "Material/AsphaltDark/AsphaltDark_Roughness.png": { + "size_bytes": 391237, + "sha256": "eff065f9b6a15f484c1abd64b11b0e5718cf903323e3a995085ba82e62879119" + }, + "Material/AsphaltDark/AsphaltDark_Normal.png": { + "size_bytes": 2154019, + "sha256": "6c99d78194745b907b87eefab4b701c3491fffa7fab0f3d90c76ccecf516baba" + }, + "Material/AsphaltDark/AsphaltDark_AmbientOcclusion.png": { + "size_bytes": 675541, + "sha256": "07e1298054571e824223e1af8ed6944b511e8db2d152cf6c74e1d4e803613b56" + }, + "Material/BrickRed/BrickRed_AmbientOcclusion.png": { + "size_bytes": 85111, + "sha256": "dc5c63d3cf26237bdd6043cc92db569cb7ccc8ec5ade8c677eb4fc5e7818251c" + }, + "Material/BrickRed/BrickRed_Normal.png": { + "size_bytes": 898525, + "sha256": "1bed5717d9bfd699348370599962d22c36b00725bfd0d6b59ca9aa72594b7979" + }, + "Material/BrickRed/BrickRed_Roughness.png": { + "size_bytes": 414644, + "sha256": "c5d093082d6d4f08f940a9dc0f47db2694b9b0a50ef70eef1c768b3361a2420c" + }, + "Material/BrickRed/BrickRed_Color.png": { + "size_bytes": 562205, + "sha256": "e9d0e89823ed8ae153a22ea01deefe6eebb7ba94e192b643ae99b374a70b2a55" + }, + "Material/BrickRed/BrickRed_Metallic.png": { + "size_bytes": 13922, + "sha256": "6dc277ac7171be615c76ca0ffe7a721b2f0692c07b51120a0e28824da4c685ad" + }, + "Material/CeramicTileWhite/CeramicTileWhite_Roughness.png": { + "size_bytes": 129300, + "sha256": "9d0472faf51b0c1e6c3990ebb5abbc70de6f313eda0b71b352efee2684788247" + }, + "Material/CeramicTileWhite/CeramicTileWhite_Normal.png": { + "size_bytes": 168738, + "sha256": "566e01fff54e48f42b2002cfd4126be229e8f9f6ed0dc2730119ca4e721bace4" + }, + "Material/CeramicTileWhite/CeramicTileWhite_Color.png": { + "size_bytes": 372086, + "sha256": "622aad55cef21f88b6dca44075c29c745793f4e4cedd435cd5abfe8bd4fa6d7c" + }, + "Material/CeramicTileWhite/CeramicTileWhite_AmbientOcclusion.png": { + "size_bytes": 22670, + "sha256": "0bad3852069f50dad9495edc548efd70968b55a1e186e842d39247c264165cb1" + }, + "Material/CeramicTileWhite/CeramicTileWhite_Metallic.png": { + "size_bytes": 13922, + "sha256": "6dc277ac7171be615c76ca0ffe7a721b2f0692c07b51120a0e28824da4c685ad" + }, + "Material/ChromePolished/ChromePolished_Normal.png": { + "size_bytes": 75414, + "sha256": "3ef74083f5694fb2f7decba181bc79aec8592d2e9d2c0f247f9f9f3fcb10597f" + }, + "Material/ChromePolished/ChromePolished_Color.png": { + "size_bytes": 104437, + "sha256": "c0a7d4f30a646773fbb715d61ba444e99593a8523a3a17f7ca408802a76c0bec" + }, + "Material/ChromePolished/material.json": { + "size_bytes": 588, + "sha256": "0c442d4dc141087ef27faa32ca81e2b5efee16584f741945cb39b721efad553d" + }, + "Material/ChromePolished/ChromePolished_Roughness.png": { + "size_bytes": 50171, + "sha256": "5c83a706792780a794627228dc82d8cc411f40f52e1e1ff4d23b1f78d5b32376" + }, + "Material/ChromePolished/ChromePolished_AmbientOcclusion.png": { + "size_bytes": 15886, + "sha256": "bdea23770958f6d6b4e8a984c836c77a28dc867331e4cace68414e9761d85719" + }, + "Material/ChromePolished/ChromePolished_Metallic.png": { + "size_bytes": 15886, + "sha256": "bdea23770958f6d6b4e8a984c836c77a28dc867331e4cace68414e9761d85719" + }, + "Material/CopperPolished/CopperPolished_Metallic.png": { + "size_bytes": 15886, + "sha256": "bdea23770958f6d6b4e8a984c836c77a28dc867331e4cace68414e9761d85719" + }, + "Material/CopperPolished/CopperPolished_AmbientOcclusion.png": { + "size_bytes": 15886, + "sha256": "bdea23770958f6d6b4e8a984c836c77a28dc867331e4cace68414e9761d85719" + }, + "Material/CopperPolished/CopperPolished_Normal.png": { + "size_bytes": 75606, + "sha256": "e8d51e304169383892367c6927b7b7ff1768fb2c7a3153d91190912994925f03" + }, + "Material/CopperPolished/material.json": { + "size_bytes": 588, + "sha256": "b40e24ae03f0251b0a1fcd96793e8ba23fb1b136951fc11936fd75328d4ace31" + }, + "Material/CopperPolished/CopperPolished_Roughness.png": { + "size_bytes": 51047, + "sha256": "a4a574b0dd11dee7e42156311e78ae6deeea7fee359f6c5fbb317eb15be2a3d4" + }, + "Material/CopperPolished/CopperPolished_Color.png": { + "size_bytes": 76739, + "sha256": "d44db86e838209c2be3c6de226009462d1c082aff015e6a88efa7e555444a266" + }, + "Material/FabricGray/FabricGray_Normal.png": { + "size_bytes": 1630990, + "sha256": "7086a519f162ddce3a4bad589dad4c906b15c05580a5a8c7b69612ebde55aea6" + }, + "Material/FabricGray/FabricGray_Color.png": { + "size_bytes": 809076, + "sha256": "adf4f17f9bc682b0aa7ed65386e33984d7522a88ec9304a97790f9343665271c" + }, + "Material/FabricGray/FabricGray_Metallic.png": { + "size_bytes": 13922, + "sha256": "6dc277ac7171be615c76ca0ffe7a721b2f0692c07b51120a0e28824da4c685ad" + }, + "Material/FabricGray/FabricGray_Roughness.png": { + "size_bytes": 91537, + "sha256": "0cf32a52d8b13cbf2587ff2b0d09fb1a63cc5a5c4787c28e5097df0c1379b9ca" + }, + "Material/FabricGray/FabricGray_AmbientOcclusion.png": { + "size_bytes": 671034, + "sha256": "18b830ad44d26c8f24a203cdd6fcebb4d317df0b2b9263f36beb779505f8f719" + }, + "Material/GlassClear/GlassClear_Color.png": { + "size_bytes": 65512, + "sha256": "6ff83db7f08435e85570f7880aa3c6df0a3f6f974461f1d35427fb2b2d921c24" + }, + "Material/GlassClear/GlassClear_AmbientOcclusion.png": { + "size_bytes": 15886, + "sha256": "bdea23770958f6d6b4e8a984c836c77a28dc867331e4cace68414e9761d85719" + }, + "Material/GlassClear/GlassClear_Normal.png": { + "size_bytes": 252032, + "sha256": "5f6c92db4d79ab04b76645c04c6577891912ca53d632e2dea31f8b16b1ba46c2" + }, + "Material/GlassClear/GlassClear_Metallic.png": { + "size_bytes": 13922, + "sha256": "6dc277ac7171be615c76ca0ffe7a721b2f0692c07b51120a0e28824da4c685ad" + }, + "Material/GlassClear/material.json": { + "size_bytes": 727, + "sha256": "27a838dc38fdac24a1b3e863e1e9be29d069fafb1a32b7325661c69bb52c02b1" + }, + "Material/GlassClear/GlassClear_Roughness.png": { + "size_bytes": 68873, + "sha256": "d3dbd730411489ffa27036c9af60eea8ad90c8b897142721c6c78aa0a3f6b2e8" + }, + "Material/GlassFrosted/GlassFrosted_Roughness.png": { + "size_bytes": 447338, + "sha256": "6c2beba522e89035c8bbeac0eff8af15bbbd5973e8ba12cc2071608c05017c32" + }, + "Material/GlassFrosted/GlassFrosted_Normal.png": { + "size_bytes": 1194686, + "sha256": "cdd2236c318afdd65f485b3c7c2a8994dbb8903bf7cc273d99a0f3fdda34630d" + }, + "Material/GlassFrosted/material.json": { + "size_bytes": 736, + "sha256": "989915da70644307eabf04c124a94f89b98d764c27b0c4597a53d595e7d8e0dd" + }, + "Material/GlassFrosted/GlassFrosted_Metallic.png": { + "size_bytes": 13922, + "sha256": "6dc277ac7171be615c76ca0ffe7a721b2f0692c07b51120a0e28824da4c685ad" + }, + "Material/GlassFrosted/GlassFrosted_AmbientOcclusion.png": { + "size_bytes": 239848, + "sha256": "1f68a1a0f666af54a7e03dcf7b28b9dbf6bc6ba4bfb86e0b1a7359e7cc509ad2" + }, + "Material/GlassFrosted/GlassFrosted_Color.png": { + "size_bytes": 478134, + "sha256": "473de77fc1435254292c1c225fb8bc0a95e8b0a74bf2db12ed758cce84dec48b" + }, + "Material/GlassSmoke/GlassSmoke_AmbientOcclusion.png": { + "size_bytes": 15886, + "sha256": "bdea23770958f6d6b4e8a984c836c77a28dc867331e4cace68414e9761d85719" + }, + "Material/GlassSmoke/GlassSmoke_Metallic.png": { + "size_bytes": 13922, + "sha256": "6dc277ac7171be615c76ca0ffe7a721b2f0692c07b51120a0e28824da4c685ad" + }, + "Material/GlassSmoke/GlassSmoke_Roughness.png": { + "size_bytes": 41208, + "sha256": "516966964eea378c08ae7774cc6fdd8d08151e6098d4d299945acd0f6fd81179" + }, + "Material/GlassSmoke/GlassSmoke_Normal.png": { + "size_bytes": 31503, + "sha256": "13290872674bd8d589e41573f1693f61c8f849509d22b1317363b8615ad1c9f8" + }, + "Material/GlassSmoke/GlassSmoke_Color.png": { + "size_bytes": 266645, + "sha256": "5c491910029480e132751a7b0ef30fa21d3a056a86cfc1da22ad261cabca35c4" + }, + "Material/GlassSmoke/material.json": { + "size_bytes": 715, + "sha256": "0e451e3b6234cb7b96e9ee6ae3ce425a1735b28eff7eb72cb7f12eae825380e9" + }, + "Material/GoldPolished/GoldPolished_Color.png": { + "size_bytes": 85516, + "sha256": "70fe1ac0c815a9ab30ff26316e877f3a1d182feb3e646f1c65d458ef82b3ebd3" + }, + "Material/GoldPolished/material.json": { + "size_bytes": 581, + "sha256": "0494435ed2afbff44e72e2fd3033728399c431218fd4696da79152bfb40e900c" + }, + "Material/GoldPolished/GoldPolished_Metallic.png": { + "size_bytes": 15886, + "sha256": "bdea23770958f6d6b4e8a984c836c77a28dc867331e4cace68414e9761d85719" + }, + "Material/GoldPolished/GoldPolished_AmbientOcclusion.png": { + "size_bytes": 15886, + "sha256": "bdea23770958f6d6b4e8a984c836c77a28dc867331e4cace68414e9761d85719" + }, + "Material/GoldPolished/GoldPolished_Roughness.png": { + "size_bytes": 51250, + "sha256": "9e9d43ab5258510ef0a7415dd58a3f02e921418a868ef9552d9f0ecd8480868f" + }, + "Material/GoldPolished/GoldPolished_Normal.png": { + "size_bytes": 77243, + "sha256": "5ba353c25e94a19bb5f2e39dee0592381c307eebadb4a020d8a21f1f0d4ad2f6" + }, + "Material/LeatherBrown/LeatherBrown_Color.png": { + "size_bytes": 806290, + "sha256": "e7bc2d28da759fdc913957fb5153016be17b90eb750acdb9d22d775360bb5964" + }, + "Material/LeatherBrown/LeatherBrown_Roughness.png": { + "size_bytes": 568256, + "sha256": "ff7ca26cc10953d75c92f46e095138000eaef1c898332db07e944f3ea932b3e3" + }, + "Material/LeatherBrown/LeatherBrown_Normal.png": { + "size_bytes": 2081908, + "sha256": "48ccd2055fba5e13d762fc38fab4863f726725ac7d2e751b8c48a9c61a6d5bfa" + }, + "Material/LeatherBrown/LeatherBrown_AmbientOcclusion.png": { + "size_bytes": 600787, + "sha256": "86a870c4b81d8de4469c66fef116f8d2b7569f880d4972f0cd06ea63a4aca077" + }, + "Material/LeatherBrown/LeatherBrown_Metallic.png": { + "size_bytes": 13922, + "sha256": "6dc277ac7171be615c76ca0ffe7a721b2f0692c07b51120a0e28824da4c685ad" + }, + "Material/MarbleWhite/MarbleWhite_Metallic.png": { + "size_bytes": 13922, + "sha256": "6dc277ac7171be615c76ca0ffe7a721b2f0692c07b51120a0e28824da4c685ad" + }, + "Material/MarbleWhite/MarbleWhite_AmbientOcclusion.png": { + "size_bytes": 184011, + "sha256": "1d9e608a2df6507cc61c1d411e5408a0f85f214b64297f777b400bd9ed4a581b" + }, + "Material/MarbleWhite/MarbleWhite_Color.png": { + "size_bytes": 621517, + "sha256": "abda3d9b580bfff628d646d51ab1eda7ae91d97a63d84164b7b30c4372436026" + }, + "Material/MarbleWhite/MarbleWhite_Roughness.png": { + "size_bytes": 274246, + "sha256": "0923211c80300550b56071c7c14842db9820274413b19916de914c398cbfb960" + }, + "Material/MarbleWhite/MarbleWhite_Normal.png": { + "size_bytes": 500754, + "sha256": "915aeb7392a1d7d07a96e7136f5cadbd0d5596933fe48fced56b8b9eaab1e5e9" + }, + "Material/PlasticABSBlack/PlasticABSBlack_Normal.png": { + "size_bytes": 1049698, + "sha256": "e8a485e73cbb5e7945fa8d34544f4d84816f9b82807736eeb46e745379e6513b" + }, + "Material/PlasticABSBlack/PlasticABSBlack_Roughness.png": { + "size_bytes": 445656, + "sha256": "11d0b71bde236cbc6012da93d75fe0ab99b48c67e3cf08c3caa0cf300b4c32fa" + }, + "Material/PlasticABSBlack/PlasticABSBlack_Color.png": { + "size_bytes": 184591, + "sha256": "e8d5deda3a482651222bc81780357c0d88e10e397a5bfa06a9d04d199aad248f" + }, + "Material/PlasticABSBlack/PlasticABSBlack_AmbientOcclusion.png": { + "size_bytes": 335027, + "sha256": "8b173f7f8f2ef1127b89221d6b8590ec96063d0fb670d19169d7f1d5046f3dd0" + }, + "Material/PlasticABSBlack/PlasticABSBlack_Metallic.png": { + "size_bytes": 13922, + "sha256": "6dc277ac7171be615c76ca0ffe7a721b2f0692c07b51120a0e28824da4c685ad" + }, + "Material/RubberBlack/RubberBlack_AmbientOcclusion.png": { + "size_bytes": 430869, + "sha256": "fc706946fa890601e9c0ad132a61f7b19ec7c9cb6b680fb7fcf67e4ec3bb58ac" + }, + "Material/RubberBlack/RubberBlack_Roughness.png": { + "size_bytes": 421041, + "sha256": "225277d265b364626d17b34049fea19fa3754150c1e1fe30b33eef89d929a3e8" + }, + "Material/RubberBlack/RubberBlack_Metallic.png": { + "size_bytes": 13922, + "sha256": "6dc277ac7171be615c76ca0ffe7a721b2f0692c07b51120a0e28824da4c685ad" + }, + "Material/RubberBlack/RubberBlack_Normal.png": { + "size_bytes": 1960731, + "sha256": "01798359c3ee69383fa45648c73fb738c11ad7bafe202dd28caa14cc8e289887" + }, + "Material/RubberBlack/RubberBlack_Color.png": { + "size_bytes": 276578, + "sha256": "a7b9c2e1894e1ce6401d7061502b5e672dd56b82f44dbe3f5c8befd57d3404d9" + }, + "Material/SkinHumanLight/SkinHumanLight_AmbientOcclusion.png": { + "size_bytes": 153206, + "sha256": "f598b68ec9115fc7b6b27b281bc68aada28687fd8c0791a73ca74f1911c2577a" + }, + "Material/SkinHumanLight/SkinHumanLight_Roughness.png": { + "size_bytes": 549626, + "sha256": "30e940d268b970a03dfdd7cb63628cfbc06acda6aa9d22b584329085cf0b75be" + }, + "Material/SkinHumanLight/SkinHumanLight_Color.png": { + "size_bytes": 195646, + "sha256": "ce5bacdcd87a1e8784ef2191e960119bd8738d906c7e85f9722557f31c1ae97a" + }, + "Material/SkinHumanLight/material.json": { + "size_bytes": 861, + "sha256": "a2ff37eb591a8275e955f027b4817f9f247b853169e7ac4a8304e8e87d67286c" + }, + "Material/SkinHumanLight/SkinHumanLight_Normal.png": { + "size_bytes": 526198, + "sha256": "9f64070801c85286d44557b7572d36bf0456d3b2161190a292abb34149011768" + }, + "Material/SkinHumanLight/SkinHumanLight_Metallic.png": { + "size_bytes": 13922, + "sha256": "6dc277ac7171be615c76ca0ffe7a721b2f0692c07b51120a0e28824da4c685ad" + }, + "Material/SoapBubble/SoapBubble_Normal.png": { + "size_bytes": 781481, + "sha256": "50e93086ae22c4e89cc64a78259afe60b10d16f1a53e1d99e92c75eab7a669a2" + }, + "Material/SoapBubble/SoapBubble_Metallic.png": { + "size_bytes": 13922, + "sha256": "6dc277ac7171be615c76ca0ffe7a721b2f0692c07b51120a0e28824da4c685ad" + }, + "Material/SoapBubble/SoapBubble_Color.png": { + "size_bytes": 29583, + "sha256": "38524c66c715c56f768df86d3d0f1eacf40b093cc1bba12246d1169ce131f529" + }, + "Material/SoapBubble/SoapBubble_IridescenceColor.png": { + "size_bytes": 666142, + "sha256": "478be3eaeaab24c4c7a09f577a0ad68501c195df16f132136d9b151f0dfc814c" + }, + "Material/SoapBubble/material.json": { + "size_bytes": 1124, + "sha256": "eae22fa44d9f417a595064f246e27b39ab5fded9b92a059821b0d4d5b86f7c9f" + }, + "Material/SoapBubble/SoapBubble_IridescenceThickness.png": { + "size_bytes": 180816, + "sha256": "49393f845fd93248fa434ebe795d15517d41560bec19f36ddc81cd6e65a1d7ac" + }, + "Material/SoapBubble/SoapBubble_AmbientOcclusion.png": { + "size_bytes": 15886, + "sha256": "bdea23770958f6d6b4e8a984c836c77a28dc867331e4cace68414e9761d85719" + }, + "Material/SoapBubbleInterior/material.json": { + "size_bytes": 1076, + "sha256": "aff09dae47233767fea6a8297c9f0abec8a9c483b72f70420c73ff07b8aaa4b8" + }, + "Material/SteelBrushed/SteelBrushed_AmbientOcclusion.png": { + "size_bytes": 31509, + "sha256": "cffd780fa1c0414c4d828c7a6c2e53354b1ab48c16af8c799143ce5a26592970" + }, + "Material/SteelBrushed/SteelBrushed_Normal.png": { + "size_bytes": 230534, + "sha256": "1982a6e85e0aa6db4b2187cde28c2a6ec48eba1cdb168d94c7e906b604330a02" + }, + "Material/SteelBrushed/SteelBrushed_Metallic.png": { + "size_bytes": 15886, + "sha256": "bdea23770958f6d6b4e8a984c836c77a28dc867331e4cace68414e9761d85719" + }, + "Material/SteelBrushed/SteelBrushed_Roughness.png": { + "size_bytes": 119608, + "sha256": "6dd65d00276f083e5728dd41b50bcfb61445b98bdb3c5d808921d254bd0e8337" + }, + "Material/SteelBrushed/SteelBrushed_Color.png": { + "size_bytes": 123807, + "sha256": "dad42a69cda26582a9ed64d5818f365d2502ecc3b4548b3a03e86c1f1ad56bc9" + }, + "Material/WoodOak/WoodOak_Metallic.png": { + "size_bytes": 13922, + "sha256": "6dc277ac7171be615c76ca0ffe7a721b2f0692c07b51120a0e28824da4c685ad" + }, + "Material/WoodOak/WoodOak_Color.png": { + "size_bytes": 785857, + "sha256": "560fde97a88c8df04a014c859e97fb7f00311dc0498c647045dd281c0452dea5" + }, + "Material/WoodOak/WoodOak_Roughness.png": { + "size_bytes": 359902, + "sha256": "a4dd93885fc25200e951afbbe42571fd11a1b8b4e1e1a1f596ea6f019085d85f" + }, + "Material/WoodOak/WoodOak_Normal.png": { + "size_bytes": 1014975, + "sha256": "4dd202105de185d904d08e5a8b20fd4d40e8c9b7c68a96e0fe80fa1553e4e8ff" + }, + "Material/WoodOak/WoodOak_AmbientOcclusion.png": { + "size_bytes": 277161, + "sha256": "0ad7dcf106c992d0c008279fea67a17817530496213880b3885ea748c67b4794" + }, + "Material/catalog.json": { + "size_bytes": 3975, + "sha256": "cc0c8f227a26562d2f91f0b0844099af22e6ed44211a7c4b78d3f7328ce2059e" + }, + "Material/README.md": { + "size_bytes": 4224, + "sha256": "382908eacc9a673d7ae86b53b969b921b3bb85852c9e6a7401da05fbacdf676a" + } + } + } +} diff --git a/embodichain/data/default_materials.py b/embodichain/data/default_materials.py new file mode 100644 index 000000000..de8bf7b64 --- /dev/null +++ b/embodichain/data/default_materials.py @@ -0,0 +1,69 @@ +# ---------------------------------------------------------------------------- +# Copyright (c) 2021-2026 DexForce Technology Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ---------------------------------------------------------------------------- + +"""Offline catalog for the versioned DexSim default material collection.""" + +from __future__ import annotations + +import copy +import json +from functools import lru_cache +from importlib.resources import files +from typing import Any + +__all__ = ["list_default_materials", "get_default_material_info"] + + +@lru_cache(maxsize=1) +def _catalog() -> dict[str, Any]: + return json.loads( + files("embodichain.data") + .joinpath("default_materials.json") + .read_text(encoding="utf-8") + ) + + +def list_default_materials() -> list[str]: + """List the 18 public presets without downloading assets or creating a World. + + Returns: + Preset names in catalog order. Auxiliary resources are omitted. + """ + return [item["name"] for item in _catalog()["materials"] if not item["auxiliary"]] + + +def get_default_material_info(name: str) -> dict[str, Any]: + """Read independent metadata for a public preset or auxiliary resource. + + Args: + name: Case-sensitive catalog name, including ``SoapBubbleInterior``. + + Returns: + Description, supported renderers, dependencies, suggested texture size, + geometry guidance and source revision. Suggested sizes do not change UVs. + + Raises: + ValueError: The name is not in the built-in catalog. + """ + for item in _catalog()["materials"]: + if item["name"] == name: + result = copy.deepcopy(item) + result["texture_resolution"] = list(_catalog()["texture_resolution"]) + result["revision"] = _catalog()["bundle"]["revision"] + return result + raise ValueError( + f"Unknown default material {name!r}. Available presets: {', '.join(list_default_materials())}." + ) diff --git a/embodichain/data/download.py b/embodichain/data/download.py index b7661d15f..67acf657c 100644 --- a/embodichain/data/download.py +++ b/embodichain/data/download.py @@ -142,7 +142,7 @@ def download_asset(cls_name: str, cls: type) -> bool: print(f" Downloading {cls_name} ...") try: data_obj = cls() - _ensure_extract(data_obj, cls_name) + _ensure_extract(data_obj, getattr(cls, "cache_prefix", cls_name)) print(f" ✓ {cls_name} ready") return True except Exception as exc: @@ -170,10 +170,12 @@ def cmd_list(args: argparse.Namespace) -> None: sys.exit(1) print(f"\n[{category}] ({len(assets)} assets)") - for cls_name, _ in assets: + for cls_name, cls in assets: # Show whether it is already downloaded extract_dir = os.path.join( - EMBODICHAIN_DEFAULT_DATA_ROOT, "extract", cls_name + EMBODICHAIN_DEFAULT_DATA_ROOT, + "extract", + getattr(cls, "cache_prefix", cls_name), ) status = ( "✓" if os.path.isdir(extract_dir) and os.listdir(extract_dir) else " " diff --git a/embodichain/lab/sim/_material_presets.py b/embodichain/lab/sim/_material_presets.py new file mode 100644 index 000000000..982bedc22 --- /dev/null +++ b/embodichain/lab/sim/_material_presets.py @@ -0,0 +1,391 @@ +# ---------------------------------------------------------------------------- +# Copyright (c) 2021-2026 DexForce Technology Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ---------------------------------------------------------------------------- + +"""Validated native material definitions and World-owned resource lifetimes.""" + +from __future__ import annotations + +import copy +import json +import math +from collections.abc import Sequence +from dataclasses import dataclass +from hashlib import sha256 +from numbers import Real +from pathlib import Path +from tempfile import TemporaryDirectory +from typing import Any, TYPE_CHECKING +from uuid import uuid4 + +from embodichain.data.default_materials import get_default_material_info + +if TYPE_CHECKING: + from .material import VisualMaterialCfg + +__all__: list[str] = [] + +_FLAT_PARAMETERS = { + "base_color": "base_color", + "metallic": "metallic", + "roughness": "roughness", + "emissive": "emissive", + "emissive_intensity": "emission_intensity", + "ior": "ior", +} +_TEXTURE_FIELDS = { + "base_color_texture": "base_color", + "metallic_texture": "metallic", + "roughness_texture": "roughness", + "normal_texture": "normal", + "ao_texture": "ambient_occlusion", +} +_FRACTIONS = { + "metallic", + "roughness", + "reflectance", + "ambient_occlusion", + "transmission", + "anisotropy_strength", + "clearcoat", + "clearcoat_roughness", + "sheen_roughness", + "specular_strength", + "diffuse_transmission_strength", + "iridescence_factor", + "iridescence_min_reflection", +} +_POSITIVE = {"ior", "volume_attenuation_distance", "iridescence_ior"} +_NONNEGATIVE = { + "emission_intensity", + "volume_thickness", + "iridescence_reflection_boost", +} +_VECTORS = { + "base_color": (3, 4), + "emissive": (3,), + "sheen_color": (3,), + "specular_color": (3,), + "diffuse_transmission_color": (3,), + "volume_attenuation_color": (3,), + "iridescence_thickness": (2,), +} +_BOOLEANS = {"thin_walled", "double_sided"} +_BASIC_PARAMETERS = { + "base_color", + "metallic", + "roughness", + "reflectance", + "ambient_occlusion", + "ior", + "emissive", + "emission_intensity", + "double_sided", +} +_TEXTURE_KEYS = { + "base_color", + "ambient_occlusion", + "roughness", + "metallic", + "metallic_roughness", + "normal", + "emissive", + "anisotropy", + "transmission", + "clearcoat", + "clearcoat_roughness", + "clearcoat_normal", + "sheen_color", + "sheen_roughness", + "iridescence", + "iridescence_thickness", + "specular_color", + "specular_strength", + "diffuse_transmission_color", + "diffuse_transmission_strength", + "volume_attenuation_strength", +} + + +def _number(value: Any, key: str) -> float: + if ( + isinstance(value, bool) + or not isinstance(value, Real) + or not math.isfinite(float(value)) + ): + raise ValueError(f"Visual material parameter {key!r} must be a finite number.") + return float(value) + + +def _normalize_parameters(parameters: dict[str, Any]) -> dict[str, Any]: + if not isinstance(parameters, dict): + raise ValueError("Visual material parameters must be a dictionary.") + normalized = {} + for supplied_key, value in parameters.items(): + key = ( + "emission_intensity" + if supplied_key == "emissive_intensity" + else supplied_key + ) + if key in normalized: + raise ValueError(f"Duplicate visual material parameter {key!r}.") + if key in _BOOLEANS: + if not isinstance(value, bool): + raise ValueError( + f"Visual material parameter {key!r} must be a boolean." + ) + normalized[key] = value + elif key in _VECTORS: + if ( + not isinstance(value, Sequence) + or isinstance(value, (str, bytes)) + or len(value) not in _VECTORS[key] + ): + raise ValueError(f"Invalid visual material vector {key!r}.") + vector = [_number(component, key) for component in value] + if any(component < 0 for component in vector) or ( + key == "base_color" and len(vector) == 4 and vector[3] > 1 + ): + raise ValueError(f"Invalid visual material vector {key!r}.") + if key == "iridescence_thickness" and vector[0] > vector[1]: + raise ValueError( + "iridescence_thickness must be ordered from minimum to maximum." + ) + normalized[key] = vector + elif key in _FRACTIONS | _POSITIVE | _NONNEGATIVE | {"anisotropy_rotation"}: + scalar = _number(value, key) + if ( + (key in _FRACTIONS and not 0 <= scalar <= 1) + or (key in _POSITIVE and scalar <= 0) + or (key in _NONNEGATIVE and scalar < 0) + ): + raise ValueError( + f"Invalid visual material parameter {key!r}: {value!r}." + ) + normalized[key] = scalar + else: + raise ValueError(f"Unknown visual material parameter {supplied_key!r}.") + return normalized + + +def _cfg_parameters(cfg: VisualMaterialCfg) -> dict[str, Any]: + parameters = _normalize_parameters(cfg.parameters) + for field_name, key in _FLAT_PARAMETERS.items(): + value = getattr(cfg, field_name) + if value is not None: + if key in parameters: + raise ValueError( + f"Duplicate visual material parameter {key!r} in flat fields and parameters." + ) + parameters[key] = value + return _normalize_parameters(parameters) + + +@dataclass +class _AssetMaterialDesc: + # Keep identity independent of download roots, temporary paths and native + # handles. Names are mutable only for anonymous Spawn declaration naming. + name: str + preset: str | None + parameters_json: str + revision: str + textures: tuple[tuple[str, str], ...] = () + material_type: str | None = None + + def template_key(self) -> str: + definition = ( + self.revision, + self.preset, + self.parameters_json, + self.textures, + self.material_type, + ) + return sha256(repr(definition).encode()).hexdigest() + + +def _asset_desc_from_cfg(cfg: VisualMaterialCfg, uid: str) -> _AssetMaterialDesc: + if cfg.preset is not None: + info = get_default_material_info(cfg.preset) + if cfg.material_type is not None: + raise ValueError( + "Preset materials cannot specify material_type; native parameters select scattering." + ) + if any(getattr(cfg, key) is not None for key in _TEXTURE_FIELDS): + raise ValueError("Preset texture replacement or removal is not supported.") + revision = info["revision"] + else: + revision = "native-manifest-v1" + parameters = _cfg_parameters(cfg) + return _AssetMaterialDesc( + name=uid, + preset=cfg.preset, + parameters_json=json.dumps( + parameters, sort_keys=True, separators=(",", ":"), allow_nan=False + ), + revision=revision, + textures=tuple( + (key, str(getattr(cfg, field_name))) + for field_name, key in _TEXTURE_FIELDS.items() + if getattr(cfg, field_name) is not None + ), + material_type=cfg.material_type if cfg.preset is None else None, + ) + + +def _validate_backend(desc: _AssetMaterialDesc, renderer: str) -> None: + # NoRender stores the full declaration; no native resource is requested. + if renderer == "no-render": + return + supported = ( + get_default_material_info(desc.preset)["renderers"] + if desc.preset + else ["rt", "hybrid", "fast-rt"] + ) + advanced = set(json.loads(desc.parameters_json)) - _BASIC_PARAMETERS + if renderer not in supported or (advanced and renderer != "rt"): + raise ValueError( + f"Visual material {desc.preset or desc.name!r} requires renderer='rt' (OfflineRT); current renderer is {renderer!r}." + ) + + +def _legacy_manifest(directory: Path) -> dict[str, Any]: + # Match the native suffix discovery, including its alphabetical precedence + # for Metalness over Metallic. Displacement remains authoring-only. + suffixes = { + "AmbientOcclusion": "ambient_occlusion", + "Color": "base_color", + "Metallic": "metallic", + "MetallicRoughness": "metallic_roughness", + "Metalness": "metallic", + "Normal": "normal", + "Roughness": "roughness", + } + textures = {} + for suffix, key in suffixes.items(): + matches = sorted(directory.glob(f"*_{suffix}.png")) + if matches: + textures[key] = str(matches[0].resolve()) + return {"schema_version": 1, "parameters": {}, "textures": textures} + + +class _MaterialResources: + """One World owns staged manifests, immutable templates and UID handles. + + Cost scales with distinct definitions and UIDs, never with frames or repeated + lookups. Only JSON is staged; source images stay in the shared data cache. + """ + + def __init__(self, world: Any, renderer: str) -> None: + self._world = world + self.renderer = renderer + self._directory: TemporaryDirectory[str] | None = None + self._dataset: Any | None = None + self._templates: dict[str, Any] = {} + self._instances: dict[str, tuple[Any, Any]] = {} + + def _manifest(self, desc: _AssetMaterialDesc) -> dict[str, Any]: + if desc.preset: + if self._dataset is None: + from embodichain.data.assets.materials import DefaultMaterials + + self._dataset = DefaultMaterials() + directory = Path(self._dataset.get_material_path(desc.preset)) + source = directory / "material.json" + manifest = ( + json.loads(source.read_text(encoding="utf-8")) + if source.is_file() + else _legacy_manifest(directory) + ) + pack_root = directory.parent.resolve() + else: + directory = Path.cwd() + pack_root = None + manifest = { + "schema_version": 1, + "parameters": {}, + "textures": dict(desc.textures), + } + if manifest.get("schema_version") != 1: + raise ValueError( + "Only native material manifest schema_version=1 is supported." + ) + manifest = copy.deepcopy(manifest) + parameters = _normalize_parameters(manifest.get("parameters", {})) + parameters.update(json.loads(desc.parameters_json)) + manifest["parameters"] = _normalize_parameters(parameters) + textures = manifest.get("textures", {}) + if not isinstance(textures, dict) or set(textures) - _TEXTURE_KEYS: + raise ValueError("Invalid native material texture definitions.") + for key, value in textures.items(): + if not isinstance(value, str) or not value: + raise ValueError(f"Invalid native material texture {key!r}.") + path = (directory / value).resolve() + if pack_root is not None and not path.is_relative_to(pack_root): + raise ValueError( + f"Material texture escapes its resource pack: {value!r}." + ) + if not path.is_file(): + raise FileNotFoundError(f"Missing material texture: {path}.") + textures[key] = str(path) + return manifest + + def resolve(self, desc: _AssetMaterialDesc) -> tuple[Any, Any]: + _validate_backend(desc, self.renderer) + if self.renderer == "no-render": + raise RuntimeError("Native material creation requires a renderer.") + if desc.name in self._instances: + return self._instances[desc.name] + key = desc.template_key() + if key not in self._templates: + manifest = self._manifest(desc) + if self._directory is None: + self._directory = TemporaryDirectory(prefix="ec-materials-") + directory = Path(self._directory.name) / key + directory.mkdir(exist_ok=True) + (directory / "material.json").write_text( + json.dumps(manifest, indent=2, allow_nan=False), encoding="utf-8" + ) + if len(str(directory).encode()) > 255: + raise ValueError( + "Native material directory exceeds the 255-byte path limit." + ) + template = self._world.get_env().load_material( + str(directory), f"ec_material_{uuid4().hex}" + ) + if template is None: + raise RuntimeError( + f"DexSim could not load material {desc.preset or desc.name!r}." + ) + if desc.material_type is not None: + from .material import _MATERIAL_TYPES + + template.get_inst().update_pbr_material_type( + _MATERIAL_TYPES[desc.material_type] + ) + self._templates[key] = template + template = self._templates[key] + instance = template.get_inst(f"ec_instance_{uuid4().hex}") + result = (template, instance) + self._instances[desc.name] = result + return result + + def close(self) -> None: + self._instances.clear() + self._templates.clear() + self._dataset = None + if self._directory is not None: + self._directory.cleanup() + self._directory = None + self._world = None diff --git a/embodichain/lab/sim/material.py b/embodichain/lab/sim/material.py index 3a85db3e1..081dff924 100644 --- a/embodichain/lab/sim/material.py +++ b/embodichain/lab/sim/material.py @@ -24,7 +24,7 @@ from dataclasses import dataclass from collections.abc import Sequence -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Any from uuid import uuid4 from dexsim.engine import MaterialInst, Material @@ -32,6 +32,7 @@ if TYPE_CHECKING: from dexsim.spawn import MaterialDesc + from ._material_presets import _AssetMaterialDesc __all__ = [ "VisualMaterialCfg", @@ -43,24 +44,31 @@ @configclass class VisualMaterialCfg: - """Configuration for visual material with PBR properties for rasterization and ray tracing.""" + """Manual PBR properties or explicit overrides of a default material preset. + + With ``preset=None``, unspecified common fields receive the historical + defaults at construction. With a preset, ``None`` inherits the authored + resource value. Serialization retains that distinction. Use + :meth:`from_preset` to construct a new preset configuration; ``replace`` + preserves existing fields rather than switching configuration sources. + """ uid: str | None = None """Explicit shared identity, or None for an automatically named material.""" # Basic PBR properties - base_color: list[float] = [0.5, 0.5, 0.5, 1.0] + base_color: list[float] | None = None """Base color/diffuse color (RGBA)""" - metallic: float = 0.0 + metallic: float | None = None """Metallic factor (0.0 = dielectric, 1.0 = metallic)""" - roughness: float = 0.7 + roughness: float | None = None """Surface roughness (0.0 = smooth, 1.0 = rough)""" # Additional PBR properties - emissive: list[float] = [0.0, 0.0, 0.0] # Emissive color (RGB) - emissive_intensity: float = 1.0 # Emissive intensity multiplier + emissive: list[float] | None = None # Emissive color (RGB) + emissive_intensity: float | None = None # Emissive intensity multiplier # Texture maps base_color_texture: str | None = None @@ -79,25 +87,95 @@ class VisualMaterialCfg: """Ambient occlusion map""" # Ray tracing specific properties - ior: float = 1.5 + ior: float | None = None """Index of refraction for PBR materials, only used in ray tracing.""" - material_type: str = "BRDF" + material_type: str | None = None """Ray tracing material type. Options: 'BRDF', 'BTDF', 'BSDF'""" - # Currently disabled properties - # subsurface: float = 0.0 # Subsurface scattering factor - # subsurface_color: list = [1.0, 1.0, 1.0] # Subsurface scattering color + preset: str | None = None + """Default material name. Presets select scattering from native parameters.""" + + parameters: dict[str, Any] = {} + """Native schema-v1 advanced parameters; cannot duplicate common fields.""" + + def __post_init__(self) -> None: + if self.preset is None: + defaults = { + "base_color": [0.5, 0.5, 0.5, 1.0], + "metallic": 0.0, + "roughness": 0.7, + "emissive": [0.0, 0.0, 0.0], + "emissive_intensity": 1.0, + "ior": 1.5, + "material_type": "BRDF", + } + for key, value in defaults.items(): + if getattr(self, key) is None: + setattr(self, key, copy.deepcopy(value)) + else: + from ._material_presets import _asset_desc_from_cfg + + _asset_desc_from_cfg(self, self.uid or "preset") + + @classmethod + def from_preset( + cls, + name: str, + *, + uid: str | None = None, + parameters: dict[str, Any] | None = None, + **properties: Any, + ) -> VisualMaterialCfg: + """Construct explicit overrides of an authored default material. + + Args: + name: Case-sensitive catalog name, or ``SoapBubbleInterior``. + uid: Optional shared identity within the simulation World. + parameters: Advanced native parameters, such as volume absorption. + **properties: Common fields such as ``ior`` or ``roughness``. + + Returns: + A configuration retaining ``None`` for inherited common fields. + + Raises: + ValueError: A preset, override, duplicate property or texture edit + is invalid. ``material_type`` is unavailable for presets. + """ + from embodichain.data.default_materials import get_default_material_info + + get_default_material_info(name) + return cls( + preset=name, + uid=uid, + parameters={} if parameters is None else parameters, + **properties, + ) @classmethod - def from_dict(cls, cfg_dict: dict) -> VisualMaterialCfg: - base = cls() + def from_dict(cls, cfg_dict: dict[str, Any]) -> VisualMaterialCfg: + """Construct manual defaults or preset overrides from Python/YAML data. + + Args: + cfg_dict: Serialized configuration, including optional ``preset``. + + Returns: + Configuration with inheritance preserved before defaults are filled. + """ + from dataclasses import fields + + names = {item.name for item in fields(cls)} + values = {} for k, v in cfg_dict.items(): - if hasattr(base, k): - setattr(base, k, v) + if k in names: + values[k] = v else: + if cfg_dict.get("preset") is not None: + raise ValueError( + f"Unknown field {k!r} in preset VisualMaterialCfg." + ) logger.log_warning(f"Unknown field '{k}' in VisualMaterialCfg.") - return base + return cls(**values) _MATERIAL_TYPES = { @@ -126,14 +204,26 @@ def _material_color(value: Sequence[float], name: str, size: int) -> tuple[float return tuple(_material_scalar(v, name) for v in value) -def _material_desc_from_cfg(cfg: VisualMaterialCfg, uid: str) -> MaterialDesc: +def _material_desc_from_cfg( + cfg: VisualMaterialCfg, uid: str +) -> MaterialDesc | _AssetMaterialDesc: """Normalize both declaration and runtime material creation at one boundary.""" from dexsim.spawn import MaterialDesc if not isinstance(uid, str) or not uid.strip(): raise ValueError("Visual material uid must be a nonempty string.") + if not isinstance(cfg.parameters, dict): + raise ValueError("Visual material parameters must be a dictionary.") + if cfg.preset is not None: + from ._material_presets import _asset_desc_from_cfg + + return _asset_desc_from_cfg(cfg, uid) if cfg.material_type not in _MATERIAL_TYPES: raise ValueError(f"Invalid visual material_type {cfg.material_type!r}.") + if cfg.parameters: + from ._material_presets import _asset_desc_from_cfg + + return _asset_desc_from_cfg(cfg, uid) color = _material_color(cfg.base_color, "base_color (RGBA)", 4) _material_scalar(color[3], "base_color alpha", upper=1.0) emissive = _material_color(cfg.emissive, "emissive (RGB)", 3) @@ -177,7 +267,12 @@ class VisualMaterial: MAT_TYPE_MAPPING: dict[str, str] = _MATERIAL_TYPES def __init__( - self, cfg: VisualMaterialCfg, mat: Material, *, initialize_default: bool = True + self, + cfg: VisualMaterialCfg, + mat: Material, + *, + initialize_default: bool = True, + mat_inst: MaterialInst | None = None, ) -> None: """Create a template wrapper or borrow an already configured native one. @@ -186,22 +281,33 @@ def __init__( mat: Native template owned by the simulation. initialize_default: Apply configuration to the native default instance. Disable for a known existing template to preserve runtime edits. + mat_inst: Exact child instance of an immutable native resource template. """ self.uid = cfg.uid or f"visual_material_{uuid4().hex}" - _material_desc_from_cfg(cfg, self.uid) + self._definition = _material_desc_from_cfg(cfg, self.uid) + self._uses_manifest = cfg.preset is not None or bool(cfg.parameters) self.cfg = copy.deepcopy(cfg) self.cfg.uid = self.uid self._mat = mat self._instances: dict[str, VisualMaterialInst] = {} + self._native_instance_aliases: dict[str, VisualMaterialInst] = {} # Spawn resolves a named template through its native default instance. # Keep that entry configured too when runtime and declarations share a UID. + if mat_inst is None and self._uses_manifest: + mat_inst = self._mat.get_inst(f"ec_instance_{uuid4().hex}") self._default_mat_inst = VisualMaterialInst( - self.uid, self._mat, mat_inst=self._mat.get_inst() + self.uid, + self._mat, + mat_inst=mat_inst if mat_inst is not None else self._mat.get_inst(), ) - if initialize_default: + if initialize_default and not self._uses_manifest: self.set_default_properties(self._default_mat_inst, self.cfg) self._instances[self.uid] = self._default_mat_inst + if self._uses_manifest: + self._native_instance_aliases[self._default_mat_inst.mat.get_name()] = ( + self._default_mat_inst + ) @property def mat(self) -> Material: @@ -221,6 +327,20 @@ def set_default_properties( cfg: Material properties to apply. """ desc = _material_desc_from_cfg(cfg, self.uid) + if self._uses_manifest: + if desc != self._definition: + raise ValueError( + "Resource material reset requires its original definition; create a variant before binding." + ) + self._mat.reset_inst(mat_inst.mat) + mat_inst._emissive_rgb = None + mat_inst._emissive_intensity = 1.0 + mat_inst.base_color_texture = mat_inst.mat.get_base_color_map() + mat_inst.metallic_texture = None + mat_inst.roughness_texture = None + mat_inst.normal_texture = None + mat_inst.ao_texture = None + return mat_inst.set_base_color(desc.base_color) mat_inst.set_metallic(desc.metallic) mat_inst.set_roughness(desc.roughness) @@ -249,9 +369,20 @@ def create_instance(self, uid: str) -> VisualMaterialInst: """ if uid in self._instances: return self._instances[uid] - inst = VisualMaterialInst(uid, self._mat) - self.set_default_properties(inst, self.cfg) + if self._uses_manifest: + # Distinct public templates may share a native immutable template. + # Keep child names private so their user-provided UIDs cannot alias. + inst = VisualMaterialInst( + uid, + self._mat, + mat_inst=self._mat.get_inst(f"ec_instance_{uuid4().hex}"), + ) + else: + inst = VisualMaterialInst(uid, self._mat) + self.set_default_properties(inst, self.cfg) self._instances[uid] = inst + if self._uses_manifest: + self._native_instance_aliases[inst.mat.get_name()] = inst return inst def get_default_instance(self) -> VisualMaterialInst: @@ -271,6 +402,10 @@ def get_instance(self, uid: str) -> VisualMaterialInst: Returns: VisualMaterialInst: The material instance. """ + if uid in self._instances: + return self._instances[uid] + if uid in self._native_instance_aliases: + return self._native_instance_aliases[uid] if uid not in self._instances: logger.log_error(f"Material instance with uid '{uid}' does not exist.") return self._instances[uid] diff --git a/embodichain/lab/sim/sim_manager.py b/embodichain/lab/sim/sim_manager.py index 934f27518..6a4eb01ce 100644 --- a/embodichain/lab/sim/sim_manager.py +++ b/embodichain/lab/sim/sim_manager.py @@ -728,6 +728,7 @@ def _initialize_simulation( self._world, num_envs=sim_config.num_envs, spacing=(sim_config.arena_space, sim_config.arena_space, 0.0), + renderer=sim_config.render_cfg.renderer, ) self._arenas = list(self._spawn_scene.builder.prepare_arenas()) self._prepared_spawn_topology_revision = -1 @@ -4819,7 +4820,7 @@ def create_visual_material(self, cfg: VisualMaterialCfg) -> VisualMaterial: cfg = cfg.replace(uid=cfg.uid or f"visual_material_{uuid4().hex}") descriptor = _material_desc_from_cfg(cfg, cfg.uid) definitions = self._spawn_scene.builder.materials - registered = definitions.get(cfg.uid) + registered = self._spawn_scene._material_definition(cfg.uid) if registered is not None and registered != descriptor: raise ValueError(f"Conflicting visual material definition for {cfg.uid!r}.") if cfg.uid in self._visual_materials: @@ -4830,13 +4831,19 @@ def create_visual_material(self, cfg: VisualMaterialCfg) -> VisualMaterial: ) return existing - mat: Material | None = self._env.find_material(cfg.uid) - initialize_default = mat is None or registered is None - if mat is None: - mat = self._env.create_pbr_material(cfg.uid, True) - visual_mat = VisualMaterial(cfg, mat, initialize_default=initialize_default) - - definitions[cfg.uid] = descriptor + if cfg.preset is not None or cfg.parameters: + self._spawn_scene._resolve_materials({cfg.uid: descriptor}) + mat, native_inst = self._spawn_scene._material_resources.resolve(descriptor) + visual_mat = VisualMaterial( + cfg, mat, initialize_default=False, mat_inst=native_inst + ) + else: + mat: Material | None = self._env.find_material(cfg.uid) + initialize_default = mat is None or registered is None + if mat is None: + mat = self._env.create_pbr_material(cfg.uid, True) + visual_mat = VisualMaterial(cfg, mat, initialize_default=initialize_default) + definitions[cfg.uid] = descriptor self._visual_materials[cfg.uid] = visual_mat return visual_mat @@ -4923,7 +4930,7 @@ def reset_objects_state( else: articulation.reset(env_ids) for uid, visual in getattr(self, "_visual_objects", {}).items(): - if uid not in excluded_uids: + if uid not in excluded_uids and visual.is_spawn_bound: visual.reset(env_ids) for uid, rigid_obj in self._rigid_objects.items(): if uid not in excluded_uids: diff --git a/embodichain/lab/sim/spawn/scene.py b/embodichain/lab/sim/spawn/scene.py index 7f3f047c9..ed4bea6ad 100644 --- a/embodichain/lab/sim/spawn/scene.py +++ b/embodichain/lab/sim/spawn/scene.py @@ -22,6 +22,11 @@ from typing import Any, Callable, Literal from ._usd_assets import _UsdTextureFiles +from .._material_presets import ( + _AssetMaterialDesc, + _MaterialResources, + _validate_backend, +) __all__ = ["SpawnScene"] @@ -41,6 +46,7 @@ class _AssetDeclaration: descriptor: Any facade: Any | None source_configurator: Callable[[Any], None] | None = None + declaration_only: bool = False class SpawnScene: @@ -57,6 +63,7 @@ def __init__( *, num_envs: int, spacing: tuple[float, float, float] = (0.0, 0.0, 0.0), + renderer: str | None = None, ) -> None: from dexsim.spawn import SceneBuilder @@ -70,6 +77,17 @@ def __init__( ) self._assets: dict[str, _AssetDeclaration] = {} self._usd_texture_files = _UsdTextureFiles() + if renderer is None: + from dexsim.types import Renderer + + renderer = { + Renderer.NORENDER: "no-render", + Renderer.HYBRID: "hybrid", + Renderer.FASTRT: "fast-rt", + Renderer.OFFLINERT: "rt", + }[world.get_renderer_type()] + self._material_resources = _MaterialResources(world, renderer) + self._resource_material_definitions: dict[str, _AssetMaterialDesc] = {} self._pending_material_assignments: ( dict[tuple[str, int, str | None], list[Any]] | None ) = None @@ -78,10 +96,47 @@ def _resolve_materials(self, materials: dict[str, Any]) -> dict[str, Any]: """Resolve package images before DexSim creates native materials.""" resolved = self._usd_texture_files.resolve(materials) for uid, descriptor in resolved.items(): - existing = self.builder.materials.get(uid) + existing = self._material_definition(uid) if existing is not None and existing != descriptor: raise ValueError(f"Conflicting visual material definition for {uid!r}.") - return resolved + resources = { + uid: desc + for uid, desc in resolved.items() + if isinstance(desc, _AssetMaterialDesc) + } + for desc in resources.values(): + _validate_backend(desc, self._material_resources.renderer) + for uid, desc in resources.items(): + if self._material_resources.renderer != "no-render": + self._material_resources.resolve(desc) + self._resource_material_definitions[uid] = desc + # Native Spawn's simplified MaterialDesc path cannot express these + # definitions. Bind the exact loaded child directly on each RenderDesc. + # NoRender retains only metadata and never invokes a native loader. + return {uid: desc for uid, desc in resolved.items() if uid not in resources} + + def _material_definition(self, uid: str) -> Any | None: + return getattr(self, "_resource_material_definitions", {}).get( + uid, self.builder.materials.get(uid) + ) + + def _bind_resource_materials(self, descriptor: Any) -> None: + definitions = getattr(self, "_resource_material_definitions", {}) + if not definitions or self._material_resources.renderer == "no-render": + return + if isinstance(descriptor, (tuple, list)): + for member in descriptor: + self._bind_resource_materials(member) + return + reference = getattr(descriptor, "material_ref", None) + if reference in definitions: + _, descriptor.material = self._material_resources.resolve( + definitions[reference] + ) + for name in ("renders", "links", "mesh", "visual_mesh"): + value = getattr(descriptor, name, None) + if value is not None: + self._bind_resource_materials(value) @property def arena_names(self) -> tuple[str, ...]: @@ -103,6 +158,7 @@ def declare( """Add a descriptor and associate it with an EmbodiChain facade.""" if uid in self._assets: raise ValueError(f"Spawn asset uid is already declared: {uid!r}.") + self._bind_resource_materials(descriptor) self._initialize_facade_declaration(facade) declaration = _AssetDeclaration( kind=kind, @@ -110,6 +166,14 @@ def declare( facade=facade, source_configurator=configure_source, ) + if ( + kind == "visual_object" + and getattr(getattr(self, "_material_resources", None), "renderer", None) + == "no-render" + ): + declaration.declaration_only = True + self._assets[uid] = declaration + return if kind == "rigid_object_group": declaration.descriptor = tuple( @@ -124,6 +188,7 @@ def declare( ): self._resolve_articulation_source(descriptor) configure_source(descriptor) + self._bind_resource_materials(descriptor) declaration.source_configurator = None add_name = { "visual_object": "add_object", @@ -169,6 +234,7 @@ def resolve_sources(self) -> None: if configure is None: continue configure(declaration.descriptor) + self._bind_resource_materials(declaration.descriptor) declaration.source_configurator = None def track( @@ -192,6 +258,9 @@ def track( def remove(self, uid: str) -> None: """Remove a declared asset from its DexSim owner.""" declaration = self._assets[uid] + if getattr(declaration, "declaration_only", False): + del self._assets[uid] + return if declaration.kind in {"soft_object", "cloth_object"}: raise NotImplementedError( "DexSim Spawn does not yet expose pending removal for " @@ -300,6 +369,16 @@ def bind(self) -> None: facade = declaration.facade if facade is None or not facade.is_declared: continue + if ( + declaration.kind == "visual_object" + and getattr( + getattr(self, "_material_resources", None), "renderer", None + ) + == "no-render" + ): + # NoRender has no transform batch for render-only actors. + # Keep their geometry/material declarations without binding. + continue if not facade._entities: facade.attach_spawn_handles(self.handles(uid)) facade.bind_spawn(result) @@ -334,6 +413,9 @@ def close(self) -> None: self.builder.result = None self._assets.clear() self._usd_texture_files.close() + if hasattr(self, "_material_resources"): + self._material_resources.close() + self._resource_material_definitions.clear() def handles(self, uid: str) -> tuple[Any, ...]: """Return currently materialized handles for one logical asset.""" diff --git a/examples/sim/rendering/default_materials.py b/examples/sim/rendering/default_materials.py new file mode 100644 index 000000000..165bd6433 --- /dev/null +++ b/examples/sim/rendering/default_materials.py @@ -0,0 +1,356 @@ +# ---------------------------------------------------------------------------- +# Copyright (c) 2021-2026 DexForce Technology Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ---------------------------------------------------------------------------- + +"""Preview packaged materials and compare them with direct native loading. + +Run ``python examples/sim/rendering/default_materials.py --list`` for offline +metadata. Use ``--all --compare-native --renderer rt`` for optical qualification, +and repeat with ``hybrid`` / ``fast-rt`` for the ten basic materials. Each +renderer must run in a separate process. Scene geometry, lighting and cameras +belong to this example; the material factory only loads material definitions. +""" + +from __future__ import annotations + +import argparse +import json +from pathlib import Path +from time import perf_counter +from typing import Any + + +def build_parser() -> argparse.ArgumentParser: + """Build preview options before importing simulator dependencies.""" + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--list", action="store_true") + parser.add_argument("--all", action="store_true") + parser.add_argument("--material", default="GlassClear") + parser.add_argument("--renderer", choices=("rt", "hybrid", "fast-rt"), default="rt") + parser.add_argument("--compare-native", action="store_true") + parser.add_argument( + "--model", + type=Path, + help="Optional segmented skin face GLB; not part of the material package.", + ) + parser.add_argument( + "--output", type=Path, default=Path("outputs/default-materials") + ) + parser.add_argument("--size", type=int, default=320) + parser.add_argument("--frames", type=int, default=4) + parser.add_argument("--spp", type=int, default=16) + return parser + + +def main(args: argparse.Namespace) -> None: + """Render one material or the renderer-compatible catalog with fixed settings.""" + from embodichain.data import get_default_material_info, list_default_materials + + if args.list: + for name in list_default_materials(): + print(json.dumps(get_default_material_info(name))) + return + if min(args.size, args.frames, args.spp) < 1: + raise ValueError("size, frames and spp must be positive") + names = ( + [ + name + for name in list_default_materials() + if args.renderer in get_default_material_info(name)["renderers"] + ] + if args.all + else [args.material] + ) + # Validate a single incompatible request through production creation rather + # than changing renderers or silently excluding it. + import cv2 + import numpy as np + import dexsim.render as render + from importlib.metadata import version + from embodichain.lab.sim import ( + SimulationManager, + SimulationManagerCfg, + VisualMaterialCfg, + ) + from embodichain.lab.sim.cfg import DenoisingCfg, RenderCfg + from embodichain.data.assets.materials import DefaultMaterials + + args.output.mkdir(parents=True, exist_ok=True) + sim = SimulationManager( + SimulationManagerCfg( + headless=True, + device="cpu", + scene_node_capacity=256, + startup_summary="off", + render_cfg=RenderCfg( + renderer=args.renderer, + spp=args.spp, + min_bounces=3, + max_bounces=14, + tone_mapping_enabled=True, + tone_mapping_exposure=0.9, + denoising=DenoisingCfg(window="optix", offscreen="optix"), + ), + ) + ) + world, env = sim.get_world(), sim.get_env() + camera = sample = inner = native = material = None + rows: list[dict[str, Any]] = [] + try: + sim.enable_physics(False) + sim.set_emission_light([0.85, 0.9, 1.0], 12.0) + # Independent, fixed scene: colored cards reveal transmission, broad + # rectangular lights reveal roughness and normal-map direction. + for index, (x, color) in enumerate( + ( + (-0.85, [0.8, 0.06, 0.02, 1]), + (0.0, [0.8, 0.8, 0.8, 1]), + (0.85, [0.02, 0.18, 0.8, 1]), + ) + ): + card = env.create_cube(0.7, 0.04, 1.9) + card.set_name(f"preview_card_{index}") + card.set_location(x, 1.1, 0.95) + card_material = sim.create_visual_material( + VisualMaterialCfg(uid=f"card_{index}", base_color=color, roughness=0.6) + ) + card.set_material(card_material.inst.mat) + for name, location, direction, color, power in ( + ("key", (-2, -2, 3), (2, 2, -2), (1, 0.85, 0.7), 60), + ("fill", (2, 0, 3), (-2, 0, -2), (0.6, 0.8, 1), 40), + ): + light = env.create_light(name, render.LightType.RECT) + light.set_location(*location) + light.set_direction(*direction) + light.set_color(*color) + light.set_intensity(power) + light.set_rect_wh(1.8, 1.1) + camera = env.create_camera( + "material_camera", args.size, args.size, True, render.ViewFlags.COLOR + ) + camera.set_near(0.02) + camera.set_far(20) + focal = args.size * 1.4 + camera.set_intrinsic( + np.array( + [[focal, 0, args.size / 2], [0, focal, args.size / 2], [0, 0, 1]], + dtype=np.float32, + ) + ) + camera.look_at([1.5, -3.8, 1.8], [0, 0, 0.8], [0, 0, 1]) + camera.open_camera() + source = DefaultMaterials() if args.compare_native else None + for name in names: + started = perf_counter() + material = sim.create_visual_material( + VisualMaterialCfg.from_preset(name, uid=f"preset_{name}") + ) + load_ms = (perf_counter() - started) * 1000 + if sample is not None: + env.remove_actor(sample) + if inner is not None: + env.remove_actor(inner) + inner = None + skin_segments = None + if name == "SkinHumanLight" and args.model: + if not args.model.is_file(): + raise FileNotFoundError(args.model) + sample = env.load_actor(str(args.model.resolve()), False, False) + env.attach(sample.node) + world.update(0.0) + body = sample.get_render_body() + skin_segments = [ + i + for i in range(body.get_mesh_count()) + if "skin" in body.get_segment_name(i).lower() + ] + if ( + not skin_segments + and body.get_mesh_count() == 8 + and all(not body.get_segment_name(i) for i in range(8)) + ): + skin_segments = [0, 1] # Explicit SkinFaceDemo GLB-order fallback. + if not skin_segments: + raise ValueError("The supplied face model has no Skin_* segments.") + camera.look_at([0.19, -0.69, 0.165], [0, 0, 0.10], [0, 0, 1]) + else: + category = get_default_material_info(name)["category"] + sample = ( + env.create_cube(1.3, 0.16, 1.3) + if category in {"architecture", "wood", "stone", "ground"} + else env.create_sphere(0.66, 96, 3, 2) + ) + sample.set_location(0, 0, 0.8) + sample.set_name(f"preview_{name}") + camera.look_at([1.5, -3.8, 1.8], [0, 0, 0.8], [0, 0, 1]) + if name == "SoapBubble": + # Geometry stays here: a smaller reversed-axis shell supplies + # the air-facing interface. UVs and nominal sizes are untouched. + inner = env.create_sphere(0.66, 96, 3, 2) + inner.set_name("preview_inner_shell") + inner.set_location(0, 0, 0.8) + inner.set_scale(-0.975, 0.975, 0.975) + + def bind(instance: Any, inner_instance: Any | None = None) -> None: + if skin_segments is None: + sample.set_material(instance) + else: + for segment in skin_segments: + sample.get_render_body().set_mesh_material(segment, instance) + if inner is not None: + inner.set_material(inner_instance) + + def capture(label: str) -> Any: + for _ in range(args.frames): + world.update(0.0) + camera.render(render.ViewFlags.COLOR, render.ViewFlags.COLOR, False) + rgb = np.ascontiguousarray(camera.get_rgb_map()[..., :3]) + cv2.imwrite( + str(args.output / f"{name}_{label}.png"), + cv2.cvtColor(rgb, cv2.COLOR_RGB2BGR), + ) + return rgb + + inner_material = ( + sim.create_visual_material( + VisualMaterialCfg.from_preset( + "SoapBubbleInterior", uid="bubble_inner" + ) + ) + if inner is not None + else None + ) + bind(material.inst.mat, inner_material.inst.mat if inner_material else None) + packaged = capture("preset") + row: dict[str, Any] = { + "name": name, + "load_ms": load_ms, + "ior": material.inst.ior, + "roughness": material.inst.roughness, + "native_match": None, + } + if source: + native = env.load_material( + source.get_material_path(name), f"reference_{name}" + ) + native_inner = ( + env.load_material( + source.get_material_path("SoapBubbleInterior"), + "reference_inner", + ) + if inner is not None + else None + ) + bind( + native.get_inst(), native_inner.get_inst() if native_inner else None + ) + reference = capture("native") + repeat = capture("native_repeat") + crop = np.s_[ + args.size // 4 : 3 * args.size // 4, + args.size // 4 : 3 * args.size // 4, + :, + ] + difference = float( + np.sqrt( + np.mean( + ( + packaged[crop].astype(float) + - reference[crop].astype(float) + ) + ** 2 + ) + ) + ) + noise = float( + np.sqrt( + np.mean( + (repeat[crop].astype(float) - reference[crop].astype(float)) + ** 2 + ) + ) + ) + row.update( + rmse=difference, + native_repeat_rmse=noise, + threshold=max(3.0, 3 * noise + 0.5), + native_match=difference <= max(3.0, 3 * noise + 0.5), + ) + for getter in ( + "get_ior", + "get_roughness", + "get_metallic", + "get_transmission", + ): + actual, expected = ( + getattr(material.inst.mat, getter)(), + getattr(native.get_inst(), getter)(), + ) + if expected is None or actual is None: + assert expected is actual, (name, getter, actual, expected) + else: + assert np.isclose(actual, expected, atol=1e-5), ( + name, + getter, + actual, + expected, + ) + assert row["native_match"], row + rows.append(row) + print(json.dumps(row), flush=True) + # Exercise every unsupported advanced preset before native loading in + # real-time processes, including an advanced variation of a basic one. + rejected = [] + if args.renderer != "rt": + for name in list_default_materials(): + if args.renderer not in get_default_material_info(name)["renderers"]: + try: + sim.create_visual_material(VisualMaterialCfg.from_preset(name)) + except ValueError: + rejected.append(name) + else: + raise AssertionError(f"Backend accepted advanced preset {name}") + try: + sim.create_visual_material( + VisualMaterialCfg.from_preset( + "BrickRed", parameters={"clearcoat": 0.0} + ) + ) + except ValueError: + rejected.append("BrickRed:clearcoat") + else: + raise AssertionError("Backend accepted an advanced parameter variation") + report = { + "renderer": args.renderer, + "dexsim": version("dexsim-engine"), + "size": args.size, + "frames": args.frames, + "spp": args.spp, + "materials": rows, + "backend_rejections": rejected, + } + (args.output / "results.json").write_text( + json.dumps(report, indent=2) + "\n", encoding="utf-8" + ) + finally: + if camera is not None: + camera.close_camera() + sim.destroy(exit_process=False) + del sample, inner, native, material, camera + SimulationManager.flush_cleanup_queue() + + +if __name__ == "__main__": + main(build_parser().parse_args()) diff --git a/setup.py b/setup.py index 7227d3a03..bec663480 100644 --- a/setup.py +++ b/setup.py @@ -171,6 +171,7 @@ def main(): package_dir=get_package_dir(), package_data={ "embodichain": ["VERSION"], + "embodichain.data": ["default_materials.json"], "embodichain.gen_sim.simready_pipeline.configs": ["*.json"], "embodichain_tasks.configs": [ "**/*.json", diff --git a/tests/data/test_default_materials.py b/tests/data/test_default_materials.py new file mode 100644 index 000000000..98d33eb2f --- /dev/null +++ b/tests/data/test_default_materials.py @@ -0,0 +1,137 @@ +# ---------------------------------------------------------------------------- +# Copyright (c) 2021-2026 DexForce Technology Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ---------------------------------------------------------------------------- + +"""Offline discovery, CLI registration and immutable resource distribution.""" + +from __future__ import annotations + +import hashlib +import zipfile +from pathlib import Path + +import pytest + +from embodichain.data import list_default_materials, get_default_material_info +from embodichain.data.default_materials import _catalog +from embodichain.data.assets.materials import DefaultMaterials +from embodichain.data.download import get_registry + +pytestmark = pytest.mark.no_sim + + +def test_offline_catalog_is_independent_and_includes_geometry_guidance(monkeypatch): + def fail(*args, **kwargs): + raise AssertionError("Offline metadata must not construct a dataset") + + monkeypatch.setattr(DefaultMaterials, "__init__", fail) + names = list_default_materials() + assert len(names) == len(set(names)) == 18 + assert "SoapBubbleInterior" not in names + assert ( + sum(get_default_material_info(name)["renderers"] == ["rt"] for name in names) + == 8 + ) + glass = get_default_material_info("GlassClear") + assert glass["renderers"] == ["rt"] + assert glass["nominal_size_m"] == [0.5, 0.5] + glass["renderers"].clear() + assert get_default_material_info("GlassClear")["renderers"] == ["rt"] + assert get_default_material_info("SoapBubble")["geometry_notes"] + assert get_default_material_info("SoapBubbleInterior")["auxiliary"] + assert ("DefaultMaterials", DefaultMaterials) in get_registry()["materials"] + with pytest.raises(ValueError, match="Unknown default material"): + get_default_material_info("glassclear") + + +def test_verified_archive_repairs_missing_dependency_in_custom_cache( + tmp_path, monkeypatch +): + # Exercise the production constructor, lock and Open3D cache path without + # depending on a network server in unit tests. + payload = { + "Material/SoapBubble/Color.png": b"original pixels", + "Material/SoapBubbleInterior/material.json": b"{}", + } + archive = tmp_path / "fixture.zip" + with zipfile.ZipFile(archive, "w") as bundle: + for directory in ( + "Material/", + "Material/SoapBubble/", + "Material/SoapBubbleInterior/", + ): + bundle.writestr(directory, b"") + for name, content in payload.items(): + bundle.writestr(name, content) + digest = hashlib.sha256(archive.read_bytes()).hexdigest() + metadata = dict( + _catalog(), + bundle={ + **_catalog()["bundle"], + "revision": "test", + "archive_name": "fixture.zip", + "md5": hashlib.md5(archive.read_bytes()).hexdigest(), + "sha256": digest, + "upstream_url": str(archive), + "files": { + name: { + "size_bytes": len(content), + "sha256": hashlib.sha256(content).hexdigest(), + } + for name, content in payload.items() + }, + }, + ) + monkeypatch.setattr("embodichain.data.assets.materials._catalog", lambda: metadata) + monkeypatch.setattr(DefaultMaterials, "cache_prefix", "DefaultMaterials_test") + monkeypatch.delenv("EMBODICHAIN_DOWNLOAD_PREFIX", raising=False) + # Preseed a valid downloaded archive, as if downloaded on another run. + root = tmp_path / "custom-cache" + download = root / "download/DefaultMaterials_test" + download.mkdir(parents=True) + (download / "fixture.zip").write_bytes(archive.read_bytes()) + extract = root / "extract/DefaultMaterials_test" + extract.mkdir(parents=True) + (extract / "unrelated").write_bytes(b"partial extraction") + first = DefaultMaterials(str(root)) + texture = Path(first.get_material_path("SoapBubble")) / "Color.png" + assert texture.read_bytes() == b"original pixels" + texture.write_bytes(b"corrupted pixels") + second = DefaultMaterials(str(root)) + assert Path(second.extract_dir) == extract + assert texture.read_bytes() == b"original pixels" + assert (extract / "Material/SoapBubbleInterior/material.json").read_bytes() == b"{}" + + +def test_data_cli_reports_the_versioned_cache_as_ready(tmp_path, monkeypatch, capsys): + from argparse import Namespace + from embodichain.data import download + + monkeypatch.setattr(download, "EMBODICHAIN_DEFAULT_DATA_ROOT", str(tmp_path)) + extracted = tmp_path / "extract" / DefaultMaterials.cache_prefix + extracted.mkdir(parents=True) + (extracted / "Material").mkdir() + download.cmd_list(Namespace(category="materials")) + assert "[✓] DefaultMaterials" in capsys.readouterr().out + observed = [] + monkeypatch.setattr( + download, "_ensure_extract", lambda obj, prefix: observed.append(prefix) + ) + + class CachedMaterials: + cache_prefix = DefaultMaterials.cache_prefix + + assert download.download_asset("DefaultMaterials", CachedMaterials) + assert observed == [DefaultMaterials.cache_prefix] diff --git a/tests/sim/spawn/test_scene.py b/tests/sim/spawn/test_scene.py index 53ef4c2ad..2dc2f62c7 100644 --- a/tests/sim/spawn/test_scene.py +++ b/tests/sim/spawn/test_scene.py @@ -629,3 +629,23 @@ def test_replacement_declaration_does_not_attach_uncommitted_old_handle() -> Non scene.builder.has_pending_changes = False scene.bind() assert facade._entities == [new_handle] + + +def test_no_render_retains_visual_declaration_without_native_transform_binding(): + scene = _make_scene({}) + scene._material_resources = SimpleNamespace(renderer="no-render") + facade = MagicMock() + facade.is_declared = True + scene.builder.add_object = MagicMock() + scene.declare( + "visual_object", "visual", SimpleNamespace(name="visual"), facade=facade + ) + + scene.bind() + + facade.bind_spawn.assert_not_called() + facade.attach_spawn_handles.assert_not_called() + scene.builder.add_object.assert_not_called() + assert "visual" in scene._assets + scene.remove("visual") + assert "visual" not in scene._assets diff --git a/tests/sim/test_material.py b/tests/sim/test_material.py index fd958204c..cbc97df6c 100644 --- a/tests/sim/test_material.py +++ b/tests/sim/test_material.py @@ -386,3 +386,174 @@ def test_deterministic_group_reset_reapplies_properties_only_to_selected_environ assert first.roughness == pytest.approx(0.9) assert second.roughness == pytest.approx(0.2) + + +def test_preset_inheritance_and_yaml_roundtrip_keep_explicit_defaults(): + import yaml + from embodichain.lab.sim.material import _material_desc_from_cfg + from embodichain.lab.sim.shapes import ShapeCfg + + cfg = VisualMaterialCfg.from_preset("GlassClear", uid="glass") + assert cfg.ior is None + explicit = cfg.replace(ior=1.5, roughness=0.0) + explicit.parameters = {"thin_walled": False, "transmission": 0.0} + restored = VisualMaterialCfg.from_dict( + yaml.safe_load(yaml.safe_dump(explicit.to_dict())) + ) + assert restored.to_dict() == explicit.to_dict() + shape = ShapeCfg.from_dict( + yaml.safe_load( + yaml.safe_dump( + { + "shape_type": "Sphere", + "radius": 0.25, + "visual_material": explicit.to_dict(), + } + ) + ) + ) + assert shape.visual_material.to_dict() == explicit.to_dict() + assert restored.copy().to_dict() == explicit.to_dict() + assert restored.replace(ior=None).ior is None + assert restored.replace(ior=None).roughness == 0.0 + inherited_desc = _material_desc_from_cfg(cfg, "glass") + explicit_desc = _material_desc_from_cfg(explicit, "glass") + assert inherited_desc != explicit_desc + assert VisualMaterialCfg.from_dict({"preset": "GlassClear"}).ior is None + assert VisualMaterialCfg().ior == 1.5 + assert VisualMaterialCfg().roughness == 0.7 + assert VisualMaterialCfg().material_type == "BRDF" + assert ( + _material_desc_from_cfg(VisualMaterialCfg.from_dict(cfg.to_dict()), "glass") + == inherited_desc + ) + + +@pytest.mark.parametrize( + "properties", + [ + {"ior": 1.5, "parameters": {"ior": 1.6}}, + {"emissive_intensity": 0.0, "parameters": {"emission_intensity": 1.0}}, + {"parameters": {"emission_intensity": 1.0, "emissive_intensity": 2.0}}, + {"parameters": {"thin_walled": 0}}, + {"parameters": {"volume_attenuation_distance": 0.0}}, + {"parameters": {"iridescence_thickness": [520, 250]}}, + {"parameters": {"transmission": float("nan")}}, + {"parameters": {"transmission": None}}, + {"parameters": {"misspelled": 1.0}}, + {"ior": 0.0}, + {"roughness": 1.1}, + {"material_type": "BSDF"}, + {"base_color_texture": "override.png"}, + ], +) +def test_preset_invalid_overrides_fail_before_download(properties): + with pytest.raises(ValueError): + VisualMaterialCfg.from_preset("GlassClear", **properties) + + +def test_resource_wrapper_preserves_authored_template_and_resets_full_instance(): + template = _native_template() + default = template.get_inst() + default.set_pbr_param("ior", 1.52) + child = template.get_inst("private_child") + child.set_pbr_param("ior", 1.52) + template.reset_mock() + cfg = VisualMaterialCfg.from_preset("GlassClear", uid="glass") + material = VisualMaterial(cfg, template, initialize_default=False, mat_inst=child) + assert material.inst.mat is child + child.set_roughness.assert_not_called() + child.update_pbr_material_type.assert_not_called() + assert default.get_ior() == pytest.approx(1.52) + material.set_default_properties(material.inst, cfg) + template.reset_inst.assert_called_once_with(child) + with pytest.raises(ValueError, match="original definition"): + material.set_default_properties(material.inst, cfg.replace(ior=1.6)) + + +def test_preset_backend_preflight_and_no_render_declarations(): + from embodichain.lab.sim._material_presets import _MaterialResources + from embodichain.lab.sim.material import _material_desc_from_cfg + + manager = _material_manager() + scene = manager._spawn_scene + world = MagicMock() + scene._material_resources = _MaterialResources(world, "hybrid") + scene._resource_material_definitions = {} + glass = _material_desc_from_cfg( + VisualMaterialCfg.from_preset("GlassClear"), "glass" + ) + with pytest.raises(ValueError, match="OfflineRT"): + scene._resolve_materials({"glass": glass}) + advanced = _material_desc_from_cfg( + VisualMaterialCfg.from_preset("BrickRed", parameters={"clearcoat": 0.0}), + "brick", + ) + with pytest.raises(ValueError, match="OfflineRT"): + scene._resolve_materials({"brick": advanced}) + world.get_env.assert_not_called() + scene._material_resources.renderer = "no-render" + assert scene._resolve_materials({"glass": glass}) == {} + assert scene._material_definition("glass") == glass + world.get_env.assert_not_called() + scene._material_resources.close() + + +def test_native_manifest_variants_share_images_and_templates_without_mutation( + tmp_path, monkeypatch +): + import json + from pathlib import Path + from embodichain.lab.sim._material_presets import _MaterialResources + from embodichain.lab.sim.material import _material_desc_from_cfg + + source = tmp_path / "Material/GlassClear" + source.mkdir(parents=True) + (source / "Color.png").write_bytes(b"shared original image") + manifest = { + "schema_version": 1, + "parameters": { + "ior": 1.52, + "transmission": 1.0, + "volume_attenuation_color": [0.995, 0.998, 1.0], + "iridescence_thickness": [250, 520], + }, + "textures": {"base_color": "Color.png"}, + } + original = json.dumps(manifest) + (source / "material.json").write_text(original) + dataset = SimpleNamespace(get_material_path=lambda name: str(source)) + monkeypatch.setattr( + "embodichain.data.assets.materials.DefaultMaterials", lambda: dataset + ) + world = MagicMock() + world.get_env.return_value.load_material.side_effect = ( + lambda *args: _native_template() + ) + resources = _MaterialResources(world, "rt") + cfg = VisualMaterialCfg.from_preset( + "GlassClear", + ior=1.5, + parameters={"volume_attenuation_distance": 8.0, "thin_walled": False}, + ) + try: + first = resources.resolve(_material_desc_from_cfg(cfg, "one")) + second = resources.resolve(_material_desc_from_cfg(cfg, "two")) + assert first[0] is second[0] + assert first[1] is not second[1] + assert resources.resolve(_material_desc_from_cfg(cfg, "one")) is first + world.get_env.return_value.load_material.assert_called_once() + directory = Path(world.get_env.return_value.load_material.call_args.args[0]) + staged = json.loads((directory / "material.json").read_text()) + assert staged["parameters"] == { + **manifest["parameters"], + "ior": 1.5, + "volume_attenuation_distance": 8.0, + "thin_walled": False, + } + assert Path(staged["textures"]["base_color"]) == source / "Color.png" + assert list(directory.iterdir()) == [directory / "material.json"] + assert (source / "material.json").read_text() == original + finally: + resources.close() + assert not directory.exists() diff --git a/tests/sim/test_material_integration.py b/tests/sim/test_material_integration.py index eacb842be..35315715a 100644 --- a/tests/sim/test_material_integration.py +++ b/tests/sim/test_material_integration.py @@ -240,3 +240,105 @@ def test_native_material_creation_reset_and_topology_rebuild(physics): sim.destroy(exit_process=False) del obj, other, runtime SimulationManager.flush_cleanup_queue() + + +@pytest.mark.parametrize("physics", ["default", "newton"]) +def test_native_preset_identity_reset_and_rebuild(physics): + sim = SimulationManager( + SimulationManagerCfg( + headless=True, + device="cpu", + num_envs=2, + scene_node_capacity=128, + physics_cfg=physics_cfg_for_backend(physics), + render_cfg=RenderCfg(renderer="hybrid"), + ) + ) + cfg = VisualMaterialCfg.from_preset( + "BrickRed", uid="brick", ior=1.6, roughness=0.25 + ) + obj = runtime = other = child = extra = selected = alias = None + try: + # Inline first, then runtime creation borrows the exact current handle. + obj = sim.add_rigid_object( + RigidObjectCfg( + uid="brick_shape", + body_type="static", + init_pos=(0, 0, 0.5), + shape=CubeCfg(size=(0.1, 0.1, 0.1), visual_material=cfg), + ) + ) + sim.prepare() + original_ids = [m.mat.get_material_id() for m in obj.get_visual_material_inst()] + assert obj.get_visual_material_inst()[0].ior == pytest.approx(1.6) + obj.get_visual_material_inst()[0].set_roughness(0.55) + runtime = sim.create_visual_material(cfg) + assert runtime.inst.mat.get_material_id() == original_ids[0] + assert runtime.inst.roughness == pytest.approx(0.55) + # Equivalent UIDs share immutable native templates, with separate children. + other = sim.create_visual_material(cfg.replace(uid="other_brick")) + assert other.inst.mat.get_material_id() != runtime.inst.mat.get_material_id() + assert other.inst.roughness == pytest.approx(0.25) + assert runtime.mat.get_inst().get_roughness() == pytest.approx(0.25) + assert ( + other.mat.get_inst().get_material_id() + == runtime.mat.get_inst().get_material_id() + ) + child = runtime.create_instance("other_brick") + assert child.mat.get_material_id() != other.inst.mat.get_material_id() + child.set_ior(2.0) + child.mat.set_transmission(0.75) + assert child.mat.get_transmission() == pytest.approx(0.75) + runtime.set_default_properties(child, cfg) + assert child.ior == pytest.approx(1.6) + # The authored legacy template leaves transmission unset (native None). + assert child.mat.get_transmission() is None + count = runtime.mat.inst_count() + for _ in range(1025): + assert runtime.create_instance("other_brick") is child + assert sim.create_visual_material(cfg) is runtime + assert runtime.mat.inst_count() == count + with pytest.raises(ValueError, match="Conflicting visual material"): + sim.create_visual_material(cfg.replace(ior=1.7)) + # Runtime first, then a Spawn declaration binds that exact child. + alias = sim.add_visual_object( + VisualObjectCfg( + uid="runtime_alias", + shape=CubeCfg( + size=(0.1, 0.1, 0.1), visual_material=cfg.replace(uid="other_brick") + ), + ) + ) + assert ( + alias.get_visual_material_inst()[0].mat.get_material_id() + == other.inst.mat.get_material_id() + ) + obj.set_visual_material(other, [1]) + selected = obj.get_visual_material_inst([1])[0] + assert ( + other.get_instance(selected.uid).mat.get_material_id() + == selected.mat.get_material_id() + ) + selected_id = selected.mat.get_material_id() + extra = sim.add_visual_object( + VisualObjectCfg(uid="extra_preset", shape=CubeCfg(size=(0.1, 0.1, 0.1))) + ) + assert obj.get_visual_material_inst([1])[0].mat.get_material_id() == selected_id + obj.reset([1]) + assert [ + m.mat.get_material_id() for m in obj.get_visual_material_inst() + ] == original_ids + assert sim.remove_asset("extra_preset") + sim.prepare() + assert [ + m.mat.get_material_id() for m in obj.get_visual_material_inst() + ] == original_ids + # Native cleanup preserves reserved definitions and live resource state. + sim.clean_materials() + runtime = sim.create_visual_material(cfg) + assert runtime.inst.roughness == pytest.approx(0.55) + assert runtime.inst.mat.get_material_id() == original_ids[0] + finally: + sim.destroy(exit_process=False) + del obj, runtime, other, child, extra, selected, alias + SimulationManager.flush_cleanup_queue() From 16f52077a930e16686289d94e68aec7a611d7f68 Mon Sep 17 00:00:00 2001 From: yuecideng Date: Fri, 23 Oct 2026 17:15:08 +0800 Subject: [PATCH 04/10] docs(data): retain the verified material source repository --- embodichain/data/default_materials.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/embodichain/data/default_materials.json b/embodichain/data/default_materials.json index 2c272debd..209fc6acb 100644 --- a/embodichain/data/default_materials.json +++ b/embodichain/data/default_materials.json @@ -363,7 +363,7 @@ ], "bundle": { "revision": "ec9f748242c50b85", - "source_repository": "https://github.com/DexForce/dexverse", + "source_repository": "http://192.168.3.16/Engine/dexverse.git", "source_commit": "c31dccd3d4a8ef98367e1a95c92c842e0a773596", "source_path": "modules/dexsim/resources/Material", "upstream_url": "http://192.168.3.120/CoreEngine/DexSim/resources/offlinert_materials.zip", From 30f8e71a20567ea8c9e1fc166cc6c9b18804ee62 Mon Sep 17 00:00:00 2001 From: yuecideng Date: Fri, 23 Oct 2026 17:24:36 +0800 Subject: [PATCH 05/10] docs(sim): add the verified default material render overview --- docs/architecture/visual-material-acceptance.md | 5 +++++ .../visual_materials/default-materials-rc1.webp | Bin 0 -> 61114 bytes 2 files changed, 5 insertions(+) create mode 100644 docs/source/_static/visual_materials/default-materials-rc1.webp diff --git a/docs/architecture/visual-material-acceptance.md b/docs/architecture/visual-material-acceptance.md index 7ac7b9454..9da4c9164 100644 --- a/docs/architecture/visual-material-acceptance.md +++ b/docs/architecture/visual-material-acceptance.md @@ -75,6 +75,11 @@ python examples/sim/rendering/default_materials.py --all --compare-native --rend # Optionally add --model /path/to/skin_face.glb for SkinHumanLight. ``` +The OfflineRT overview below was generated from the packaged preset previews; +the skin sample uses the optional segmented face mesh. + +![Default material OfflineRT previews](../source/_static/visual_materials/default-materials-rc1.webp) + The preview writes candidate/native/repeat images and `results.json`. Its center crop RMSE tolerance is max(3/255, three times native-repeat RMSE plus 0.5/255). Inspect the images as well as the metric: similar dark or empty frames alone do diff --git a/docs/source/_static/visual_materials/default-materials-rc1.webp b/docs/source/_static/visual_materials/default-materials-rc1.webp new file mode 100644 index 0000000000000000000000000000000000000000..e5a415e84dc55eb1a713d72149e1b09bb4aec0b0 GIT binary patch literal 61114 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 zRld$sKmf%NsH4z|h^yGccG*4$XttYdXg~k}000000000000000000000000000000 I0000007Bpr*8l(j literal 0 HcmV?d00001 From e14c22da4c92982377e454d919123e249500bfc9 Mon Sep 17 00:00:00 2001 From: yuecideng Date: Fri, 23 Oct 2026 17:36:30 +0800 Subject: [PATCH 06/10] fix(sim): canonicalize common preset overrides before replacement --- .../topics/simulation-system/materials.md | 4 ++- .../embodichain.lab.sim.material.rst | 3 +++ embodichain/lab/sim/_material_presets.py | 17 ++++++++++++ embodichain/lab/sim/material.py | 4 +++ tests/sim/test_material.py | 27 +++++++++++++++++++ 5 files changed, 54 insertions(+), 1 deletion(-) diff --git a/agent_context/topics/simulation-system/materials.md b/agent_context/topics/simulation-system/materials.md index d2b8a9af5..04cb1bb11 100644 --- a/agent_context/topics/simulation-system/materials.md +++ b/agent_context/topics/simulation-system/materials.md @@ -6,7 +6,9 @@ native instance wrappers and segment assignment helpers. Its private `spawn/descriptors.py` lowering. Handwritten configurations fill historical defaults during construction. Preset configurations keep unspecified fields as `None`; only explicit values override resources. `from_dict()` constructs in -that mode before filling defaults. Do not infer override intent from equality +that mode before filling defaults. Construction moves common parameter aliases +to flat fields so `replace(field=None)` can restore inheritance. Do not infer +override intent from equality with a default, or modify generic `configclass` for this policy. `_material_presets.py` owns validated schema-v1 overrides, renderer preflight and diff --git a/docs/source/api_reference/embodichain/embodichain.lab.sim.material.rst b/docs/source/api_reference/embodichain/embodichain.lab.sim.material.rst index 3c1377694..fc0dfa219 100644 --- a/docs/source/api_reference/embodichain/embodichain.lab.sim.material.rst +++ b/docs/source/api_reference/embodichain/embodichain.lab.sim.material.rst @@ -51,6 +51,9 @@ Handwritten configurations still fill the historical defaults at construction. Common fields stay flat; native schema-v1 advanced parameters belong in ``parameters``. ``emissive_intensity`` normalizes to ``emission_intensity``. +Common properties supplied through ``parameters`` are moved to their flat +fields during construction, so ``replace(ior=None)`` also clears that form of +override. The remaining advanced properties stay in ``parameters``. Specifying the same native property in both places is an error. Unknown, nonfinite, incorrectly typed and out-of-range parameters fail before native loading. Presets reject ``material_type`` and texture replacement; their native diff --git a/embodichain/lab/sim/_material_presets.py b/embodichain/lab/sim/_material_presets.py index 982bedc22..bf5401fe4 100644 --- a/embodichain/lab/sim/_material_presets.py +++ b/embodichain/lab/sim/_material_presets.py @@ -180,6 +180,23 @@ def _normalize_parameters(parameters: dict[str, Any]) -> dict[str, Any]: return normalized +def _canonical_cfg_parameters(cfg: VisualMaterialCfg) -> dict[str, Any]: + """Keep common overrides in their flat fields, including native aliases. + + This makes dataclasses.replace(ior=None) clear an override regardless of + whether it originally came from Python keywords or a parameters mapping. + """ + parameters = _normalize_parameters(cfg.parameters) + for field_name, key in _FLAT_PARAMETERS.items(): + if key in parameters: + if getattr(cfg, field_name) is not None: + raise ValueError( + f"Duplicate visual material parameter {key!r} in flat fields and parameters." + ) + setattr(cfg, field_name, parameters.pop(key)) + return parameters + + def _cfg_parameters(cfg: VisualMaterialCfg) -> dict[str, Any]: parameters = _normalize_parameters(cfg.parameters) for field_name, key in _FLAT_PARAMETERS.items(): diff --git a/embodichain/lab/sim/material.py b/embodichain/lab/sim/material.py index 081dff924..a623ebf8e 100644 --- a/embodichain/lab/sim/material.py +++ b/embodichain/lab/sim/material.py @@ -100,6 +100,10 @@ class VisualMaterialCfg: """Native schema-v1 advanced parameters; cannot duplicate common fields.""" def __post_init__(self) -> None: + if self.preset is not None or self.parameters: + from ._material_presets import _canonical_cfg_parameters + + self.parameters = _canonical_cfg_parameters(self) if self.preset is None: defaults = { "base_color": [0.5, 0.5, 0.5, 1.0], diff --git a/tests/sim/test_material.py b/tests/sim/test_material.py index cbc97df6c..7b8d834fc 100644 --- a/tests/sim/test_material.py +++ b/tests/sim/test_material.py @@ -557,3 +557,30 @@ def test_native_manifest_variants_share_images_and_templates_without_mutation( finally: resources.close() assert not directory.exists() + + +def test_common_parameter_aliases_canonicalize_before_replace_restores_inheritance(): + from embodichain.lab.sim.material import _material_desc_from_cfg + + cfg = VisualMaterialCfg.from_dict( + { + "preset": "GlassClear", + "uid": "glass", + "parameters": {"ior": 1.5, "emission_intensity": 0.0, "thin_walled": False}, + } + ) + expected = VisualMaterialCfg.from_preset( + "GlassClear", + uid="glass", + ior=1.5, + emissive_intensity=0.0, + parameters={"thin_walled": False}, + ) + assert cfg.to_dict() == expected.to_dict() + inherited = cfg.replace(ior=None, emissive_intensity=None) + assert inherited.ior is None and inherited.emissive_intensity is None + assert inherited.parameters == {"thin_walled": False} + assert _material_desc_from_cfg(inherited, "glass") == _material_desc_from_cfg( + VisualMaterialCfg.from_preset("GlassClear", parameters={"thin_walled": False}), + "glass", + ) From 4f24e396eb62502b4edf8577b88539c4ee4c4ab1 Mon Sep 17 00:00:00 2001 From: yuecideng Date: Fri, 23 Oct 2026 19:31:12 +0800 Subject: [PATCH 07/10] feat(sim): add built-in material presets and OfflineRT galleries --- .../topics/data-assets/data-assets.md | 6 + .../topics/simulation-system/materials.md | 6 + .../visual-material-acceptance.md | 6 +- .../_static/visual_materials/AsphaltDark.webp | Bin 0 -> 11744 bytes .../_static/visual_materials/BrickRed.webp | Bin 0 -> 21060 bytes .../visual_materials/CeramicTileWhite.webp | Bin 0 -> 18858 bytes .../visual_materials/ChromePolished.webp | Bin 0 -> 14322 bytes .../visual_materials/CopperPolished.webp | Bin 0 -> 15078 bytes .../_static/visual_materials/FabricGray.webp | Bin 0 -> 13626 bytes .../_static/visual_materials/GlassClear.webp | Bin 0 -> 15024 bytes .../visual_materials/GlassClearSurface.webp | Bin 0 -> 13190 bytes .../visual_materials/GlassFrosted.webp | Bin 0 -> 14188 bytes .../visual_materials/GlassFrostedSurface.webp | Bin 0 -> 11212 bytes .../_static/visual_materials/GlassSmoke.webp | Bin 0 -> 11878 bytes .../_static/visual_materials/GoldMetal.webp | Bin 0 -> 13018 bytes .../visual_materials/GoldPolished.webp | Bin 0 -> 15124 bytes .../visual_materials/LeatherBrown.webp | Bin 0 -> 18368 bytes .../_static/visual_materials/MarbleWhite.webp | Bin 0 -> 16258 bytes .../_static/visual_materials/MirrorMetal.webp | Bin 0 -> 12790 bytes .../visual_materials/PlasticABSBlack.webp | Bin 0 -> 10688 bytes .../visual_materials/PlasticGlossyRed.webp | Bin 0 -> 12548 bytes .../visual_materials/PlasticMatteBlue.webp | Bin 0 -> 11984 bytes .../_static/visual_materials/RubberBlack.webp | Bin 0 -> 11058 bytes .../visual_materials/SkinHumanLight.webp | Bin 0 -> 11678 bytes .../_static/visual_materials/SoapBubble.webp | Bin 0 -> 15826 bytes .../visual_materials/SteelBrushed.webp | Bin 0 -> 18952 bytes .../_static/visual_materials/WoodOak.webp | Bin 0 -> 17562 bytes .../visual_materials/advanced-materials.webp | Bin 0 -> 82846 bytes .../visual_materials/builtin-materials.webp | Bin 0 -> 59722 bytes .../default-materials-rc1.webp | Bin 61114 -> 0 bytes .../visual_materials/default-materials.webp | Bin 0 -> 244952 bytes .../visual_materials/surface-materials.webp | Bin 0 -> 108502 bytes .../embodichain.lab.sim.material.rst | 15 +- docs/source/api_reference/public_api.rst | 4 +- .../sim/sim_manager/rendering/index.rst | 2 + .../sim/sim_manager/rendering/materials.md | 293 ++++++++++++++++++ embodichain/data/assets/materials.py | 13 +- embodichain/data/default_materials.json | 208 +++++++++++++ embodichain/data/default_materials.py | 18 +- embodichain/lab/sim/_material_presets.py | 11 +- examples/sim/rendering/default_materials.py | 161 +++++++++- tests/data/test_default_materials.py | 21 +- tests/sim/test_material.py | 47 +++ 43 files changed, 785 insertions(+), 26 deletions(-) create mode 100644 docs/source/_static/visual_materials/AsphaltDark.webp create mode 100644 docs/source/_static/visual_materials/BrickRed.webp create mode 100644 docs/source/_static/visual_materials/CeramicTileWhite.webp create mode 100644 docs/source/_static/visual_materials/ChromePolished.webp create mode 100644 docs/source/_static/visual_materials/CopperPolished.webp create mode 100644 docs/source/_static/visual_materials/FabricGray.webp create mode 100644 docs/source/_static/visual_materials/GlassClear.webp create mode 100644 docs/source/_static/visual_materials/GlassClearSurface.webp create mode 100644 docs/source/_static/visual_materials/GlassFrosted.webp create mode 100644 docs/source/_static/visual_materials/GlassFrostedSurface.webp create mode 100644 docs/source/_static/visual_materials/GlassSmoke.webp create mode 100644 docs/source/_static/visual_materials/GoldMetal.webp create mode 100644 docs/source/_static/visual_materials/GoldPolished.webp create mode 100644 docs/source/_static/visual_materials/LeatherBrown.webp create mode 100644 docs/source/_static/visual_materials/MarbleWhite.webp create mode 100644 docs/source/_static/visual_materials/MirrorMetal.webp create mode 100644 docs/source/_static/visual_materials/PlasticABSBlack.webp create mode 100644 docs/source/_static/visual_materials/PlasticGlossyRed.webp create mode 100644 docs/source/_static/visual_materials/PlasticMatteBlue.webp create mode 100644 docs/source/_static/visual_materials/RubberBlack.webp create mode 100644 docs/source/_static/visual_materials/SkinHumanLight.webp create mode 100644 docs/source/_static/visual_materials/SoapBubble.webp create mode 100644 docs/source/_static/visual_materials/SteelBrushed.webp create mode 100644 docs/source/_static/visual_materials/WoodOak.webp create mode 100644 docs/source/_static/visual_materials/advanced-materials.webp create mode 100644 docs/source/_static/visual_materials/builtin-materials.webp delete mode 100644 docs/source/_static/visual_materials/default-materials-rc1.webp create mode 100644 docs/source/_static/visual_materials/default-materials.webp create mode 100644 docs/source/_static/visual_materials/surface-materials.webp create mode 100644 docs/source/overview/sim/sim_manager/rendering/materials.md diff --git a/agent_context/topics/data-assets/data-assets.md b/agent_context/topics/data-assets/data-assets.md index 25f0c1645..08b61c7be 100644 --- a/agent_context/topics/data-assets/data-assets.md +++ b/agent_context/topics/data-assets/data-assets.md @@ -80,6 +80,12 @@ revision-specific cache prefix and the shared dataset lock, verifies archive SHA256 and member digests, and repairs extraction from the verified archive. Its data CLI registration follows the existing materials category. +The same catalog includes six built-in parameter presets with their own revision, +native parameters and no texture size. Metadata distinguishes `source` and +`requires_download`; only resource entries belong to the `DefaultMaterials` +archive. The runtime resolves built-ins directly from wheel metadata before any +dataset construction. Keep their definitions out of the upstream ZIP checksum. + The original DexSim archive is currently on its internal resource server; an explicit `EMBODICHAIN_DOWNLOAD_PREFIX` selects the catalog's versioned mirror path. Do not substitute an unverified public URL or depend on a DexSim source diff --git a/agent_context/topics/simulation-system/materials.md b/agent_context/topics/simulation-system/materials.md index 04cb1bb11..94979f409 100644 --- a/agent_context/topics/simulation-system/materials.md +++ b/agent_context/topics/simulation-system/materials.md @@ -20,6 +20,12 @@ loaded child on `RenderDesc.material`, including across rebuilds. NoRender keeps resource definitions without downloading or creating native materials. Render-only facades stay declared and are skipped by runtime binding/reset in that mode. +Built-in parameter presets resolve from wheel metadata without constructing the +downloadable resource dataset. Both sources use complete manifests and the same +override, identity and reset path. Human-facing previews and parameter tables +live in the [material guide](../../../docs/source/overview/sim/sim_manager/rendering/materials.md); +keep renderer capabilities in the catalog. + Resource templates remain immutable. Each public UID and instance receives a separate child; canonical revision/preset/overrides select shared templates. Stage parameter variations before binding and keep texture paths in the shared diff --git a/docs/architecture/visual-material-acceptance.md b/docs/architecture/visual-material-acceptance.md index 9da4c9164..fe9aef3c5 100644 --- a/docs/architecture/visual-material-acceptance.md +++ b/docs/architecture/visual-material-acceptance.md @@ -58,11 +58,11 @@ In addition to the legacy handwritten-material checks above, qualify the unified | --- | --- | | Inheritance | GlassClear inherits IOR 1.52; explicit 1.5 overrides it. Zero/false are explicit; `replace(ior=None)` restores inheritance. No flat/native duplicate properties or invalid parameters reach native loading. | | Round trips | Constructor, factory, Python/YAML, copy, replace and dictionary round trips retain the preset and unspecified state. Manual construction retains historical concrete defaults. | -| Distribution | Offline queries list 18 public presets, with SoapBubbleInterior available explicitly. Build/install a wheel away from the source checkout. With an empty data cache, download the pinned archive; repeat without network, repair a missing/corrupt member, and verify auxiliary texture references. | +| Distribution | Offline queries list 24 public presets, including six built-ins without a texture-archive download, with SoapBubbleInterior available explicitly. Build/install a wheel away from the source checkout. With an empty data cache, download the pinned archive; repeat without network, repair a missing/corrupt member, and verify auxiliary texture references. | | Renderer preflight | Ten basic presets load on Hybrid/FastRT/OfflineRT. Eight advanced presets, the helper and advanced parameter variations require OfflineRT. Reject before download/native loading. NoRender preserves declarations and does neither. | | Native resources | Runtime-first and inline-first aliases share exact handles. Different UIDs use separate children of immutable templates. Repeated creation preserves state and bounded native instance counts. Variants stage JSON only, never duplicate PNGs. | | Lifecycle | Complete native template reset restores properties beyond the flattened fields. Default/Newton selection, reset, topology rebuild and cleanup preserve identity and expected assignments. | -| Optical parity | Render all 18 on OfflineRT and the ten basic presets on Hybrid and FastRT. Compare the package route to direct native loading with identical geometry/camera/lights, plus a native-repeat noise control. Use closed glass meshes, explicit double shells for bubbles and optional segmented face geometry. | +| Optical parity | Render all 24 on OfflineRT and the fourteen compatible presets on Hybrid and FastRT. Compare the package route to direct native loading with identical geometry/camera/lights, plus a native-repeat noise control. Use closed glass meshes, explicit double shells for bubbles and optional segmented face geometry. | ```bash python -m pytest -q tests/data/test_default_materials.py tests/sim/test_material.py @@ -78,7 +78,7 @@ python examples/sim/rendering/default_materials.py --all --compare-native --rend The OfflineRT overview below was generated from the packaged preset previews; the skin sample uses the optional segmented face mesh. -![Default material OfflineRT previews](../source/_static/visual_materials/default-materials-rc1.webp) +![Default material OfflineRT previews](../source/_static/visual_materials/default-materials.webp) The preview writes candidate/native/repeat images and `results.json`. Its center crop RMSE tolerance is max(3/255, three times native-repeat RMSE plus 0.5/255). diff --git a/docs/source/_static/visual_materials/AsphaltDark.webp b/docs/source/_static/visual_materials/AsphaltDark.webp new file mode 100644 index 0000000000000000000000000000000000000000..57560f5b42e80ba1b963f310d448016f4ca282b3 GIT binary patch literal 11744 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 X{00|?{1q2GoJRk|LxcUFx0e3}7IoAK literal 0 HcmV?d00001 diff --git a/docs/source/_static/visual_materials/BrickRed.webp b/docs/source/_static/visual_materials/BrickRed.webp new file mode 100644 index 0000000000000000000000000000000000000000..7fad37d7c7e700e2b9197a01e8c4efd5a97fc0e7 GIT binary patch literal 21060 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 P#Jr;uL_TN$00000X)_nV literal 0 HcmV?d00001 diff --git a/docs/source/_static/visual_materials/CeramicTileWhite.webp b/docs/source/_static/visual_materials/CeramicTileWhite.webp new file mode 100644 index 0000000000000000000000000000000000000000..e97392bf0fb82a9c805f1bc97891d4de0ece436f GIT binary patch literal 18858 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

mM({NY6uH`1TM3JPjI?N$t@FRJ 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 M{NTNMumAu60IDlmR{#J2 literal 0 HcmV?d00001 diff --git a/docs/source/_static/visual_materials/GlassClear.webp b/docs/source/_static/visual_materials/GlassClear.webp new file mode 100644 index 0000000000000000000000000000000000000000..2e0102c83703f6a3ac60fa7cd71aa43d0890d8c5 GIT binary patch literal 15024 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 UOXG3fmzmNuZ}f&>KgKf%jpYybcN literal 0 HcmV?d00001 diff --git a/docs/source/_static/visual_materials/GlassClearSurface.webp b/docs/source/_static/visual_materials/GlassClearSurface.webp new file mode 100644 index 0000000000000000000000000000000000000000..f556e09a4af2f9ebd08f1ae1a94cb70ececd2df5 GIT binary patch literal 13190 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 literal 0 HcmV?d00001 diff --git a/docs/source/_static/visual_materials/GlassFrosted.webp b/docs/source/_static/visual_materials/GlassFrosted.webp new file mode 100644 index 0000000000000000000000000000000000000000..26837a941c6e1e3d8c63b35fd74fd68be6d0f17f GIT binary patch literal 14188 zcmZvCL$D|ctmLt6+qP}nwr$(CZQHhudu-d*yqVqn`dM`)>0PR;I*F2`n3xGW0D!uv zkb;^52Z6?a_&ysj7mz9dC;*6$5+zcYu#h<6b4G*%D5SY`xHG)PKP?ZPHv7ay)Fr-5 zkb2|Sf1u=%Bi<`tW=~5l)9v!@8f>|rjwhTb{!#gs{`;5zt2{|w#DDp_>re2Bc!mD8 zUeW$~uSGxIpS4%-qwFXCFZbtahx=Fm`mVqK*8kG~#5=^_=Q87W_>X$s|NZYp{wJ>w zzjF^|uRXsNZ*}kcsizn2d+k@A+z(s-+T4pGK(W($izQ=P=h@?#gF`~l61kXJGpBqCj>PYS84OP^ z8Y1LUv!V?xzi;h6$bxbiV|q&H2%@>$HA6#hCaPQ%nPiYQWYv~b>YXg&kkc0K(-O-g zH(9HfAkWrz$JyAYXMy|X9kjcgnSJmT0)>nT?u=yiTIvrJUgNva*tut}Q=w>d|ka>e}Z#r{70fbFVLK`nuzPLzDa*sB`fCVm| zlY6Voq>3zga+d540LKQ#GsyrYEe=o1;k6dZy&1YXUM>d@q0 z2!}q-IvQ3k!Q$USNdDv?gRryF{Gg6Fd_S8(H)KJK^;3bk#$D(fV;;k#-05DdnyWF{vz6)SbKZu$3}2vLh)PiKp?z zmvW|=2_4c(*{0!Cs^ZbY{!l>XVjQUKi{3GV^!h5SSaxauR_Fmmx#4FY$;|d8+>=&S zc2fHL;u-Dl2wUkFndmt}Z^{s8lE08hH0FsnY1$A88hE>KeOrwi4L6v$z#}k)E{07r zWR?^~7=OVR(JarR1a_-9HS{xY@FsjC>B5SAT$S)Y>KTS#e`8~*at8K(3wH<(M8Jb* z8P}_5E4`wz$Z{DRIss@pvzJjl83b%r_=t5!;XMc+m)p5zj??AxCX5#KNA2g3GS~;B zYa0e{ZwPbZvyY$fOfyFEfIZsPi^~w>5WvS9*dCVr?HGcomNtEG2gvrVL26dZwM9bs zzYk^=AD85rC@tZUKGn_%IADW zPL7_Qm~~QYZt{{fmi4=0(huUVjbF;?-FAs(+PHeh5W9pWK1}GfEb?bv24}`}K@M?_ zvTECZ*b`5kPWt`ALgzdP+wd&`v@zIG%LC7Sx`PYD*?LICm;~`|$_skM5#e+7v@ES~ z%{in()V(n~&=?&dp%l)7ZWJf-sum@DfE_OJQNFS^z4GhnB(HpyZKZmJS)kR9Zo!&< zyv+h&5@>d7P2#D?21b0r9rs$Ts3>B|VrqfI_)n>ofIU`L=O`*A;Yn+8$}EAW0 zrZCg6Zj*b$Qwhjk{_m3-a@+jFS3$su(Vs(VFkMLr2Cktz5xWkyl#$i<$DRa7gl+-q z5#Z`X_CK@MSm6g$;kMmy=rfAv#_!)! z47G;&g`)nUet?A@Xt;ko$EfH1M@B>n2u&4Kvi%%jER-u4Lk2w@jXf`1cj z5@V$;x#=tRebGy{_M?Qeo9fXSNNP#a-&bp+{6EBdOx#Z8vXx?lu~VzCt&cnp(Ax|% zOu4=b2!s=8+c{Wprnb*;4IEJCgdsKQM$*Sw-}{-s9me+haKfcyTbbP2SZ7v@oTx}& zY3ON=WawlU@Y+8n=zS_G5Va_Bcmt^1W7rnb-hUjC+3NrS*W=z1U?JqlvCOLx$%?$<1OboEO&bA zKP3?rFTB@X>VCixnkml<@P@}~-xoRWzQt$Qt!uMF^ie{fBFfb8wJ-A3V}x7XJJ#9S zoZpu2fn3hcdrhkx*B>a`@IkJLRHC+eL3XIy;eO&C4MHfxuwy`v3$qIYy{e^NtJMX^ z?P~AaTTtKo`^1I^;XmFryxTs4P`U~GOUTgYWuI_|%Hj&i{tf{eZYKhZJ(|@|m-YVJ zxP08m3VmAtdMAm)JO0YhsGT6XzNO-hO-YZuf6xjTKaGZ`0eK9DBZF-hH?rq{f>D)C zIeXn-2VFP-h=$(YVjOcxSfePXrpSPzmWy^VN`4JXAQ~5$;h!AqSRL?+bOufye|I5u z?M?1tVD{U!LOkjh+ zR+0k5FFpsmYzw`ZYiUXciU|>ry!+}rbYkGf(^Z1DMu}G@wYXb8;Bqd?ovsTfsO4q) zg#h&yeqh70+cmbYj=QKN&`C;;>}EE!dC7{IJV;07j%GMX`^%&oSd70(OgIfJ6qABH zd%@YRSuXJI&Wu04MfZIL_J5(&|F%)@t*evV??wjY;DT zfP{g{=Qt5fEzN?AG7qWLotydiw#n>miVV++1eMLNXOd;mzx!R@x@!p)&u^qXV#Jpw ztyucu|1w(N(K~t+6y=p%n1SSmf(BzAE!SsWU;+UTL@L)OWm9V@=d}T0p#Q9PP$G13JZz7^L zcjXheu)L#JLM!2E{Dg|CiI}}{70-?w(U=*B1yksomJzz<+))^H#@<29KgHenMLQhK z6*Q6eN$SwZsf({=^sIbJ|K{XX;=_nv zrGPH*%zA{Alpp9?3#SKy8EDNq)HDyST0*5F4rru0)5_1a3^tLi+p)?){(8f;Haf1- z(;;1M!*R>^y4^Y&WD#R-V<{XAEMjTIDK?03Spk%H`kMRJcDUvHxuPu4#AE8^uYJAe z4b;||NO=yuh^4`e&mye1xeM4hHg$3Ix>9H~>+MhSlyxN=(-Lj1l$g%Gxg2M*VCOtU zI8Jn>huX>pq?M@JXhu*?@P)+t+`m>!T)%en9X?XllGf~{tfpGg3p0R z$93Do|deQIM;)3 zNo(i0L)F0f?LSbAQKuJD*3Bw^fLQ)p%9rs=)xR}ADuYp~Te%*6XpJaK;~CxnC9u&+ ztrujWZY|&^T?ps&?yCl-td7i|0CN+W7f{B;_&C3Ds4?Ki)lUCQ zl3TJ52)s7{{yV>yU?^hpG)82BnAgyRU9_Eb1xDQwaaaccaMpwf{&4wGmo|Lq+eJyf zWeqo-FY5o@__1c|#kN&Y&f@bwr~G?%sRKV@EVTP$rdJ*Mhrbit4t$SGkwfQ7F-H1o zv*=p%wg3ajKTyx`go&8|&2V2s9HjmhUyMXfV4<1$@h?{%66Gbst-sv7jyE*c5GQw1 z2#1iA!(4qF*8c`t&fQQ~f!h>k3>6^_juGtU@GE$r>Q%qISK}^>CZ&O1)lS`r&>^YA zUK;$95)q51Rk`R0*siMFU54d>Csz*a`U@~dBcJ17hL{nbmAhE}o%@<%!a}Xw_KGJT z``@=F?O?K}GCi;N39`cu0wGb$x&h#OS5f&y1ecRjpdV{Jfs{%AkVYX(6EF7w5kkB_ zP0ZJM0nDJcGf6t|q-tI=V6TO| z!DkVU%OA&-r0wR!Bqt(iznw~Y*u?Wx_9f7+2)XhhQ{?e zfY}X<%16#P}J{CdXAs3+B3-&>b-^9EN)qKH6N?-_d{wcV-O`A#KfLQ_9FHDq<*Zv_d zZ@y&->kfA!jRGvKBJ4~DlQ45%fk+@Y%2tLF$cIEkPQa>9clEH%4)J~SI4~7uzqDL0 z^|?`NC+HYRGA2g=QSIY{zg%Lm7!3MJ&6WWmM1~EZhrziKLIDMOD%v3Rjg=T&_V>AJ zl}n~JI8p`N)7gkl;-XrmHuc*VJ$%bIzs=VJ-Ee@=i2{K$7pr_8F-_-ciL1znOhL_dR&RICLwkdRc6E_+!(pf*_fj zyIr9`_0l#(nGieWDM}qkXRR%kzNk|1tQR(ZyTlr@iQuPLq+MoxN)#f1FH$ zWe(IcAxLWW3=n~w5P5qd8pM>W|4*iM-RQsNbP$d1CU+RqH?zNyXoUDkDKODx6`(f_ z`_%{Ns>LlSQVvI$&sOPKuX$#F-9nv_)G$3OPbeVAYdM<}qMYdpyy$+R%=r<}IF9m0 zK4@)Pc0;iRZ++Kg`LV`0#3OYA^g}6c%rBCA33|yBQgml0w#0H;7Vo7j@2~t!nlQ*l zUg&pfLO%jQ=&X;`L1S3~_*TYqWVu*QAw`u2w7X+2(Awk3Qm4X)8^ z-+B!0Q;_IP2o>!;@4J@2rbhd)8bsMg0~Pr;_;)XZ_C{`lw z?oX`f@yzW4ljSl$dN&jKqr#%n$54Cbh*pVfX;j5lYUrX7Zgk+Md(?`H%Q6rv4kD2< z&^@56h&|Ln82t!3WW^ut5Wmi{XaKf&#HyC~28_}`bHTkxYl*Q6RaQLrv8*#%KRF8{ zxH4UmItzrPcykY;*fo1U~|Ii$M z5W5D@iYf9iA0f+X3XvOncA~YXohm6U-ih_hY{2m=z-b*>qUb$R%Wd%Cs=3`2F>Sj| zd|5j}CdMD944CK$Qx2BS7AmI$eCtT0Zhpc^OJ)WYoIuUwnS#BY0vY#sMSQ?eKCQFZ z$V(2O`9q$_c+J_^AM4C|(qN~RR!|e>P?|LvtXn6|xWyNSkXgnf75#~J;IB4moXh{< zUwy5t2B+*`Ie;{NLX7JFs{1APJ=SYE_z)5iwZ%a3KIQQR_2mO@5q4@!tJ21{&u}+* zAFUbJCYj#c#MZ?`2$ZM095$55PM7QY-$WWiAnuwxjC%V&xCfA;>)!~$&&*Lz{^bPmvf4pzZv z`EL88XVcFvfod~)()qF=!y{8=C4CjHamQu@fbaETa1uzBC?VgxZ@=$RS!!qY5ZcbD zU+K#uy3nUUy0ox?SZJ029%}-u7_&WVX=JhZ=t?D@RF@1yK}u>_OJ5#leIySw%0P=U zY*ux!1~tgbB;HJ$%R5%#Na&JKO_kViQDl(N8$t&WM4F_ee%<@|ReYdOmOXt$5)Phat zV$A&~oxZ9%!A~^fnszbp0Yu+(#YD{*bQnfFn#iWeyQLqGE%!UAZhbn7>6KDg> zPcd!rtYpCTbwU+R0WTKTv-aG7`TGt?YOXx!3-C_WKYG5-n8F*Z$3VAk{ck;tXou-5 znY)+>3}R*5>~}tLe-fjq(=X3L?i#7sJN3?3C=sP$PF@e-Pq>nevGFdfvR?5~fmVSE zM6%)kJ>7pmp|$At@~Z4sB3eVmLJ7(Z!L4H=g+UTGOdX~GJDoCh4A8FsVI`vsdDeYk zK5iO-PhYn5-m^Pp7H3%SC#U<~&Ii_)@)`L0`!sU9ar~aJ_qPNp3kpA{cQLLZ&qJup z0GH*{hyLLi7S(DtZT(po;zY`v`3BH>Ie933nHHuY7d&%`IN+adI*p@zsRSrL1^W1$ zT8<)-4-L#y9y8P(!CUx6Yh^e0XM(}+-D7E7g$b%{Q-`wnH>&k6Gu7S*JuvVC9Ff+p zC*1R9T0u`qNaxcZed9pcF<57kk>y#RvJC1yq9)v@t{COF5b`27B`kny$53^^ zGVmCJivThUY5AJ&R%_2Fv4p@s(`(C7sU8W?w&6l!cAwdbg9yVZ#zpp-rb@@nQMGp8 z=dOic()o|U239=QuFD1*M2G}#>lz4X$r^cP5l8ER8wg5`l^)v2-WUwixDT5Y+Cpd* z8GhwrN@upN`gCKL3h{IwMhALchaW7QO6uO(GI~KRSyqP6%SNz5?HVS45;f&X==UhZ z!4v}t|1%dvUE0mG#2V3&E-k23>x^FfxNmo_+$!`^;)!qGni^h@XLy^T|rk|RHe?lvnN?L!M#Zh=K;%0o5TO>!j`$kF%^}e|KHC&a- zPmS7$zN~|lv{zP`WaG>JIvv}+s8ufjLeEz|`fOj$hUKn{xoynI#u2!|mK(Z+2ZMOT zC(};L2uolX zIpjK=V1C22>+O547?ajt3t;21&8!RTdfG{2ZC@NtEUVbww0|hu3@eZIXBZM>Yt%Tz z+c5{r#c3=xd_xD+t|4qr@CmG&#=RL}ORLYUZum2KP{B%@sk~MKwbe&)|JdHWwWds; z>3xEtcN!LtQNef##y^9Fi+PzzPK)Q>$X+X9x>*`$fKXa$DjsCrH#xgD{u_%@>>s0d zO5Vcfht`hjN4dI-RV_&4G@T3yJmZxWGTRZs;W@~t1x;;~jR8uM`ghB-O zQ1~6{zQ_I1hiLTJJvDf5%n6`JRKM~5iEH0$ZUhSYV{G!wk#>P5n6c?EIKg?4&M}-I zD9HP={l50qFA(mKjqL)y$6eBT`$y`5{avwFJ0R zvs^61L)O*4j2^n;aK_$Hu}qlXDOI9 z+?yczL9|u+deG1g2+`_?rB=eW=AKF*uIR@3!Dt3o-EpJLRE=xmtm;e)$*c=l8SWf- z*K(E8AEj0xaX(^m2AHb()*UGi(Icnj3wWx!;q+SinK+3Ra~6R*f?%qR27AjN@l;sF zJ(){v`z1Dp+>*c?52cT7C0-vm7te6uU(O;vI4C8m#`9%}eJl>5-t-mgZG3}$HBK`$ zYh^E~Vj2MjG)C=h#nE!%Bl(rUXVz9Ra4iBq^KbBl4$qe%MfPV>N<$3q*7~&qTZij< z;%#*XjuX)*@Mo*bK`)<-fUT6@v+`0hrulR;u;=S2+ZxcT(0*q|elT_i2h|fmWNd_T z7w#|NK{~gZSzWh3z>XE}q2QdYKv!FPLgTg=gjC z%wxTXZc-If7!kHt^DS-JKDdmc4?-wf(j;v_#`UdiykkBcd!`j3Lb$uM>s6?!YiYRx zoU3|HyCS~lU%Jju*C#ejkOYH$RKpX2>M!_(ldcM-SMMB1a(5j;Do1q<41PyqCf$SW zl5`$fQp4Fjbrxqj21bpVdhg|-u;*9zoUra=7O<1+QYx>V;bJCf2vyPatr=9vUZkN66%3R%RA_0QfQlr<&HNJKmVBub23pr#|E|zlz z5NU8H_)qHfb>ws6lEd3MH`At7yJk)WD>?ISfSVHrzNc1=LDN_<(cUWS^wKih$uB+j zrAUU39E z8tMzK0ntV>Qpop)VMbaT5AQZ(KUo^2wP%emT=_bXrv`1J)~^B8|3P`74{Q&wP+h zT^=9kw9i4Z27{L<$UPIJJg5Cs{M8j|ev+?HBnLm-ahLyr4m_wwv5ooxRj&~nUUQ>y z)WsW25q#c6-ftZr;S1Fa)Ig9)m?vY|ta#Y<5^_6fX#l}o!XCWj^Y#6qX}u9#3$-IW<-MRM&Rtl|Prn8tu#!>l!0RdyuU@g7`}y(IQ5wYueU^p9 zjq1?GgegAgM0WWtSzZ`PL>l{DmVj*_5EV_^CM*$vhJHdWc(RdNI1u{bIBZS<#$9}{ z-|TyZKu!VlHcq<{kBlFlk%6#B-kCsZ@xctiRDpa6HGQHm$>%rSZ3_6!*Gci$llsUh zoYE993KX^)t$co50PG+r10)_h`3lm`S5K;Q7p*dz0g*Nycg#)Q=61DPQ3BhBTU_ci zsw2a&vOQL_bTR`9HCq%T=|vUs)j4ir1w8qCtT}g%(b+rW(w|POJ{owO^ytoUBXged z8~usqoBpWBZ4V@T`~;9irz)WA%mng!aqs_Dqbb>b5BU20?HRQY!l6Q6@HU)~t)-#S zEj*C+^56RLU&1Ow@K~uA{~YkvykorHVD617FdJaFA@UMuvlPZ=DjCr!c9)ickM z`_WMCo~gw8y<*HhcvH)cZ!EDQ)x&v`)W2EDmSKlfoDp1$e5MZY z>V3R@<^Uw78c!IKbgxcAnTCg8n$U3(mQxz^_`S@2B(|k|uG-RoqAk&IEkVl7W-D0+ zC&Y4&l{KgnNI!3>K&;UC8m|jf^=&U`#i+A#Hz={SqW>@73F<#L@xcE8<} z30H+x4y$wMv=5zD8Ok^XdrS$RBy7S9r{XD+o`GYt|6X|%J+_5V&z3+$LcXUIpUCjO z#YG1ckg|{Zi%|3W3wU`t_7~nNxtI9BkWKMQ1-+H(7M^qG$8p7d^EV4(nAj`vre)RI z(?M6wgn={dO&)&8Q5X&FHHwGOi{WS7hI41fC#}ZILGGa0e>1v}9ziXam1M)3m{|pk zdaOT#_et!m^nCGfm!{wN~+66oI`Qn z;R0Xh;O9BGLyiP@47vE+wD z{t}Es&buS}Aa8JU^4jT0%Oo7|Cg(UDx~bMW`T^2%X3OJ^oUMZX%a)FgeYXc%yUeY1 z>kkzx_`4c-u15~2?!Z0UeBtff=QSV=cul>FhiYXwY|N^PHVO&c3*DXXNED+*U` zJVjd^#X%>d)j?Lzdo3O7XyRoEdjGv2+W^5bP`{aQ0Df>vK@GfK<{%tOCL~HM4kR}_ z{<2x}uMX377)^{PfUZ5@Xu9$W)-!xGPtcAqa-z34dBkbttA&vp1YkVAbREPKs%16I zHw6`RVvljH@JM<5qNQ(uG_Ih7GK^Qc21{2~bMC%em$LrBmirrBrl+EcTP~UI(cEy& z7AsDNLdM)#847D@V2m7bsQrWQ`WF*a02DIwtZz5nsx@#es%Uhmz{+19CZZLhwdRiC zhg$E3UI*=}>c#0(hdmoN*-DY_ZY#quKsdkteif(_{s$B<7HjZD5%0jPTDtgP=Ya)n ze?_7(UwCO^PDlkI8?YxAd~}+em$zI!@~!)LqO~q$7ntp9VZ_XuPXneymMalcquwDN z?y+p0WxUajP;?SK^)r&CRiv-+3QJ?;qZA)b2zs~qZr&?qrqunk58}|c)VV6B^;?x? z5?IL41edto>QPnrZRVc=ApMFIbfd8x=Y5XX-%)*4?(53)6!-~6*S{jJiazIwBG!=5 z7?RpVJnEtH(UdZ^?2gh|g$bA-L0yZ49-KOJa5J&#TQ1|48O+OEoxi zIHIcHogrb`j9Mv7<+}~-k5WiaR>h9Zre>iHuZq5vt$sSfHAokJDg)pW$W{|lp#@Y= zYw%@|8LR%*um`+|6~P$W^g`g8=1wuRoAr$8dw>(0HMpHBIO);e9v|wJL#3I6BO!X6 ziuQ9c4QSMb%qWPGtux@``#lc=sYyApU3Y}M4jciOP+G_RwPrUMHM}ir;8MBdIFIpz zyP3#4uSzlj!vj8xa>%%`Lg*fBuMAzk95QddX3T;P(F|!~?MJb86tZ>P(`u{upekTS z9QswjFNZl8GmEn}WWrPl3goapt_)F10>|BT6`(WAQhe`>#*P~Zr%6ue_-|&~JnjOa zg1CHBx6>nLjOeHF?Bo8pwI)~wD1GO9ikdY^Z^z^KAnPgB zmyTl}Ry(0~c#e%5ZClkR2brHTB`18MN0nf<;%O1IJ@PQbL- zqph&IJK{j%!%a9sqKk(*L(euebcUa-CNcQuxMm$4`*``1`3@@neyS(0Ws|lp*In<- zq|3rk+}VZ3YX!YY`BopboXVsey)s!A36aj_23)QAo0Yd72o zF*&H}{T_n64e}X?kGo=$Dbgn{pn#*SfnaL+7otx1wA}08Yxms8e&WCvUAn6!iIx@- zN+nD;f0|p6LY!MFg}_Vn5dw0i5G5>?CUyU-X_527ApVI8oUOTc?Ntu7>b*&|sJ6DA zPCQ;&##@Wu)&`0K@HL*_u1?;o<5HYzvz+z5g)%5t8R<0Y{(>pQi)v|blCTk-W7d#I zB~J@8z?y>#C^}mh!W%FT_Dfj8jD3IGJqYSHHFQm&j|^2cL~TU8CycYjK@nYM^1Y6VBKty zvo3Acu&D(sCi5fDXYX7n+RTsh__rJk8;wl2!;FXX?5`e+Ix5YnjP*rt|BhUEVhP2{ z^zqQ=7e#3(qeXrx8Zq~9NsSE4*6f9qR9+qR9}ovjL2Q2P9%fImy0?yG=vDz6eY6o%@|CamK4wrLX#rz6_u?SelJ;yaLe zavv(;B5_f-4htch{Q|RkWAI9(KYqgk!`~v*%}ORwmb))op^|?p*zlyR2INr6A1(xc zii>b#Kj2N`y2aRz8l@rU|-YQtjGT{1xP*XkKu(&Y`qj zU8E+;W9(YcBOMUfEAQ}qCU)?=GOSUQCFvhOr*MbY40uN&(T_(9Xc;`P5>) zkR85l#Gp`}^4A!K=Oo#p13-=<`ftp7iK;{JZ5uojWGuE+DKy`TtJw$o+5S+$Na}Kt zMv$sm2cR=~L1_cJeN86t%RfZ5a)ME%QW(MelQE-?>`k@1*KBNG#6Ww5HPq!XKHJe_ zsu3TEovK51R$f_Of6jVReP2ghCF`axFrL9zbpu#>f|K$ri8I)2Z~W@rdD@iIM_4RR zA`Ghx%K4BTsWSnHR)qkv7}X|%qM4KbsCl&yR29Ji!ZT--2o!r^2SRb&eSjed$8O#@ zzkVs^k4{kVWfM@^zx35aXQCEO9^X}6RYfV*bMk98vrvs@QAuqXL%&zcwuuUL7Ejg> zc~fo7WqB<&PA0EeZ*sE9er7H>$ruZSDF!hm>~pr)SxnoJWl!FuJlkI^Xh}Ulmp0*L zpQ$e?2xCbZ4pIb7YZ&?GcG)7P6%wj|70Dn4`wHrTl$4Nf{@DTt?JS{u$_azXSlY5+ogtR|OdnIhz;DnℑmFlD&L7>>11wxPD<&K+=!a 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 Wk%O$M(7+h5=r&}-#Nq#*GyWfT$j{*b literal 0 HcmV?d00001 diff --git a/docs/source/_static/visual_materials/GlassSmoke.webp b/docs/source/_static/visual_materials/GlassSmoke.webp new file mode 100644 index 0000000000000000000000000000000000000000..ad06be71adda4a5199612c5cd10e556da437086a GIT binary patch literal 11878 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 W^AH*|%Wa4y_zSq)HTU1w=6?WmY#nU? literal 0 HcmV?d00001 diff --git a/docs/source/_static/visual_materials/GoldMetal.webp b/docs/source/_static/visual_materials/GoldMetal.webp new file mode 100644 index 0000000000000000000000000000000000000000..88e4ff184d95782b6ea6c738d5dc3e9854e46b20 GIT binary patch literal 13018 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 Q`BozWC@>=Mzt8yp0~g@C>Hq)$ literal 0 HcmV?d00001 diff --git a/docs/source/_static/visual_materials/LeatherBrown.webp b/docs/source/_static/visual_materials/LeatherBrown.webp new file mode 100644 index 0000000000000000000000000000000000000000..d9c1465e0fd503765448ac25b08604eb893559f9 GIT binary patch literal 18368 zcmb4}<8m$xkZxn!wr$(ClO6BaPIheDwr$(CZQFX!S99hDrvLP+?i=V@{isMwNVH1= z0cnbhC}}8h5mo=kOohNXz%>3K{vZO>Xkntn1yI+!LU6z$+KZ?5icP+Jm)s49Uq76m zdIs(B1GyiHX5Zp|&OdR%2}cbYuL2pdjXml%8kie&RX^>#n8!AmAE14Ct%b#1n#4o!K_}{1Hsjt3k?(e=YNdThd z+zerO+#?`Oe&Pb{YW) zilcRs3cdq!t`UoY;w?F_P>VoZ3>BiG7Xo;gC?&wo`*Z%UqhK<=r2MlL!E0Kd5c~R? zS9CxRj}SVHhEh_7c+(|a$%jg|X2Tf#|sn5Ops;Ic?cHMj>EmH6+esayh!p_BANV zsziFugoY|EE4f~8e0SW;rY+A_)fP85=mUZ$)ChH?)Z|Et7}F6#BMiut+{Ah?LEn!a zd6LN5u}h^9KJJvVjq+k>krztPDX-56EDVvmm?sb(v(9V1dn$@NYVd4qD`eK}Ap&krhWvPjGTKVQQ1?@bWv3=M=;?L`?} zoI~8URtD0cOf15?cV0kZjq(<{V1SZ)%yGS_RPh@M`|?!@dgOo#xBhLCU)OyiYXm`1 zJ#vZ_+(UZ|F@~^GA)!u(53d)N`{wn5y_Ne-K}&LokrLQWi}dyH-vw^mQs09Y=a5Q; z9kcxG`R;8kD%R+$nI?#Xt2$5x)}VKX0Zn2$su6X4x59ZWuo6Mviv$FA@V%)1v%gtA zo?(2!-)7u2LJ)SJ@80^>l&Pw4$KwA=*@)f|JolWM539Mv`>2Z98lFI059Fj{3q@7sz^L?Z zZ>)>pInj(d(^<_lro?bvQ(7$4>Zyfxq+UD+MGpIFz43r?_#dI8PAksv_Owa1Zhu6O z&KagE$~{4Z^P7lGPM~@<>}si?8Z*?E!|gvL!_!*dkhv7fui;jTwLkyzuC%H*B*8_U z4QO+5)ubiny*d1gy>dpxy7Wo>7SLCy)Qm!g1BuEAJsLwm#Zs)pwC!KSU76Pp%SdT} zM$Ow5Q=ztmC(F%QD>nzaN{ue11d?Xc@0ff2IqA~l@jwdZ{>zm08GIR#tV5u+B}wjb zt=}kLuQo{JHmR-<{phFIdk_shYH5AmdTF-MJl(BU7`@Hq$S0XOPwha`rtQ&64 z-;6=Ea5KbYn6);}nTOv;n2zpe%vu$76Mwj?xLX-9LbqO}8N~BMo6LAg)VKjOvW90tsluzY`b9NnJ*J4erbg;l@t~w%HsoGU}u~=^sSDXEcrps@MQj z>6i?Kav#?~yt!BRD@-K!4{8N!_BtVc{0yDUsNVTZPa^~rtH^I5L%IKn_W!*%B$3RBYJvZCwqQFlh)`i%h zhi~xTp7Pls2{Hs}1f9D@UJEgz$_i-Ev7N1xClnfP^0Lyyhs`?-W$5 z^H=+};c#}dbzjoYo7qbJV4go^-qmPk0gvj!A7uF559@4VWBW1LwzIUHRL(J(RZ5iA za+zk$G$48q_w5~8!(1kTKEW;aT2C5eb7Wh8!9sHC*y^8Q?t}W25A6jG z^Z1@fQ@AItKbJM?4HcOgR(U!3e_CG|o3wE7;z8yDj1y&j{ZajXzscXIMmQcz_hTKk zJVB$wS^9v{o8B(!(WnW(#$|^O{aV>y9AcXEs8WDC*NUHlfukdo+BBdiO&$*zNM>*t zvB8jTS{KdX{UkIE)E99E!w7<85%Mz>w+&spfGFmw-fmPVSZBz`eEy9ngsxk`<}5^0 z=Ja_JV%>TL{dLKkIXFWIio)~UB&}65W@{&0p6#VLcIhxa%fWmcB^UYg{<|$v!%$-M{kdAO zjIL+r>bB^-su0VNLAlmZ&xJwed5IpUdlIdm!cl>xm)%MJ>iSCPesxF{{AWKfCpRYF z%k&i^eS6^{LzCbw0`ej4NSdBA1E?l+3p-f=wqG8{nNAIL#5u{=#|`&|dtxM^o#!%& z5-Wy*L?`D%bD+rtq?n-a;SoqrnjudSv8Yq4kNv_QkD4{?F-G0Z3F|if%_OHXCjxH| z&vP(0x2aR^*)r2=HbcQ2N^PP71@L^3Z$M+Z$x-vWOb^->XROlyyi7Awj6~DHRsRqK zIWo8orSbTy0v?p-33{3?J3d)>myKN76*kp*+=z4<2963EM`vzM`?g!(EOLB6xSI?q zDhACkg?w-nK}p&OrTksec}#P4odYxlnT&~M)!E`T%WOTsPE_sY34*4rtP-CCpG?Qs zC}>#=D0C{@E5nf)YgMx?c)QcPKzIh7jc>JZ`{|v*v-O?BPXk$9%Mw}bZ&iciFF!+v z_5o@m8$6_^HBfrGqiz6FK;P_;`I9!hLNT(9IJf9QtUn_7>cXqvTnHa|O}3RhI%;T~(UWXlV<-|H zolJ%WoPpV@WQjWd9q2*MHEeV$mgIB*r`N_&};k<|p$-#P4dnP(OmeDzwF z+2W25_>!kKw%nL;iMX#=csqmQg;NlxD<67nX@Cd|%tJ#ewymLc#vw8P=bXWev8X_7 zQN~E!hlIOo7oagY@S|vFq%Yu1Mzd2S62ALYtyB2J4ShE6iz6#c9kDxL0tLrZnMD<> zNpyK{KpczUq6>yyY;_n!q6EAXao1AHLNEL|y50<#&OMPqiCYJ#7`O)U z{USU=Gr$yO_b*Y3O7ZT@GaFQ9c8{(aJi^mb)SG$8-91MW&^u2_ikd^0 zBK%-J5??>l6uAz?!I!m*-HdjO)-qE5wy-)OkJ~a{QUQJqkT<7VFsSopqIjwgg15$} zAx4Z0@N31_Tx#ApV+=lB$g6WZ=wzzIPjo0AJK?yj<^?alip4s1>v>F!M^{4?>%g4> zbgblMmIV1KRSIu@PNSI(I#?#d1~%{OPwvuc7+wR@Iq<^lb+>Afeh3MVyh-lYYSM=Q zjv#nW|2j{xZis4ISD9qN3gxpt*HHID*jC^0qV-e^V}h7E&@dp8Y1yZvfe?Kcwxm1 z6LO3S^bNZFWgml&;^D`^>5ltKU;ri^bx`l3yq6um{u4I`pWYbi;Kl)t-YvgQ5^y)) z%c#d|x_LA;iCHR_sH=n&*FE<5;`4bwjQDUx^tO^N)y$DE?_PyEO?Tn~QD@a3gh<A5P zBa~9oz0T;8Qb94ebO`qX*r>oJfIREV(Hj>r!OLZg)2Jk-Mam4>HpBoC=GBY{&icfq zIP+x^V*lpWQs0v>%kdQ;~Vd%zZB%t4!Lxvqn zm~_dax$}6S|6g7RNdHU!(;&!0gRK6Ch+Rc_{8h>-?Bu@XSL-U-UTy}pi2mEi+jK4i ziNF)|3XtNI05B@v8OAKd=54>dyOW5CKOYD8U+boUfCf^_k;RFF&SHV1F0Dbx&Rhq} z2^7Y}G+!zxDC1n=rj!}`K4JWR@Pq3<Qk$ zf%sm*L150ha5qH{bk*xRe)$NRku7KNDm^1LTG~UU{wCVK4a&}GM+Rg}ISP}!Y<yNwr4|MtV}nqq1p9U{zB@E=xM z>=s@Ug~^n56BBZnwb|!XdAukgeSI509n=N*EZAGV8=|hfHyEZ69bB~s2nHQZnFKr+ zts)m)r$=wGPd8e`be)SnL-uh0lzByBTE$BKaMyg#SyF$z-zw?!?@e>d2~MoS52!z2Zw{cOk9@J% zyTgy%6pR)Bs>!`}w*KD6sK6)*_vT-QqmI>fKV76;>v`HCY#;QYyS~H5yotn6#-zSY z`8mF527Zn#$>M}0mu{Jx6RYQSv9YkJOM_Z=bFlBlX2@w{1B}dmSmYKPVs$;)PLk!k zq@EsLLg>z$%-5;9g%f{h%JDUmQct5=-34CqtS(vl!T>I-MaL$4gObm7gVkp~d8)>F z3N&J(sD3jV^B7E{e;gL!<+?dY4NA3+1YuBVV(ed_W>l$6`>t3|tWhZLm;>N}V{nvD zr9O3sQ5Q({gNTHPIXB~rNb~tD(NgTnekV8-jVaoy6a zr>qu+h@G%dy0iFKD)Q9i!Lp|(L)lHJOSR`uULS9dnk#|_;iZmZ0`4A&pH4Jgz7x-x-DzWG?#iNt;nxTHyDZlFBY^|I6HLwW^$J+dnVE=Eh{ZA;z_ zp>>lpReKIiWu@QN$q~jr)lh@x2Q55#TvuyrblH zW{orGR05r{kJEVj}SvrM174(t(z+Z zMVa0H=dd6{TTs;PO*QRnj=f>z(vjukMT(MV{h@U)}l zJ@C=C@reeKuV$nVT~<*Ei7dmKFZK*y&Gqk5G2d2#S2S%~SE!H~stmmFawmU8rMuc) zw&oyJU4McWj>8q$j?1M&dNSLNl99VFe~_uPqqW%GOiABTgPLAQVk6HMFRn^o#j28J zS7mSyWY?_h)Bb%Rni+vLu?pky3cC-XEH3mxRE^|ciU7U*Z4>^MGq$dARAo&?`a8N> zZo#|m`AR?iO{2DcJV-R%o#fa1_1C4yNJ5g#!YWo!%5o_PB1?Ip173i9`KIS(^5*$m zlvPcGHAb0Y8~r(Y^=rSOAdD%f*LIs}kyOyfvy4Z;jSXf1&t8Zk#4C0q5j#Lotm%C> z^u~LAV{np(FRC&RGt>FLc5?{zqtu76T}x55?j7OY`0gWs`jCusPcxPs%bk{jl^=5_ z^79zGD0_jj9i+_{=rlFE5ZbC}OUeyz|JB+c)78A7H%GU4!bDx9wQus3f<`Lf81C67 zPmU5Qf3WAy(w~kpP0X@*gcG_QMu%}-qYsHF?a9O{)IM&1W$4~SThmJ?1=;15nLxuK zLvJ}K7zpxRnbWqa+>O27F%~p#il_0-E~tK~1?@qkAolEo%TlZgej>jYOD$1tpAo$(dfkVhy+OGz*8-!|IV#UV}Bo?O*YYI@?t)LN)@)q*7*UKDH23-{s~#QeekC z?BOzE?U|T^B}hkYZ>qH{yR5au6QQ+fq7=qRlEjn-FJXzH=MTz(M89BUuvl6OF9@D> zBkHuSWoJ?qeb;eTM~mMl&aXW-X5YWflkWH+)i`y(@nzO~o__FAtmg0Lk$;yx*jH2F zqh9`_$yJd{aeHRj2H5h-Q%{I5)4v<7BCBthfq6=nrC&aIW;?b1Z86{CWkjB@z7a>& z2AK(i=?tO*-nmb=1yHhjr;nEyp4}Tmzv>sKtkaJ&a@(~i#RdsmB-E=|>*$=eKsMWY zL}&dxc$^Vd_a0TR(xB$ zmpYa(W6}?NX;aWGNEc-aYs{AXB+{*tTA9(J*R{q6i>uY`yTvkhy*G4JKISj{*<6iM ztg^JzlAZjT9%)Xn2X)$0Lrgw2rnc-I1dq6X_hkZ5i*~AZJ=7qbQm9>2E6Ip_ZtGcO za(vmv0R+i^jMue55vMf|rcH|S20#kvj()z(hsjW&eg=i48>)Rr*$v1A(C&W2Ft6w( z;OCX3nh)ZObASi*V)YZnwf6@5cpWn=XTPy3k-r}hU46SWSXLDCz#3VXpp~cFGAQyJ zk4x67r%u21K0sl#scJ&VW|mJJ>vA%ja&vYDjtm+Hbfwyo)CL(4`>Kz?;;XcAeQ)WD z-)y57@yHJK1P2_D*(q}j(moLRAP8a5y6yr~c`C8(sD+*SiD_D|RKsoFj@ANFG?+|L z`M*Cu_w6PRky`tDDhz;qSlZtbN6)ZN-7v0P9m;l`+FY_Ij_yr!ZNs`b3f^gN>!HY2 zv9Zuqs_YbKvfLbxFzFI*zxy6zO{g#MsLG= z4w31ecy_S0*(V;yGXn>2X1}~!(;+PO<{YG~ikB%}>Sgkl!3!+e>vI*_{G_kWJ+F5pnui;m z%pc`xuJ)LjqxKJJQ-{$#w~+`1;PW)e!qTt(AgzHjO^wZan*fQ|goM(~@%uW*d*9j{ z%szE_3~8DI`)VzH9%!UiWon!_>y!ixf9%j7DGqQr|1l4JJe!X5rge!VsZgZ6kKP2VCe9(o9 zn5*W&h2y2`X4x^Yu~;DAn$(%R{+OaZ#k-P~`T8{Yg{jJ{p*YoHfWJ7StYUM0aDqtL zF9S@%ert_Yhz&g>sOKF+pUt~UKywh?GF87E0*w(=lzm9MTkVRdFQzcXfqtC*G-8Iy zJ-7Ym`vAjv*pyCV(iXEiZjHcBe>#X%Ck&3M8}Rd(8Ph~JWrRTJ-^}#;KmP=;NHKGN z5jb7$L(IJ~n+08SG9aJpXi9!6d&^B*x1@*7Q<{sf_j(m5BwT;;%eu{ zADL`dyheypMVR7;(PJb*xN-cEZ6!GTA*L-LxdHgH(gE&oGBjQ(ci8T0AGZ z$wI3@odtme-+9E#VHTAdb$tbf%VRBtJwaZxDE?hnqTI^5GVWsh)iF>SYAx!T*mch0 zfuzPwOc3Rgd!R#Ze(>^t+s)k$sq^ZoP}6OA>V5+9YSH0!Nvd>khHT;jTEm%EsbgQl7tETuf^)@UjZDRW%PmIHwv} zLbwzg+q|K4rSy7BAj4b@OtPl`Q~A$rxBIRwxpA?^I&v`nFh@2vPQrBM4dP-o7GV5x zgKeTsxB1(m`|$gTQ1_C-@&I?P*9XiOP!8NY7;M2mmVF-}x|8%t0%n5t>BEg^8VkO= zNssdKX2tCOdOh-$q(nIMxi;$Bgd`O$ZXDw?`l;);IU};5Zm^!reY8iN=-!Ovqk*-? zFIlA^Z2vicvyQRen>}nF<0~(*R$)~g@Zr?fbBjaKG)`LHgI$yK7i$4~7n1nH#)I*^ zu_qC~Lf;gyqBvv+hAn~EnTA*d3~D1RMFx_9KXLQMPGw0Vld30w#29zSWi2WOYAFUS zW2VM&zl0Baqr&=k`rvN>S#L_(D)xicJVkB>)sX3(eDDGkI%DSbx7X%Q;uDI|SA65igwK>c^EN8*5Bf__{f}PPJ7W$TP$rtq3VEJBnUU#Y_f#Me6jJ7M_L|%kO*&zv z4>%&4TuUvFei8eUZjC6TfZ}vUFJh3d&*3pfKZz zvT%Pav{t+WTU{+{F?f&8cVh5RtHvR!_9gcIZbStZACrTm?xN-s|3Es}ZEB|IMSN{9 zpY@Hsil{+#9A~zHf~JIeVaNg3V0^x6#)=SFN8d*|-|-C?`Mbw2AB+WSP`yOdX(B|u z-!?I#Lh$dBrav?805pZVvQT6TY3<2T9f>*Yy}CABbd@`C77)?MYm?e1wn9%in?8`q zC&gqysHk&oi`yCe#yk$S$o5FZ>w?tE);5tnD7h?#5tfdASBh{qX1pD8pxamX^Ky~Z zc!Z=3-wJ5Gqp?ByA*E(duyp;>;aP{5LJTaot{(TkG0X9Pe^JXYIN zpwtQhJaxph%e;_qs*DsJe*1a%3{JSY^3z9wjCCC!xhKB#tIs3JYFe6vnF;q3!Tno- z4qZJfhPgyB5XR{+&Wu#hJ27p)cvwL5zN0q~KaGs4g@abO45Pp;cpA&7=Zded~jIs9epxM6~cJn zr7l^)_8AH?wS^B$XBTgN){=_%EAfgM+03a*dWpbg@xup?d&E=>0$%7@;eY&wV5W8Wv2yY(Uc6VJH#S|+} zjCA{c5s=X&zeCjogM;-JIgs3Fa5@%iyra-D7k6=AnK6bxv7i8@W^YltIrK~k83|O zM;|p>?9DjbdvpxJU4RP`RbMjspV-(eR+19|0oeU&zxZi#u9s~Zctyu9bXz7U@?McuM=L~4@ zMvx(5E~;_7bbVuM^;XU%Qv0#|9DW>x9V==GL+&)ekq_pFC z*0!eIoC=MbpHenBe+4Ko9a~22ib_nh`C%UOb~r@=Cu#2!#6yidr{gpKBz{`mpBH^x?45<_;4f$`gUj_=4$boV_Hv+26j{$z>0w<)v3iT^d)$ zm+8U%37KKD)I;b<64`=X=FI|AD1uBEj`8{vlKUw~{a!+q>3?gWioli+N@VrF87GUnC?x_6 zbS+6N|2aZLq~&}|Nr88ux9ZK%7m|uB@6XE*B(x_^@n2nGa^&T(Kek6r&0e=3@;Dep z<3Yt%XE`Zn@kWb8)<-$JC75#Lj!Edi<5iDE>>wk&7Y;m1r>)uy zexW#y@ORuniVd=lScZMDUu#)f82jWNZgWuihZYkL#h>8$8DqgE6BfexA&mo}rsP5n z;gui){6z57lT(L;LRrj(?B#{!p8diJm709d?aSv|!^OJFYm}>85C(vjAGnCM2bj7@ zO{;mulP@Ee{|beo*Ex`6FTzZjtusn;FQvqh+|c%pAn0_`e!Blz9I$LZmF|B^V0>3C zt8!v%N(+IqK4JRBZ%j?DwtN2t|I%p~ya4I92|B(H*pKEXZ@-T$e`Calqi7!P(c3?{ zrE`onr^KRE4XWd(5c0x6JrIPMcW7DAtev|B`*HBNyvp5VB#}?9q;f1pR9nXl5%_F$ zlZoksh3=1X$^HPZ`3RWN|5w1Q7|*xLzwjG0cg^NEGLt|1S1LP;6*OZwVJf4@=wEv5 z*U5$q9qcTk^F{=xEZI2sM!;+N#NN+*F(vTGO?x!vfC{k_3E{;6r%3TbZZVk0n7QLz z5ZETx%5X)>K2sO-EtVEfvD7%sZ$glM81@Eh2F@gRQLEn9CQdg4WsfrbR@_m1l{p^z*G6jQx|>)Sblqh+i`T{j#>Z=HcrgtsuZ552jsKJzSY zP(#`-w>IU=__6_%D3Qg&*OfKDDJXcatc*5-GQ(TR?$H6OLNdG3aPnza_z6`x;mB4D zjUGmZ00>eCqwk8LY8HS}h${N@Y61z20b$S^CX*_dOYOf-Y2~kTOvsBRr;=VJ{1DCB z-`sQMnUIq5-wiK{+|5#?CL|DMeONmt{j|WM=T_4r5>U3sqW-T#k3oO@)w(7giU-WU z*y-ol)s9&C-9W({23#wPTI0dGVQ^%38B4?6+Q$#C;T35GPdR&!pKRp!YsUQ4zH@wK zOWMCfZ8Dg=ma(_J?WlhU?H0VAOa@oRyqRwFE@r!)Plh)L6&76kY8O6K@*hLS$SWzN zZEC4K$tk75eKuHpOWC7hIK-L;b8)bgsp`exWBj4*Z~Y5&m?n|ix@jLRqf`D(DA^gW zYu2%4uQgjw!jRJTf#bzvA}{dC?Snzo&wo#$b@Kf#DpjFM@EG&wHxC&CMW4QbHa%Cd z%OVBCb#3arCkR`VklzN2)^6$07dI7U=5ZY)o5l9^uGYAV-%`85{aDtwC=C!j{YD9N!q>FOKGT#n#m!jc4t{le{2d^HRCraf3HzKKVid(<|WB$o2 z)Ze;ns3!|Px4mFCG(McH)FLf48>7Bd1e}1UnD?I{=riYGQ7$9c(X*DrEgzph<0#WV zceBB*%L@khvlEgvl!!LP?^LeUy`PczLzp~?p|eWbqVewLg3o%j&a6D&V0a31<^Z? z{k|{D-0|T(Heh@GJDAq&z=;nvP(cdQ5+|NKH7BL7y17=*i|kx(jXzW>bjw~FybUrn zKB^VJ>`4%u{IH_|U+AuJ7hNE%-(ijDHW$8GrnE<;DhayB%GP^4GP?81)jJANz!cOj ziQCWyJt~Y3-`I-B;%38+9BDM!9QG&+BF?Sm`+@B$8kSCH{pX= zL9rJ=Db~d7gIE=?F_@-|El)4aw>^Kn&uLTHxy_c3p=05*cQF_V>e^T( z8H~fU7nZ6+qgG=jb3Vfs!15U$j^#ooZ~EAy5w<*I)kh?NtI-@|-ov$O63=Yg3Zh(= zAYp2TN0+@E^(Ne6M+41o1Hnw`|Ao=d%56UDtGono9D@U$G$&L)91W~5Tk9W8((<+VvX(f3= zc>g}YWSNZsT+8Hdj95FS)-+|Kn<_j!q3UTiItKJZ{gM^%eqd%_KLTg^HcLCg#g%BLF-;wfjojBH@V)E`tuqcIq;c zv_@Dboh&>lfhzBo6VgqVDLc~F@Lj7qhmB0Q_75xAVuXf@4YSJzgjL5F%2NWwcJNqm zP(@P$3a)!`fD4c@p7w_Ge%RO(75Q8rCcm408( zVTPA<_vaI!fe@o&y2UCD-7EGF0CKtNR4v;f6 zC69!2{4-9by6Lzjt~{mPKFJtDDs)Q58c+!i{hsh=n80g$9a9T9-jdVGBYQILg;5~} z*vG5P)DwOsA|IQ6B)Ojq{sL_U`0+V9DA#H?Jc%T%ZRlXttn5mD%RD&~oB^*cQ?0kr z4_S1Uy{bUppChMcm@U9`%>}1RaRir@-Q5lLhlWmg1k@4W)L~Zz`ww?n`9|orcTFAKTwmpXj>-2|8V3>bwJ6P1jDYd%H8*2}Gr{bk=Y>a{GX$fh zao-=Uy}78X#hU)r*e>>ftp1Rbuqb|#p>5>RQ>vriESqPlirbZ4_+_exbCV>n^uxMA z1AaHo_wNzAI04_ZoQ*p-n0@XQr1;eVKX!18fX5?Lg55@7)7Sw9mr*4x`h$mpKL0df z=c37p7}|i{XlDfaC5Nithf-yb?U_N01=V&yxwsJFEh8^Kkdb$o<|V=IsV}y?Q-J< zRLkoGs_lb_nCA>7LuYsH5eQQNqk}k(k>}TxUy!UtnVs88F$PKqXPOQ7K>u0@WE#r! zH@ofaMA<^g)kNI5>aJ`x{t^9TnpA5c{Db+}9zk%HYxt#kW4CF_*^B!j>U_IEV^PK= z@yCCqH`$PDA=k-DDH0V@z&%z)NnDN8Po!v)}PJNQCEcgp>t@CRX~DNs(qti zqvdm&cp~Mv+ZpGZ;`Bpt^c#`CCY}LOj{Qumv{mJ{GzkB zQ4T2pLx-1({bZMr1PW=XK3ZtDA$uA8DzQ`k09{+_@(}c_IN)LnvxM&DBbHK|)qVQ? z_MNSBH-%_mKNAJ{KJYK-Dr)x_LHL}lH#>Yi}&ItNMtEqnt`q+tCT5@q(EtyBH1j@EQFJsivFPbBf7xxzB3 z>ODdj*~-5_Ht?SngL$i0(fvHG!xS``D@O2sCzZl~F8T$9Y&slfCmjaj59h9DIrMzu z!$7yE1gUE|o%cIM;iG3S#xFug|3$XbUEP*Jv`=`#+BHFYPHp=!rSA}z&+oA`pH3q6 zdqS33v}UD3P_BS;GQxIJZ=zUH+|tG;F~1LVQ1QjD(U}OKwQF6W!Ud(fg(JUoFx_ga zT#JU^8H-*E4z-&bNZakY%)^`@0fika8X_by%Bn=T`euSdEbldx-GXnAN|$dCGk89y z0H_yb?|a}W_|ux%+H2pbFADA|8;t7+s%6jo8tZ<|dG{%`=Bs%p|8GI#@wOiM`cwcS zrX4*)!s%eSDUK``%nv>Il09gNWrU*%=ui5`%SBBEKC6XdUaaJdX0ga~1XG~7#F+(p za|+J5G98R63Rd;Av&XuX5ovpI-#T{(NQe+r_2jXWW<6)o{r7$LXpYT8R=#`~jPfcJ z5vbAiNmOT%uwf~8>n}&$*X^Is`&W-wmUJtfO~glZy_;g)KL!a})pwR!2XL0qKNCu_ z$5?dM!FVDwE!vwV`mEPzLTv|$b&j5N z_u<~;FX9rm8nipSeC>3W+%PI0z2cLAY;Qbfe`)hlDAqnxe8<+f`zzKn2gQ6|?127+ zyENC2?k8F-t{+dXQ=)qzpz^5><6Q!u|6D&@dn0@4^$r%Y2NFIKu&?nVRp!(#k1YgO zn2Dgq5D`f4qY@cjU2g@E%e%w@(KVk3_u_2nr31^Hl~5;;g*#r#d-^<`pDLYLZoc# z1h%=@oH(xbTRCMC5dy`^FV)%uPoGFrqCa#1GkdI`}K6^ zjwdqir91z~=QJ`NS=M0A*ENqEtr}fsc&C^l+RvTjjaP_x8zHUI0PA z-3b0Zt8gH9VN}UB0q_B~lc_Z8nnh1n-<^p$REF|lKLn_#n8q>nOodZ6FsP4ud$wUT zeWOT^BDsy2ocWBSha?$mFbM9N^k(n6I2hFe=7x=sICst92pcC$onmrNE0@PMX%nr5 zwSFsV54#VL_~fy-n`y_`8m+&22gb~r?k zXESAy6iKjpik7Whtjk=b`T}3CBU80cf~pr)I{J8zkD_a@G;IsYT_NVAQu*j?aq9{) z3cl}$smQG>7*GR~3~(_XYp@`U-pwhRG0;bkA=CYh6>1zw4W3yiCgBIjN@eSa(^+x zBDC`p{IS1m$M-k77BD}z_YH?>?{A=kGbUSiS^40>Gb5PWEj8+vdz1ITk*zTK%B65Dos<*Xl#~7DKltBE zB?f0v7Pu&1OQ#JRl8#fheUR3ej8Oczr5>94pY|sp-2C*AuqVCy)(9fJh9q+El=9$=XUDmHi zrFLmzwP5R{Cpo0onqGr4Nhd_8AP1!odNJMGG0S#kprR#+ay>l#Vrp1ae8qa(@R;O{ z{Qe#r6TSZw4leD8$8Ju*9kS=#*3| z|Hu?}G*C88YPNJmF_u@tbApij=HO?O_nW}T=E;e}tFwHRzKq|j;HjnK7F?NJ4LZ4{QuHYQLBCVk6y}ovAqYc3^BzrnEc*8 zvsGI!NSMpwu!80J{MT86FN`3xQ5Q1(C4%$nRviQ&c%2@4deaqyZsk1#){Psy87CJ@ zuiJspyK70?@jlh-jXz!KaEmhg38Xz}nB;?~$yZn<1D{eS2SyTUqbvSPHBw7M!%|7Y z`yYQC)#IiypcT_#uWeDtr6AH z2KvdhEozN_QaM=ey0l)Iayz1=vA}(z5E1K1R+N;WqBddQ6&@j7J47Rkb8M4!02O72 zQdgFX^J^i+uv9N*6*0GyT@$}nKvRtd>S2oV4KiZpjp)nOdPA3=9CZGA^M}vZ@I1QH zXA7GZ!t6P`Wi5samiGdmhqBGX@ZByEc)4^JNVEkK;foC$=HJ$Y#|+;%ZhJLqWr>GUtE(->qcOgyNfnfq<|v z;Xcwruu_MP)>3%<5NHvX7?;)oS_M}nJfg;S#Qv_LIi?bIxS1W0=$O6rMNj>HoOMlc zi7?wl=c^&g!n~=vW&4VwgWg$#F~= zen{{vcK3ElSgOz?$6LPNzW{o(9bs2xHX7+-G;Rtl1x9{5gY7aa$`&E7o`Cj8q*SOO zoTg~#kJ)SEU7n;mUe)c!=R#Z>sbC0_lBWm&PudR`&$<8|kuAQ>e#!rYG`wc@x`d36 zMshw;_Mt7Sh#2?4xB;77C2>p`q4n!mm_uGSDV$lT*E?;cIY_)?!~+~j_X0_4K;z0| zOMIySUo*OTi z57)IWf6z$Y4i4o<>g%0CC-sS28itX|?pbk#o*HND&@A(yv`3h=B5|*3B35abmm>+g zxP=>&U*JWzKgj(3NAnkNO>$(W9C(}BulNJ>iF-V?7y+E8nMP#E#3lVBS92j70&>KQ z0nI3=}8M}&aO2u_%4uXNO;V!}ImhnM%kM|baY*Uj>ZV5*|gN!qM znSawEyN+V75}dDfa&mU&`Qk7Z0<$XrFKq{s_$4^N7$3Ui)!v%Lfq62toMOUn+!Wsp zSG3hu=p_iMLEz_Tbrs}WK2`}6u>$M(X#i-Sg9o#iCkfyJV^T8vq3n?r3&C!ZUYc`} zFbJv7Tg=j&T9}30{EqYA>1X9AQl1<&rel=Uxa(B)`Xc+rTtCG@TpLJ}!Vk?qciGyw zXDL#yyD$M{Lj$fs`URnAE2rNKQ6Sc9puuesM1hNjDcUk-w2g6b3XkKFVEfta=quN; z!8bOH!Sp-_%;n)d*e#_jFY{n%wXdcIAkp!08=+Y7( zyPN`Qt%A?7BPr>jn zTYUlaJ_Pknp|9Qc=6c&+E?wwP`Yf|Fna}o9Q<$4)hBw$}lEest77Ay8ZPq>591Z;b zchE#CXM^XOm;g=vObO}{eV~kB5DN)^A#IY-V&=5Xt>ymz4_Ze%AZC*PE6F5JlGeNs zKvaWZ(t^aLDQQqk%=$?VZf4iq2x;BD&84ZwQdh!-C6KaE+=0jA9Zu~DD6?B)?pe{a z>!`2zt5Y=pOk>dwnTcIx22=N?b~>0%RuSb_t~4_k+#D`=RmuUKSoB^6$Kv5`dT9wW zcYWiqeaJ}S`lB9L9;)hk-5PQaKP8_Q>b4-TjO{jEMOvO6YZ9Xp0_VJw;GsTk7V0Nb zlr-NrMqyNy2s_V}u0VG=@VO!s0L?8rUD4R1MK0fELU{*wTPkd!O9~p{Fx(4VpxHf+ ze7H9d?QDc#|DpA?6;gGixX?B^jp79L^+1cQMXt+-;GXk7_5IN08Eun2;L~UA;4X)P zY1RNY$ldCMqupMRyE2@{UIE#v9B{3QCl1^Ju?OgF>6jPcVi#b+@TebbC}|Tr<|&}t zpAJ_$Ns{6%<=1()Z)fE=7(jN$obu50$j@k=B+{-VxC5zKD95=4=~)W?ET*h9iAmxp0g%!k4` z$3`Y|dlu1b)w?l=QL@&trtW4(?lVpX1f@AMA$R=GE0AC={XQEs3M!XoPr3h*$ z6L%SHk1h@v^nO>S+Nq9OO1&i)8|GHTm^Fq>Fh>Hry=&zw=m0z(bD0PEo-Wkh)Wo>H zrX-H2Hdku=uAdM&kN3>@83*R4#7~wN<)aH` zJlF+09{|R+-#U5*ud>kkgazG!+1gy#7qmJq*Og<^4;i%+odjb)985h~5G#*?36YKn z5c+feMOmqb792{V52s_|EFQ?Y&%kapNVGm?kKzTdTlj|`0ra8bEe1)-DCA{R!U14` z$Q1hnE1@C)6XzrXsnrlL*%+Hk~RbMN5*iADNf zi_H>KKO6^pI%~**xbv}}%z&VaB+gk*oSbn`+{A$V%KB&QXDK{x(B@+_o!~R3OWQaB zR}sqLy%JT3=tchw@USt*Fe9mYEnhoRx|*I@hN=qo#$Aeo40|Yq-Mx(V&;SA&T0+dc_^|#9Yc!9RF1#?hCX=7tNcadLJOD7j z7eBU8{GZAbK+fc>d6UF{8DJ{vFia}BGs`hRpUbqAoFWJs0SfUAo+X4DvVUOr zUJVhcJm3=Hlf9dY3}k`$E*a+`fI2jV zQ%Aed@j@#Lpe%WC@~`nZku?n}av9goN?I>~?RO22;#2?t7ftF)bZdI^I;>{GuO!mF zU?nKn&bJZBkpfZ1v1I7ZQHhO+qP}nwr$(CZQHiB|8*~$Y)?(v9-Em-r-~AyqMm#J0BRzF z@~ZOe__qJ$^;Lj5fRz3~{y@AG$l*c+1q6r^(!uCJ!Od;9);ioDa1v`=snv6QvRJ^u zvoCu2_iU_jZ@GZne`P!~Uy8_xbKKWEYkq4UA1ZefbA4JyW8I%U}d6C&Y7Kx;3A7wA1SM8N5?2S}#cEYyGTc0Rg z&CM?X$!+FPqGzD~W0Xb}V$ZF!?J~@&ln&>Oa5nY|ybywwu=8pVQ{?eqv ziV2#L=Ot!ff4_e*yQAc^3Jyk*Q%`EW@S}$Vc)aH_#YYr=-?n}7mN+HCK*sw*So`dA z=|qt`+yS4~1b+J^&_eY=0NX^IRG*qIDsC6nR!AVm6{`u9IRWpEp4I9|hOxpwuFv}x z4V+p#wNj4mqybdkIqoqcjkRtKMtq&n0XBE5dr5++D1{5PBJoTD#e|6b+(Lo20wYe{ zn|@s^lpeagQ7(|e5Rl(;9t{_L%z?g#@%gyZ3Y-nS^1G$c1akfKv_*Poy%Q@Lq!HkJ zA~#TA@TDNNS4kRUq)yB8q$TphF1Wh&x$CJvuT>b_q-n6jV7eNU-Z8kv$}AOkj+vlP z?4A2%%f0kK}(eSJIJL2h3tY}&V9_aFh~K*GnWdt4mCL@<1rJ?;c?+d z|H?7-s0*#KY9YA<&dg@VK}AZVeno@knLXg*%%y}g=Z9$<>j@_g>GI;$4qMtFwwaL= zJ84KgAR0$&mdP3q&6#&y;kX30`J_TMfV%A!Cn^{^PPUunZ`9@)iZ4L==giCi~90B3(KlFDFeLY z70mO+Mqkae|3UVvTHXCUw`VZsSmn!^8Q+X&+K;u!%yj{TS2lF!7_4A4DZiPwd+t2P z$p0nDF~A{kBJ3jjCN}J%?P)1(=WKd0*DL^mc=LvKc>YubIfCz&<_0v3*Hz1q$7<=E zFwvMiWR^Ub#L7!@=IMK0Pa)QKm9KxuHoH-jbr1c4PVRKSomQ@SmVqGd0lpU~2bWF8 z2h27un4iPIL8(^3E8=_t?(c}vGw+rSG}Bk+HIE_t0Hu>FV1Rm5)pSBZ!JFGYFz;OJ zsP#SB*jMA9#U^M!q@D#Ho-RGjKI@3~SpKut)<- zS{D$x>ID40Vn(Bl!i8!@#Y!y4?ub0`OVFL_B(allb(r|n-;gUzYa3RHF2CkWxvE^O z#n~B$F`iA$%lBnCd=v~mL{EhI|NYemFqqlzDn&O%6edsIk4U8_5lsh!41MF> zQ(&MB@s9R3Kl_rlMVyur9ou~VY}N*q2z;bbgJ*m-(9ja?63REZE$ji|*1hl%aAH%% zc?VfPDW6*7q0yx3Md5coB8S!uu5^Y4RbRqLu&j7ze*@Cf1l0)Q3Cs*)Emw_sQ|1H{ zrgFhT=TKqGO}BS>#>p>yvjr!gk=#SY*n%3ZeHh3KpeXjXDu$5e^GKmz55i?iP58y8 z4%i3=uyWNVO5;&2Gf=wY8f@!DeHTrsa$VK25S-s129)x`D@MJX2~0b^J7xpq;2P4j z=Q@mG>MQh1d}0uNgIl(V&_?P#cEo{j>vPp+#O5 z0R*f|-&cb#Y-~E+RgbN2aO(VG5rYAXhBh$xmf@Mx3qQbr%H<`8dM(9q{=nvm0OK?+ zPjSh|`$uZqp7uUkJmyKigiGQgNC%$!d4_B}zIGnz(uKBgGiOuKGl5YTLP&I)H>l@D`B4E36^)R6Uue1nxd259_Y=L(<; zY)B|mZ}B-S0!~p*d>!bERgHU`Pclb_BZJFcPM^uYSW!#=P0+T z)@sO8{;SKppKqnPKb2GQUgz^n4F@J3Mf~_i;Kh1WUAPWryRkSG|CzTiDpuBB^h`nB zyLZ#mh$@4tIx}Eak|E?L0_5!pxYk8TjQx_U1X(s=JU(V&08N*sL^J6J>8qGQo1!)~ zr^QAb6ftY_P2E|NwE$E@SQWPIKT1?@7am@;>4U-cR_oP1Qqy-7 zk_&LYSkN{AGp&vCrg(@HkV%tiomu1&%T*J>OOtr~qXUX-P5_QunscU_-{5Cn0=Js2 zH&|nK^mljnLk-IpXoO6vBX-ovR^fL?zyN~(enU~4dk>7NGdumUG`1Um1Cnma z97-jOiT;eh=*52!9CI%qn6P3Z)y2Mc#ryJv%N%&ZY4HzfR=~q^G8Z;RV*+mVJMDtp zM;qxE-^gq%8cL5HD{yJp7kjlyWzsj^MQ0Ae+v?U8#YzhgcthPgy?nD>lef)rq|a9- z%q~B@h{J{~(|rB{UM%hr`xcJ)g^0qABy65dO?PCaEiazOQSVp&1#)XY7f;Bq41>%M zv^}1W71|Qg7I5eWdBD)AWnlhV{9sD3M!+eJ65PIoHdUh%QX1?W%_18Q+Jm>6E~b3* zjXuUyzwsj6Wq>1+x>CM{C2k7k$a??-8;_hJpfb1eQP-e@!6v{ol1g{{8H}uAfKC!*+U+**qlTX?|th?X7{Gh+3$YH8!HJ9C4P;ZH9P_-~~))MFSDxI?w2WU2VFdJH;g5i#Ux`@Ep8jnF! zy*h-0P_(BqhC^TIKKwk*qx{T?c04Q$(AZh#=qX}#1)&TK%G0aI^o)Im5$~d-N_GZA zW+xl;!y7eQ>Igz;D?wL+Tzm|Bc`Br^T(r#``vH>D9Stw5F^`Aph}#%Yk@4!Xz6nXY zP9db%LvH>H28xiiTzuXGqOTJ%v^<_!?ZU5F7FO0U6`oR`=sjt8wLk@ZFzqta-&RUH zLcIdz>rcw<`XqN_(|wDBA-n93v3JPd?WwUTeZvDE#Xe_0@`zvhq_JC_zu3&OcU`A* zCp}96PDKvyl8e_ofcn&adYHu-u3Tu{rFU!L`y}+C7nA0$cy!^&W8$hQY9uQ+n-W>0 zL-AFdmOFG#)Tnz)TQ^?2Kr4?`*ELMii9I;F?@2`_!FyUy#IZvtLn;5W)Kr2DcnR{h z^|QMZjXylkMkF$!kCcB^%Ui#nu5!E1&lpTis^dflEa_|RvuN5D6&2ET*x!L$!v1F)1iOD`reKc0teRJe=ZeYIb?g=dk-ijd6&w3hj4yd z#*4D_F13ntKv(Z*Hb6Oc;-Cg`2z8doPUR?kw}Pr-IL3K&d)B5$#&!pJ8hz_JgMUZ^ zhr89_+1nH+im1fxH9g~t2HXHZj zca%WL(V(~X=P|Jl=W)t9?`}mry%TyV!!<4VY#;C0Ak+n$A4B(_l5OYy2%WOlDn!Co z@(SbD;bD8d*E8>ygS_NFOypYy?ZTJS8F#;j26~E!GBA)B$7Yi5XK&DogD%J??|)d9mfo5cTEo_O<#^_CJb>ju)QS z5WHAj2sl!zY(>ZyD}At$l}7Ocyi^W2NqVPuKBLs>%v zvj7%D^0|6pER`YWl{y8lx8rVpxZW+7X#WY-X7cEMZw`S{3@#&xZ+T#;rl1in|INz^ zCvLAoy4w-3e%E{)IIzJR#y}&jTXawi*y!P)@f+6w8|t>RPWTLjCs8b$Rmz;_@|cS| zxp;wOZ#VTWfSbF`khhEEsLdVk^?^B~n^bX!wAt_mGTBR^Qu&SeE>rQ#G^B%xAf4i^ ziDXCdY#QSjGD4hdblympSSSufaM=w-H^aO-u8 zqY}US1XKWlHQc68_m=v8Gl3Brz|=%=eGGmR=r61Ff4>>r1tnan!@VtQ6Z3KzgbIwA zkPnnC@(ZyUi!m7UpjTSGoY3NkK#ugg8b1WB+RYU}0xz)EcQgZ_1@7zxLjZW_q*ZZW9yCM_WULnEj!@a6Q&8(AW z5YY_1ErJ%(x~@ph0p+?8d*?;@cAz#kIOZA~zrX!`m%sg0DLKjTD_=qZ)8j0|(Y*0~ z=l&hm`G(fvXwvDHZr{KP9~>QvDW?40utTyH7RaH{$B&y&B2FHmf_-0oRzxqo{joqu zDLwfYN7n=}H-sF@X5$X(tx+ZWJJ&5Q!M-8FNPH7WYG2c~eE zd+L0-5W@YlMrc4u%!U1Ofm+~coG+3=+eT>z@loFp>ozG zDfpB2A;X|%h)sKjD#e0SLqi1=80ZI#!J?B8o-9YTH6%+;k#|kajJ;>daFiFiFPM1H zH3cu!xc7HQsX2l5P|nvEWdn*u#*D8KA{dI8&Nz)b0DUAt-%10r8bZ;q)d~V_u%)M_ zBRJc55|Y#n4kneqsVPkd(q4sq9hHJHk;ndfS?&F;7(0~69DSvm&o57-TLYtK3hBX>nk4~*YbDjRDi6+um?@TVSW=~0- zD7Z!=L{6O)d&dD_ccr|ynRb_;QmJt34O3)%69!w28t{Oe9h=0Y7S!wWmBsy+!bDK^f5 z<}#-lDrJfu2DMEP(K@P8=gM{}vjUzqmIqW>&^@gwR;$jIDF|1CIYarV3)bdDBZsiC zxU7>GY%>mBhg z$?wbVEnn(vi@RX|(7;k~k?1^07CkMvwyj>tB3#GyYbL{ka`nB{;|H$CFjK1S=P4M7 z#v6?9e%Ee}kI-LFi>27oOh%#@Hw0eQK321qgK+XQ!tSE1d`8b`A)nx+{tuLtV{4>h z(d6M^<8{T`xDg~Eo=v!efn#H^!Tx35UBI`yd}bsEa_YY04<8QD{w*VywGrB|4M^}x zP{I0021DL3QCW}VB+W_yW89eoWa-D5d1|tHxK_`xz!l;CFW3+u>CYmsPixN%QS3r& zw8Z|!;UUI-$ukK#`Xmu5HHw4ev*MS$L4jf^O-SeQ6e~yov1+orD1O)a7=Wi9d&z%MQ?%ifWD^deyEv(TD6K17zm;B*?2&*R_R1ve8J>$_f(a zvtIlk{;Lw0ErT@v=wV&4tRU4*3~j71=FS+_UH7G;f>iM+VNlbv>}0ry+rGdLgCvw% z;aF!OTIw7;hrYxw2>0pht3khir!+7BKw`vkSiHH7#IM1IYEC%g<_}YGy0PieOj4cA zZ7{|~(@k`RtITzc^EunIVaB|loRrj?a4bULziH>1?<2As08xmFB}OCp#wi)3nzuY& zYt!|TD%k=asug7O#@n{wdRgP$!g%@6jKnu;{&zQ43DZip zNe5@|P60Ojhd2Wp6~s5^m|tkjk2AIZ(*DWj-f^pF{JYG1iW$?mbPzwC@LMN;7g9Q= zr_a~#-m8Uz_%?+@M#0j+xJBq=T%j3#xVf8cEb@5%^eH|_2TZqwomtznIE$vTSZ*MS zX6#*JSnYZe#38-XW=-rz{e{4jZ0EmFRGn-<(cM8zx|Dlw*O)vy^}x)? zIhnPZ!26CF>W!Qd4OfF1Hy|C(3T^F#TQ-aUmTyCtvDMj}-2C#d)!w}DJyw)0n{$&d z20x%A8iz*9{Rm`HlP3U0$&D&v#s7Xx&yj0V8(6I60MT)Hf^=w2Za4haX%_l*Ho=0D#n!4vE9 zUVUDrxhY_3P+eeg$_`VAWP!76+-k_U2%O|OX45SI@b`(YE+!Lc)|!A2lBj6n=9B6! zjAIsR87?g|An?CMYSDU%f^dnXopiNIkWc{=3IgU)^u;zxzj7#CAgW zumn4d)Rn(rr$lH+Wi_Z2n!cwkebaTo$(;k`q>ZSZOe1!_-8)V-NR*hiZ4Vu zqJ_O=5it>wNxb&K+$sFJE+rP94>564G6*)gIqVQ~A71-p#~96TXy7##7@=)3FL;H% zGcUH|uzm<@G-z}Si>~#>H3D!Bt)L-&p8bs~{urlSONp;8j#Lp%m=jb(z2(Qg%*3m0 zmqcGbYjpxwj+Y5va_3Sm{Cm(ZnTe`|dq;bCP{K~1CIytyS~9ef`#t8vRsC)DeRJ_! z=W{+1158dUX)R!yJkbU`+eW~JR4I+Pm8+5#f~(<1OlKp+W@ZW23Fx@I4th^fwiiUo zSf6cE6mh{A0HSy)EZhw&1QCSQ|JFsK4U=x?r1v@NFg6F-Cy`5v9H1i(+x*vPta}*E zi$G^U_5g$;ybhYKz<=4-b-X1Jo^EE>jL|SA8+kfDEy3uRiZM>2ELffe`M3?Sx35F? zw@TTtU$OMUm$Kaza)W*FSCniiF63s*qfkT=SFSlqubEyPGH6NRF?u0+g^EjoZ~|1O zAT(WI`8T@IHnXHcaljw=mFP~!Z9PCc#z7`$_H+Gh z#!?xPwkXHj`r1M#uIzRIZ7MCZ?>Ft#F zjRA`~TE-9HNKMqG67~`%1vnf95ArS^f83^r#Z#-p(%S@OXYxr9DK*r9oh5GNdlCH( zlyNv5jf1(x5J8YUEuZ4%%Um5>YRp7vX~dPtUXNEi94LLc5+WwSR|KM5tPrQ>iCvJKErZTIYTDychj z7hBxjjs)^bWVNbOd6gxPUE8Y01J6FFJ!PyU?xU+C5ubCa6qYumB~qEISEmc4@I$v1 z!PUQ`Q!~$`Y?q&6(N(Xu^F%?sCY@vy@a2ihqic)dc?1B2gz;nY0eJ`s287#>V#iab0hp{?xUyBVmOil z(07i}T&?^~%p)%i#=;wP`%1ltG*Z8mG)oeX1k*o)h`OG0zsyIYfRk^bZXKKlS&ndw}hc!Js!iJy9#I@ituQmc?R-ho>-D#MPj z*6Eph+c=r$R{L^h4?HT`X^m0aeq0$W2 znU0@pWM;<)MTen-uyF3Z`W}MA4BGYj93%603!z?!OBH54`zCuIaNzTZ?+sG=6efHZ z3{zu&DV~d@4;UuH&>|d#YRU7*<>nMZEbpUOx2xzbd;EoKp<7E|ngKI={qvbgBf?7U zGH0?PvI<}1HqFDzFz*Jy=ifvo%qrN>bkonIY4xjF&o%AdEizx-;22wP9E(F$1xS$zlH*-bN$M1BhMfkP+cfSN_^PG*ouqRP%zz>R7eRk+EQohw+qFk8+d$OFT zr)T098a?`3J?`wMuFxCw$8*ED{1l+CFN>ce90y3)+#~N4hAg`ZnJ0~S`D$|ldXbJ- zoT~=w3er5W==+9i<`Vj#Ym}9h??ABiuhy~WV{npue_hUR)YTx$UC+K=>pIA^aw-l1 z$incQM5ZW?>P<`b%UoS=_bTb}4WnC9^in&4?1R(=8weOylymHmyi?e~DMuEGvTdhy zJfQUOBbDj8Uierx%CD9=;?!da29*bTd`=>JlV6+13~Cv|vFsD%66y+ZfuMijP6X%w zMile&y04)i%&itREWDr4f$!7(1#(W_$jg1PkpkrAR6v_>5%Jok*P5>mB9ZL1 z4?(;#iN>rL0|Z%D=__bt%3f{jY?5>tQK1WxCj@}R+{vQd5j4i>8$=L*;1N?MrV*@G zIJw!?VJHwftw$ZUjIWmE5iDB)&qy9 z%9sYCTi4=Z9;8cuTV&``IN7KoC3K>&6R)T;Jfd7VLaO*)fcd!ELIL}H^s-71^$mlYh(%f2CVoJ_b8@us z#~$oGS|JTuIVxZy6)L(tRiT}QpFWn)9T6G6#xy^c zrLV@x{eqK>&Dn1mp|gX+Z`|4AckT4GgKKS1(^I(nLhtK5J7N7e~Z?cFG-Jzka!OpR6~B3y?M9taQ*mI zEJ58zr&$sPw@EPuXD5eNl^zP`jK*7; zHY>s?M^|NrYh&G-w`<@mxoz@yf}jRZ?L-SnyC-xoTmbL9hK4}6QsqTxn`AgZ?I?{F z)Tsd>7hPIyHZM~qh99>>*comZ2RCUMH;zw1w%B6pjEB!OD=55X{v*(40WvznR-9rJ9K-2*ZmZ%FxD-!Nk z4i>wlb;w?UixQsF(YZPaG9926G@VHY@2|Iq=q|mw_T*7cmOqqBh@a~ihSyiP4;9S6 z9rEOKM&2Nz+5KRozN=o*k8Uf8`#xOJ=Wj(l2mj#ss$l8&%~SPBmHwV$~YI1l@^A0Zl5!-{Wd5ul5jRk9R<2CxEy_@mmBnC4yv!P@hv z79d-&jFEZ(nO#rrQY90k>Le^_So6Uaj{rGZ$ZhHCrTbY5pMv;G@*clvqznFrG6dqX zG^I6-H4l2IrI6~D1#l64v<4k3U3=lY0-H^vrgFx>;{Aj_%{S>V&xW0pZ;s!Wo9QB1SS{VE}u{x)+nwkL1J71OgP& zfz8p+LZ7kQoLY)Z38L6`t707VhzV@WgaR}ka!mq=-^`taiOduB`|{J)e@DIsT1sb3 zcD>lCTw^5SYt{KhcP)^&gR={)xVt|)%{LgSgFXZle>l+(2CRJx^n?D#j)WZUMdIfe zY1?35<$B}C@5(B-v^2mVAV37c0O*Ti<_O)?)+5!2qEqKolo?Y&wLj=eT-;7M<2}%Y zU0T(VN+9giizjdXZXBF|Q8&Q|W>s5@TuAGAMg8xbIE2I~dZ>T|T{WRl_iCr>Y-@y-oi&C&6Tco{3BF_CKTH z?t(8+A~JcT+hh<=Q^i8j>Br;K58gMfKPO9>5;vRTNEaS^O)kP@%tl4)J5=y8S2-*) zudvv3nkXloZdHp-XFfTrVOWpGJV{z8km{Ymk<_A9fS=TXMtSutMG^@uOqN2yqHt;j zDrmsG?E61qYH%ejCayEo3N$O{C*vjqW#1dNtSL~Y_V~BJl9yHKkr=Fz*Ja?xYhjGk zO6ze8M?%xP{ufbIhG+=#`cy(tCdm@rcsv1vTcmoC_}N_K5!Mr@>v!=2w1Rjp`w}RkyY2y683SpGhiq53*IP2>UM$Xxx)u%In1`$eh_O= z2E2Mb%vyOpcBqi549lGPZcLveRNrj0Zm+9<7Qy7>!KS??MRh#Y`l$#V>8((y2*+%>-h%?sI;xZ`Mu;1pbYJq9-VBp6>;SK2K0VE6_E4JvHf) zh_}yrWEyYC%6LGS123>|Az>zhj}RFPbs-92qz=*tI!c+lFfR0*Fzt>@H?k%o{cou@ z3z4Cd2F_QE4!I%t^ihS(j<};Akc^b6^>Dd6(NTp1mo@law z=xCU4TjMDgVpK0~sN{4pJsI?4=_D-D=$PubiV%Xlz02maNPTV>K*N2}FCre}ErN8X zhO%x3FR3{rM&edz7c6D%@m%W7jXxOe6I*r?x3u-hOOS1;T4vE2EfRA?5{s#t%k@k* zq=Ebr(DxdE@jTT@klUhkAzltn9r9JF{GUc7+!M=2jJ^(~+tV2c{O}9_hnc(q%cF}N z{WHFTOTc}<8eNScILPLq66-A%{NvVpqsR&h6#+<6-T@7aRu|aEXNoPPx~F4q8pf`s zdk=_>rUY>{o=hi!eE8!r_lU4Ux~JCx^&k$(T^0-D+7Oa8M_r~0*m=Il9--|;g;PF!GTaG zEs@uha@}QF>s&FVH|ClR<*VIBK1n2OtAA?aaaIxfrw4b|+m0J&%4|@C|N4#&0;S7? z1LAQwEdQli(T^yHZ)ZBxpQUtcm2D^M3yPXOMSZ-dehRz1hS{(vPbKXdW(qn_qb)4QL|@yMFcUyd*xYu0)Nare0;W0LzqRkk#h9F@m*2% zss(QvHJF{+YJn$%MTDSUlf+p^h#HMfN>?4qB1cVd+IsW@>tHf7MesT=loZvbxgTmt zwR(;mh$Jj{LD+cb^(~YDI(PIi#^qP*eC5e=U;`L)XTO8BZz~Huy(q9wF#6w}%dSWC zZp<>>*?;ogE$J-TV$Rr?S6h;;@ute3F;jpXOA^K#)F45@hTb17(Noof;R%^ zcPC=|tT^tpiVQP!@?`wGAD2(Qjx#_?EX4IkFeg3(Kq}`L2-1wDvu}5&8`RP6FPtj4 zSwkn7^;a_NyX;zx%Ae}mNlO=}#@GX4DBXK@^Zk2|0e-oPt85fPJUA=p{av=(gWFUf zE$5`({_K!d_O##*9E8}pYZz{mB7=A5C_`7l{7>@%ztZA_(k((1Ic=^KTELm)d9lLV z%)nOVHQOxDt8CDeg>jP`6jeQ}m(y~5^(iGZO8c{FS0-Twxn-a#02b+T0ty9!Q=P5w zfPELl=PiK$#`)z`<-k($L%;P|!~r(TyYV3iSqlxje-eqhn?LiyP&$8k{a7U&ORayZ z@+-k`g9t|(wGxBWHEl>sjU^!HVL%)9Lly3LgeymY4M?g6c#K*}`4=n2Fxm7qG4ezH z%Q>Uyy#T}FVoDEf;xU;Pnq~Cq97cPT9vX6^;bWmNWKoHDIWj^A*})uW-q=i<>qt%n@JrK*@x$nVy2@<+L0%!9bdR>7%dLohYT6eW2}SeDpxFR=(;xmh+yn13RmU3gf& zb*9>Eikn`02sRX-5%`jtjy-zpk4cvqad_9G@YMCf)3+G%^*x4Meb|kKxBA z0E6qnI*|^PUHA>CG<;!@amx+y!_|DqSHjTaz$*OsSszUHD*4mXs&dE%2^GMLH@TP{ z$M>JRLh*{Y&L9eB1)Am|{rH^dkYI^HT>%m_rJkCCwEYVIJ=o@p&+8>V;4lpbH^{^& z250XlemP?3z{vHTEGHX4-09m+3%R$ITKtM12iOs#F%!pfPKOyp?aWVgS{VN-y<<#l zZHWK{lZUzR6k6-i%(Cklwprzi2nVZT(O6KJ(3T@$G?1hhAZVxYaJEaA(0Km@Iw-}L z7lI(}n>8COfk)lA9pqg?s11!)$hSMVY3%v@n^Rucu##Vf^pxxNG~waLl&i(^&!HGZozL2+q~g z&;raKQ1@^-dj1-+O;!kDS8kzR{G}&d#1z);Y}wtR3d5|$gl8#Lh8%+o8bL)x_K`*I zZ*G;A^JEXyvfbP4GbGY}200a2XuBC+3$KDh^KMrMRGOUHyH~RGECB1cno(TFN9Y}P z+UT-GtQYUwpbNoo82tpaCqL7g?%%-1SR_7yvyU0f2A>8uT!LtEsFrIXM2_2HbTW&1 zO`tP6yw?E{_vR8m;lBbSWA&KCi}QwQIO_!g88wR_;3$v7v_qOwedFiQjnWu@y}lajte|$VFWF)qw8{W2`w>-wy!}ftRW8jw&2w%XU*@=PYJ& z=VFn-U+27KUT+Og<8xPc+?l;&Xt`*L?;e?T0_e4oLTJ`Q#(h`K3!||8HnOy9CL?=g z4HQ!VPDnoQ0A!Ts1$go6B?7I=bvz^QI-QvTNfQ$E{8d8J6)pK>Ot#F+8#sdt4vjAr z12`-D(^UaK;#(_;mU3`Ep{@n(3LX4|ldiD##H?PtJhKCO}VSZokOd+=ZZHSvE? z!y`>+fAY_wZUh1qa5(*^lmGVJyK>ul&{3Y?mmB#jM-iMjaG{!J6z@4%rY&za+vhbf z0tw_}<5$+VqdlvP-@&r=Q{3fLL7qlp*gQ7HdOA=JroUw@nnNc<%MsgA29+X0sN@2E zMauoqtZL2lSTHu>qx?gbY~EH_95Wrc*TKP&PGTKq-3sD%=HKn~`Ll5<s<3c}kR)6XrDQXq+rsk{V0jJdq7?37P6;KOPKYP~ z{;xO?y)FGwugNwIS^gE)lEjiVUDmRti`crHrz8x6y-a@v1qn92HlIJmmol~pC`4ry zE}%hhHx`jk7r`aKvz1HJlWJoti3B3EnU4F+XC(86jNB)1VutFu$(*IIfo_0z(q{wL zQ$|pQ9<9MNLw(vr0b^fj$hL#ysU12%kL$&?STb5C`zDeZ-I~Rh(hOj@h<1T6@*#YY z#)^;q8ruOwvRUBo@leuPx0&;Uh(LM6zSB8v&4zMie^j>nt{=|d=5(TS#e>&r=57r% zB;ZAdh2#StlJ+eeVC#jYsu$;2nh>x8xv9E<3CRmDLJ>h@w`a}q zqW)ml!ztM9D404Uk4(rUl$DVGXT#IG@gTZVFH#;h8opZ%VF(9ss8op^0aB}1U=)NN z-<@-XyOjb1a@sc5eT?UrPyOjUvu}p3f%P^cPm@@x%yH{AQLoe=6A35D;qlDvIZrac0%K?H=j&f$9!d$#?%QO3&hj}73O*Md_*hDMu*$7a>1 z11GHEuWKxb_-RAHp#Aiq%5)LOf6+iU_qd#3wkrgZaVZcSzxN0`K;OZ(=SdqiLbmnE zRN@R<@h55VsAgGgrOg1?x8r_!8I=<9J1PNds=>bWQnu6c6x=b?zOOfHyD`!a1RXj8 zhGycb^p8L!AAikGY%(YvrHuZ-mEJNa%Adp3m?msVm*r=d9B8)=ShO1d6i*6dGxyQ0 zlrRi5>f4PE&P0qWD(Ev#UV2 z*OZQS&FUW0*JY!NoF9FIyubooJ%NzhYR(#D?+Op5nk3}`PY1_GSgC^+Ch=o^pA3c6 z4#vEvmSo)D@Do@uaHfcmv%YQpMgt|a-DAfmOa1JrSn0lux1L3ZuLUHh(zb&gNt=^! z_L1NUFyXI5SB~;VSU;)Q(&H<33M->K*UM} z{by9LY*hTQ!mv{0aNV**g$4PD>xDG zbO_=rnN&;rU;00xTywew13>JWG^_=eo%@u#yXa0?`jGWc*I)`cCea8c1_z7q7M2Ai z?k3ig=(C3b=&QEgYY0a5n^8k@c;gH@TUF~;+2ZK;{zpaKeIZo?)hV2G2N)!M6?g6+ ze-P07%vA`PVFBRGzN6V;lHm2w<6y1DOhXr87nDkm*C-oRaO<)VTs1|{#5rkPt0G9&q!~hWpDtf1`oa2qxmuD`k-+--{XNQL$00Cds<9q<%UlUm zmSPxJl^k>FA$1(y9|ef9utnYa0d&7v1ibXX(2leThp2<-T>0Otl$SRO!kx78p&tA} zN3~IZm_ft$;YHX$ZFva3WCvu{+Zgtrr$M+EadiBBxOP7IY~l-byq)4^vy_II{`p8F zBL-s$<2GYK`iaumgtJQs2l|mor|~2oXcH{ir`WD1JWdXp@*Ye|2mZLmb)7SkqA&gT zX^yw*L}zFZ51b`AqzOperMj@>Pg@mrW1ErFVd2j3?y*Li$k`Fal++o-2r5*pZ7%6g z&wYtYUO?#D(H}UpbRcrbD9zp~rvX1B=Y^La&iMADi$7@N!1+8B@O93nS)K#LYPP@f z%eG|D9ral;Ygd6wR>SzSKWxyr2|h@Wdb0@i+J*942O&xiEe7et3P|t=EnAVTLzmuX zK-lR0lFO&k#a1h{F|M^Z(0_W5GTDgQ4@5bEEPIH_zdZ5W`YSzC_fx=ZV&g($@H=bA zeGIUSH8N85wF*lIEH?2vS2>`rJ9WW3L G0PsIP8GUyE literal 0 HcmV?d00001 diff --git a/docs/source/_static/visual_materials/MirrorMetal.webp b/docs/source/_static/visual_materials/MirrorMetal.webp new file mode 100644 index 0000000000000000000000000000000000000000..efa5465fcac45a122ef8afa8ac8018be0b2c5dc4 GIT binary patch literal 12790 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

WRgBfO7mepd&*EX4Hmuv%zWO?zYpER zdi@fw8}~ckn#h6V$A4RT>M7k{#5nfoRw_fQH47PwoCIO8OebOB#xOxU6=l2BQKaLc&mG#$ zX2#lwE12IGy8n)G+HwL9NsF><;U<&fEIGll-fCZrlJ;L7v}xA;%$yIntG1-vu!}Hy z{;2Q3*^Bf+hV4O9X3W6;mtKfvSICmW@mSk2g&Tj}4&D*bKB3-$Y%S#b=M$Ns3O}yR z%Gm%uGmu(KUFHtx;ai?vb(x(&<*vI=df$cR5AB8i1Yv5d^H)PQ@EJH^vm4udo%LUXlB&Dsvq(ZP9+Rcrx&ASNBVZKtc&oUeQ2AC2l*qyl7&IEJ($4YV8+90F=K&7xs~#W0!bKL(5sWUI7r8aH~eA?Nl~s`y%v|y)tni zR{+8%)rVH9o`#pB3wZ58Dy?YpWG-OOt9Sf?{83VVk$%g#o4`GH_n9~>hLg$!e zBo_7XZ5KzrZ12vA$$hIKPU$CnvJP87)|cSXd}(AOqsnlo8Cg?(^PMu@(XtVqg_owz zZsJ$?N5!Y3tf8;ZFkCr}hB3Lkhf7py0i+^20@hN2gxSZ1H1We3#>~I;Ed6?gv4P4B zNmp$VkkLG=pJ2jfg;>yKY=*#$M$s`8S(1~pNj!ZR+RXcdof?x19-E4_K_#$Jid6mD zgOjJ1xKgJ|7QN8DbQ@Ix>*%0looh(16ZBw990Xi$lGmn}#Fx*FW|~u_ij~4d-qE^rIG{(Eq_lX*vx;P(6`U;&EF6M*-*-)5yWCQapkkS zYw13DlmqVB3&zd0TuKuM$`8^2E}HH)$>$q#H^i zy$T$`(OjC!y-rT@kvzu~)cF56sw^?ve8Bwp=U6=s<8WW|KWAzu>_oi|6V zHf8HB%T|f&Fy^dS@~(5DcV=5oL{2E`KB!x(%gU;+hKr1I&BNv$3Vg7b{D?7HsMT1i zFiW0=L}TlGr=!@I%f|!T>5o9!-z>u!Po60vFYT#k1)BStIRJ|b4}&PW$a>j7!y-CW zf~&j0=;HlQD9hOfEQ~R2eM3D&y0xcp=t8oBER?4gu~Z5wnmLu_ETtH{t@gq(Br1A8 znsZQ%)=OXv6qan{fQc}k`4+I34oE*AUQ(qnv+3fdg!QRybq{;s*Fp4*P#c^C?EYo% zaIf%<|-bA*aqXG7CsEN68INjH~|GSg||gFrh-QOGjjMnN`+MSTZ(HBH9#-(Op5 zcC2pow4|zW%lG;jNHgEf81=_FZt++_4dzKtJr4mLc31Z8vn%D<5;d4udaYM$;I4mP zv~_F)rdU-n`(leDh5Be1N`jTq&B{v3=4JJ)_z<}R!h6a^FD>gnpbK`ue-0Ti$^}1- z5q8>8x6Zi z-`uC4keqCS*owM$H?@y= zVo&bFc^`UHaPK(!HH6;u>!}|rj_Zj?u5R} zt_zE@2jMGNKn3UXDSIflry8P&M5Eg2okI(ue1dyeE#3`0pgv3*E1$QYa>D!BPrb&rHXvQcb+61wt_XhR_jF52?y z3=17wp*Jhbkk^czXzfzmfkbfvg+IFJ^xlmZ{;^5B|t+&dbyl#$`V;RmMVF?ENby zHAcxyFH&%rTPhGIIyy0|Ptm*5J^&bJyzg@ikq)D9^d&}pP7H=d$V6J)j#f}xGd1LI z*Gs$@usV#%zRO=i8ZwjZ%Ez$zk1G6!X*FmjwBB#(>5BX{AD8jS1#SbKE*V2)X|(~Skc;!6Pz;Ka_aTage+Y)v+=M5};*rjz{Lg*bmhvL07< zhqe@pHSVtBio(QP6oe&N?pJZ-$VX2-N2t$3MFJl*V`H|`3LUIh9)%CdAXb#%l!^pb zQMa){c1Srr1MzQ%zE4jE{o8+B<>{%=koD4xk(@ z>~E(kr%6)u*bvVh?7d}zQaf(ypU`xebJXmw8MU~~9pXaVphCEc=Q(Iu`ph0Mr>3uy z@n3H^-l{@tj@>$*Jrjro9@&sti-Uw3&QGE^k}r_S(I=$Ee?6+3ar-uf_42E)7FTc2 z#pRSTdCUI8#LA1U8GD3~Zl1qt7aNd6ibq6h}~WtPrxYzVklej6Z#y zSZV=we>Ox!*WG04cys9Z?_4C!r2D`>!uytQWg73E7p^qdXX%J{A z99@e>Kfid2lSseb3T+{Q?%c1YJHm$;=xoj4z`ZFGTdP5yS*0V%G37*u;)@T4H@Guf z14-yV;^?z9!Y`mOYaI{a+0+D&q6Jq4Q|ZPJIguyGvaAj_Z=bY7$r(RF7a1WP&=d@F zSOz9{)=|vK57z^Fr5*Ubv&kF+I$$NHnw5F-$4^4l>$|t;$AWwh6lW`Z7r~(cO{6SK zDo)jr`aNO`%71^yf2DW$u|on}aYk6)NAi>IbzSYXXmJc&)vF%PH{NC+UN9 z2v9{5F;U>ZzDa9D(Cv}SB#TMO@*`YD=SO-TKCBxJXp{0&w5OT+rBH)OuB?IsufY#1 z<=eXDa9-fGL2G`GFw1!+rhg8N5P^?}FM-rC4=KJAo6N|+oM#$=z$)C?m&9?aAr_=V z%t}qx3$l+!Bua(6;YsIy=w)=O_Dozd8)z2dPv}pl1Z&s*m;p02Chjg#zAvDUArK?I zZx5d9TR6O7P9*RSF?3yKG5Qo9zvH}%HrLQ7r--<~)T@kf z5sVPmf!J8MtKUhy-1z65aPNx1<}_S1&PjI8<@m7WP2cP0Z*!u$8pm40$VyxdGeju+ytj^ct0Qo;%-l7&`1zJH%!9W-pNCYg&6!Ek4}x><&k}2gdCUU zD}#_;c%20?5TmVJnt577;UD&)(MuN?He+EO9%^KyF`-r67DiTN@WmxP9 zH<_IJwn8g(@b;oiVt-Pe8-+?jyR2vdGoQ>~Nf}9|_h>%7oG(@t@4|=rsHBU?naoMt z;qALf<-he0Wjwmy`ydy4+*wX9mZ?C2!=;qf9YR|QE=jC9cDnwAKJtq7qgE5?;--FV z$875t)ivZC&goQ2)D{qY6Jq?V(<D-*_)>d zs~HW5&n`f zX}e;w!;gJWRZ!EeQ@n(7M)=M7G^Q*ReIIZpT4f0bfE6-_d$i3ByREw@D%l9^EwI^f zU9_Ypq0~ect@kno??@f^yT##9lX-;zuK*KMy1Q@Ig8;e$786d&dJ%Y&33U@}N|R>> zAtA7s&^@A(3*;4Qu8q`CEfw31<>?5-TmyVSI)^W4K|c7rQk~69m>eWBp%ZdTTNxI$ zgX_+AAQycfrf%iaa{IS#BSbvKyL3W!gqCE4jD#67MWOMzX0B%zl!Omb%gB+$H|Htn2-#bP0G?+3r= z?jWn#9@~K2W5`FSO$*8Jv1MKM8~))a3^A44tNhCIb*5xmA8`viQUA@5KkFQV+_GC7 z&kZj`;1Io&F%m&fXjfVxXT!Fy8~SHzQW;L%fFYJm@Z+F^$ZcInzJj|ewPls4v#oQV z2WDWr&sO~tR^oF$rCYm5-;IS?HzQZA#sFK41c^7Ku8$#vPMs*#1?QTdCb`p+H!iKx zmc6DUEIq#S8gSnNOtC9!9hXeY zKy>>i3mRqZhLI#ndm*VVQX*9hhC1dxG;gnPPfGyH>w+3TafzGxR%amor9Y*t;K^ z#8Ty|Xk6NxL*jBe!1lE?FpP6Hp#N>HMx|{;Ao_tze_&W?IeJr|Qn<7bR1`D+7Yp4Y zlhh(C00%A&zY0~Nj@PQ?SDOk3x>3~+GhiOV7+gCx7<+-CLMSjUG|hjLNGA)XwRg`& zE|kpE2M5nC&0!s4bV}jZS=K%5uHUtvMuBBNaq%fy@p&RX&!N06Lva^$V}&o0H#?U# ze-Y+pMa8N-}L;&4<5jnttO85vL>Y!ifY(IUEktmH)B{%v$z@vdN5UTdoPOn<8 z8q5Fi_mtJ-d*5VK2-e}x7i>3JOgD*)L=q@U>I(Gqi{$xXkGql4_iDN7ZH|X&c>1^B z@DQ8^?rY0WS{7Z&RzJZG^^8~NpipeyDitRK(t3$Rt!rP_g>rx~fvyjDnD#`BCBjSh z^314WC51`!hYuZ`au>tQ28MrH1LSWt48P<#=Hy8az3^`P*d#9Q9sw31em?K zB8E9I6QnVqQhX%VidO$<;!HtP5qimEgWix_hKwM{?j%dPt6LiY4#X+hBy!sQ)mv*K z0=Wl@UQJv&I3_~|pRUDI^b4Dvrhm;`51PJZb z;AVva7yHriOo6TI1Mb?OBGf1oD(S-e)OZ-Vfuj=zpmL*yElt6eXqfv^OEF#E$x?Ah z*Ph17>*Sp~45;GU7YP|J2?>lE{M(3k^8kBSE!i+x=c{5N3Eme|5f=3dFne49Iy_bSh7DpFnHO< z8OWmcyJFYPr-cm7gT$h(&xDAg6-5biWEtK8>zT7zoC<=Ob6b_+D@(Gz$Yh4 z`N0q;0>8cIkuSz4(QB@ z9z-`_1mEr=D3BeXWKc7WOo|>pRC96J9FRf?%xC{kFPUvn`Dnk(`X(gQb&?R&_Mk*L z^jixcrJPD)}?SVeI8YFeDkr0RkGtTne@r3ew9leVWUyP(|0PG zJoX{>0kd~L6KQI;l* zHw+XOGf#fZk=Tl~EnuEty7}uCJo&bNh#KS?2X-o7|VdeoGbLTKBGm?1_Z?-R5Ik(E|nI(SuSd?;=Q+g~UEfMP16+jg!V`Y&LAtxUp^H{`c2^^=CC_c5~*O+03ZR zNlSOo0RTEu;;P!Jyre(>Q>fokddvwoUQVok5jQG z2({EdKMy^+A$u|NN3y)092<6DcnVoQob01HFBRwZg@=oh#knW@8&bN9XwBpd@+JuF{Kj`v7(o8=qlJto}G|Nm1yK<#^3;~kSfS#v z2kA8NmrP6QrjqP#JnwpWZEL1gjKt+keG0pyoyXw)PoPU1S#ev!j7Y5jL0 z@v*;A;6X?xP{MNtQPNOjUhrM5M4tr#=*i@X)?*mR*og#j(`JCF=*866f&DZX!(uhC zLqQ^T_ckUlnM%f9)Fi7*;f1K5dk9B^u@I6G!SUgk}kyw`jqP05bj%%AV!(cYC?uWFJCitK(|x z>OYmq2NgZASnY`JLa(Q%KMXFJwVjIo_(EJdZ=vMaddlI$g@=p41)KDcB9HpqcH1F@ zWxjZwG*pm+P&%INxaT-x9-w%90!@R}oPR9ezbqkvRQW|UV>MYR@$kGw9Bb%6Qo1BI zS1V1=oS+YxhHK%eaSb2z8TZZ;Q2ciui98{f-f|PZjkqt4xF_ z+T6c8E3_jp3??Y3>fw3dpSyyp7Z_nJIYbwK5Xr~J*L>_*KUm)F^~TQ%G*=d6FezT_cYB$bW&5Z+szxVM^K;=cauS?pzo4D zp1f|1op>T8_@9XmU04`LU5*IDX%yJ2QVj{1BJ9aBVif7ge+O)b9Pf{~KC1aJ=5@ac zhpdWLy)aJ}-)8r(co(E!8WAd#9}0(Iz2g$|$N6Y)=~g=oUQiRVK7_c5Tztlz+Dwm7 zXqCsHeGZyj)mZ^0eKG^{hIQy^<033~@Sfh|2G*vcVrV!Qa*=de9N@je&vRyS#Tyt0 z?tr>Fkt*91+W)gQ2=aylJQy?+!4^Vgxd}v$Xz-vu=m72aFu z$t(eGAA#5xnA?_hCSD#-#*lcsH5`rp`jJmXw{3BLqL+tdw*l)Qu63Zh=eZ3;BDU#)n};st(^A)RvB_R5~z2lN@q?A zn8wN3gwe@;bv3Pq@c*^fs1y#lb}^@8cknEM8^y=j^sf^5Iy>ydp#a-FptNeh>Vm4` zdo1c7;0}vpnkXU;-j7wlYD@J zL#R)i9?11g+TYNx;jb$D^r%YS)VP0SIQPFt;WpfMUjSMHQq&5H6k6%kOL1yUnVEh( zstq$}fsGK6zKHB#Vu+^o!o!Q?$`+1?Wj^kcRPfAjs5cb8&DIn|i{kczgzlYR&Tu!> z%YElqn#Ci-Xn8AAH$^!-TEBS?F+XWac@>dJDdb9FQoQac@l~G^pW0Dr0voAhxNMyA z!$aXCCL54QC}OKAI|$14wOXJpTBflAkm<~?(5*lTKhvMS340KUQ1LaXAZ(N`-Sd55 zWTKY2n>%q7L!QmX-C9Qee)&hLmh@g)#RBCVq5-8qpGYwC$Wk^eysQDl6P#EKL>=Rc ze@)!scDO8>PxUN^kz+pK$rj}|1307(vWg*eHO20`@lJg-pUETi*ySsP@7+JPTrT|o4FhgDXnfZ2YO4+i*eJ{cUjWMbg~Yd$YmiuU{DB!2s?_F z_jlH>FyCV7G>90A8NwP*`P21urmX8WCnx#@;T1x+PB_8F%Zz*v`bgH1U;{R16Yja*9w+?#o4Jhzp+*H3f8XeW$;?>fpLhDZ^hv_>4foKAgKh0rkikF84 zKVH)($P!v;uU*l-ZDY@nt!M~?b%&z4MKn%EH)hb%dApQ8Mlcag5fvfcNXJQ2k&MY} z>+^B(6qKckM`g^4T0iIi@Fj8LsLzm;DQ}5-;&UdVSqrO}rCyYcP+$nRgA1EhDa8WC zH?D}`n&eRPh}y#>@#MePJr!)16%Lj2dQl5tU67W2B*R|vHl`Ug$>@N6KZ?TY#-_r^ zY8muQh?6j!ufO%9KBsZtUnaQi;TSup=DH9gbbg#Q5`t!YOO`-t*~=Ybo0T`G9%(w` z)PdqyBAiVy`Y#)Ff+E>^!dcwtX>}d7leUDJ#m7u&2ipJaUeA|(Mw)c7Mj zPDx&~d%sqQoYkn6UpP-l8vGI4RMF-tRh~`xHbw`0$OQxH_@?^kB~i0e6uiq9RgjD` zI#!rGGA%!=Y_Av@2IZoI!-SvDF)>$o3^Pc1{+b$f7xY^(h52GtBTAada$e)dQh`(R zx|%HOJW#3~C16Q^E!{>P#^l-p5UY%+y>$EDet6NvqfHRf6CfCMNN(A{jCcD zqJ5ppDZeu?GOY(A>vIP%rj%7EpyUc5?Tel9PrvYorcO zOjQ*@Yc-1k`|H5G`}GD%lXWHeq?+pXGWB?kc=^(M6MKGaIi;G!Cp8Ptjt>^(!ilyO zT{DK=o603>6>+rM?p`JhfI}U7Jt61JpWD%VPuMcuD%4CDga^5QwbG}UI-NFe4fyO1 zcC1%a8>lv*XtR9TowzG49@Za5hYn;i?0w!4!NFD2QGjhpNHrx##P6~F%*1DW!!VUC zvHu)7VmZ`jx_&aY-u+DpMr6X5)(|=95VJY3Yn+|9AG(C1wsqRucOh0)(=i%=`i;z` z=#0PalWT5(M*MdmiY01upM;TQN)lOSJ}T=0^KqlAY69*9wOa&DuC61Ao~;TUckHW{ zhAd|zWT`2LjADCZj%ij3h0RmKjgc9c z-k5&NPB`nn+iZK)YVL#~R2_W-fmm2qyL_jlfIX3s@b}{Omp>)z7NG5lNPn97n=(4f zc1nIYS9Gc3VTL-BJMk-|n`Y-)5$%u0Vc}K5I)eravr7SQ_rVRrV_b}-@9Q{;E}1NI z&=~}1y}IKl%n5C50c_Wn@U1OccSWEoj zYK;w)#E*WwY`hPX3t&jZ_D371ot;)Okm-4rjc4w?{Ph=Ivwq@+()Q*hJE!kH?cT&3 z(}ZE2fM2;LlLP!D>zIPXxz zK!3uo_uKATpeD70JH*Mfk{W0sAmm>gtAaqY6tp{vdD)lI(FyV?)=r!&x9rD^@u%22#DYEV_6y#W)lDyRJX71nS_ z*250BbdTKCs{}fM99LzVHqFziR<}H)%XhuefS_l_EP^5!79GUMMYKCtZbjl2$lc!y z6QQGd0BjwU}R@GK{rR8`uufDLemFnttA{EK8Zs^ ziThT{jHTzKE(VxQYoeK?a8YFL4}{gYe*v_D4NXnQ-y2}@^~?v?+gY+7)M-(Y5IuR zQ}YT%FtwI-ahwFAAGuGKN zw(N``v{B+NCAleI;eNc9b5#(zxE=Q??4;Lths(wC zLhpjVBlnf=lZL@}9%biU6}fpB9WjJgGcZrQqoiz#cV^WR-j@bf>BWk#aneLA{GUU= zrsI}HxELJ1^L|x%Y8+}As18>hd6eQJw|TTrjm@P~0RL|go{e^v%9j#pm{co*s51Fy zoa(>@ocF;IGk{;NE7Ku1P5xJyCS{XSQA zS^f~I;m~btEW{RZzx{m1$N$1J^|1SrQKW1AtmLDf*@Bg;Lah(rXowrPKyMHclvF0n z_$N#Q8CDX!Fvzz$2=%qQN}@0g?tG}x3AV%riLRjDT&JCJu6{Z=T=YI)bg)h%Hcn4{ zCPM9*@QoY=4}v`rcr5DKNBSqOI@S0Dz*vbf7|lPFNdB;OYo=z?cx{u{EAUl<7P0sY z{RXqrTA}Z0Ef)jx4?80dg9LC%iuC|j64veP4EfH8~62e!xV1FzW|8N(|Et`?NSNPE_ggh-7l;lXjXJqs`o-XLS(27iwFN(1|z|bTR~5g$Pd_@ z3PJx)>$Z?oE&7~ySRPTD-4G?hf=54KG=c2M4x^0Y6B9w9bM9=huC%TZov`aT|6CUqu=h@&?68)mGG z(mCXmONAeU_rhi^K+#r`Ozp@zayD~V^~1L=R3+f*KnT9p7nRWh!4Da6;kw zE$)xRy#=yKR7xA7%9M`GM-ZouZ3+5j2|@7}R$Q<$-x+<~fE_S&(wVkiC`(bzw^VXf z$dnoU#AU`3td#$)eup1jNUpaR(TNZ^{#@%S{YoEcDaKE;snRgg=>3B2 z#*Y0rSqulnbjqhc-~P5)%aLt!p7HZrsGikm@3;t4&O*0n3QLH%g&RL5G}JQ|sl3mV z)bN#ra+ofF*bVIYoln^~Y^Tsbs-@|s1yOCL341Gs>xpRe-d*e(?sLsW{|gV2z-ADy zFy2)yoX9sxAjn506}6Ce>9%Nw$Q}1?W%Q#ffYbVc&$3K!W4m34AH`Vo1^QTgK}7|a zPrbsh5+EzIZLNuOM9!TyUe5UH#RZ=R`_ZV3wjT+~Z%yl2a%Jm6lq-7QorFKPJH&uj ze`+l#Fj=4-8ke$CD2z70LH)2-L@HL4+bwN`agJ2;ywU@C4;So^Fe7ok`(o~Y8;Zjy zMbo4nuzwX&P?~U-N~}n?ezb@PV_$b!V#;9O}a~AjB*W zbcW!xgksmC@uz3PG!y39q%QrbG!k&z(zB5IYbrD0_QAxzJ^WBuZp+Y{#t@E}pq^ZI z#evk%rZ)3;6N#92MmoQrdW3J-(TWfTWsyrohyE0NZi9T;OgSR@pv*n?ku{qEhtoXZ zvMPtYsgU5q-7HcKYE3P9hqWZ3WZ9VVlKY_9*OTbuBlW zM6?PN7L;OX&vo8C9F$ui@~-=ha0YSqLw#;ct<~7t+hyWz8*9zkFh&cur0#Z9)TLit zx)Jkmdbd;QNm)rwxn8d9Z8!~#a4f$Ru z&SrO5ZXGXk>m*FeTd{G#IH}+jdq(|usF_Jd zUkw!WECo~hn(?5?__L54<_&+DH9Wi4)b|_bf9Q{TsKfp{^sz=;9Ktl>QS{xVX1j?| zUx%-u7C>%<+D^+0;5E(%z`l}k{(VXTYS})BQ7wQvXgPj6+t1y@*pWXcYFrZ6(d}_n zwl^Qr-G%*{+@slD<+;bSq`we9XR-;vl%RsQAT%;IAPr?&yKU@L{bN8o0z)2KH$#K3 zAM?E0 zbdgy2akFoWWOxP4w7w+~g8ck*%hrKm1`p)08pQ$Kx5BT+r_K519Vs_Eg+IC$4T1|v z`YQcisn8Jk3+ABLbi6n5Ltzm0Mr2h1Pq$e}u<#so;Xr%6I0trnl^FqHoE@v`$K_{5 zqLiXK*=`rck}XH68`ZS}aKGU9$+A<5o78*xWy#K}w+c9_hxQ_-HUbGjbnw z7Liq78b-DH(Mx2oYF%CGs7|jL?BXp~O+E0wri)+##?K4G0Fn*-q9A~RxCnl8_TAIZ z6YI(IDgK3AMup$4fJfxK;z>j*b`Dz+I4x@inHs&OOKh5_`jb;e@Q|8YOdVwq)=MT+USVvmf z@ic|H@7yDLe%=-p@+sxo{6{hBoEpmZL4@p%@)$ zk+Iq{Xd~7)5{wxY;eRF)wH4weiHsRFirXPnpipuG>IW&lnX4eEfXZ(jnA^5&&k;}Xoy`Nggd3F zA2PFzD5*`+--Vkom_8t#3XO?C7IM+I-q1%kH>T1}%)S^Exb<;C+|sv>!bcmUngXUo zyvC!p)fX&b^dMyG6Zf z#njpquKv+?I)_!ih zh#er!L0j+>`2E|>exf%tH&f$4+hBO_50N|QNE0;^TH8mp4wB@oGfk&23dZP8{dAJS zpXVjcI~VF?U@5!b?${V<-AG0$-^~=jQ}F3wjUt*)WKW=G^)D3M(5KB0(3q@gxS~Mtr zowx0f`$tik*--OygkrjF^5502fO+$lI+1+v71$&(SN_LRsLt zYDCjzK^-Z_Ck#+Df0tkqAFp7puJ##JGH! z7;_uH=wQWb6Zch%jwj~_S>8ptgG@YrU3Y{^4EA zZlsxF6DNP98d^+Jk1QuKB0w=YT8=Kr4h=gPp6bkInV1jIUX(TlXGI0qkq> ziF$zgDqKz+p0uT9$zZ%Wx8r}wO%Eg&bLc|z3G_xP8|!R< zIJ2dvm9na70*-~pfVqP)SRGK-{Eb_!x#)mf*C7wb*24_GPU>HhM5BjI2K=bPn&XWi z5%Yz&YH6i~TP?0n)x)RIRx=@aUKT)^6HW{SM##K9jH{|mfI%QXuuawWLNnJ8H9jdIN;)_A)l^6D4b`UR(Q1j3_1=MEf#F08T7&3Cqd$|isA zA1EiZxG|-XO8UDs#L0EJq?`QdY&%W=jR@ZUxj|(%nY>XUoq#yR-`%mfu@1L@BK_Mx*C*>fSRa8yf28-YFiiLCZpFi=SmF@#uR*2J~5|9jqKEQi?`uCd}JJ9 zoe4lgwpGPvr*8zQMcCcQ2vw^#$|V#0e4KAe$lK7y+I z6omiayvFu-(_N~f1pJ+vL-V8k)-Y%Cu50j@Kp6_BtWc2(&kPHYm+YZV%lG;V98Kmp zmKNsNn{Ovds;F)*YTK!|2p`rN5J1l67c$2H6_jO;wT9Y=(`^ufO#L%l83S!O*G=SH z+{<9w#|}X@`SUoY7Bbv_cPJqWXBWAnJLB&=?<%F^AG}BPfNGlI33L|O(>*IL?NOH; z;*S>WAZ5#<;csyV;E&I4v9Syd_m0>$s>!f@`lI2O@>7iVtZJ1SC*#f~ets`%C8XvP z>K(EcE%`Y*Rj@OE4Hh9DxKG^J4zxvJ3TXM1d5K2JpkM68ZiNV4n)ZJYke-#v%3u4u z2q~EokVOpOlYT03PwvP!C3e#jHgKaiS%nCi)WKb9Qb34%HGM2Nb&$%>G53&1G(b>3 z>5#*u3U5jVIENONKNwAl)enEyPx7sS&Cw*m?U8e7ME7e@jSiH7Oe8D*LZmvfz)6&L zR|By{M-R?HcP$k|XzMt+iuTryRO( z|b1JP$7)?6%d>#wZx3cl;GjbIe% z9s=yBnVBA~?m^jsLti{74z6Tnq%&2x`Qr+3SuC48_}418}!^ofOTSJTHgH1g0Y<@w#}AryAp@f&j*|l;yHC zNfPaWujT8a_=CKwyVV;~&yISl=rnUeYZ?V*o!Y@;)nt4Z9jVM}l?QVSG>g;s7R!MP z9qbky)S%E=7F;(bAU!9S_rE~JRkQnpmJ%x-4P!C`yubJ1zwZC8q{;4kLu<)y=A-UY zr0+t%pkRxm_7xpU|6OcIM?|FVs(97QEVoit8`(S2m3zx^?S4P##xZ(t2WA>OV!%~zOGp@O=^dWKog?jqTe{tF; zl6gcOLz4Vm9?sOZx!4#sZaU1qNT~iI^ zRxHxQI*Z$?j}`IoH(pa0Xv>5nwq>fBXW2@8Te;+cQbmr*Kp)CIjo-fHf>v5gGb;9^ zwHodfKb26dF7{{G;32k2zj!y^l{0aXAB%vUjf?g_AeY_xfFMj!TQSzY2jqQyE<*DU zhJZtskjP+bJ3xe2?#nJ_2RzYigqw)0;9CGwud$Q}bQN*%S=1Aad?@S$-h9G=gJW<& z&g0O!C|;=Om`HAwnAwKicdlf|zwETKLRnqkxpwx&?KklMT@cn15Wx+~F^rEYG=ywq zm*CcoDNSqKVsxKq$S>74!rU^Q(c3zRBaAVN1Q*h2Gf_tvc9jTOEhlmrdg*N$PadMN zX5!CrZXeU;MuK%JEI8rB`fm&@4!X{uEi$P_YNuhTvpJ|#BPaT1>kJ`MnY3*hj6>{` z5QerdJN9P6+u>g*ZEW2j;Fv2hr+i)WC-JkZwXLqKBkC z$hn~qkH4Yfkc!ku;R(rSit^Y)bTKL51C;*Sk|fTcAhaGLkYFG_vk{J5rrG~^mr~&Y zV4XQr&%YB^n=||C657i4ZjEHQ_E==dx{Q~=6{yq5r{%0hUaa5&jgyJI6isPUGMsxh z2uX)S_UxHD#DY1~UC~>cbe-n~w=%TDfil8g?ekvDZWAKY~|X^S*Z5=`x`{gfXn+(R3tE+aWZv_yl8kyqE; zrWKb%&46j95N>ZGqV%wXN)`>Rd`E{P3gQ+QFi3Qcu~PCUhk**M(^4Td3JS)N(I&+^ z!JgZ|)WQWK;Gb!bbmZt#4&fdpJB2-M&8t%h92LY|Zd;(1<4;Qu$_kW_-;D7@4&_d% zrWF}MM|ej7xKj|c!osbecSnf(Fx2Ks{9ptVy=&%^jtdPjPX|fRiH}Sj>ROz=^^(hG-VMIZ8Wo6`GH(sR--l`oA9}<0DIw(jCH=EAEJ=x19k|r%Gva4EPV+#p4;}^OB5c6Q@DM4 zKj5DK<@3#^fwwZ~hq>AvHeW*acqj%=4l35><*_yaAbW&feayc*gL z=d!?-p}Pb@i-Xe%Vnu^RgU|1vq|LK0a}(dSTKF`ZQ3h6-e3}3hCu%gi-XVynOT2SI zs2Jg&?l-`$@g%q#c$Cdt3`XkAj!N9FXZ1e72TUz|GpFl!3qeEp2xX8P;$(Za>!j96D{~iPX132|**8l(j literal 0 HcmV?d00001 diff --git a/docs/source/_static/visual_materials/PlasticGlossyRed.webp b/docs/source/_static/visual_materials/PlasticGlossyRed.webp new file mode 100644 index 0000000000000000000000000000000000000000..9ac0e6d4d9cbed3ee83cf72fdc10167d0407f51c GIT binary patch literal 12548 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 literal 0 HcmV?d00001 diff --git a/docs/source/_static/visual_materials/PlasticMatteBlue.webp b/docs/source/_static/visual_materials/PlasticMatteBlue.webp new file mode 100644 index 0000000000000000000000000000000000000000..799a087dc512e34daf5600aa52198500587b658d GIT binary patch literal 11984 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 literal 0 HcmV?d00001 diff --git a/docs/source/_static/visual_materials/RubberBlack.webp b/docs/source/_static/visual_materials/RubberBlack.webp new file mode 100644 index 0000000000000000000000000000000000000000..5a509c89140b0bfe658ce9272c2634a17bcce173 GIT binary patch literal 11058 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 literal 0 HcmV?d00001 diff --git a/docs/source/_static/visual_materials/SkinHumanLight.webp b/docs/source/_static/visual_materials/SkinHumanLight.webp new file mode 100644 index 0000000000000000000000000000000000000000..da68c5986a43d94bb930793f87f6fe76a3fb09e0 GIT binary patch literal 11678 zcmV;PEn(79Nk&GNEdT&lMM6+kP&gopEdT&eKLMQqDu4oj0zN4ei9;cwArRWEa2NuF zw6}fvy}d{Oq;P<60neIRyE;-DS@%1Azk*@yadP(WS&uh;9Y59eIh~QsVVlS1SLX}5 z&Mdw_GF|G-)cVl=FWq;`e@`A^AFLjty;=U~`lS7b{l@pF^!xr#)GPc4_a93SYA-`C z+z(EVXus^g@%<}*`fC1sKmU)Tk7V;j-yHNZ=kWWMI=yj`JZJMeBL8pbodF>z>Zp_s zZvbQty$QjT(~WJI$3~?3I)#ODQ~#{aSlyTO2=Mh#wqp+G-U8D(SyJ#xAqMV_*)QK~ z8Tg|&mpUa+O@M4|TBziR^7->@ZhjUdlpCuUq-5m#d3T5n-`dHcZor(sUB<}@1p*m6Sd}V~%4zL0BI)Tu2 z_F~d^kaCvaATrqm30;dbBAlqn*)O#0|0+y5zHs>Ls2la?QD8w`1|U5}!eF#8qZ4{t z^91)?Xphoyh8s#Fr)ooyu(Y2`UZGIGk*lKr*p#NDWQ(!NMvNdP@P8SQ6tu7WsSbFFR|Te-ST zpVi-zutcU8XsP6wC(Uquhgz)T5+W;U=N4{XX39MX9-c!c#l++$cVuT#oxH>*!^f)B zL{C@6O41rjc_Q(y4b4)QqO6x%QlWr;1+;j3yLJ}I0*#dE!n>EX2d&Bdzm?$~NtjJ`nwc4y8!62`UlJqgb z`RDqkn*sKSvA zC$^Usjd}lkQGxHhW$CK2VN+d&-7o?i&RfU!YFZ?YAB?;o_G-)sUDDU5*^ghu3~=cj znOQf_TC-%17Ky~yDvD!g*vBX-D4?mRbmq~ z&O8>QtAHrQrGSNv^quATSmzffhU{3Pyl>r4OBs-&VY?Yv!?ej=Lr@~NWgRY{c+&0j zQuc9*HfxNwKq=z9+GlnYtsyOSQkHDY?4l=%CGL+2>X{bse1vc(7Z-UUKIVw079bNO z`cB{gHhZw~HS-(Se@n*>HcWm!A+OYnEV_79#wh(KL6RfVDUQ&T^024hgYcE`X;aN> z?Ez=t<0*4kVt?NT+s+*|pV&oUVpjqBf(#o3zYMXFV_yA!5)LEQ@!41cK2SH3uUjaa zu_hFfer9N6`%|Z(JE-ua7-`T%5K+Q~$|Pqt{S&RBoT$k89dQ8uD&LD4_-KZBmhC&X zGHX^yCHnR$D=9ctM8nqSy^7P(szq&rOksuiTYt7#-C`lUa7_h5-|$28)^iN(9oEEX zP&h98L(M%^1TsWA)dQ|dm5l_$|kh=fRljB-+Xln5`#OxIsai1;kWEp(S?l7&? zHqK(|vyEa$DmIv02OXSZZ5I@{4DDw>a&HCH0Hul)5mfk8whJjlMZ?2X{G?2fdC^u%D62OI_Qo{VAn=>AsYph>loKN=PM2SXXkl`E z87xpn&*a`_40l+r;eF@$BR7poKFcn8Eqybj-{-h zDu6%otZY5+lLGZw6%Pfl`lzdvP=*RqmVyd6>em0~>64fI^T$+sr zZAL@}rQeoB;8*;ywU2B4gF78!q@RR%9{iaBkb&{6fe638O$^7-lcAlJFgcPQN^Iezm3BK$974b z6V$=2XYgb>k^olp52@!QH`t^J%6kL;L+ao~V4MjpkuA9n%R#y%+_eHo^$~z(N6cm= zH}&9@pAa-!W2K|P8#ztBdZ>)4j9v*o|0$>fx)zz*ou7uCCv)m;LlC-39bv_gb$}SB zdDT4aKoNf#@2G0K&1NzPm$v(iLSqAhqU<%R@dh{|nA903ArEw)i6A4NgZ)d0!zdtS{@e4)%$2D< zT|h*Nl|zG4xHT(#{SKUq8u7F63i|i1VGo<7eAjPRqZJ4hpZq90O`2an7V@>kxTOJV zuxU`e-spy{$Q`D#=4<(_ymhzFKhk-(usj-;%6ZwV(VAhC;g5zsIaB=lK6yn&`#jUp z5oT~ErPVJr+k!S@B-{bo>Z^RX%WfUL!}a-d6R;6%#Zc2`>a*9>qJ)y#OW63l{c&22V(F68Q_d0>=u#@N{N_e9QIqa?QR7m z7a?6#N7b!dku?M=j*w?!>0lbkDOx3Hl1Hh!#};PXNU7UAU-M>2e`pOblRHVz5FK*$ zr8lNB)KeTQVO3!^^itwV;X{k(wc~+#aYH{R>3Z+|azeVgQPuzCcEAAs^1M&`mA`(! zwA#}DvL^rg>2LpiE&WB(CxlR{d%cZzNlEV(a>tQ>LoGd0?gjUf@EyE4`aUF-oh_ny z8g$+>_q=WNQEkurmIXx>$1*+LQ>;$>|M#su{;sS$LU{ba-uA3~w%(o-$&0Ewsu?{g zU$blV&D;ct;8n8{=%|iU!k~ehy&6}_=0%GLB>#V&&dGTc zf$JYEGx+Tx2=0ufXR5@!!tYds7mCJ>{8VJqepOK=Iv7P9d1v%n>E37}B zU5$3_x~$a>0VfFKy)9b5LQuHBhh1ULQe9Zd6EuHi&7?^I4ufvN_R7gyJev?XDY@KD zBa475)(NyblU_ava)5u-R=0yBX#jqhHr=DioI^iOG$C`w|L%4^;Q$V1DhBQqFgy@? zG2kno0bES{C*^r$3-u^k_{pGXrx$D)l?>F3iUm+DPJ2ejP|RZ-Xs8NO!OfRS??T8j z{zb%^OI76kL@0;ktNUzn?Y0d_12FUMpUdz zd)PY0u)sh~%*pbK6uWEsAQ@&-@3!xe-@HVk!e)@Dtki6N^r=kM2#I$VYpd<1@wG&$ z)!f!6NLGHoDKXN`9dJYhqUM)+_L+I!nUm8;RFF8d%SIx=w)=Fr7k}Y0jlHX9_)#xW zU+$V(Y4@(Zzn+<0{y&*JK$zBlZt2{2dKTd8#v;t_y76LRz5W{MyIuISBXYc^v;lGa z^09_z!}W<)avn83ySb!#$LC~a392^S=c#{K-_UzAS=N(P`2KP3!CFn2V(=ULq_3Pt zmG#*%krv}rj&I3=I)F_z=bW z-*7pQ9dPw&6C&4=&<&8s-Qik(TM8RkGHz!&MtfCkFU&=FRdfj%@x#RGi=W3OZOH8b z633&s&(C0EB5oJMBF&%ebvRGGsvDgPHrw#hP4hcuKG)}O8Cf`oTRo!YR0|fk6@rn_ zRn=L}x=<1E5E>|(?s}i3kbsOkhq#o|D2=@|gYmip@&mb-h9Zi+uBUDnPie}KHp zM&T9dEycaSfKU@CIVra?c9&hyycZ1BP6cx7tls>ZY{Z&6GBXTY9xU#D&{Ih7SIy~I z=Iz70Jnfpr1P1j}{!PqFr!GeCFX`Cg>D`Qa-YpMZeIuWz#1^`Gr+0l(Jb+wiJb<1#X z&ZZ-gwZV>IHO9>H*|U;QsPN#dYg|sT`=F zv&ljJFwt=O1uQ<2%-+Bn^XswVmhqA5IaST@i&FCCAirmUHawJ+!}RnJqS$6c!bkXo zVDkJv?9X*p`SmgPhfk)iSu3p=NV9e(?fX#rkdQW9f@RrZzb#jf64(zqh$id{*=|+@ z#lBJ_{3WfZ6;oZj+kK8L4Wbt6Vz^>uNqjnFR$(1Qy&$l*o!oz9f$X5V#E=+bBc-w4 zZOS-YD4#YG=Ev0WKL#cGo>E94R=0fklM5R8`87sOp!-TEvKh=(xXs-AIu!@|Jb67DEHDRIkJ#e%+JDc)itOL4417~sggpWw&8`qE%%o(@8mH@tnp7>;d_ zRKGtuo32jYD@}}-g1uee=KK!dUvAYRX`o? z@@g6eY>vrXkS=5(U_xWDNtAe0Gc%CrRSRI=Br3TJaj;;u@IX(P0OqcoHvNTTG=@Vh zP&kKHjJsTnz7IL;_oy$|lRf^VEBJLbJ@!alaJ3Q220r+Ro5M|Pqs_ZB z^PTZp->OR$@b|A1tMP+p^DRb-OAkYk%ZIrc_}{>M5q)c9ZOFyoR|KEX^v**fp84!F zq|&_vnj?iTnFW~9MX>tJ#XbMTTK-1_!k}B8J}XoFLOV5+=@jnuM|b{*WI1>|8a+C_ zE!1@UK-!{1*9~1ga^LkrSW0emslxQ8h`p!dh($|sZyNG>%^h07=K$p6SNZph$}{)3 zzG8n!;gb)Y)Q8T_Uz9Kg zu&ceVO+?q`6|J;|s(ymuYJN6FmhYY9hi!&(eWE4x$xd*5@Wa!eAwWJZ%H07gQ ziRTodO2-CYqi(4r=(SP0C3TB=*lL}b9rUwn<7sfe5yq-ehcajz*7pQf#&@8O{#=6J zA$$SE8`Ds)AKbUgqZ^botU4|@Sj2M&MfFdj(Mo{bK=Q;NT_K-X|DcpGiUAAuWEvkiH{>4+>8sG9MW|-!1l^|!qdESyh1Gk8Ev{Mcm zNYzirn)P4JMb5=dkbBuE*=u>UrF!qI9+D5!{Z{*%2f5rPJEIS0ak{)v(+v9zIDJSp> zisicm1Mx*!st00SoTy0J2}dX;PUVh^Onh1j{>}OfJ#h-WH4{bZd}yKIlwqNc&)t*E z2xW|_Yk8QKwRG&g0-ylpGYrro)ru`ww!_yPflJ^d2)rl6^?&^7D4F_VcMQf~^d0b@ zE%;LyrR-AaaZ%$=RwgADwD}_dOo^$GR7LZ+_QFo&00Ow$K{B%+z`z!|L1`4G{X;CX zf8UStC&`tmfJCHbg}J1FRo_3~?0VEkX*^Kd{HI9&-$WhHT&W<93V+N}Fgmg-l^Ua- zJBGBYpmlWPVJ4EM-cQ4aUlTM~%c`AOa{hQZh8W}X$5fp!k(#Y`%|)w3vao!FKVo?A zeb?vArN)wVf@Zv}f1rqTBqX5zmofOcjid=?Ni#=8DX#;+nsDZSJwZ>=yMLL^#v4Et zuCt-Fd7^DW1-0wvKfSCo&_d;WtSPfsjF?RE0f z9&!d5*%Tv4=fEVIZT6GmM+K_=d2{5NfO>=2^e(yB zT@0poZm0q`<{DBMjkU7gLzD_J)x!!XX5(+cx~^Mj3=t6}@nSXmCXf0*kh_l{v&^aA zvxr%Ay-NMn-A;%oo;8dG~vsfvB8P}{mkXE?LHZQ!ykrw z?$ldb$?D??2)djJoUj#s`m8fb*P~C(V^tY0@OA*_>g|-$Qfni>2wkHDy1sTaBwv|2 zBKAC>|HKBOatt98`#7EUCr1UF6iKrG{f3nOX1Q!5)v5?KSdMrvyM;51us>;g^nB<7{pZcE6>r`vFUaRZJy=(D;Nn+t$9+{Gtz*vMO#zIMf@UxW z2P{&NEtQR^xpK{9XkYGgC4nDGUAs)%@FmLe_VoeU{{r1T}(;y4K%Y{)Saq+ zq|sgRTxxc)hb6a!q44 zhQ|lj>NeVQ-llkxoG4SMw!p1_d8k@?f+kj##QFyuA40x)yGvh)q^bOvMt5h=Ftfk% zeCXBKwV&kraZ6TMBbuA2VGwO@_XHF;%rS5(qC0S9!1m?s z!)5hoHycnRXSD7>ZCq5214*mB!2gj#8SM^)t6Nx*lF%txf!7aAM=sVmB9%Kgd`*KS z04ozNtUaraDM)XctZSeKG9cJbnUw&p6=WBH5?C5V@zeNnZQW}{)y@0TWJ%E!mX-e3 zZ#V3*hpI*zuGjuhX~^Y0;&08}Q?Q2?Pp6}PSWC^KOatn@GGKJ`+HeZxBldxJO?cnU ziO0Y!m{{>zY)~)ByQL z+!oNt%x;iIRhJd{7eD{axPcSJudQa@n=j$Z<>07ZX=^y68+#e9fO=zGw-B6I5%|n; zoH-O2_&0&&5lAocBq?re=hj8U{oYCAg=XWnAk*d!&&svSpAA! z&Qt<5!Y-G(`myH47o{~p?dwYzk0ftmA6TuUF52f<5Xa$tZkJpPTDL7RW%0y*@C{=z z27}ae;35FU<@N_KbmDme2OFV1H^+4N^nlX7y3oX)bI>bonbo?`T9KW5$w*C8qz1hu%|jVkn#pCCyH7O9v*M=!X2gwSp&0ORF^M%dWZEKD7BIE4i?Y#;C>qF6 zCKyiDyh-Dj=-(6f`jnP)Z6wnWm-Hkkxmj~ey1DpFG`(_-z3u6UhxBJ)eMAG3m<%^4 z(#Yy@SW%yql|QC#iRgAfXoL;R(|=7^f~lW2DNO6TXsGV+3;&jTuDr&%S@f9X{OQF3efj9~!dGKAadnPS7a zg0j;$hhonFn*cb0i-x7&i{=nmxq+ik=3E-C3Xhrwv1TK8SefeDt%5`KRvO^;vl*G0 z9yX#-Q6K+(xdT`lHNt<)V+I%U@r(_B*H_Fhu2U_!D2ps1- z6U4?;_L2i+6o;GkOk?jFXg(-;5I&{SJm}1a>w8+R2~x<;wI$#@SW0;cT^e_0R20}# zgCH)jT%1b(&w8FWs zbKn@T(H0Zm^3|tEX!P)ouge>hp;F;)F9jS~#$chUG$Hc>jBw={C(mhgCz7x&l3A|W z8hR)CZ-$r;7;Iw=?tt~EaBXQ}bEc1u`4sbp0c;i3J_s@1PM1h~E6{j_geT-m4vc|8 zr|lsHH%5qRPUAK)v9P7CQ4Sq}qnsq>fJIyKA3_V#OueI%U$DZtgCDu$%h8&%Y_ zWHJxaL{-xW5IE!xQ)eS!2J>SNVp0*Ae|MjVFki*A)q1b>>;+DN5=a}8Mo7kd9OMyh zQzD+5c&LWB%JgQHh}lhOr%el_n$|pmbhL2kYcN6X>vJU-L{3c`O}<@AWa*hwPZEY~ zWqm~gs*^2bwBUTAF`1S*G(}fa2}4;FIBO`@HF%OJL!pI$P!yx^ZO_L|#gq-`6O^gl|=j4vm zM8fOmcX|&@&nZ#__7xCpn)>Corg0PD%viXLoCS%@lVkMnSIZ0jGDjD*58}9D>Zlod z189FPEhMfQ9 zDF{MqR_Q^ksf7@#5sA)+yMG$ZmJohFSM}btS8c^G0%uPL$_$4e_MZ^|wiKT4iXFNY z-tvSvm=#2dMk$P~?Gs>z>6OJ_K>`JJwx-`w%5T%igV?<$$wQBr(N>FMJgD-?!j9Om zgbDAS34o*dVz@Z_3B3raC(Fc4y~0PKGIb$@0ve{!|V}s zN0;GUT;bF}3e*|tGQWT6AW|Z1wFXLpX;f8zpStRSSat+$Je?i?X~dD@hFsuj+9n=f z$jr$#BE@A#;%8iDaaYEKDfg~pSAnC@)!(@+9F^zm=+}49-4f&7kMu#wq&lzFgFBqsG2EZZz;;xE*pE)f zs;rz$oro2|^61rVZ9#R&e!epCx9@fM)vug#@R_>SVB{qJke0Cr{!-wv5)IX3aw_4{ zQnJC~o4gr|8CFhZCrQU+S9=f~thcBMb-6QnrFIhLU0On_@gDYfXt!o+*fKeY)TdmQ?E8!p(O+_xkk+TUxS@HLP432d;66b zBOygk#9Xd>EPo?h{+U=IdNO9G_Gctol)0z2LDfMY*=`M?Dk!1ym@?n-=8%INOp-z9J0K>zbUEOFCia+0!y+B|qs$dhbR{{JK{#27JLVQ4 zD843@Iy)pVbR>W{9Zt4%39Ga^Sf|l5kUHb=x{&d6S1z#fJEwnTYg+C~ZTA4+FDIVC z>E#hN1M}DtT%=v9hUfrT14TW6td$R8L|t4pMbUmK)9Ia=%gN5yct0vGB=7{-rjHUz z^`Luq)U%wTx1JT0#Uo&S3RaK5MpQ{%IqPfdGn)Fsp72%pG2-JqoA|^zDG~R18LDwp zv{P5sGFVVK=|syin$>+jkYgut@PJ@$ zhwA{O-Xc&>%6PbQuy>PnARq$9?}NYxLITtOyd=vKc&-ZEGHIXpx|tYyt;U6Kq}INpxH$6R>9R{u zF)8@m&9Q4~FXnWeCL2GFzhBVG<;3=1!kxAQWFwN%@vEsDh*jH@ZwBNpR4)TP;2E2xuz6*ljKztl``U|k>$4LmnFI;yHW&7Ys@qtf*i3Xk7=>$9eIXF**dHA=jdFkw2nY;x;{-9ZxxU!41ovbJ#Ac{)Pbm zJzP#(#kLisx8^X&zeJ?SUwcO;k+AK{E16-DW>)zR8S+iK2asF4(*APl^`565u@h$5PE+Y{9DYFzOzBqL0~rXB zucnNxIV|1l?5^Ovv6a)mK^F241yU2dokIP;3FE*T4&e%nv4FJFy>L>AZ^GC zW)c&4efBRAF2Qv7Nik=Ifh8vg&*0$Eg!%iw&yDKp1N}Kvb#wTy_$RkjMt`rt{cLMO zudadX8%GD6^T+3gem@4+hFqSldW&Dx?bOf>N748*8%*&s&(^Zw4|6bn0mj9+6aT7f z^HCUJ6(C5?sJ~k>D8Lt7y_`@o?MXz{yV|P_KRGvA*-Mxf2yZ`PG0ynGOEd4hr0H08fUbo$uT(Ous$W?LT(@qzC z5z%45$qKhn0BVrv?`h~^QbmQynEY6=S2T-m-Y777WH{03u4XYu;1=kh{-}rCe7OFC zR(boE6fVa%Q9%E`l9oIpaA=^kGUR)f)n%SDnr!$eJMw_u;ERDQg*lEU!(CGVVSKoz z->z_6&|OFZo#RaL$T`jOC>I4G@zE;SEe?ek=M8uu=W)yD1(3jvW?VEUw{An=&>#3h zU;u~9;j-|svtDl8nbhV5hka9oD(d;Em`oeix8t4A)?b)B&KFv2U^`|Uqk|*SgB5aY+Rupa!D7os$l_N_+a$tY} zkJ!HEIwH_yJj65z=I`jgPy7(QApG`tCVAU&r5{{xEnTdf-H9y{8o7{QkAQbM#x1fm z)NQ$)F7|qW2N)J5%t8rY?g86Z0{PT=G78weR1fiM=MXkyEeRvq-~!fT$h#+m?oYVp z5yk18R)Ouz=jynlu)rq@2LFp69Or)NQUgiArxY(gW%$a~dK0d(5?6rZ@*T&%uyQu_ zOZ+uI^(}A|;N1q^TnHIc!KKfN&DxD8VRp}D>Oi{OYi6#j-g2fD+ePdVz5fcXU;<1$ z*u{1Nr&uQf-bRU=4xT6gJRtwhnI+$!FJV*gu}e_Pvw?l}^`!}af z^>Q2bgh{rL13YMJpSpxq0O-Yvxs=N+=yX5H{wD3SNNAHDfIM1gFbB1&d;?Gu*T9(> zRY4y~Dokg*0;5Pbu-g+)tWSleXg(8#3kk`qGzbw&HP z^_nqWM=SC1%o`V$`6`(+RZLmN_}Bh1u7LiX(+&iz11~yoldnyLn*c&U>;!}*a7`>} zJemCsVPxrSH9xI$IFHbZTTdrJ07jiWJnhdtlHhRACXq$LyMz&F>0N?oJfrNi5|p_K zs_e_sLsB5P02SQWVe3Fp0z~r0(4OFSmbZz#!sRDMa|;z*wGTDw<4ZTYCdqgcxa?Zt z7>784j2B{*FBAl~gr*{|>-vYACjM_YCNuaQ1OX*&zzH)@OL;>vp`ZaNK*#uiJGtL` z$fb_N^leahDKL7o%Lc5Of1%qttuG}HRTLldBI@0)_#HED?7pQIt2qKl-;6o~hCv8d o)cgJRQ2=Gq16_JCJHp=OFns=2ghfgCu5&83FMsnPDqTi^0L!P>SO5S3 literal 0 HcmV?d00001 diff --git a/docs/source/_static/visual_materials/SoapBubble.webp b/docs/source/_static/visual_materials/SoapBubble.webp new file mode 100644 index 0000000000000000000000000000000000000000..4043c7c4017212f828daa2faa599a7dd77ac9e24 GIT binary patch literal 15826 zcmb`OGq5NMkVLO-+qP}nwr$&b*S2ljwr$%s_HVx7PSn%Ei6-dks!@^@6Px4(08ked zQczRiAn5&1&-(!808#}21px6;qWlvkEFdH*c&UI;0EIM{E_V$_9NYi7Q!r-`qYs{e zj_|V{l(^Su^jfP5&wkU=0y+zHpp);h7yo6?DH3lXk-zl^!e9Iw_B!$!_E-FC`TN@r|1f`*|JCc^Z{I`YZ|iHpTk3mlap^fb&pO?^ z_4vEJ^yBpZfSuBZ>TUSF+VqdocRQ3#pbPBw>+L%?yx`3IR`JEv_!3v+TUd!}b~V2F ze_6C2wMZEh48lD-W1s#bF6!ZZ$! z^%fM>@z;feMoFjWBl_xCmCBsa|lyj#piTo)zQ7yHF0Jbm5<`b}(#VxV$twK1D|q89 zyCWM+AH>;5ms*vvszaYoQlh+QFTCPMpuZw>MW>Cn1aM%FQy?(Vfx3go%Q)`J?A5jQ_l{7qaY-^(v{ zuM`}Q8i?k{H8X5!P&W|4Yo41%c!*wa8D4KnibRL3t86l-YxXM~$xP{p({Fyp1*1|0u3(Vy;7R;;N;f46@W$V+`4wys7?hKI%9<7tne$8}6{R)eGjY+NuHKbTP$v ze57oSr|wNPPYy@d9I9U;KArfLgi^?3P`X`2ot@xPkw8(JFb_8n(ra$iycU(P9h0qJ zAKY&a4P6jeaj~4N=9jcJQQ6y!bdf+i@{aVP^lZ>f6W_P7j3F0m1g8vneg6Bd!z*z<)j){<4G%iC)unld4F6s8ALl6$f8&Q+Tz| zCts)}h+u8h!k=Zep3nZ`BwES&<1twjQ;PmzX(1vv?uzgdvUK{*xbv7%vOR#Sk^>rZ z;Ad>wKx^e6`D0oWShwI(Mc)Feo53RC;R>z-UTaGM-qF(c8OzcVC=2_xMW2JysRZGi zXuF*jkKh4x1e+%ZBz2Zg`pli|5B+WF?i7^b&~(j48OmPLgFuboKx60NwaDEFr%0#^ z4ml{(Z`fuP2Ui`M75@;@zCr`nvPc#cQ11B0W}mF!;clKi9U>R+6jEPNB29!{@G=ST zH(l3$a3I>&O{ zc1KcUi3(yIRHAgp`J1tQQ4?Udk^5YT^SD^8bC>$b~d=MyRZGi_4 zY(j2=Y{ikzYnt(|482VM?d&PFBVRkqp1$})fi>H=*~*6BX<$hpcuSov{#$=$kg!Ez zT=c$C48tAnD6Xs#hx$GhMM=qp2NOp%T*jEp022PdOU< zPMeOzr8{ZGIti~k6IaNa%gQ&sSZH<({4Z@hHzv%I0n`LgkvsZzF^!POts1JDJR)y0yGq`C5y0r2Mr4iM|Ag`Vqa8p9uSwBZc*LRH-9~= zfZOb(nreZK+2MfPqbhpjrtIWWDeU!vx&*D|XXJbyp?ABl6zoyGr*EpM#LAKi@3T2?Ut*EKLKR%2Q0#k<*2FZUsvf{^3y)aw}` z)Za|;oxbo>cE4$JEmtj*bbHwN2blj~qBj?ZzW$k6=0bGZL7=j5%N&_juKqr~1oS$N zJwh(!0ZSwIQfBZok#}TXX|4$uj1i(sByKpfL`u#j<=Vyy#|n+o762;;x|N$dvSR6t z(*6eU2h+`jYa6PYGK8mi*lwgLrO_#QDkDCHP|eET_3%AYX;CewKtf|Cz{sbZm3UGN z9aQL2%+ajqJbjr8Qi$N1l#jd`88_IN?(BV_^H_kM zbPDLhUqu~@Da9Wo8x^$fturSv^A(tP^m($7bge+d%X5$eSwG|YeQsB+Zl-i`#gQ5h zOfr^^;x5nMN*uqh3Fx~fdP0hgP&$!tKst^!WOtvX1x9k*JHDQH(zrH^>A3P%gU{c5 zJz)isJo?C1`{Qr+4%>iC;}Bnz=Q&L>oh{siz!yH=kQe&SIPt%7Y{7ivl$H2z+*qR^ zU<06t2m@|uiqj@hZz3i~DViz~T8C9`_q0j$`<_2(dvo|04(-5|Y-#*IibyXKbkX77)JRh8z3YBx%dFse> zwZ@kwB|WOPs*R^l8o(pEY{rNm5x0~HZ7*O*@<1zvz2@8*#Z|6de_J!hURq+0IjsKf zn(@mbd!P}-dUY;Pa(;3ZlBKx<*%79SrK9fr>WnS}b=S4i6wums2A^kf%2W#H)r0)K zc!32HGLHuEiv=euBDB^@YIn@9Q0yB7v!_8isD{3IPAtK;0Ak zuMLa`0D3a(sE+_*YykiONHO`O{S9zQVJSou;R}M=AC!n>Up21)00{lh%p?%Me&v>FCt)iV;WR){B_FLK}6+dd0jalRBl1tkp|r zd~^ZR-KtRb6%WTNI^$j}Xa?nZ+lT*5#FDqd9q0nhU6aPgRO&3Um_}c+g*Wn0yF58o zsU(Le8M|XZ;pPc%MT3g9MtJ&<9Pc#K%{IBQf3p&nOSS~IW*#oRZYcC0- zL_;RGO&>Sj`KM^V+Pp+*1L{R{Qn%kuT1fP3$NzMT^(sjQ!5v)I81KRnW}U{zM%+g{ z-JKl&0+nZN?l*Lwc)jf{SsI(5A!9XIV!|G}HEB zJ)S|;tf$`+9C!%dk&~^c#E041pA`8--?&@lTepg83DZ1-waH%fWYmEdts` z8m%6yIaJ@WnUt%9f?7@x-*#yr){8oZVzHf1PyKd@pU|W2cfD_7ID89&v$x~`_)jxq z2O-!Vi#QLTyC!s^1?tuWr+;Ms*l_te4DO_!gOZ_ZG-o?==d+20p8IB@`pg~%B)@ac zPb__)0V-mSEoN6&qFbnw6Acv=I!9FoFv}#GDGw|%wLbbWbFJF8HaS&wa)>Ims;qNC zR3eZ@X^tmEnBQs(mp|lLwq>kOSCr~Dc}dU{jp=R$p+dF%D~4u3u;D9TUHSTUlhyjM zar@P^SsM(Z%aG4fQae+I1h+-BDZqB;|07KfVe!D z#&-)Wh;pj`_3a=?I}+=dUj8cxHELiLs_3i-V}{;z)$(v>iVvtz4&?n3E8aVt;G-?c z#p_-zalx!+574f_*@q}q&6^DzWrzy>Z5?9TD2k($Jo@n@vef>r%g7&G=Jco&r6fC8 z3AW$53nWUY(Em4phN@er{usSzH9e@~S7h1a*|eynL{CqNZ7{0renvuf@%+4S{O=y-T#5}+w+tEgYc-*(TP4;1@5TcZKkQa%FQiek*ct0co>>D+6cs0DhY#6dr%)YX~6&IpH`3w?#HN$)o={=mIY@gr1xylRM_ zG9wd~j&tuNr9ZGOC&?RgsuuDGzUJ0Kc<{)p(y!N#203oT zbmZ-M6L>2riweGv9bhyqS~ld_Wb}|yj>3YrvXs@CtI=l*5QX~C=HlzxQ3v2CPT9;K z%TVbVH{4_iyf}F7nB-Xo%dVm#br>4}bDE9lwll9yjJ#QG5Z1T&`oWIELXVj#4#Vlg z1TS2P*au4^uHNmkX_d1tsSbfs&(S0lGxTYYKYPjsaZ#f(_ zb-TzGY&oIM<+s7{Y-^Jr@f^7rNhRvO)IWWiRE?`GGHH4pCE-6B>hKPw z*?K5`f)xJ6H+ry^2L-9%7mXgGM-^o_q1{ayjOI=^BwqV(>`3b@y4p60J=?7#S3#}l^`;Y;CB8_&mcfaj8yUktVv&Bz{lBbqqSs&~TqbSM;eI!pYb-3~{haX$?|ycQEtAwwW}*%aydmrVNyt?Uivmyc zE7>4=UWNXyl`PoeVnQK`JoEN~vRB60aQMOuK%0oIV7LTkX}#6xzoD`}(@AjFj-5%I zx9!#$3zImY*hT9Tj-~p%NKoZYc8#GOR-Xq8b_=BqlV8|q5=bD%0Ba4p5LMLwXh*H* z_~4^+w(W7|@GLirEUk5bOq^r8+CN2jVw|4IS1I?^#+@rc)nM=6dh#l53BJ`c_LuPM zX=hpwst82eB78mX82+8yNP!w3)gzZq^QX2irGB4+754crDx#jXQzgDmYgJ!m-EwQS zbJZE8$fkbT3!I)8pj z#P>wYmQu+L6qLAlgP<0u&lo$5=>$oZdCQcq@nH%a6|SkZv1^st?RT{7B~4!9crewr z5)gor{9-VN_@*qp!AQVydx)wnC`rr9zh2%2?>x@ z`8&W~5jQPevXb^3M4 zOhRQ~X+V?rj>#E|VupEKJgnY$=(-z)|0W+Ep|*s!Gr%&xT%Ac|tW8U>wt45!got}A z&wR~yv1Xsue`EuAa%_v0rx-NVtLSaj6HYaoB}LCP6qwEUL=~u}ALGvfB`km>fZ4Y1 z;_JBPVLZ*Eas2*y{wzfBa|;Zi*~~LF$BK(fAG3mnTjnC|AP6ZSdr~5ZK`j;FR6UTd zRfdXkjS#Hxtedw6<8-q!?9A#4G_*yG7S5$mn zx@n25sw@B$_ONOEF!%_3WWy?koGTC0V7J=CnxNQB{9j>lL_u|RTBo+Cm-)6L+Q3C- z(P3aLv<`!^yB^WQ8MRsR4N94ui}Zlq>Zhxi#~q!@y-Fr_nt^t4oi$4lB*zV<%hBm4 zt?~)9V^3D&q>CCte&ySgB=p*MyTJmq}X!;%(Xs>6$ajB`4 zfsZ}C?)a+>d+^Z0S^6n=BH?;p&9}jb?30iitQI&~@F5;~u|eyuJdyhOa&|+okD0Pu zj#wJZx@`?t6y$>tToQPgE*?s4EvQi7*K0fU!&995cUGJ>zL;j6hkP({e~P54)>$qN z+kxzoT;|vWdLm_+jRvPN?(`*Tzj>WqtlbcD7(t`wTM-fWGT-b(yE~X2e?5+YdwLgu zKixaN#*T2(7XLiB*-|>mP_^2Gy&^8EGo;{#xsRbj3mV<(Cg~41TIHV$y$*vak+Oa} zpGR*ae3apfGy%iNw#^&$h5ej#h`s|n+Rn>c06OEVb*sw~&AE=H^Io6#t1!Lqdl1!X zirY?B5qZJ+L&jEvL}jCbr3T93H0VBl@p5bkR@2@^?kfgObB-(pVVW$Y^3%ZO?Jj|^ zVkkD4nk}(tO!z(|2Ft^X%7Pxik>}Pdiz2XG-uZO{o!U*5eElH|hks6q zC9en3GEqJwEmp{(^OZ%-R~LLIBIA0C5%0P|N{#=pNDZyN+BPFktj8yUTb5B{YognF zvWtdG)5!+Okip)PoxCIs2|<`Ft)G#96Vy!Tp$oLl-~t*rO`C88<1@NJo{;Mm!|Dl&zg=PlBfk^|tZV|aloYZ8@p!!A zyaWTVv+WR{Hhlb>f_qa;L3W#*PJ~4zEPP2MQ#}Efp1fCPI4ge3pj5!d%9M-1d*fLb zon$rkd;MHt01D;0jm|%6f^My_!(^`aKmRyZ2Mn+=xMuM=eopB zdlbh(_{C5XqN&11J*epX>DUH~b#& z^j2dD>23+7f)SB&l();vcrZhG}oZP^uKQhkW|pvX8`mRLQriKYNND`UxaF@Ol(>8Q0>-S3L z>=laKaK>m{tiRsWKHg)6TLioT$+h4`F+}=OutnIMj*m86T#= zncSaatCq}iZ^YPo!EV>J>4LdM`I_pNzF}YLrxs>PCu{q3gy-rfdZ+Dn3(FM#&cj&VidniD&vN$lTv0BQ>=xIh`KLC7hBcJQVTVHN{@3tt9xD3>Ct zpXO-P(6~~pi@@S?06Sjq7VH^?uA*Empbi&pb z?eUvWrPnl|v>mzq?apUN90xS;V4}!;hr8_&mveT@vUb`;7-u?BpOfdNm2AK%5rS|R4m~%B#j~I_aq}R| zJFl5;hVkHi@_k0yUgd`->W(Qo7D0T~<^Y^n?Bu!+j1XQE`Wp{7RhE;Mclihu2%}!q zkE~Su>@m)>R8S+>qP`FNui*Vf5UZ={b{_?IMyp=2mj?Ql#-XiH1|CK+7)~#@s4759 zVj{jl^T!n#HlBKQ4Yf1BZ8q;o%hr+$K?@-&%=6dpsU*ZZJj+LsixI6bj7|$D3TFZ4r&hU@P^KAni47D&2{%Hd^`tF2OYswjMdHsR-PE z?q)=Gie(S0ep<5MRt2tPS#cGzZ-WDyH8Negp%F;-b zRKO6LdZyD6q_%`Yq^5~`9dOZn&nWl-q>LbxbNkl=EDb%|bITM_0Z?g}+b&;loa(GE z!^J!<-U3`J;UQdEB)e)?k(je}Q9Wr>fpbQ7SzJ-{WJR2WJZLkkC+@dV`v82_zT8`o zpbcrCm!M9{HuES6dP)$k-3+iC0ku;S{4It(#C&UKyc@c?+Qpf!I|s?hY0FKa9%|M(<3C+bua_2CU}%S^84fgohYNk(1p1VOT>VefGrz~rZzl!XVI7$GtuO8p=Q03FxO)u+Uru~em^CV-a->5 z$aU7*Z|ljw`H>Lb1+wp;{zi_cbK;zX<$aT4uI|5Q@5guuaEI^{as~0Xu&<^XtfPVz zw)-HzNfppSx*&ZQaf)YB(!uc7gH4j~7y3;h;K<0uY(hsvoHQU=aIj*AAbswJXzOggOf0weLgmGvUD3m=hq|}PH zX@sCgz$+k_Gr@I3juM!WiR4=QHRzJ7yP#Pr_a5|x*ew)d>V{JjwEDv#?Z8Wu6DcU1 zUMozpvn%b{a!jT$WfC3af6Ia{X{#kOHb9zdTK1f0g24-?h>6+A{^+ukbB;8iNd;+6 z*L6AckffV@`n&p4P-b&duJbEtq_sCh=a~S+7>Cn2s^=6xQ3!n=73Nq)% zt5uw&XVMr+4{+W#e2!-lbNtqyPQFH+xKJxfQmq2j3o+3wzh?|`;6iFIcuDB_*WtLt zV9lJrGcZ0n18rvPZj|G`B3Zt)fIrZlzxYrU=vvB7{9hqcMk~S+;&>)<*V&ZwaO_W@QCX+iI1gvk4Jpb?4;S%V00J;3Vl_xQfCL88PHFS&Eln%Yl z(Ga6$sIOMH16*&6-6?aEiKV>@X@w-e>E}I7{8r(T+MT-Mbh@MMaAm$*_@0jW=l%;0 z45Ip@%V?l{J_|NpV&iTWx2QO^eFV+7SPhyzobBxr%-aRh0EPsh+)auf?Q^xT zGE8c8;1df)f&xjQk|`%ejAbi5-TlgjZkrLKc<1KrwIP$jNy)tiM+lW&f)4naVLTEO z&N=-M!i=_XpQr@5DN#yb0Qw7iJ4t5L{e(8ss+?AFeG4q^ZN~8gmdYOdG%Kz*2Q>VY zWLY0=_I#0=Q8+<#MVu*T>q9>k0r+m@`Y4Je1Mim$YJDn|r*Hk|SnU|)cQ#j!^8R1O z66ROK%OJz}^v{s*2?=z&J0tU6Zxp00^_L_P!Sl_zt%9wgCxCLc;DMbAI~}s}fH~eD z<@0I}rPR)IROBzd!!pHJ?qYnq;bPd>u75jUYOCp2T9UD8g(U2q{Je1dBl8~n`gJHc zS3+%gbpf{|><6HC=Sfe`8#CB|;57^6AsiPDivI3X}fuRV>%6P2b601*?xxltcO^}6^NE_Z_nw`>N z*)SBsA189aO=m=Z;fO--f`1)o(?vz(E?!?oLKSbW++L#_Y5+Jf_6at!l7DaFefu69 z%k}WZlV>ObudEf9UtCHljL87fNgzG&D#|AVYnn!6^V@hjMFRVU zf}oniV<++Q-Bn+6ut6V_L-#J%`akxICQ)7Vu)#2a%q;k1Rci|$O7L^X2EUU4JYup# zWB)P0j|@Y-Xk*An4NhWZYi%D9D5Q?1Me4L!ivU>aGlq-TbRmp&z&5Q=WkxS3L`xYJ zn2KxX_IvqbXMBQ$@!(1CulotK!uC5`64O+2zsBYBH z7>J(et!l^zolRZA*i%01-6X1$gf6qYW9^3C$Hd!7bITIr2w?MT{!=xmm%l5L zq%h6c)p780QQsx|=7xo)b&>ezgk45}$1K9LWNNCwiwQPhH5QV5$#}qwLNpc_ZBq8< zT5&Bg)dyB9jHb1WBG|HtpEXhNJCy?ll?Jr9oy1+({kE{fh3YjrJ>0?{sU2hMmh1cith4bAz23r(# zkA19E{i{}A*i1QA8>eg~Rn8gRz;HSTd!jEO$FnFpB}2K(3%m9 z^{iI97pM5sYYGNy%vkY_T&j!As*4hSX5G*1uwXP^?vuC)#o_2qdda=*`w)!ccZ_&B zZ3X!@|6EZ=$`Ac+G?Kv9BI5PW73rWGaC~N0eoo0WUJl+l^$yR>;XC!H9B?xLcl?JRMui$h6SJ#mjb8l4xH#Q*%w2_+^ZvOm#r>6V$^;j zh!M?>dUrmZ1-kHaZLp9w*bbgeSgny0H(=3?k#Ik%p>IxRsQ!>Uc(Zhi$7wd|1#4dY zDil{Z_Qd$CEe&f%Ea2P)Q@*PA3knE#%!H?!+r={?B&)y-~PT1lo3jmfz~Eyyfm<|=KL4mODgWL zatcc|m%SGJpx|~W!<3_?A`ogNi7k=3YeJ(O0Q2IXckY}wuR->ezIGU`J|8Pj8@|qF z4?ptNK%+Zrn2W%f7le8pE}Qq%AnMa>HTOF(tlm=tvcxfvX_cT<{Tsx~93*U&X^v15qJMzK`IQL6=_!FYz&>q|Xc8cnKkFn1hztGGMRPfv?fSc+%VEv4I zJCEEGe*nmBS-U71;iWW=m1PWjJe?Sj(FnV2R;M1msikQY{c6|hGM95u?~_bu8HrUX zq8AAf##KA=@qo>sqWxA1@OBb+6t_L;ZSPU~yh3R|$xZtYjWge~17{z~l&JV;{$Y4O z8qtnSo+T(#>vI2~K1KK=wyuOaN>6N!C6H`yMAHCm3wnPo5R6w!`&Vu+&zICfFns{f zGQFBEvhMFVhbHBLYl~-TuB8t*P085$f+i#;o(Q>J{hL;fD;T0B6pwdS)a&FtR9m%C zduwNP1XxSEcN{sq(3^tsX=0sz#@=&uqN8XcOAB1>;^4>_w6%Q}o{z(;HbsTD3X5)=auH z#nxYbqTcr2LHFz+?(X>Tugnjb8UjMhihQ)UWqSILGVu80Uug?lt3AobjglaOg;2=V zcBQ$b2SY&baPTx?g~#=O0t4fwuI>yTFAa=x0a(+W{=g~pk#k$zaeg+YwL)vl!MzS5 z=nCE;un1MLth4#QZxLM}WZLQ50P8|N+pouSYp4r!0x2#_>M}xc#TL6MMw8|s{L@NE z-BNdzER{#cnw)9zTd?yr5s{_}4J$#PY?j;RW#phn|R5 z5J0L02SC%xBpR|%s>-f~dtSI)*3du(a?dsNkk((la!bKTDblYGk>-s0yBE;iFZ?FNT`WDxWpWvz3zZ9|?C&(qp6 zbcZC`-Z%m)8&UxDhT~;DF zWqny1$77*RoP)pNd@Kj01mYxG2@cQ)cun7_kXp$r~-9`P>Zs_Otp z;s!g#V;A`LXfamnqLYl73z!Ts578d5rseG*MS0g~3_<;PN zEgYpK0F(GN?!{oEuEIeQIJL3~ruTh&gQb#yYiI?m!UZ8WpQQlCR1$go68DdZ_-RlcwMVLb+eBGT8*W&gz z^bEY>8*~(c%Xl}|B4h>q6DZ79Cl)du>kGM#*J7U&s30&eIZYd)q@Hl>{arp6FBFo; zFbnIVFro^WI&-}{zw0KJQLZ#?euyG?24k5)C^dzK}mQZVBNTb4aRHA}3A~L}Y zpqBMo#^o|(Ul4jKGLw*nVpibdD<}*5^uw{>DG}{DigzrWmrvUc>lYXLmGWQ^SdbJl zYYEycEF^tvQIQoOWluY`fJgQLBP~Qq+D#2FN{iNU^b4jdG=n@qHC(A|H=e=*RX_4G z|Dt4^?ao_=mCvK>iDm`P7cgZhAja5sFW72aM03LM|Dla@X9)(WCt~$MoC4OeM*PJNY9HxSwj0h6=@r=ol zj%Ww>VxX|69hvLmQHJbBbz^_!Kf=o`_kZbxu=UnJaJhQnY}aoAzNX8{-|C997~qb3 zp0X(wz0oSwevulT;R-LtAEq^O<`P~x#=E*5U0@uE6PMlNGo)Jk8#xKp8#K6r511VH z72R(h+j1Bra^f%L<5s9V;gox!3SXp*rnPVBTNO@M;`zr7c!W)JX^&seWNIVpBx7EAwLo5|JF9n77WuymBR8Mx-X*z@=P)(uKt!Bd!FWd46`&A88 zbRK>nl49;3xLYd!a{m=;RHz_NrwSJ=?qHjj=jq7-$C-i8zYoVE%^Ffl*5g{hT(f*( zK3UfR{1wk|A(?C-!X{U7xo3iEG(mx@85-WH!l?lrjWk?2mdnuil3}~SUPVZP!DA2Z z)FNDP=uoA8>=7U$-HEhl2?*aM#SajDHf3({gO_z$T|F>fJbB!FZMG->s*czT2jA>e zY)X#I%Byh{TheLnWwDk>FRVj}F#KBgL*D|ETh=k!Eji>@x^V z2!q;&(R#k=1${N|&p51NqR6?TEoI~O-KN?ReqGX(yMr@&f_*$brlV?~)j?%!Aozd^ z?zN^x469|rwJ6^ra3<%zA~M{24=fw0EmEeo%q2|AmwmOBI(Pap`Y%vU1YB+;m)~M< z{<}dXRL5^sY6kwtnw1hp0HkFU4?%4G?#+(<1k*;@r^@?dx?obpQh~*4fZV>XIn`mX z6+ZG5TH}^E-=sA0sZzQEr5r7;nxwS~2FGE!e5}HTahU&4b(LEuHUb5k9R1crR$}B~ zrR{;g-ER3Ape|oXLHjp0{ub@GR?hRFQQj=8d}>Lyn+=ynx${!Xx<#}U14dF7ehR>% z_n&kL18#_Y0;e_D!2>bknm>3IS;Q`YM!8dLVM$SfZnTlrE4MN0FmaYEVn-qLAiFt zQPFE+*XVg5vmhdCTbSx~r5g**3Y$pZ<^)BEhVH730!Q0&Hx;Fa=bA?a|#p9 z91=v8_P{$CKE+|XlI5vq@ES)PF*i^E?7992;sNg%9r znAKMU2{;ErItXAuGwPGoB0~o?MA@6v5;Dmn^Sq?XDNDnn($;;WvYDC6l~a-el-}v@ zDy=&%N~N0EPCTCGl_yk>@=vRoi}kTo^FmA`>I|$zD~wzY8?->8n=JY|95YeGnn*^V z9Ey~bnnkXW>00ii$_}-QS+Gi;LZ?H9#xa9=W1wU?iOsa-tvsuIIJqN>d8MGI-VSER z-~kJe>xF?~{#*jT&@k6@dZj(=iMd0(v4_d*HWIpJq9qn2F!nU|giu84?eZB`mJ2Hr z?i)M=iw4k%xMW$D0x4fq6@H05ycAX^Be&z^G2AanD6izU003K@iR5mdkaIPFRxd1XST zcW4R6^~wu(n^zYBC<=x;S{6XgjbG?sG^Js8XgUrXwi9&><<<}(2fIil) z42RY-nE4F|oG{c6vq6$eEq`v#{#uP*jt8M|r$lm}2lGi5i%NgLOxvPWAiCY_6Ml64 z;-+^YFdxJy&5p@=`wN-Fn(}3j63HGX4i^ypf=b0ri6Qz8yB)DK&K(B z2?u~DI*8X*{@OCI?=&_ZKzGA zSO}nz$OMv#FWQ7)9u&-rR@rhuDfSBIw={)|KW<`_iU@mY*P?5a?&lOZII5e ztRRm#+bNFQyi$Ss!hH6?#*}D|E8J!xSx17%_6&?T*GC!ilG|^v%ApmD{bykfM`8vE zYw+J|#rSLT#KS&7>wMprub@*?)drYCE0SRTQMcMud6TrY;Skz%$VmU2I~SXSh6f#9 hv``2X9#sXz7q^Z%y*N&8XobL+qSf9HQB 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 literal 0 HcmV?d00001 diff --git a/docs/source/_static/visual_materials/WoodOak.webp b/docs/source/_static/visual_materials/WoodOak.webp new file mode 100644 index 0000000000000000000000000000000000000000..60f109022a099788812c3878bc141a61ab0fe202 GIT binary patch literal 17562 zcmV)MK)AnBNk&GJL;wI+MM6+kP&golL;wKL!2z8CDu4oj0zN4eh(jTvArk7uj2Hrh zv$t+(TvzW$LH|CFuGDVX%lGw|;5poOY~l~<4AHoY=l_=QVL9$Ce!bIx<_)QwudzCM zM=oFW;r?WMO>*CXA29q6`9F2<;`f8qeoY=@`)}#5-0zJ3l|R9L+5Uh16aP{FtLx9y zul}F-zOKJh|6)DQKk@$Qd*uF!=yiAM|A(>v@h|XS`#q^YH9j$abbUE9iNE=G zx&Kf9*ZnU%{qFx){4Y*RIWhCjul-(e{@ec#Fns9dJ&7MhciuO#UvWm3G7u7@aDQzu z>}^Ki{@P*K+Ks{ew8OEr8-x34hhu6t2lmqr#?)>P?WP@#sN5ghOgkGaB}-P*2*5w3}4z%n&G9$|0aB%&;VwX2G)FIvG^0dLu`0cKRrk)rIo zQt7R2RE>xs9@L^coK;fKMg*6%Ga0J!jAG?l2Y$nnN0jVb4#j}jZxZp`txt^BiocMW zXVJvsJ5)jSB}X(iMfpo;Aju+VvVfWXtv|-;zhCD%APAp5 zoc@3tPDxW%p&qfm;>4}obMT!BKxfnIZQhkecOa!n;iOnUl9DK2qGaMsmNniC?Oj~w z0c3Pyv+^V7%3u_V2`Dh%@{o5#HA%f`dQS=J$^Xr%9KIYg%8DO(nWT^2^IBbM*E*(1 zLwN_8cu;rQZv0>W$Z9ZxchId1Oi*I+zusA~+*c*sm10FN+AyTrRBRlCpUoM9WPy6W z^@85cZ63tWsh~M)2b8KGH$S9rq5H81msjh=a`}7C^eoWFU2V`ymrTp}Aji4Ka@{vP zh-|M3SmQmVwNR}b!w*qeR5-T0I!~c_G|1i$_6GS4D({lVTgjmZFQ;vY-}+Dl*vAWh zL(UTim&eHd5}Grf`OPG0kCs$jeqQs|H}X&DbL&=Kszm3E$A-nyYfGNl2e3ic3ruqs zb25>b6GBD>9l!+7Ighz709(h|6{$!rkU&8GpEM&Uhz9nd9S(70Rw45=qeB z93$77_l5-H@Om4U!f+|mi|DWzjN7Cp(XzM=phawR-%B zu{)BBKE;fbkDPFusHbmWGpT?{2-YlCj}AW_ zyzq#CFt%QVR;n5N*$`y8Bd&PZ@D$l%%zNyV9WyDG=KDfKBfY-aTi#|ArUo0C`$3nI zix{l4Q6#R6BYNkC%qCV$GCKiDj8&aJ93M$lV8e!QJ|ioVHQoLgiEn|H$dJCzdNm?d zd!k424-uArys*bDLHYFcY;&-R>b8;af-0>bA7>oLtx$YTO(Um@u_lY2oOX55 zCzRVTWO*0QO5`k-nvLVp`h86WT!2bm0A*&Y9{!d>CW?QqZ%H(cE&POM=?vcgVX9!# zU!#}*s75X-11jb3QsV!H6<<8mQzR6*=*Oj?Hw#gL#Wf5&zx-1BC%f`=0rcX8hBtu{ zhPxQ(;@?t(9qv>Iil2oio23RE9E=X|kJU{UT(9JFm@r0zC!a{Gu)H*2~y$Q?9qep{H&Hv zpG2v)oFtrLag!HbLKBy`@?jDC!3A@Ekv%9(I>ob~T}oiPow> z#ReCbKZjV=aSovDjNDO0PE9Whg$8X1n+Hi(RZI!sm!PWLt&9LGO zHv!5tCI5ur%SNc5uT_szjW-m{bCs%;&kftisKdl)L!WYSu7Br1i{(=Gl+Kt02DR#a zR;sfCaj~G$udRm_XzUl~}XqQDygI$!vGLdZa+KsPv9 zbnt!j-14X7uVX8Mm(K_DlnOPDhv%?yazbbUVT>Q`g~Ly1GQ%r%i59wYs!7!;qwzZ* zFe8B;7hX2x zaFP|wPXF9>AY+(&o^*a{#Q9J|*Yk^y;c3w|Cac?dlx$2{P%MW=6TYlF+F3cZs7sAV!`CO| zMS2AgUbgdX5h)r3uYJIeETe%HjM+XP2b&#V`ZNumU2hV#;c7k@e_Dn1VH%0axE^UB zGom`B_BsYg)TEsU0R;UivS$s^W!@2xC4x-8Jt16^R?3QXKW&Q^HL9J9ae<%RQFfN7 zA-!887iNNwn%8+h)!pZCOxgTff+aNh@)?~B`j9xaIR!tdFcre$ zOMZK96wzR#R^0u6G(rY0vCJEvYEjHn5YlZqebc93ooR6!vMUSy^`;07|B}5EikGLb zA_4aB{u(O*mNt|EZ6+c&W#E{a#K<4{ifWj4C@~AGINiMf^6ss`#u7(=Ym8?awh^l< zDj5&b*P{mFLO6|mVz(eAM!x`L=2w>*rxdutBlIE2M!$MC1xFoe9svoZ*2;z{Q8NTF zdrUh^*O@xk$=1EnwNBnDYjsx)WU45;D{&L7d4{!1yM|no_V=4%7bG8|BMT7=_)@&^ zrL@DbMk&HL$X&)KVv>}i(>dNsDi`)PObICyjQn4QFPQ_4qa&!O_MhR&0mAUp7;q>q z)NA|}F+(6`7ff-mv*hhY;QrdMkV-zW9ijKoXl9XU|0gTsQNiS5s>$nRFaQAl)=Yf4 zfS3bEl0*Oi0000000000000000000003zd3*Z=?k013_Lf63C!c5mMNdsUH4}8y9aek9$ z%!9U+5;@RbO(*Z=V(rOj-2dUv4yvd427}#UR0%J#omXk?WpuT`P~YN9u9O zRQV90o}AH`!sX*RRiAePBZilbb2G0|598dPuEGB!OMvCKFY*cs{;HE>{^76oJ}`CY z57AZYAJrGX;st;AHn7wf*{9lI**&=adYHt9%H+$HSs}Uoyn6lI;H$)hRgoyYMsgZd zV8Dw~PY_O58+ot`h{+A!sW`AMtSKMvc^|!JJazg)>8WLHl8n*5CYZ7+>&+|Kzi~Gz zj~`4=K9bt*UKfeR>0)c9@OJ9iZrS_!0;oQp$`EiH2hb%_e7pq}7kfTEC; zj8wHjA2WA31&tAlW9M~s7xu&fV)@N3_eyLg#p9HK1{Tw^*N-^LPa_jya6BVCjuYVG z{eR?QE<+^4D5TOfUU=3lN@B;n>W+0mtn+4qT|nAxXs?ChLS`%&jKT>o6-N&(Bn|AM zLwq!Ii^+``M5%YTPhtYON!sm8ZrtKB3kU)5KoHfdeUPsO?SG+0~vJwo752 zh4QRB@e1)Dr^KQi{UzY#OxsF|2)hLW5m?7x*t+~TG99&vKi>aOJW&Az)-pzY?8!E29s_+*?I?m}%AC3XmK(?0u!v=GbolRCyqj$1 zI2yDUt|i3cMV+`BmVr9ae2h+i`T@ytRkP^3QQeTtL}X&tF+tN~S1Q0BWwCs;7{7z;r>&scCK(emFQN(kckxIH3zPBfSW8vcK=Q za7xUc2!t}wr$QuoxIB@`jZFxlnz>j(@&Iz(9u9&dosZ+&&ZRjfL}(m(MyQfqE6q@9 z0x&jDKO+{M{b6M}70P#U1)CLLX!eXIZRTkfLN4~XW(`kfH;}WOeSepXtFwvk2L%gC z6r(9L_|Yk9x8w@QiG})SzpH*Uw*4zB*Hzm^&nh|6w0A(HC8OLmYY{HcAl%X zzmq9PjE4W95a&5sKUY z;iq@6?tw@5Ud~-NR4)j2AbP^Ch^>mh{PjJZN47NuFanggM>~>~-vIfC-N-H4WZp%$ zlW~Ft2JrxbQ91|y5w4gXPvT|C*+|v!OKBf-TzdC((b1a$rxY-QE$ev*IK<#lpH$Tf z6XU#?kUwP|`oj31G?du^Ox;TRt+Oh3Shi1sJhdX%B+7asjOo^VdFSzDA8>z?2~E>9 z80%%i_*`80RX6&ftN`N*UL6`X zo&GBHn2wjSKE*1Q;5)*%EbtJTU^d&QX!=xmit1BekBSB_{6a`HQkp0?We-Vz(oP<{ z43{Y!@!TIThLc4n`pcVWu8Wz-EKq>wHhN|D`@?zLRo4ioxR4VuK&)g(A)pbD#0}CQ zkNk5MQOT!1f%O?XsEC$TQ4=UzLsTYTkq_Joy^)^3uH+tBSR3z;H2LllXnR0Hw+)PF zH@Nuu8ITq&Qpw<;h&6c;p4w2BYN+L&nB;zi-dPm?lbXC%Uu|Ok1Bh1{B$Cf}URgko zuhVvGnw^Hz1zYYq9`#$@y3Cl}q?ek^#aa}zQ4EEEbt=T&|0(4_n)1v4XHu5D`zwKf9E7Xq(-Ab+MuVJ}UXtWIeWBtF_s%g5YB?Y+wuuqlVz zB9Wf7la3{O{H`O8PE2Y~ymgZ|RzUV;Iv6A=aQz#Yh|YZ`hH81z;QkbGp<`d*wpNrl zsPW+vK4-29XpDCV-AmLtlI8ji-3a42HJ-=~MDu{9tP3SMt=LgQUrpW=WHaom%3p%kfj-9n*K0p54VXb!{+#EfBj>+vx#h+ zYc>aj5|PcCrMLq%i*{YQWXZ!FQFaf3JB;e_h?%A#%6aeLHubV6olrbh$@7qc?yy(9 z8l!ec79MxGzQ_9GFti+i>5HX-Es$3j_IC$WI%eTlHOc$7Ali~9_Fn!n#(KG3u8}9{tK5_LV#O(bkw1h^>A+ zCEQexab-716igKkkfyNL-q|lq4Y^4-Pe8b!%bBBIUR3&zH(+VV)g0Hn4Zddu?i0qd zs#T;)db4aH@*B^)RtH0r!%}sp#Nn-ArKDKj1(;g_I&@Cx-l#yEP*HMEaW$INj)+@n zKsN?OJBAk9NdK@;ueA0s(I#JDzf8Ktziv{kEMDTd(G* zsT8Kxd@hW{QF2Eud}5^Z7PceqQ`nUTaM)$X(# zt0`QwR#!VQO<`@W9~{0F`aB0HSvk_^7FpEXh(KosN$ZsZ0-@7^^!Eqq;DRyFRWW9k z%`lPPT_%fNfe`q+d)?biTj7oK39dxQCo$3)<>WTgMvTVm>Bn{r<9^=b3|juSz5*z4 z;XF~ErD|9sD6(ZS3MF7=a5h>oZfuG<{~LHgSM48I(TEMI3iV8$xeoa{#S3cLr9WCU zbFiarZne$5mC7esf2&s?<8rh^UHs%mGogAu9F}A)1lnJM&nc#( zKbLsf!K)Rar(F9{nz*B&iq;PEHwWebI=_3kzj|(J#`W18E@7Qs6vddEj_+2%Z@qVe zj+~g~uxv)+!~X2N9f2?5YM4NM3* z?K!7;*t&q>@D$Sg+UWD|`N?CVyOVl&Q2_SSLs1*@p-RU5knmR&U~Zd{Kai=@aEX)Q zOWsdL_kVb@n=8WijLB;s7VUtG5BDR!&vkR;G@pq@j6Y6x@#L^_+>O8SSd10Z{X zdjC=+0)3jioSOD$A3`}%kFm8uc=26*xN&4aozQIa2b~yyG^l|hSMqYmu$l6#c1r5z z%V=^gAojMw6KP`tgkkT({{CE_q_$23W%q!lmC zs$u%myxGJ*vENRnZrd`8zrt_3%@aQaLPz7_2ij9+h&`s$%wQKj8^yXTBbmjs!z0s-Os9bUS@q*ZlB_)KCqV1uPmPy{u=koHiQE7+7? z)I$U&Cd)5V%2Q>q<%;=~nY1PD{Io9x5aOwX34xZRlw4HH!`_E$FwRW6z1@;_(%rxf zl_VG3+EfO%w2?M?xC4=m3oZ`EXnlHU#-6B#_Y@2FfeZo- z>X(esONOK|T98!61)bZgfFQ+klIBTBsMD+rF16IarWPE?mwD+7!2D z?@?8RzzM9nqz@J$CnX^?ufY4BvGmHiZp)~Hmulb}#Re4Z1#>B?EI^0O3d1Ty&p&*U z9$jCUrAJjNI#W9@hdL=G%m%^SN)|5Des0hoM#Y_#I+~*S4Udco146(b(7-;6F#rOk zAmgsGEDN2v+!IxtZ90?zbVJfp1hs-X)vB#!OPDT}pJJZDw(n*z>Am5e&z92bL0?8y zZr$@jK>FVZxEFC;{N{|_&Ax{ODvUD!7o%E^$eGKThCR2sPJ0#r8wz&EtHjmW`SH5@ z7s`U?t<41V8qlzAj$d=(_F%D+@xV~NN#@uouW$!0fNn(T!B&_Lib;XI2s3bg>7rt+ zfFk18R4=S%1qU-jPPQ?T;npui`2A;*^&NE$F-X1StO;A*lH6~XcJT<#)2nJspsu#0OJMNz~438pr2gO_pK{RKc)kQqz_e2h6g2;!^aO9YO%|4_QlG zhmF{fFGq)=XdJ(6?O%qxbT)S7m*M?_TIPx`(%mP=NP5As>M`&`_E6Zt3o=EGFJZcE z4WHps(IVR8gP#+hXAFH9fU0V@V#Hmw`QemRY;C>t=s|Fqk+VL(?g(!#6fyZ(=z`#( z%x;)N`Ts8lNG6-M9-2tD2}>V_r_4rPfNGeqrq00nvpeVVZ|k=sUmzX>vqLnXAwJ znI=*K&RVUgmwnjof|?H|pjk38Q{M#u((0RIe9uvVy;S{mtB{NE>i(+!zJ|dM%si%a zT`s{d5)cE7ON0o7-nx;#jtuR%mTR|y8pxql(V)*RA{O7M)7QNlQ|Cdb3M`OFop4;&fi zM0fG;h8*qdV{xZFPeJc%<~Y-Uv&##c^863#X^6O9HSzH~s;FZmAZnfVEEI0cE~ z>SHZQ(hjg{Xj_ogBIpDxb$j8r|Ii&sjEs)tIh}5)IDgv^cA7fvy(L6Cn*iX7nLh`D zbR|sWe1NT20*(DuQm|p6K=0=cJmX3n>n1blI?<<12fMxEd@UdteT6lR%F(Oq(jH8xWJEX;hHz+F@wS2`V-DUnfPk-;nn`P8)UD8+(Xu1N&UmU8s-Tj z5N!`~mI2vHZs0QH8D)&O{~GvCv*V9{oy!~X{~y^GFZ#;gnf74t=sGz0fbF~N61!7% z9B|+FfK=^_;;WgQv^=3Z$9pmhE=cT~e5kQHL4#uZiErX$wDk+YmX1kzcVDifvEE9P zCMP1ZB=WWlP0pIOCfPw|=$tdR!=xz*Ywxm4PY-wKKLD0nx+UudVn29j2S9YtL#z27uMa&YhyFgMyv%IiABPRDmv#-zaJRb)Pl+WKsmayl% zokl96dfRGJw1A$Nl5OD}Cr)3G6VR;iGLoRZqQ~4hW0)t=*JM0aLkbDOt!PcM?vK+Z zDfKB&$Z%?O)l@8TymhI)3j_+c#o7DW6Cb;p6I$Q)npX3kbRDkuU8ig$o0K?%Ki2oo za^2ZY0>+PIf0s4o+8H~o0XnesRFhR?(evcFSm)sZ>9VrU0OVX5rt#!J0~&g!_09Z& zcsx((_|n`4OWib7;>kp&wnOeIwgt7Z&^J5v7^!SZ?jwhX{BEbp5PF{;k`oY))Asze zB^53|q_94wtgO$(y*Ap0ZG*DmRG_4AwUfF6XLs;p z0ee%wiTtyn)CsMkJ<08l^ON-l0@aV3`Ommg%fcNhFvG!F&o}6!^F{SZ_k#EH0TH$- zuQWc!S-WxUhgMojimhnI(MB72_q86D<8Yx_mGqQ}HH^;=P8Cvb zi6!IS7CUar1)#7}wx?!|5V6`ZWp-%1O9+UI0}i-at24Ta1a8}e#PRbXl}PSx6ZFc`pr1LESU3x6LH+Rrqc=#q!veOJ#)6l10xYE^}r1NZjJ!~gy{y< zCjf6s;}t~PynAs0eu#7a4=*6f2I4J}wnayk_vp`XQmWXP^0n7myHAyzHL zt;jDvVcqC6^Qw!=!FACst?kREAGXw8rl_p9VZM0rk{8lJfL}2IIz+%&=Ukb zq40s2g}J78elg9Z(=s%0tkBn3^-VP9j4Dyhgrr)>i(DBSQ4 z&Iyl#u~FE|vh-9K+L?}|spvObD1~zjsjfXN6;V>$2nlZnxge4P*pBi0-{W2jBS|Xc zkJOTwS8AVzDt!^SH4>i4ujwNpwk_ZNg#A;E&{{i}F9W)2xPETmW(A3kS<+1e^wOpX zU!d2j{93QjN|ByMxbM)kj(Wz{erd!aPHx<*=O|eNjm{x!7Eyd2#-Q1{ z`Ei4pdihYvRXrNoA=oZx9xUlOx!oZ(0TpLvq}DM*z9-9b@dCaPX{R&Z(#hz;uql`^ zH+U_+m}Cpgq!+iVnTbEftVA3#DkxiNkBsS{v`!ymEm$1b`Bh9bIS%Wl*7La>p!;{M z^j*)xEmKIt+Le?)i)pG1bwC9NrE_%pTAkbPS^!};LmTG7h3(r06%;>SokYAGYDJ0n zc%9G1r(L65a!RT*LkYg3%_91x=*DfE9Rhe-BiP^Ny``}7jgV`BOp1=Y5Aj!}J*E5S zk-$8L{2piKB`U%htlhH-}v**1AId(pQsd?_?6#rhJraQsc@7;uR(XiS_BrJ zwq-aT2JHDQ_q5a@9A9^-w z=Dl?xh3RO#y7>pP<7W1MN2pSHFyOn z9TUb>M&85+AM9|YE|^cCvXTc#raB@O=_4(fO%Yk5wNc0dP}N$href#LY_uQA>3;C|`WIFvv0pLvlDa4_3N}0mBwWLdLO<{dn4fORi_>e_>jnLojRBkBO7WOP zSOG(okqoL*wIHlys5YdF`l~=ACY2j#%~|m{kHBeWB$&D<1{d`2zxdH@L_XFHzV1?x zun?f~(rEEd%>bkkyesxYQ6Q2aac~ignqh;t%W)VV4Cg%{zW>X8tg^)_6LJhvBqWUvyJmchk8IiTrz<6vahG1}1;knuhK=66oz-0@2BfRGZ%I;H ztPN2djQt9_*iZbBT6f}_`zWJiu~m-r=QhoVM2W%ROe~7(NR7VKYkR&Ra672PkTQ_|qUkMR);^Py6G?Za*x8duYN z$&of7Y|IqjZgGfa5{=-FbSXN#rt|XBZ8J7$1dGi$!KO2`tCoL)4FhjhXh5-- z-*4)=A86YL=31NP>#n2xPrfSx1+Uy!>~zi%e!N)cxHdfCdx zL#mOYJnXMoe;}AhweF2Y-g#FSVsYDzpLKhOf!uX397Ql=s4DwX?Z~^B!VYhr#uJop z8_qM1Dh>NZl{jV78~b`5{a4QPwmNv=w|T6qS{%ndgYE{VRid>PHy@lLzFv z;$GdPq9X7Wrp&}No;8`G2TAG=fwmHjurhW{v9U1z*2t6zjVSwy@Y6|L=HF!-K?#6} z^S{(_+XjBnH>nK;}u1Pa)4)@5LL>(bxOiCN6^DpF_S zZE8SA*Or{bpKW7AKXpZFzc3IJBASoPuVCqyWm+^(rP3%=CubC<-ZZGcVHb)kFB@}6 zjX!wA*ny$&`+#w%QT|+108bB{1a~}mCF^s*8uCsy+W7|AEvb`9RI- z)^Ujw!q`o{A(Z<3XQ`gDIp244@3YeKLea5KL3vpP?5B%fzlKT;)gV-4n56iy@&bdAp#w5YG%P@{FIQQ*GI4Ma$aB~O_Bh4RfGNq zJT+~!uUvQ)z`(0)#3ba?1qRHAh9^2`Zxly|%6K1EY}8*gNlp=m+s2R;iKsdA^ZfY% z4ZDZ7t2+y726tHc5*ILnki*xgJ|SHu+lA}jcdz8&pb!}ctZg}G>S z4N8?}!QtVhRz@w1*xLNnoHylxh%_Lb7Bpmhj7jKt!DD0)`u=rLK9bZsLy;nx*(SYJ zq9H*HH@BI0Bt28p)&6urLb+$mLz#?*$9YM4*JZ_dTb@1%P(d4s)+`TT63WxS5lTBy zswY}O*7>s+I&loz9Cp7TfS5J;V*k+&o%ZEX1uzhWr{_Fcl9e+A5u%8~mjN|xOITg^ z9z-pmgE>!fF&(%Irr4XiUI<#dP zyCXUrgP*#{KJ_*w;fC}w`dnS9r}0jo&-6O#wEVNHBb%aX&J0v+NW3~RV|WFyFJ0M7 zg_$G4D-bNGty<v{Hyu&6jCU>`p;hK{TdhNFYxz z<$Kib-}yi8-p%J*j<{xPlulxuDZ)ZJih}j52zo+zF6Rm+Uw_kAXjNyb6qZi%>KH(I zJ8;}~Z79($)%A>2Q(wrt)RivcS-}ss_k=`!R17L;;g)B8b{aT4RghrQ7H$~RQDY*> z3~J{~1;-2ARiMSw5F6v;@pl;}uxX1*r+D%a!fF7xOkG~4qC)S4_D%apKGnWd&;g1! zf5-$qfG^JJ9Q1B5*uX|0r!K&93Fz}6Jo9|G-Fa82=r?zlUY93XXdH)aY9r_mnivUH;Ys|@l5inl zROXh1B$l*6o&tPrGtEA;5%BNOA==*>1>)#<-2<#C0Jqb`h=VD8(3Q9U9?CLMBqHfH zEF>nKa+zVsA{p3cFczacePC-G2?61P)8X7qq_@${kU4?quVZCfGEdz(kh2i>JxF!% z`pHEdSemV{r_K0LGE5S8BTEfqD1wk32o|#ASy6RCo_gldQ~5Ch8A>^J)}N!}uwfZg zcT}_MraVC)v1fnf^zs!Xl?3%FhC!E^<@OaC;TnOS-3HG_>}CrPz&w5N0%*s<-fr7G z236Nrz^u@{R4c$W%|DSOZp+eY=V>A@`s&J_-R73;kKx}WXyYnf;EHHeRrQlIEtG^g zlB$1DSujM+S()Z*?@@tbP(Yd}dSErHt$g`4cmRf{wN==*CS9z81s0nK=g~g0ALtKS znP#w=pG_ENg8zaT($!4fwr;e3WuMnCP>3p#6)>j!};B(IDTzHr*YM^ zyCyKmv`XWGgu=3~cl=bJb8VvV{!IgG`by<-{4kjl(*SPdw^+1K>5FZWZ3p zQo9qi&k|xr6zuZ8(4}28a5ZgP@!kW31B2~y$YSO1Z|4;oH%Fw|0PCG7%Q8{0zplli z2N8CIO}T|EbsOtj-7pX((*C5t%6;K;aIin;MpM9J65aIHOS(tRUh$EgTa1W%`^OI} zxv5kjX^fUPltnyetMqvw`X%i%FVRa`nhSzO&=H^*!j>KVSv$?SU0k#-VblhPB9d$( z+_4WTpACwfQrMmtX3B~ma)iIy{k5!^H2CHHjV4J@@_VW2yQv_}0ZOc}y}fAv4)5@!=p zs27H28;kbzWk(AzwH~c+@DO~yE!7zg)ekmgRed?EX@y~rlA!o_PkFgd;SA~cnrILY zf`Lxl{1h$yz)oe+#T}i_nfwa0Qpiq)!UI3-rqTzpTh{w{=CzthQwyJErl6fex{K zmYMK{0yoT9{jZ#Ej_nL=z-&~1S*-s81gK3b zjv9m$V6jSwL$;t$ZvP9(0)PA-mA)C1w!+B{t)%tO;0M0{0O*HOA%fT5qoq!Vz0R#} z^kwYTMZk#{z+wiHvk%ni&f5FSrq%6_CJXlA=Z&@Fe+4dhKlPO~bYGI<%=I|VNn<&$ zzO6A%`JXQRt8J@>oH|!Ay#p{twkQe+8tO{_4lJ6D6KQV_!V{)m8bYp4-L1#WvbzK@ za_H@QXV&rC;p1RF(1OxZDbh}=pOWhfCex6nWC1;@{C~c6k-{BZ;)ztenNvS*TQS#e z8gnSVzvf!&qedz<-Gzz;LtjcS#SQE!1+5roa`18A!{U=cinPx8LM5>K5X)TEqt~z; z5WH3f%@@|c_29>c2jEi0&_$X=8kEuRa;7SlZY;K}3XaQTD3wdxe2dO*Yt1AJiVgom zD2+(2Bn{};ddh5?y1U;KmYup~Ct3Z7Bh>GPGEJJI&KPFjZRG=`p3aBbrcGVSfUoB-UN8JkCLBDJ}@TGsmw(H>EYSH!nq zkDk*bpev{)ko;BbVsn0hYR*bnJ)bA}sI2(mPs&6Tcv-0z}>e4|x5Ni>4 z3p_(@kabDU6MW59JM=3!Y7f?oEQ;rWAK!I3k|`o{AU7~h6UHu%J{s}1{c#2BkTFV| zqkK9on!~i{OOO|*-SU*N)Rn3Zc0Dte4BHq>KET{&&zxg`R%&cJa|j5skMpGNH{*@i z!v7O}(HUB@RJ71!iNM+J&l%X-OdbQ>f&aWEdQpqH6%%+Kw^M&^OXAZGMZSD~PO|PA z&kaM7%ROur18Rgs3EmLEw)Ho=tp!=QlM_)nA$B^+Mp|CKO=NRF?*W6k+uot(XV9Z! zN8`}Grw%Gt@-&6FlGH0&@78wqAlAbhIf&p}QMk3}Rsk6#ays@26mF_oA0t(HPnZxz>xc zEsv9n$1(z@9#ex$e@A16=K!opzv^F8YV&KJ1Yc78kUDaCj+nq_3|g#dm|r4y+)QxQ zK!LBWHTm-izg7y1;T$gCFGzRR-kp0`dz12{CXkY&Ky+191pjYj3?`yf5@=&sL@3mR{Cs&4~U9f16NOI&k* z=39#o+Aw32g%DAFe2l&6Y7oDzY}B`7dOkR9S>2$yYuKWGxjmX{lwn@i<)L_QRr1xG z0W7g81GEmxEYU1-&9chSuvb5L>a1_ZT{D6E29ig+Nb(cg(QC&JrYM5 zSSR3vnk0R<2Zna+KME}}D2I<_<*8A=oP)L3@e%�{~=}aw-yf560XIAi8k<>>jFF za}*8_p*5Ce5kpmjnE4|wrp;%85Yl<*dIk=ceaueQ2H+U(QH}VgYW(4UXxTL8Y8#PO;j)Q20UoN9>+rmh{+$2 zQMPlfb({$a+0T!Goh}p2d#nJJLZGV>Xkl)65PlI6p5?U|A0=%DWjvNy$Sb7Ux$?mL zq@zE|5gs}6ej3Ez(pz7mXr5}j90-7O8Lb;s78DOwS+4ojlT4`sB#0ib9otnvg9);} zq?hUO8hg@ST!8Q^J;RBCZN6haSWRc8?b@kQH)$pka)}xNvb>bSIa@bc4M#gzRa){@ zfRT}?ZNFlIx^TSaMy+NB906jX{j!)ri<@n$Zy4a5nsmXXklfxHrY1s=L~FCQad)Wi zC5UR0>{|;0fT3lVGobowmZ-G+;uW-SAAO$dRPc->z*g=dX7LkB5A;@zI0wh@gE#-2 z=W^FQp=X(>+cRWyF&%7DY5GK)-=@7PHVJmOk5(VqKPZfM|24n~aBk((49vf!j^w%o zr@4h`6Le__={ncTAo#zjMs1a+Ph9OaBEG2{=H6Zlq6b(V=${MmU=oGI$|RxKbl zg>YXkHw~?ftmuq+HVh^em&zzzxcKJRw2aKGZC3$P1g!hi67@ENtjdPq!X$A|83huH zxO`N)ho6L0d75K>L@I96KEf8^)KCUBxoAI|UT>=KQ-V()*ANh0g#sQS%#r8`;!579 zaF)h?AtqLazo*Ns$O{BU`8|0WosL(bfc%`q%qN>{KmtIBl7tJ9URDqJ$G}9f;y3+$ zp}2sH?f#^VrJvK#${+x#4Yr32IPA&if|xWmmG{TmQ@!r@Z>&%Yq|t`aBSys zjZ%3ALPF9FltHdaV632mTVsnR*7Q{`6cksCp0a84LXm6{{e(GaQ1@|ooWgRkq-YGt z`COFn6(aZm5-94~{nf3C7rbxqK=x(1HnIp5r^eCfOE>`g(FPALE$GC@6VBDk+lX?r z;58JctgU#C;SSK-zqyqQ(QrB^%4V*6w)DMzG>4Wfp=jv3L3tYr+Q)_wn)vKqR3SuC ziD5yQb4z_P2|r%(L5$|qnsxOcHuEQSHe!@rU?2%yT6?uJh$Dz-utD{zFIMRmARHN* z49Y2s1JnM-Qi>u!HnvQN1ZTstajDJ-hyhW3l9fOsDN;Qo&;H{&4TcK&5|2&g_zMtr z(zL`6##Noz4vL1|TeXhRtOPR!t;GL`;UP>UAI33~m1$b3wKKGxqU!^a;s639&;SI# z)lL#3n8@zyri0@7QqzuL9>Ahy3I_}O1zPah8syh~OoBkr_K_9lByGMBEsNhnUqi&{ zRX$K_`TS^}*qO7y@b=JZ#tu^R1vwVGtA5wRemMC|Sb|bjXxx(VsVwGz=}Cqi-VeWg zxF=Y!I&;xw=3dg@f;8nPaU!-jWsjtw;2Sdgv-47+O731qsj2`1KrI_En03CU&4~F` z2-c8XJUiPeM+Uj@#EqvKemxtF*m6vgBv-E=R;RYH+?c{=~r4H}F!;^H_K@_Bciuj0zHrfC_!dan7 zMH-3i&wCajk{{9=0RUgfR)GKwk5LKV=+saR6=8#DqA2X+i=JM^Y;>t920~Hm?z&4C zKgC>}7{UQ{c}iz+4V6!Y;Y=62jnR#&&ixs_dtAVQn@B2`yTT+EkutF~1?>iJ>r}nu zeiEtAKuswYoT3z8Wa_|5E008US B`JVs) literal 0 HcmV?d00001 diff --git a/docs/source/_static/visual_materials/advanced-materials.webp b/docs/source/_static/visual_materials/advanced-materials.webp new file mode 100644 index 0000000000000000000000000000000000000000..067adfddb51174f16064887086cc94ae83d0223c GIT binary patch literal 82846 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%0AA$qqAI7SMdZTBXMu0 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

eAIX#(T>p{}+BdbL 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

me-OsiX#gM3n8u73%>wVO@ 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/source/_static/visual_materials/default-materials-rc1.webp b/docs/source/_static/visual_materials/default-materials-rc1.webp deleted file mode 100644 index e5a415e84dc55eb1a713d72149e1b09bb4aec0b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61114 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 zRld$sKmf%NsH4z|h^yGccG*4$XttYdXg~k}000000000000000000000000000000 I0000007Bpr*8l(j diff --git a/docs/source/_static/visual_materials/default-materials.webp b/docs/source/_static/visual_materials/default-materials.webp new file mode 100644 index 0000000000000000000000000000000000000000..4890b7a10a672eac79eba468379d343e4a43e57f GIT binary patch literal 244952 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 z%0D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

v6SqHpj;iGb(rhL^Sw(4N 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 p%o7M1&i)pGCAXuAr;>h?w)vEo5EjAM>XDNG3 literal 0 HcmV?d00001 diff --git a/docs/source/_static/visual_materials/surface-materials.webp b/docs/source/_static/visual_materials/surface-materials.webp new file mode 100644 index 0000000000000000000000000000000000000000..d3e83e73a3daa61e5fdd1358350a5fe7e0849384 GIT binary patch literal 108502 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 g0000000000000000000000000000000000003tJDDF6Tf literal 0 HcmV?d00001 diff --git a/docs/source/api_reference/embodichain/embodichain.lab.sim.material.rst b/docs/source/api_reference/embodichain/embodichain.lab.sim.material.rst index fc0dfa219..d2f5bb7cb 100644 --- a/docs/source/api_reference/embodichain/embodichain.lab.sim.material.rst +++ b/docs/source/api_reference/embodichain/embodichain.lab.sim.material.rst @@ -17,6 +17,11 @@ segmentation masks stay consistent across replicated environments. Default material presets ------------------------ +The 24-preset catalog contains six built-in parameter definitions and 18 +downloadable resources. See the +:doc:`material guide ` for +parameter tables, individual previews and OfflineRT galleries. + Handwritten and asset-based materials use the same configuration type:: from embodichain.data import list_default_materials, get_default_material_info @@ -66,6 +71,10 @@ native manifest and retain the manual material-type policy. ``SteelBrushed`` support ``hybrid``, ``fast-rt`` and ``rt``. ``ChromePolished``, ``GoldPolished``, ``CopperPolished``, ``GlassClear``, ``GlassFrosted``, ``GlassSmoke``, ``SkinHumanLight`` and ``SoapBubble`` require ``rt`` (OfflineRT). +The built-ins ``PlasticMatteBlue``, ``PlasticGlossyRed``, ``GoldMetal`` and +``MirrorMetal`` support all three renderers. ``GlassClearSurface`` and +``GlassFrostedSurface`` require ``rt`` and configure surface transmission without +volume absorption. Advanced parameter variations of a basic preset also require ``rt``; the factory rejects incompatible renderers before downloading or loading assets. NoRender stores declarations without downloading or creating native materials. @@ -79,7 +88,11 @@ including advanced parameters and textures. Repeated creation preserves state. Native shader-model changes after binding are outside this interface's scope; pre-create variants and bind their instances instead. -Catalog queries do not require a World or asset download. The archive is lazy, +Catalog queries do not require a World or asset download. The six built-ins +include native parameter defaults in the wheel and do not request the texture +archive. Their metadata exposes ``source="builtin"`` and +``requires_download=False``. Resource metadata uses ``source="resource"``. +The archive is lazy, revisioned and checksum-verified. Pre-download with ``embodichain data download --name DefaultMaterials``. The current upstream archive is hosted on the DexSim internal resource server. To use a mirror, set diff --git a/docs/source/api_reference/public_api.rst b/docs/source/api_reference/public_api.rst index a729a8cd6..e7e8598af 100644 --- a/docs/source/api_reference/public_api.rst +++ b/docs/source/api_reference/public_api.rst @@ -142,7 +142,9 @@ embodichain.data.default_materials ------------------------------------ The wheel includes catalog metadata so these functions work offline without -asset downloads. Both functions are also available from ``embodichain.data``. +asset downloads. Both functions are also available from ``embodichain.data``. The 24-preset +catalog combines six built-in parameter definitions and 18 downloadable +resources; metadata identifies their source and download requirement. Metadata includes compatible renderer names, source revision, dependencies, auxiliary resources and suggested physical texture dimensions. Dimensions do not change geometry or UVs. diff --git a/docs/source/overview/sim/sim_manager/rendering/index.rst b/docs/source/overview/sim/sim_manager/rendering/index.rst index 38d9eb42f..9a4d39db0 100644 --- a/docs/source/overview/sim/sim_manager/rendering/index.rst +++ b/docs/source/overview/sim/sim_manager/rendering/index.rst @@ -8,6 +8,7 @@ quality, DLSS, and related performance trade-offs. Start with :doc:`configuration` for common ``RenderCfg`` options. Use :doc:`dlss` for NVIDIA DLSS behavior and temporal-rendering settings. +Use :doc:`materials` for default material presets, parameters and OfflineRT galleries. See also -------- @@ -17,3 +18,4 @@ See also configuration.md dlss.md + materials.md diff --git a/docs/source/overview/sim/sim_manager/rendering/materials.md b/docs/source/overview/sim/sim_manager/rendering/materials.md new file mode 100644 index 000000000..f00b3301e --- /dev/null +++ b/docs/source/overview/sim/sim_manager/rendering/materials.md @@ -0,0 +1,293 @@ +# Visual materials and default presets + +EmbodiChain provides **24 public material presets** through one +`VisualMaterialCfg.from_preset()` interface: six built-in parameter presets and +18 downloadable resource presets. A separate `SoapBubbleInterior` auxiliary +material supplies the inward-facing interface for the bubble preview. + +The images below are actual DexSim **0.5.1rc1 OfflineRT** renders. All presets +use the same studio lighting and exposure; a checkerboard and colored cards +make reflection, transmission and roughness visible. Click a material name in +a table to open its individual image. + +## Create and override a material + +Select `RenderCfg(renderer="rt")` for OfflineRT; see {doc}`configuration` for +renderer and denoising options. With an existing simulation manager `sim`: + +```python +from embodichain.lab.sim import VisualMaterialCfg +from embodichain.lab.sim.shapes import SphereCfg + +cfg = VisualMaterialCfg.from_preset("PlasticMatteBlue", uid="blue") +material = sim.create_visual_material(cfg) +shape = SphereCfg(radius=0.25, visual_material=cfg) + +# Create another variant before binding it to geometry. +glossy_cfg = cfg.replace(uid="blue_glossy", roughness=0.08) +glossy_material = sim.create_visual_material(glossy_cfg) +``` + +Unspecified fields remain `None` and inherit their preset values. Explicit zero +and false values override the preset. `cfg.replace(roughness=None)` restores +inheritance. Common fields stay flat; advanced native parameters belong in +`parameters`: + +```python +glass = VisualMaterialCfg.from_preset( + "GlassClear", ior=1.6, + parameters={"volume_attenuation_distance": 8.0}, +) +``` + +Presets select scattering through native material parameters. Keep variants +pre-created and rebind their instances when changing appearance. The manual +`material_type` interface remains available for handwritten configurations. +See the {doc}`material API ` +for UID sharing, validation, copy/replace, reset and lifecycle rules. + +## Built-in parameter presets + +These six definitions are included in the wheel and **do not download the +`DefaultMaterials` texture archive**. They contain no texture maps. The simulator +initialization and its common scene resources follow their usual setup. + +![Built-in parameter presets rendered with OfflineRT](../../../../_static/visual_materials/builtin-materials.webp) + +| Preset | Base color RGBA | Metallic | Roughness | Transmission | IOR | Renderers | +| --- | --- | ---: | ---: | ---: | ---: | --- | +| [PlasticMatteBlue](../../../../_static/visual_materials/PlasticMatteBlue.webp) | `[0.05, 0.22, 0.6, 1]` | 0 | 0.65 | 0 | 1.5 | Hybrid / FastRT / OfflineRT | +| [PlasticGlossyRed](../../../../_static/visual_materials/PlasticGlossyRed.webp) | `[0.55, 0.025, 0.025, 1]` | 0 | 0.08 | 0 | 1.5 | Hybrid / FastRT / OfflineRT | +| [GoldMetal](../../../../_static/visual_materials/GoldMetal.webp) | `[0.95, 0.76, 0.32, 1]` | 1 | 0.22 | 0 | 1.5 | Hybrid / FastRT / OfflineRT | +| [MirrorMetal](../../../../_static/visual_materials/MirrorMetal.webp) | `[0.95, 0.95, 0.95, 1]` | 1 | 0 | 0 | 1.5 | Hybrid / FastRT / OfflineRT | +| [GlassClearSurface](../../../../_static/visual_materials/GlassClearSurface.webp) | `[1, 1, 1, 1]` | 0 | 0 | 1 | 1.5 | OfflineRT | +| [GlassFrostedSurface](../../../../_static/visual_materials/GlassFrostedSurface.webp) | `[1, 1, 1, 1]` | 0 | 0.28 | 1 | 1.5 | OfflineRT | + +All six use `emissive=[0, 0, 0]` and `emission_intensity=1`. The two surface-glass +presets explicitly use `thin_walled=true` and configure no volume absorption. +Their supported factory backend is OfflineRT. + +Choose `GlassClearSurface` or `GlassFrostedSurface` for simple surface transport. +Choose the resource `GlassClear`, `GlassFrosted` or `GlassSmoke` when a closed +object needs authored volume absorption and texture detail. These are separate +material definitions with different optical parameters. + +## Resource presets + +The resource collection keeps its native texture maps and material manifests. +It is downloaded lazily through `DefaultMaterials`, with a revision-specific +cache, archive/member integrity checks and the existing download lock. + +### Basic texture materials + +![Basic resource materials rendered with OfflineRT](../../../../_static/visual_materials/surface-materials.webp) + +All ten support **Hybrid, FastRT and OfflineRT**. Each uses 1024×1024 color, +roughness, metallic, ambient-occlusion and OpenGL normal maps. Their legacy +directories declare no scalar material manifest, so those fields retain the +native DexSim defaults. The factory does not substitute handwritten-config +defaults. Suggested dimensions describe a texture repeat; they do not resize +geometry or change UVs. + +| Preset | Appearance | Suggested texture dimensions, m | +| --- | --- | --- | +| [BrickRed](../../../../_static/visual_materials/BrickRed.webp) | Red fired brick with gray mortar | 1.2 × 0.84 | +| [WoodOak](../../../../_static/visual_materials/WoodOak.webp) | Warm oak wood grain | 0.8 × 0.8 | +| [CeramicTileWhite](../../../../_static/visual_materials/CeramicTileWhite.webp) | White glazed ceramic tiles with gray grout | 1 × 1 | +| [MarbleWhite](../../../../_static/visual_materials/MarbleWhite.webp) | Polished white marble with gray veins | 1.5 × 1.5 | +| [AsphaltDark](../../../../_static/visual_materials/AsphaltDark.webp) | Dark asphalt with fine aggregate | 2 × 2 | +| [FabricGray](../../../../_static/visual_materials/FabricGray.webp) | Fine woven gray fabric | 0.25 × 0.25 | +| [LeatherBrown](../../../../_static/visual_materials/LeatherBrown.webp) | Brown grained leather | 0.35 × 0.35 | +| [PlasticABSBlack](../../../../_static/visual_materials/PlasticABSBlack.webp) | Black ABS plastic with a subtle orange-peel finish | 0.25 × 0.25 | +| [RubberBlack](../../../../_static/visual_materials/RubberBlack.webp) | Rough black rubber | 0.25 × 0.25 | +| [SteelBrushed](../../../../_static/visual_materials/SteelBrushed.webp) | Directional brushed steel | 0.5 × 0.5 | + +### Advanced resource materials + +![Advanced resource materials rendered with OfflineRT](../../../../_static/visual_materials/advanced-materials.webp) + +These eight presets require **OfflineRT**. Incompatible renderers fail before +asset download or native material loading. Advanced parameter variations of +basic presets also require OfflineRT. + +| Preset | Appearance | Important authored parameters | +| --- | --- | --- | +| [ChromePolished](../../../../_static/visual_materials/ChromePolished.webp) | Highly reflective polished chrome | metallic 1; anisotropy 0.16 | +| [GoldPolished](../../../../_static/visual_materials/GoldPolished.webp) | Polished gold | metallic 1; anisotropy 0.10 | +| [CopperPolished](../../../../_static/visual_materials/CopperPolished.webp) | Polished copper | metallic 1; anisotropy 0.12 | +| [GlassClear](../../../../_static/visual_materials/GlassClear.webp) | Clear solid glass with weak volume absorption | IOR 1.52; transmission 1; attenuation distance 15 | +| [GlassFrosted](../../../../_static/visual_materials/GlassFrosted.webp) | Rough transmitting frosted glass | IOR 1.50; transmission 0.94; attenuation distance 2.5 | +| [GlassSmoke](../../../../_static/visual_materials/GlassSmoke.webp) | Gray-blue absorbing smoke glass | IOR 1.52; transmission 0.98; attenuation distance 0.45 | +| [SkinHumanLight](../../../../_static/visual_materials/SkinHumanLight.webp) | Light human skin with pores and approximate diffuse transmission | IOR 1.4; specular 0.48; diffuse transmission 0.16 | +| [SoapBubble](../../../../_static/visual_materials/SoapBubble.webp) | Soap film with spatially varying iridescence | IOR 1.33; film thickness 250–520 nm; iridescence factor 1 | + +With texture maps, `base_color`, `metallic` and `roughness` are factors. A +`roughness` factor of 1 preserves the roughness map distribution. Gold and +copper coloration comes from their color textures. + +### Full advanced parameter definitions + +The following are the resource manifests' explicit native parameters. Unlisted +fields inherit native defaults. The native `emission_intensity` key corresponds +with the flat configuration field `emissive_intensity`. + +```yaml +ChromePolished: + base_color: [1.0, 1.0, 1.0, 1.0] + metallic: 1.0 + roughness: 1.0 + specular_strength: 1.0 + anisotropy_strength: 0.16 + anisotropy_rotation: 0.0 + double_sided: false +GoldPolished: + base_color: [1.0, 1.0, 1.0, 1.0] + metallic: 1.0 + roughness: 1.0 + specular_strength: 1.0 + anisotropy_strength: 0.1 + anisotropy_rotation: 0.0 + double_sided: false +CopperPolished: + base_color: [1.0, 1.0, 1.0, 1.0] + metallic: 1.0 + roughness: 1.0 + specular_strength: 1.0 + anisotropy_strength: 0.12 + anisotropy_rotation: 0.0 + double_sided: false +GlassClear: + base_color: [1.0, 1.0, 1.0, 1.0] + metallic: 0.0 + roughness: 1.0 + ior: 1.52 + transmission: 1.0 + specular_strength: 1.0 + volume_thickness: 1.0 + volume_attenuation_color: [0.995, 0.998, 1.0] + volume_attenuation_distance: 15.0 + thin_walled: false + double_sided: false +GlassFrosted: + base_color: [1.0, 1.0, 1.0, 1.0] + metallic: 0.0 + roughness: 1.0 + ior: 1.5 + transmission: 0.94 + specular_strength: 1.0 + volume_thickness: 1.0 + volume_attenuation_color: [0.86, 0.94, 0.97] + volume_attenuation_distance: 2.5 + thin_walled: false + double_sided: false +GlassSmoke: + base_color: [1.0, 1.0, 1.0, 1.0] + metallic: 0.0 + roughness: 1.0 + ior: 1.52 + transmission: 0.98 + specular_strength: 1.0 + volume_thickness: 1.0 + volume_attenuation_color: [0.44, 0.53, 0.64] + volume_attenuation_distance: 0.45 + thin_walled: false + double_sided: false +SkinHumanLight: + base_color: [1.0, 1.0, 1.0, 1.0] + metallic: 0.0 + roughness: 1.0 + ior: 1.4 + specular_color: [1.0, 0.96, 0.92] + specular_strength: 0.48 + sheen_color: [0.14, 0.035, 0.022] + sheen_roughness: 0.58 + clearcoat: 0.1 + clearcoat_roughness: 0.3 + diffuse_transmission_color: [1.0, 0.24, 0.14] + diffuse_transmission_strength: 0.16 + double_sided: false +SoapBubble: + base_color: [1.0, 1.0, 1.0, 1.0] + metallic: 0.0 + roughness: 0.075 + ior: 1.33 + transmission: 1.0 + specular_strength: 1.0 + emissive: [1.0, 1.0, 1.0] + emission_intensity: 0.32 + volume_thickness: 1.0 + volume_attenuation_color: [0.9, 0.85, 0.84] + volume_attenuation_distance: 3.0 + iridescence_factor: 1.0 + iridescence_ior: 1.75 + iridescence_reflection_boost: 2.6 + iridescence_min_reflection: 0.045 + iridescence_thickness: [250.0, 520.0] + thin_walled: false + double_sided: false +``` + +### Bubble and skin geometry + +`SoapBubble` binds color, AO, metallic, iridescence-thickness and emissive maps. +The explicit auxiliary `SoapBubbleInterior` reuses the outer resource's color, +AO, metallic and normal maps. It has roughness 0.035, transmission 1, IOR 1.33, +zero emission and zero iridescence factor. Its attenuation color is +`[0.90, 0.85, 0.84]`, attenuation distance is 3, and volume thickness is 1. +Both interfaces use `thin_walled=false` and `double_sided=false`. The preview +creates a smaller inward-facing inner shell; the factory only creates materials. + +`SkinHumanLight` approximates skin using texture detail, specular reflection, +sheen, clearcoat and diffuse transmission. It does not implement random-walk +subsurface scattering. The portrait preview uses an optional caller-provided +segmented `SkinFaceDemo` GLB; that mesh is not included in the material archive. +Without `--model`, the example renders the same skin material on a sphere. + +## Query, cache and reproduce + +```python +from embodichain.data import list_default_materials, get_default_material_info + +names = list_default_materials() # 24 public presets, no World or download +info = get_default_material_info("PlasticMatteBlue") +assert info["source"] == "builtin" +assert info["requires_download"] is False +print(info["parameters"]) +``` + +`SoapBubbleInterior` is available by name but omitted from the public list. +Built-ins have no texture resolution or nominal texture size. Resource metadata +contains dimensions, compatible renderers, dependencies and the pinned resource +revision. Both sources share the same runtime/Spawn resolver and UID rules. +NoRender retains declarations without downloading or loading native materials. + +```bash +# Offline catalog query. +python examples/sim/rendering/default_materials.py --list + +# Only the six built-in parameter materials. +python examples/sim/rendering/default_materials.py \ + --all --source builtin --renderer rt --compare-native --size 640 --frames 6 --spp 12 --gallery + +# All 24 presets; add --model /path/to/skin_face.glb for the portrait sample. +python examples/sim/rendering/default_materials.py \ + --all --renderer rt --compare-native --size 640 --frames 6 --spp 12 --gallery + +# Pre-download the 18 resource presets and the bubble helper. +embodichain data download --name DefaultMaterials +``` + +The preview saves lossless `*_preset.png`, `*_native.png` and +`*_native_repeat.png` images plus `results.json`. Direct-native comparisons use +the original resource directory or the built-in native parameter definition, +with the same geometry, camera, exposure and lights. Material parameter readback +and center-crop image differences are checked against a native-repeat control. +The documentation images are compressed WebP exports of the preset captures. + +The resource archive is currently hosted on the DexSim internal resource server. +To use a mirror, set `EMBODICHAIN_DOWNLOAD_PREFIX` before importing EmbodiChain +and provide the identical archive at +`materials/default-materials/ec9f748242c50b85/offlinert_materials.zip` beneath +your prefix. Built-in parameter definitions remain available in the wheel. +The resource revision, file digests and upstream attribution are recorded in +`embodichain/data/default_materials.json`. diff --git a/embodichain/data/assets/materials.py b/embodichain/data/assets/materials.py index 1c94e072c..80dad36a7 100644 --- a/embodichain/data/assets/materials.py +++ b/embodichain/data/assets/materials.py @@ -133,12 +133,21 @@ def get_material_path(self, name: str) -> str: """Get an authored preset directory in this verified resource revision. Args: - name: Public preset name or ``SoapBubbleInterior``. + name: Downloadable resource preset or ``SoapBubbleInterior``. Returns: Absolute path suitable for DexSim's native material loader. + + Raises: + ValueError: The name is unknown or denotes a built-in parameter + preset, which has no directory in this archive. """ - get_default_material_info(name) + info = get_default_material_info(name) + if not info["requires_download"]: + raise ValueError( + f"{name!r} is a built-in parameter preset with no resource directory; " + "use VisualMaterialCfg.from_preset()." + ) return str(Path(self.extract_dir) / "Material" / name) diff --git a/embodichain/data/default_materials.json b/embodichain/data/default_materials.json index 209fc6acb..eee19ffd3 100644 --- a/embodichain/data/default_materials.json +++ b/embodichain/data/default_materials.json @@ -359,6 +359,214 @@ "auxiliary": true, "geometry_notes": "Bind to a separately authored inward-facing inner shell.", "auxiliary_resources": [] + }, + { + "name": "PlasticMatteBlue", + "category": "polymer", + "description": "Matte blue plastic", + "source": "builtin", + "revision": "builtin-v1", + "parameters": { + "base_color": [ + 0.05, + 0.22, + 0.6, + 1 + ], + "metallic": 0.0, + "roughness": 0.65, + "ior": 1.5, + "transmission": 0.0, + "emissive": [ + 0, + 0, + 0 + ], + "emission_intensity": 1.0 + }, + "renderers": [ + "hybrid", + "fast-rt", + "rt" + ], + "nominal_size_m": null, + "dependencies": [], + "auxiliary": false, + "auxiliary_resources": [], + "geometry_notes": "" + }, + { + "name": "PlasticGlossyRed", + "category": "polymer", + "description": "Glossy red plastic", + "source": "builtin", + "revision": "builtin-v1", + "parameters": { + "base_color": [ + 0.55, + 0.025, + 0.025, + 1 + ], + "metallic": 0.0, + "roughness": 0.08, + "ior": 1.5, + "transmission": 0.0, + "emissive": [ + 0, + 0, + 0 + ], + "emission_intensity": 1.0 + }, + "renderers": [ + "hybrid", + "fast-rt", + "rt" + ], + "nominal_size_m": null, + "dependencies": [], + "auxiliary": false, + "auxiliary_resources": [], + "geometry_notes": "" + }, + { + "name": "GoldMetal", + "category": "metal", + "description": "Gold-colored metal", + "source": "builtin", + "revision": "builtin-v1", + "parameters": { + "base_color": [ + 0.95, + 0.76, + 0.32, + 1 + ], + "metallic": 1.0, + "roughness": 0.22, + "ior": 1.5, + "transmission": 0.0, + "emissive": [ + 0, + 0, + 0 + ], + "emission_intensity": 1.0 + }, + "renderers": [ + "hybrid", + "fast-rt", + "rt" + ], + "nominal_size_m": null, + "dependencies": [], + "auxiliary": false, + "auxiliary_resources": [], + "geometry_notes": "" + }, + { + "name": "MirrorMetal", + "category": "metal", + "description": "Smooth silver-colored metallic mirror", + "source": "builtin", + "revision": "builtin-v1", + "parameters": { + "base_color": [ + 0.95, + 0.95, + 0.95, + 1 + ], + "metallic": 1.0, + "roughness": 0, + "ior": 1.5, + "transmission": 0.0, + "emissive": [ + 0, + 0, + 0 + ], + "emission_intensity": 1.0 + }, + "renderers": [ + "hybrid", + "fast-rt", + "rt" + ], + "nominal_size_m": null, + "dependencies": [], + "auxiliary": false, + "auxiliary_resources": [], + "geometry_notes": "" + }, + { + "name": "GlassClearSurface", + "category": "glass", + "description": "Clear glass with surface transmission", + "source": "builtin", + "revision": "builtin-v1", + "parameters": { + "base_color": [ + 1, + 1, + 1, + 1 + ], + "metallic": 0.0, + "roughness": 0, + "ior": 1.5, + "transmission": 1.0, + "emissive": [ + 0, + 0, + 0 + ], + "emission_intensity": 1.0, + "thin_walled": true + }, + "renderers": [ + "rt" + ], + "nominal_size_m": null, + "dependencies": [], + "auxiliary": false, + "auxiliary_resources": [], + "geometry_notes": "Surface-only transmission; no volume absorption is configured." + }, + { + "name": "GlassFrostedSurface", + "category": "glass", + "description": "Frosted glass with rough surface transmission", + "source": "builtin", + "revision": "builtin-v1", + "parameters": { + "base_color": [ + 1, + 1, + 1, + 1 + ], + "metallic": 0.0, + "roughness": 0.28, + "ior": 1.5, + "transmission": 1.0, + "emissive": [ + 0, + 0, + 0 + ], + "emission_intensity": 1.0, + "thin_walled": true + }, + "renderers": [ + "rt" + ], + "nominal_size_m": null, + "dependencies": [], + "auxiliary": false, + "auxiliary_resources": [], + "geometry_notes": "Surface-only transmission; no volume absorption is configured." } ], "bundle": { diff --git a/embodichain/data/default_materials.py b/embodichain/data/default_materials.py index de8bf7b64..10e866007 100644 --- a/embodichain/data/default_materials.py +++ b/embodichain/data/default_materials.py @@ -37,7 +37,7 @@ def _catalog() -> dict[str, Any]: def list_default_materials() -> list[str]: - """List the 18 public presets without downloading assets or creating a World. + """List the 24 public presets without downloading assets or creating a World. Returns: Preset names in catalog order. Auxiliary resources are omitted. @@ -52,8 +52,10 @@ def get_default_material_info(name: str) -> dict[str, Any]: name: Case-sensitive catalog name, including ``SoapBubbleInterior``. Returns: - Description, supported renderers, dependencies, suggested texture size, - geometry guidance and source revision. Suggested sizes do not change UVs. + Description, source, download requirement, supported renderers, + dependencies, geometry guidance and source revision. Built-in presets + also include their native parameter defaults and have no texture size. + Suggested resource sizes do not change UVs. Raises: ValueError: The name is not in the built-in catalog. @@ -61,8 +63,14 @@ def get_default_material_info(name: str) -> dict[str, Any]: for item in _catalog()["materials"]: if item["name"] == name: result = copy.deepcopy(item) - result["texture_resolution"] = list(_catalog()["texture_resolution"]) - result["revision"] = _catalog()["bundle"]["revision"] + result.setdefault("source", "resource") + result["requires_download"] = result["source"] != "builtin" + result["texture_resolution"] = ( + list(_catalog()["texture_resolution"]) + if result["requires_download"] + else None + ) + result.setdefault("revision", _catalog()["bundle"]["revision"]) return result raise ValueError( f"Unknown default material {name!r}. Available presets: {', '.join(list_default_materials())}." diff --git a/embodichain/lab/sim/_material_presets.py b/embodichain/lab/sim/_material_presets.py index bf5401fe4..2161529a3 100644 --- a/embodichain/lab/sim/_material_presets.py +++ b/embodichain/lab/sim/_material_presets.py @@ -313,7 +313,16 @@ def __init__(self, world: Any, renderer: str) -> None: self._instances: dict[str, tuple[Any, Any]] = {} def _manifest(self, desc: _AssetMaterialDesc) -> dict[str, Any]: - if desc.preset: + info = get_default_material_info(desc.preset) if desc.preset else None + if info is not None and info["source"] == "builtin": + directory = Path.cwd() + pack_root = None + manifest = { + "schema_version": 1, + "parameters": info["parameters"], + "textures": {}, + } + elif desc.preset: if self._dataset is None: from embodichain.data.assets.materials import DefaultMaterials diff --git a/examples/sim/rendering/default_materials.py b/examples/sim/rendering/default_materials.py index 165bd6433..da06b6e2c 100644 --- a/examples/sim/rendering/default_materials.py +++ b/examples/sim/rendering/default_materials.py @@ -18,7 +18,7 @@ Run ``python examples/sim/rendering/default_materials.py --list`` for offline metadata. Use ``--all --compare-native --renderer rt`` for optical qualification, -and repeat with ``hybrid`` / ``fast-rt`` for the ten basic materials. Each +and repeat with ``hybrid`` / ``fast-rt`` for the compatible materials. Each renderer must run in a separate process. Scene geometry, lighting and cameras belong to this example; the material factory only loads material definitions. """ @@ -28,6 +28,7 @@ import argparse import json from pathlib import Path +from tempfile import TemporaryDirectory from time import perf_counter from typing import Any @@ -37,9 +38,20 @@ def build_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--list", action="store_true") parser.add_argument("--all", action="store_true") + parser.add_argument( + "--source", + choices=("all", "builtin", "resource"), + default="all", + help="Filter --all by built-in parameters or downloadable resources.", + ) parser.add_argument("--material", default="GlassClear") parser.add_argument("--renderer", choices=("rt", "hybrid", "fast-rt"), default="rt") parser.add_argument("--compare-native", action="store_true") + parser.add_argument( + "--gallery", + action="store_true", + help="Export WebP previews and grouped galleries.", + ) parser.add_argument( "--model", type=Path, @@ -54,6 +66,84 @@ def build_parser() -> argparse.ArgumentParser: return parser +def write_galleries(output: Path, rows: list[dict[str, Any]], renderer: str) -> None: + """Export captured images without changing their rendering settings. + + Args: + output: Directory containing the preset PNG captures. + rows: Material records from the completed rendering run. + renderer: Renderer name shown in gallery captions. + """ + import math + from importlib.metadata import version + import matplotlib + from PIL import Image + from embodichain.data import get_default_material_info + + matplotlib.use("Agg") + from matplotlib import pyplot as plt + + for row in rows: + with Image.open(output / f"{row['name']}_preset.png") as capture: + capture.save(output / f"{row['name']}.webp", quality=92) + groups = { + "default-materials": (rows, 6), + "builtin-materials": ([row for row in rows if row["source"] == "builtin"], 3), + "surface-materials": ( + [ + row + for row in rows + if row["source"] == "resource" + and len(get_default_material_info(row["name"])["renderers"]) > 1 + ], + 5, + ), + "advanced-materials": ( + [ + row + for row in rows + if row["source"] == "resource" + and get_default_material_info(row["name"])["renderers"] == ["rt"] + ], + 4, + ), + } + for filename, (records, columns) in groups.items(): + if not records: + continue + columns = min(columns, len(records)) + count_rows = math.ceil(len(records) / columns) + fig, axes = plt.subplots( + count_rows, + columns, + figsize=(3.2 * columns, 3.5 * count_rows), + squeeze=False, + facecolor="#171b20", + ) + for axis in axes.flat: + axis.axis("off") + for axis, row in zip(axes.flat, records): + with Image.open(output / f"{row['name']}_preset.png") as capture: + axis.imshow(capture.copy()) + axis.set_title(row["name"], fontsize=11, color="white", pad=6) + renderer_label = {"rt": "OfflineRT", "hybrid": "Hybrid", "fast-rt": "FastRT"}[ + renderer + ] + fig.suptitle( + f"Default materials · DexSim {version('dexsim-engine')} · {renderer_label}", + color="white", + fontsize=15, + ) + fig.tight_layout(rect=(0, 0, 1, 0.95)) + fig.savefig( + output / f"{filename}.webp", + dpi=160, + facecolor=fig.get_facecolor(), + pil_kwargs={"quality": 90}, + ) + plt.close(fig) + + def main(args: argparse.Namespace) -> None: """Render one material or the renderer-compatible catalog with fixed settings.""" from embodichain.data import get_default_material_info, list_default_materials @@ -69,6 +159,10 @@ def main(args: argparse.Namespace) -> None: name for name in list_default_materials() if args.renderer in get_default_material_info(name)["renderers"] + and ( + args.source == "all" + or get_default_material_info(name)["source"] == args.source + ) ] if args.all else [args.material] @@ -107,10 +201,11 @@ def main(args: argparse.Namespace) -> None: ) world, env = sim.get_world(), sim.get_env() camera = sample = inner = native = material = None + reference_files = None rows: list[dict[str, Any]] = [] try: sim.enable_physics(False) - sim.set_emission_light([0.85, 0.9, 1.0], 12.0) + sim.set_emission_light([0.85, 0.9, 1.0], 24.0) # Independent, fixed scene: colored cards reveal transmission, broad # rectangular lights reveal roughness and normal-map direction. for index, (x, color) in enumerate( @@ -127,9 +222,17 @@ def main(args: argparse.Namespace) -> None: VisualMaterialCfg(uid=f"card_{index}", base_color=color, roughness=0.6) ) card.set_material(card_material.inst.mat) + if index == 1: + yy, xx = np.indices((256, 256)) + checks = ((xx // 32 + yy // 32) % 2)[..., None] + pixels = np.where(checks, [225, 225, 225], [45, 45, 45]).astype( + np.uint8 + ) + texture = env.create_color_texture(pixels, has_alpha=False) + card_material.inst.set_base_color_texture(texture_obj=texture) for name, location, direction, color, power in ( - ("key", (-2, -2, 3), (2, 2, -2), (1, 0.85, 0.7), 60), - ("fill", (2, 0, 3), (-2, 0, -2), (0.6, 0.8, 1), 40), + ("key", (-2, -2, 3), (2, 2, -2), (1, 0.85, 0.7), 90), + ("fill", (2, 0, 3), (-2, 0, -2), (0.6, 0.8, 1), 60), ): light = env.create_light(name, render.LightType.RECT) light.set_location(*location) @@ -151,8 +254,14 @@ def main(args: argparse.Namespace) -> None: ) camera.look_at([1.5, -3.8, 1.8], [0, 0, 0.8], [0, 0, 1]) camera.open_camera() - source = DefaultMaterials() if args.compare_native else None + source = None + reference_files = ( + TemporaryDirectory(prefix="ec-material-reference-") + if args.compare_native + else None + ) for name in names: + info = get_default_material_info(name) started = perf_counter() material = sim.create_visual_material( VisualMaterialCfg.from_preset(name, uid=f"preset_{name}") @@ -217,10 +326,14 @@ def capture(label: str) -> Any: world.update(0.0) camera.render(render.ViewFlags.COLOR, render.ViewFlags.COLOR, False) rgb = np.ascontiguousarray(camera.get_rgb_map()[..., :3]) - cv2.imwrite( + saved = cv2.imwrite( str(args.output / f"{name}_{label}.png"), cv2.cvtColor(rgb, cv2.COLOR_RGB2BGR), ) + if not saved: + raise RuntimeError( + f"Cannot save {name}_{label}.png to {args.output}." + ) return rgb inner_material = ( @@ -239,12 +352,33 @@ def capture(label: str) -> Any: "load_ms": load_ms, "ior": material.inst.ior, "roughness": material.inst.roughness, + "metallic": material.inst.mat.get_metallic(), + "transmission": material.inst.mat.get_transmission(), + "base_color": material.inst.base_color, "native_match": None, + "source": info["source"], } - if source: - native = env.load_material( - source.get_material_path(name), f"reference_{name}" - ) + if args.compare_native: + if info["source"] == "builtin": + reference_path = Path(reference_files.name) / name + reference_path.mkdir() + # Direct native baseline uses the authored definition, + # without the runtime resolver or Python default setters. + (reference_path / "material.json").write_text( + json.dumps( + { + "schema_version": 1, + "parameters": info["parameters"], + "textures": {}, + } + ), + encoding="utf-8", + ) + else: + if source is None: + source = DefaultMaterials() + reference_path = Path(source.get_material_path(name)) + native = env.load_material(str(reference_path), f"reference_{name}") native_inner = ( env.load_material( source.get_material_path("SoapBubbleInterior"), @@ -293,6 +427,7 @@ def capture(label: str) -> Any: "get_roughness", "get_metallic", "get_transmission", + "get_base_color", ): actual, expected = ( getattr(material.inst.mat, getter)(), @@ -301,7 +436,7 @@ def capture(label: str) -> Any: if expected is None or actual is None: assert expected is actual, (name, getter, actual, expected) else: - assert np.isclose(actual, expected, atol=1e-5), ( + assert np.allclose(actual, expected, atol=1e-5), ( name, getter, actual, @@ -349,7 +484,11 @@ def capture(label: str) -> Any: camera.close_camera() sim.destroy(exit_process=False) del sample, inner, native, material, camera + if reference_files is not None: + reference_files.cleanup() SimulationManager.flush_cleanup_queue() + if args.gallery: + write_galleries(args.output, rows, args.renderer) if __name__ == "__main__": diff --git a/tests/data/test_default_materials.py b/tests/data/test_default_materials.py index 98d33eb2f..006406104 100644 --- a/tests/data/test_default_materials.py +++ b/tests/data/test_default_materials.py @@ -38,11 +38,11 @@ def fail(*args, **kwargs): monkeypatch.setattr(DefaultMaterials, "__init__", fail) names = list_default_materials() - assert len(names) == len(set(names)) == 18 + assert len(names) == len(set(names)) == 24 assert "SoapBubbleInterior" not in names assert ( sum(get_default_material_info(name)["renderers"] == ["rt"] for name in names) - == 8 + == 10 ) glass = get_default_material_info("GlassClear") assert glass["renderers"] == ["rt"] @@ -51,6 +51,21 @@ def fail(*args, **kwargs): assert get_default_material_info("GlassClear")["renderers"] == ["rt"] assert get_default_material_info("SoapBubble")["geometry_notes"] assert get_default_material_info("SoapBubbleInterior")["auxiliary"] + assert ( + sum(not get_default_material_info(name)["requires_download"] for name in names) + == 6 + ) + builtin = get_default_material_info("PlasticMatteBlue") + assert builtin["source"] == "builtin" + assert builtin["texture_resolution"] is None + assert builtin["nominal_size_m"] is None + assert builtin["revision"] == "builtin-v1" + assert builtin["parameters"]["base_color"] == [0.05, 0.22, 0.6, 1] + builtin["parameters"]["base_color"][0] = 1.0 + assert ( + get_default_material_info("PlasticMatteBlue")["parameters"]["base_color"][0] + == 0.05 + ) assert ("DefaultMaterials", DefaultMaterials) in get_registry()["materials"] with pytest.raises(ValueError, match="Unknown default material"): get_default_material_info("glassclear") @@ -113,6 +128,8 @@ def test_verified_archive_repairs_missing_dependency_in_custom_cache( assert Path(second.extract_dir) == extract assert texture.read_bytes() == b"original pixels" assert (extract / "Material/SoapBubbleInterior/material.json").read_bytes() == b"{}" + with pytest.raises(ValueError, match="built-in parameter preset"): + second.get_material_path("PlasticMatteBlue") def test_data_cli_reports_the_versioned_cache_as_ready(tmp_path, monkeypatch, capsys): diff --git a/tests/sim/test_material.py b/tests/sim/test_material.py index 7b8d834fc..34239a53c 100644 --- a/tests/sim/test_material.py +++ b/tests/sim/test_material.py @@ -584,3 +584,50 @@ def test_common_parameter_aliases_canonicalize_before_replace_restores_inheritan VisualMaterialCfg.from_preset("GlassClear", parameters={"thin_walled": False}), "glass", ) + + +def test_builtin_presets_resolve_without_resource_download_and_keep_overrides( + monkeypatch, +): + import json + from pathlib import Path + from embodichain.data import get_default_material_info + from embodichain.lab.sim._material_presets import _MaterialResources + from embodichain.lab.sim.material import _material_desc_from_cfg + + def forbidden(*args, **kwargs): + raise AssertionError("Built-in presets must not construct DefaultMaterials") + + monkeypatch.setattr("embodichain.data.assets.materials.DefaultMaterials", forbidden) + world = MagicMock() + world.get_env.return_value.load_material.side_effect = ( + lambda *args: _native_template() + ) + resources = _MaterialResources(world, "rt") + cfg = VisualMaterialCfg.from_preset("PlasticMatteBlue", roughness=0.0) + try: + resources.resolve(_material_desc_from_cfg(cfg, "blue")) + path = ( + Path(world.get_env.return_value.load_material.call_args.args[0]) + / "material.json" + ) + manifest = json.loads(path.read_text()) + assert manifest["parameters"]["base_color"] == [0.05, 0.22, 0.6, 1] + assert manifest["parameters"]["roughness"] == 0.0 + assert manifest["parameters"]["transmission"] == 0.0 + assert manifest["textures"] == {} + assert ( + get_default_material_info("PlasticMatteBlue")["parameters"]["roughness"] + == 0.65 + ) + resources.resolve( + _material_desc_from_cfg(cfg.replace(roughness=None), "inherited") + ) + path = ( + Path(world.get_env.return_value.load_material.call_args.args[0]) + / "material.json" + ) + assert json.loads(path.read_text())["parameters"]["roughness"] == 0.65 + assert resources._dataset is None + finally: + resources.close() From ec08ef28ddd5a83d9a41c3c5d4375104a52e7dc8 Mon Sep 17 00:00:00 2001 From: yuecideng Date: Fri, 23 Oct 2026 21:00:25 +0800 Subject: [PATCH 08/10] feat(cli): add default material preview and gallery export --- agent_context/MAP.yaml | 8 +- .../topics/data-assets/data-assets.md | 7 +- .../topics/simulation-system/materials.md | 12 +- .../visual-material-acceptance.md | 9 +- docs/source/api_reference/public_api.rst | 18 + docs/source/guides/cli.md | 18 + docs/source/guides/index.rst | 1 + docs/source/guides/preview_material.md | 116 +++ .../sim/sim_manager/rendering/materials.md | 20 +- embodichain/_material_catalog.py | 77 ++ embodichain/cli/main.py | 5 + embodichain/data/default_materials.py | 60 +- embodichain/lab/scripts/preview_material.py | 740 ++++++++++++++++++ examples/sim/rendering/default_materials.py | 478 +---------- tests/lab/scripts/test_preview_material.py | 233 ++++++ tests/test_main.py | 1 + 16 files changed, 1259 insertions(+), 544 deletions(-) create mode 100644 docs/source/guides/preview_material.md create mode 100644 embodichain/_material_catalog.py create mode 100644 embodichain/lab/scripts/preview_material.py create mode 100644 tests/lab/scripts/test_preview_material.py diff --git a/agent_context/MAP.yaml b/agent_context/MAP.yaml index 902193def..1616368e8 100644 --- a/agent_context/MAP.yaml +++ b/agent_context/MAP.yaml @@ -11,7 +11,7 @@ topics: aliases: [simulation system, simulation manager, Newton physics backend, motion module, sim motion, camera attachment, 运动能力模块, 仿真系统, 仿真管理器] keywords: [SimulationManager, SimulationManagerCfg, RenderCfg, DenoisingCfg, DenoisingMode, DLSSCfg, NRDCfg, DLSS, NRD, frame_time_delta_ms, explicit physics stepping, arena, DexSim, PhysicsBackendCfg, - DefaultPhysicsCfg, NewtonPhysicsCfg, VisualObject, VisualObjectCfg, VisualMaterial, VisualMaterialCfg, VisualMaterialInst, UsdSourceCfg, source_prim_path, add_visual_object, 纯渲染对象, AutoSolverCfg, DexUniSolverCfg, DexUni, runtime control, deformable, particle set, + DefaultPhysicsCfg, NewtonPhysicsCfg, VisualObject, VisualObjectCfg, VisualMaterial, VisualMaterialCfg, VisualMaterialInst, preview-material, 材质预览, UsdSourceCfg, source_prim_path, add_visual_object, 纯渲染对象, AutoSolverCfg, DexUniSolverCfg, DexUni, runtime control, deformable, particle set, ArticulationJointKinematics, get_parent_joint_chain, asset_physics_mode, joint_drive_props, enable_gravity, fixed-cadence playback, quaternion, xyzw] paths: [topics/simulation-system/simulation-system.md] @@ -26,6 +26,7 @@ topics: - embodichain/lab/sim/spawn/ - embodichain/lab/sim/material.py - embodichain/lab/sim/_material_presets.py + - embodichain/lab/scripts/preview_material.py - embodichain/lab/sim/common.py - embodichain/lab/sim/_startup_summary.py - embodichain/lab/sim/_runtime_controls.py @@ -36,7 +37,7 @@ topics: - embodichain/lab/sim/objects/gizmo.py - embodichain/lab/gym/envs/base_env.py watch_paths: [embodichain/lab/sim/sim_manager.py, embodichain/lab/sim/cfg/, embodichain/lab/sim/physics/, - embodichain/lab/sim/spawn/, embodichain/lab/sim/material.py, embodichain/lab/sim/_material_presets.py, embodichain/lab/sim/objects/, tests/sim/] + embodichain/lab/sim/spawn/, embodichain/lab/sim/material.py, embodichain/lab/sim/_material_presets.py, embodichain/lab/scripts/preview_material.py, tests/lab/scripts/test_preview_material.py, embodichain/lab/sim/objects/, tests/sim/] related_topics: [env-framework, robot-system, sensor-system, sim-visualization, ik-solvers, motion-planning, atomic-actions, rl-learning, configclass-pattern, robot-workspace] status: active @@ -433,7 +434,8 @@ topics: - embodichain/data/assets/materials.py - embodichain/data/default_materials.py - embodichain/data/default_materials.json - watch_paths: [embodichain/data/, embodichain/cli/main.py, tests/data/] + - embodichain/_material_catalog.py + watch_paths: [embodichain/data/, embodichain/_material_catalog.py, embodichain/cli/main.py, tests/data/] related_topics: [gen-sim, robot-system, data-pipeline] status: active - id: data-pipeline diff --git a/agent_context/topics/data-assets/data-assets.md b/agent_context/topics/data-assets/data-assets.md index 08b61c7be..584300178 100644 --- a/agent_context/topics/data-assets/data-assets.md +++ b/agent_context/topics/data-assets/data-assets.md @@ -12,7 +12,7 @@ Online sampling and demonstration persistence belong to | Cache roots / mirror prefix | `embodichain/data/constants.py` | | Locked download and ZIP integrity | `embodichain/data/dataset.py`: `EmbodiChainDataset`, `_dataset_download_lock()` | | CLI list/download | `embodichain/data/download.py`: `CATEGORY_MODULES`, `get_registry()`, `download_asset()` | -| Default material catalog / provenance | `embodichain/data/default_materials.py`, `default_materials.json` | +| Default material catalog / provenance | `embodichain/_material_catalog.py` → `embodichain/data/default_materials.py`; `embodichain/data/default_materials.json` | | Default material archive | `embodichain/data/assets/materials.py`: `DefaultMaterials` | | Dataset class visibility | `embodichain/data/__init__.py`, `embodichain/data/assets/__init__.py` | | Pretrained policy bundles | `embodichain/data/assets/policy_assets.py`: `download_pretrained_policy()` | @@ -75,7 +75,10 @@ by default and accepts local exports through `--source`. `list_default_materials()` and `get_default_material_info()` are exported from `embodichain.data` and query wheel-packaged metadata without a World or download. -`setup.py` must include that catalog explicitly. `DefaultMaterials` uses a +The shared implementation lives in `_material_catalog.py` so CLI catalog queries +can avoid importing the data package's Open3D/download dependencies. Preserve the +public data exports and one catalog implementation. `setup.py` must include +that catalog explicitly. `DefaultMaterials` uses a revision-specific cache prefix and the shared dataset lock, verifies archive SHA256 and member digests, and repairs extraction from the verified archive. Its data CLI registration follows the existing materials category. diff --git a/agent_context/topics/simulation-system/materials.md b/agent_context/topics/simulation-system/materials.md index 94979f409..d1139d4d7 100644 --- a/agent_context/topics/simulation-system/materials.md +++ b/agent_context/topics/simulation-system/materials.md @@ -23,8 +23,16 @@ facades stay declared and are skipped by runtime binding/reset in that mode. Built-in parameter presets resolve from wheel metadata without constructing the downloadable resource dataset. Both sources use complete manifests and the same override, identity and reset path. Human-facing previews and parameter tables -live in the [material guide](../../../docs/source/overview/sim/sim_manager/rendering/materials.md); -keep renderer capabilities in the catalog. +live in the [material guide](../../../docs/source/overview/sim/sim_manager/rendering/materials.md). +`embodichain/lab/scripts/preview_material.py` owns `preview-material`; the example +delegates to it with a headless default. Help/list use the lightweight catalog +without simulator imports. Rendering preflights the same configurations/backend +validator as production before World creation. Batch exclusions require explicit +`--compatible-only` and are reported; never switch renderers or silently drop +parameters. Geometry, studio settings and direct-native comparisons belong to +the preview, not the material factory. See the +[CLI guide](../../../docs/source/guides/preview_material.md) and +`tests/lab/scripts/test_preview_material.py`; keep capabilities in the catalog. Resource templates remain immutable. Each public UID and instance receives a separate child; canonical revision/preset/overrides select shared templates. diff --git a/docs/architecture/visual-material-acceptance.md b/docs/architecture/visual-material-acceptance.md index fe9aef3c5..44fac7f67 100644 --- a/docs/architecture/visual-material-acceptance.md +++ b/docs/architecture/visual-material-acceptance.md @@ -63,15 +63,16 @@ In addition to the legacy handwritten-material checks above, qualify the unified | Native resources | Runtime-first and inline-first aliases share exact handles. Different UIDs use separate children of immutable templates. Repeated creation preserves state and bounded native instance counts. Variants stage JSON only, never duplicate PNGs. | | Lifecycle | Complete native template reset restores properties beyond the flattened fields. Default/Newton selection, reset, topology rebuild and cleanup preserve identity and expected assignments. | | Optical parity | Render all 24 on OfflineRT and the fourteen compatible presets on Hybrid and FastRT. Compare the package route to direct native loading with identical geometry/camera/lights, plus a native-repeat noise control. Use closed glass meshes, explicit double shells for bubbles and optional segmented face geometry. | +| Preview CLI | Installed-wheel help/list need no simulator imports, GPU or asset download. Overrides preserve inheritance and explicit zero/false. Incompatible requests fail before World creation; compatible-only batches report every exclusion. Captures and metadata reproduce the selected configuration. | ```bash -python -m pytest -q tests/data/test_default_materials.py tests/sim/test_material.py +python -m pytest -q tests/data/test_default_materials.py tests/sim/test_material.py tests/lab/scripts/test_preview_material.py tests/test_main.py python -m pytest -q --run-gpu tests/sim/test_material_integration.py # Each renderer requires a separate process. Run native checks serially. -python examples/sim/rendering/default_materials.py --all --compare-native --renderer rt -python examples/sim/rendering/default_materials.py --all --compare-native --renderer hybrid -python examples/sim/rendering/default_materials.py --all --compare-native --renderer fast-rt +embodichain preview-material --all --headless --compare-native --renderer rt +embodichain preview-material --all --compatible-only --compare-native --renderer hybrid +embodichain preview-material --all --compatible-only --compare-native --renderer fast-rt # Optionally add --model /path/to/skin_face.glb for SkinHumanLight. ``` diff --git a/docs/source/api_reference/public_api.rst b/docs/source/api_reference/public_api.rst index e7e8598af..095a621c3 100644 --- a/docs/source/api_reference/public_api.rst +++ b/docs/source/api_reference/public_api.rst @@ -919,6 +919,24 @@ embodichain.lab.scripts.preview_lerobot_data main resolve_dataset_root +embodichain.lab.scripts.preview_material +---------------------------------------- + +.. currentmodule:: embodichain.lab.scripts.preview_material + +Query the default catalog without loading simulation dependencies, or render +presets and parameter variants with fixed preview settings and managed cleanup. + +.. autosummary:: + + main + cli + +.. autofunction:: main + +.. autofunction:: cli + + embodichain.lab.scripts.preview_robot ------------------------------------- diff --git a/docs/source/guides/cli.md b/docs/source/guides/cli.md index f9f8b131f..c210501d8 100644 --- a/docs/source/guides/cli.md +++ b/docs/source/guides/cli.md @@ -91,6 +91,24 @@ See {doc}`preview_robot` for robot files, overrides, and bounded headless runs. --- +(cli-preview-material)= +## Preview Material + +Query default presets, open a native material preview or export rendered images: + +```bash +embodichain preview-material --list +embodichain preview-material --material GlassClear +embodichain preview-material --all --headless --gallery --output outputs/materials +``` + +OfflineRT (`--renderer rt`) is the default. Other renderers reject incompatible +requests; `--all --compatible-only` explicitly selects and reports supported +presets. See {doc}`preview_material` for JSON overrides, output metadata, +direct-native comparisons and renderer requirements. + +--- + (cli-list-tasks)= ## List Tasks diff --git a/docs/source/guides/index.rst b/docs/source/guides/index.rst index ba6a9518c..fe4daf74d 100644 --- a/docs/source/guides/index.rst +++ b/docs/source/guides/index.rst @@ -12,6 +12,7 @@ Practical guides for common tasks in EmbodiChain. add_robot preview_asset preview_robot + preview_material run_task expert_task_language offline_expert_datasets diff --git a/docs/source/guides/preview_material.md b/docs/source/guides/preview_material.md new file mode 100644 index 000000000..14679d9c1 --- /dev/null +++ b/docs/source/guides/preview_material.md @@ -0,0 +1,116 @@ +# Preview default materials + +`embodichain preview-material` previews a default material in a native DexSim +window or exports images from a fixed studio scene. It uses the same +`VisualMaterialCfg.from_preset()` resolver as runtime and Spawn material creation. +`python -m embodichain preview-material` is equivalent and works outside the +source checkout after installing the wheel. + +See the {doc}`material catalog ` +for all 24 public presets, their parameters, OfflineRT images and download setup. + +## Query and preview + +```bash +# Metadata only: no simulator imports, GPU initialization or material download. +embodichain preview-material --list +embodichain preview-material --list --source builtin + +# Open the native window after saving a reference capture. +embodichain preview-material --material GlassClear + +# Export one image and exit without a window. +embodichain preview-material --material PlasticMatteBlue --headless \ + --output outputs/blue +``` + +The default material is `GlassClear` and the default renderer is `rt` +(**OfflineRT**), which supports the complete catalog. A single preview stays +open until Ctrl+C; `--max-steps 100` bounds its preview updates. Physics is +disabled. Use `--gpu-id` to select the render GPU; `--size`, `--frames` and +`--spp` control capture resolution, accumulation frames and DexSim render +iterations per frame. The defaults are 320 pixels, four frames and 16 iterations. + +## Override a preset + +Pass a JSON object containing `VisualMaterialCfg` fields. Common fields stay +flat, while advanced fields belong inside `parameters`: + +```bash +embodichain preview-material --material GlassClear --headless \ + --material-params '{"ior":1.6,"parameters":{"volume_attenuation_distance":8.0}}' \ + --output outputs/glass-variant + +embodichain preview-material --material PlasticMatteBlue --headless \ + --material-params '{"roughness":0}' --output outputs/smooth-blue +``` + +Omitted fields and JSON `null` inherit the preset. Explicit `0` and `false` +remain overrides. Duplicate flat/native properties, invalid values, +`material_type` and texture edits fail before creating a World or loading assets. +The command owns material UIDs; select the preset using `--material`. + +Variants are created before binding. The preview does not depend on native +cross-model hot mutation or change the material factory's geometry/UV behavior. + +## Batch export and renderer requirements + +```bash +# All 24 presets, individual WebPs and grouped galleries. Batch mode has no window. +embodichain preview-material --all --headless --gallery \ + --size 640 --frames 6 --spp 12 --output outputs/material-catalog + +# Only the six built-in parameter definitions; no material-archive download. +embodichain preview-material --all --source builtin --gallery + +# Explicitly export the 14 presets supported by Hybrid. +embodichain preview-material --all --renderer hybrid --compatible-only \ + --output outputs/materials-hybrid +``` + +Hybrid and FastRT support ten basic resource presets and four built-in +parameter presets. The remaining ten public presets and advanced parameter +variations require OfflineRT. An incompatible request fails before resource +download or native loading; the command never changes the renderer or downgrades +material parameters. With `--all --compatible-only`, excluded names and reasons +are printed to stderr and recorded in `results.json`. If no presets remain, +the command fails. `--source` filters `--list` and `--all`; `--material-params` +applies the supplied overrides to every selected preset. + +Each renderer must run in a separate process. `--gallery` requires Pillow and +matplotlib; install those packages if they are absent. Gallery composition runs +after native renderer cleanup and uses the saved captures. + +## Outputs and direct-native verification + +Every render writes `_preset.png` and `results.json` under +`--output` (default `outputs/default-materials`). Use a separate directory per +variant or renderer to retain previous results. The report records the scene +recipe, renderer and DexSim version, capture settings, material source/revision, +serialized configuration, geometry choice, parameter readback and exclusions. +Unspecified configuration fields stay `null`; authored resource defaults are +not expanded into explicit overrides. + +`--gallery` additionally writes `.webp`, `default-materials.webp` +and nonempty built-in, basic-resource and advanced-resource galleries. + +```bash +# Compare the preset resolver with the original native definitions. +embodichain preview-material --all --headless --compare-native \ + --renderer rt --output outputs/material-parity +``` + +`--compare-native` also saves `*_native.png` and `*_native_repeat.png`, checks +parameter readback and compares the center crop with a repeat-render noise +control. A mismatch fails the command. This mode verifies authored presets and +cannot be combined with `--material-params`. + +The scene uses fixed colored cards, a checkerboard, rectangular lights and +exposure. Architecture/wood/stone/ground presets use a slab; other presets use +a sphere. `SoapBubble` has an explicit inward-facing inner shell. An optional +`--model /path/to/skin_face.glb` supplies a segmented face for `SkinHumanLight` +or a batch containing it; that model is not downloaded with the materials. + +The existing `examples/sim/rendering/default_materials.py` delegates to this +command and retains its headless default. Use the production CLI for window +preview or add `--no-headless` to the example. diff --git a/docs/source/overview/sim/sim_manager/rendering/materials.md b/docs/source/overview/sim/sim_manager/rendering/materials.md index f00b3301e..a7a36502d 100644 --- a/docs/source/overview/sim/sim_manager/rendering/materials.md +++ b/docs/source/overview/sim/sim_manager/rendering/materials.md @@ -241,7 +241,7 @@ creates a smaller inward-facing inner shell; the factory only creates materials. sheen, clearcoat and diffuse transmission. It does not implement random-walk subsurface scattering. The portrait preview uses an optional caller-provided segmented `SkinFaceDemo` GLB; that mesh is not included in the material archive. -Without `--model`, the example renders the same skin material on a sphere. +Without `--model`, the preview renders the same skin material on a sphere. ## Query, cache and reproduce @@ -263,21 +263,27 @@ NoRender retains declarations without downloading or loading native materials. ```bash # Offline catalog query. -python examples/sim/rendering/default_materials.py --list +embodichain preview-material --list # Only the six built-in parameter materials. -python examples/sim/rendering/default_materials.py \ - --all --source builtin --renderer rt --compare-native --size 640 --frames 6 --spp 12 --gallery +embodichain preview-material \ + --all --headless --source builtin --renderer rt --compare-native --size 640 --frames 6 --spp 12 --gallery # All 24 presets; add --model /path/to/skin_face.glb for the portrait sample. -python examples/sim/rendering/default_materials.py \ - --all --renderer rt --compare-native --size 640 --frames 6 --spp 12 --gallery +embodichain preview-material \ + --all --headless --renderer rt --compare-native --size 640 --frames 6 --spp 12 --gallery # Pre-download the 18 resource presets and the bubble helper. embodichain data download --name DefaultMaterials ``` -The preview saves lossless `*_preset.png`, `*_native.png` and +Use `embodichain preview-material --material GlassClear` for a native window, +or add `--headless` to export and exit. See the +{doc}`preview-material guide ` for parameter overrides, +compatible batch selection and output metadata. The existing example delegates +to the same implementation and retains its headless default. + +The native-comparison preview saves lossless `*_preset.png`, `*_native.png` and `*_native_repeat.png` images plus `results.json`. Direct-native comparisons use the original resource directory or the built-in native parameter definition, with the same geometry, camera, exposure and lights. Material parameter readback diff --git a/embodichain/_material_catalog.py b/embodichain/_material_catalog.py new file mode 100644 index 000000000..3c39a83e7 --- /dev/null +++ b/embodichain/_material_catalog.py @@ -0,0 +1,77 @@ +# ---------------------------------------------------------------------------- +# Copyright (c) 2021-2026 DexForce Technology Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ---------------------------------------------------------------------------- + +"""Offline catalog for the versioned DexSim default material collection.""" + +from __future__ import annotations + +import copy +import json +from functools import lru_cache +from importlib.resources import files +from typing import Any + +__all__ = ["list_default_materials", "get_default_material_info"] + + +@lru_cache(maxsize=1) +def _catalog() -> dict[str, Any]: + return json.loads( + files("embodichain") + .joinpath("data", "default_materials.json") + .read_text(encoding="utf-8") + ) + + +def list_default_materials() -> list[str]: + """List the 24 public presets without downloading assets or creating a World. + + Returns: + Preset names in catalog order. Auxiliary resources are omitted. + """ + return [item["name"] for item in _catalog()["materials"] if not item["auxiliary"]] + + +def get_default_material_info(name: str) -> dict[str, Any]: + """Read independent metadata for a public preset or auxiliary resource. + + Args: + name: Case-sensitive catalog name, including ``SoapBubbleInterior``. + + Returns: + Description, source, download requirement, supported renderers, + dependencies, geometry guidance and source revision. Built-in presets + also include their native parameter defaults and have no texture size. + Suggested resource sizes do not change UVs. + + Raises: + ValueError: The name is not in the built-in catalog. + """ + for item in _catalog()["materials"]: + if item["name"] == name: + result = copy.deepcopy(item) + result.setdefault("source", "resource") + result["requires_download"] = result["source"] != "builtin" + result["texture_resolution"] = ( + list(_catalog()["texture_resolution"]) + if result["requires_download"] + else None + ) + result.setdefault("revision", _catalog()["bundle"]["revision"]) + return result + raise ValueError( + f"Unknown default material {name!r}. Available presets: {', '.join(list_default_materials())}." + ) diff --git a/embodichain/cli/main.py b/embodichain/cli/main.py index 2161b35e9..5c0d92d41 100644 --- a/embodichain/cli/main.py +++ b/embodichain/cli/main.py @@ -72,6 +72,11 @@ class Command: target="embodichain.lab.scripts.preview_robot:cli", help="Preview a robot with control-part Gizmos and Viser joint controls.", ), + Command( + name="preview-material", + target="embodichain.lab.scripts.preview_material:cli", + help="Preview default materials or export rendered images and galleries.", + ), Command( name="run-task", target="embodichain.lab.scripts.run_task:cli", diff --git a/embodichain/data/default_materials.py b/embodichain/data/default_materials.py index 10e866007..e1b65391a 100644 --- a/embodichain/data/default_materials.py +++ b/embodichain/data/default_materials.py @@ -18,60 +18,10 @@ from __future__ import annotations -import copy -import json -from functools import lru_cache -from importlib.resources import files -from typing import Any +from embodichain._material_catalog import ( + _catalog, + get_default_material_info, + list_default_materials, +) __all__ = ["list_default_materials", "get_default_material_info"] - - -@lru_cache(maxsize=1) -def _catalog() -> dict[str, Any]: - return json.loads( - files("embodichain.data") - .joinpath("default_materials.json") - .read_text(encoding="utf-8") - ) - - -def list_default_materials() -> list[str]: - """List the 24 public presets without downloading assets or creating a World. - - Returns: - Preset names in catalog order. Auxiliary resources are omitted. - """ - return [item["name"] for item in _catalog()["materials"] if not item["auxiliary"]] - - -def get_default_material_info(name: str) -> dict[str, Any]: - """Read independent metadata for a public preset or auxiliary resource. - - Args: - name: Case-sensitive catalog name, including ``SoapBubbleInterior``. - - Returns: - Description, source, download requirement, supported renderers, - dependencies, geometry guidance and source revision. Built-in presets - also include their native parameter defaults and have no texture size. - Suggested resource sizes do not change UVs. - - Raises: - ValueError: The name is not in the built-in catalog. - """ - for item in _catalog()["materials"]: - if item["name"] == name: - result = copy.deepcopy(item) - result.setdefault("source", "resource") - result["requires_download"] = result["source"] != "builtin" - result["texture_resolution"] = ( - list(_catalog()["texture_resolution"]) - if result["requires_download"] - else None - ) - result.setdefault("revision", _catalog()["bundle"]["revision"]) - return result - raise ValueError( - f"Unknown default material {name!r}. Available presets: {', '.join(list_default_materials())}." - ) diff --git a/embodichain/lab/scripts/preview_material.py b/embodichain/lab/scripts/preview_material.py new file mode 100644 index 000000000..cce6a101f --- /dev/null +++ b/embodichain/lab/scripts/preview_material.py @@ -0,0 +1,740 @@ +# ---------------------------------------------------------------------------- +# Copyright (c) 2021-2026 DexForce Technology Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ---------------------------------------------------------------------------- + +"""Preview default material presets in a native window or export reference images. + +Help and catalog queries do not initialize DexSim or download material assets. +Scene geometry, lighting and cameras belong to this command; the material factory +only loads material definitions. +""" + +from __future__ import annotations + +import argparse +from collections.abc import Sequence +import json +from pathlib import Path +import sys +from tempfile import TemporaryDirectory +from time import perf_counter +import traceback +from typing import Any, TYPE_CHECKING + +if TYPE_CHECKING: + from embodichain.lab.sim.material import VisualMaterialCfg + +__all__ = ["main", "cli"] + + +def _positive_integer(value: str) -> int: + number = int(value) + if number < 1: + raise argparse.ArgumentTypeError("must be a positive integer") + return number + + +def _material_params(value: str) -> dict[str, Any]: + try: + params = json.loads(value) + except ValueError as error: + raise argparse.ArgumentTypeError( + "--material-params must be a JSON object" + ) from error + if not isinstance(params, dict): + raise argparse.ArgumentTypeError("--material-params must be a JSON object") + if {"uid", "preset"} & params.keys(): + raise argparse.ArgumentTypeError( + "Select the preset with --material; preview UIDs are command-owned" + ) + return params + + +def _create_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="embodichain preview-material", + description=__doc__, + ) + selection = parser.add_mutually_exclusive_group() + selection.add_argument( + "--list", + action="store_true", + help="Print offline catalog metadata as JSON lines and exit.", + ) + selection.add_argument( + "--all", + action="store_true", + help="Export all selected presets without opening a window.", + ) + selection.add_argument( + "--material", help="Exact preset name; defaults to GlassClear." + ) + parser.add_argument( + "--source", + choices=("all", "builtin", "resource"), + default="all", + help="Filter --list or --all by material source.", + ) + parser.add_argument( + "--renderer", + choices=("rt", "hybrid", "fast-rt"), + default="rt", + help="Native renderer; rt (OfflineRT) supports the full catalog.", + ) + parser.add_argument( + "--material-params", + type=_material_params, + default={}, + help="VisualMaterialCfg overrides as JSON; advanced fields belong inside parameters.", + ) + parser.add_argument( + "--compatible-only", + action="store_true", + help="With --all, explicitly skip incompatible presets and report their names.", + ) + parser.add_argument( + "--headless", + action=argparse.BooleanOptionalAction, + default=False, + help="Export images and exit without opening a native window.", + ) + parser.add_argument( + "--max-steps", + type=_positive_integer, + help="Bound native-window preview updates; otherwise exit with Ctrl+C.", + ) + parser.add_argument( + "--gpu-id", + "--gpu_id", + type=int, + default=0, + help="GPU index used by DexSim rendering.", + ) + parser.add_argument( + "--compare-native", + action="store_true", + help="Compare unmodified presets with direct native loading and fail on a mismatch.", + ) + parser.add_argument( + "--gallery", + action="store_true", + help="Export individual WebP images and grouped galleries (Pillow and matplotlib required).", + ) + parser.add_argument( + "--model", + type=Path, + help="Optional segmented skin face GLB; not part of the material package.", + ) + parser.add_argument( + "--output", + type=Path, + default=Path("outputs/default-materials"), + help="Directory for PNG captures, results.json and optional WebP galleries.", + ) + parser.add_argument( + "--size", + type=_positive_integer, + default=320, + help="Square capture resolution in pixels.", + ) + parser.add_argument( + "--frames", + type=_positive_integer, + default=4, + help="Accumulation frames per capture.", + ) + parser.add_argument( + "--spp", + type=_positive_integer, + default=16, + help="DexSim render iterations per frame.", + ) + return parser + + +def _select_materials( + args: argparse.Namespace, +) -> tuple[list[VisualMaterialCfg], list[dict[str, str]]]: + """Resolve configurations and renderer requirements before constructing a World.""" + from embodichain._material_catalog import ( + get_default_material_info, + list_default_materials, + ) + from embodichain.lab.sim import VisualMaterialCfg + from embodichain.lab.sim._material_presets import ( + _asset_desc_from_cfg, + _validate_backend, + ) + + if min(args.size, args.frames, args.spp) < 1: + raise ValueError("size, frames and spp must be positive") + if args.gpu_id < 0: + raise ValueError("gpu-id must be nonnegative") + if args.compatible_only and not args.all: + raise ValueError("--compatible-only requires --all") + if args.source != "all" and not args.all: + raise ValueError("--source requires --list or --all") + if args.max_steps is not None and (args.headless or args.all): + raise ValueError( + "--max-steps applies to native-window previews; remove --headless/--all" + ) + if args.compare_native and args.material_params: + raise ValueError( + "--compare-native compares authored presets; remove --material-params" + ) + names = ( + [ + name + for name in list_default_materials() + if args.source == "all" + or get_default_material_info(name)["source"] == args.source + ] + if args.all + else [args.material or "GlassClear"] + ) + if args.model is not None: + args.model = args.model.expanduser().resolve() + if "SkinHumanLight" not in names: + raise ValueError("--model requires SkinHumanLight or a batch containing it") + if not args.model.is_file(): + raise FileNotFoundError(args.model) + configs, skipped = [], [] + for name in names: + cfg = VisualMaterialCfg.from_preset( + name, uid=f"preset_{name}", **args.material_params + ) + desc = _asset_desc_from_cfg(cfg, cfg.uid) + try: + _validate_backend(desc, args.renderer) + except ValueError as error: + if not args.compatible_only: + raise ValueError( + f"{error} Use --all --compatible-only to explicitly select supported presets." + ) from error + skipped.append({"name": name, "reason": str(error)}) + else: + configs.append(cfg) + if not configs: + raise ValueError( + "No selected presets support this renderer and parameter combination" + ) + return configs, skipped + + +def _write_galleries(output: Path, rows: list[dict[str, Any]], renderer: str) -> None: + """Export captured images without changing their rendering settings. + + Args: + output: Directory containing the preset PNG captures. + rows: Material records from the completed rendering run. + renderer: Renderer name shown in gallery captions. + """ + import math + from importlib.metadata import version + import matplotlib + from PIL import Image + from embodichain.data import get_default_material_info + + matplotlib.use("Agg") + from matplotlib import pyplot as plt + + for row in rows: + with Image.open(output / f"{row['name']}_preset.png") as capture: + capture.save(output / f"{row['name']}.webp", quality=92) + groups = { + "default-materials": (rows, 6), + "builtin-materials": ([row for row in rows if row["source"] == "builtin"], 3), + "surface-materials": ( + [ + row + for row in rows + if row["source"] == "resource" + and len(get_default_material_info(row["name"])["renderers"]) > 1 + ], + 5, + ), + "advanced-materials": ( + [ + row + for row in rows + if row["source"] == "resource" + and get_default_material_info(row["name"])["renderers"] == ["rt"] + ], + 4, + ), + } + for filename, (records, columns) in groups.items(): + if not records: + continue + columns = min(columns, len(records)) + count_rows = math.ceil(len(records) / columns) + fig, axes = plt.subplots( + count_rows, + columns, + figsize=(3.2 * columns, 3.5 * count_rows), + squeeze=False, + facecolor="#171b20", + ) + for axis in axes.flat: + axis.axis("off") + for axis, row in zip(axes.flat, records): + with Image.open(output / f"{row['name']}_preset.png") as capture: + axis.imshow(capture.copy()) + axis.set_title(row["name"], fontsize=11, color="white", pad=6) + renderer_label = {"rt": "OfflineRT", "hybrid": "Hybrid", "fast-rt": "FastRT"}[ + renderer + ] + fig.suptitle( + f"Default materials · DexSim {version('dexsim-engine')} · {renderer_label}", + color="white", + fontsize=15, + ) + fig.tight_layout(rect=(0, 0, 1, 0.95)) + fig.savefig( + output / f"{filename}.webp", + dpi=160, + facecolor=fig.get_facecolor(), + pil_kwargs={"quality": 90}, + ) + plt.close(fig) + + +def _render_materials( + args: argparse.Namespace, + configs: list[VisualMaterialCfg], + skipped: list[dict[str, str]], +) -> list[dict[str, Any]]: + """Capture one fixed studio scene, optionally retaining its native viewer.""" + from embodichain.data import get_default_material_info + import cv2 + import numpy as np + import dexsim.render as render + from importlib.metadata import version + from embodichain.lab.sim import ( + SimulationManager, + SimulationManagerCfg, + VisualMaterialCfg, + ) + from embodichain.lab.sim.cfg import DenoisingCfg, RenderCfg + from embodichain.data.assets.materials import DefaultMaterials + + args.output.mkdir(parents=True, exist_ok=True) + sim = SimulationManager( + SimulationManagerCfg( + headless=True, + gpu_id=args.gpu_id, + device="cpu", + scene_node_capacity=256, + startup_summary="off", + render_cfg=RenderCfg( + renderer=args.renderer, + spp=args.spp, + min_bounces=3, + max_bounces=14, + tone_mapping_enabled=True, + tone_mapping_exposure=0.9, + denoising=DenoisingCfg(window="optix", offscreen="optix"), + ), + ) + ) + world, env = sim.get_world(), sim.get_env() + camera = sample = inner = native = material = None + reference_files = None + rows: list[dict[str, Any]] = [] + try: + sim.enable_physics(False) + sim.set_emission_light([0.85, 0.9, 1.0], 24.0) + # Independent, fixed scene: colored cards reveal transmission, broad + # rectangular lights reveal roughness and normal-map direction. + for index, (x, color) in enumerate( + ( + (-0.85, [0.8, 0.06, 0.02, 1]), + (0.0, [0.8, 0.8, 0.8, 1]), + (0.85, [0.02, 0.18, 0.8, 1]), + ) + ): + card = env.create_cube(0.7, 0.04, 1.9) + card.set_name(f"preview_card_{index}") + card.set_location(x, 1.1, 0.95) + card_material = sim.create_visual_material( + VisualMaterialCfg(uid=f"card_{index}", base_color=color, roughness=0.6) + ) + card.set_material(card_material.inst.mat) + if index == 1: + yy, xx = np.indices((256, 256)) + checks = ((xx // 32 + yy // 32) % 2)[..., None] + pixels = np.where(checks, [225, 225, 225], [45, 45, 45]).astype( + np.uint8 + ) + texture = env.create_color_texture(pixels, has_alpha=False) + card_material.inst.set_base_color_texture(texture_obj=texture) + for name, location, direction, color, power in ( + ("key", (-2, -2, 3), (2, 2, -2), (1, 0.85, 0.7), 90), + ("fill", (2, 0, 3), (-2, 0, -2), (0.6, 0.8, 1), 60), + ): + light = env.create_light(name, render.LightType.RECT) + light.set_location(*location) + light.set_direction(*direction) + light.set_color(*color) + light.set_intensity(power) + light.set_rect_wh(1.8, 1.1) + camera = env.create_camera( + "material_camera", args.size, args.size, True, render.ViewFlags.COLOR + ) + camera.set_near(0.02) + camera.set_far(20) + focal = args.size * 1.4 + camera.set_intrinsic( + np.array( + [[focal, 0, args.size / 2], [0, focal, args.size / 2], [0, 0, 1]], + dtype=np.float32, + ) + ) + camera.look_at([1.5, -3.8, 1.8], [0, 0, 0.8], [0, 0, 1]) + camera.open_camera() + source = None + reference_files = ( + TemporaryDirectory(prefix="ec-material-reference-") + if args.compare_native + else None + ) + for cfg in configs: + name = cfg.preset + info = get_default_material_info(name) + started = perf_counter() + material = sim.create_visual_material(cfg) + load_ms = (perf_counter() - started) * 1000 + if sample is not None: + env.remove_actor(sample) + if inner is not None: + env.remove_actor(inner) + inner = None + skin_segments = None + if name == "SkinHumanLight" and args.model: + if not args.model.is_file(): + raise FileNotFoundError(args.model) + sample = env.load_actor(str(args.model.resolve()), False, False) + env.attach(sample.node) + world.update(0.0) + body = sample.get_render_body() + skin_segments = [ + i + for i in range(body.get_mesh_count()) + if "skin" in body.get_segment_name(i).lower() + ] + if ( + not skin_segments + and body.get_mesh_count() == 8 + and all(not body.get_segment_name(i) for i in range(8)) + ): + skin_segments = [0, 1] # Explicit SkinFaceDemo GLB-order fallback. + if not skin_segments: + raise ValueError("The supplied face model has no Skin_* segments.") + camera.look_at([0.19, -0.69, 0.165], [0, 0, 0.10], [0, 0, 1]) + else: + category = get_default_material_info(name)["category"] + sample = ( + env.create_cube(1.3, 0.16, 1.3) + if category in {"architecture", "wood", "stone", "ground"} + else env.create_sphere(0.66, 96, 3, 2) + ) + sample.set_location(0, 0, 0.8) + sample.set_name(f"preview_{name}") + camera.look_at([1.5, -3.8, 1.8], [0, 0, 0.8], [0, 0, 1]) + if name == "SoapBubble": + # Geometry stays here: a smaller reversed-axis shell supplies + # the air-facing interface. UVs and nominal sizes are untouched. + inner = env.create_sphere(0.66, 96, 3, 2) + inner.set_name("preview_inner_shell") + inner.set_location(0, 0, 0.8) + inner.set_scale(-0.975, 0.975, 0.975) + + def bind(instance: Any, inner_instance: Any | None = None) -> None: + if skin_segments is None: + sample.set_material(instance) + else: + for segment in skin_segments: + sample.get_render_body().set_mesh_material(segment, instance) + if inner is not None: + inner.set_material(inner_instance) + + def capture(label: str) -> Any: + for _ in range(args.frames): + world.update(0.0) + camera.render(render.ViewFlags.COLOR, render.ViewFlags.COLOR, False) + rgb = np.ascontiguousarray(camera.get_rgb_map()[..., :3]) + saved = cv2.imwrite( + str(args.output / f"{name}_{label}.png"), + cv2.cvtColor(rgb, cv2.COLOR_RGB2BGR), + ) + if not saved: + raise RuntimeError( + f"Cannot save {name}_{label}.png to {args.output}." + ) + return rgb + + inner_material = ( + sim.create_visual_material( + VisualMaterialCfg.from_preset( + "SoapBubbleInterior", uid="bubble_inner" + ) + ) + if inner is not None + else None + ) + bind(material.inst.mat, inner_material.inst.mat if inner_material else None) + packaged = capture("preset") + row: dict[str, Any] = { + "name": name, + "load_ms": load_ms, + "ior": material.inst.ior, + "roughness": material.inst.roughness, + "metallic": material.inst.mat.get_metallic(), + "transmission": material.inst.mat.get_transmission(), + "base_color": material.inst.base_color, + "native_match": None, + "source": info["source"], + "revision": info["revision"], + "config": cfg.to_dict(), + "geometry": ( + "segmented-face" + if skin_segments is not None + else ( + "double-shell" + if inner is not None + else ( + "slab" + if info["category"] + in {"architecture", "wood", "stone", "ground"} + else "sphere" + ) + ) + ), + } + if args.compare_native: + if info["source"] == "builtin": + reference_path = Path(reference_files.name) / name + reference_path.mkdir() + # Direct native baseline uses the authored definition, + # without the runtime resolver or Python default setters. + (reference_path / "material.json").write_text( + json.dumps( + { + "schema_version": 1, + "parameters": info["parameters"], + "textures": {}, + } + ), + encoding="utf-8", + ) + else: + if source is None: + source = DefaultMaterials() + reference_path = Path(source.get_material_path(name)) + native = env.load_material(str(reference_path), f"reference_{name}") + native_inner = ( + env.load_material( + source.get_material_path("SoapBubbleInterior"), + "reference_inner", + ) + if inner is not None + else None + ) + bind( + native.get_inst(), native_inner.get_inst() if native_inner else None + ) + reference = capture("native") + repeat = capture("native_repeat") + crop = np.s_[ + args.size // 4 : 3 * args.size // 4, + args.size // 4 : 3 * args.size // 4, + :, + ] + difference = float( + np.sqrt( + np.mean( + ( + packaged[crop].astype(float) + - reference[crop].astype(float) + ) + ** 2 + ) + ) + ) + noise = float( + np.sqrt( + np.mean( + (repeat[crop].astype(float) - reference[crop].astype(float)) + ** 2 + ) + ) + ) + row.update( + rmse=difference, + native_repeat_rmse=noise, + threshold=max(3.0, 3 * noise + 0.5), + native_match=difference <= max(3.0, 3 * noise + 0.5), + ) + for getter in ( + "get_ior", + "get_roughness", + "get_metallic", + "get_transmission", + "get_base_color", + ): + actual, expected = ( + getattr(material.inst.mat, getter)(), + getattr(native.get_inst(), getter)(), + ) + matches = ( + expected is actual + if expected is None or actual is None + else np.allclose(actual, expected, atol=1e-5) + ) + if not matches: + raise AssertionError((name, getter, actual, expected)) + if not row["native_match"]: + raise AssertionError(row) + bind(material.inst.mat, inner_material.inst.mat if inner_material else None) + rows.append(row) + print(json.dumps(row), flush=True) + report = { + "schema_version": 1, + "scene": "material-studio-v1", + "renderer": args.renderer, + "dexsim": version("dexsim-engine"), + "size": args.size, + "frames": args.frames, + "spp": args.spp, + "materials": rows, + "skipped_materials": skipped, + "model": str(args.model) if args.model is not None else None, + } + (args.output / "results.json").write_text( + json.dumps(report, indent=2) + "\n", encoding="utf-8" + ) + if not args.headless and not args.all: + from embodichain.lab.scripts._preview import _run_preview_loop + + sim.prepare() + if not sim.open_window(): + raise RuntimeError( + "The native material-preview window could not be opened" + ) + eye, target = ( + ([0.19, -0.69, 0.165], [0, 0, 0.10]) + if args.model is not None + else ([1.5, -3.8, 1.8], [0, 0, 0.8]) + ) + world.get_windows().set_look_at(eye, target, [0, 0, 1]) + print( + "Material preview ready. Press Ctrl+C to exit.", + file=sys.stderr, + flush=True, + ) + _run_preview_loop(sim, None, interactive=True, max_steps=args.max_steps) + finally: + try: + if camera is not None: + camera.close_camera() + finally: + try: + sim.destroy(exit_process=False) + finally: + if reference_files is not None: + reference_files.cleanup() + return rows + + +def main(args: argparse.Namespace) -> None: + """Query or preview default materials using the production preset resolver. + + Args: + args: Parsed material-preview arguments. Batch mode always exports + without a window; single previews use one unless headless is set. + + Raises: + ValueError: Selection, override or renderer requirements are invalid. + OSError: A supplied model or output directory cannot be accessed. + RuntimeError: Native rendering or window creation fails. + AssertionError: A requested direct-native comparison fails. + """ + from embodichain._material_catalog import ( + get_default_material_info, + list_default_materials, + ) + + if args.list: + for name in list_default_materials(): + info = get_default_material_info(name) + if args.source == "all" or info["source"] == args.source: + print(json.dumps(info)) + return + configs, skipped = _select_materials(args) + for item in skipped: + print(f"Skipping {item['name']}: {item['reason']}", file=sys.stderr) + from embodichain.lab.sim import SimulationManager + + failure: BaseException | None = None + try: + rows = _render_materials(args, configs, skipped) + except BaseException as error: + # Native views in unwound frames must be released before deferred World + # destruction. Preserve the original error while clearing its views. + pending = [error] + seen: set[int] = set() + while pending: + current = pending.pop() + if id(current) in seen: + continue + seen.add(id(current)) + traceback.clear_frames(current.__traceback__) + pending.extend( + cause + for cause in (current.__cause__, current.__context__) + if cause is not None + ) + failure = error.with_traceback(None) + try: + SimulationManager.flush_cleanup_queue() + except BaseException as error: + if failure is None: + raise + print( + f"Deferred preview cleanup failed after {failure!r}: {error!r}", + file=sys.stderr, + ) + if failure is not None: + raise failure + if args.gallery: + _write_galleries(args.output, rows, args.renderer) + + +def cli(argv: Sequence[str] | None = None) -> None: + """Run the material-preview command. + + Args: + argv: Arguments excluding the command name, or None for sys.argv. + """ + parser = _create_parser() + args = parser.parse_args(argv) + try: + main(args) + except (ValueError, TypeError, OSError) as error: + parser.error(str(error)) + + +if __name__ == "__main__": + cli() diff --git a/examples/sim/rendering/default_materials.py b/examples/sim/rendering/default_materials.py index da06b6e2c..bc1240533 100644 --- a/examples/sim/rendering/default_materials.py +++ b/examples/sim/rendering/default_materials.py @@ -14,482 +14,18 @@ # limitations under the License. # ---------------------------------------------------------------------------- -"""Preview packaged materials and compare them with direct native loading. +"""Export default material previews through the production preview-material CLI. -Run ``python examples/sim/rendering/default_materials.py --list`` for offline -metadata. Use ``--all --compare-native --renderer rt`` for optical qualification, -and repeat with ``hybrid`` / ``fast-rt`` for the compatible materials. Each -renderer must run in a separate process. Scene geometry, lighting and cameras -belong to this example; the material factory only loads material definitions. +This example retains its headless default. Use ``embodichain preview-material`` +for a native window, or pass ``--no-headless`` here. Use ``--all --compatible-only`` +when intentionally exporting only the presets supported by Hybrid or FastRT. """ from __future__ import annotations -import argparse -import json -from pathlib import Path -from tempfile import TemporaryDirectory -from time import perf_counter -from typing import Any - - -def build_parser() -> argparse.ArgumentParser: - """Build preview options before importing simulator dependencies.""" - parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument("--list", action="store_true") - parser.add_argument("--all", action="store_true") - parser.add_argument( - "--source", - choices=("all", "builtin", "resource"), - default="all", - help="Filter --all by built-in parameters or downloadable resources.", - ) - parser.add_argument("--material", default="GlassClear") - parser.add_argument("--renderer", choices=("rt", "hybrid", "fast-rt"), default="rt") - parser.add_argument("--compare-native", action="store_true") - parser.add_argument( - "--gallery", - action="store_true", - help="Export WebP previews and grouped galleries.", - ) - parser.add_argument( - "--model", - type=Path, - help="Optional segmented skin face GLB; not part of the material package.", - ) - parser.add_argument( - "--output", type=Path, default=Path("outputs/default-materials") - ) - parser.add_argument("--size", type=int, default=320) - parser.add_argument("--frames", type=int, default=4) - parser.add_argument("--spp", type=int, default=16) - return parser - - -def write_galleries(output: Path, rows: list[dict[str, Any]], renderer: str) -> None: - """Export captured images without changing their rendering settings. - - Args: - output: Directory containing the preset PNG captures. - rows: Material records from the completed rendering run. - renderer: Renderer name shown in gallery captions. - """ - import math - from importlib.metadata import version - import matplotlib - from PIL import Image - from embodichain.data import get_default_material_info - - matplotlib.use("Agg") - from matplotlib import pyplot as plt - - for row in rows: - with Image.open(output / f"{row['name']}_preset.png") as capture: - capture.save(output / f"{row['name']}.webp", quality=92) - groups = { - "default-materials": (rows, 6), - "builtin-materials": ([row for row in rows if row["source"] == "builtin"], 3), - "surface-materials": ( - [ - row - for row in rows - if row["source"] == "resource" - and len(get_default_material_info(row["name"])["renderers"]) > 1 - ], - 5, - ), - "advanced-materials": ( - [ - row - for row in rows - if row["source"] == "resource" - and get_default_material_info(row["name"])["renderers"] == ["rt"] - ], - 4, - ), - } - for filename, (records, columns) in groups.items(): - if not records: - continue - columns = min(columns, len(records)) - count_rows = math.ceil(len(records) / columns) - fig, axes = plt.subplots( - count_rows, - columns, - figsize=(3.2 * columns, 3.5 * count_rows), - squeeze=False, - facecolor="#171b20", - ) - for axis in axes.flat: - axis.axis("off") - for axis, row in zip(axes.flat, records): - with Image.open(output / f"{row['name']}_preset.png") as capture: - axis.imshow(capture.copy()) - axis.set_title(row["name"], fontsize=11, color="white", pad=6) - renderer_label = {"rt": "OfflineRT", "hybrid": "Hybrid", "fast-rt": "FastRT"}[ - renderer - ] - fig.suptitle( - f"Default materials · DexSim {version('dexsim-engine')} · {renderer_label}", - color="white", - fontsize=15, - ) - fig.tight_layout(rect=(0, 0, 1, 0.95)) - fig.savefig( - output / f"{filename}.webp", - dpi=160, - facecolor=fig.get_facecolor(), - pil_kwargs={"quality": 90}, - ) - plt.close(fig) - - -def main(args: argparse.Namespace) -> None: - """Render one material or the renderer-compatible catalog with fixed settings.""" - from embodichain.data import get_default_material_info, list_default_materials - - if args.list: - for name in list_default_materials(): - print(json.dumps(get_default_material_info(name))) - return - if min(args.size, args.frames, args.spp) < 1: - raise ValueError("size, frames and spp must be positive") - names = ( - [ - name - for name in list_default_materials() - if args.renderer in get_default_material_info(name)["renderers"] - and ( - args.source == "all" - or get_default_material_info(name)["source"] == args.source - ) - ] - if args.all - else [args.material] - ) - # Validate a single incompatible request through production creation rather - # than changing renderers or silently excluding it. - import cv2 - import numpy as np - import dexsim.render as render - from importlib.metadata import version - from embodichain.lab.sim import ( - SimulationManager, - SimulationManagerCfg, - VisualMaterialCfg, - ) - from embodichain.lab.sim.cfg import DenoisingCfg, RenderCfg - from embodichain.data.assets.materials import DefaultMaterials - - args.output.mkdir(parents=True, exist_ok=True) - sim = SimulationManager( - SimulationManagerCfg( - headless=True, - device="cpu", - scene_node_capacity=256, - startup_summary="off", - render_cfg=RenderCfg( - renderer=args.renderer, - spp=args.spp, - min_bounces=3, - max_bounces=14, - tone_mapping_enabled=True, - tone_mapping_exposure=0.9, - denoising=DenoisingCfg(window="optix", offscreen="optix"), - ), - ) - ) - world, env = sim.get_world(), sim.get_env() - camera = sample = inner = native = material = None - reference_files = None - rows: list[dict[str, Any]] = [] - try: - sim.enable_physics(False) - sim.set_emission_light([0.85, 0.9, 1.0], 24.0) - # Independent, fixed scene: colored cards reveal transmission, broad - # rectangular lights reveal roughness and normal-map direction. - for index, (x, color) in enumerate( - ( - (-0.85, [0.8, 0.06, 0.02, 1]), - (0.0, [0.8, 0.8, 0.8, 1]), - (0.85, [0.02, 0.18, 0.8, 1]), - ) - ): - card = env.create_cube(0.7, 0.04, 1.9) - card.set_name(f"preview_card_{index}") - card.set_location(x, 1.1, 0.95) - card_material = sim.create_visual_material( - VisualMaterialCfg(uid=f"card_{index}", base_color=color, roughness=0.6) - ) - card.set_material(card_material.inst.mat) - if index == 1: - yy, xx = np.indices((256, 256)) - checks = ((xx // 32 + yy // 32) % 2)[..., None] - pixels = np.where(checks, [225, 225, 225], [45, 45, 45]).astype( - np.uint8 - ) - texture = env.create_color_texture(pixels, has_alpha=False) - card_material.inst.set_base_color_texture(texture_obj=texture) - for name, location, direction, color, power in ( - ("key", (-2, -2, 3), (2, 2, -2), (1, 0.85, 0.7), 90), - ("fill", (2, 0, 3), (-2, 0, -2), (0.6, 0.8, 1), 60), - ): - light = env.create_light(name, render.LightType.RECT) - light.set_location(*location) - light.set_direction(*direction) - light.set_color(*color) - light.set_intensity(power) - light.set_rect_wh(1.8, 1.1) - camera = env.create_camera( - "material_camera", args.size, args.size, True, render.ViewFlags.COLOR - ) - camera.set_near(0.02) - camera.set_far(20) - focal = args.size * 1.4 - camera.set_intrinsic( - np.array( - [[focal, 0, args.size / 2], [0, focal, args.size / 2], [0, 0, 1]], - dtype=np.float32, - ) - ) - camera.look_at([1.5, -3.8, 1.8], [0, 0, 0.8], [0, 0, 1]) - camera.open_camera() - source = None - reference_files = ( - TemporaryDirectory(prefix="ec-material-reference-") - if args.compare_native - else None - ) - for name in names: - info = get_default_material_info(name) - started = perf_counter() - material = sim.create_visual_material( - VisualMaterialCfg.from_preset(name, uid=f"preset_{name}") - ) - load_ms = (perf_counter() - started) * 1000 - if sample is not None: - env.remove_actor(sample) - if inner is not None: - env.remove_actor(inner) - inner = None - skin_segments = None - if name == "SkinHumanLight" and args.model: - if not args.model.is_file(): - raise FileNotFoundError(args.model) - sample = env.load_actor(str(args.model.resolve()), False, False) - env.attach(sample.node) - world.update(0.0) - body = sample.get_render_body() - skin_segments = [ - i - for i in range(body.get_mesh_count()) - if "skin" in body.get_segment_name(i).lower() - ] - if ( - not skin_segments - and body.get_mesh_count() == 8 - and all(not body.get_segment_name(i) for i in range(8)) - ): - skin_segments = [0, 1] # Explicit SkinFaceDemo GLB-order fallback. - if not skin_segments: - raise ValueError("The supplied face model has no Skin_* segments.") - camera.look_at([0.19, -0.69, 0.165], [0, 0, 0.10], [0, 0, 1]) - else: - category = get_default_material_info(name)["category"] - sample = ( - env.create_cube(1.3, 0.16, 1.3) - if category in {"architecture", "wood", "stone", "ground"} - else env.create_sphere(0.66, 96, 3, 2) - ) - sample.set_location(0, 0, 0.8) - sample.set_name(f"preview_{name}") - camera.look_at([1.5, -3.8, 1.8], [0, 0, 0.8], [0, 0, 1]) - if name == "SoapBubble": - # Geometry stays here: a smaller reversed-axis shell supplies - # the air-facing interface. UVs and nominal sizes are untouched. - inner = env.create_sphere(0.66, 96, 3, 2) - inner.set_name("preview_inner_shell") - inner.set_location(0, 0, 0.8) - inner.set_scale(-0.975, 0.975, 0.975) - - def bind(instance: Any, inner_instance: Any | None = None) -> None: - if skin_segments is None: - sample.set_material(instance) - else: - for segment in skin_segments: - sample.get_render_body().set_mesh_material(segment, instance) - if inner is not None: - inner.set_material(inner_instance) - - def capture(label: str) -> Any: - for _ in range(args.frames): - world.update(0.0) - camera.render(render.ViewFlags.COLOR, render.ViewFlags.COLOR, False) - rgb = np.ascontiguousarray(camera.get_rgb_map()[..., :3]) - saved = cv2.imwrite( - str(args.output / f"{name}_{label}.png"), - cv2.cvtColor(rgb, cv2.COLOR_RGB2BGR), - ) - if not saved: - raise RuntimeError( - f"Cannot save {name}_{label}.png to {args.output}." - ) - return rgb - - inner_material = ( - sim.create_visual_material( - VisualMaterialCfg.from_preset( - "SoapBubbleInterior", uid="bubble_inner" - ) - ) - if inner is not None - else None - ) - bind(material.inst.mat, inner_material.inst.mat if inner_material else None) - packaged = capture("preset") - row: dict[str, Any] = { - "name": name, - "load_ms": load_ms, - "ior": material.inst.ior, - "roughness": material.inst.roughness, - "metallic": material.inst.mat.get_metallic(), - "transmission": material.inst.mat.get_transmission(), - "base_color": material.inst.base_color, - "native_match": None, - "source": info["source"], - } - if args.compare_native: - if info["source"] == "builtin": - reference_path = Path(reference_files.name) / name - reference_path.mkdir() - # Direct native baseline uses the authored definition, - # without the runtime resolver or Python default setters. - (reference_path / "material.json").write_text( - json.dumps( - { - "schema_version": 1, - "parameters": info["parameters"], - "textures": {}, - } - ), - encoding="utf-8", - ) - else: - if source is None: - source = DefaultMaterials() - reference_path = Path(source.get_material_path(name)) - native = env.load_material(str(reference_path), f"reference_{name}") - native_inner = ( - env.load_material( - source.get_material_path("SoapBubbleInterior"), - "reference_inner", - ) - if inner is not None - else None - ) - bind( - native.get_inst(), native_inner.get_inst() if native_inner else None - ) - reference = capture("native") - repeat = capture("native_repeat") - crop = np.s_[ - args.size // 4 : 3 * args.size // 4, - args.size // 4 : 3 * args.size // 4, - :, - ] - difference = float( - np.sqrt( - np.mean( - ( - packaged[crop].astype(float) - - reference[crop].astype(float) - ) - ** 2 - ) - ) - ) - noise = float( - np.sqrt( - np.mean( - (repeat[crop].astype(float) - reference[crop].astype(float)) - ** 2 - ) - ) - ) - row.update( - rmse=difference, - native_repeat_rmse=noise, - threshold=max(3.0, 3 * noise + 0.5), - native_match=difference <= max(3.0, 3 * noise + 0.5), - ) - for getter in ( - "get_ior", - "get_roughness", - "get_metallic", - "get_transmission", - "get_base_color", - ): - actual, expected = ( - getattr(material.inst.mat, getter)(), - getattr(native.get_inst(), getter)(), - ) - if expected is None or actual is None: - assert expected is actual, (name, getter, actual, expected) - else: - assert np.allclose(actual, expected, atol=1e-5), ( - name, - getter, - actual, - expected, - ) - assert row["native_match"], row - rows.append(row) - print(json.dumps(row), flush=True) - # Exercise every unsupported advanced preset before native loading in - # real-time processes, including an advanced variation of a basic one. - rejected = [] - if args.renderer != "rt": - for name in list_default_materials(): - if args.renderer not in get_default_material_info(name)["renderers"]: - try: - sim.create_visual_material(VisualMaterialCfg.from_preset(name)) - except ValueError: - rejected.append(name) - else: - raise AssertionError(f"Backend accepted advanced preset {name}") - try: - sim.create_visual_material( - VisualMaterialCfg.from_preset( - "BrickRed", parameters={"clearcoat": 0.0} - ) - ) - except ValueError: - rejected.append("BrickRed:clearcoat") - else: - raise AssertionError("Backend accepted an advanced parameter variation") - report = { - "renderer": args.renderer, - "dexsim": version("dexsim-engine"), - "size": args.size, - "frames": args.frames, - "spp": args.spp, - "materials": rows, - "backend_rejections": rejected, - } - (args.output / "results.json").write_text( - json.dumps(report, indent=2) + "\n", encoding="utf-8" - ) - finally: - if camera is not None: - camera.close_camera() - sim.destroy(exit_process=False) - del sample, inner, native, material, camera - if reference_files is not None: - reference_files.cleanup() - SimulationManager.flush_cleanup_queue() - if args.gallery: - write_galleries(args.output, rows, args.renderer) +import sys +from embodichain.lab.scripts.preview_material import cli if __name__ == "__main__": - main(build_parser().parse_args()) + cli(["--headless", *sys.argv[1:]]) diff --git a/tests/lab/scripts/test_preview_material.py b/tests/lab/scripts/test_preview_material.py new file mode 100644 index 000000000..63f5f14be --- /dev/null +++ b/tests/lab/scripts/test_preview_material.py @@ -0,0 +1,233 @@ +# ---------------------------------------------------------------------------- +# Copyright (c) 2021-2026 DexForce Technology Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ---------------------------------------------------------------------------- + +"""Material-preview CLI selection, offline discovery and resource boundaries.""" + +from __future__ import annotations + +import json +import os +from pathlib import Path +import subprocess +import sys + +import pytest + +from embodichain.lab.scripts import preview_material + +pytestmark = pytest.mark.no_sim +_ROOT = Path(__file__).resolve().parents[3] + + +@pytest.mark.parametrize("option", ["--help", "--list"]) +def test_catalog_commands_need_no_native_imports_or_downloads(tmp_path, option) -> None: + script = f""" +import importlib.abc +import socket +import sys +sys.path.insert(0, {_ROOT.as_posix()!r}) +class NoRendering(importlib.abc.MetaPathFinder): + def find_spec(self, fullname, *args): + if fullname.split('.')[0] in {{'dexsim', 'torch', 'numpy', 'cv2', 'PIL', 'matplotlib'}}: + raise AssertionError('Catalog query imported ' + fullname) +sys.meta_path.insert(0, NoRendering()) +def no_network(*args, **kwargs): + raise AssertionError('Catalog query used the network') +socket.socket.connect = no_network +from embodichain.cli.main import main +main(['preview-material', {option!r}]) +""" + result = subprocess.run( + [sys.executable, "-I", "-c", script], + cwd=tmp_path, + env={**os.environ, "EMBODICHAIN_DATA_ROOT": str(tmp_path / "assets")}, + text=True, + capture_output=True, + timeout=30, + check=True, + ) + if option == "--list": + records = [json.loads(line) for line in result.stdout.splitlines()] + assert len(records) == 24 + assert {record["source"] for record in records} == {"builtin", "resource"} + assert "SoapBubbleInterior" not in {record["name"] for record in records} + else: + assert "usage: embodichain preview-material" in result.stdout + assert "--material-params" in result.stdout + assert not (tmp_path / "assets").exists() + assert not (tmp_path / "outputs").exists() + + +def test_list_source_filter_is_offline(capsys) -> None: + preview_material.cli(["--list", "--source", "builtin"]) + records = [json.loads(line) for line in capsys.readouterr().out.splitlines()] + assert len(records) == 6 + assert all(record["requires_download"] is False for record in records) + + +@pytest.fixture +def captures(monkeypatch): + from embodichain.lab.sim import SimulationManager + + calls = [] + monkeypatch.setattr(SimulationManager, "flush_cleanup_queue", lambda: None) + + def render(args, configs, skipped): + calls.append((args, configs, skipped)) + return [] + + monkeypatch.setattr(preview_material, "_render_materials", render) + return calls + + +def test_default_preview_inherits_authored_fields_and_requests_window(captures) -> None: + preview_material.cli([]) + args, configs, skipped = captures[0] + assert args.renderer == "rt" and args.headless is False + assert configs[0].preset == "GlassClear" and configs[0].ior is None + assert configs[0].parameters == {} and skipped == [] + + +def test_overrides_keep_explicit_zero_false_and_none(captures) -> None: + preview_material.cli( + [ + "--material", + "GlassClear", + "--headless", + "--material-params", + '{"ior":null,"roughness":0,"parameters":{"thin_walled":false,"volume_attenuation_distance":8}}', + ] + ) + args, configs, skipped = captures[0] + cfg = configs[0] + assert args.headless and not skipped + assert cfg.ior is None and cfg.roughness == 0 + assert cfg.parameters == {"thin_walled": False, "volume_attenuation_distance": 8} + + +@pytest.mark.parametrize( + "argv, message", + [ + (["--all", "--material", "GlassClear"], "not allowed"), + (["--material-params", "[]"], "JSON object"), + (["--material-params", "{broken"], "JSON object"), + (["--material-params", '{"uid":"caller"}'], "preview UIDs"), + (["--spp", "0"], "positive integer"), + (["--renderer", "no-render"], "invalid choice"), + (["--headless", "--max-steps", "1"], "native-window"), + (["--source", "builtin"], "requires --list or --all"), + (["--compatible-only"], "requires --all"), + (["--compare-native", "--material-params", '{"ior":1.6}'], "authored presets"), + (["--material", "unknown"], "Unknown default material"), + (["--renderer", "hybrid"], "requires renderer='rt'"), + (["--all", "--renderer", "fast-rt"], "requires renderer='rt'"), + ( + ["--material-params", '{"roughness":0,"parameters":{"roughness":0.1}}'], + "Duplicate", + ), + (["--material-params", '{"parameters":{"transmission":-1}}'], "Invalid visual"), + ( + ["--material-params", '{"material_type":"BSDF"}'], + "cannot specify material_type", + ), + ( + [ + "--material", + "PlasticMatteBlue", + "--renderer", + "hybrid", + "--material-params", + '{"parameters":{"clearcoat":0}}', + ], + "requires renderer='rt'", + ), + ( + [ + "--all", + "--compatible-only", + "--renderer", + "hybrid", + "--material-params", + '{"parameters":{"clearcoat":0}}', + ], + "No selected presets", + ), + ], +) +def test_invalid_requests_fail_before_rendering( + captures, capsys, argv, message +) -> None: + with pytest.raises(SystemExit) as error: + preview_material.cli(argv) + assert error.value.code == 2 + assert message in capsys.readouterr().err + assert not captures + + +@pytest.mark.parametrize("renderer", ["hybrid", "fast-rt"]) +def test_explicit_compatible_batch_reports_every_skipped_preset( + captures, capsys, renderer +) -> None: + preview_material.cli(["--all", "--compatible-only", "--renderer", renderer]) + args, configs, skipped = captures[0] + assert args.all + assert {cfg.preset for cfg in configs} == { + "PlasticMatteBlue", + "PlasticGlossyRed", + "GoldMetal", + "MirrorMetal", + "BrickRed", + "WoodOak", + "CeramicTileWhite", + "MarbleWhite", + "AsphaltDark", + "FabricGray", + "LeatherBrown", + "PlasticABSBlack", + "RubberBlack", + "SteelBrushed", + } + assert {item["name"] for item in skipped} == { + "GlassClearSurface", + "GlassFrostedSurface", + "ChromePolished", + "GoldPolished", + "CopperPolished", + "GlassClear", + "GlassFrosted", + "GlassSmoke", + "SkinHumanLight", + "SoapBubble", + } + stderr = capsys.readouterr().err + assert all(f"Skipping {item['name']}:" in stderr for item in skipped) + + +def test_render_failure_still_drains_native_cleanup(monkeypatch) -> None: + from embodichain.lab.sim import SimulationManager + + flushed = [] + + def fail(*args): + raise RuntimeError("capture failed") + + monkeypatch.setattr(preview_material, "_render_materials", fail) + monkeypatch.setattr( + SimulationManager, "flush_cleanup_queue", lambda: flushed.append(True) + ) + with pytest.raises(RuntimeError, match="capture failed"): + preview_material.cli(["--headless", "--material", "PlasticMatteBlue"]) + assert flushed == [True] diff --git a/tests/test_main.py b/tests/test_main.py index e2e2c4f35..732324f4a 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -45,6 +45,7 @@ "show-task", "preview-asset", "preview-robot", + "preview-material", "preview_lerobot_data", "run-task", "run-example", From 737e49e21fe794d5663c6cf8a17e20e28b7ffaed Mon Sep 17 00:00:00 2001 From: yuecideng Date: Fri, 23 Oct 2026 23:46:55 +0800 Subject: [PATCH 09/10] test(sim): declare renderer for deformable scene stub --- tests/sim/objects/test_deformable_object.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/sim/objects/test_deformable_object.py b/tests/sim/objects/test_deformable_object.py index 01867fd12..0f0a0191e 100644 --- a/tests/sim/objects/test_deformable_object.py +++ b/tests/sim/objects/test_deformable_object.py @@ -216,7 +216,8 @@ def test_manager_declares_deformables_with_supported_solver( add_cloth_object=lambda descriptor: descriptor, ) monkeypatch.setattr("dexsim.spawn.SceneBuilder", lambda _world: builder) - sim._spawn_scene = SpawnScene(object(), num_envs=2) + # This declaration-only World stub has no native renderer query interface. + sim._spawn_scene = SpawnScene(object(), num_envs=2, renderer="hybrid") try: facade = sim.add_deformable_object( From 8c95da01c0614781e7ede4231f7f9ed4b4553158 Mon Sep 17 00:00:00 2001 From: yuecideng Date: Sat, 24 Oct 2026 00:10:57 +0800 Subject: [PATCH 10/10] refactor(sim): select visual scattering from optical parameters --- .../topics/simulation-system/materials.md | 8 +++ .../visual-material-acceptance.md | 10 ++-- .../embodichain.lab.sim.material.rst | 26 +++++++-- docs/source/guides/preview_material.md | 4 +- .../sim/sim_manager/rendering/materials.md | 32 ++++++++++- embodichain/lab/sim/_material_presets.py | 13 ----- embodichain/lab/sim/material.py | 39 +++++-------- .../sim/motion/planners/curobo/curobo_yaml.py | 7 ++- examples/sim/demo/scoop_ice.py | 7 ++- tests/lab/scripts/test_preview_material.py | 2 +- .../motion/planners/test_curobo_planner.py | 11 +++- tests/sim/test_material.py | 57 ++++++++++++++++--- tests/sim/test_material_integration.py | 28 ++++++--- 13 files changed, 166 insertions(+), 78 deletions(-) diff --git a/agent_context/topics/simulation-system/materials.md b/agent_context/topics/simulation-system/materials.md index d1139d4d7..33fc3fe58 100644 --- a/agent_context/topics/simulation-system/materials.md +++ b/agent_context/topics/simulation-system/materials.md @@ -11,6 +11,14 @@ to flat fields so `replace(field=None)` can restore inheritance. Do not infer override intent from equality with a default, or modify generic `configclass` for this policy. +Scattering is parameter-driven in both modes. `VisualMaterialCfg` has no +`material_type` field, and wrappers never force a native BRDF/BTDF/BSDF model. +Basic handwritten materials keep native descriptor creation without a lobe +override; advanced handwritten parameters use the manifest resolver and its +renderer preflight. Dictionary input rejects the removed field rather than +silently losing a legacy transmission choice. Migration examples live in the +material guide linked below. + `_material_presets.py` owns validated schema-v1 overrides, renderer preflight and World-scoped manifest/template caches. `SpawnScene._resolve_materials()` shares that path with runtime creation. Its resource definition registry reserves UIDs diff --git a/docs/architecture/visual-material-acceptance.md b/docs/architecture/visual-material-acceptance.md index 44fac7f67..e4e29e598 100644 --- a/docs/architecture/visual-material-acceptance.md +++ b/docs/architecture/visual-material-acceptance.md @@ -10,7 +10,7 @@ for implementation ownership and lifecycle rules. | Boundary | Required behavior | | --- | --- | | Identity and aliases | Unnamed materials keep independent appearances. Explicit UID conflicts fail across runtime and Spawn creation in either order. Equivalent aliases and repeated instance creation preserve native state. | -| PBR conversion | Both creation paths agree for BRDF/BTDF/BSDF, emission intensities 0/1/10 and nondefault scalar properties. Invalid values fail before native writes. RGBA writes retain alpha; RGB getters cannot verify it. | +| PBR conversion | Both creation paths agree for parameter-driven opaque, reflective and transmitting materials, emission intensities 0/1/10 and nondefault scalars. No explicit native scattering type is written. Invalid values fail before native writes. RGBA writes retain alpha; RGB getters cannot verify it. | | Native handles | Imported and working instances update their exact native handles. Material IDs distinguish different instances with identical names. | | Selection and reset | Empty selections do nothing; invalid indices and partial shared selections fail before writes. Independent updates affect selected environments only. Deterministic rigid-object and group resets restore selected properties. | | Randomization resources | Solid and library tiers honor scalar PBR ranges. Shared instances are mutated once per call. Different source directories remain separate; warmed texture pools and instance registries do not grow on repeated calls. | @@ -58,6 +58,7 @@ In addition to the legacy handwritten-material checks above, qualify the unified | --- | --- | | Inheritance | GlassClear inherits IOR 1.52; explicit 1.5 overrides it. Zero/false are explicit; `replace(ior=None)` restores inheritance. No flat/native duplicate properties or invalid parameters reach native loading. | | Round trips | Constructor, factory, Python/YAML, copy, replace and dictionary round trips retain the preset and unspecified state. Manual construction retains historical concrete defaults. | +| Removed scattering selector | Python construction rejects `material_type`; dictionary/YAML loading reports its removal, including old null values. Serialization emits no selector. Explicit transmission parameters survive native loading, complete reset and topology rebuild. | | Distribution | Offline queries list 24 public presets, including six built-ins without a texture-archive download, with SoapBubbleInterior available explicitly. Build/install a wheel away from the source checkout. With an empty data cache, download the pinned archive; repeat without network, repair a missing/corrupt member, and verify auxiliary texture references. | | Renderer preflight | Ten basic presets load on Hybrid/FastRT/OfflineRT. Eight advanced presets, the helper and advanced parameter variations require OfflineRT. Reject before download/native loading. NoRender preserves declarations and does neither. | | Native resources | Runtime-first and inline-first aliases share exact handles. Different UIDs use separate children of immutable templates. Repeated creation preserves state and bounded native instance counts. Variants stage JSON only, never duplicate PNGs. | @@ -91,8 +92,9 @@ exactly the archive and versioned path documented in the material API. Asset redistribution/provenance must be retained when deploying a mirror. Parameter variants must be created before binding. Qualification does not cover -cross-model hot shader mutation, NRD packaging fixes, automatic geometry/UV -changes or a global removal of the legacy manual `material_type` interface. +cross-model hot shader mutation, NRD packaging fixes or automatic geometry/UV +changes. The public `material_type` selector is removed; legacy configurations +must explicitly describe their intended optical properties. ## Compatibility @@ -111,7 +113,7 @@ changes or a global removal of the legacy manual `material_type` interface. State and lifecycle checks do not establish optical correctness. Before release: -- Compare BRDF/BTDF/BSDF reflection, transmission, alpha and emission intensities +- Compare opaque/metal/mirror/transmitting parameter sets, alpha and emission intensities 0/1/10 in a separate FastRT process with controlled lighting, camera and exposure. - Check multi-material meshes, URDF articulations and deformables across partial reset and rebuilds. Compare file, Tensor and native Texture inputs for color diff --git a/docs/source/api_reference/embodichain/embodichain.lab.sim.material.rst b/docs/source/api_reference/embodichain/embodichain.lab.sim.material.rst index d2f5bb7cb..c50cd44be 100644 --- a/docs/source/api_reference/embodichain/embodichain.lab.sim.material.rst +++ b/docs/source/api_reference/embodichain/embodichain.lab.sim.material.rst @@ -61,10 +61,23 @@ fields during construction, so ``replace(ior=None)`` also clears that form of override. The remaining advanced properties stay in ``parameters``. Specifying the same native property in both places is an error. Unknown, nonfinite, incorrectly typed and out-of-range parameters fail before native -loading. Presets reject ``material_type`` and texture replacement; their native -parameters select scattering. The manual ``material_type`` interface remains -available. Manual configurations with advanced parameters also use a complete -native manifest and retain the manual material-type policy. +loading. Presets reject texture replacement. Both handwritten and preset +materials select scattering from optical parameters; ``material_type`` and +the ``VisualMaterial.RT_MATERIAL_TYPES`` / ``MAT_TYPE_MAPPING`` constants have +been removed. No default BRDF is explicitly written to native instances. +Manual configurations with advanced parameters use a complete native manifest:: + + ice = VisualMaterialCfg( + base_color=[1, 1, 1, 1], roughness=0.2, ior=1.31, + parameters={"transmission": 1.0}, + ) + +Transmission and other advanced handwritten parameters require OfflineRT. +Remove ``material_type`` from stored Python/YAML configurations; ``from_dict`` +rejects the removed key even if its value is ``None``. Legacy BRDF/BTDF/BSDF +labels are not silently converted because their scattering semantics are not +interchangeable. See the +:doc:`migration example `. ``BrickRed``, ``WoodOak``, ``CeramicTileWhite``, ``MarbleWhite``, ``AsphaltDark``, ``FabricGray``, ``LeatherBrown``, ``PlasticABSBlack``, ``RubberBlack`` and @@ -107,8 +120,9 @@ The optional ``SoapBubbleInterior`` auxiliary material references SoapBubble's textures. Hollow bubble shells and segmented skin meshes belong to preview geometry. The factory neither creates those shapes nor changes UVs. ``SkinHumanLight`` approximates diffuse transmission rather than random-walk -subsurface scattering. Run ``examples/sim/rendering/default_materials.py`` for -previews, optional segmented-face geometry and direct-native image comparisons. +subsurface scattering. Use ``embodichain preview-material`` for previews, +optional segmented-face geometry and direct-native image comparisons; see the +:doc:`CLI guide `. .. rubric:: Classes diff --git a/docs/source/guides/preview_material.md b/docs/source/guides/preview_material.md index 14679d9c1..abee9c059 100644 --- a/docs/source/guides/preview_material.md +++ b/docs/source/guides/preview_material.md @@ -47,7 +47,9 @@ embodichain preview-material --material PlasticMatteBlue --headless \ Omitted fields and JSON `null` inherit the preset. Explicit `0` and `false` remain overrides. Duplicate flat/native properties, invalid values, -`material_type` and texture edits fail before creating a World or loading assets. +the removed `material_type` field and texture edits fail before creating a World +or loading assets. Both handwritten and preset configurations now select +scattering from optical parameters; see the catalog's migration example. The command owns material UIDs; select the preset using `--material`. Variants are created before binding. The preview does not depend on native diff --git a/docs/source/overview/sim/sim_manager/rendering/materials.md b/docs/source/overview/sim/sim_manager/rendering/materials.md index a7a36502d..cfd34ae66 100644 --- a/docs/source/overview/sim/sim_manager/rendering/materials.md +++ b/docs/source/overview/sim/sim_manager/rendering/materials.md @@ -40,12 +40,38 @@ glass = VisualMaterialCfg.from_preset( ) ``` -Presets select scattering through native material parameters. Keep variants -pre-created and rebind their instances when changing appearance. The manual -`material_type` interface remains available for handwritten configurations. +Both handwritten materials and presets select scattering through native optical +parameters. Keep variants pre-created and rebind their instances when changing +appearance. `VisualMaterialCfg` no longer exposes `material_type`. See the {doc}`material API ` for UID sharing, validation, copy/replace, reset and lifecycle rules. +### Migrate handwritten materials + +Opaque materials keep their usual base color, metallic, roughness, emission and +IOR defaults. For transmission, specify the optical properties explicitly: + +```python +ice = VisualMaterialCfg( + base_color=[1.0, 1.0, 1.0, 1.0], + roughness=0.2, + ior=1.31, + parameters={"transmission": 1.0}, +) +``` + +This transmitting configuration requires OfflineRT (`renderer="rt"`). Native +parameters select the reflection/transmission model before geometry is bound. +The factory no longer forces a BRDF model on handwritten defaults. + +Remove `material_type` from Python and YAML configurations. Dictionary loading +rejects the removed key, including a serialized `null`, with a migration error. +Old BRDF/BTDF/BSDF labels are not automatically converted: pure transmission and +reflection-plus-transmission have different semantics. Select a glass preset +or specify transmission, IOR, roughness and any required volume/thin-wall +properties for the intended material. `RT_MATERIAL_TYPES` and +`MAT_TYPE_MAPPING` have also been removed from `VisualMaterial`. + ## Built-in parameter presets These six definitions are included in the wheel and **do not download the diff --git a/embodichain/lab/sim/_material_presets.py b/embodichain/lab/sim/_material_presets.py index 2161529a3..feaed7b05 100644 --- a/embodichain/lab/sim/_material_presets.py +++ b/embodichain/lab/sim/_material_presets.py @@ -219,7 +219,6 @@ class _AssetMaterialDesc: parameters_json: str revision: str textures: tuple[tuple[str, str], ...] = () - material_type: str | None = None def template_key(self) -> str: definition = ( @@ -227,7 +226,6 @@ def template_key(self) -> str: self.preset, self.parameters_json, self.textures, - self.material_type, ) return sha256(repr(definition).encode()).hexdigest() @@ -235,10 +233,6 @@ def template_key(self) -> str: def _asset_desc_from_cfg(cfg: VisualMaterialCfg, uid: str) -> _AssetMaterialDesc: if cfg.preset is not None: info = get_default_material_info(cfg.preset) - if cfg.material_type is not None: - raise ValueError( - "Preset materials cannot specify material_type; native parameters select scattering." - ) if any(getattr(cfg, key) is not None for key in _TEXTURE_FIELDS): raise ValueError("Preset texture replacement or removal is not supported.") revision = info["revision"] @@ -257,7 +251,6 @@ def _asset_desc_from_cfg(cfg: VisualMaterialCfg, uid: str) -> _AssetMaterialDesc for field_name, key in _TEXTURE_FIELDS.items() if getattr(cfg, field_name) is not None ), - material_type=cfg.material_type if cfg.preset is None else None, ) @@ -394,12 +387,6 @@ def resolve(self, desc: _AssetMaterialDesc) -> tuple[Any, Any]: raise RuntimeError( f"DexSim could not load material {desc.preset or desc.name!r}." ) - if desc.material_type is not None: - from .material import _MATERIAL_TYPES - - template.get_inst().update_pbr_material_type( - _MATERIAL_TYPES[desc.material_type] - ) self._templates[key] = template template = self._templates[key] instance = template.get_inst(f"ec_instance_{uuid4().hex}") diff --git a/embodichain/lab/sim/material.py b/embodichain/lab/sim/material.py index a623ebf8e..0670a8da6 100644 --- a/embodichain/lab/sim/material.py +++ b/embodichain/lab/sim/material.py @@ -51,6 +51,9 @@ class VisualMaterialCfg: resource value. Serialization retains that distinction. Use :meth:`from_preset` to construct a new preset configuration; ``replace`` preserves existing fields rather than switching configuration sources. + Native scattering is selected by optical parameters, including + ``parameters={"transmission": 1.0}`` for a transmitting material. Explicit + BRDF/BTDF/BSDF model selection is not part of this configuration. """ uid: str | None = None @@ -90,9 +93,6 @@ class VisualMaterialCfg: ior: float | None = None """Index of refraction for PBR materials, only used in ray tracing.""" - material_type: str | None = None - """Ray tracing material type. Options: 'BRDF', 'BTDF', 'BSDF'""" - preset: str | None = None """Default material name. Presets select scattering from native parameters.""" @@ -112,7 +112,6 @@ def __post_init__(self) -> None: "emissive": [0.0, 0.0, 0.0], "emissive_intensity": 1.0, "ior": 1.5, - "material_type": "BRDF", } for key, value in defaults.items(): if getattr(self, key) is None: @@ -144,7 +143,8 @@ def from_preset( Raises: ValueError: A preset, override, duplicate property or texture edit - is invalid. ``material_type`` is unavailable for presets. + is invalid. + TypeError: An unknown configuration field is supplied. """ from embodichain.data.default_materials import get_default_material_info @@ -165,9 +165,19 @@ def from_dict(cls, cfg_dict: dict[str, Any]) -> VisualMaterialCfg: Returns: Configuration with inheritance preserved before defaults are filled. + + Raises: + ValueError: The removed scattering selector or an unknown preset + field is supplied. Describe optical properties explicitly. """ from dataclasses import fields + if "material_type" in cfg_dict: + raise ValueError( + "VisualMaterialCfg.material_type has been removed. Use material " + "parameters such as transmission, roughness, metallic and ior; " + "legacy BTDF/BSDF choices require explicit optical parameters." + ) names = {item.name for item in fields(cls)} values = {} for k, v in cfg_dict.items(): @@ -182,13 +192,6 @@ def from_dict(cls, cfg_dict: dict[str, Any]) -> VisualMaterialCfg: return cls(**values) -_MATERIAL_TYPES = { - "BRDF": "BRDF_GGX_SMITH", - "BTDF": "BTDF_GGX_SMITH", - "BSDF": "BSDF_GGX_SMITH", -} - - def _material_scalar( value: float, name: str, *, lower: float = 0.0, upper: float | None = None ) -> float: @@ -222,8 +225,6 @@ def _material_desc_from_cfg( from ._material_presets import _asset_desc_from_cfg return _asset_desc_from_cfg(cfg, uid) - if cfg.material_type not in _MATERIAL_TYPES: - raise ValueError(f"Invalid visual material_type {cfg.material_type!r}.") if cfg.parameters: from ._material_presets import _asset_desc_from_cfg @@ -250,7 +251,6 @@ def _material_desc_from_cfg( 1.0, ), ior=ior, - material_type=_MATERIAL_TYPES[cfg.material_type], has_alpha=True, ) @@ -262,14 +262,6 @@ class VisualMaterial: It holds multiple material instances, which is used to assign to different objects in the environment. """ - RT_MATERIAL_TYPES = [ - "BRDF", - "BTDF", - "BSDF", - ] - - MAT_TYPE_MAPPING: dict[str, str] = _MATERIAL_TYPES - def __init__( self, cfg: VisualMaterialCfg, @@ -357,7 +349,6 @@ def set_default_properties( mat_inst.set_ao_texture(cfg.ao_texture) mat_inst.set_ior(desc.ior) - mat_inst.mat.update_pbr_material_type(desc.material_type) def create_instance(self, uid: str) -> VisualMaterialInst: """Create a new material instance from this material template. diff --git a/embodichain/lab/sim/motion/planners/curobo/curobo_yaml.py b/embodichain/lab/sim/motion/planners/curobo/curobo_yaml.py index a8132d11d..d76602d50 100644 --- a/embodichain/lab/sim/motion/planners/curobo/curobo_yaml.py +++ b/embodichain/lab/sim/motion/planners/curobo/curobo_yaml.py @@ -924,12 +924,13 @@ def _get_or_create_dexsim_material( if material is None: material = env.create_pbr_material(name) material_inst = material.get_inst() - material_inst.update_pbr_material_type("BSDF_GGX_SMITH") + # Transmission selects the native scattering lobe before actor binding. + # A fourth color component controls the diagnostic shell's opacity. + opacity = color[3] if len(color) == 4 else 0.45 + material_inst.set_transmission(1.0 - opacity) material_inst.set_pbr_param("baseColor", color[0], color[1], color[2]) material_inst.set_pbr_param("roughness", 0.02) material_inst.set_pbr_param("ior", 1.12) - material_inst.set_pbr_param("colorAbsorption", 0.005, 0.005, 0.005) - material_inst.set_pbr_param("scaleAbsorption", 0.01) return material return material diff --git a/examples/sim/demo/scoop_ice.py b/examples/sim/demo/scoop_ice.py index 14d4cfd73..260da2d9c 100644 --- a/examples/sim/demo/scoop_ice.py +++ b/examples/sim/demo/scoop_ice.py @@ -34,6 +34,8 @@ def build_parser() -> argparse.ArgumentParser: """Build CLI options without initializing simulation resources.""" parser = argparse.ArgumentParser(description="Scoop ice task simulation") add_sim_args_to_parser(parser) + # The ice material uses authored transmission and requires OfflineRT. + parser.set_defaults(renderer="rt") add_seed_arg_to_parser(parser, default=0, scope="ice placement") return parser @@ -351,14 +353,13 @@ def create_ice_cubes(sim: SimulationManager): ice_cubes: RigidObjectGroup = sim.add_rigid_object_group(cfg=ice_cubes_cfg) # Set visual material for ice cubes. - # The material below only works for ray tracing backend. - # Set ior to 1.31 and material type to "BSDF" for better ice appearance. + # Explicit optical parameters select ice scattering in OfflineRT. ice_mat = sim.create_visual_material( cfg=VisualMaterialCfg( base_color=[1.0, 1.0, 1.0, 1.0], ior=1.31, roughness=0.2, - material_type="BSDF", + parameters={"transmission": 1.0}, ) ) sim.prepare() diff --git a/tests/lab/scripts/test_preview_material.py b/tests/lab/scripts/test_preview_material.py index 63f5f14be..ccada270e 100644 --- a/tests/lab/scripts/test_preview_material.py +++ b/tests/lab/scripts/test_preview_material.py @@ -141,7 +141,7 @@ def test_overrides_keep_explicit_zero_false_and_none(captures) -> None: (["--material-params", '{"parameters":{"transmission":-1}}'], "Invalid visual"), ( ["--material-params", '{"material_type":"BSDF"}'], - "cannot specify material_type", + "material_type", ), ( [ diff --git a/tests/sim/motion/planners/test_curobo_planner.py b/tests/sim/motion/planners/test_curobo_planner.py index bccdae0e4..80f3dae22 100644 --- a/tests/sim/motion/planners/test_curobo_planner.py +++ b/tests/sim/motion/planners/test_curobo_planner.py @@ -1172,7 +1172,7 @@ class _FakeDexsimMaterial: def __init__(self, name, color): self.name = name self.color = color - self.pbr_type = None + self.transmission = None self.pbr_params = {} def set_base_color(self, color): @@ -1181,8 +1181,8 @@ def set_base_color(self, color): def get_inst(self): return self - def update_pbr_material_type(self, material_type): - self.pbr_type = material_type + def set_transmission(self, value): + self.transmission = value def set_pbr_param(self, name, *values): self.pbr_params[name] = values @@ -1261,6 +1261,9 @@ def test_obstacle_collision_visualization_loads_one_combined_dexsim_actor(): assert bounds.get_extent() == pytest.approx([0.1, 0.1, 0.1]) assert actors[0].material.name == "curobo_world_collision_material" assert actors[0].material.color == [1.0, 0.0, 0.0] + assert actors[0].material.transmission == pytest.approx(0.55) + assert "colorAbsorption" not in actors[0].material.pbr_params + assert "scaleAbsorption" not in actors[0].material.pbr_params def test_combined_collision_visualization_colors_and_cleans_two_actors( @@ -1324,11 +1327,13 @@ def get_link_pose( assert robot_bounds.get_extent() == pytest.approx([0.22, 0.22, 0.22]) assert robot_actor.material.name == "curobo_robot_collision_material" assert robot_actor.material.color == [0.75, 0.75, 1.0] + assert robot_actor.material.transmission == pytest.approx(0.55) obstacle_bounds = obstacle_actor.mesh.get_axis_aligned_bounding_box() assert obstacle_bounds.get_center() == pytest.approx([2.0, 2.0, 3.0]) assert obstacle_bounds.get_extent() == pytest.approx([0.1, 0.1, 0.1]) assert obstacle_actor.material.name == "curobo_world_collision_material" assert obstacle_actor.material.color == [1.0, 0.75, 0.75] + assert obstacle_actor.material.transmission == pytest.approx(0.55) assert env.removed_actors == list(reversed(env.actors)) assert all(not Path(path).exists() for path in env.loaded_paths) assert "Showing 2 cuRobo collision spheres" in prompts[0] diff --git a/tests/sim/test_material.py b/tests/sim/test_material.py index 34239a53c..51d567909 100644 --- a/tests/sim/test_material.py +++ b/tests/sim/test_material.py @@ -153,10 +153,7 @@ def test_asset_wrapper_setters_use_exact_existing_handle(setter, value, native_s @pytest.mark.parametrize("intensity", [0.0, 1.0, 10.0]) -@pytest.mark.parametrize("material_type", ["BRDF", "BTDF", "BSDF"]) -def test_runtime_and_spawn_lower_identical_material_properties( - intensity, material_type -): +def test_runtime_and_spawn_lower_identical_material_properties(intensity): cfg = VisualMaterialCfg( uid="paint", base_color=[0.1, 0.2, 0.3, 0.5], @@ -164,7 +161,6 @@ def test_runtime_and_spawn_lower_identical_material_properties( roughness=0.2, emissive=[0.2, 0.3, 0.4], emissive_intensity=intensity, - material_type=material_type, ior=2.0, ) _, (_, descriptor) = _compile_visual_material("object", cfg) @@ -178,7 +174,8 @@ def test_runtime_and_spawn_lower_identical_material_properties( np.testing.assert_allclose( native.set_emissive.call_args.args[0], descriptor.emissive ) - native.update_pbr_material_type.assert_called_once_with(descriptor.material_type) + assert descriptor.material_type is None + native.update_pbr_material_type.assert_not_called() assert descriptor.has_alpha is True @@ -206,7 +203,6 @@ def test_emissive_intensity_can_be_zero_then_restored_without_losing_rgb(): {"ior": 0.0}, {"emissive_intensity": -1.0}, {"emissive": [1e308, 0.0, 0.0], "emissive_intensity": 1e308}, - {"material_type": "unknown"}, ], ) def test_invalid_material_config_is_rejected_before_native_instance_creation( @@ -422,7 +418,7 @@ def test_preset_inheritance_and_yaml_roundtrip_keep_explicit_defaults(): assert VisualMaterialCfg.from_dict({"preset": "GlassClear"}).ior is None assert VisualMaterialCfg().ior == 1.5 assert VisualMaterialCfg().roughness == 0.7 - assert VisualMaterialCfg().material_type == "BRDF" + assert "material_type" not in VisualMaterialCfg().to_dict() assert ( _material_desc_from_cfg(VisualMaterialCfg.from_dict(cfg.to_dict()), "glass") == inherited_desc @@ -443,7 +439,6 @@ def test_preset_inheritance_and_yaml_roundtrip_keep_explicit_defaults(): {"parameters": {"misspelled": 1.0}}, {"ior": 0.0}, {"roughness": 1.1}, - {"material_type": "BSDF"}, {"base_color_texture": "override.png"}, ], ) @@ -452,6 +447,50 @@ def test_preset_invalid_overrides_fail_before_download(properties): VisualMaterialCfg.from_preset("GlassClear", **properties) +@pytest.mark.parametrize("preset", [None, "GlassClear"]) +def test_removed_scattering_type_is_rejected_without_silent_conversion(preset): + with pytest.raises(TypeError, match="material_type"): + VisualMaterialCfg(preset=preset, material_type="BSDF") + for legacy in (None, "BRDF", "BTDF", "BSDF"): + with pytest.raises(ValueError, match="material_type has been removed"): + VisualMaterialCfg.from_dict({"preset": preset, "material_type": legacy}) + if preset is not None: + with pytest.raises(TypeError, match="material_type"): + VisualMaterialCfg.from_preset(preset, material_type="BSDF") + + +def test_manual_optical_parameters_load_without_an_explicit_scattering_type(): + import json + from pathlib import Path + from embodichain.lab.sim._material_presets import _MaterialResources + from embodichain.lab.sim.material import _material_desc_from_cfg + + cfg = VisualMaterialCfg( + uid="ice", + base_color=[1, 1, 1, 1], + ior=1.31, + roughness=0.2, + parameters={"transmission": 1.0}, + ) + _, (_, descriptor) = _compile_visual_material("ice_object", cfg) + assert descriptor == _material_desc_from_cfg(cfg, "ice") + world = MagicMock() + template = _native_template() + world.get_env.return_value.load_material.return_value = template + resources = _MaterialResources(world, "rt") + try: + resources.resolve(descriptor) + directory = Path(world.get_env.return_value.load_material.call_args.args[0]) + manifest = json.loads((directory / "material.json").read_text()) + assert manifest["parameters"]["transmission"] == 1.0 + assert manifest["parameters"]["ior"] == 1.31 + assert manifest["parameters"]["roughness"] == 0.2 + template.get_inst().update_pbr_material_type.assert_not_called() + assert "material_type" not in cfg.to_dict() + finally: + resources.close() + + def test_resource_wrapper_preserves_authored_template_and_resets_full_instance(): template = _native_template() default = template.get_inst() diff --git a/tests/sim/test_material_integration.py b/tests/sim/test_material_integration.py index 35315715a..3046b8512 100644 --- a/tests/sim/test_material_integration.py +++ b/tests/sim/test_material_integration.py @@ -243,7 +243,8 @@ def test_native_material_creation_reset_and_topology_rebuild(physics): @pytest.mark.parametrize("physics", ["default", "newton"]) -def test_native_preset_identity_reset_and_rebuild(physics): +@pytest.mark.parametrize("source", ["preset", "manual"]) +def test_native_parameter_material_identity_reset_and_rebuild(physics, source): sim = SimulationManager( SimulationManagerCfg( headless=True, @@ -251,11 +252,19 @@ def test_native_preset_identity_reset_and_rebuild(physics): num_envs=2, scene_node_capacity=128, physics_cfg=physics_cfg_for_backend(physics), - render_cfg=RenderCfg(renderer="hybrid"), + render_cfg=RenderCfg(renderer="hybrid" if source == "preset" else "rt"), ) ) - cfg = VisualMaterialCfg.from_preset( - "BrickRed", uid="brick", ior=1.6, roughness=0.25 + cfg = ( + VisualMaterialCfg.from_preset("BrickRed", uid="brick", ior=1.6, roughness=0.25) + if source == "preset" + else VisualMaterialCfg( + uid="brick", + base_color=[1, 1, 1, 1], + ior=1.6, + roughness=0.25, + parameters={"transmission": 0.75}, + ) ) obj = runtime = other = child = extra = selected = alias = None try: @@ -287,12 +296,15 @@ def test_native_preset_identity_reset_and_rebuild(physics): child = runtime.create_instance("other_brick") assert child.mat.get_material_id() != other.inst.mat.get_material_id() child.set_ior(2.0) - child.mat.set_transmission(0.75) - assert child.mat.get_transmission() == pytest.approx(0.75) + child.mat.set_transmission(0.25) + assert child.mat.get_transmission() == pytest.approx(0.25) runtime.set_default_properties(child, cfg) assert child.ior == pytest.approx(1.6) - # The authored legacy template leaves transmission unset (native None). - assert child.mat.get_transmission() is None + if source == "preset": + # The legacy resource template leaves transmission unset. + assert child.mat.get_transmission() is None + else: + assert child.mat.get_transmission() == pytest.approx(0.75) count = runtime.mat.inst_count() for _ in range(1025): assert runtime.create_instance("other_brick") is child

!uj8hg?FR@vVAJXnTeC2)d)gWXf#X0 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