ritenseki 546d8ef7ba Live: implement MirrorReflection — and it resolves the stage floor blow-out
Rebuilt Gallop.MirrorReflection from its original signature, so Unity deserializes the real
fields out of the bundle rather than anything being inferred. All 13 field names are copied
verbatim from the TypeTree, including the original's typo `_mirrorCliipPlaneOffset` — spelling
it correctly would silently receive no data.

The receiving end was looked up, not guessed. mtl_env_liveNNNNN_mirror000 uses
Cygames/MirrorAndShadow/ReceiveMirror, which declares exactly four properties — _MainTex,
_ReflectionTex, _Color, _ReflectionRate — and the component's _mirrorReflectionColor and
_mirrorReflectionRate line up with the last two name for name. Texture size, cull mask, clear
colour and clip-plane offset all come straight from the serialized values, which differ per
stage (256/12544 on live10149, 512/12288 on live10132), confirming real data is arriving.

Deliberately not implemented, because there is no ground truth for them:
  * _direction is an enum whose meaning is unrecoverable — IL2CPP metadata is encrypted.
    The mirror plane is derived from the mesh's own normals instead, which is geometry rather
    than a guess, and yields (0,1,0) on both stages. The field's value is logged as unused.
  * _mirrorDistortionTileOffset / _mirrorDistortionPower belong to the ReceiveDistortionMirror
    variant; these materials use the plain one.
  * _useMirrorTextureScale / _mirrorTextureScaleForBaseCamera — semantics unknown.

Rendering goes through RenderPipelineManager.beginCameraRendering and RenderSingleCamera.
Camera.Render() is not supported under SRP and would have failed silently.

This also settles the long-standing floor blow-out, and the diagnosis I had been running was
aimed at the wrong objects the entire time. ReceiveMirror's _ReflectionRate defaults to 1.0
while _ReflectionTex had never been assigned, and Unity substitutes a white texture for an
unbound sampler — a full-strength white reflection, i.e. a solid white floor. Binding the
reflection RT fixes it.

CLAUDE.md recorded the blown-out objects as plane_000 / stage_object_001 / specular_002 and I
took that as given, spending four rounds eliminating mechanisms on those three. The actual
culprit is mirror_a, which sits at the same position and scale under the same parent — visually
indistinguishable, entirely different name. The earlier "_EnvRate = 0 changes nothing" result
was consistent all along: it was toggling a different set of objects.

Both files gain the lesson: field values and shader property tables are hard data, but a
document's description of which object looks wrong is not, and a visual bug should start by
confirming which object the symptom belongs to.

Water surfaces are absent, not broken — none of the three downloaded stages has a ReceiveWater
material; each has exactly one ReceiveMirror.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-05 14:45:12 +08:00
2025-01-20 11:11:43 +01:00
2025-07-20 07:18:58 +02:00
2022-06-18 17:47:39 +02:00
2022-09-07 01:22:44 +08:00
2025-10-03 11:00:39 +02:00

Uma Viewer (2)

Unity application that makes it easy to view assets from Uma Musume: Pretty Derby.

Version Supported
JP (DMM) ✅
JP (Steam) ✅
KR ✅
Global ✅

⚠️ 🌍 EN/Global users ⚠️

In UmaViewer, set WorkMode to Default and Region to Global in the 'Other' Settings tab.

Currently only the default work mode is supported - you need to download assets using the Download All button in the game's settings for the viewer to work.


Requirements/Installation

  1. Uma Musume: Pretty Derby with full data download is required to run the viewer.
  2. Depending on your version and update status, the game stores its data in different locations
  • DMM/Steam Older installations : C:\Users\your_username\AppData\LocalLow\Cygames\umamusume(?)\
  • DMM/Steam Fresh installations : ...\Umamusume installation directory\Umamusume_Data\Persistent(?)\
  • In any case,confirm your file listing in target folder looks like this
    • Target Folder\
      • meta
      • master\
        • master.mdb
      • dat\
        • 2A\...
        • 2B\...
        • ...\...
  1. Download the most recent UmaViewer.zip file from Releases tab.
  2. Extract the archive anywhere, can be extracted over previous version.
  3. Run the UmaViewer.exe.
  4. UmaViewer will try to automatically detect the game data folder.
    • If it fails or shows an error, go to Settings → Other → Change DataPath and manually select target folder.

  • For Developers/Contributors
  1. Unity Hub with Unity Engine Version 2022.3.62f1 is recommended. It should be possible to run it on newer 2022.3.X versions.
  2. Clone or download and extract this repository.
  3. Import and Open the project in Unity Hub, missing files should be automatically repaired.
  4. Open the Assets/Scenes/Version2 scene.

Features

✓ - Working / - Incomplete x - Unsupported
Viewing main character models/animations ✓
Swapping costumes/animations between characters ✓
Viewing chibi models/animations ✓
Viewing mob (NPC) models ✓
Playing facial animations, custom sliders ✓
Cloth/Hair physics ✓
Playing Live Audio with Lyrics ✓
Exporting animations to MMD ✓
Recording animations (.gif), screenshots ✓
Viewing Props, Scenery, Live scenes /
Exporting models /

All characters and animations are supported

Mobs / background characters as well

Mixing outfits and animations

Screenshot and .gif recording

and more

Also check out:

UmaChat by kagari - model viewer fork that lets you chat with Umas using AI + TTS

Special Thank to:

MarshmallowAndroid: UmaMusumeExplorer for acb/awb decoder.

S
Description
Mirror of https://github.com/0xcjy/UmaViewer (Unity Uma Musume viewer)
Readme 159 MiB
Languages
C# 94.3%
GLSL 1.8%
ShaderLab 1.6%
C 0.7%
JavaScript 0.5%
Other 0.9%