Agent: viewer-grade OpenSim renderer and model-controlled camera tools #136

Closed
opened 2026-08-22 08:45:46 +00:00 by hugo · 6 comments
Owner

Goal

Replace the agent's current bounded software viewport with a viewer-grade rendered OpenSim scene that the LLM can inspect, and expose policy-controlled camera tools so it can choose what to look at.

The current implementation already produces a real 320x180 JPEG from scene geometry (camera-relative prim triangles, depth, terrain/water, avatars, and available texture color). Keep it as the deterministic baseline and fallback while developing this feature.

Discovery

Use direct wgpu for the first spike. It is a cross-platform, safe Rust graphics API with native Vulkan, Metal, Direct3D 12, and OpenGL backends, and its render-pass/texture APIs support offscreen render targets. This fits MetaCrate's existing FacetedMesh/SimpleMesh data without introducing a full game engine: https://github.com/gfx-rs/wgpu and https://docs.rs/wgpu/latest/wgpu/struct.RenderPass.html

Do not base the work on rend3; that repository was archived in June 2025: https://github.com/BVE-Reborn/rend3

Pin the stable wgpu release selected by the spike instead of following trunk. Keep the adapter/backend choice internal to the renderer and preserve the agent's existing async isolation, capture timeout, JPEG encoding, and bounded scene snapshot contract.

Scope

  • Render legacy prims, sculpties, uploaded mesh assets, per-face UVs/materials/textures, terrain, water, avatars, and attachments from the existing LibreMetaverse scene/asset structures.
  • Render offscreen without requiring a window. Support Linux, Windows, and macOS through the corresponding wgpu backends.
  • Keep a usable deterministic fallback when no compatible GPU adapter is available.
  • Preserve final JPEG output and the existing Mentra image-attachment path.
  • Add LLM tools for:
    • camera from avatar position in facing direction;
    • look at/focus an object or avatar;
    • orbit a focused target;
    • explicit position, look-at point, field of view, and reset.
  • Route camera actions through the existing authorization/policy harness. They must not bypass visibility, capture-frequency, or resource limits.
  • Keep rendering outside the simulator event-processing path so a slow frame cannot stall login, movement, IM, teleport, or logout.

Spike acceptance criteria

  • Render the same captured scene through both the current software renderer and an offscreen wgpu target on Linux.
  • Demonstrate textured prim, sculpt, uploaded mesh, terrain/water, avatar, and attachment fixtures with stable golden/semantic checks.
  • Read pixels back and encode the existing bounded JPEG payload accepted by Mentra.
  • Measure initialization time, frame latency, peak scene/texture memory, and behavior without a hardware adapter.
  • Confirm the selected dependency/features build on Linux, Windows, and macOS targets without adding a game engine.

Completion criteria

  • Camera tools can frame the avatar's view and inspect an object while building.
  • Captures reflect authoritative post-teleport position/facing and current nearby-object state.
  • Asset fetch/decode failures degrade visibly and do not hang the agent.
  • Renderer initialization, device loss, timeout, cancellation, teleport, relogin, and shutdown all have integration coverage.
  • Live-grid tests prove repeated capture/camera/build cycles do not block simulator events or grow memory without bound.
