78 lines
3.9 KiB
Markdown
78 lines
3.9 KiB
Markdown
# Imaging and meshing integration
|
|
|
|
Milestone 06 owns the native implementations in `libremetaverse-imaging`,
|
|
`libremetaverse-imaging-skia`, and `libremetaverse-prim-mesher`. The core
|
|
imaging and meshing crates contain no CLR bridge, subprocess adapter, foreign
|
|
RPC, or generated failure-only shim. The rendering crates consume the checked
|
|
mesh data but remain a separate milestone: `SimpleRenderer` now provides the
|
|
reference prim/sculpt conversion pipeline. `MeshFoundry` now adds bounded mesh
|
|
asset, rigging, tangent, secondary-UV, terrain, and convex-hull handling without
|
|
changing the milestone 06 ownership boundary. See the
|
|
[`SimpleRenderer` guide](../crates/libremetaverse-rendering-simple/README.md)
|
|
and [`MeshFoundry` guide](../crates/libremetaverse-rendering-mesh-foundry/README.md).
|
|
|
|
## Feature boundary
|
|
|
|
| Surface | Default build | Opt-in build | Native dependency |
|
|
| --- | --- | --- | --- |
|
|
| Managed images and TGA | enabled | n/a | none |
|
|
| JPEG 2000 | disabled | `libremetaverse-imaging/jpeg2000` | OpenJPEG 2.5.x |
|
|
| JPEG 2000 (pure Rust) | enabled | `libremetaverse-imaging/rust-j2k` | none (`j2k` 0.8.1) |
|
|
| BMP/GIF/ICO/JPEG/PNG/WBMP/WebP (pure Rust) | enabled | `libremetaverse-imaging-skia/rust-skia` | none (`skia-rs-codec` 0.3.0 plus `image-webp` 0.2.4) |
|
|
| BMP/GIF/ICO/JPEG/PNG/WBMP/WebP (native) | disabled | `libremetaverse-imaging-skia/skia` | Skia |
|
|
| Prim and sculpt meshing, OBJ ingestion | enabled | n/a | none |
|
|
|
|
OpenJPEG is a non-default workspace member so release tooling can package the
|
|
adapter explicitly, and imaging reaches it only through the optional
|
|
dependency. The default `rust-j2k` feature reaches only the audited pure-Rust
|
|
`j2k` graph; enabling both features keeps both explicit codec types available
|
|
for interoperability testing. Native Skia is likewise an optional,
|
|
target-specific dependency, while `rust-skia` is the raster crate default. The
|
|
consolidated required Gitea gate exercises the native feature, while a dedicated
|
|
`ubuntu-latest` job tests `rust-skia`, audits
|
|
its normal/build graph without installing native codec tools, and compiles the
|
|
same code for WASM. Minimal-feature checks still prove no codec is needed for
|
|
the owned Rust and translated compatibility tests.
|
|
|
|
## Bounds and rendering contract
|
|
|
|
Decoded images are limited to 4,096 by 4,096 pixels and encoded inputs to 64
|
|
MiB. Channel sizes, resize products, codec buffers, sculpt-map dimensions,
|
|
profile/path sizes, mesh vertex counts, face indices, viewer groups, and OBJ
|
|
indices use checked arithmetic before allocation or indexing. Malformed input
|
|
returns a typed error.
|
|
|
|
The rendering-facing integration tests verify that PrimMesh and SculptMesh
|
|
produce finite positions, normals, and UVs; aligned face and viewer-face data;
|
|
preserved prim-face grouping; in-range indices; and the 16-bit index range used
|
|
by the pinned MeshFoundry reference at every supported sculpt topology and LOD.
|
|
|
|
## Reproducible gates
|
|
|
|
Run the fixed ownership and feature audit with:
|
|
|
|
```console
|
|
python3 tools/check_milestone_06.py
|
|
```
|
|
|
|
The audit rejects owned Rust stubs, feature leakage, missing platform jobs,
|
|
missing performance targets, or drift in the 48 reviewed ManagedImage,
|
|
Coord/Quat, and PrimMesh compatibility cases. The required gate runs the native
|
|
crate and reviewed parity tests, Clippy with warnings denied, and rustdoc with
|
|
warnings denied. Benchmark compilation is retained in the non-routine release
|
|
gate.
|
|
|
|
The focused performance baselines are executable Rust programs rather than
|
|
wall-clock assertions, so slower shared runners do not weaken or destabilize
|
|
correctness tests:
|
|
|
|
```console
|
|
cargo bench -p libremetaverse-imaging --bench image_pipeline
|
|
cargo bench -p libremetaverse-prim-mesher --bench meshing
|
|
```
|
|
|
|
The image baseline clones, bilinearly resizes, and exports a 2,048-square RGBA
|
|
image. The meshing baseline builds and indexes a high-detail cut, hollow,
|
|
twisted circular extrusion. Both report elapsed time and allocation counts so
|
|
regressions can be compared using the same inputs.
|