Files
selune 9e6e0b8df1 Render workspace: complete experimental ribbon, resources and effects integration (#5493) (#5494)
* wip(render): reconcile completed material and image pipeline source with 0.20 (#5493)

Source-only integration reference for staged review, not a merge-ready aggregate.
Donor: 0xlillith/solidcraft@aea20b0115.
Upstream: 858e5995d6.

Retain original CPU/material contracts and explicit GPU donor provenance in
docs/render-materials-lab.md (#2067, #2191, #2780, #3306). Preserve released
format migrations and current navigation/startup/shell behavior. New saved
records use pending descriptors. The physical-card descriptor follows the
maintainer's material-engineering-cards naming request, with a legacy-lab
format-29 regression. Replace raw new panel hosts with shared containers.

Repository checks, complete workspace/all-target Clippy, and the independent
physical/resource authoring checks pass for this source. The fresh full local
CI invocation has reached test compilation and is not yet complete. Do not
transfer donor native output or prior test totals to this integration.

Generated review screenshots, video, package ZIP and machine logs remain at
the immutable personal evidence pin. Uncommitted geometric displacement is
backed up separately, not silently included. No kernel/vendor change, direct
main write, release or independent contributor-branch rewrite.

Co-authored-by: Christian Svensson <blue@cmd.nu>

* test(cli): pin the Compact camera-sample admission diagnostic (#5493)

The bounded request still refuses 1024x1024x64 samples before host initialization and writes no output. Update only the stale expected diagnostic to the existing Compact budget wording; production limits and code are unchanged. Exact-tree CLI regression suite: 14 passed, 0 failed. The full repository gate has been invoked separately and is not yet complete.

* Normalize UI container violation paths across platforms

Report repository-relative paths with forward slashes so diagnostics and the existing nested-package regression assertions agree on Windows and Unix. Keep the container detection rules unchanged.

Validation: official ui-containers gate and all seven focused xtask tests passed; rustfmt and diff checks passed. Only xtask/dependencies were compiled; no application build or heavy tests.
(cherry picked from commit 44b58d8e10)

* fix(render): preserve camera contracts and correct acceptance regressions (#5493)

Preserve Design view.apply semantics with a separate strict Render camera command. Retain existing translations when English-only aliases collide; add material-axis entries and camera-specific pitch labels. Compare complete validated engineering cards and retain job handles before cancellation.

Focused and native acceptance is pinned to tree f8a423b21f. Full CI has been invoked separately and is not claimed green. Landing follows the render integration policy in #5493.

* fix(render): resolve showcase licence and upstream resource hygiene (#5493)

Record SychPL's explicit MIT OR Apache-2.0 grant, retaining source/model bytes and the Ubuntu lettering notice. Remove 80 absent attribution rows, personal fork records, dead delivery attributes and three fork/resource-only workflows. Existing xtask assets now performs bounded offline hash checks and rejects orphan render attribution; no parallel draft CI or package installation. Original authoring reproduction remains explicit. Scoped xtask tests, assets, Clippy, formatting and prepared SELENE validation pass; no application or renderer-wide result is inferred.

* fix(render): align saved bounds and progressive sample resolution (#5493)

Address review r4364211669/r4364211677/r4364211681/r4364211691/r4364211695. Persisted light/frame domains respect the existing 1e9 document bound; related LED/rectangle/direction cases use the same bound. Workstation primary resolve shares the 4096 admission cap and film counters use checked conversions. Exact candidate: 485 CPU render tests, 21 render document tests and strict scoped Clippy pass, including positive boundary round trips and 2048/4096 end-to-end checkpoints. No released format/migration edits, relaxed test limits or full-stack acceptance claim.

* wip(render): isolate optional resources and harden sample handling (#5493)

Review work in progress: opt-in encoded render library with reproducible runtime catalog exports; native-only robust dependency through the workspace; checked bloom slices; per-sample point-light diagnostics; independent area-light spatial/film keys. Resource-module binaries in both configurations, generation, Cargo production feature graphs and attribution checks pass. Full engine/render regression and combined acceptance are pending: do not merge this donor as a constituent or treat scoped resource proof as runtime acceptance.

* fix(gpu): preserve donor allocations through the scope-safety repair (#5722)

Port the native-validated #5723 scope-cleanup correction into the experimental donor, retaining its adaptive, volume, aging, photographic and bloom allocations. Same reverse-drain helper and regression cases; the donor combination still needs its own compile/test gate and is not covered retroactively by render-base results.

* claim: #1369

* Reject unknown pending concepts after format folding (#1369)

* test(render): close bounded sampling and bloom review regressions (#5493)

Validate the optional-resource/lighting/dependency donor at its exact tree. Required Vulkan GPU 127/0/3; CPU renderer 487/0; engine Render 72/0; document render 21/0; lean library 7/0; strict scoped Clippy, assets/layers/lists/containers and lean-engine WASM pass. Preserve original failed controller/typing attempts. This is the draft donor/disposition source, not a replacement for constituent render PRs or final main acceptance.

* wip(render): preserve stable aging target validation candidate

Exact staged source from prior review work on donor 3b892eab5e. This is a recovery/review checkpoint, NOT accepted delivery. An actual command-path regression currently fails because the selected executor refuses ordered surface aging. No assertion, capability or admission limit is weakened. Native/UI/full combination acceptance remains pending. Saved/runtime split adds one pending descriptor and retains original file scope; no main/render branch is changed.

* test(render): preserve numeric setup intent at the admitted coordinate bound

Follow up jyviko review on #5494 without weakening the corrected saved-coordinate contract. The positive clicked fixture uses 1e9 instead of inadmissible 2e9; explicit out-of-range cases still refuse, and the full saved setup round-trips through JSON and the native container. Exact-source Render workspace 95/0 and strict all-target UI Clippy pass. This does not incorporate the separately failing stable-aging candidate or claim full current-render acceptance.

* test(render): use the real GPU executor for saved aging

Move successful native cold-reopen Check/Start coverage from the CPU-backed protocol fixture into the production GPU executor tests. Verify capture-index changes preserve the stable target and that enabling aging changes both PNG and raw EXR output. Retain explicit, allocation-free refusal coverage for executors without aging support. Production capabilities and admission checks are unchanged.

* fix(render): persist stable identities for targeted aging (#5493)

Separate saved RenderBodyTarget identities from captured mesh ordinals. Reject legacy ambiguous targets, resolve Check/Start after visibility changes and preserve native reopening, copies and undo. Unsupported executors still refuse; real AMD Vulkan regression completes saved aging after reordered capture.

Source tree 6b84c8ad passes document 23, engine Render 75, GPU effects 5 and Render UI 95 with no failures; scoped strict Clippy, WASM and repository gates pass. Fresh CLI/native reopen and clean/aged GPU exports pass with identical physical totals and inspected actual images. Whole current-render integration is separate.

* fix(render): reconcile combined CPU/GPU contracts on current upstream

Unify captured resources/status and CPU-vs-GPU request schemas after the real two-parent integration; remove obsolete duplicate Vulkan selector and retain combined platform-filter regression. Deduplicate only identical or superseded test definitions, retaining the stronger card metadata and reserved-executor assertions. No assertions, admission limits or feature refusals are weakened.

All targets of render dependencies, GPU, engine, UI, CLI and native app pass cargo check with raytrace-cpu and bundled-render-library at tree c70d00d1. Native executable tests and full current-source acceptance remain pending. This is a private integration rehearsal for subsequent constituent PRs, not an aggregate official render/main merge.

* test(render): retain one complete host lifetime regression set

Deduplicate byte-identical DropProbe/task-lifetime tests and retain the adapted environment/texture ownership regressions with every assertion and complete memory estimate. Keep the registered-geometry admission regression once; only struct field order differed. Replace a one-element diagnostic loop with its equivalent block, preserving all wrap/width assertions.

Test-only integration repair. Formatting and diff checks pass; refreshed executable validation is required. No production behavior, limits, assertions or ignores changed.

* fix(doc): recognize the proven format-29 card descriptor alias

Normalize only the historical format-29 physical-material-cards spelling, and only when material-engineering-cards is registered. Admission and migration de-duplication use the same identity. Unknown concepts, wrong versions and incapable readers still refuse before mutation. Six controlled-history Rust regressions and actual CLI migration/no-clobber acceptance pass. No version, released migration or CI changes. Refs #5793, #1369, #5493.

* test(render): preserve grounding refusal before explicit instance moves

Update the two Render binding fixtures for upstream first-occurrence grounding. Verify grounded movement refuses without changing document/history, then explicitly unground through the public command before the intended move. Retain every target, resource, copy and persistence assertion. Refs #5493.

---------

Co-authored-by: Christian Svensson <blue@cmd.nu>
Co-authored-by: Victor Santos Oliveira <56417388+Vittuu@users.noreply.github.com>
Co-authored-by: cfaulkingham <colin.faulkingham@gmail.com>
2026-10-24 14:21:59 +00:00

12 KiB
Raw Permalink Blame History

SELENE native rendering and reproducible studio showcase

Full-detail 4K path-traced studio image (2026-10-22)

SELENE native studio render

The selected 3840 x 2400 PNG is a completed native SolidCraft GPU-path render of the latest functional master, not a Design screenshot, a generated illustration, a painted geometry replacement or an upscaled preview. The exact request, original resource hashes, editable source and executable identities are retained in studio-hero.json.

Property Verified value
Editable authority models/SELENE-functional.solidcraft, original bytes unchanged
Functional source commit cf8e651022deee528b26c303fde58bf3eb8a22a5
Native model SHA-256 3bd2bfa1c6336394c4a4208d30b52c80d06658a3bd7ea57cc93b774411d1bd68
Evaluated native bodies 2,116; zero timeline errors or warnings
Original visible subject 2,094 bodies; 2,144,099 triangles
Separate render-only stage One passive ground rectangle; 2 triangles
Optical bodies 12 explicitly selected closed dielectric bodies; topology and medium-overlap checks retained
Authored surface detail 48 exact body bindings across six original surface families
Output 3840 x 2400, RGBA8 PNG, sRGB
Sampling 1,024 samples per pixel; maximum path depth 16; seed 21026
Presentation ACES-fitted tone mapping and edge-aware a-trous denoising
Lighting Original RIG-002 rectangular emitters, explicit 1/16 creative radiance gain, original HDR-002 fill at intensity 0.12
Camera Perspective fit to all captured body bounding boxes; 8% frame margin
Native executable source 895704a2fdc96dabb9a2afb2e548a8896e4b1e79
Native executable SHA-256 3421d538c571647c1f24fd74d63487c4ba4ab597980cfeea111a01c0db94e699
Completed PNG SHA-256 40a492e7979137d0f4027300da3d8af7ca1008c1aab2c309259e65d309a17316
PNG length 2,388,114 bytes; chunk CRCs, bounded scanlines and final-frame hash verified

The image uses the original saved visibility and neutral pose. There is no mesh simplification, geometry removal, hidden resolution downgrade, engineering-material reassignment or software-device fallback. The native job's logical admission estimate was 2,814,770,732 bytes; this is not a peak-RSS or GPU-memory measurement. Hardware-only policy and Vulkan were enforced on Pegasus; the hardware survey identifies its AMD Radeon 8060S.

Reproduction

Build the native CLI once, then reuse the loaded model and device:

cargo build --locked --profile ci -p solidcraft-cli --bin solidcraft-cli
python -i tools/render-library/selene_studio.py --cli /path/to/solidcraft-cli   --out /new/output/directory

In the resulting interactive studio:

from selene_recipe import hero_request
request = hero_request(studio, width=3840, height=2400, samples=1024)
receipt = studio.render("selene-studio-4k", request, timeout=7200)
studio.close()

The helper checks the pinned master and binary, public-command preparation, resource hashes, actual executor, exact requested dimensions and exported frame bytes. The frame is not automatically declared visually accepted. The original camera-fit/publication tools and seven independent Python tests are under tools/render-library/; provisional images, native-pixel crops and execution logs stay outside the shipped resource collection.

Quality and scope

The complete image and four unscaled detail crops were visually reviewed: subject and gripper framing, mechanical edges, electronic connectors, glass and highlights remain readable. Residual Monte Carlo grain is visible at native pixel scale in some vial/lens regions; the current denoiser deliberately does not reconstruct those transmission paths. This is a high-quality native showcase, not proof of zero residual noise or a completed maximum-quality renderer roadmap.

RGB absorption and material recipes are illustrative authored optical choices, not measured glass spectra or engineering properties. The explicit rig gain is a creative lighting adjustment, not an unchanged photometric calibration. Normal maps alter shading, not CAD geometry. LED diffusers are transmitted surfaces, not validated volumetric/mesh emitters. The static image does not establish collision-free motion, contact physics, lunar dust or dynamics.

Native renderer tests passed 457/457. The hardware GPU suite passed 95 tests with three explicitly ignored tests, and the official 12-crate library/web WASM check passed. Whole-workspace type checking, strict lint, resource/persistence command checks and camera/publication tests have their own evidence. Interactive GUI acceptance and whole-project CI are not inferred from this image. The focused Render-workspace harness also passed 58 tests with no failures; its click-stability repair and remaining whole-project acceptance scope are recorded in the batch ledger and PR #7.

Historical Design previews and earlier CPU-product evidence

The sections below preserve the earlier 10ada1b4 CPU-product/Design observations. Their resource ceilings describe that legacy raster executor, not the current native GPU path or the explicit larger CPU raytrace profiles. The whole-master GPU limitation described in that historical workflow is now resolved by the completed image above.

The enhanced native master is the editable authority. Its ten named camera and render-setup records make close inspections reproducible. Body appearances distinguish metals, painted structure, elastomer, FR4, packages, contacts and optical surfaces. The orange and charcoal identity is retained.

Reusable Design previews

The package ships three previews generated directly by SolidCraft from the final neutral master: a whole-rover overview, the Raspberry Pi assembly and an exposed elbow bearing. They use native Design shading. They are intended for the model's README and showcase preparation; they are not photographs or path-traced optical renders. No raster image generator or painted replacement geometry is involved.

Preview Resource Purpose
Whole rover SELENE-overview.png Overall form, component placement and retained visual identity.
Electronics SELENE-electronics.png Board, mounting, packages and connector mouths, viewed from the +X side.
Open bearing SELENE-bearing.png Grooved races, individual balls and the brass cage.

Regenerate them in a fresh output directory:

PYTHONDONTWRITEBYTECODE=1 python3 assets/render/selene/tools/export_views.py \
  --cli /path/to/solidcraft-cli \
  --model assets/render/selene/models/SELENE-functional.solidcraft \
  --out target/selene/previews

The exporter opens the entire native model once, changes only transient body visibility and cameras, and requests three native MCP screenshots. It saves no changes to the master and verifies its SHA-256 afterward. The output report records the actual capture metadata, image hashes, dimensions, cameras and executor hash. Its default size is 1400 × 1000 pixels.

The body selector for electronics retains the PCB, all Pi5 componentry and the Pi M2.5 mounting hardware. The bearing selector isolates Bearing Elbow port. The full overview hides the optional track and source flexible-hose display geometry. None of these visibility changes delete geometry.

Actual product-render checks

The personal fork at 10ada1b45a4eb285ce752ac72f9aaa968ff8b5c4 was compiled and exercised using its native cpu-product executor. The binary reports version 0.18.2 and writes native format 29. Its binary SHA-256 was 2a5485f7c7832d29b6340988837316e247b94eeeb9d4f7333ee616cea38c6826.

Two bounded opaque PBR images passed native preflight and rendering:

Actual subject Visible bodies Triangles Admitted job estimate Output
Fresh single arm-bearing fixture generated by bearings.py 20 93,654 43,594,876 bytes 768 × 576 PNG, 51,705 bytes
Pi isolated from the actual integrated stage-03 model 504 103,004 50,848,960 bytes 768 × 576 PNG, 42,351 bytes

Both returned no preflight warnings and were visually inspected. The Pi geometry was taken from the integrated rover checkpoint, not a replacement board illustration. The single-bearing image was a reduced fixture of the production geometry; it was not a rendering of the whole rover. Their raw logs, transient native files and review images belong under ignored target/selene/render-review/. The final model and reusable Design previews have separate hashes in VALIDATION.md.

That historical cpu-product raster path uses three fixed directional studio lights. Pure metals look dark away from their highlights because it does not provide an ambient or HDRI contribution in this path. This behavior does not mean the material assignments were lost. Use the Design previews to inspect geometry, and inspect PBR behavior with the product executor's actual lighting limits in mind.

Historical whole-model CPU-product resource limit

At this fork revision the CPU product-image path admits at most 262,144 triangles, 128 MiB of source geometry, 384 MiB per job estimate and 128 million projected pixel tests. A single arm ball has 10,224 reference-mesh triangles; the 64 arm balls alone account for 654,336 triangles, before the head bearings or rover are included. The full-detail model therefore exceeds this CPU product triangle cap.

Reducing output dimensions reduces image buffers, not reference-mesh triangle count. Changing viewport display quality does not lower the meshes used by this product renderer. Do not bypass the admission check or silently remove mechanical detail from the master. Use the whole native Design preview, isolate a component for current CPU PBR work, or author a separately documented reduced-visibility render scene. A future whole-rover render executor must admit the complete scene or explicitly support a documented mesh-detail policy.

CAD evaluation is additional to the render-job estimate. Opening the integrated stage-03 model during these checks took about 102 seconds and peaked near 3.76 GiB RSS. Later assemblies are larger. Run the native builder, validation and full-model image export sequentially. The provided tools constrain native worker threads and use an explicit allocator policy; detailed evidence records resource failures and recovered attempts rather than treating them as passes.

Material and optical boundaries

  • Opaque PBR values are authored visual parameters, not measured BRDF data. Painted orange and charcoal surfaces retain dielectric/coated appearances; exposed races, balls, contacts and shafts have separate metal responses.
  • Engineering-material density is a nominal proxy. It does not establish the complete component mass, electrical specification, thermal performance or contact friction.
  • Each glass vial is one hollow native solid with an integral bottom. This supplies coherent geometry for later closed-medium admission.
  • Viewport opacity is not physical refraction. Camera lenses, diffusers and vials require explicit optical descriptors, lighting and medium validation; the current studio recipe above supplies and validates them without rewriting the native master.
  • No lunar terrain, illumination ephemeris, dust simulation, HDRI or manufacturer PCB artwork is bundled in the native derivative.

Preparing animation shots

Use the seven focused studies to inspect the actual joint chains. Hide the six rigid suspension coils and twelve motor leads while the suspension moves; these neutral render details do not deform. The motion profile in presentation.py selects that view. Removed arm hydraulic display cylinders do not reappear during motion.

Keep the final master neutral and export motion/render copies separately. The adapted author tour and focused studies are kinematic authoring resources. A complete animated shot still needs its selected combined path checked for collisions, a timing choice, flexible-detail treatment and any physical contact model it intends to claim. Throwing and catching a free vial remains future dynamics work.