102 lines
4.4 KiB
Markdown
102 lines
4.4 KiB
Markdown
# M03-RND-M2-PLACEMENT-TRANSFORM-001 — M2 placement transform resolver
|
|
|
|
<!-- OPENWC_CLAIM:M03-RND-M2-PLACEMENT-TRANSFORM-001:sindo-main-codex:2026-07-19 -->
|
|
|
|
## Ownership
|
|
|
|
- Target: M03
|
|
- Program: RND
|
|
- Owner/Agent ID: sindo-main-codex
|
|
- Branch: `work/sindo-main-codex/m03-m2-placement-transform`
|
|
- Lease expires UTC: 2026-07-19
|
|
- Integrator: M03 milestone integrator
|
|
|
|
## Outcome
|
|
|
|
Extract pure ADT M2 placement basis/origin-offset calculation, including the
|
|
existing waterfall and Elwynn cliff-rock calibrations, into a scene-free service.
|
|
|
|
## Non-goals
|
|
|
|
- Change coordinate conversion, placement positions, rotations or scale clamps.
|
|
- Generalize model-specific corrections or add new allowlisted models.
|
|
- Move grouping/tasks, MultiMesh/Node/Mesh/material/RID creation or caches.
|
|
- Change M2 animation/material behavior, cache versions or renderer profiles.
|
|
- Claim build-12340 placement parity beyond existing fixtures.
|
|
|
|
## Paths
|
|
|
|
- Exclusive: `src/render/m2/m2_placement_transform_resolver.gd`,
|
|
`src/tools/verify_m2_placement_transform_resolver.gd`,
|
|
`docs/modules/m2-placement-transform-resolver.md`, this claim
|
|
- Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`,
|
|
`docs/modules/world-renderer.md`, `docs/modules/README.md`, `RENDER.md`,
|
|
`targets/03-renderer-facade.md`
|
|
- Generated/ignored: `.godot`, native DLL, generated ADT resources, caches and
|
|
proprietary renderer corpus
|
|
|
|
## Contracts and data
|
|
|
|
- Input: ADT-loader Godot Euler rotation, normalized/original M2 relative path,
|
|
and raw placement scale where origin compensation is requested
|
|
- Output: `Basis` and local origin-offset `Vector3`; no retained state
|
|
- Regular models use `Basis.from_euler`; two cliff rocks retain narrow YZX-style
|
|
shell correction; two waterfall sheets retain yaw/twist/anchor compensation
|
|
- Scale clamps remain caller-owned for final basis and resolver-owned at `0.0001`
|
|
only for historical waterfall anchor compensation
|
|
- Cache/schema/coordinate versions: unchanged
|
|
|
|
## Dependencies
|
|
|
|
- Requires: current master `1b6c468`
|
|
- Blocks: pure M2 grouping extraction and broader M2 service decomposition
|
|
- External state: none; tests use synthetic rotations/paths and pinned constants
|
|
|
|
## Verification
|
|
|
|
- Commands: dedicated regular/path-normalization/cliffrock/waterfall/twist-anchor/
|
|
scale and bounded timing verifier; three loader call-site/source boundaries;
|
|
M2 unique/dedupe plus facade/terrain/internal-access/manifest/shutdown gates
|
|
- Fidelity evidence: exact formulas/constants and model allowlists moved unchanged
|
|
- Performance budget: allocation-free scalar/Basis math per placement aside from
|
|
path normalization; no Node, Resource, RID, task, cache or file access
|
|
|
|
## Documentation deliverables
|
|
|
|
- Inline resolver API documentation
|
|
- New module spec with inputs/outputs, data-flow, lifecycle, ownership, failure,
|
|
performance, fidelity limitations and source map
|
|
- World renderer/module registry/`RENDER.md` updates
|
|
|
|
## Simplicity and naming
|
|
|
|
- Important name: `M2PlacementTransformResolver`
|
|
- Simplest solution: stateless service with basis and origin-offset queries
|
|
- Rejected complexity: transform strategy hierarchy, generic correction registry,
|
|
Resources, data-driven override format or callback injection
|
|
- Unavoidable complexity: four measured model-specific exceptions remain explicit
|
|
- Measured optimization evidence: bounded synthetic transform loop
|
|
|
|
## Status
|
|
|
|
- State: handoff
|
|
- Done: resolver extracted, three call sites migrated, contracts and docs verified
|
|
- Next: M03 integrator acceptance and merge to master
|
|
- Blocked by:
|
|
|
|
## Handoff
|
|
|
|
- Commit: `0a09d7b` (`refactor(M03): extract M2 placement transform resolver`)
|
|
- Results: dedicated formula/source/timing contract PASS (`cases=9`,
|
|
`iterations=10000`, `elapsed_ms=28.732`); cold editor parse PASS;
|
|
documentation gate PASS (`module_specs=16`, `required_files=7`);
|
|
coordination gate PASS with 23 pre-existing expired M00/M01 warnings; related
|
|
M2 unique/dedupe, terrain cache/LOD/queue, facade, internal-access, manifest,
|
|
shutdown, scheduler, streaming focus/planner and coordinate-boundary suites
|
|
PASS; renderer checkpoint dry-run PASS `7/7`.
|
|
- Remaining risks: no private asset-backed visual recheck in this package;
|
|
general ADT M2 placement parity and asset-backed p95/p99 remain pending.
|
|
- Documentation updated: inline public API; new
|
|
`docs/modules/m2-placement-transform-resolver.md`; renderer module registry,
|
|
`docs/modules/world-renderer.md` and `RENDER.md`.
|