## Goal Replace the agent's current bounded software viewport with a viewer-grade rendered OpenSim scene that the LLM can inspect, and expose policy-controlled camera tools so it can choose what to look at. The current implementation already produces a real 320x180 JPEG from scene geometry (camera-relative prim triangles, depth, terrain/water, avatars, and available texture color). Keep it as the deterministic baseline and fallback while developing this feature. ## Discovery Use direct `wgpu` for the first spike. It is a cross-platform, safe Rust graphics API with native Vulkan, Metal, Direct3D 12, and OpenGL backends, and its render-pass/texture APIs support offscreen render targets. This fits MetaCrate's existing `FacetedMesh`/`SimpleMesh` data without introducing a full game engine: https://github.com/gfx-rs/wgpu and https://docs.rs/wgpu/latest/wgpu/struct.RenderPass.html Do not base the work on `rend3`; that repository was archived in June 2025: https://github.com/BVE-Reborn/rend3 Pin the stable `wgpu` release selected by the spike instead of following trunk. Keep the adapter/backend choice internal to the renderer and preserve the agent's existing async isolation, capture timeout, JPEG encoding, and bounded scene snapshot contract. ## Scope - Render legacy prims, sculpties, uploaded mesh assets, per-face UVs/materials/textures, terrain, water, avatars, and attachments from the existing LibreMetaverse scene/asset structures. - Render offscreen without requiring a window. Support Linux, Windows, and macOS through the corresponding `wgpu` backends. - Keep a usable deterministic fallback when no compatible GPU adapter is available. - Preserve final JPEG output and the existing Mentra image-attachment path. - Add LLM tools for: - camera from avatar position in facing direction; - look at/focus an object or avatar; - orbit a focused target; - explicit position, look-at point, field of view, and reset. - Route camera actions through the existing authorization/policy harness. They must not bypass visibility, capture-frequency, or resource limits. - Keep rendering outside the simulator event-processing path so a slow frame cannot stall login, movement, IM, teleport, or logout. ## Spike acceptance criteria - Render the same captured scene through both the current software renderer and an offscreen `wgpu` target on Linux. - Demonstrate textured prim, sculpt, uploaded mesh, terrain/water, avatar, and attachment fixtures with stable golden/semantic checks. - Read pixels back and encode the existing bounded JPEG payload accepted by Mentra. - Measure initialization time, frame latency, peak scene/texture memory, and behavior without a hardware adapter. - Confirm the selected dependency/features build on Linux, Windows, and macOS targets without adding a game engine. ## Completion criteria - Camera tools can frame the avatar's view and inspect an object while building. - Captures reflect authoritative post-teleport position/facing and current nearby-object state. - Asset fetch/decode failures degrade visibly and do not hang the agent. - Renderer initialization, device loss, timeout, cancellation, teleport, relogin, and shutdown all have integration coverage. - Live-grid tests prove repeated capture/camera/build cycles do not block simulator events or grow memory without bound.
hugo added this to the 14 - metacrate grid agent milestone 2026-08-22 08:45:46 +00:00
Author
Owner

Implemented the first headless-wgpu/camera slice in c101007.

What is now in place:

  • pinned wgpu 30.0.1 with an offscreen RGBA8-sRGB color target, depth buffer, padded readback, and the existing bounded JPEG/Mentra image path;
  • one lazily initialized device/queue/pipeline per live vision service, with render/readback work kept off the simulator event path;
  • deterministic software fallback when adapter initialization or a frame fails;
  • shared authoritative camera FOV state in LibreMetaverse;
  • policy-routed behavior_camera_set and behavior_camera_reset tools, bounded to 96 m from the avatar, a distinct target, and 20-120 degree vertical FOV;
  • a persisted Mentra tool-profile migration so existing avatar conversations receive the newly registered camera tools.

Verification completed:

  • full metacrate-grid-agent --all-features suite: 147 unit tests plus all integration/doc tests passed;
  • strict all-target/all-feature Clippy passed;
  • actual headless wgpu color/depth render and readback passed on Linux;
  • live two-account OpenSim run: an authorized IM caused behavior_current_pose, behavior_camera_set, a wgpu-rendered JPEG vision turn, and behavior_camera_reset to complete while the simulator session stayed online. The multimodal model described geometry visible from the changed camera.

Remaining issue scope is still substantial: per-face UV texture sampling/materials, sculpt and uploaded-mesh fidelity, authoritative terrain, full avatars/attachments, device-loss recovery, cross-platform runtime evidence, stable scene goldens, and latency/memory measurements.

Closure gate for this camera/view issue: attach at least one actual snapshot to this issue showing the expected camera pose and rendered scene, with enough non-secret context to identify the tested view. Text-only success logs are not sufficient.

