{"schemaVersion":1,"materialContractVersion":2,"mode":"dynamic","scope":"Normative reference for this exported 2D approximation, NOT the original complete game shader.","resourceIdentity":{"format":"mode/semantic","examples":["static/pipe.pattern","dynamic/pipe.pattern"],"merge":"Use the full resources key, never semantic alone. Duplicate full keys may be deduplicated only when sha256, dimensions, colorSpace, alpha, filter and wrap all agree. Keep different game/contract versions in separate registries.","migration":"Contract 1 bare key K becomes static/K or dynamic/K according to its originating manifest. Resource file paths stay relative to their own manifest, not the aggregate root."},"coordinates":{"canvas":"128x128 pixels per 1x1 cell; pivot=(64,64); image origin top-left; +x right, +y down.","endpoints":"Canonical entry=(.5,0), exits straight=(.5,1), left=(0,.5), right=(1,.5). Rotate images and maps together about pivot.","map":"Read nearest decoded RGBA bytes. across=R/255; along=(256*G+B)/65535; coverage=A/255. Do not premultiply, apply sRGB decoding or use bilinear/mipmap filtering on maps.","geometry":"The accompanying JSON preserves source UV0/geometry for provenance; conveyor source UV0 is NOT the normalized polar mapping. Use the mapping WebP as authoritative for this 2D implementation.","conveyorMap":"Pixel center x=(column+.5)/128, y=(row+.5)/128. straight: across=(x-.1)/.8, along=y. left: dx=x, dy=y; right: dx=1-x,dy=y. corners: along=atan2(dy,dx)/(pi/2); radial=(sqrt(dx*dx+dy*dy)-.1)/.8; across=radial for left, 1-radial for right. Clamp to [0,1], use original mesh coverage.","pipeMap":"Barycentrically interpolated original UV0 of the nearest top surface, after recovered tube bend. Glass and liquid use their own mapping. Decode as above.","path":"s=routeOrigin+segmentStart+along. Each piece spans 1 path unit, including corners. segmentStart increments by 1; routeOrigin=5 in the demo is a configurable preview phase, not a game constant. Shared clocks and origin; never reset s per tile.","fillInterval":"Liquid occupancy is one continuous half-open path interval [fillStart,fillEnd], evaluated against the separate fluid mapping along coordinate. The preview pads fixed route boundaries by 1 cell; moving boundaries vary across the tube and with time (water-gas-v1)."},"sampling":{"fract":"fract(x)=x-floor(x), including negative x.","source":"src(texture,u,v) = bilinearRepeat(decodedBytes/255, fract(u), 1-fract(v)). Input uses game bottom-left UV; decoded images use top-left rows. No color conversion, premultiplication or mipmaps for dynamic data.","texelCenters":"For W,H: px=fract(u)*W-.5; py=fract(1-v)*H-.5. Bilinear weights from fractional px,py, integer texels modulo W,H.","atlas":"Conveyor atlas: eight equal horizontal cells. Select cell 0 only: u=clamp(across/8, .5/W, 1/8-.5/W); v uses full height. For current 2048x256 source, rectangle [0,0,256,256], centers u in [.000244140625,.124755859375]. Never sample other cells or use source alpha as arrow opacity.","channelTable":{"dynamic/conveyor.arrow":"R=gray arrow and halo intensity; G/B/A unused by reference. Threshold removes halo. Cell 0 only.","dynamic/conveyor.highlight":"R=flow intensity; G/B/A unused. Full texture with u=across, preserving transverse texture detail. gold-glow-20260910 appearance approximation.","dynamic/pipe.pattern":"Use R only with continuous patternU=fract(.5+across*(2*waterDirection-1)). G is an oppositely oriented authored label, retained as source data but not used by this 2D top-view adapter. Do not fold text U or splice G/R across the tube. B/A unused. Text disabled on both elbows. Revision: pipe-text-uv-v1.","dynamic/pipe.chevron":"R=double-V intensity in this 2D approximation. Original RGB retained; G/B/A not used by this reference.","dynamic/pipe.splash-noise":"Original T_fx_flow_300_D R modulates reconstructed water foam. No alpha-based masking.","static/pipe.{shape}.gas-body":"Frozen two-color mist preset for gas; replaces fluid-body and fluid-specular in static gas mode.","dynamic/pipe.fluid-motion":"RG sampled as nx=2R-1, ny=2G-1 for approximate shimmer only. B/A retained but unused. This is not a complete reconstruction of game normal decoding/lighting.","static/pipe.pattern":"Compatibility composite of the white logo core over its restrained pale-blue halo. It is a ready color sprite, NOT the RG data map. Separate static/pipe.pattern-core and static/pipe.pattern-glow are preferred; placed pipe markers are prewarped per-shape layers.","static/pipe.pattern-core":"RGB=white; A is a contrast-shaped original source R, preserving antialiased edges while making the authored HDR-white logo opaque and crisp.","static/pipe.pattern-glow":"RGB=[.78,.92,1]; A is a restrained neighborhood expansion of source R, capped at .24. It is drawn below pattern-core.","static/pipe.chevron":"RGB fixed pale tint; A is original source R. Use placed static-marker assets for canonical pipe shapes.","static/pipe.{shape}.fluid-body":"Neutral RGB shading; A=interior coverage/opacity. Static mode uses ordinary Sprite tint; dynamic mode binds it as uBase layer 2, multiplies RGB by uTint and clips by occupied.","static/pipe.{shape}.fluid-specular":"Independent white specular RGB with coverage A. Static mode uses a Sprite; dynamic mode binds it as uBase layer 3 and clips by occupied. Do not multiply by liquid tint.","static/pipe.endpoint.connector-base":"Source com_fluidrepeater albedo/mesh/UV with approximate fixed top lighting; A is alpha-tested source mesh coverage.","static/pipe.endpoint.connector-highlight":"Restrained pale-blue display glint derived from the authored bright albedo inset, including a small baked bloom; straight alpha. The enabled emissive atlas samples black on this mesh UV island in v1.5.","static/pipe.endpoint.connector":"Normal source-over composite of connector-highlight above connector-base for simple Sprite consumers.","static/pipe.endpoint.whitening":"Low-alpha pale-blue falloff shaped by the real straight-pipe glass silhouette. Canonical pipe-outward direction is image down and the falloff points inward toward image top.","dynamic/*mapping":"R=8-bit across, GB=big-endian 16-bit along, A=coverage. Hidden RGB must survive alpha=0."}},"parameters":{"staticDensity":0.11,"flowDensity":0.18,"flowOffset":1.97,"flowSpeed":1.23,"staticWidth":0.922,"flowWidth":0.88,"waterDirection":0,"waterWaveSpeed":0.8,"waterSkinSpeed":0.7,"fluidProfiles":{"item_liquid_acid":{"id":"item_liquid_acid","name":"item_liquid_acid","nameSource":"item-id-fallback","phase":"liquid","phaseType":2,"subType":0,"atlasData":"PipeLiquidAtlasData","atlasLayer":0,"material":"M_tube_art_liquid_acid","colors":{"body":{"rgba8":[255,238,160,150],"displayRgba8":[255,238,160,150],"hex":"#ffeea0","array":"T_WaterColorAtlas","layer":0,"format":"RGBA_BC7_SRGB","object":"CAB-db830311100ea6af0afab52162029165_7622698014684465723_Texture2DArray","streamSha256":"b519c917a3356a18c69785d47633fd703e371ff3eecb64b8672b0645b321a270"},"skin":{"rgba8":[255,210,0,77],"displayRgba8":[255,210,0,77],"hex":"#ffd200","array":"T_WaterSkinColorAtlas","layer":0,"format":"RGBA_BC7_SRGB","object":"CAB-9d2b46cc7274bce1f7aa154a238f4812_5988561676508966199_Texture2DArray","streamSha256":"b3e38c44101483f49603380f6958ecd60fc55c59ad41a0716c23d166df00e33e"},"skin2":{"rgba8":[137,70,45,128],"displayRgba8":[137,70,45,128],"hex":"#89462d","array":"T_WaterSkinColor2Atlas","layer":0,"format":"RGBA_BC7_SRGB","object":"CAB-55da487244add3ff79adcca818a7d23d_-8933220189111898049_Texture2DArray","streamSha256":"48806486ac45881d7c9e0cae71ea2591340d8695a9ee3b3888854fe5aa516a3d"},"splash":{"rgba8":[255,212,126,219],"displayRgba8":[255,235,187,219],"hex":"#ffebbb","array":"T_WaterSplashColorTextureArray","layer":0,"format":"RGBA_BC7_UNorm","object":"CAB-cd9e7a378dce0d3b692d7858d2129eae_2673383687997878308_Texture2DArray","streamSha256":"e20d29aec1d99538d2a199ef2696db904987165e601c4488fff6bc4963f7c486"}},"colorSpace":"rgba8 = decoded BC7 bytes; displayRgba8/hex = sRGB (UNorm color RGB converted from linear, alpha unchanged)","appearance":"2D reconstruction; shared pipe interior, phase-specific shading and moving boundaries"},"item_liquid_plant_grass_1":{"id":"item_liquid_plant_grass_1","name":"item_liquid_plant_grass_1","nameSource":"item-id-fallback","phase":"liquid","phaseType":2,"subType":2,"atlasData":"PipeLiquidAtlasData","atlasLayer":2,"material":"M_tube_art_liquid_plant","colors":{"body":{"rgba8":[12,132,75,218],"displayRgba8":[12,132,75,218],"hex":"#0c844b","array":"T_WaterColorAtlas","layer":2,"format":"RGBA_BC7_SRGB","object":"CAB-db830311100ea6af0afab52162029165_7622698014684465723_Texture2DArray","streamSha256":"b519c917a3356a18c69785d47633fd703e371ff3eecb64b8672b0645b321a270"},"skin":{"rgba8":[38,185,56,102],"displayRgba8":[38,185,56,102],"hex":"#26b938","array":"T_WaterSkinColorAtlas","layer":2,"format":"RGBA_BC7_SRGB","object":"CAB-9d2b46cc7274bce1f7aa154a238f4812_5988561676508966199_Texture2DArray","streamSha256":"b3e38c44101483f49603380f6958ecd60fc55c59ad41a0716c23d166df00e33e"},"skin2":{"rgba8":[20,96,30,201],"displayRgba8":[20,96,30,201],"hex":"#14601e","array":"T_WaterSkinColor2Atlas","layer":2,"format":"RGBA_BC7_SRGB","object":"CAB-55da487244add3ff79adcca818a7d23d_-8933220189111898049_Texture2DArray","streamSha256":"48806486ac45881d7c9e0cae71ea2591340d8695a9ee3b3888854fe5aa516a3d"},"splash":{"rgba8":[135,233,137,204],"displayRgba8":[192,245,194,204],"hex":"#c0f5c2","array":"T_WaterSplashColorTextureArray","layer":2,"format":"RGBA_BC7_UNorm","object":"CAB-cd9e7a378dce0d3b692d7858d2129eae_2673383687997878308_Texture2DArray","streamSha256":"e20d29aec1d99538d2a199ef2696db904987165e601c4488fff6bc4963f7c486"}},"colorSpace":"rgba8 = decoded BC7 bytes; displayRgba8/hex = sRGB (UNorm color RGB converted from linear, alpha unchanged)","appearance":"2D reconstruction; shared pipe interior, phase-specific shading and moving boundaries"},"item_liquid_sewage":{"id":"item_liquid_sewage","name":"item_liquid_sewage","nameSource":"item-id-fallback","phase":"liquid","phaseType":2,"subType":3,"atlasData":"PipeLiquidAtlasData","atlasLayer":3,"material":"M_tube_art_liquid_wastewater","colors":{"body":{"rgba8":[41,13,5,242],"displayRgba8":[41,13,5,242],"hex":"#290d05","array":"T_WaterColorAtlas","layer":3,"format":"RGBA_BC7_SRGB","object":"CAB-db830311100ea6af0afab52162029165_7622698014684465723_Texture2DArray","streamSha256":"b519c917a3356a18c69785d47633fd703e371ff3eecb64b8672b0645b321a270"},"skin":{"rgba8":[130,81,108,128],"displayRgba8":[130,81,108,128],"hex":"#82516c","array":"T_WaterSkinColorAtlas","layer":3,"format":"RGBA_BC7_SRGB","object":"CAB-9d2b46cc7274bce1f7aa154a238f4812_5988561676508966199_Texture2DArray","streamSha256":"b3e38c44101483f49603380f6958ecd60fc55c59ad41a0716c23d166df00e33e"},"skin2":{"rgba8":[29,2,12,77],"displayRgba8":[29,2,12,77],"hex":"#1d020c","array":"T_WaterSkinColor2Atlas","layer":3,"format":"RGBA_BC7_SRGB","object":"CAB-55da487244add3ff79adcca818a7d23d_-8933220189111898049_Texture2DArray","streamSha256":"48806486ac45881d7c9e0cae71ea2591340d8695a9ee3b3888854fe5aa516a3d"},"splash":{"rgba8":[92,71,125,166],"displayRgba8":[162,144,186,166],"hex":"#a290ba","array":"T_WaterSplashColorTextureArray","layer":3,"format":"RGBA_BC7_UNorm","object":"CAB-cd9e7a378dce0d3b692d7858d2129eae_2673383687997878308_Texture2DArray","streamSha256":"e20d29aec1d99538d2a199ef2696db904987165e601c4488fff6bc4963f7c486"}},"colorSpace":"rgba8 = decoded BC7 bytes; displayRgba8/hex = sRGB (UNorm color RGB converted from linear, alpha unchanged)","appearance":"2D reconstruction; shared pipe interior, phase-specific shading and moving boundaries"},"item_liquid_water":{"id":"item_liquid_water","name":"item_liquid_water","nameSource":"item-id-fallback","phase":"liquid","phaseType":2,"subType":4,"atlasData":"PipeLiquidAtlasData","atlasLayer":4,"material":"M_tube_art_liquid_water","colors":{"body":{"rgba8":[92,159,224,179],"displayRgba8":[92,159,224,179],"hex":"#5c9fe0","array":"T_WaterColorAtlas","layer":4,"format":"RGBA_BC7_SRGB","object":"CAB-db830311100ea6af0afab52162029165_7622698014684465723_Texture2DArray","streamSha256":"b519c917a3356a18c69785d47633fd703e371ff3eecb64b8672b0645b321a270"},"skin":{"rgba8":[82,177,209,120],"displayRgba8":[82,177,209,120],"hex":"#52b1d1","array":"T_WaterSkinColorAtlas","layer":4,"format":"RGBA_BC7_SRGB","object":"CAB-9d2b46cc7274bce1f7aa154a238f4812_5988561676508966199_Texture2DArray","streamSha256":"b3e38c44101483f49603380f6958ecd60fc55c59ad41a0716c23d166df00e33e"},"skin2":{"rgba8":[7,36,58,255],"displayRgba8":[7,36,58,255],"hex":"#07243a","array":"T_WaterSkinColor2Atlas","layer":4,"format":"RGBA_BC7_SRGB","object":"CAB-55da487244add3ff79adcca818a7d23d_-8933220189111898049_Texture2DArray","streamSha256":"48806486ac45881d7c9e0cae71ea2591340d8695a9ee3b3888854fe5aa516a3d"},"splash":{"rgba8":[110,203,219,232],"displayRgba8":[175,231,238,232],"hex":"#afe7ee","array":"T_WaterSplashColorTextureArray","layer":4,"format":"RGBA_BC7_UNorm","object":"CAB-cd9e7a378dce0d3b692d7858d2129eae_2673383687997878308_Texture2DArray","streamSha256":"e20d29aec1d99538d2a199ef2696db904987165e601c4488fff6bc4963f7c486"}},"colorSpace":"rgba8 = decoded BC7 bytes; displayRgba8/hex = sRGB (UNorm color RGB converted from linear, alpha unchanged)","appearance":"2D reconstruction; shared pipe interior, phase-specific shading and moving boundaries"},"item_liquid_xiranite":{"id":"item_liquid_xiranite","name":"item_liquid_xiranite","nameSource":"item-id-fallback","phase":"liquid","phaseType":2,"subType":7,"atlasData":"PipeLiquidAtlasData","atlasLayer":7,"material":"M_tube_art_liquid_xiranite","colors":{"body":{"rgba8":[255,246,153,200],"displayRgba8":[255,246,153,200],"hex":"#fff699","array":"T_WaterColorAtlas","layer":7,"format":"RGBA_BC7_SRGB","object":"CAB-db830311100ea6af0afab52162029165_7622698014684465723_Texture2DArray","streamSha256":"b519c917a3356a18c69785d47633fd703e371ff3eecb64b8672b0645b321a270"},"skin":{"rgba8":[255,255,203,102],"displayRgba8":[255,255,203,102],"hex":"#ffffcb","array":"T_WaterSkinColorAtlas","layer":7,"format":"RGBA_BC7_SRGB","object":"CAB-9d2b46cc7274bce1f7aa154a238f4812_5988561676508966199_Texture2DArray","streamSha256":"b3e38c44101483f49603380f6958ecd60fc55c59ad41a0716c23d166df00e33e"},"skin2":{"rgba8":[248,236,155,194],"displayRgba8":[248,236,155,194],"hex":"#f8ec9b","array":"T_WaterSkinColor2Atlas","layer":7,"format":"RGBA_BC7_SRGB","object":"CAB-55da487244add3ff79adcca818a7d23d_-8933220189111898049_Texture2DArray","streamSha256":"48806486ac45881d7c9e0cae71ea2591340d8695a9ee3b3888854fe5aa516a3d"},"splash":{"rgba8":[143,173,120,244],"displayRgba8":[197,215,182,244],"hex":"#c5d7b6","array":"T_WaterSplashColorTextureArray","layer":7,"format":"RGBA_BC7_UNorm","object":"CAB-cd9e7a378dce0d3b692d7858d2129eae_2673383687997878308_Texture2DArray","streamSha256":"e20d29aec1d99538d2a199ef2696db904987165e601c4488fff6bc4963f7c486"}},"colorSpace":"rgba8 = decoded BC7 bytes; displayRgba8/hex = sRGB (UNorm color RGB converted from linear, alpha unchanged)","appearance":"2D reconstruction; shared pipe interior, phase-specific shading and moving boundaries"},"item_liquid_xiranite_enr":{"id":"item_liquid_xiranite_enr","name":"item_liquid_xiranite_enr","nameSource":"item-id-fallback","phase":"liquid","phaseType":2,"subType":8,"atlasData":"PipeLiquidAtlasData","atlasLayer":8,"material":"M_tube_art_liquid_hyperxiranite","colors":{"body":{"rgba8":[255,247,153,215],"displayRgba8":[255,247,153,215],"hex":"#fff799","array":"T_WaterColorAtlas","layer":8,"format":"RGBA_BC7_SRGB","object":"CAB-db830311100ea6af0afab52162029165_7622698014684465723_Texture2DArray","streamSha256":"b519c917a3356a18c69785d47633fd703e371ff3eecb64b8672b0645b321a270"},"skin":{"rgba8":[228,233,193,102],"displayRgba8":[228,233,193,102],"hex":"#e4e9c1","array":"T_WaterSkinColorAtlas","layer":8,"format":"RGBA_BC7_SRGB","object":"CAB-9d2b46cc7274bce1f7aa154a238f4812_5988561676508966199_Texture2DArray","streamSha256":"b3e38c44101483f49603380f6958ecd60fc55c59ad41a0716c23d166df00e33e"},"skin2":{"rgba8":[241,210,0,194],"displayRgba8":[241,210,0,194],"hex":"#f1d200","array":"T_WaterSkinColor2Atlas","layer":8,"format":"RGBA_BC7_SRGB","object":"CAB-55da487244add3ff79adcca818a7d23d_-8933220189111898049_Texture2DArray","streamSha256":"48806486ac45881d7c9e0cae71ea2591340d8695a9ee3b3888854fe5aa516a3d"},"splash":{"rgba8":[162,229,109,255],"displayRgba8":[209,243,175,255],"hex":"#d1f3af","array":"T_WaterSplashColorTextureArray","layer":8,"format":"RGBA_BC7_UNorm","object":"CAB-cd9e7a378dce0d3b692d7858d2129eae_2673383687997878308_Texture2DArray","streamSha256":"e20d29aec1d99538d2a199ef2696db904987165e601c4488fff6bc4963f7c486"}},"colorSpace":"rgba8 = decoded BC7 bytes; displayRgba8/hex = sRGB (UNorm color RGB converted from linear, alpha unchanged)","appearance":"2D reconstruction; shared pipe interior, phase-specific shading and moving boundaries"},"item_liquid_xiranite_poly":{"id":"item_liquid_xiranite_poly","name":"item_liquid_xiranite_poly","nameSource":"item-id-fallback","phase":"liquid","phaseType":2,"subType":9,"atlasData":"PipeLiquidAtlasData","atlasLayer":9,"material":"M_tube_art_liquid_gel","colors":{"body":{"rgba8":[17,67,59,95],"displayRgba8":[17,67,59,95],"hex":"#11433b","array":"T_WaterColorAtlas","layer":9,"format":"RGBA_BC7_SRGB","object":"CAB-db830311100ea6af0afab52162029165_7622698014684465723_Texture2DArray","streamSha256":"b519c917a3356a18c69785d47633fd703e371ff3eecb64b8672b0645b321a270"},"skin":{"rgba8":[0,206,255,26],"displayRgba8":[0,206,255,26],"hex":"#00ceff","array":"T_WaterSkinColorAtlas","layer":9,"format":"RGBA_BC7_SRGB","object":"CAB-9d2b46cc7274bce1f7aa154a238f4812_5988561676508966199_Texture2DArray","streamSha256":"b3e38c44101483f49603380f6958ecd60fc55c59ad41a0716c23d166df00e33e"},"skin2":{"rgba8":[15,55,36,171],"displayRgba8":[15,55,36,171],"hex":"#0f3724","array":"T_WaterSkinColor2Atlas","layer":9,"format":"RGBA_BC7_SRGB","object":"CAB-55da487244add3ff79adcca818a7d23d_-8933220189111898049_Texture2DArray","streamSha256":"48806486ac45881d7c9e0cae71ea2591340d8695a9ee3b3888854fe5aa516a3d"},"splash":{"rgba8":[64,118,100,255],"displayRgba8":[137,181,168,255],"hex":"#89b5a8","array":"T_WaterSplashColorTextureArray","layer":9,"format":"RGBA_BC7_UNorm","object":"CAB-cd9e7a378dce0d3b692d7858d2129eae_2673383687997878308_Texture2DArray","streamSha256":"e20d29aec1d99538d2a199ef2696db904987165e601c4488fff6bc4963f7c486"}},"colorSpace":"rgba8 = decoded BC7 bytes; displayRgba8/hex = sRGB (UNorm color RGB converted from linear, alpha unchanged)","appearance":"2D reconstruction; shared pipe interior, phase-specific shading and moving boundaries"},"item_liquid_xiranite_lowpoly":{"id":"item_liquid_xiranite_lowpoly","name":"item_liquid_xiranite_lowpoly","nameSource":"item-id-fallback","phase":"liquid","phaseType":2,"subType":10,"atlasData":"PipeLiquidAtlasData","atlasLayer":10,"material":"M_tube_art_liquid_hypogel","colors":{"body":{"rgba8":[6,41,35,95],"displayRgba8":[6,41,35,95],"hex":"#062923","array":"T_WaterColorAtlas","layer":10,"format":"RGBA_BC7_SRGB","object":"CAB-db830311100ea6af0afab52162029165_7622698014684465723_Texture2DArray","streamSha256":"b519c917a3356a18c69785d47633fd703e371ff3eecb64b8672b0645b321a270"},"skin":{"rgba8":[34,135,159,26],"displayRgba8":[34,135,159,26],"hex":"#22879f","array":"T_WaterSkinColorAtlas","layer":10,"format":"RGBA_BC7_SRGB","object":"CAB-9d2b46cc7274bce1f7aa154a238f4812_5988561676508966199_Texture2DArray","streamSha256":"b3e38c44101483f49603380f6958ecd60fc55c59ad41a0716c23d166df00e33e"},"skin2":{"rgba8":[15,55,36,171],"displayRgba8":[15,55,36,171],"hex":"#0f3724","array":"T_WaterSkinColor2Atlas","layer":10,"format":"RGBA_BC7_SRGB","object":"CAB-55da487244add3ff79adcca818a7d23d_-8933220189111898049_Texture2DArray","streamSha256":"48806486ac45881d7c9e0cae71ea2591340d8695a9ee3b3888854fe5aa516a3d"},"splash":{"rgba8":[42,96,87,255],"displayRgba8":[113,165,158,255],"hex":"#71a59e","array":"T_WaterSplashColorTextureArray","layer":10,"format":"RGBA_BC7_UNorm","object":"CAB-cd9e7a378dce0d3b692d7858d2129eae_2673383687997878308_Texture2DArray","streamSha256":"e20d29aec1d99538d2a199ef2696db904987165e601c4488fff6bc4963f7c486"}},"colorSpace":"rgba8 = decoded BC7 bytes; displayRgba8/hex = sRGB (UNorm color RGB converted from linear, alpha unchanged)","appearance":"2D reconstruction; shared pipe interior, phase-specific shading and moving boundaries"},"item_liquid_copper":{"id":"item_liquid_copper","name":"item_liquid_copper","nameSource":"item-id-fallback","phase":"liquid","phaseType":2,"subType":11,"atlasData":"PipeLiquidAtlasData","atlasLayer":11,"material":"M_tube_art_liquid_copper","colors":{"body":{"rgba8":[255,72,0,255],"displayRgba8":[255,72,0,255],"hex":"#ff4800","array":"T_WaterColorAtlas","layer":11,"format":"RGBA_BC7_SRGB","object":"CAB-db830311100ea6af0afab52162029165_7622698014684465723_Texture2DArray","streamSha256":"b519c917a3356a18c69785d47633fd703e371ff3eecb64b8672b0645b321a270"},"skin":{"rgba8":[255,83,0,10],"displayRgba8":[255,83,0,10],"hex":"#ff5300","array":"T_WaterSkinColorAtlas","layer":11,"format":"RGBA_BC7_SRGB","object":"CAB-9d2b46cc7274bce1f7aa154a238f4812_5988561676508966199_Texture2DArray","streamSha256":"b3e38c44101483f49603380f6958ecd60fc55c59ad41a0716c23d166df00e33e"},"skin2":{"rgba8":[255,0,0,69],"displayRgba8":[255,0,0,69],"hex":"#ff0000","array":"T_WaterSkinColor2Atlas","layer":11,"format":"RGBA_BC7_SRGB","object":"CAB-55da487244add3ff79adcca818a7d23d_-8933220189111898049_Texture2DArray","streamSha256":"48806486ac45881d7c9e0cae71ea2591340d8695a9ee3b3888854fe5aa516a3d"},"splash":{"rgba8":[255,102,105,215],"displayRgba8":[255,170,172,215],"hex":"#ffaaac","array":"T_WaterSplashColorTextureArray","layer":11,"format":"RGBA_BC7_UNorm","object":"CAB-cd9e7a378dce0d3b692d7858d2129eae_2673383687997878308_Texture2DArray","streamSha256":"e20d29aec1d99538d2a199ef2696db904987165e601c4488fff6bc4963f7c486"}},"colorSpace":"rgba8 = decoded BC7 bytes; displayRgba8/hex = sRGB (UNorm color RGB converted from linear, alpha unchanged)","appearance":"2D reconstruction; shared pipe interior, phase-specific shading and moving boundaries"},"item_liquid_copper_enr":{"id":"item_liquid_copper_enr","name":"item_liquid_copper_enr","nameSource":"item-id-fallback","phase":"liquid","phaseType":2,"subType":12,"atlasData":"PipeLiquidAtlasData","atlasLayer":12,"material":"M_tube_art_liquid_hypercopper","colors":{"body":{"rgba8":[255,72,0,255],"displayRgba8":[255,72,0,255],"hex":"#ff4800","array":"T_WaterColorAtlas","layer":12,"format":"RGBA_BC7_SRGB","object":"CAB-db830311100ea6af0afab52162029165_7622698014684465723_Texture2DArray","streamSha256":"b519c917a3356a18c69785d47633fd703e371ff3eecb64b8672b0645b321a270"},"skin":{"rgba8":[255,116,0,128],"displayRgba8":[255,116,0,128],"hex":"#ff7400","array":"T_WaterSkinColorAtlas","layer":12,"format":"RGBA_BC7_SRGB","object":"CAB-9d2b46cc7274bce1f7aa154a238f4812_5988561676508966199_Texture2DArray","streamSha256":"b3e38c44101483f49603380f6958ecd60fc55c59ad41a0716c23d166df00e33e"},"skin2":{"rgba8":[255,116,0,69],"displayRgba8":[255,116,0,69],"hex":"#ff7400","array":"T_WaterSkinColor2Atlas","layer":12,"format":"RGBA_BC7_SRGB","object":"CAB-55da487244add3ff79adcca818a7d23d_-8933220189111898049_Texture2DArray","streamSha256":"48806486ac45881d7c9e0cae71ea2591340d8695a9ee3b3888854fe5aa516a3d"},"splash":{"rgba8":[255,119,105,240],"displayRgba8":[255,182,172,240],"hex":"#ffb6ac","array":"T_WaterSplashColorTextureArray","layer":12,"format":"RGBA_BC7_UNorm","object":"CAB-cd9e7a378dce0d3b692d7858d2129eae_2673383687997878308_Texture2DArray","streamSha256":"e20d29aec1d99538d2a199ef2696db904987165e601c4488fff6bc4963f7c486"}},"colorSpace":"rgba8 = decoded BC7 bytes; displayRgba8/hex = sRGB (UNorm color RGB converted from linear, alpha unchanged)","appearance":"2D reconstruction; shared pipe interior, phase-specific shading and moving boundaries"},"item_liquid_plant_grass_2":{"id":"item_liquid_plant_grass_2","name":"item_liquid_plant_grass_2","nameSource":"item-id-fallback","phase":"liquid","phaseType":2,"subType":13,"atlasData":"PipeLiquidAtlasData","atlasLayer":13,"material":"M_tube_art_liquid_plant2","colors":{"body":{"rgba8":[19,118,105,255],"displayRgba8":[19,118,105,255],"hex":"#137669","array":"T_WaterColorAtlas","layer":13,"format":"RGBA_BC7_SRGB","object":"CAB-db830311100ea6af0afab52162029165_7622698014684465723_Texture2DArray","streamSha256":"b519c917a3356a18c69785d47633fd703e371ff3eecb64b8672b0645b321a270"},"skin":{"rgba8":[43,209,21,255],"displayRgba8":[43,209,21,255],"hex":"#2bd115","array":"T_WaterSkinColorAtlas","layer":13,"format":"RGBA_BC7_SRGB","object":"CAB-9d2b46cc7274bce1f7aa154a238f4812_5988561676508966199_Texture2DArray","streamSha256":"b3e38c44101483f49603380f6958ecd60fc55c59ad41a0716c23d166df00e33e"},"skin2":{"rgba8":[21,60,36,179],"displayRgba8":[21,60,36,179],"hex":"#153c24","array":"T_WaterSkinColor2Atlas","layer":13,"format":"RGBA_BC7_SRGB","object":"CAB-55da487244add3ff79adcca818a7d23d_-8933220189111898049_Texture2DArray","streamSha256":"48806486ac45881d7c9e0cae71ea2591340d8695a9ee3b3888854fe5aa516a3d"},"splash":{"rgba8":[82,166,82,204],"displayRgba8":[154,211,154,204],"hex":"#9ad39a","array":"T_WaterSplashColorTextureArray","layer":13,"format":"RGBA_BC7_UNorm","object":"CAB-cd9e7a378dce0d3b692d7858d2129eae_2673383687997878308_Texture2DArray","streamSha256":"e20d29aec1d99538d2a199ef2696db904987165e601c4488fff6bc4963f7c486"}},"colorSpace":"rgba8 = decoded BC7 bytes; displayRgba8/hex = sRGB (UNorm color RGB converted from linear, alpha unchanged)","appearance":"2D reconstruction; shared pipe interior, phase-specific shading and moving boundaries"},"item_gas_acid":{"id":"item_gas_acid","name":"item_gas_acid","nameSource":"item-id-fallback","phase":"gas","phaseType":4,"subType":0,"atlasData":"PipeGasAtlasData","atlasLayer":0,"material":"M_fac_pipe_gas_acid","colors":{"body":{"rgba8":[229,201,94,36],"displayRgba8":[229,201,94,36],"hex":"#e5c95e","array":"T_FogColorAtlas","layer":0,"format":"RGBA_BC7_SRGB","object":"CAB-cbd2c7cf53fb582fd33c859aedf95ea1_-3576973267196530123_Texture2DArray","streamSha256":"5d2c0cb81a306a034a84e4337fdd952431c8542531613a25945d82ab6fe97b73"},"skin":{"rgba8":[201,170,26,128],"displayRgba8":[201,170,26,128],"hex":"#c9aa1a","array":"T_FogColor2Atlas","layer":0,"format":"RGBA_BC7_SRGB","object":"CAB-8ce51f7192cbaeca364f03c1ff16c123_-7920922050920825574_Texture2DArray","streamSha256":"fdd9b071dac4b8cc49362c4555e2a17be9c09986c213edbdea28136bdcc1cc3f"}},"colorSpace":"rgba8 = decoded BC7 bytes; displayRgba8/hex = sRGB (UNorm color RGB converted from linear, alpha unchanged)","appearance":"2D reconstruction; shared pipe interior, phase-specific shading and moving boundaries"},"item_activity_copper_poly_gas":{"id":"item_activity_copper_poly_gas","name":"item_activity_copper_poly_gas","nameSource":"item-id-fallback","phase":"gas","phaseType":4,"subType":1,"atlasData":"PipeGasAtlasData","atlasLayer":1,"material":"M_fac_pipe_gas_XiraniteCopper","colors":{"body":{"rgba8":[255,10,13,41],"displayRgba8":[255,10,13,41],"hex":"#ff0a0d","array":"T_FogColorAtlas","layer":1,"format":"RGBA_BC7_SRGB","object":"CAB-cbd2c7cf53fb582fd33c859aedf95ea1_-3576973267196530123_Texture2DArray","streamSha256":"5d2c0cb81a306a034a84e4337fdd952431c8542531613a25945d82ab6fe97b73"},"skin":{"rgba8":[90,168,0,153],"displayRgba8":[90,168,0,153],"hex":"#5aa800","array":"T_FogColor2Atlas","layer":1,"format":"RGBA_BC7_SRGB","object":"CAB-8ce51f7192cbaeca364f03c1ff16c123_-7920922050920825574_Texture2DArray","streamSha256":"fdd9b071dac4b8cc49362c4555e2a17be9c09986c213edbdea28136bdcc1cc3f"}},"colorSpace":"rgba8 = decoded BC7 bytes; displayRgba8/hex = sRGB (UNorm color RGB converted from linear, alpha unchanged)","appearance":"2D reconstruction; shared pipe interior, phase-specific shading and moving boundaries"},"item_gas_water":{"id":"item_gas_water","name":"item_gas_water","nameSource":"item-id-fallback","phase":"gas","phaseType":4,"subType":4,"atlasData":"PipeGasAtlasData","atlasLayer":4,"material":"M_fac_pipe_gas_water","colors":{"body":{"rgba8":[255,255,255,33],"displayRgba8":[255,255,255,33],"hex":"#ffffff","array":"T_FogColorAtlas","layer":4,"format":"RGBA_BC7_SRGB","object":"CAB-cbd2c7cf53fb582fd33c859aedf95ea1_-3576973267196530123_Texture2DArray","streamSha256":"5d2c0cb81a306a034a84e4337fdd952431c8542531613a25945d82ab6fe97b73"},"skin":{"rgba8":[81,180,248,46],"displayRgba8":[81,180,248,46],"hex":"#51b4f8","array":"T_FogColor2Atlas","layer":4,"format":"RGBA_BC7_SRGB","object":"CAB-8ce51f7192cbaeca364f03c1ff16c123_-7920922050920825574_Texture2DArray","streamSha256":"fdd9b071dac4b8cc49362c4555e2a17be9c09986c213edbdea28136bdcc1cc3f"}},"colorSpace":"rgba8 = decoded BC7 bytes; displayRgba8/hex = sRGB (UNorm color RGB converted from linear, alpha unchanged)","appearance":"2D reconstruction; shared pipe interior, phase-specific shading and moving boundaries"},"item_gas_xiranite":{"id":"item_gas_xiranite","name":"item_gas_xiranite","nameSource":"item-id-fallback","phase":"gas","phaseType":4,"subType":7,"atlasData":"PipeGasAtlasData","atlasLayer":7,"material":"M_fac_pipe_gas_xiranite","colors":{"body":{"rgba8":[139,192,72,38],"displayRgba8":[139,192,72,38],"hex":"#8bc048","array":"T_FogColorAtlas","layer":7,"format":"RGBA_BC7_SRGB","object":"CAB-cbd2c7cf53fb582fd33c859aedf95ea1_-3576973267196530123_Texture2DArray","streamSha256":"5d2c0cb81a306a034a84e4337fdd952431c8542531613a25945d82ab6fe97b73"},"skin":{"rgba8":[143,181,108,191],"displayRgba8":[143,181,108,191],"hex":"#8fb56c","array":"T_FogColor2Atlas","layer":7,"format":"RGBA_BC7_SRGB","object":"CAB-8ce51f7192cbaeca364f03c1ff16c123_-7920922050920825574_Texture2DArray","streamSha256":"fdd9b071dac4b8cc49362c4555e2a17be9c09986c213edbdea28136bdcc1cc3f"}},"colorSpace":"rgba8 = decoded BC7 bytes; displayRgba8/hex = sRGB (UNorm color RGB converted from linear, alpha unchanged)","appearance":"2D reconstruction; shared pipe interior, phase-specific shading and moving boundaries"},"item_gas_xiranite_enr":{"id":"item_gas_xiranite_enr","name":"item_gas_xiranite_enr","nameSource":"item-id-fallback","phase":"gas","phaseType":4,"subType":8,"atlasData":"PipeGasAtlasData","atlasLayer":8,"material":"M_fac_pipe_gas_hyperxiranite","colors":{"body":{"rgba8":[211,238,188,36],"displayRgba8":[211,238,188,36],"hex":"#d3eebc","array":"T_FogColorAtlas","layer":8,"format":"RGBA_BC7_SRGB","object":"CAB-cbd2c7cf53fb582fd33c859aedf95ea1_-3576973267196530123_Texture2DArray","streamSha256":"5d2c0cb81a306a034a84e4337fdd952431c8542531613a25945d82ab6fe97b73"},"skin":{"rgba8":[142,255,0,250],"displayRgba8":[142,255,0,250],"hex":"#8eff00","array":"T_FogColor2Atlas","layer":8,"format":"RGBA_BC7_SRGB","object":"CAB-8ce51f7192cbaeca364f03c1ff16c123_-7920922050920825574_Texture2DArray","streamSha256":"fdd9b071dac4b8cc49362c4555e2a17be9c09986c213edbdea28136bdcc1cc3f"}},"colorSpace":"rgba8 = decoded BC7 bytes; displayRgba8/hex = sRGB (UNorm color RGB converted from linear, alpha unchanged)","appearance":"2D reconstruction; shared pipe interior, phase-specific shading and moving boundaries"},"item_gas_copper":{"id":"item_gas_copper","name":"item_gas_copper","nameSource":"item-id-fallback","phase":"gas","phaseType":4,"subType":11,"atlasData":"PipeGasAtlasData","atlasLayer":11,"material":"M_fac_pipe_gas_copper","colors":{"body":{"rgba8":[180,76,52,38],"displayRgba8":[180,76,52,38],"hex":"#b44c34","array":"T_FogColorAtlas","layer":11,"format":"RGBA_BC7_SRGB","object":"CAB-cbd2c7cf53fb582fd33c859aedf95ea1_-3576973267196530123_Texture2DArray","streamSha256":"5d2c0cb81a306a034a84e4337fdd952431c8542531613a25945d82ab6fe97b73"},"skin":{"rgba8":[209,111,80,211],"displayRgba8":[209,111,80,211],"hex":"#d16f50","array":"T_FogColor2Atlas","layer":11,"format":"RGBA_BC7_SRGB","object":"CAB-8ce51f7192cbaeca364f03c1ff16c123_-7920922050920825574_Texture2DArray","streamSha256":"fdd9b071dac4b8cc49362c4555e2a17be9c09986c213edbdea28136bdcc1cc3f"}},"colorSpace":"rgba8 = decoded BC7 bytes; displayRgba8/hex = sRGB (UNorm color RGB converted from linear, alpha unchanged)","appearance":"2D reconstruction; shared pipe interior, phase-specific shading and moving boundaries"},"item_gas_copper_enr":{"id":"item_gas_copper_enr","name":"item_gas_copper_enr","nameSource":"item-id-fallback","phase":"gas","phaseType":4,"subType":12,"atlasData":"PipeGasAtlasData","atlasLayer":12,"material":"M_fac_pipe_gas_hypercopper","colors":{"body":{"rgba8":[195,45,45,41],"displayRgba8":[195,45,45,41],"hex":"#c32d2d","array":"T_FogColorAtlas","layer":12,"format":"RGBA_BC7_SRGB","object":"CAB-cbd2c7cf53fb582fd33c859aedf95ea1_-3576973267196530123_Texture2DArray","streamSha256":"5d2c0cb81a306a034a84e4337fdd952431c8542531613a25945d82ab6fe97b73"},"skin":{"rgba8":[255,142,1,153],"displayRgba8":[255,142,1,153],"hex":"#ff8e01","array":"T_FogColor2Atlas","layer":12,"format":"RGBA_BC7_SRGB","object":"CAB-8ce51f7192cbaeca364f03c1ff16c123_-7920922050920825574_Texture2DArray","streamSha256":"fdd9b071dac4b8cc49362c4555e2a17be9c09986c213edbdea28136bdcc1cc3f"}},"colorSpace":"rgba8 = decoded BC7 bytes; displayRgba8/hex = sRGB (UNorm color RGB converted from linear, alpha unchanged)","appearance":"2D reconstruction; shared pipe interior, phase-specific shading and moving boundaries"},"item_gas_copper_enr2":{"id":"item_gas_copper_enr2","name":"item_gas_copper_enr2","nameSource":"item-id-fallback","phase":"gas","phaseType":4,"subType":14,"atlasData":"PipeGasAtlasData","atlasLayer":14,"material":"M_fac_pipe_gas_alloycopper","colors":{"body":{"rgba8":[250,145,30,43],"displayRgba8":[250,145,30,43],"hex":"#fa911e","array":"T_FogColorAtlas","layer":14,"format":"RGBA_BC7_SRGB","object":"CAB-cbd2c7cf53fb582fd33c859aedf95ea1_-3576973267196530123_Texture2DArray","streamSha256":"5d2c0cb81a306a034a84e4337fdd952431c8542531613a25945d82ab6fe97b73"},"skin":{"rgba8":[255,149,0,247],"displayRgba8":[255,149,0,247],"hex":"#ff9500","array":"T_FogColor2Atlas","layer":14,"format":"RGBA_BC7_SRGB","object":"CAB-8ce51f7192cbaeca364f03c1ff16c123_-7920922050920825574_Texture2DArray","streamSha256":"fdd9b071dac4b8cc49362c4555e2a17be9c09986c213edbdea28136bdcc1cc3f"}},"colorSpace":"rgba8 = decoded BC7 bytes; displayRgba8/hex = sRGB (UNorm color RGB converted from linear, alpha unchanged)","appearance":"2D reconstruction; shared pipe interior, phase-specific shading and moving boundaries"},"item_gas_inert":{"id":"item_gas_inert","name":"item_gas_inert","nameSource":"item-id-fallback","phase":"gas","phaseType":4,"subType":15,"atlasData":"PipeGasAtlasData","atlasLayer":15,"material":"M_fac_pipe_gas_helium","colors":{"body":{"rgba8":[0,213,255,36],"displayRgba8":[0,213,255,36],"hex":"#00d5ff","array":"T_FogColorAtlas","layer":15,"format":"RGBA_BC7_SRGB","object":"CAB-cbd2c7cf53fb582fd33c859aedf95ea1_-3576973267196530123_Texture2DArray","streamSha256":"5d2c0cb81a306a034a84e4337fdd952431c8542531613a25945d82ab6fe97b73"},"skin":{"rgba8":[107,247,255,76],"displayRgba8":[107,247,255,76],"hex":"#6bf7ff","array":"T_FogColor2Atlas","layer":15,"format":"RGBA_BC7_SRGB","object":"CAB-8ce51f7192cbaeca364f03c1ff16c123_-7920922050920825574_Texture2DArray","streamSha256":"fdd9b071dac4b8cc49362c4555e2a17be9c09986c213edbdea28136bdcc1cc3f"}},"colorSpace":"rgba8 = decoded BC7 bytes; displayRgba8/hex = sRGB (UNorm color RGB converted from linear, alpha unchanged)","appearance":"2D reconstruction; shared pipe interior, phase-specific shading and moving boundaries"}},"fluidProfileCoverage":{"profile":"endfield-pipe-fluid-colors-v1","profileCount":20,"phaseCounts":{"liquid":11,"gas":9},"itemIds":["item_liquid_acid","item_liquid_plant_grass_1","item_liquid_sewage","item_liquid_water","item_liquid_xiranite","item_liquid_xiranite_enr","item_liquid_xiranite_poly","item_liquid_xiranite_lowpoly","item_liquid_copper","item_liquid_copper_enr","item_liquid_plant_grass_2","item_gas_acid","item_activity_copper_poly_gas","item_gas_water","item_gas_xiranite","item_gas_xiranite_enr","item_gas_copper","item_gas_copper_enr","item_gas_copper_enr2","item_gas_inert"],"source":{"table":"FactoryItemTable","sha256":"65c21c3b3bcfb70aaf4850c9c4fd62a9826b38a45b4dddd9ad2c302471711de1","eligiblePhaseTypes":{"2":"liquid","4":"gas"}}},"appearanceRevision":"water-gas-flat-head-logo-white-v5","sourceMarkColors":{"chevron":[6.666956,6.8831816,2.9550831,1],"logoPrimary":[8.47419,8.47419,8.47419,1],"logoSecondary":[8.47419,8.47419,8.47419,1]},"evidence":"v1.5 recovered pipe pattern formula; wave shading uses original normal texture with approximate lighting","fluidStatus":"Source item colors; inset liquid with subtle continuous radius waves, a planar moving front with a filled white-to-blue cap gradient, whole-route thinning to disappearance and interrupted recovery; soft two-color gas turbulence. Screenshot-guided 2D reconstructions sharing the existing liquid interior map. Full game shader, gas mesh and SceneColor refraction are not reproduced.","fillController":"fluid-thickness-cycle-v2","fillCellsPerSecond":2.0,"drainDuration":2.0,"refillDuration":2.0,"holdDuration":1.0,"emptyDuration":0.3,"fillEdgeWidth":0.012,"transportTiming":{"table":"FactoryLiquidPipeTable","id":"log_pipe_01","msPerRound":500,"interpretation":"One cell per transport round, continuously interpolated; demonstration fill/drain scheduling is project-defined"}},"uniforms":{"uTime":"Shared accumulated belt seconds or water seconds; freeze water and fill-cycle clocks when fluid selection is none; pause preserves all clocks. No animation-off clock/ticker work.","uStart":"routeOrigin+segmentStart","uKind":"0 conveyor; 1 pipe","uCorner":"0 straight; 1 elbow","uFilled":"Route-wide thickness in [0,1]; 0 hides fluid, 1 preserves the accepted full-width preset. Intermediate values scale the liquid radius everywhere, independently of front position. This supersedes the former boolean-only interpretation.","uDirection":"waterDirection, default 0; only 0/1 supported","uLayer":"pipe: 0 chevron; 1 liquid shimmer; 2 tintable fluid body; 3 untinted fluid specular; 4 logo glow; 5 logo core; 6 compatibility-combined marks. Chevron/glow/core are separate passes ABOVE shell. Liquid layers are BELOW middle support and shell.","uFillBounds":"[fillStart,fillEnd,meniscusEdgeWidth,boundaryShape] in global path units. All fluid layers use the same shaped interval and fluid mapping. boundaryShape=min(1,progress*L*2,(1-progress)*L*2), tapering deformation at route ends.","uTint":"Source body color in display sRGB; layer 2. Neutral base remains reusable with alternate profiles.","uFluidType":"0 liquid; 1 gas. Gas uses fog opacity and suppresses liquid specular.","uSkin":"Source secondary color in display sRGB","uSkin2":"Source water dark-skin color; gas fallback uses uSkin","uFoam":"Source water splash color converted from linear BC7 UNorm to display sRGB; gas fallback uses uSkin","uAtlasHalfTexel":".5 / arrow atlas width in decoded pixels; used to clamp the selected cell horizontally","uPatternTexel":"[1/patternWidth,1/patternHeight]. The logo halo samples four neighbors at 1.5 source texels without blurring the core.","uParams":"[arrowSpeed, flowSpeed, timeOffset, arrowSpace]","uPipe":"[staticDensity, flowDensity, flowOffset, flowSpeed]","uWidths":"[staticWidth, flowWidth, waterWaveSpeed, flowSpace]","uColor":"Premultiplied object tint/opacity from Pixi; [1,1,1,1] by default. Dynamic liquid body color is supplied separately through uTint.","unused":"waterSkinSpeed is preserved source provenance and has no effect in this 2D reference.","supported":"Finite values; arrowSpeed>=0, arrowSpace>0, flowSpace>0, densities>0; 0<pipe widths<1. Negative belt speed and width≈1 original branches are outside this reference."},"formulas":{"conveyor":["phase=fract(s-t*arrowSpeed); A=clamp((src(arrow,atlasU,phase*arrowSpace).r-.55)*3,0,1).","F=src(highlight,across,fract((s-t*flowSpeed+timeOffset)*flowSpace)).r; H=clamp(max(F,0)^1.15*.78,0,1). This replaces the previous dark F^2*.34 treatment.","a=.9*A; overlayAlpha=(a+H*(1-a))*coverage. overlayRGB=([1,.78,.30]*a+[1,.59,.12]*H*(1-a))/max(a+H*(1-a),.000001). Arrow over independent gold light; normal premultiplied source-over onto static/conveyor.{shape}.base. Light color never depends on arrow presence.","Static preset: A=clamp((src(arrow,atlasU,fract(along-staticArrowPhase)).r-.55)*3,0,1)*coverage. arrowRGB=[1,.70,.25], alpha=.9*A; normal over base. All shapes use one common phase: staticArrowPhase=.5-sourceGlyphCenterV. Compute sourceGlyphCenterV as the intensity-weighted mean bottom-left V in original atlas cell 0, weights=clamp((R-.55)*3,0,1). Current v1.5 phase=-.0029871862169272845. Thus each glyph is at along=.5, NOT necessarily pixel (64,64) in corners. Do not offset individual corners to point toward the final exit. This selects the arrow from a shared animation phase; the static base/highlight remain a simplified baked preset, not a full captured frame.","Base is edge-core over edge-glow over surface, using ordinary source-over. Surface RGB=[.78,.35,.035], alpha=.09*coverage. d=distance to either belt edge in 128-pixel tile coordinates. Glow RGB=[1,.52,.08], alpha=.50*exp(-(d/3.2)^2)+.15*exp(-(d/7)^2). Core RGB=[1,.88,.46], alpha=.98*exp(-(d/.95)^4). Glow extends outside the belt silhouette within the existing 1-cell canvas. Do not mask it with the dynamic map.","Optional static/conveyor.{shape}.surface, .edge-glow, .edge-core replace .base, allowing separate frontend opacity controls. .arrow-static over .base replaces .static. Do NOT layer .base on .static or add glow/core over the already-composited .base/.static. Static preset has uniform warm surface and edge glow, no repeated bright hotspot in every tile."],"pipe":["q=s*(2*waterDirection-1)-flowOffset; u=min(abs(across-.5),1).","remap(q,d,w)=(fract(q*d)*w-.5)/(w-1). av=remap(q+flowSpeed*t,flowDensity,flowWidth). C=(0<av<1) ? src(chevron,u,av).r : 0.","patternU=fract(.5+across*(2*waterDirection-1)); pv=remap(q,staticDensity,staticWidth). P=0 for corners or pv outside (0,1); otherwise src(pattern,patternU,pv).r. This continuous top-seam unwrap is a 2D readability adaptation, not the recovered original 3D R/G side selector. Keep the folded u for chevrons only. Do not flip images, mapping maps or geometry.","Chevron is independent: Ac=clamp(.9*C,0,1), RGB=[.72,.91,1]. Logo core L=clamp(1.04*smoothstep(.10,.54,P),0,1), RGB=white. Logo neighborhood N=max(P and four samples at +/-1.5 source texels); glow G=clamp(.24*smoothstep(.035,.36,N)-.08*L,0,.24), RGB=[.78,.92,1]. Draw chevron, then glow, then core with normal source-over, all multiplied by glass coverage. _FlowArrowColor2/3 are equal high-intensity neutral source colors in v1.5; display white is a tone-mapped 2D treatment, not literal HDR storage.","fluid-thickness-cycle-v2 reconstructs observed behavior, not a recovered complete game state machine. For route length L: fillDuration=L/fillCellsPerSecond. A new head fills the route, then holding lasts holdDuration=1 second. During draining, the full path interval stays fixed and thickness=1-phaseTime/drainDuration, where drainDuration=2 seconds independently of L. At zero thickness, emptyDuration=.3 seconds precedes a new head. uFillBounds.w=0 outside filling, so no moving cap appears during drainage/recovery.","earlyRefill cuts drainage at drainDuration/2. Recovering starts from the CURRENT thickness, increases by elapsed/refillDuration (default 2 seconds for a full 0-to-1 change), then returns to holding. It does not restart the front. Switching the option on late in drainage preserves thickness; switching it off during recovery completes recovery and fully drains on the next stop. One controller and thickness value are shared by all segments. Only 2 cells/second is from the source transport table; hold/drain/recovery timing follows the visual demo requirements.","Read fluid mapping U,V separately; fluidS=routeOrigin+segmentStart+V. transverse=2*(fract(U+.5)-.5) unwraps the visible top seam. crossSection=sin(transverse*pi/2) projects the cylindrical angle across the visible tube. Liquid radius=.78+.028*wave, using two continuous path/time sine components in referenceShader.fragment; edge coverage uses a .025-radius smooth transition. These visual values approximate the recovered thickness-driven inset, not captured runtime thickness or wave amplitude. Gas uses a wider, softer radial falloff.","Water uses a planar front: head=fillEnd and tail=fillStart, without transverse offsets. The front antialias width is fillEdgeWidth=.012 cells. Radius waves remain on the longitudinal sides. This supersedes the rounded-cap approximation after in-game screenshot review. Gas retains .18-cell soft transitions with multi-scale procedural noise. Full formulas are in referenceShader.fragment.","uFillBounds provides the global interval and deformation taper. occupied=interior*smoothstep(tail-edge,tail+edge,fluidS)*(1-smoothstep(head-edge,head+edge,fluidS)) when enabled and fluid coverage>.5, else zero. The same inset, wave and shaped occupancy clip body, shimmer/foam and specular. Dynamic liquid reflection follows its inset moving edge; the original static reflection remains a weak additional term.","Water: source normal RG drives shimmer and mixes source body/skin colors. Source T_fx_flow_300_D R modulates foam. A filled white cap, independent of fluid tint, covers the planar cross-section and fades backward: whiteCap=1-smoothstep(.10,1.20,max(head-fluidS,0)); cap alpha=.96*occupied*whiteCap*boundaryShape. It disappears during in-place recovery. The screenshot shows a broad white-to-blue transition, not a thin outlined rim. Gas keeps two-color three-octave value noise, softer density and no white water cap.","Static water uses a neutral body Sprite tinted with its source body hex plus a separate untinted specular Sprite. Static gas uses the precomputed gas-body Sprite: a periodic two-frequency density preset mixed from the two source fog colors. Static images perform no per-frame work.","Static marked preset: chevron uses q=-(sourceV-.5)-.5/flowDensity, no clock. The text marker is deliberately label-centred with q=.5/staticDensity+(sourceV-.5)*(2*waterDirection-1), using the same continuous patternU/R sampling rather than the preview route origin, which can land between logo periods. static-chevron, static-logo-glow and static-logo-core are authoritative separate layers; static-marker is their compatibility composite. Static layout places them every 6 segments at index%6==3; configurable product choice, not recovered dynamic periodicity.","Full-texture periods at direction 0: text 1/staticDensity (~9.09), double-V 1/flowDensity (~5.56) path units, not an integer spacing of distinct pipe meshes."],"endpointConnector":["Use static/pipe.endpoint.connector directly, or source-over static/pipe.endpoint.connector-highlight above static/pipe.endpoint.connector-base. Do not draw the composite and its component layers together.","Place exactly two per continuous route: one centered on the first segment entry boundary and one on the last segment exit boundary. For each endpoint, rotate the canonical image down-axis toward the route-outward tangent. Draw optional static/pipe.endpoint.whitening below the connector; it then fades toward the route interior. Never place either at internal tile seams.","Connected and unconnected route endpoints use the same com_fluidrepeater mesh/material. Native collection changes adjusted endpoint positions by connection state but does not select a different visual. The connector material enables a static emissive atlas, but this mesh UV island samples only black in v1.5. The visible glint and adjacent whitening are screenshot-calibrated static layers, not evidence of an unconnected-only animation."],"tint":"Read decoded static RGB as display-referred sRGB numbers. SpriteRGB=RGB*(hexTintRGB/255); alpha unchanged. Specular, shell, supports, chevrons and both logo layers retain their own colors.","over":"Use normal premultiplied source-over, NOT additive: CoutPremul=Cs*As + CdPremul*(1-As); Aout=As+Ad*(1-As). Procedural GLSL layers emit vec4(RGB*alpha,alpha); bound fluid-body/specular uBase textures use Pixi upload premultiplication and are multiplied directly by occupied. WebPs store straight alpha; static image upload premultiplies once, dynamic data upload never does.","colorPipeline":"Reference computes color constants, tint and blending in encoded display/sRGB numeric space with no sRGB framebuffer linearization, matching this Pixi WebGL demo. It is not physically linear lighting. Data samplers return decoded bytes/255 untouched. Other engines must choose the same conversions to match.","bake":"Static color images are precomputed; use delivered pixels. Q85 RGB compression and antialiasing mean mathematical bake reconstruction is not bit-identical. Data WebP and alpha are lossless. Pipe color layers use 3x supersampling and premultiplied area reduction."},"drawOrder":{"conveyor":["static/conveyor.{shape}.base","dynamic conveyor overlay"],"pipe":["support-back","fluid-body tinted and clipped to continuous fill interval","dynamic fluid shimmer clipped to the same interval","fluid-specular clipped to the same interval","support-middle","shell","chevron","logo-glow","logo-core","support-front","route endpoint connector at first/last boundaries"],"staticConveyor":["static/conveyor.{shape}.static"],"supports":"Every elbow: 1 required. Straight spacing is configurable. Rotate support.straight 90 degrees around source Y relative to the canonical pipe direction before splitting/placing layers; left corner uses 90 degrees and right corner uses 0. Skip nonexistent empty split layers; standalone support.straight/corner are full pieces, do not overlay them in addition to split layers."},"loading":{"static":"Load only static manifest resources, ordinary Sprites. No import of dynamic.js, no dynamic maps/textures, no ticker. Specification JSON is documentation, not an eager resource dependency.","dynamic":"Add compatible contract-2 dynamic resources on demand; keep static bases and bind fluid-body/specular textures as shader inputs for interval clipping. On disable cancel pending loads, switch to static assets, stop RAF and release unused dynamic GPU textures/bitmaps.","reference":"The vertex/fragment strings below are the exact code exported by dynamic.js in the full example. Bind sampler roles as described; GLSL is for PixiJS 8.17.0 / WebGL2, not automatic WebGPU support."},"shaderBindings":{"conveyor":{"uMap":"dynamic/conveyor.{shape}.mapping","uGlyph":"dynamic/conveyor.arrow","uFlow":"dynamic/conveyor.highlight","uPattern":"dynamic/conveyor.arrow (unused)","uFluidMap":"dynamic/conveyor.{shape}.mapping (unused)","uBase":"dynamic/conveyor.{shape}.mapping (unused fallback)","uSplash":"dynamic/conveyor.highlight (unused)"},"pipe":{"uMap":"dynamic/pipe.{shape}.mapping","uGlyph":"dynamic/pipe.chevron","uFlow":"dynamic/pipe.fluid-motion","uPattern":"dynamic/pipe.pattern","uFluidMap":"dynamic/pipe.{shape}.fluid-mapping","uSplash":"dynamic/pipe.splash-noise","uBase":"static/pipe.{shape}.fluid-body for layer 2; static/pipe.{shape}.fluid-specular for layer 3; mapping fallback for other layers"}},"referenceShader":{"backend":"PixiJS 8.17.0 WebGL2; Pixi injects GLSL version and matrix/color bindings. Quad uses top-left UV origin.","vertex":"precision highp float;\nin vec2 aPosition;in vec2 aUV;out vec2 vUV;\nuniform mat3 uProjectionMatrix;uniform mat3 uWorldTransformMatrix;uniform mat3 uTransformMatrix;\nvoid main(){vUV=aUV;vec3 p=uProjectionMatrix*uWorldTransformMatrix*uTransformMatrix*vec3(aPosition,1.);gl_Position=vec4(p.xy,0.,1.);}","fragment":"precision highp float;\nin vec2 vUV;out vec4 finalColor;\nuniform sampler2D uMap;uniform sampler2D uGlyph;uniform sampler2D uFlow;uniform sampler2D uPattern;uniform sampler2D uFluidMap;\nuniform float uTime;uniform float uStart;uniform float uKind;uniform float uCorner;uniform float uFilled;uniform float uDirection;uniform float uLayer;\nuniform float uAtlasHalfTexel;\nuniform vec2 uPatternTexel;\nuniform sampler2D uBase;\nuniform sampler2D uSplash;\nuniform float uFluidType;\nuniform vec4 uSkin;uniform vec4 uSkin2;uniform vec4 uFoam;\nuniform vec4 uParams;uniform vec4 uPipe;uniform vec4 uWidths;uniform vec4 uFillBounds;uniform vec4 uTint;uniform vec4 uColor;\nvec4 src(sampler2D tex,vec2 uv){return texture(tex,vec2(fract(uv.x),1.-fract(uv.y)));}\nfloat remap(float q,float density,float width){return (fract(q*density)*width-.5)/(width-1.);}\nfloat hash21(vec2 p){return fract(sin(dot(p,vec2(127.1,311.7)))*43758.5453);}\nfloat noise(vec2 p){vec2 i=floor(p),f=fract(p);f=f*f*(3.-2.*f);return mix(mix(hash21(i),hash21(i+vec2(1.,0.)),f.x),mix(hash21(i+vec2(0.,1.)),hash21(i+1.),f.x),f.y);}\nfloat fog(vec2 p){return .57*noise(p)+.28*noise(p*2.03+7.)+.15*noise(p*4.01+19.);}\n// Authored top-view radius, radius variation, spatial frequency and time rate.\n// The game's thickness-driven inset is recovered; these viewing values are not.\nconst vec4 WATER_SURFACE=vec4(.78,.028,.65,.8);\nvoid main(){vec4 map=texture(uMap,vUV);if(map.a<.5){finalColor=vec4(0.);return;}\n float across=map.r;float along=(map.g*255.*256.+map.b*255.)/65535.;float s=uStart+along;\n vec3 rgb=vec3(0.);float alpha=0.;\n if(uKind<.5){\n  float phase=fract(s-uTime*uParams.x);float atlasU=clamp(across/8.,uAtlasHalfTexel,1./8.-uAtlasHalfTexel);float arrow=clamp((src(uGlyph,vec2(atlasU,phase*uParams.w)).r-.55)*3.,0.,1.);\n  float flow=src(uFlow,vec2(across,fract((s-uTime*uParams.y+uParams.z)*uWidths.w))).r;\n  float light=clamp(pow(max(flow,0.),1.15)*.78,0.,1.);float arrowAlpha=arrow*.9;\n  alpha=arrowAlpha+light*(1.-arrowAlpha);\n  rgb=(vec3(1.,.78,.30)*arrowAlpha+vec3(1.,.59,.12)*light*(1.-arrowAlpha))/max(alpha,.000001);\n }else{\n  float q=s*(2.*uDirection-1.)-uPipe.z;float u=min(abs(across-.5),1.);float av=remap(q+uPipe.w*uTime,uPipe.y,uWidths.y);\n  float glyph=(av>0.&&av<1.)?src(uGlyph,vec2(u,av)).r:0.;\n  // Unwrap the top seam continuously. Folding U and mixing R/G splices\n  // oppositely oriented halves of the label. Keep the chevron UV above.\n  float patternU=fract(.5+across*(2.*uDirection-1.));\n  float pv=remap(q,uPipe.x,uWidths.x);vec2 patternUV=vec2(patternU,clamp(pv,0.,1.));\n  float patternEnabled=(uCorner<.5&&pv>0.&&pv<1.)?1.:0.;\n  float pat=src(uPattern,patternUV).r*patternEnabled;\n  // The authored logo is a separate HDR-white material signal in the game.\n  // Keep its crisp core independent from the pale-blue moving chevrons, and\n  // build only a restrained one-texel halo from the original data texture.\n  vec2 logoStep=uPatternTexel*1.5;\n  float logoNear=max(max(src(uPattern,patternUV+vec2(logoStep.x,0.)).r,src(uPattern,patternUV-vec2(logoStep.x,0.)).r),\n                     max(src(uPattern,patternUV+vec2(0.,logoStep.y)).r,src(uPattern,patternUV-vec2(0.,logoStep.y)).r))*patternEnabled;\n  float logoCore=clamp(smoothstep(.10,.54,pat)*1.04,0.,1.);\n  float logoGlow=clamp(smoothstep(.035,.36,max(pat,logoNear))*.24-logoCore*.08,0.,.24);\n  float chevron=clamp(glyph*.9,0.,1.);\n  if(uLayer<.5){finalColor=vec4(vec3(.72,.91,1.)*chevron,chevron)*map.a*uColor;return;}\n  if(uLayer>3.5&&uLayer<4.5){finalColor=vec4(vec3(.78,.92,1.)*logoGlow,logoGlow)*map.a*uColor;return;}\n  if(uLayer>4.5&&uLayer<5.5){finalColor=vec4(vec3(1.)*logoCore,logoCore)*map.a*uColor;return;}\n  // Compatibility layer for consumers that still request the former combined\n  // \"marks\" pass. Its result is chevron, then halo, then opaque white core.\n  if(uLayer>5.5){\n   float a=chevron;vec3 prem=vec3(.72,.91,1.)*a;\n   prem=vec3(.78,.92,1.)*logoGlow+prem*(1.-logoGlow);a=logoGlow+a*(1.-logoGlow);\n   prem=vec3(1.)*logoCore+prem*(1.-logoCore);a=logoCore+a*(1.-logoCore);\n   finalColor=vec4(prem,a)*map.a*uColor;return;\n  }\n  if(uFilled<=0.){finalColor=vec4(0.);return;}\n  vec4 fm=texture(uFluidMap,vUV);float fv=(fm.g*255.*256.+fm.b*255.)/65535.;float fluidS=uStart+fv;\n  // Unwrap around the visible top seam before transverse deformation/noise.\n  float transverse=(fract(fm.r+.5)-.5)*2.;\n  // Original cylindrical UV measures angle, not distance across the tube.\n  // Project it before shrinking the fluid so straight and bent pieces share\n  // the same inset, with a continuous wave across their common path coordinate.\n  float crossSection=sin(transverse*1.570796327);float radial=abs(crossSection);\n  float wave=.72*sin(6.283185307*(fluidS*WATER_SURFACE.z-uTime*WATER_SURFACE.w))\n             +.28*sin(6.283185307*(fluidS*WATER_SURFACE.z*2.17-uTime*WATER_SURFACE.w*.63)+1.4);\n  float thickness=clamp(uFilled,0.,1.);\n  float radius=(WATER_SURFACE.x+WATER_SURFACE.y*wave)*thickness;\n  // About one source-map pixel of coverage; also works on WebGL1 contexts\n  // where the optional derivatives extension is not enabled by Pixi.\n  float aa=.025;\n  float interior=1.-smoothstep(radius-aa,radius+aa,radial);\n  if(uFluidType>.5){radius=(.88+.018*wave)*thickness;interior=1.-smoothstep(radius-.16*thickness,radius+.025,radial);}\n  interior*=smoothstep(0.,.07,thickness);\n  float surfaceAcross=crossSection/max(radius,.1);float surfaceRadial=abs(surfaceAcross);\n  vec2 normal=src(uFlow,vec2(fm.r*2.,fluidS-uTime*uWidths.z)).rg*2.-1.;\n  float turbulence=fog(vec2(transverse*2.6,fluidS*1.65-uTime*.85));\n  float shape=uFillBounds.w;float edge=max(uFillBounds.z*shape,.0001);\n  // The in-game screenshot shows a planar cross-section, with a broad white\n  // cap fading BACK into the water. Radius waves affect the sides, not the cut.\n  float head=uFillBounds.y;\n  float tail=uFillBounds.x;\n  if(uFluidType>.5){edge=max(.18*shape,.0001);head=uFillBounds.y-shape*(.25*radial+.26*turbulence);tail=uFillBounds.x+shape*(.18*radial+.20*turbulence);}\n  float occupied=0.;\n  if(fm.a>.5){occupied=interior*smoothstep(tail-edge,tail+edge,fluidS)*(1.-smoothstep(head-edge,head+edge,fluidS));}\n  float splash=src(uSplash,vec2(fm.r*2.,fluidS*2.-uTime*1.7)).r;\n  float frontBand=exp(-pow((fluidS-head+.065)/.14,2.))*shape;\n  float tailBand=exp(-pow((fluidS-tail-.04)/.1,2.))*shape;\n  float shimmer=pow(abs(normal.x*.7+normal.y*.3),2.)*.10*occupied;\n  if(uFluidType>.5){\n   // Two fog colors and a soft turbulent plume, without a liquid specular rim.\n   if(uLayer<1.5){alpha=occupied*smoothstep(.48,.78,turbulence)*.18;rgb=uSkin.rgb;}\n   else if(uLayer<2.5){alpha=texture(uBase,vUV).a*occupied*(.20+.72*smoothstep(.18,.78,turbulence));rgb=mix(uTint.rgb*.72,uSkin.rgb,clamp(turbulence*1.2,0.,1.));}\n   else{alpha=0.;}\n  }\n  else if(uLayer<1.5){\n   float foamAlpha=shimmer+occupied*(frontBand*(.16+.30*splash)+tailBand*.09);\n   // A filled, pale cross-section with a longitudinal gradient, not a rim.\n   // It disappears during in-place recovery, which has no new leading front.\n   float whiteCap=(1.-smoothstep(.10,1.20,max(head-fluidS,0.)))*shape;\n   float whiteAlpha=occupied*whiteCap*.96;\n   alpha=whiteAlpha+foamAlpha*(1.-whiteAlpha);\n   rgb=(vec3(1.)*whiteAlpha+uFoam.rgb*foamAlpha*(1.-whiteAlpha))/max(alpha,.000001);\n  }\n  else if(uLayer<2.5){\n   vec4 base=texture(uBase,vUV);\n   base.rgb*=mix(uTint.rgb,uSkin.rgb,.22+.10*normal.x);\n   base.rgb=mix(base.rgb,uSkin2.rgb*base.a,.09*surfaceRadial*surfaceRadial);\n   finalColor=base*occupied*uColor;return;\n  }else{\n   // Surface reflection follows the moving inset edge; the old baked\n   // reflection alone lies at the undeformed mesh boundary.\n   float rim=exp(-pow((surfaceRadial-.91)/.065,2.));\n   float lighting=.65+.35*clamp(-surfaceAcross,0.,1.);\n   alpha=occupied*(texture(uBase,vUV).a*.35+rim*.17*lighting);\n   rgb=vec3(.82,.94,1.);\n  }\n }\n alpha*=map.a;finalColor=vec4(rgb*alpha,alpha)*uColor;\n}"},"referenceController":{"language":"JavaScript","source":"export function createFluidCycle(config,total,origin=5,earlyRefill=false){\n const fillDuration=total/config.fillCellsPerSecond;\n const drainDuration=config.drainDuration??2;\n const holdDuration=config.holdDuration??1;\n const emptyDuration=config.emptyDuration??.3;\n const refillDuration=config.refillDuration??2;\n let state='filling',phaseTime=0,elapsed=0,cycle=0,recoveryFrom=.5;\n const level=()=>state==='empty'?0:state==='draining'?Math.max(0,1-phaseTime/drainDuration)\n  :state==='recovering'?Math.min(1,recoveryFrom+phaseTime/refillDuration):1;\n const duration=()=>({filling:fillDuration,holding:holdDuration,draining:drainDuration*(earlyRefill?.5:1),\n  recovering:(1-recoveryFrom)*refillDuration,empty:emptyDuration}[state]);\n const snapshot=()=>{\n  const progress=Math.min(1,phaseTime/duration()),thickness=level(),hasHead=state==='filling';\n  return {state,supply:['filling','holding','recovering'].includes(state),thickness,hasHead,\n   occupancy:hasHead?progress:thickness>0?1:0,start:origin-1,end:hasHead?origin+total*progress:origin+total+1,\n   total,cycle,progress,phaseTime,elapsed,fillDuration,drainDuration,holdDuration,emptyDuration,\n   recoveryDuration:(1-recoveryFrom)*refillDuration,earlyRefill};\n };\n const advance=delta=>{\n  let remaining=Math.max(0,Number(delta)||0);\n  do{\n   const step=Math.min(remaining,Math.max(0,duration()-phaseTime));\n   phaseTime+=step;elapsed+=step;remaining-=step;\n   if(phaseTime+1e-9<duration())break;\n   if(state==='filling')state='holding';\n   else if(state==='holding')state='draining';\n   else if(state==='draining'){\n    recoveryFrom=level();\n    if(earlyRefill&&recoveryFrom>0){state='recovering';cycle++;}else state='empty';\n   }else if(state==='recovering')state='holding';\n   else{state='filling';cycle++;}\n   phaseTime=0;\n  }while(remaining>1e-9);\n  return snapshot();\n };\n return {total,snapshot,advance,setEarlyRefill(value){earlyRefill=Boolean(value);return advance(0);},\n  seek(time){state='filling';phaseTime=0;elapsed=0;cycle=0;recoveryFrom=.5;return advance(time);}};\n}"},"fidelity":{"recovered":["Source meshes/textures/material parameter provenance","Water/gas item phase, material subtype-to-atlas-layer mapping and decoded BC7 colors; 500 ms transport step","Pipe horizontal bend and original UV","Belt time/space expressions and pipe phase/density","Continuous-route endpoints use com_fluidrepeater in both connection states; its configured emissive atlas is non-animated and samples black on this mesh UV island"],"approximate":["Conveyor polar corner phase, colors/alpha and fixed marker placement","Pipe glass opacity/color, water head/tail ripples and foam, gas two-color procedural turbulence sharing the liquid interior geometry","Observed whole-route drainage and interrupted recovery in fluid-thickness-cycle-v2; demo timing and white head highlight are not captured game runtime parameters","Continuous R-channel top-view pipe text unwrap replaces original 3D side-channel selection (pipe-text-uv-v1)","Endpoint connector top lighting, albedo glint and adjacent whitening falloff","Support center-height fit and layered fluid depth clamp"],"unsupported":["Complete original gas mesh/shader and 3D splash behavior","SceneColor refraction","Original runtime fill/drain timing, placement/height/spacing and instance state"],"completeness":"These are fidelity/scope gaps, not missing ZIP files. Contract completeness does not mean complete reproduction of the original game renderer."},"textureProfile":{"id":"grid-textures-v1","pixelsPerCell":64,"logicalPixelsPerCell":128,"resolution":0.5,"coordinates":"logical pixels; physicalRect and image dimensions are physical pixels","colorFilter":"premultiplied-alpha 2x2 box","dataFilter":"nearest packed height/flow coordinates; channel box continuous fields"}}
