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 RealStarInstVB48-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.