Implemented the first headless-wgpu/camera slice in `c101007`. What is now in place: - pinned `wgpu` 30.0.1 with an offscreen RGBA8-sRGB color target, depth buffer, padded readback, and the existing bounded JPEG/Mentra image path; - one lazily initialized device/queue/pipeline per live vision service, with render/readback work kept off the simulator event path; - deterministic software fallback when adapter initialization or a frame fails; - shared authoritative camera FOV state in LibreMetaverse; - policy-routed `behavior_camera_set` and `behavior_camera_reset` tools, bounded to 96 m from the avatar, a distinct target, and 20-120 degree vertical FOV; - a persisted Mentra tool-profile migration so existing avatar conversations receive the newly registered camera tools. Verification completed: - full `metacrate-grid-agent --all-features` suite: 147 unit tests plus all integration/doc tests passed; - strict all-target/all-feature Clippy passed; - actual headless wgpu color/depth render and readback passed on Linux; - live two-account OpenSim run: an authorized IM caused `behavior_current_pose`, `behavior_camera_set`, a wgpu-rendered JPEG vision turn, and `behavior_camera_reset` to complete while the simulator session stayed online. The multimodal model described geometry visible from the changed camera. Remaining issue scope is still substantial: per-face UV texture sampling/materials, sculpt and uploaded-mesh fidelity, authoritative terrain, full avatars/attachments, device-loss recovery, cross-platform runtime evidence, stable scene goldens, and latency/memory measurements. Closure gate for this camera/view issue: attach at least one actual snapshot to this issue showing the expected camera pose and rendered scene, with enough non-secret context to identify the tested view. Text-only success logs are not sufficient.
Author
Owner

Live snapshot evidence from the two-account OpenSim verification after AgentReady (320x180 JPEG, captured by the production headless-wgpu path and passed through the same Mentra image attachment):

Live OpenSim wgpu viewport

  • JPEG SHA-256: 89699d8e960d396079d43ed777a8fcf0da3ace4147ef39220701bee7172041bb
  • size: 2,601 bytes
  • visible result: depth-ordered white/green scene geometry against the environment clear color

This is progress evidence for the current prim-geometry slice, not closure evidence for the issue's remaining mesh/sculpt/material/avatar/attachment fidelity work. A later closure snapshot must exercise those final requirements and the selected camera pose.

