feat(core): support dynamic dt by reading from scene config live - #455
Merged
Conversation
Replace all cached `Float dt` members in ~25 backend systems with
`S<const geometry::AttributeSlot<Float>> dt_attr` so every system reads
dt from the scene config attribute on each use. This allows users to
change dt at runtime via `scene.config().find<Float>("dt")`.
- Add `SceneVisitor::dt()` convenience accessor
- Tolerance checkers now recompute abs_tol dynamically
- Add unit test and sim_case test verifying dynamic dt
Fixes #451
Co-authored-by: Cursor <cursoragent@cursor.com>
Address review feedback: - Cache dt_attr->view()[0] into a local Float before entering loops to avoid redundant attribute lookups per iteration - Add UIPC_ASSERT after every dt_attr assignment to verify the attribute was found in the scene config Co-authored-by: Cursor <cursoragent@cursor.com>
Contributor
There was a problem hiding this comment.
Code Review
This pull request implements support for dynamic time steps (dt) by refactoring backend systems to access the dt value directly from the scene configuration's attribute slot at runtime. Previously, many systems cached a static copy of dt during initialization; this change ensures that any runtime modifications to the timestep are correctly propagated through the simulation pipeline, including contact systems, animators, and time integrators. New unit and simulation tests have been added to verify that changes to dt are correctly reflected in the simulation results. I have no feedback to provide as the review comments were purely explanatory and did not identify any issues.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Replace all cached
Float dtmembers across ~25 CUDA backend systems with live attribute slot references (S<const geometry::AttributeSlot<Float>> dt_attr), enabling users to change the simulation timestep at runtime viascene.config().find<Float>("dt").Previously, each system copied
dtfrom the scene config once duringdo_build()orinit(), making it impossible to change dt dynamically. Now every system reads dt from the scene config attribute on each use, following the same pattern already established bySimEnginefor other config values likem_newton_velocity_tol.Changes
dt()convenience accessor delegating tointernal::Scene::dt()Float dtmember withS<const geometry::AttributeSlot<Float>> dt_attrin Impl structs (time integrator, linear subsystems, line search, contact system, active set, animators, constitution managers, diff reporters)MaxTranslationCheckerandABDToleranceCheckernow recomputeabs_tol = factor * dtdynamically indo_check()instead of caching it indo_build()UIPC_ASSERTafter everydt_attrassignment to verify the attribute existsdt_attr->view()[0]into a localFloatbefore entering loopsSceneVisitor::dt(), and sim_case test (93_dynamic_dt) verifying end-to-end that changing dt at runtime affects simulation behaviorFixes #451