# Original galaxy sprite material and masks This is offline local-file evidence. It does not establish live game coverage or complete visual equivalence. ## Source and reproducible extraction The original signed resource `Win64/01/19b9e393c96329f63707aeade6a46e8cf3b71398` has SHA256 `7da2211c8223413f94cb6b32ec9a72845268bbf0d05eeb8f4bcc824491480b96`. Its decoded FRES SHA256 is `27690ada3e39254b6d768dda770f07d64a26b6ad5819bf0106722f9eb6dcbfd5`; its bounded inflated stream is28,106,950 bytes, SHA256 `f258703e3d5e7fad602ce33ff218bc4e86d0385a0fb43a72b83a14fd9df3ce87`. `galaxy_render_material_prefixes.py` selects this single bundle using5247 original FGM/texture header prefixes (8192bytes each,two workers). `Extract-GalaxyRenderMaterials.py` parses its three frozen pools,55 roots,146 internal references,31 external texture bindings,51 buffer groups and80 buffer extents. Buffer payloads are **column-major**, not group-major. It exports26 FGM materials and21 texture descriptors to `artifacts/galaxy-query-research/power-outer-sources/material/original-materials.json`. Both physical `spectralclass_nodepth` and classified `spectralclassvismode_nodepth` are `BackgroundStars`, not a separate sphere renderer. The actual FRES external binding table links root14 and24 to `spectralclassinnebula_nodepth.pdiffusetexture`, and root7 and22 to `spectralclassvismodeinnebula_nodepth.pdiffusetexture`. Both payloads are byte-identical SHA256 `d07d66706666ee7a097f0545faa6e55e18553c678c73bf6f73ae8f8860323b4e`. Thus the shared array is supported by explicit dependency bindings as well as matching bytes. The array is512×512×28 layers,10 mip levels. Its internal format byte95 is **not DXGI95**: first-mip row pitch1024 and slice size131072 describe BC1/DXT1 blocks. Full original payload is5,074,944bytes including padded mip rows. `Build-OriginalGalaxySpriteAssets.py` copies that payload exactly, creates a deterministic430014-byte gzip, and decodes a labelled inspection sheet with Pillow's DXT1 decoder. No image is generated or painted. Core validates the embedded bytes and all mip bounds before the GPU creates280 immutable BC1 subresources. ## Original shape getters Getter evidence refers to old pinned client SHA256 `6891f70a021fa9f3a0e00458c284f48d1226e68ae7fc02ad48081aed47857e93`. No original functions are invoked. `3B346B0` obtains its index from selected style vtable+58 and stores it at aggregate-style+14. Default `3B33110` writes the special flag false and returns13. Uniform, Population, Allegiance, Government, Economy, StarClass, State, Security, Visited, Exploration, Trade, Civilisation, Services and FleetCarrier vtables all use this getter. Layer13 is a **flat white disc**; layer14 is a separate hollow shaded limb. A sphere requirement inferred by earlier implementation is not evidence of the game's default shape. Territory and outer Activities use `3B32DD0`: original StateIndex2→16,3→21,4→18,5→19,6→22,7→23,otherwise15. These indices are the original metadata-derived state indices; public PowerState enum order is not substituted. Commodity `3B32CD0` returns the original row's byte+1C. The recovered commodity configuration gives Import/ImportNothing12(diamond), Export/ExportNothing11(triangle), None13. Colonisation `3B32D20` uses the intermediate classification and flags returned by `3B1A200`, not raw eligibility status alone: intermediate1→20,2→24,3→25,4→17/18/26/27 depending on three additional flags,otherwise13. Those flags must be proven before selecting these layers from account data; the current fallback remains13. Physical `3B32EE0` uses classification bits10..14 as a luminosity-map override, then bits0..5 as a star-map lookup, otherwise13. Types41/42 return8 with a separate special flag. Its two maps are original shared-appearance fields50/60, already exported in `original-appearance.json`; coloured physical masks require the original shader channel weights and must not be treated as ordinary RGB sprites. ## Original compiled shader `Extract-GalaxyOriginalEffects.py` reads two bounded local `Win64/EffectsBinary` archives. `Effects_Win64_SM50.arc` SHA256 `e4608c25412842938b5022668ccf37493cfd4cb6ddcaa02d28016637b5910789` inflates to18,662,120bytes; `Effects2_Win64_SM50.arc` SHA256 `f205ce866b084f793554b867925fc53a4c8af2908abf2ed07389b1f437f365dc` inflates to71,115,408bytes. Exact DXBC names, offsets, sizes and hashes are exported under `power-outer-sources/effects/original-effects.json`. Windows `D3DDisassemble` only reads the selected DXBC; it does not execute shader or game code. `BackgroundStars` VS at offset4423512 (1068bytes,SHA256 `4bfe9dac118e66bfdef4016870890f892c79c5c525f6966501a788304fb5b09d`) raises instance RGB to `pColourGamma`, which is1 for physical and2.2 for classified. Its camera-facing world quad uses the instance size and the shared camera basis. PS at4424880 (1176bytes,SHA256 `a9eef9ea89da95e7810933cdbf58b798e105378ab4f9187409b232ab8fe91d9c`) samples the array with mip bias-1, combines its RGB channels using two instance weights, raises this sum to1.2, and applies radial internal glow. Authored FGM X/Y/Z are1.17/1/1.16, but they are overwritten at runtime as described below. It clamps RGB to0..100, multiplies it by shared `cb1[90].y`, and outputs instance alpha. The shared RGB multiplier's exact field binding and final scene tone mapping still need closure before claiming complete shader restoration. It is not labelled exposure without that evidence. `Extract-GalaxyMaterialPropertySlots.py` now verifies the actual named wrappers, their PE instructions and frozen render configuration. Constructor3A09F20 binds `pInternalGlowParamsX/Y/Z` at value offsets998/A28/AB8;3AAC040 publishes their actual name/value pairs through4342150.3AB44E0 overwrites all five stellar publishers from config180 `(2.75,.17,1.903)` when renderer2A7 is false, or config188 `(4,1,0)` when true.3A724E0 obtains that flag through Main interface+58/vfunc90→3B442E0, and original Main ctor initializes its underlying byte2D8 to false. Its semantic name and external writer remain unknown, so the tool uses the proved default branch without guessing a map-mode mapping. The production PS now applies that default source vector rather than the authored FGM values. `research/GalaxyStellarShaderProbe` independently runs the actual hash-verified original PS DXBC against the production PS with matched inputs and the source vector. Four R32 float centre samples, including HDR and zero alpha, have exactly0 RGB vector difference after the tool's explicit premultiplication adaptation. The bridge VS preserves the original output register order as well as semantics. This tests the original pixel arithmetic; it does not certify the unknown shared multiplier, alternate flag, final blending or game presentation. All19 current shader entry points compile, and the68-instance source-mask contact sheet is generated separately. ## Actual Galaxy instance and unit quad `Extract-GalaxyStarInstanceEvidence.py` reproduces `power-outer-sources/galaxy-star-instance.json` from hash-pinned image bytes and frozen configuration. This is the actual Galaxy path, separate from the SystemMap `RealStarInstVB`48-byte path. Renderer constructor3A06740 registers appearance interface5F05DB4 at1E0; subtract20 reaches callback base+60/vtable552D6A8. Callback0=3B346B0 fills size/RGBA/index/special/opacity;3A15D90 rejects zero size/alpha and writes56-byte cell style records.3A66600 builds these records, and main frame3A25340 consumes the activeD80/D88 buffer, calling3A431C0 with style+14. 3A431C0 appends **52-byte** instances: actual worldXYZ at0, float mask weights at12/16/20, mapped layer at24, half4 at28, and unclamped floatRGBA at36. The half4 is `(1,.1,styleSize,10)`; VS reads only its z. Renderer9D8/9DC values come from original render-config+168, whose first float2 is exactly1,1. Render-config+170 is a28-entry byte-pair map, all identity0..27. The white disc has all three RGB channels=1, so its light term is `pow(3,1.2)`, not `pow(1,1.2)`. The frame's actual per-viewport star primitive is created by3A441A0→39FB140→3C01470(object+88,vertexCount6)→3C10980.3C01470's direct call target is checked in pinned bytes.3C10980 converts six original static float4 records to half4 UV/corners: `(0,1,-1,-1),(0,0,-1,1),(1,0,1,1),(1,0,1,1),(1,1,1,-1),(0,1,-1,-1)`. Source RVAs54C7D80/70/60 and50BD330, raw bytes and order are retained in the JSON.3A1EBB0 uploads instances with an explicit stride34(hex). Thus the actual quad half-extent is exactly `half(styleSize)` world units. A camera-facing unit-basis quad has constant depth, so its screen half-extent is `half(styleSize)*FocalLength/Depth`. The production original branch now uses this relationship, without spectral profile, zoom curve, radius minimum,4x mask expansion or estimated distance opacity. The input style is the original active physical size or original classified size. Original physical layer selection is also restored from native classification, including luminosity precedence and the41/42 special case. Unknown physical styles remain an explicit fallback; the separate original black-hole shader is not yet restored. ## Implemented verification and limits `GalaxySpriteGraphics.cs` loads the original array. `PSStar` consumes original RGB masks, instance weights, gamma and internal-glow mathematics. Original source colours remain floatRGBA through the CPU/GPU path, preserving HDR values such as100 or1.5 instead of going through `StarColour(byte)`. Source alpha0 stays hidden. Selection and current-location markers remain independent. The original branch uses proven world size; public-catalogue physical fallback and special black holes still use an estimated profile. The tool adapts alpha coverage for its premultiplied SDR surface; the original shared multiplier, blend and final HDR output remain unclosed. Therefore `OriginalClassifiedShaderRestored=false` while `OriginalGalaxyWorldSizeRestored=true`. The actual production GPU partial and VSStar/PSStar were compiled and rendered in a separate D3D11 WARP probe:68 labelled fixture instances,17 layers,4 sizes/alpha styles,one draw. Image `artifacts/galaxy-sprite-shader-validation/classified-sprites.png` was inspected at1600×900; disc/rings/triangles remain distinct and have no square backgrounds. Default disc interior samples areG255, outsideG4. A second R32G32B32A32Float target verifies four actual GPU outputs against the original DXBC formula: classified input `(.25,.5,1.5,1)` gives `(.441048,2.026526,22.72055,1)`; physical gamma1/alpha.35 gives `(.814753,1.629507,4.888520,.35)`; alpha0 gives all zero; HDR100 reaches the original clamp100. These verify original arithmetic and retained input range, not complete SDR/game presentation parity. The visible fixture can clip channels because its final output differs from the game's unknown shared multiplier/HDR stage. These are synthetic input fixtures with actual original image bytes, not live query screenshots. `GalaxyOriginalSpriteTests` decodes the embedded masks through an independent BC1 decoder and verifies the default disc has a flat white interior while the original ring has a black centre. Fourteen appearance/geometry tests pass in the isolated harness, including physical layer selection and12 style/depth combinations compared with projected original unit-quad endpoints. All15 production HLSL entry points compile after the original camera-basis correction. Integrated Main captures, original global multiplier/HDR and black-hole output remain separate checks. ## Background finding The original GDM/RLE source, constructor-default MilkyWayLayerJob, actual atlas/RGB/Y textures and DistantMilkyWay shader arithmetic are now connected separately; see `galaxy-original-milky-way-evidence.md` for exact resources, inspected WARP captures and remaining material/Dust/shared-output limits. The256px cockpit sky cube is intentionally absent from the normal map because it produced giant square/diamond resolved stars and duplicates. No arbitrary grey fill is added to hide incomplete original background stages.