Live snapshot evidence from the two-account OpenSim verification after `AgentReady` (320x180 JPEG, captured by the production headless-wgpu path and passed through the same Mentra image attachment): ![Live OpenSim wgpu viewport](https://git.rfc1437.de/attachments/4264e3c1-b617-4102-b122-701576d6128b) - JPEG SHA-256: `89699d8e960d396079d43ed777a8fcf0da3ace4147ef39220701bee7172041bb` - size: 2,601 bytes - visible result: depth-ordered white/green scene geometry against the environment clear color This is progress evidence for the current prim-geometry slice, not closure evidence for the issue's remaining mesh/sculpt/material/avatar/attachment fidelity work. A later closure snapshot must exercise those final requirements and the selected camera pose.
hugo added the enhancement label 2026-08-22 10:53:44 +00:00
Author
Owner

Implementation update in f6f5abe.

The reusable renderer now lives in the separate metacrate-rendering-wgpu crate, with projection camera, headless wgpu color/depth rendering, readback, and the existing software fallback. The agent now receives real extended-region terrain, terrain detail textures, uploaded mesh assets, per-vertex UV texture samples, face shading, a corrected native camera axis, and bounded JPEG output at 640x360. The network composition root and production AgentThrottle delivery were also fixed so terrain packets reach the agent reliably.

Live two-account verification exercised the real Mentra SSE runtime and GPT-5.6 Luna image input. The model received the generated JPEG and described textured terrain, but also unresolved white and gray geometry, severe occlusion and overlaps, mesh gaps, and missing textures. The production scene summary reported 93 tracked objects, truncated geometry, and 42 missing textures. Direct inspection agrees with that description.

This proves camera tool execution, JPEG attachment, SSE model vision, wgpu render and readback, and terrain delivery. It does not satisfy the visual closure gate: scene transforms, object bounds and culling, material and texture resolution, mesh fidelity, avatars, and attachments still need work. No new snapshot is attached as success evidence because the current frame is not correct enough. The issue remains open until an actual textured scenery snapshot showing correct camera behavior is attached.

Implementation update in f6f5abe. The reusable renderer now lives in the separate metacrate-rendering-wgpu crate, with projection camera, headless wgpu color/depth rendering, readback, and the existing software fallback. The agent now receives real extended-region terrain, terrain detail textures, uploaded mesh assets, per-vertex UV texture samples, face shading, a corrected native camera axis, and bounded JPEG output at 640x360. The network composition root and production AgentThrottle delivery were also fixed so terrain packets reach the agent reliably. Live two-account verification exercised the real Mentra SSE runtime and GPT-5.6 Luna image input. The model received the generated JPEG and described textured terrain, but also unresolved white and gray geometry, severe occlusion and overlaps, mesh gaps, and missing textures. The production scene summary reported 93 tracked objects, truncated geometry, and 42 missing textures. Direct inspection agrees with that description. This proves camera tool execution, JPEG attachment, SSE model vision, wgpu render and readback, and terrain delivery. It does not satisfy the visual closure gate: scene transforms, object bounds and culling, material and texture resolution, mesh fidelity, avatars, and attachments still need work. No new snapshot is attached as success evidence because the current frame is not correct enough. The issue remains open until an actual textured scenery snapshot showing correct camera behavior is attached.
Author
Owner

Implemented and verified in 692894c (pushed to main). The later agreed architecture supersedes the original direct-wgpu spike note: metacrate-rendering-wgpu is a reusable library backed internally by Bevy/wgpu, with a dedicated-thread offscreen backend, deterministic software fallback, and an optional window feature.

Live-grid evidence after moving out from beneath the large mesh, returning through the conventional start location, settling on terrain, and selecting a clear 64 m scenic view:

Issue 136 live OpenSim render

The final two frames were byte-identical (02df88a6242269e93ed7055e5985e6eb41291316f4d96e01e4f82500ddb84640): Broceliande, 249 selected objects, 60,965 triangles, no object/avatar truncation. The image shows textured rolling terrain and a coherent uploaded-mesh structure. The scene cache stayed stable between frames.

Implemented coverage includes legacy prims, sculpt maps, uploaded meshes, recursive linksets and focused avatar attachments, terrain/water, legacy Blinn-Phong and PBR materials, per-map UV transforms, pure-Rust JPEG-2000 decode, mipmapped textures, persistent decoded/GPU geometry caches, configurable distance-only view radius (64 m default), bounded rolling asset requests, camera-facing correctness, teleport-aware authoritative capture, renderer timeout/shutdown handling, and JPEG output for Mentra image blocks.

Verification:

  • renderer all-feature GPU tests: 3 passed;
  • grid-agent: 153 library tests plus every non-live integration suite passed;
  • strict Clippy on both crates with all targets/features, formatting, and diff checks passed;
  • live two-account renderer run passed and logged both accounts out cleanly;
  • optional window support no longer starts the winit event loop on the headless worker thread.

Observed limits: the live region cache reached roughly 18.3k prims (about 16.8k uploaded meshes); a 64 m frame selected 249 objects. 183 selected entities still had at least one referenced texture unavailable from the grid after settling, so content availability was the remaining visual-fidelity limit, not entity/triangle truncation or GPU rasterization. The current configured LLM service returned HTML 404 for the Mentra-owned /v1/responses route before Luna inference, so independent model description could not be obtained without bypassing Mentra; the attached evidence itself was inspected directly.

Implemented and verified in `692894c` (pushed to `main`). The later agreed architecture supersedes the original direct-wgpu spike note: `metacrate-rendering-wgpu` is a reusable library backed internally by Bevy/wgpu, with a dedicated-thread offscreen backend, deterministic software fallback, and an optional window feature. Live-grid evidence after moving out from beneath the large mesh, returning through the conventional start location, settling on terrain, and selecting a clear 64 m scenic view: ![Issue 136 live OpenSim render](https://git.rfc1437.de/attachments/f2d90245-4091-45cb-92c6-6e7d77a63a18) The final two frames were byte-identical (`02df88a6242269e93ed7055e5985e6eb41291316f4d96e01e4f82500ddb84640`): Broceliande, 249 selected objects, 60,965 triangles, no object/avatar truncation. The image shows textured rolling terrain and a coherent uploaded-mesh structure. The scene cache stayed stable between frames. Implemented coverage includes legacy prims, sculpt maps, uploaded meshes, recursive linksets and focused avatar attachments, terrain/water, legacy Blinn-Phong and PBR materials, per-map UV transforms, pure-Rust JPEG-2000 decode, mipmapped textures, persistent decoded/GPU geometry caches, configurable distance-only view radius (64 m default), bounded rolling asset requests, camera-facing correctness, teleport-aware authoritative capture, renderer timeout/shutdown handling, and JPEG output for Mentra image blocks. Verification: - renderer all-feature GPU tests: 3 passed; - grid-agent: 153 library tests plus every non-live integration suite passed; - strict Clippy on both crates with all targets/features, formatting, and diff checks passed; - live two-account renderer run passed and logged both accounts out cleanly; - optional window support no longer starts the winit event loop on the headless worker thread. Observed limits: the live region cache reached roughly 18.3k prims (about 16.8k uploaded meshes); a 64 m frame selected 249 objects. 183 selected entities still had at least one referenced texture unavailable from the grid after settling, so content availability was the remaining visual-fidelity limit, not entity/triangle truncation or GPU rasterization. The current configured LLM service returned HTML 404 for the Mentra-owned `/v1/responses` route before Luna inference, so independent model description could not be obtained without bypassing Mentra; the attached evidence itself was inspected directly.
hugo closed this issue 2026-08-22 15:43:30 +00:00
hugo reopened this issue 2026-08-22 15:46:57 +00:00
Author
Owner

Correction to the previous completion comment: accepting the 404 and closing this issue was wrong. The required model-description gate had not passed, so the issue was reopened.

Root cause: Mentra provider 0.5.1 treated only a base path exactly equal to /v1 as already versioned. With the configured nested base https://opencode.ai/zen/go/v1, it requested /zen/go/v1/v1/responses, which returned the HTML 404. The documented /zen/go/v1/responses endpoint itself was healthy and returned SSE. Commit 19ebee1 patches this inside the Mentra provider layer, adds the nested-base regression case, and makes the live image test fail when no non-empty model description is returned. MetaCrate still supplies only endpoint/key/model; Mentra continues to own URL construction, HTTP, SSE, multimodal payloads, and runtime handling.

Final snapshot sent through the corrected Mentra SSE runtime to GPT-5.6 Luna:

Issue 136 final live OpenSim render

Luna response from the passing live test:

The scene shows a low-poly outdoor virtual landscape under a dark blue sky. It contains rolling green hills and a broad, muted beige/gray foreground, along with recognizable mesh scenery on the right: blocky stone or concrete ruins, platforms, and several thin white, leafless-looking trees or poles.

Yes, there is recognizable terrain texturing and mesh-based scenery, although both are fairly low-detail and some surfaces appear very dark or weakly textured. No clear catastrophic rendering corruption is visible. The thin white branching forms and the angular, dark structures look like scene geometry rather than obvious glitches, though the foreground is unusually blurred/flat and some objects appear visually harsh or partially unlit.

Verification after the fix:

  • vendored Mentra nested endpoint regression: passed;
  • live JPEG-to-Luna Mentra SSE test: passed twice with non-empty scene descriptions;
  • grid-agent: 153 library tests and all normal integration suites passed;
  • strict all-feature Clippy, formatting, and diff checks passed.
Correction to the previous completion comment: accepting the 404 and closing this issue was wrong. The required model-description gate had not passed, so the issue was reopened. Root cause: Mentra provider 0.5.1 treated only a base path exactly equal to `/v1` as already versioned. With the configured nested base `https://opencode.ai/zen/go/v1`, it requested `/zen/go/v1/v1/responses`, which returned the HTML 404. The documented `/zen/go/v1/responses` endpoint itself was healthy and returned SSE. Commit `19ebee1` patches this inside the Mentra provider layer, adds the nested-base regression case, and makes the live image test fail when no non-empty model description is returned. MetaCrate still supplies only endpoint/key/model; Mentra continues to own URL construction, HTTP, SSE, multimodal payloads, and runtime handling. Final snapshot sent through the corrected Mentra SSE runtime to GPT-5.6 Luna: ![Issue 136 final live OpenSim render](https://git.rfc1437.de/attachments/f2d90245-4091-45cb-92c6-6e7d77a63a18) Luna response from the passing live test: > The scene shows a low-poly outdoor virtual landscape under a dark blue sky. It contains rolling green hills and a broad, muted beige/gray foreground, along with recognizable mesh scenery on the right: blocky stone or concrete ruins, platforms, and several thin white, leafless-looking trees or poles. > > Yes, there is recognizable terrain texturing and mesh-based scenery, although both are fairly low-detail and some surfaces appear very dark or weakly textured. No clear catastrophic rendering corruption is visible. The thin white branching forms and the angular, dark structures look like scene geometry rather than obvious glitches, though the foreground is unusually blurred/flat and some objects appear visually harsh or partially unlit. Verification after the fix: - vendored Mentra nested endpoint regression: passed; - live JPEG-to-Luna Mentra SSE test: passed twice with non-empty scene descriptions; - grid-agent: 153 library tests and all normal integration suites passed; - strict all-feature Clippy, formatting, and diff checks passed.
hugo closed this issue 2026-08-22 16:00:29 +00:00
hugo reopened this issue 2026-08-22 16:28:05 +00:00
Author
Owner

Completed in d85f7d2 and pushed to main.

Final live OpenSim capture from Myrddin's authoritative position and facing direction in the 1024 x 1024 Broceliande varregion:

Issue 136 final v36 live OpenSim render

  • JPEG SHA-256: cabcfbbf95bca0ede686e1418b69a94a51135124f5b3687ad18c7d1619fa5b61
  • resolution: 1920 x 1080
  • camera: [683.7551, 541.1501, 68.862404]
  • forward: [1.0, -0.0000305, 0.0000305]
  • configurable view radius: 64 m for this run
  • selected scene: 211 objects, 427,829 triangles
  • truncation: no object or avatar truncation
  • terrain: available
  • unresolved grid textures: 5

The same JPEG was sent as an image attachment through the production Mentra SSE runtime to GPT-5.6 Luna. The passing live test returned:

The scene depicts a detailed rocky, mossy mountain or ruin environment. It includes textured stone walls and boulders, a grassy flower-covered slope, dense shrubs and vines, and stone steps leading to a dark arched doorway. The terrain and mesh scenery are clearly recognizable and richly textured.

There are some conspicuous dark/black speckled patches among the foliage, possibly caused by alpha-texture or shadow-rendering artifacts, plus a partially clipped dark object at the lower-right edge. However, the overall scene remains coherent without major geometry failure.

QUALITY: PASS

The main fidelity root cause was legacy Blinn-Phong texture V orientation: the CPU legacy sampler used 1-v, while the Bevy material shader did not. The shared legacy shader now applies the correct V orientation to diffuse, normal, and specular maps. Alpha-weighted image resizing and mip generation prevent transparent texels from bleeding black into foliage. Per-face prim alpha remains applied in addition to texture alpha.

The client now resolves the simulator's actual region dimensions from the asynchronous map event stream at startup, uses 256 x 256 only as a fallback, and filters continuously arriving events by the requested region. Scene selection is distance-only and uses the configurable 64 m default; persistent assets use the platform cache ($HOME/.cache/metacrate on Linux). LibreMetaverse compatibility adaptations are recorded in crates/libremetaverse/CHANGES.md.

Verification:

  • live renderer capture passed and logged out normally (416.99 s)
  • live Mentra SSE image-description test passed (5.19 s)
  • renderer GPU tests: 4/4
  • grid-agent vision tests: 16/16
  • dependency-policy tests: 7/7
  • complete grid-agent library suite: 159/159, with normal integration suites passing
  • complete LibreMetaverse validation: 351 unit, 13 caps HTTP, 27 network-manager, and 12 UDP-transport tests passing
  • strict all-target Clippy for the three affected crates, formatting, and diff checks passed

Observed limiting factors: the first uncached live frame is dominated by pure-Rust asset fetch/decode and mesh reconstruction rather than GPU rasterization; this run took about seven minutes. Map replies varied from roughly 2.7 to 9.1 seconds, which requires the documented 15-second bounded lookup timeout. The configured geometry cap is 1,048,576 triangles and was not reached; neither entity nor avatar truncation occurred. Five referenced textures remained unavailable from the grid. The remaining minor black foliage speckles noted by Luna are localized alpha/content artifacts, not missing scene geometry, and the independent image gate passed.

Completed in `d85f7d2` and pushed to `main`. Final live OpenSim capture from Myrddin's authoritative position and facing direction in the 1024 x 1024 Broceliande varregion: ![Issue 136 final v36 live OpenSim render](https://git.rfc1437.de/attachments/b2736ee5-9ea4-4ca1-ab45-b739f1f3a28b) - JPEG SHA-256: `cabcfbbf95bca0ede686e1418b69a94a51135124f5b3687ad18c7d1619fa5b61` - resolution: 1920 x 1080 - camera: `[683.7551, 541.1501, 68.862404]` - forward: `[1.0, -0.0000305, 0.0000305]` - configurable view radius: 64 m for this run - selected scene: 211 objects, 427,829 triangles - truncation: no object or avatar truncation - terrain: available - unresolved grid textures: 5 The same JPEG was sent as an image attachment through the production Mentra SSE runtime to GPT-5.6 Luna. The passing live test returned: > The scene depicts a detailed rocky, mossy mountain or ruin environment. It includes textured stone walls and boulders, a grassy flower-covered slope, dense shrubs and vines, and stone steps leading to a dark arched doorway. The terrain and mesh scenery are clearly recognizable and richly textured. > > There are some conspicuous dark/black speckled patches among the foliage, possibly caused by alpha-texture or shadow-rendering artifacts, plus a partially clipped dark object at the lower-right edge. However, the overall scene remains coherent without major geometry failure. > > QUALITY: PASS The main fidelity root cause was legacy Blinn-Phong texture V orientation: the CPU legacy sampler used `1-v`, while the Bevy material shader did not. The shared legacy shader now applies the correct V orientation to diffuse, normal, and specular maps. Alpha-weighted image resizing and mip generation prevent transparent texels from bleeding black into foliage. Per-face prim alpha remains applied in addition to texture alpha. The client now resolves the simulator's actual region dimensions from the asynchronous map event stream at startup, uses 256 x 256 only as a fallback, and filters continuously arriving events by the requested region. Scene selection is distance-only and uses the configurable 64 m default; persistent assets use the platform cache (`$HOME/.cache/metacrate` on Linux). LibreMetaverse compatibility adaptations are recorded in `crates/libremetaverse/CHANGES.md`. Verification: - live renderer capture passed and logged out normally (416.99 s) - live Mentra SSE image-description test passed (5.19 s) - renderer GPU tests: 4/4 - grid-agent vision tests: 16/16 - dependency-policy tests: 7/7 - complete grid-agent library suite: 159/159, with normal integration suites passing - complete LibreMetaverse validation: 351 unit, 13 caps HTTP, 27 network-manager, and 12 UDP-transport tests passing - strict all-target Clippy for the three affected crates, formatting, and diff checks passed Observed limiting factors: the first uncached live frame is dominated by pure-Rust asset fetch/decode and mesh reconstruction rather than GPU rasterization; this run took about seven minutes. Map replies varied from roughly 2.7 to 9.1 seconds, which requires the documented 15-second bounded lookup timeout. The configured geometry cap is 1,048,576 triangles and was not reached; neither entity nor avatar truncation occurred. Five referenced textures remained unavailable from the grid. The remaining minor black foliage speckles noted by Luna are localized alpha/content artifacts, not missing scene geometry, and the independent image gate passed.
hugo closed this issue 2026-08-23 08:21:32 +00:00
Sign in to join this conversation.