{"Document":{"ObjectName":"Scenario::ScenarioDocumentModel","id":1,"BaseScenario":{"ObjectName":"Scenario::BaseScenario","id":0,"Constraint":{"ObjectName":"Scenario::IntervalModel","id":0,"Metadata":{"ScriptingName":"test-pbr","Comment":"","Color":"Transparent1","Label":"","Touched":true},"Inlet":{"uuid":"a1574bb0-cbd4-4c7d-9417-0c25cfd1187b","ObjectName":"Inlet","id":0,"Hidden":false,"Custom":"Audio In","Exposed":"audio in"},"Outlet":{"uuid":"a1d97535-18ac-444a-8417-0cbc1692d897","ObjectName":"Outlet","id":0,"Hidden":false,"Custom":"Audio Out","Exposed":"audio out","Address":"audio:/out/main","GainInlet":{"uuid":"9a13fb32-269a-47bf-99a9-930188c1f19c","ObjectName":"Inlet","id":10000,"Hidden":false,"Custom":"Gain","Exposed":"gain","Value":{},"Init":{},"Domain":{"Float":{"Min":0.0,"Max":1.0}}},"PanInlet":{"uuid":"9a13fb32-269a-47bf-99a9-930188c1f19c","ObjectName":"Inlet","id":10001,"Hidden":false,"Custom":"Pan","Exposed":"pan","Value":{},"Init":{},"Domain":{}},"Gain":1.0,"Pan":[1.0,1.0],"Propagate":true},"Processes":[{"uuid":"d7a2f5c9-3e8b-4b1d-a6f2-5c8e9d1f3b7a","ObjectName":"pbr_mesh","id":1,"Metadata":{"ScriptingName":"PBR Mesh","Comment":"","Color":"Transparent1","Label":"","Touched":true},"Duration":11289600000,"Height":300.0,"StartOffset":0,"LoopDuration":11289600000,"Pos":[-232.16350341077737,-162.60865168649414],"Size":[482.0,175.0],"Loops":false,"FoldMode":0,"Inlets":[{"uuid":"f2ab26ea-415d-45a2-bfbc-2968c7c92a33","ObjectName":"Inlet","id":0,"Hidden":false,"Custom":"Mesh","Exposed":"mesh"},{"uuid":"5ac86198-2d03-4830-9e41-a6d529922d29","ObjectName":"Inlet","id":1,"Hidden":false,"Custom":"Base Color Tex","Exposed":"base color tex","Format":0,"FormatSet":false,"Filter":2,"AddressMode":1,"MipmapMode":0},{"uuid":"5ac86198-2d03-4830-9e41-a6d529922d29","ObjectName":"Inlet","id":2,"Hidden":false,"Custom":"Metal Rough Tex","Exposed":"metal rough tex","Format":0,"FormatSet":false,"Filter":2,"AddressMode":1,"MipmapMode":0},{"uuid":"5ac86198-2d03-4830-9e41-a6d529922d29","ObjectName":"Inlet","id":3,"Hidden":false,"Custom":"Normal Tex","Exposed":"normal tex","Format":0,"FormatSet":false,"Filter":2,"AddressMode":1,"MipmapMode":0},{"uuid":"5ac86198-2d03-4830-9e41-a6d529922d29","ObjectName":"Inlet","id":4,"Hidden":false,"Custom":"Emissive Tex","Exposed":"emissive tex","Format":0,"FormatSet":false,"Filter":2,"AddressMode":1,"MipmapMode":0},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":5,"Hidden":true,"Custom":"Color R","Exposed":"color r","Value":{"Float":1.0},"Init":{"Float":1.0},"Domain":{"Float":{"Min":0.0,"Max":1.0}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":6,"Hidden":true,"Custom":"Color G","Exposed":"color g","Value":{"Float":1.0},"Init":{"Float":1.0},"Domain":{"Float":{"Min":0.0,"Max":1.0}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":7,"Hidden":true,"Custom":"Color B","Exposed":"color b","Value":{"Float":1.0},"Init":{"Float":1.0},"Domain":{"Float":{"Min":0.0,"Max":1.0}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":8,"Hidden":true,"Custom":"Color A","Exposed":"color a","Value":{"Float":1.0},"Init":{"Float":1.0},"Domain":{"Float":{"Min":0.0,"Max":1.0}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":9,"Hidden":true,"Custom":"Metallic","Exposed":"metallic","Value":{"Float":0.2996988594532013},"Init":{"Float":0.0},"Domain":{"Float":{"Min":0.0,"Max":1.0}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":10,"Hidden":true,"Custom":"Roughness","Exposed":"roughness","Value":{"Float":0.37076541781425476},"Init":{"Float":0.5},"Domain":{"Float":{"Min":0.0,"Max":1.0}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":11,"Hidden":true,"Custom":"Emissive R","Exposed":"emissive r","Value":{"Float":0.10000000149011612},"Init":{"Float":0.0},"Domain":{"Float":{"Min":0.0,"Max":10.0}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":12,"Hidden":true,"Custom":"Emissive G","Exposed":"emissive g","Value":{"Float":0.10000000149011612},"Init":{"Float":0.0},"Domain":{"Float":{"Min":0.0,"Max":10.0}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":13,"Hidden":true,"Custom":"Emissive B","Exposed":"emissive b","Value":{"Float":0.10000000149011612},"Init":{"Float":0.0},"Domain":{"Float":{"Min":0.0,"Max":10.0}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":14,"Hidden":true,"Custom":"Emissive strength","Exposed":"emissive strength","Value":{"Float":0.6570943593978882},"Init":{"Float":1.0},"Domain":{"Float":{"Min":0.0,"Max":10.0}}},{"uuid":"377e8205-b442-4d54-8832-3761def522b2","ObjectName":"Inlet","id":15,"Hidden":true,"Custom":"Position","Exposed":"position","Value":{"Vec3f":[0.0,0.0,0.0]},"Init":{"Vec3f":[0.0,0.0,0.0]},"Domain":{"Vec3f":{"Min":[-8388608.0,-8388608.0,-8388608.0],"Max":[8388608.0,8388608.0,8388608.0],"Values":[[],[],[]]}}},{"uuid":"377e8205-b442-4d54-8832-3761def522b2","ObjectName":"Inlet","id":16,"Hidden":true,"Custom":"Rotation","Exposed":"rotation","Value":{"Vec3f":[0.0,8.325613975524902,0.0]},"Init":{"Vec3f":[0.0,0.0,0.0]},"Domain":{"Vec3f":{"Min":[0.0,0.0,0.0],"Max":[360.0,360.0,360.0],"Values":[[],[],[]]}}},{"uuid":"377e8205-b442-4d54-8832-3761def522b2","ObjectName":"Inlet","id":17,"Hidden":true,"Custom":"Scale","Exposed":"scale","Value":{"Vec3f":[1.0,1.0,1.0]},"Init":{"Vec3f":[1.0,1.0,1.0]},"Domain":{"Vec3f":{"Min":[0.000009999999747378752,0.000009999999747378752,0.000009999999747378752],"Max":[1000.0,1000.0,1000.0],"Values":[[],[],[]]}}}],"Outlets":[{"uuid":"848061c5-e8a0-4a13-9985-e8df30ce6d4f","ObjectName":"Outlet","id":0,"Hidden":false,"Custom":"Scene Out","Exposed":"scene out"}]},{"uuid":"cf8a328a-1ba6-47f8-929f-2168bdec90b0","ObjectName":"3d_cube","id":2,"Metadata":{"ScriptingName":"Cube","Comment":"","Color":"Transparent1","Label":"","Touched":true},"Duration":11289600000,"Height":300.0,"StartOffset":0,"LoopDuration":11289600000,"Pos":[-516.8552088165063,-232.55444520628637],"Size":[221.0,108.0],"Loops":false,"FoldMode":0,"Inlets":[{"uuid":"377e8205-b442-4d54-8832-3761def522b2","ObjectName":"Inlet","id":0,"Hidden":true,"Custom":"Position","Exposed":"position","Value":{"Vec3f":[0.0,0.0,0.0]},"Init":{"Vec3f":[0.0,0.0,0.0]},"Domain":{"Vec3f":{"Min":[-8388608.0,-8388608.0,-8388608.0],"Max":[8388608.0,8388608.0,8388608.0],"Values":[[],[],[]]}}},{"uuid":"377e8205-b442-4d54-8832-3761def522b2","ObjectName":"Inlet","id":1,"Hidden":true,"Custom":"Rotation","Exposed":"rotation","Value":{"Vec3f":[0.0,0.0,0.0]},"Init":{"Vec3f":[0.0,0.0,0.0]},"Domain":{"Vec3f":{"Min":[0.0,0.0,0.0],"Max":[360.0,360.0,360.0],"Values":[[],[],[]]}}},{"uuid":"377e8205-b442-4d54-8832-3761def522b2","ObjectName":"Inlet","id":2,"Hidden":true,"Custom":"Scale","Exposed":"scale","Value":{"Vec3f":[1.0,1.0,1.0]},"Init":{"Vec3f":[1.0,1.0,1.0]},"Domain":{"Vec3f":{"Min":[0.000009999999747378752,0.000009999999747378752,0.000009999999747378752],"Max":[1000.0,1000.0,1000.0],"Values":[[],[],[]]}}}],"Outlets":[{"uuid":"848061c5-e8a0-4a13-9985-e8df30ce6d4f","ObjectName":"Outlet","id":0,"Hidden":false,"Custom":"Geometry","Exposed":"geometry"}]},{"uuid":"74ca45ff-92c9-44a0-8f1a-754dea05ee1b","ObjectName":"gfxProcess","id":3,"Metadata":{"ScriptingName":"NoiseAnimationElectric","Comment":"","Color":"Transparent1","Label":"","Touched":true},"Duration":11289600000,"Height":300.0,"StartOffset":0,"LoopDuration":11289600000,"Pos":[-716.2209302490708,28.891893093865015],"Size":[320.0,161.5],"Loops":false,"FoldMode":0,"Vertex":"","Fragment":"/*{\n\t\"CREDIT\" : \"NoiseAnimationElectric by nimitz\",\n\t\"CATEGORIES\" : [\n\t\t\"ci\"\n\t],\n\t\"DESCRIPTION\": \"\",\n\t\"INPUTS\": [\n\t\t{\n\t\t\t\"NAME\": \"background\",\n\t\t\t\"TYPE\": \"bool\",\n\t\t\t\"DEFAULT\": false\n\t\t},\n\t\t{\n\t\t\t\"NAME\": \"blurAmount\",\n\t\t\t\"TYPE\": \"float\"\n\t\t},\n\t\t{\n\t\t\t\"NAME\": \"iZoom\",\n\t\t\t\"TYPE\" : \"float\",\n\t\t\t\"MIN\" : 0.1,\n\t\t\t\"MAX\" : 2.0,\n\t\t\t\"DEFAULT\" : 1.0\n\t\t},\n\t\t{\n\t\t\t\"NAME\": \"iSteps\",\n\t\t\t\"TYPE\" : \"float\",\n\t\t\t\"MIN\" : 2.0,\n\t\t\t\"MAX\" : 75.0,\n\t\t\t\"DEFAULT\" : 19.0\n\t\t},\n\t\t{\n\t\t\t\"NAME\" :\"iMouse\",\n\t\t\t\"TYPE\" : \"point2D\",\n\t\t\t\"DEFAULT\" : [0.0, 0.0],\n\t\t\t\"MAX\" : [640.0, 480.0],\n\t\t\t\"MIN\" : [0.0, 0.0]\n\t\t},\n\t\t{\n\t\t\t\"NAME\": \"iColor\", \n\t\t\t\"TYPE\" : \"color\", \n\t\t\t\"DEFAULT\" : [\n\t\t\t\t0.9, \n\t\t\t\t0.6, \n\t\t\t\t0.0, \n\t\t\t\t1.0\n\t\t\t]\n\t\t}\n\t]\n}\n*/\n// https://www.shadertoy.com/view/ldlXRS\n// Noise animation - Electric\n// by nimitz (stormoid.com) (twitter: @stormoid)\n// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License\n// Contact the author for other licensing options\n\n//The domain is displaced by two fbm calls one for each axis.\n//Turbulent fbm (aka ridged) is used for better effect.\n\n#define tm TIME*0.15\n#define tau 6.2831853\n\nmat2 makem2(in float theta){float c = cos(theta);float s = sin(theta);return mat2(c,-s,s,c);}\n//float noise( in vec2 x ){return texture(iChannel0, x*.01).x;}\n// procedural noise\nfloat hash(const float n)\n{\n\treturn fract(sin(n)*29712.15073);\n}\n\nfloat noise(const vec2 x)\n{\n\tvec2 p=floor(x); vec2 f=fract(x);\n\tf=f*f*(3.0-2.0*f);\n\tfloat n=p.x+p.y;\n\tfloat r1=mix(mix(hash(n+0.0),hash(n+1.0),f.x),mix(hash(n),hash(n+1.0),f.x),f.y);\n    float r2=mix(mix(hash(n),hash(n+1.0),f.x),mix(hash(n),hash(n+1.0),f.x),f.y);\n\treturn mix(r1,r2,f.y);\n}\nfloat fbm(in vec2 p)\n{\t\n\tfloat z=2.;\n\tfloat rz = 0.;\n\tvec2 bp = p;\n\tfor (float i= 1.;i < 6.;i++)\n\t{\n\t\trz+= abs((noise(p)-0.5)*2.)/z;\n\t\tz = z*2.;\n\t\tp = p*2.;\n\t}\n\treturn rz;\n}\n\nfloat dualfbm(in vec2 p)\n{\n    //get two rotated fbm calls and displace the domain\n\tvec2 p2 = p*.7;\n\tvec2 basis = vec2(fbm(p2-tm*1.6),fbm(p2+tm*1.7));\n\tbasis = (basis-.5)*.2;\n\tp += basis;\n\t\n\t//coloring\n\treturn fbm(p*makem2(tm*0.2));\n}\n\nfloat circ(vec2 p) \n{\n\tfloat r = length(p);\n\tr = log(sqrt(r));\n\treturn abs(mod(r*4.,tau)-3.14)*3.+.2;\n\n}\n\n\nvoid main(void)\n{\n\t//setup system\n\tvec2 p = isf_FragNormCoord-0.5;\n\tp.x *= RENDERSIZE.x/RENDERSIZE.y;\n\tp*=4.;\n\t\n    float rz = background ? dualfbm(p) : 0.1;\n\t\n\t//rings\n\tp /= exp(mod(tm*10.,3.14159));\n\trz *= pow(abs((0.1-circ(p))),.9);\n\t\n\t//final color\n\tvec3 col = vec3(.2,0.1,0.4)/rz;\n\tcol=pow(abs(col),vec3(.99));\n\tgl_FragColor = vec4(col,1.);\n\t    \n  \n}\n","Root":"<PROJECT>:ossia/score/packages/default/Presets/GLSL_shaders/sophia-digital-art/NoiseAnimationElectric.fs","Inlets":[{"uuid":"fb27e4cb-ea7f-41e2-ad92-2354498c1b6b","ObjectName":"Inlet","id":0,"Hidden":true,"Custom":"background","Exposed":"background","Value":{"Bool":false},"Init":{"Bool":false},"Domain":{"Bool":null}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":1,"Hidden":true,"Custom":"blurAmount","Exposed":"bluramount","Value":{"Float":0.0},"Init":{"Float":0.0},"Domain":{"Float":{"Min":0.0,"Max":1.0}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":2,"Hidden":true,"Custom":"iZoom","Exposed":"izoom","Value":{"Float":1.0},"Init":{"Float":1.0},"Domain":{"Float":{"Min":0.10000000149011612,"Max":2.0}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":3,"Hidden":true,"Custom":"iSteps","Exposed":"isteps","Value":{"Float":19.0},"Init":{"Float":19.0},"Domain":{"Float":{"Min":2.0,"Max":75.0}}},{"uuid":"0adbbdda-fda4-451e-91cc-1da731bde9d5","ObjectName":"Inlet","id":4,"Hidden":true,"Custom":"iMouse","Exposed":"imouse","Value":{"Vec2f":[0.0,0.0]},"Init":{"Vec2f":[0.0,0.0]},"Domain":{"Vec2f":{"Min":[0.0,0.0],"Max":[640.0,480.0],"Values":[[],[]]}},"Integral":false},{"uuid":"8f38638e-9f9f-48b0-ae36-1cba86ef5703","ObjectName":"Inlet","id":5,"Hidden":true,"Custom":"iColor","Exposed":"icolor","Value":{"Vec4f":[0.8999999761581421,0.6000000238418579,0.0,1.0]},"Init":{"Vec4f":[0.8999999761581421,0.6000000238418579,0.0,1.0]},"Domain":{}}],"Outlets":[{"uuid":"f1c71046-b754-49a5-8e66-d01374773dfc","ObjectName":"Outlet","id":1,"Hidden":false,"Custom":"Texture Out","Exposed":"texture out"}]},{"uuid":"a8f2c6d0-1b4e-4c7a-9d3f-5e8b2c1a7f0d","ObjectName":"gfxProcess","id":4,"Metadata":{"ScriptingName":"Scene Preprocessor","Comment":"","Color":"Transparent1","Label":"","Touched":true},"Duration":11289600000,"Height":300.0,"StartOffset":0,"LoopDuration":11289600000,"Pos":[345.16826975151764,-253.18409981818363],"Size":[171.0,22.0],"Loops":false,"FoldMode":0,"Inlets":[{"uuid":"f2ab26ea-415d-45a2-bfbc-2968c7c92a33","ObjectName":"Inlet","id":0,"Hidden":false,"Custom":"Scene In","Exposed":"scene in"}],"Outlets":[{"uuid":"848061c5-e8a0-4a13-9985-e8df30ce6d4f","ObjectName":"Outlet","id":0,"Hidden":false,"Custom":"Geometry Out","Exposed":"geometry out"}]},{"uuid":"dbfc2101-40d7-4807-8804-571e88992e7e","ObjectName":"gfxProcess","id":6,"Metadata":{"ScriptingName":"classic_pbr_full.1","Comment":"","Color":"Transparent1","Label":"","Touched":true},"Duration":11289600000,"Height":300.0,"StartOffset":0,"LoopDuration":11289600000,"Pos":[532.2499314899977,-255.80479449999737],"Size":[787.0,160.0],"Loops":false,"FoldMode":2,"Vertex":"// Full-PBR variant — extends classic_pbr_textured with TANGENT for TBN\n// normal-map reconstruction in the fragment stage.\n//\n// Vertex inputs + varyings come from the sibling .frag's VERTEX_INPUTS /\n// VERTEX_OUTPUTS blocks; redeclaring them here triggers \"redefinition\".\n\nvoid main()\n{\n    isf_vertShaderInit();\n\n    // Unified-MDI cmd-index lookup: per-instance VERTEX_INPUT carries\n    // the drawID directly. Replaces the prior `gl_BaseInstanceARB`\n    // path, which broke as soon as instanceCount > 1 (firstInstance\n    // becomes the per-instance slot offset, no longer the cmd index)\n    // AND was always 0 on the CPU-fallback drawIndexed loop. Reading\n    // a per-instance attribute works uniformly on both indirect and\n    // CPU-fallback paths (firstInstance is honoured by every QRhi\n    // backend that supports instancing).\n    uint drawId = draw_id;\n    v_drawID = drawId;\n\n    PerDraw pd = per_draws.data[drawId];\n    mat3 instLinear = pd.normal[3].x > 0.5\n        ? mat3(inst_matrix0.xyz, inst_matrix1.xyz, inst_matrix2.xyz)\n        : mat3(1.0);\n    mat4 model = pd.model;\n    mat3 normalMatrix = mat3(pd.normal) * transpose(inverse(instLinear));\n\n    // Per-instance translation offset: zero for non-instanced draws via\n    // the REQUIRED:false fallback (identity broadcast); the actual\n    // particle position for unified-MDI instance groups.\n    vec4 wp = model * vec4(instLinear * position + inst_translation, 1.0);\n    v_worldPos = wp.xyz;\n    v_normal = normalize(normalMatrix * normal);\n    // Tangent carries xyz = unit tangent in mesh space + w = handedness.\n    // Apply the normal matrix to the xyz (same basis as the normal) and\n    // forward w untouched. Consumer reconstructs bitangent as\n    //   bitangent = cross(N, T.xyz) * T.w\n    v_tangent = vec4(normalize(normalMatrix * tangent.xyz), tangent.w);\n    v_uv = texcoord_0;\n    // glTF TEXCOORD_1 (secondary UV set — lightmaps, per-channel UV\n    // override). Falls back to zero for meshes without it (slab\n    // uploader fills with zeros).\n    v_uv1 = texcoord_1;\n    // glTF COLOR_0 (defaults to vec4(1) when the mesh doesn't carry\n    // one — the slab uploader fills the buffer with white).\n    v_color = color_0;\n    // VERTEX_INPUTS aren't directly visible to the fragment stage —\n    // forward the per-instance broadcast colour as a varying so the\n    // .frag can multiply baseColor by it.\n    v_inst_color = pd.normal[3].y > 0.5 ? inst_color0 : vec4(1.0);\n    v_inst_emissive = pd.normal[3].z > 0.5 ? inst_custom0 : vec4(0.0);\n\n    gl_Position = clipSpaceCorrMatrix * camera.viewProjection * wp;\n\n    isf_vertShaderFinish();\n}\n","Fragment":"/*{\n  \"CREDIT\": \"ossia team\",\n  \"ISFVSN\": \"2\",\n  \"MODE\": \"RAW_RASTER_PIPELINE\",\n  \"ALPHA\": \"straight\",\n  \"DESCRIPTION\": \"Full glTF metallic-roughness rasterizer for a Scene Preprocessor output: draws the whole scene in one indirect draw with every material texture (base colour, metal-rough, normal map with tangents, emissive, occlusion; texcoord sets, KHR_texture_transform, wrap modes, alpha MASK and BLEND, double-sided), the scene's lights (directional, point and spot, with range and falloff; procedural lights written by the presets/lighting CSFs included), the Environment node's ambient, exposure and linear fog, and per-instance transforms, colours and emissive from an Instancer. No image-based lighting and no shadows: a fixed Fresnel term stands in for reflections (classic_pbr_openpbr adds IBL and cascaded shadows). Output is linear HDR, so follow it with a tone mapper such as shaderlib/post-process/ToneMapping.fs. Alpha-to-coverage smooths MASK edges under MSAA; the volumetric toggle composites the presets/volumetric fog chain.\",\n  \"CATEGORIES\": [\n    \"3D\",\n    \"Scene\",\n    \"MDI\",\n    \"Textured\",\n    \"Normal-Mapped\"\n  ],\n  \"VERTEX_INPUTS\": [\n    {\n      \"TYPE\": \"vec3\",\n      \"NAME\": \"position\"\n    },\n    {\n      \"TYPE\": \"vec3\",\n      \"NAME\": \"normal\"\n    },\n    {\n      \"TYPE\": \"vec2\",\n      \"NAME\": \"texcoord_0\"\n    },\n    {\n      \"TYPE\": \"vec4\",\n      \"NAME\": \"tangent\"\n    },\n    {\n      \"TYPE\": \"vec4\",\n      \"NAME\": \"color_0\"\n    },\n    {\n      \"TYPE\": \"vec2\",\n      \"NAME\": \"texcoord_1\"\n    },\n    {\n      \"TYPE\": \"vec3\",\n      \"NAME\": \"inst_translation\",\n      \"SEMANTIC\": \"translation\",\n      \"REQUIRED\": false\n    },\n    {\n      \"TYPE\": \"vec4\",\n      \"NAME\": \"inst_color0\",\n      \"SEMANTIC\": \"instance_color0\",\n      \"REQUIRED\": false\n    },\n    {\n      \"TYPE\": \"vec4\",\n      \"NAME\": \"inst_custom0\",\n      \"SEMANTIC\": \"instance_custom0\",\n      \"REQUIRED\": false\n    },\n    {\n      \"TYPE\": \"vec4\",\n      \"NAME\": \"inst_matrix0\",\n      \"REQUIRED\": false\n    },\n    {\n      \"TYPE\": \"vec4\",\n      \"NAME\": \"inst_matrix1\",\n      \"REQUIRED\": false\n    },\n    {\n      \"TYPE\": \"vec4\",\n      \"NAME\": \"inst_matrix2\",\n      \"REQUIRED\": false\n    },\n    {\n      \"TYPE\": \"uint\",\n      \"NAME\": \"draw_id\",\n      \"SEMANTIC\": \"instance_draw_id\"\n    }\n  ],\n  \"VERTEX_OUTPUTS\": [\n    {\n      \"TYPE\": \"vec3\",\n      \"NAME\": \"v_worldPos\"\n    },\n    {\n      \"TYPE\": \"vec3\",\n      \"NAME\": \"v_normal\"\n    },\n    {\n      \"TYPE\": \"vec2\",\n      \"NAME\": \"v_uv\"\n    },\n    {\n      \"TYPE\": \"uint\",\n      \"NAME\": \"v_drawID\"\n    },\n    {\n      \"TYPE\": \"vec4\",\n      \"NAME\": \"v_tangent\"\n    },\n    {\n      \"TYPE\": \"vec4\",\n      \"NAME\": \"v_color\"\n    },\n    {\n      \"TYPE\": \"vec2\",\n      \"NAME\": \"v_uv1\"\n    },\n    {\n      \"TYPE\": \"vec4\",\n      \"NAME\": \"v_inst_color\"\n    },\n    {\n      \"TYPE\": \"vec4\",\n      \"NAME\": \"v_inst_emissive\"\n    }\n  ],\n  \"FRAGMENT_INPUTS\": [\n    {\n      \"TYPE\": \"vec3\",\n      \"NAME\": \"v_worldPos\"\n    },\n    {\n      \"TYPE\": \"vec3\",\n      \"NAME\": \"v_normal\"\n    },\n    {\n      \"TYPE\": \"vec2\",\n      \"NAME\": \"v_uv\"\n    },\n    {\n      \"TYPE\": \"uint\",\n      \"NAME\": \"v_drawID\"\n    },\n    {\n      \"TYPE\": \"vec4\",\n      \"NAME\": \"v_tangent\"\n    },\n    {\n      \"TYPE\": \"vec4\",\n      \"NAME\": \"v_color\"\n    },\n    {\n      \"TYPE\": \"vec2\",\n      \"NAME\": \"v_uv1\"\n    },\n    {\n      \"TYPE\": \"vec4\",\n      \"NAME\": \"v_inst_color\"\n    },\n    {\n      \"TYPE\": \"vec4\",\n      \"NAME\": \"v_inst_emissive\"\n    }\n  ],\n  \"FRAGMENT_OUTPUTS\": [\n    {\n      \"TYPE\": \"vec4\",\n      \"NAME\": \"isf_FragColor\"\n    }\n  ],\n  \"INPUTS\": [\n    {\n      \"NAME\": \"camera\",\n      \"TYPE\": \"uniform\",\n      \"VISIBILITY\": \"vertex+fragment\",\n      \"LAYOUT\": [\n        {\n          \"NAME\": \"view\",\n          \"TYPE\": \"mat4\"\n        },\n        {\n          \"NAME\": \"projection\",\n          \"TYPE\": \"mat4\"\n        },\n        {\n          \"NAME\": \"viewProjection\",\n          \"TYPE\": \"mat4\"\n        },\n        {\n          \"NAME\": \"cameraPosition\",\n          \"TYPE\": \"vec4\"\n        },\n        {\n          \"NAME\": \"renderSize\",\n          \"TYPE\": \"vec4\"\n        },\n        {\n          \"NAME\": \"params\",\n          \"TYPE\": \"vec4\"\n        }\n      ]\n    },\n    {\n      \"NAME\": \"scene_lights\",\n      \"TYPE\": \"storage\",\n      \"ACCESS\": \"read_only\",\n      \"VISIBILITY\": \"fragment\",\n      \"LAYOUT\": [\n        {\n          \"NAME\": \"entries\",\n          \"TYPE\": \"Light[]\"\n        }\n      ]\n    },\n    {\n      \"NAME\": \"scene_light_indices\",\n      \"TYPE\": \"storage\",\n      \"ACCESS\": \"read_only\",\n      \"VISIBILITY\": \"fragment\",\n      \"LAYOUT\": [\n        {\n          \"NAME\": \"data\",\n          \"TYPE\": \"uint[]\"\n        }\n      ]\n    },\n    {\n      \"NAME\": \"world_transforms\",\n      \"TYPE\": \"storage\",\n      \"ACCESS\": \"read_only\",\n      \"VISIBILITY\": \"vertex+fragment\",\n      \"LAYOUT\": [\n        {\n          \"NAME\": \"data\",\n          \"TYPE\": \"mat4[]\"\n        }\n      ]\n    },\n    {\n      \"NAME\": \"scene_materials\",\n      \"TYPE\": \"storage\",\n      \"ACCESS\": \"read_only\",\n      \"VISIBILITY\": \"fragment\",\n      \"LAYOUT\": [\n        {\n          \"NAME\": \"entries\",\n          \"TYPE\": \"Material[]\"\n        }\n      ]\n    },\n    {\n      \"NAME\": \"scene_material_uv_xforms\",\n      \"TYPE\": \"storage\",\n      \"ACCESS\": \"read_only\",\n      \"VISIBILITY\": \"fragment\",\n      \"LAYOUT\": [\n        {\n          \"NAME\": \"entries\",\n          \"TYPE\": \"MatUVXform[]\"\n        }\n      ]\n    },\n    {\n      \"NAME\": \"per_draws\",\n      \"TYPE\": \"storage\",\n      \"ACCESS\": \"read_only\",\n      \"VISIBILITY\": \"vertex+fragment\",\n      \"LAYOUT\": [\n        {\n          \"NAME\": \"data\",\n          \"TYPE\": \"PerDraw[]\"\n        }\n      ]\n    },\n    {\n      \"NAME\": \"indirect_draw_cmds\",\n      \"TYPE\": \"storage\",\n      \"ACCESS\": \"read_only\",\n      \"VISIBILITY\": \"none\",\n      \"BUFFER_USAGE\": \"indirect_draw_indexed\",\n      \"LAYOUT\": [\n        {\n          \"NAME\": \"cmds\",\n          \"TYPE\": \"DrawIndexedCmd[]\"\n        }\n      ]\n    },\n    {\n      \"NAME\": \"scene_counts\",\n      \"TYPE\": \"storage\",\n      \"ACCESS\": \"read_only\",\n      \"VISIBILITY\": \"fragment\",\n      \"LAYOUT\": [\n        {\n          \"NAME\": \"light_count\",\n          \"TYPE\": \"uint\"\n        },\n        {\n          \"NAME\": \"material_count\",\n          \"TYPE\": \"uint\"\n        },\n        {\n          \"NAME\": \"draw_count\",\n          \"TYPE\": \"uint\"\n        },\n        {\n          \"NAME\": \"_pad0\",\n          \"TYPE\": \"uint\"\n        }\n      ]\n    },\n    {\n      \"NAME\": \"env\",\n      \"TYPE\": \"uniform\",\n      \"VISIBILITY\": \"fragment\",\n      \"LAYOUT\": [\n        {\n          \"NAME\": \"ambient\",\n          \"TYPE\": \"vec4\"\n        },\n        {\n          \"NAME\": \"fog_color_density\",\n          \"TYPE\": \"vec4\"\n        },\n        {\n          \"NAME\": \"fog_range\",\n          \"TYPE\": \"vec4\"\n        },\n        {\n          \"NAME\": \"exposure_gamma\",\n          \"TYPE\": \"vec4\"\n        }\n      ]\n    },\n    {\n      \"NAME\": \"alpha_a2c_enabled\",\n      \"TYPE\": \"long\",\n      \"DEFAULT\": 0,\n      \"MIN\": 0,\n      \"MAX\": 1,\n      \"LABEL\": \"Alpha-to-coverage (writes gl_SampleMask under MSAA). Best for foliage edges when MSAA is enabled. Adapts to the framebuffer sample count (1/2/4/8/16); degrades to a 0.5 binary cutoff when MSAA is off.\"\n    },\n    {\n      \"NAME\": \"volumetric_enabled\",\n      \"TYPE\": \"long\",\n      \"DEFAULT\": 0,\n      \"MIN\": 0,\n      \"MAX\": 1,\n      \"LABEL\": \"Volumetric fog composite (1=on)\",\n      \"DESCRIPTION\": \"Sample the upstream vol_integrated SSBO (built by the volumetric_inject / scatter / integrate chain) and apply finalColor = finalColor * transmittance + accum * intensity per fragment. Default off so rasterizers without the volumetric chain wired don't multiply by an unbound (zero-init) transmittance and go pure black.\"\n    },\n    {\n      \"NAME\": \"volumetric_intensity\",\n      \"TYPE\": \"float\",\n      \"DEFAULT\": 1.0,\n      \"MIN\": 0.0,\n      \"MAX\": 4.0,\n      \"LABEL\": \"Volumetric intensity\",\n      \"DESCRIPTION\": \"Scalar on the in-scattered radiance contribution. 1.0 = physical; <1 dampens the fog look; >1 over-blooms the air for stylized output. Has no effect when volumetric_enabled=0.\"\n    }\n  ],\n  \"AUXILIARY\": [\n    {\n      \"NAME\": \"scene_material_wrap\",\n      \"TYPE\": \"storage\",\n      \"ACCESS\": \"read_only\",\n      \"VISIBILITY\": \"fragment\",\n      \"LAYOUT\": [\n        {\n          \"NAME\": \"entries\",\n          \"TYPE\": \"uvec4[]\"\n        }\n      ]\n    },\n    {\n      \"NAME\": \"cluster_config\",\n      \"ACCESS\": \"read_only\",\n      \"LAYOUT\": [\n        {\n          \"NAME\": \"cluster_x\",\n          \"TYPE\": \"uint\"\n        },\n        {\n          \"NAME\": \"cluster_y\",\n          \"TYPE\": \"uint\"\n        },\n        {\n          \"NAME\": \"cluster_z\",\n          \"TYPE\": \"uint\"\n        },\n        {\n          \"NAME\": \"max_lights_per_cluster\",\n          \"TYPE\": \"uint\"\n        }\n      ]\n    },\n    {\n      \"NAME\": \"vol_integrated\",\n      \"ACCESS\": \"read_only\",\n      \"LAYOUT\": [\n        {\n          \"NAME\": \"data\",\n          \"TYPE\": \"FroxelIntegrated[]\"\n        }\n      ]\n    },\n    {\n      \"NAME\": \"materialArray0\",\n      \"TYPE\": \"image\",\n      \"IS_ARRAY\": true,\n      \"WRAP\": \"repeat\"\n    },\n    {\n      \"NAME\": \"materialArray1\",\n      \"TYPE\": \"image\",\n      \"IS_ARRAY\": true,\n      \"WRAP\": \"repeat\"\n    },\n    {\n      \"NAME\": \"materialArray2\",\n      \"TYPE\": \"image\",\n      \"IS_ARRAY\": true,\n      \"WRAP\": \"repeat\"\n    },\n    {\n      \"NAME\": \"materialArray3\",\n      \"TYPE\": \"image\",\n      \"IS_ARRAY\": true,\n      \"WRAP\": \"repeat\"\n    },\n    {\n      \"NAME\": \"materialArray4\",\n      \"TYPE\": \"image\",\n      \"IS_ARRAY\": true,\n      \"WRAP\": \"repeat\"\n    },\n    {\n      \"NAME\": \"materialArray5\",\n      \"TYPE\": \"image\",\n      \"IS_ARRAY\": true,\n      \"WRAP\": \"repeat\"\n    },\n    {\n      \"NAME\": \"materialArray6\",\n      \"TYPE\": \"image\",\n      \"IS_ARRAY\": true,\n      \"WRAP\": \"repeat\"\n    },\n    {\n      \"NAME\": \"materialArray7\",\n      \"TYPE\": \"image\",\n      \"IS_ARRAY\": true,\n      \"WRAP\": \"repeat\"\n    },\n    {\n      \"NAME\": \"materialDyn0\",\n      \"TYPE\": \"image\",\n      \"WRAP\": \"repeat\"\n    },\n    {\n      \"NAME\": \"materialDyn1\",\n      \"TYPE\": \"image\",\n      \"WRAP\": \"repeat\"\n    },\n    {\n      \"NAME\": \"materialDyn2\",\n      \"TYPE\": \"image\",\n      \"WRAP\": \"repeat\"\n    },\n    {\n      \"NAME\": \"materialDyn3\",\n      \"TYPE\": \"image\",\n      \"WRAP\": \"repeat\"\n    },\n    {\n      \"NAME\": \"materialDyn4\",\n      \"TYPE\": \"image\",\n      \"WRAP\": \"repeat\"\n    },\n    {\n      \"NAME\": \"materialDyn5\",\n      \"TYPE\": \"image\",\n      \"WRAP\": \"repeat\"\n    },\n    {\n      \"NAME\": \"materialDyn6\",\n      \"TYPE\": \"image\",\n      \"WRAP\": \"repeat\"\n    },\n    {\n      \"NAME\": \"materialDyn7\",\n      \"TYPE\": \"image\",\n      \"WRAP\": \"repeat\"\n    }\n  ],\n  \"TYPES\": [\n    {\n      \"NAME\": \"Light\",\n      \"LAYOUT\": [\n        {\n          \"NAME\": \"color\",\n          \"TYPE\": \"vec4\"\n        },\n        {\n          \"NAME\": \"local_direction\",\n          \"TYPE\": \"vec4\"\n        },\n        {\n          \"NAME\": \"range_cone\",\n          \"TYPE\": \"vec4\"\n        },\n        {\n          \"NAME\": \"shadow_enabled\",\n          \"TYPE\": \"uint\"\n        },\n        {\n          \"NAME\": \"decay_mode\",\n          \"TYPE\": \"uint\"\n        },\n        {\n          \"NAME\": \"transform_slot\",\n          \"TYPE\": \"uint\"\n        },\n        {\n          \"NAME\": \"normal_bias\",\n          \"TYPE\": \"float\"\n        }\n      ]\n    },\n    {\n      \"NAME\": \"Material\",\n      \"LAYOUT\": [\n        {\n          \"NAME\": \"baseColor\",\n          \"TYPE\": \"vec4\"\n        },\n        {\n          \"NAME\": \"metallicRoughnessOcclusionUnlit\",\n          \"TYPE\": \"vec4\"\n        },\n        {\n          \"NAME\": \"emissive_strength\",\n          \"TYPE\": \"vec4\"\n        },\n        {\n          \"NAME\": \"textureRefs\",\n          \"TYPE\": \"uvec4\"\n        },\n        {\n          \"NAME\": \"feature_mask\",\n          \"TYPE\": \"uint\"\n        },\n        {\n          \"NAME\": \"hit_group_id\",\n          \"TYPE\": \"uint\"\n        },\n        {\n          \"NAME\": \"occlusion_textureRef\",\n          \"TYPE\": \"uint\"\n        },\n        {\n          \"NAME\": \"alpha_cutoff\",\n          \"TYPE\": \"float\"\n        }\n      ]\n    },\n    {\n      \"NAME\": \"PerDraw\",\n      \"LAYOUT\": [\n        {\n          \"NAME\": \"model\",\n          \"TYPE\": \"mat4\"\n        },\n        {\n          \"NAME\": \"normal\",\n          \"TYPE\": \"mat4\"\n        },\n        {\n          \"NAME\": \"material_index\",\n          \"TYPE\": \"uint\"\n        },\n        {\n          \"NAME\": \"tag_hash\",\n          \"TYPE\": \"uint\"\n        },\n        {\n          \"NAME\": \"_pad0\",\n          \"TYPE\": \"uint\"\n        },\n        {\n          \"NAME\": \"_pad1\",\n          \"TYPE\": \"uint\"\n        }\n      ]\n    },\n    {\n      \"NAME\": \"DrawIndexedCmd\",\n      \"LAYOUT\": [\n        {\n          \"NAME\": \"indexCount\",\n          \"TYPE\": \"uint\"\n        },\n        {\n          \"NAME\": \"instanceCount\",\n          \"TYPE\": \"uint\"\n        },\n        {\n          \"NAME\": \"firstIndex\",\n          \"TYPE\": \"uint\"\n        },\n        {\n          \"NAME\": \"baseVertex\",\n          \"TYPE\": \"int\"\n        },\n        {\n          \"NAME\": \"baseInstance\",\n          \"TYPE\": \"uint\"\n        }\n      ]\n    },\n    {\n      \"NAME\": \"MatUVXform\",\n      \"LAYOUT\": [\n        {\n          \"NAME\": \"bc_offset_scale\",\n          \"TYPE\": \"vec4\"\n        },\n        {\n          \"NAME\": \"mr_offset_scale\",\n          \"TYPE\": \"vec4\"\n        },\n        {\n          \"NAME\": \"normal_offset_scale\",\n          \"TYPE\": \"vec4\"\n        },\n        {\n          \"NAME\": \"em_offset_scale\",\n          \"TYPE\": \"vec4\"\n        },\n        {\n          \"NAME\": \"occ_offset_scale\",\n          \"TYPE\": \"vec4\"\n        },\n        {\n          \"NAME\": \"rotations0\",\n          \"TYPE\": \"vec4\"\n        },\n        {\n          \"NAME\": \"rotations1\",\n          \"TYPE\": \"vec4\"\n        }\n      ]\n    },\n    {\n      \"NAME\": \"FroxelIntegrated\",\n      \"LAYOUT\": [\n        {\n          \"NAME\": \"accum_transmittance\",\n          \"TYPE\": \"vec4\"\n        }\n      ]\n    }\n  ],\n  \"PIPELINE_STATE\": {\n    \"DEPTH_TEST\": true,\n    \"DEPTH_WRITE\": true,\n    \"CULL_MODE\": \"back\"\n  }\n}*/\n\n// Sample a material texture channel given its packed textureRef. Matches\n// the SceneFlattener encoding:\n//   bits 31..30 : source (0=NONE/sentinel, 1=STATIC bucket, 2=DYNAMIC slot)\n//   bits 29..23 : bucket index (0..127); the ladder below covers the\n//                 first 16 — higher bucket ids fall back.\n//   bits 23..0  : layer index within the bucket's texture array (static)\n//                 OR slot index in the channel's dynamic sampler set.\n//\n// Each channel declares `kShaderBuckets` sampler2DArrays,\n// one per bucket. Materials with textures of different (format, pixelSize)\n// tuples land in different buckets; the switch ladder below dispatches\n// to the right sampler. Scenes with a single bucket hit case 0 only —\n// all other cases compile in but never execute.\n//\n// Dynamic slots resolve to per-channel sampler2D uniforms `*Dyn0` /\n// `*Dyn1` populated by ScenePreprocessor's aux-texture path — used for\n// large runtime textures (8K video, HDR shader outputs) that can't\n// round-trip through the bucket pool.\nconst uint kShaderBuckets = 16u;\n\n// ─── Manual N-tap anisotropic sampling ──────────────────────────────\n// Qt RHI hard-codes maxAnisotropy=1.0 in every backend; there is no\n// public API to enable hardware anisotropic filtering. Workaround: do\n// it in the shader. Standard \"sum of cones\" formulation:\n//\n//   1. Compute UV gradients dx/dy. Pick the longer one as the major\n//      axis, the shorter as minor.\n//   2. The footprint is an ellipse on the texture; ratio = |major|/|minor|\n//      gives the anisotropy needed (typical value at grazing angles is\n//      4-16).\n//   3. Take 4 hardware-filtered samples spaced along the major axis,\n//      each forced to the minor-axis LOD via textureGrad(minor, minor).\n//      Average them. The minor-axis grad keeps each sample sharp; the\n//      4 spaced taps integrate over the elongated footprint.\n//\n// Shortcut: when the footprint is roughly isotropic (ratio² < 4) we\n// drop to a plain hardware texture() — the 4-tap path is wasted cost.\n//\n// Cost: ~4× texture lookups when the path triggers (only at grazing\n// angles), 1× otherwise. We apply this only to base_color and normal\n// — the channels where the user can see the difference. metallic /\n// roughness / occlusion / emissive stay on plain texture().\nvec4 anisoSample2DArray(sampler2DArray tex, vec3 uv)\n{\n    vec2 dx = dFdx(uv.xy);\n    vec2 dy = dFdy(uv.xy);\n    float lx2 = dot(dx, dx);\n    float ly2 = dot(dy, dy);\n    vec2 major, minor;\n    float ratio2;\n    if(lx2 > ly2)\n    {\n        major = dx; minor = dy;\n        ratio2 = lx2 / max(ly2, 1e-12);\n    }\n    else\n    {\n        major = dy; minor = dx;\n        ratio2 = ly2 / max(lx2, 1e-12);\n    }\n    if(ratio2 < 4.0) return texture(tex, uv);\n\n    // 4 taps at -3/8, -1/8, 1/8, 3/8 of the major axis (uniform spacing,\n    // mean-zero, covers the elongated footprint without touching the\n    // tile borders that a -1/2..1/2 spacing would).\n    float layer = uv.z;\n    vec4 s0 = textureGrad(tex, vec3(uv.xy + major * -0.375, layer), minor, minor);\n    vec4 s1 = textureGrad(tex, vec3(uv.xy + major * -0.125, layer), minor, minor);\n    vec4 s2 = textureGrad(tex, vec3(uv.xy + major *  0.125, layer), minor, minor);\n    vec4 s3 = textureGrad(tex, vec3(uv.xy + major *  0.375, layer), minor, minor);\n    return (s0 + s1 + s2 + s3) * 0.25;\n}\nvec4 anisoSample2DArraySep(texture2DArray tex, sampler smp, vec3 uv)\n{\n    vec2 dx = dFdx(uv.xy);\n    vec2 dy = dFdy(uv.xy);\n    float lx2 = dot(dx, dx);\n    float ly2 = dot(dy, dy);\n    vec2 major, minor;\n    float ratio2;\n    if(lx2 > ly2)\n    {\n        major = dx; minor = dy;\n        ratio2 = lx2 / max(ly2, 1e-12);\n    }\n    else\n    {\n        major = dy; minor = dx;\n        ratio2 = ly2 / max(lx2, 1e-12);\n    }\n    if(ratio2 < 4.0) return texture(sampler2DArray(tex, smp), uv);\n\n    // 4 taps at -3/8, -1/8, 1/8, 3/8 of the major axis (uniform spacing,\n    // mean-zero, covers the elongated footprint without touching the\n    // tile borders that a -1/2..1/2 spacing would).\n    float layer = uv.z;\n    vec4 s0 = textureGrad(sampler2DArray(tex, smp), vec3(uv.xy + major * -0.375, layer), minor, minor);\n    vec4 s1 = textureGrad(sampler2DArray(tex, smp), vec3(uv.xy + major * -0.125, layer), minor, minor);\n    vec4 s2 = textureGrad(sampler2DArray(tex, smp), vec3(uv.xy + major *  0.125, layer), minor, minor);\n    vec4 s3 = textureGrad(sampler2DArray(tex, smp), vec3(uv.xy + major *  0.375, layer), minor, minor);\n    return (s0 + s1 + s2 + s3) * 0.25;\n}\n\nvec4 anisoSample2D(sampler2D tex, vec2 uv)\n{\n    vec2 dx = dFdx(uv);\n    vec2 dy = dFdy(uv);\n    float lx2 = dot(dx, dx);\n    float ly2 = dot(dy, dy);\n    vec2 major, minor;\n    float ratio2;\n    if(lx2 > ly2)\n    {\n        major = dx; minor = dy;\n        ratio2 = lx2 / max(ly2, 1e-12);\n    }\n    else\n    {\n        major = dy; minor = dx;\n        ratio2 = ly2 / max(lx2, 1e-12);\n    }\n    if(ratio2 < 4.0) return texture(tex, uv);\n\n    vec4 s0 = textureGrad(tex, uv + major * -0.375, minor, minor);\n    vec4 s1 = textureGrad(tex, uv + major * -0.125, minor, minor);\n    vec4 s2 = textureGrad(tex, uv + major *  0.125, minor, minor);\n    vec4 s3 = textureGrad(tex, uv + major *  0.375, minor, minor);\n    return (s0 + s1 + s2 + s3) * 0.25;\n}\nvec4 anisoSample2DSep(texture2D tex, sampler smp, vec2 uv)\n{\n    vec2 dx = dFdx(uv);\n    vec2 dy = dFdy(uv);\n    float lx2 = dot(dx, dx);\n    float ly2 = dot(dy, dy);\n    vec2 major, minor;\n    float ratio2;\n    if(lx2 > ly2)\n    {\n        major = dx; minor = dy;\n        ratio2 = lx2 / max(ly2, 1e-12);\n    }\n    else\n    {\n        major = dy; minor = dx;\n        ratio2 = ly2 / max(lx2, 1e-12);\n    }\n    if(ratio2 < 4.0) return texture(sampler2D(tex, smp), uv);\n\n    vec4 s0 = textureGrad(sampler2D(tex, smp), uv + major * -0.375, minor, minor);\n    vec4 s1 = textureGrad(sampler2D(tex, smp), uv + major * -0.125, minor, minor);\n    vec4 s2 = textureGrad(sampler2D(tex, smp), uv + major *  0.125, minor, minor);\n    vec4 s3 = textureGrad(sampler2D(tex, smp), uv + major *  0.375, minor, minor);\n    return (s0 + s1 + s2 + s3) * 0.25;\n}\n\n// One decoder for every material channel. The pool is shared, so the bucket\n// field of the ref is all that picks the array -- including its colourspace,\n// which is part of the bucket key rather than of the channel.\n// Per-texture wrap modes from scene_material_wrap, loaded once per fragment\n// from the material's entry. Four bits per texture ref: wrap_s in the low two,\n// wrap_t in the high two; 0 = repeat, 1 = clamp to edge, 2 = mirror. Slots\n// 0..4 are the main refs (base colour, metal-rough, normal, emissive,\n// occlusion), 5.. the extension refs in MaterialExt.textureRefs order. The\n// pool samples every array with one repeat sampler, so a non-repeat mode is\n// applied to the coordinate here.\nuvec3 g_matWrap = uvec3(0u);\nuint matWrap(uint slot)\n{\n    if(slot < 5u) return (g_matWrap.x >> (4u * slot)) & 0xFu;\n    uint e = slot - 5u;\n    uint word = e < 8u ? g_matWrap.y : g_matWrap.z;\n    return (word >> (4u * (e & 7u))) & 0xFu;\n}\nfloat wrapAxis(float x, uint mode, float halfTexel)\n{\n    if(mode == 1u) return clamp(x, halfTexel, 1.0 - halfTexel);\n    if(mode == 2u) { float t = mod(x, 2.0); return t > 1.0 ? 2.0 - t : t; }\n    return x;\n}\nvec2 applyWrap(vec2 uv, uint wrap, vec2 halfTexel)\n{\n    return vec2(wrapAxis(uv.x, wrap & 3u, halfTexel.x),\n                wrapAxis(uv.y, (wrap >> 2u) & 3u, halfTexel.y));\n}\n// Clamping stays inside the edge texel of the coarsest mip level the\n// trilinear filter reads, so a minified clamped texture does not bleed across\n// the repeat sampler's seam.\nvec2 wrapInset(texture2DArray tex, sampler smp, vec2 dx, vec2 dy)\n{\n    vec2 sz = vec2(textureSize(sampler2DArray(tex, smp), 0).xy);\n    float lod = max(0.0, log2(max(length(dx * sz), length(dy * sz))));\n    return min(vec2(0.5), 0.5 * exp2(ceil(lod)) / sz);\n}\n// anisoSample2DArray's wrapped counterpart. A single trilinear tap whose\n// gradients come from the unwrapped coordinate, so a mirror fold or a clamp\n// edge does not spike the mip selection; repeat, the common case, keeps the\n// anisotropic path untouched.\nvec4 anisoSample2DArrayWrapped(texture2DArray tex, sampler smp, vec3 uv, uint wrap)\n{\n    if(wrap == 0u) return anisoSample2DArraySep(tex, smp, uv);\n    vec2 dx = dFdx(uv.xy);\n    vec2 dy = dFdy(uv.xy);\n    return textureGrad(sampler2DArray(tex, smp),\n                       vec3(applyWrap(uv.xy, wrap, wrapInset(tex, smp, dx, dy)), uv.z),\n                       dx, dy);\n}\n\n\nvec4 sample_material_slot(uint ref, uint wrap, vec2 uv, vec4 fallback)\n{\n    if(ref == 0xFFFFFFFFu) return fallback;\n    uint source = (ref >> 30) & 3u;\n    uint bucket = (ref >> 23) & 0x7Fu;\n    uint idx    = ref & 0x007FFFFFu;\n    if(source == 2u)\n    {\n        switch(idx)\n        {\n            case 0u: return anisoSample2DSep(materialDyn_tex[0], materialDyn_smp, uv);\n            case 1u: return anisoSample2DSep(materialDyn_tex[1], materialDyn_smp, uv);\n            case 2u: return anisoSample2DSep(materialDyn_tex[2], materialDyn_smp, uv);\n            case 3u: return anisoSample2DSep(materialDyn_tex[3], materialDyn_smp, uv);\n            case 4u: return anisoSample2DSep(materialDyn_tex[4], materialDyn_smp, uv);\n            case 5u: return anisoSample2DSep(materialDyn_tex[5], materialDyn_smp, uv);\n            case 6u: return anisoSample2DSep(materialDyn_tex[6], materialDyn_smp, uv);\n            case 7u: return anisoSample2DSep(materialDyn_tex[7], materialDyn_smp, uv);\n        }\n        return fallback;\n    }\n    switch(bucket)\n    {\n        case 0u: return anisoSample2DArrayWrapped(materialArray_tex[0], materialArray_smp, vec3(uv, float(idx)), wrap);\n        case 1u: return anisoSample2DArrayWrapped(materialArray_tex[1], materialArray_smp, vec3(uv, float(idx)), wrap);\n        case 2u: return anisoSample2DArrayWrapped(materialArray_tex[2], materialArray_smp, vec3(uv, float(idx)), wrap);\n        case 3u: return anisoSample2DArrayWrapped(materialArray_tex[3], materialArray_smp, vec3(uv, float(idx)), wrap);\n        case 4u: return anisoSample2DArrayWrapped(materialArray_tex[4], materialArray_smp, vec3(uv, float(idx)), wrap);\n        case 5u: return anisoSample2DArrayWrapped(materialArray_tex[5], materialArray_smp, vec3(uv, float(idx)), wrap);\n        case 6u: return anisoSample2DArrayWrapped(materialArray_tex[6], materialArray_smp, vec3(uv, float(idx)), wrap);\n        case 7u: return anisoSample2DArrayWrapped(materialArray_tex[7], materialArray_smp, vec3(uv, float(idx)), wrap);\n    }\n    return fallback;\n}\n\nvec4 sample_slot_bc(uint ref, uint wrap, vec2 uv, vec4 fallback)\n{\n    return sample_material_slot(ref, wrap, uv, fallback);\n}\n\n\nvec4 sample_slot_mr(uint ref, uint wrap, vec2 uv, vec4 fallback)\n{\n    return sample_material_slot(ref, wrap, uv, fallback);\n}\n\n\nvec4 sample_slot_nrm(uint ref, uint wrap, vec2 uv, vec4 fallback)\n{\n    return sample_material_slot(ref, wrap, uv, fallback);\n}\n\n\nvec4 sample_slot_em(uint ref, uint wrap, vec2 uv, vec4 fallback)\n{\n    return sample_material_slot(ref, wrap, uv, fallback);\n}\n\n\n// Separate glTF occlusionTexture (single-channel data, R = occlusion).\n// Sampled only when feature_mask carries `has_separate_occlusion`;\n// otherwise the main path falls back to MR.r per the common packed-MR\n// convention. fallback = 1 → identity (no occlusion).\nvec4 sample_slot_occ(uint ref, uint wrap, vec2 uv, vec4 fallback)\n{\n    return sample_material_slot(ref, wrap, uv, fallback);\n}\n\n\n// glTF feature_mask bits — must mirror SceneGPUState.hpp's\n// material_feature namespace.\nconst uint kFeat_alpha_mask           = 1u << 16u;\nconst uint kFeat_alpha_blend          = 1u << 17u;\nconst uint kFeat_double_sided         = 1u << 18u;\nconst uint kFeat_has_separate_occ     = 1u << 19u;\n// Per-channel texcoord_set bits (20-29). 2 bits per channel, value\n// 0 = TEXCOORD_0, value 1 = TEXCOORD_1. Out-of-range values collapse\n// to TEXCOORD_0 (the shift-mask in packMaterial clamps to 0/1).\nconst uint kFeat_tcset_bc_shift       = 20u;\nconst uint kFeat_tcset_mr_shift       = 22u;\nconst uint kFeat_tcset_nrm_shift      = 24u;\nconst uint kFeat_tcset_em_shift       = 26u;\nconst uint kFeat_tcset_occ_shift      = 28u;\n\nvec2 pick_uv(uint feature_mask, uint shift, vec2 uv0, vec2 uv1)\n{\n    return ((feature_mask >> shift) & 0x3u) == 1u ? uv1 : uv0;\n}\n\n// KHR_texture_transform helper: glTF defines the transform in UV space\n// as `uv' = R(rotation) * S(scale) * uv + offset`, with rotation\n// applied AFTER scale and BEFORE the offset shift. Identity defaults\n// (offset=0, scale=1, rotation=0) pass through unchanged.\nvec2 apply_uv_xform(vec2 uv, vec4 offset_scale, float rotation)\n{\n    vec2 scaled = uv * offset_scale.zw;\n    float c = cos(rotation), s = sin(rotation);\n    vec2 rotated = vec2(c * scaled.x - s * scaled.y,\n                        s * scaled.x + c * scaled.y);\n    return rotated + offset_scale.xy;\n}\n\n// Shader-level alpha-to-coverage. QRhi (6.12) doesn't expose\n// AlphaToCoverage on QRhiGraphicsPipeline, so we replicate the\n// behaviour at the shader level: gl_SampleMask[0] is a writable\n// per-fragment built-in where each bit selects whether the\n// corresponding MSAA sample is written. Convert alpha to a sample\n// count, set that many bits, screen-space-rotate per pixel so the\n// MSAA resolve smooths the silhouette into a soft edge.\n//\n// Sample count comes from MSAA_SAMPLES, an integer auto-injected by\n// libisf into the renderer UBO at binding=0 — score writes the active\n// RenderList's sample count there each frame. (We can't use\n// gl_NumSamples: glslang strips it when targeting SPIR-V.) Score lets\n// users pick any of {1, 2, 4, 8, 16}. With MSAA off, MSAA_SAMPLES=1\n// and we degrade to a 0.5 binary cutoff. Vulkan caps multisample\n// rasterization at 16x in practice; clamp there so the rotation math\n// stays defined for 32-bit uints.\n//\n// Returns false when the fragment is fully transparent → caller\n// discards (early-out skips the rest of main()).\nbool applyAlphaToCoverage(float alpha)\n{\n    if(alpha <= 0.0)\n        return false;\n\n    int samples = clamp(MSAA_SAMPLES, 1, 16);\n    uint full = (samples >= 32) ? 0xFFFFFFFFu\n                                : ((1u << uint(samples)) - 1u);\n\n    if(alpha >= 1.0)\n    {\n        gl_SampleMask[0] = int(full);\n        return true;\n    }\n    int n = int(round(alpha * float(samples)));\n    if(n <= 0)\n        return false;\n    if(n >= samples)\n    {\n        gl_SampleMask[0] = int(full);\n        return true;\n    }\n\n    // MSAA sample counts are powers of two, so (S-1) is a valid mask.\n    // shift lands in [0, S-1]; rotation handles shift==0 cleanly\n    // because base >> S is well-defined for S<=16 (< 32 bits).\n    uint S = uint(samples);\n    uint hash = uint(gl_FragCoord.x) * 1597u\n              + uint(gl_FragCoord.y) * 2731u;\n    uint shift = hash & (S - 1u);\n    uint base  = (1u << uint(n)) - 1u;\n    uint rot   = ((base << shift) | (base >> (S - shift))) & full;\n    gl_SampleMask[0] = int(rot);\n    return true;\n}\n\n// Map gl_FragCoord + view-space Z to a froxel index. Same log-spaced Z\n// slicing build_cluster_aabbs.csf uses, same (z*Y + y)*X + x flattening\n// volumetric_integrate.csf writes — keep these three formulas in sync\n// or sampling lands in the wrong cell.\nuint scoreClusterId(vec2 fragCoord, float viewZ)\n{\n    vec2 uv = fragCoord / camera.renderSize.xy;\n    uint gx = cluster_config.cluster_x;\n    uint gy = cluster_config.cluster_y;\n    uint gz = cluster_config.cluster_z;\n\n    uint tx = uint(clamp(floor(uv.x * float(gx)), 0.0, float(gx) - 1.0));\n    uint ty = uint(clamp(floor(uv.y * float(gy)), 0.0, float(gy) - 1.0));\n\n    float zNear = camera.params.y;\n    float zFar  = camera.params.z;\n    float depth = max(-viewZ, zNear);\n    float t = float(gz) * log(depth / zNear) / log(zFar / zNear);\n    uint tz = uint(clamp(t, 0.0, float(gz) - 1.0));\n\n    return (tz * gy + ty) * gx + tx;\n}\n\n// Inline volumetric fog composite — see classic_pbr_openpbr.frag for\n// the full rationale. Two production-grade refinements vs the naive\n// nearest-cell lookup:\n//   1. Trilinear interpolation across the 8 surrounding froxels —\n//      hides the cluster grid (16x9x24 default) which otherwise\n//      shows up as a hard checkerboard at cell boundaries.\n//   2. volumetric_intensity blends toward identity rather than just\n//      scaling accum, so low intensity == \"less fog\" rather than\n//      \"no source + tiny in-scatter\".\n// Identity fallback when the toggle is off or cluster_x == 0u.\nvec3 applyVolumetric(vec3 inColor, vec2 fragCoord, float viewZ)\n{\n    if(volumetric_enabled == 0)\n        return inColor;\n\n    uint gx = cluster_config.cluster_x;\n    uint gy = cluster_config.cluster_y;\n    uint gz = cluster_config.cluster_z;\n    if(gx == 0u || gy == 0u || gz == 0u)\n        return inColor;\n\n    vec2  uv = fragCoord / camera.renderSize.xy;\n    float zNear = camera.params.y;\n    float zFar  = camera.params.z;\n    float depth = max(-viewZ, zNear);\n    float fx = uv.x * float(gx) - 0.5;\n    float fy = uv.y * float(gy) - 0.5;\n    float fz = float(gz) * log(depth / zNear) / log(zFar / zNear) - 0.5;\n\n    vec3 cf = clamp(vec3(fx, fy, fz), vec3(0.0),\n                    vec3(float(gx) - 1.0001,\n                         float(gy) - 1.0001,\n                         float(gz) - 1.0001));\n    vec3 cb = floor(cf);\n    vec3 t  = cf - cb;\n    uvec3 i0 = uvec3(cb);\n    uvec3 i1 = min(i0 + 1u, uvec3(gx - 1u, gy - 1u, gz - 1u));\n\n    #define IDX(ix, iy, iz) (((iz) * gy + (iy)) * gx + (ix))\n    vec4 c000 = vol_integrated.data[IDX(i0.x, i0.y, i0.z)].accum_transmittance;\n    vec4 c100 = vol_integrated.data[IDX(i1.x, i0.y, i0.z)].accum_transmittance;\n    vec4 c010 = vol_integrated.data[IDX(i0.x, i1.y, i0.z)].accum_transmittance;\n    vec4 c110 = vol_integrated.data[IDX(i1.x, i1.y, i0.z)].accum_transmittance;\n    vec4 c001 = vol_integrated.data[IDX(i0.x, i0.y, i1.z)].accum_transmittance;\n    vec4 c101 = vol_integrated.data[IDX(i1.x, i0.y, i1.z)].accum_transmittance;\n    vec4 c011 = vol_integrated.data[IDX(i0.x, i1.y, i1.z)].accum_transmittance;\n    vec4 c111 = vol_integrated.data[IDX(i1.x, i1.y, i1.z)].accum_transmittance;\n    #undef IDX\n\n    vec4 v = mix(mix(mix(c000, c100, t.x), mix(c010, c110, t.x), t.y),\n                 mix(mix(c001, c101, t.x), mix(c011, c111, t.x), t.y),\n                 t.z);\n\n    float transm = clamp(v.a, 0.0, 1.0);\n    vec3  accum  = v.rgb;\n\n    float k       = volumetric_intensity;\n    float k_blend = clamp(k, 0.0, 1.0);\n    float transm_eff = mix(1.0, transm, k_blend);\n    vec3  accum_eff  = accum * k;\n\n    return inColor * transm_eff + accum_eff;\n}\n\nvoid main()\n{\n    // Default coverage: keep every MSAA sample. Once applyAlphaToCoverage\n    // exists in the module, the SPIR-V output declares gl_SampleMask, and\n    // any path that doesn't assign it leaves the value undefined — most\n    // drivers default that to 0 and cull every sample, producing block-\n    // speckle artifacts on non-alpha-mask materials. Seeding to all-ones\n    // here makes the non-A2C paths render correctly; the A2C branch\n    // overrides this for masked fragments.\n    gl_SampleMask[0] = -1;\n\n    PerDraw pd = per_draws.data[v_drawID];\n    Material mat = scene_materials.entries[pd.material_index];\n    MatUVXform mx = scene_material_uv_xforms.entries[pd.material_index];\n    g_matWrap = scene_material_wrap.entries[pd.material_index].xyz;\n\n    // glTF doubleSided: pipeline-side culling is OFF (cull_mode=none\n    // in the MDI batch) so we get both faces. For SINGLE-sided materials\n    // we discard back-facing fragments here to mimic CULL_BACK. For\n    // DOUBLE-sided materials we keep the fragment and flip the normal\n    // below so lighting on the back side works correctly.\n    bool is_double_sided = (mat.feature_mask & kFeat_double_sided) != 0u;\n    if(!is_double_sided && !gl_FrontFacing)\n        discard;\n\n    // Pick the per-channel texcoord source (TEXCOORD_0 vs TEXCOORD_1)\n    // before applying the KHR_texture_transform. glTF allows each\n    // texture_info to override its texcoord_set independently — BC\n    // might use TEXCOORD_0 while Emissive uses TEXCOORD_1, etc.\n    vec2 base_uv_bc  = pick_uv(mat.feature_mask, kFeat_tcset_bc_shift,  v_uv, v_uv1);\n    vec2 base_uv_mr  = pick_uv(mat.feature_mask, kFeat_tcset_mr_shift,  v_uv, v_uv1);\n    vec2 base_uv_nrm = pick_uv(mat.feature_mask, kFeat_tcset_nrm_shift, v_uv, v_uv1);\n    vec2 base_uv_em  = pick_uv(mat.feature_mask, kFeat_tcset_em_shift,  v_uv, v_uv1);\n    vec2 base_uv_occ = pick_uv(mat.feature_mask, kFeat_tcset_occ_shift, v_uv, v_uv1);\n\n    // Per-channel UVs after KHR_texture_transform.\n    vec2 uv_bc  = apply_uv_xform(base_uv_bc,  mx.bc_offset_scale,     mx.rotations0.x);\n    vec2 uv_mr  = apply_uv_xform(base_uv_mr,  mx.mr_offset_scale,     mx.rotations0.y);\n    vec2 uv_nrm = apply_uv_xform(base_uv_nrm, mx.normal_offset_scale, mx.rotations0.z);\n    vec2 uv_em  = apply_uv_xform(base_uv_em,  mx.em_offset_scale,     mx.rotations0.w);\n    vec2 uv_occ = apply_uv_xform(base_uv_occ, mx.occ_offset_scale,    mx.rotations1.x);\n\n    // Pre-pull env knobs so the early-out (unlit) and main path both\n    // see the same values. Defaults come from EnvironmentLoader if the\n    // user wired one; otherwise the merged scene_environment carries\n    // safe identity-ish values (ambient=0, exposure=1, gamma=2.2,\n    // fog disabled).\n    vec3  ambient_col   = env.ambient.rgb * env.ambient.w;\n    float exposure_mul  = max(env.exposure_gamma.x, 1e-6);\n    float gamma         = max(env.exposure_gamma.y, 1e-3);\n\n    // ─── Base color ────────────────────────────────────────────────────\n    // glTF: final base = baseColorFactor × baseColorTexture × COLOR_0\n    // (vertex color). v_color defaults to white when the mesh doesn't\n    // have COLOR_0 (slab uploader fills with vec4(1) in that case).\n    vec4 bc = sample_slot_bc(mat.textureRefs.x, matWrap(0u), uv_bc, vec4(1.0));\n\n    // Alpha-mask edge-bleed compensation. Source PNGs for foliage / hair\n    // / fence-style cutouts have alpha=0 in transparent regions with\n    // RGB=0 there too (standard authoring). Mip / aniso filtering\n    // averages RGB and alpha independently — near a leaf edge the\n    // sampled RGB ends up `leaf_color × alpha_avg`, so post-alpha-test\n    // surviving fragments read a darkened RGB and the silhouette gets a\n    // black halo. Dividing RGB by alpha inverts the alpha-weighted\n    // averaging and recovers the source colour. Skip when alpha is near\n    // zero (would discard anyway) and when the material isn't\n    // alpha-masked (BLEND / OPAQUE both want the literal sampled RGB).\n    if((mat.feature_mask & kFeat_alpha_mask) != 0u && bc.a > 1e-3)\n        bc.rgb /= bc.a;\n\n    // Per-instance broadcast colour rides through `v_inst_color` from\n    // the vertex stage. For non-instanced draws the REQUIRED:false\n    // fallback fires identity (1,1,1,1) so the modulation collapses\n    // to the per-vertex × material × baseColor product.\n    vec3 base = mat.baseColor.rgb * bc.rgb * v_color.rgb * v_inst_color.rgb;\n    float alpha = mat.baseColor.a * bc.a * v_color.a * v_inst_color.a;\n\n    // glTF alphaMode=MASK — early discard before any expensive work.\n    // Two paths:\n    //   alpha_a2c_enabled = 1 → shader-level alpha-to-coverage via\n    //                            gl_SampleMask. Best edge quality when\n    //                            MSAA is on; degrades gracefully to a\n    //                            hard cutoff when MSAA is off (round\n    //                            saturates to 0 / 8).\n    //   default               → classic binary cutoff.\n    if((mat.feature_mask & kFeat_alpha_mask) != 0u)\n    {\n        if(alpha_a2c_enabled != 0)\n        {\n            if(!applyAlphaToCoverage(alpha))\n                discard;\n        }\n        else\n        {\n            if(alpha < mat.alpha_cutoff)\n                discard;\n        }\n    }\n\n    // ─── Metal-Rough-Occlusion (glTF packing: R=occ, G=rough, B=metal) ─\n    vec4 mr = sample_slot_mr(mat.textureRefs.y, matWrap(1u), uv_mr, vec4(1.0, 1.0, 1.0, 1.0));\n    float metallic\n        = mat.metallicRoughnessOcclusionUnlit.x * mr.b;\n    float roughness\n        = clamp(mat.metallicRoughnessOcclusionUnlit.y * mr.g, 0.04, 1.0);\n    // Occlusion: prefer separate occlusionTexture when set; else fall\n    // back to MR.r (the common packed-MR convention).\n    float occ_sample;\n    if((mat.feature_mask & kFeat_has_separate_occ) != 0u)\n        occ_sample = sample_slot_occ(mat.occlusion_textureRef, matWrap(4u), uv_occ, vec4(1.0)).r;\n    else\n        occ_sample = mr.r;\n    float occlusion = occ_sample * mat.metallicRoughnessOcclusionUnlit.z;\n    float unlit     = mat.metallicRoughnessOcclusionUnlit.w;\n\n    // ─── Emissive ─────────────────────────────────────────────────────\n    vec4 em = sample_slot_em(mat.textureRefs.w, matWrap(3u), uv_em, vec4(1.0));\n    vec3 emissive\n        = mat.emissive_strength.xyz * em.rgb * mat.emissive_strength.w;\n    emissive += v_inst_emissive.rgb;\n\n    if(unlit > 0.5)\n    {\n        // Volumetric composite BEFORE exposure_mul — accum is in raw\n        // light units (same scale as the BSDF result), so both sides\n        // of `inColor * transm + accum` stay in matched units.\n        // Output is linear HDR — the downstream tonemap owns the\n        // HDR→display compression and sRGB encode. (Doing pow(_,1/gamma)\n        // here would clip everything > 1 post-exposure to flat white\n        // before the tonemap could read the HDR signal — that's what\n        // made volumetric in-scatter blow out to saturated pink.)\n        vec3 color = base + emissive;\n        float viewZ_unlit = (camera.view * vec4(v_worldPos, 1.0)).z;\n        color = applyVolumetric(color, gl_FragCoord.xy, viewZ_unlit);\n        color *= exposure_mul;\n        isf_FragColor = vec4(max(color, vec3(0.0)), (mat.feature_mask & (1u << 17u)) != 0u ? alpha : 1.0);\n        return;\n    }\n\n    // ─── Surface normal (tangent-space normal map if present) ─────────\n    vec3 N = normalize(v_normal);\n    // Double-sided: flip the surface normal for back-facing fragments\n    // so the BRDF evaluates with the correct hemisphere on both sides\n    // of the surface. (Single-sided materials never reach here for\n    // back faces — they were discarded above.)\n    if(is_double_sided && !gl_FrontFacing)\n        N = -N;\n    // Toksvig variance accumulator (Olano-Baker 2010). Captures the\n    // amount of normal-map variance lost to mip-level averaging /\n    // multi-tap anisotropic averaging — info the GPU's bilinear+mip\n    // filter normally throws away when shaders re-normalize sampled\n    // normals. Folded into the specular-AA block below alongside the\n    // screen-space (Tokuyoshi-Kaplanyan) variance.\n    float toksvig_sigma2 = 0.0;\n    uint normRef = mat.textureRefs.z;\n    if(normRef != 0xFFFFFFFFu && length(v_tangent.xyz) > 0.5)\n    {\n        vec3 T = normalize(v_tangent.xyz);\n        vec3 B = normalize(cross(N, T) * v_tangent.w);\n        mat3 TBN = mat3(T, B, N);\n        // Normal map sampling goes through the bucket ladder so\n        // mixed-resolution / compressed normal atlases work. The\n        // default (0.5,0.5,1.0) fallback decodes to a zero tangent-\n        // space delta — same as no normal map at all — if the bucket\n        // slot isn't populated.\n        //\n        // Keep the UN-NORMALIZED sample so its length can drive the\n        // Toksvig boost: anisoSample averages multiple weighted taps\n        // and mip filtering averages within texels, both of which\n        // shorten |n| when sub-pixel normals had directional spread.\n        // (1 - |n|²) is the \"lost variance\" added back as roughness.\n        vec3 nm_raw = sample_slot_nrm(normRef, matWrap(2u), uv_nrm,\n                                      vec4(0.5, 0.5, 1.0, 1.0)).xyz\n                      * 2.0 - 1.0;\n        toksvig_sigma2 = max(0.0, 1.0 - dot(nm_raw, nm_raw));\n        N = normalize(TBN * normalize(nm_raw));\n    }\n\n    vec3 V = normalize(camera.cameraPosition.xyz - v_worldPos);\n    float NdotV = max(dot(N, V), 1e-4);\n\n    // Metallic workflow.\n    vec3 F0 = mix(vec3(0.04), base, metallic);\n    vec3 kd = (1.0 - metallic) * base;\n\n    // Cheap environment term — same \"fake IBL\" as classic_pbr_textured;\n    // classic_pbr_ibl is the cubemap-sampled variant.\n    vec3 Fv = F0 + (1.0 - F0) * pow(1.0 - NdotV, 5.0);\n    vec3 fake_env = Fv * base * 0.25;\n\n    // Ambient comes from EnvironmentLoader (env.ambient.rgb × intensity\n    // in .w). When the user hasn't wired one, ambient_col is zero and\n    // the fake_env term + lights carry the lighting. The 0.04 floor is\n    // gone — letting users actually dial ambient down to black.\n    vec3 result = ambient_col * base * occlusion\n                  + emissive\n                  + fake_env * occlusion;\n\n    float alpha_g = max(roughness * roughness, 1e-4);\n    float alpha2 = alpha_g * alpha_g;\n    float k = (roughness + 1.0) * (roughness + 1.0) / 8.0;\n\n    // ─── Specular antialiasing — Tokuyoshi-Kaplanyan + Toksvig ───────\n    //\n    // Three variance sources combined into a single roughness boost:\n    //\n    //   (A) Tokuyoshi-Kaplanyan 2019, \"Improved Geometric Specular\n    //       Antialiasing\" — screen-space derivatives of the world-\n    //       space normal. Captures sub-pixel-footprint normal\n    //       variance from geometry, normal-map silhouettes, and\n    //       interpolation across neighbours.\n    //\n    //   (B) Toksvig 2005, \"Mipmapping Normal Maps\" — texture-space\n    //       variance from filtered-normal shortening. Captures\n    //       variance lost to mip averaging + our multi-tap\n    //       anisotropic sampler that the GPU's linear filter and\n    //       shader's normalize() throw away.\n    //\n    //   (C) Grazing-angle amplification — a heuristic 1/NdotV scale\n    //       (capped) on the screen-space variance, approximating\n    //       Tokuyoshi-Kaplanyan's anisotropic Jacobian projection of\n    //       normal variance onto the half-vector tangent plane. The\n    //       full anisotropic form derives this matrix-multiply\n    //       explicitly; the 1/NdotV scalar captures the leading-\n    //       order behaviour at grazing where the BRDF stretches\n    //       most. Targets the \"noisy floor at grazing light\"\n    //       failure mode: at grazing, the half-vector becomes\n    //       perpendicular to the surface, NdotH gets small, and the\n    //       GGX D term's denominator hyperbola makes small N\n    //       variations move the highlight in/out of pixels.\n    //\n    // (A)+(B) cover variance from BOTH variance domains — the\n    // screen-space and texture-space sources are independent and\n    // additive. (C) amplifies (A) where the BRDF Jacobian demands it.\n    vec3 dNdx = dFdx(N);\n    vec3 dNdy = dFdy(N);\n    float kernelRoughness2 = 2.0 * (dot(dNdx, dNdx) + dot(dNdy, dNdy));\n\n    // (C) grazing amplification. NdotV floor of 0.05 prevents\n    // runaway at near-tangent view; cap at 8× keeps the boost\n    // bounded so we don't blow specular into pure diffuse.\n    float grazing_aa = clamp(1.0 / max(NdotV, 0.05), 1.0, 8.0);\n    kernelRoughness2 *= grazing_aa;\n\n    // Combine (A)·grazing + (B). Cap to keep alpha² in [0, 1] after\n    // the boost; 0.5 is the standard upper bound used by Filament +\n    // the Tokuyoshi-Kaplanyan reference.\n    const float specAaSigma2Max = 0.5;\n    float total_aa_sigma2 = clamp(kernelRoughness2 + toksvig_sigma2,\n                                  0.0, specAaSigma2Max);\n    alpha2 = clamp(alpha2 + total_aa_sigma2, 0.0, 1.0);\n    alpha_g = sqrt(alpha2);\n    // Re-derive Schlick-Smith k from the filtered roughness too so the\n    // G term widens in lockstep with D — otherwise rough-but-filtered\n    // surfaces still get an over-tight visibility term.\n    float roughness_f = sqrt(alpha_g);\n    k = (roughness_f + 1.0) * (roughness_f + 1.0) / 8.0;\n\n    uint n = scene_counts.light_count;\n    for(uint i = 0u; i < n; ++i)\n    {\n        uint slot = scene_light_indices.data[i];\n        Light L = scene_lights.entries[slot];\n\n        // Two paths for resolving the light's world-space placement:\n        //\n        //   transform_slot == 0xFFFFFFFF (sentinel):\n        //     The light was authored procedurally (e.g. by a compute CSF\n        //     reading a point cloud or particle system) and carries its\n        //     world position inline in local_direction.xyz. Skip the\n        //     world_transforms lookup — there's no matching scene-node\n        //     entry. Only point lights (type == 1) are well-defined\n        //     under this convention; directional with sentinel falls\n        //     back to treating .xyz as a direction, spot is unsupported.\n        //\n        //   transform_slot != sentinel:\n        //     Classic scene-node-attached light. World direction and\n        //     position come from the node's accumulated world transform\n        //     (published by ScenePreprocessor's FlattenVisitor).\n        float _type_f = L.local_direction.w;\n        vec3 ld_world;\n        vec3 lp_world;\n        if(L.transform_slot == 0xFFFFFFFFu)\n        {\n            if(_type_f < 0.5)\n            {\n                // Directional: .xyz is the world direction (same\n                // convention the scene-node path uses — no transform to\n                // apply since the light isn't parented to any node).\n                ld_world = normalize(L.local_direction.xyz);\n                lp_world = vec3(0.0);\n            }\n            else\n            {\n                // Point: .xyz is the world position. A default direction\n                // lets spot-cone code below degenerate gracefully for\n                // spot lights authored this way (cone attenuation will\n                // be effectively wide-open, since we have no real axis).\n                lp_world = L.local_direction.xyz;\n                ld_world = vec3(0.0, -1.0, 0.0);\n            }\n        }\n        else\n        {\n            mat4 W = world_transforms.data[L.transform_slot];\n            ld_world = normalize(mat3(W) * L.local_direction.xyz);\n            lp_world = W[3].xyz;\n        }\n        // Reconstruct the old LightGPU-shape vec4s so the BRDF body\n        // below (which references pos_type / color_i / dir_r) stays\n        // unchanged. type enum stays in .w; for directional lights the\n        // xyz holds the world direction, for point/spot it holds the\n        // world position — matching the prior packLight convention.\n        vec4 pos_type = vec4(\n            (_type_f < 0.5) ? ld_world : lp_world,\n            _type_f);\n        vec4 color_i  = L.color;\n        vec4 dir_r    = vec4(ld_world, L.range_cone.x);\n\n        vec3 Ldir;\n        float atten = 1.0;\n        if(pos_type.w < 0.5)\n        {\n            // Directional: no distance, no decay — per glTF / OpenPBR\n            // convention the 1/d² term doesn't apply.\n            Ldir = normalize(-pos_type.xyz);\n        }\n        else\n        {\n            vec3 toL = pos_type.xyz - v_worldPos;\n            float d = length(toL);\n            Ldir = toL / max(d, 1e-5);\n\n            // Hard cutoff: range == 0 is the \"no cutoff\" sentinel (glTF\n            // + ossia convention). Otherwise linearly fade over the\n            // last interval so the light doesn't pop off at exactly the\n            // range boundary.\n            if(dir_r.w > 0.0) atten = max(0.0, 1.0 - d / dir_r.w);\n\n            // Distance decay — switches on L.decay_mode so linear / none /\n            // cubic authored by the user or extracted from FBX actually\n            // reach the shader instead of being silently collapsed to\n            // the quadratic curve. Modes:\n            //   0 = none       (constant — legitimate for area lights\n            //                   and stylised looks)\n            //   1 = linear     1 / (1 + d)\n            //   2 = quadratic  1 / (1 + d²)   — physically correct default\n            //   3 = cubic      1 / (1 + d³)   — exaggerated falloff\n            uint decay = L.decay_mode;\n            if(decay == 1u)\n                atten *= 1.0 / (1.0 + d);\n            else if(decay == 2u)\n                atten *= 1.0 / (1.0 + d * d);\n            else if(decay == 3u)\n                atten *= 1.0 / (1.0 + d * d * d);\n            // decay == 0u → no distance attenuation; `atten` keeps the\n            // range cutoff contribution only.\n\n            // Spot-cone attenuation. Inner / outer cones are stored as\n            // cosines (packed CPU-side in Light.cpp) so the fragment-side\n            // test is one dot product + a linear ramp, matching the glTF\n            // KHR_lights_punctual reference formula:\n            //   t = clamp((cos_angle - outer) / (inner - outer), 0, 1)\n            //   atten *= t\n            // Outside the outer cone → t = 0, light doesn't contribute.\n            // Inside the inner cone → t = 1, full spot intensity.\n            // Between → linear falloff. type ≈ 2 = spot (local_direction.w\n            // packs the enum; see RawLightData::local_direction in\n            // SceneGPUState.hpp). Point lights (type ≈ 1) skip this\n            // block, so the spot-specific math doesn't perturb them.\n            if(pos_type.w > 1.5 && pos_type.w < 2.5)\n            {\n                float cos_to_frag = dot(-Ldir, normalize(dir_r.xyz));\n                float inner_cos   = L.range_cone.y;\n                float outer_cos   = L.range_cone.z;\n                atten *= clamp(\n                    (cos_to_frag - outer_cos)\n                        / max(inner_cos - outer_cos, 1e-5),\n                    0.0, 1.0);\n            }\n        }\n\n        float NdotL = max(dot(N, Ldir), 0.0);\n        if(NdotL <= 0.0) continue;\n\n        vec3 H = normalize(Ldir + V);\n        float NdotH = max(dot(N, H), 0.0);\n        float VdotH = max(dot(V, H), 0.0);\n\n        float denom_d = NdotH * NdotH * (alpha2 - 1.0) + 1.0;\n        float D = alpha2 / (3.14159 * denom_d * denom_d);\n\n        float G_v = NdotV / (NdotV * (1.0 - k) + k);\n        float G_l = NdotL / (NdotL * (1.0 - k) + k);\n        float G = G_v * G_l;\n\n        vec3 F = F0 + (1.0 - F0) * pow(1.0 - VdotH, 5.0);\n\n        vec3 spec = (D * G * F) / max(4.0 * NdotV * NdotL, 1e-4);\n        vec3 diffuse_term = (vec3(1.0) - F) * kd / 3.14159;\n\n        vec3 lightCol = color_i.rgb * color_i.w;\n        result += atten * lightCol * NdotL * (diffuse_term + spec);\n    }\n\n    // Linear fog: blend with fog_color over [start, end]. fog_range.w\n    // is the enabled flag (set by EnvironmentLoader). When disabled\n    // we skip the work.\n    if(env.fog_range.w > 0.5)\n    {\n        float view_z = distance(camera.cameraPosition.xyz, v_worldPos);\n        float f_s = env.fog_range.x;\n        float f_e = max(env.fog_range.y, f_s + 1e-3);\n        float t = clamp((view_z - f_s) / (f_e - f_s), 0.0, 1.0);\n        result = mix(result, env.fog_color_density.rgb, t);\n    }\n\n    // Volumetric composite BEFORE exposure_mul. accum from the integrate\n    // pass is in raw light units (same scale as the BSDF result), so\n    // both sides of `inColor * transm + accum` stay in matched units —\n    // applying after exposure makes accum dominate dim surfaces and\n    // lose to bright/specular surfaces, which was the original\n    // \"foliage punches through fog\" symptom.\n    //\n    // view_z above is `distance(eye, worldPos)` (positive); applyVolumetric /\n    // scoreClusterId need view-space Z (negative). Recompute from\n    // camera.view to keep the cluster lookup consistent with\n    // build_cluster_aabbs / volumetric_integrate.\n    float viewZ = (camera.view * vec4(v_worldPos, 1.0)).z;\n    result = applyVolumetric(result, gl_FragCoord.xy, viewZ);\n\n    result *= exposure_mul;\n\n    // Output is LINEAR HDR. The downstream tonemap node owns the\n    // HDR→display compression (ACES / Reinhard / filmic / etc.) and\n    // the sRGB encode. The previous `pow(result, 1/gamma)` here was\n    // sRGB-encoding the HDR before the tonemap could read it: any\n    // radiance > 1.0 post-exposure clipped to flat white at gamma\n    // encode, which is what made volumetric in-scatter blow out to\n    // saturated pink.\n    isf_FragColor = vec4(max(result, vec3(0.0)), (mat.feature_mask & (1u << 17u)) != 0u ? alpha : 1.0);\n}\n","Inlets":[{"uuid":"f2ab26ea-415d-45a2-bfbc-2968c7c92a33","ObjectName":"Inlet","id":1000,"Hidden":false,"Custom":"Geometry In","Exposed":"geometry in"},{"uuid":"485680cc-b8b9-4a01-acc7-3e8334bdc016","ObjectName":"Inlet","id":0,"Hidden":true,"Custom":"Mode","Exposed":"mode","Value":{"Int":0},"Init":{"Int":0},"Domain":{"Int":{"Values":[0,1,2,3]}},"Values":[["Triangles",{"Int":0}],["Points",{"Int":1}],["Lines",{"Int":2}],["Geometry",{"Int":3}]],"FolderPort":"","FileExtensions":""},{"uuid":"fb27e4cb-ea7f-41e2-ad92-2354498c1b6b","ObjectName":"Inlet","id":1,"Hidden":true,"Custom":"EnableBlend","Exposed":"enableblend","Value":{"Bool":false},"Init":{"Bool":false},"Domain":{"Bool":null}},{"uuid":"485680cc-b8b9-4a01-acc7-3e8334bdc016","ObjectName":"Inlet","id":2,"Hidden":true,"Custom":"SrcColor","Exposed":"srccolor","Value":{"Int":6},"Init":{"Int":6},"Domain":{"Int":{"Values":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]}},"Values":[["Zero",{"Int":0}],["One",{"Int":1}],["SrcColor",{"Int":2}],["OneMinusSrcColor",{"Int":3}],["DstColor",{"Int":4}],["OneMinusDstColor",{"Int":5}],["SrcAlpha",{"Int":6}],["OneMinusSrcAlpha",{"Int":7}],["DstAlpha",{"Int":8}],["OneMinusDstAlpha",{"Int":9}],["ConstantColor",{"Int":10}],["OneMinusConstantColor",{"Int":11}],["ConstantAlpha",{"Int":12}],["OneMinusConstantAlpha",{"Int":13}],["SrcAlphaSaturate",{"Int":14}]],"FolderPort":"","FileExtensions":""},{"uuid":"485680cc-b8b9-4a01-acc7-3e8334bdc016","ObjectName":"Inlet","id":3,"Hidden":true,"Custom":"DstColor","Exposed":"dstcolor","Value":{"Int":7},"Init":{"Int":7},"Domain":{"Int":{"Values":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]}},"Values":[["Zero",{"Int":0}],["One",{"Int":1}],["SrcColor",{"Int":2}],["OneMinusSrcColor",{"Int":3}],["DstColor",{"Int":4}],["OneMinusDstColor",{"Int":5}],["SrcAlpha",{"Int":6}],["OneMinusSrcAlpha",{"Int":7}],["DstAlpha",{"Int":8}],["OneMinusDstAlpha",{"Int":9}],["ConstantColor",{"Int":10}],["OneMinusConstantColor",{"Int":11}],["ConstantAlpha",{"Int":12}],["OneMinusConstantAlpha",{"Int":13}],["SrcAlphaSaturate",{"Int":14}]],"FolderPort":"","FileExtensions":""},{"uuid":"485680cc-b8b9-4a01-acc7-3e8334bdc016","ObjectName":"Inlet","id":4,"Hidden":true,"Custom":"OpColor","Exposed":"opcolor","Value":{"Int":0},"Init":{"Int":0},"Domain":{"Int":{"Values":[0,1,2,3,4]}},"Values":[["Add",{"Int":0}],["Substract",{"Int":1}],["Reverse Substract",{"Int":2}],["Min",{"Int":3}],["Max",{"Int":4}]],"FolderPort":"","FileExtensions":""},{"uuid":"485680cc-b8b9-4a01-acc7-3e8334bdc016","ObjectName":"Inlet","id":5,"Hidden":true,"Custom":"SrcAlpha","Exposed":"srcalpha","Value":{"Int":1},"Init":{"Int":1},"Domain":{"Int":{"Values":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]}},"Values":[["Zero",{"Int":0}],["One",{"Int":1}],["SrcColor",{"Int":2}],["OneMinusSrcColor",{"Int":3}],["DstColor",{"Int":4}],["OneMinusDstColor",{"Int":5}],["SrcAlpha",{"Int":6}],["OneMinusSrcAlpha",{"Int":7}],["DstAlpha",{"Int":8}],["OneMinusDstAlpha",{"Int":9}],["ConstantColor",{"Int":10}],["OneMinusConstantColor",{"Int":11}],["ConstantAlpha",{"Int":12}],["OneMinusConstantAlpha",{"Int":13}],["SrcAlphaSaturate",{"Int":14}]],"FolderPort":"","FileExtensions":""},{"uuid":"485680cc-b8b9-4a01-acc7-3e8334bdc016","ObjectName":"Inlet","id":6,"Hidden":true,"Custom":"DstAlpha","Exposed":"dstalpha","Value":{"Int":7},"Init":{"Int":7},"Domain":{"Int":{"Values":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]}},"Values":[["Zero",{"Int":0}],["One",{"Int":1}],["SrcColor",{"Int":2}],["OneMinusSrcColor",{"Int":3}],["DstColor",{"Int":4}],["OneMinusDstColor",{"Int":5}],["SrcAlpha",{"Int":6}],["OneMinusSrcAlpha",{"Int":7}],["DstAlpha",{"Int":8}],["OneMinusDstAlpha",{"Int":9}],["ConstantColor",{"Int":10}],["OneMinusConstantColor",{"Int":11}],["ConstantAlpha",{"Int":12}],["OneMinusConstantAlpha",{"Int":13}],["SrcAlphaSaturate",{"Int":14}]],"FolderPort":"","FileExtensions":""},{"uuid":"485680cc-b8b9-4a01-acc7-3e8334bdc016","ObjectName":"Inlet","id":7,"Hidden":true,"Custom":"OpAlpha","Exposed":"opalpha","Value":{"Int":0},"Init":{"Int":0},"Domain":{"Int":{"Values":[0,1,2,3,4]}},"Values":[["Add",{"Int":0}],["Substract",{"Int":1}],["Reverse Substract",{"Int":2}],["Min",{"Int":3}],["Max",{"Int":4}]],"FolderPort":"","FileExtensions":""},{"uuid":"5ac86198-2d03-4830-9e41-a6d529922d29","ObjectName":"Inlet","id":8,"Hidden":false,"Custom":"camera","Exposed":"camera","Format":0,"FormatSet":false,"Filter":2,"AddressMode":1,"MipmapMode":0},{"uuid":"5ac86198-2d03-4830-9e41-a6d529922d29","ObjectName":"Inlet","id":9,"Hidden":false,"Custom":"scene_lights","Exposed":"scene_lights","Format":0,"FormatSet":false,"Filter":2,"AddressMode":1,"MipmapMode":0},{"uuid":"5ac86198-2d03-4830-9e41-a6d529922d29","ObjectName":"Inlet","id":10,"Hidden":false,"Custom":"scene_light_indices","Exposed":"scene_light_indices","Format":0,"FormatSet":false,"Filter":2,"AddressMode":1,"MipmapMode":0},{"uuid":"5ac86198-2d03-4830-9e41-a6d529922d29","ObjectName":"Inlet","id":11,"Hidden":false,"Custom":"world_transforms","Exposed":"world_transforms","Format":0,"FormatSet":false,"Filter":2,"AddressMode":1,"MipmapMode":0},{"uuid":"5ac86198-2d03-4830-9e41-a6d529922d29","ObjectName":"Inlet","id":12,"Hidden":false,"Custom":"scene_materials","Exposed":"scene_materials","Format":0,"FormatSet":false,"Filter":2,"AddressMode":1,"MipmapMode":0},{"uuid":"5ac86198-2d03-4830-9e41-a6d529922d29","ObjectName":"Inlet","id":13,"Hidden":false,"Custom":"scene_material_uv_xforms","Exposed":"scene_material_uv_xforms","Format":0,"FormatSet":false,"Filter":2,"AddressMode":1,"MipmapMode":0},{"uuid":"5ac86198-2d03-4830-9e41-a6d529922d29","ObjectName":"Inlet","id":14,"Hidden":false,"Custom":"per_draws","Exposed":"per_draws","Format":0,"FormatSet":false,"Filter":2,"AddressMode":1,"MipmapMode":0},{"uuid":"5ac86198-2d03-4830-9e41-a6d529922d29","ObjectName":"Inlet","id":15,"Hidden":false,"Custom":"indirect_draw_cmds","Exposed":"indirect_draw_cmds","Format":0,"FormatSet":false,"Filter":2,"AddressMode":1,"MipmapMode":0},{"uuid":"5ac86198-2d03-4830-9e41-a6d529922d29","ObjectName":"Inlet","id":16,"Hidden":false,"Custom":"scene_counts","Exposed":"scene_counts","Format":0,"FormatSet":false,"Filter":2,"AddressMode":1,"MipmapMode":0},{"uuid":"5ac86198-2d03-4830-9e41-a6d529922d29","ObjectName":"Inlet","id":17,"Hidden":false,"Custom":"env","Exposed":"env","Format":0,"FormatSet":false,"Filter":2,"AddressMode":1,"MipmapMode":0},{"uuid":"238399a0-7e81-47e3-896f-08e8856e2973","ObjectName":"Inlet","id":18,"Hidden":true,"Custom":"alpha_a2c_enabled","Exposed":"alpha_a2c_enabled","Value":{"Int":0},"Init":{"Int":0},"Domain":{"Int":{"Min":0,"Max":1}}},{"uuid":"238399a0-7e81-47e3-896f-08e8856e2973","ObjectName":"Inlet","id":19,"Hidden":true,"Custom":"volumetric_enabled","Exposed":"volumetric_enabled","Value":{"Int":0},"Init":{"Int":0},"Domain":{"Int":{"Min":0,"Max":1}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":20,"Hidden":true,"Custom":"volumetric_intensity","Exposed":"volumetric_intensity","Value":{"Float":1.0},"Init":{"Float":1.0},"Domain":{"Float":{"Min":0.0,"Max":4.0}}}],"Outlets":[{"uuid":"f1c71046-b754-49a5-8e66-d01374773dfc","ObjectName":"Outlet","id":1000,"Hidden":false,"Custom":"Texture Out","Exposed":"texture out"}]},{"uuid":"4c91b5e2-8d76-4ab3-9f14-6e0d8b3a2c57","ObjectName":"camera_avnd","id":7,"Metadata":{"ScriptingName":"Camera","Comment":"","Color":"Transparent1","Label":"","Touched":true},"Duration":11289600000,"Height":300.0,"StartOffset":0,"LoopDuration":11289600000,"Pos":[-31.25177331541427,-694.2057915834122],"Size":[274.0,177.0],"Loops":false,"FoldMode":0,"Inlets":[{"uuid":"377e8205-b442-4d54-8832-3761def522b2","ObjectName":"Inlet","id":0,"Hidden":true,"Custom":"Eye","Exposed":"eye","Value":{"Vec3f":[2.3159420490264893,1.4956295490264893,1.0667381286621094]},"Init":{"Vec3f":[1.0,1.0,1.0]},"Domain":{"Vec3f":{"Min":[-10000.0,-10000.0,-10000.0],"Max":[10000.0,10000.0,10000.0],"Values":[[],[],[]]}}},{"uuid":"377e8205-b442-4d54-8832-3761def522b2","ObjectName":"Inlet","id":1,"Hidden":true,"Custom":"Target","Exposed":"target","Value":{"Vec3f":[0.0,0.0,0.0]},"Init":{"Vec3f":[0.0,0.0,0.0]},"Domain":{"Vec3f":{"Min":[-10000.0,-10000.0,-10000.0],"Max":[10000.0,10000.0,10000.0],"Values":[[],[],[]]}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":2,"Hidden":true,"Custom":"FOV","Exposed":"fov","Value":{"Float":60.0},"Init":{"Float":60.0},"Domain":{"Float":{"Min":5.0,"Max":170.0}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":3,"Hidden":true,"Custom":"Near","Exposed":"near","Value":{"Float":0.10000000149011612},"Init":{"Float":0.10000000149011612},"Domain":{"Float":{"Min":0.0010000000474974513,"Max":10.0}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":4,"Hidden":true,"Custom":"Far","Exposed":"far","Value":{"Float":1000.0},"Init":{"Float":1000.0},"Domain":{"Float":{"Min":1.0,"Max":100000.0}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":5,"Hidden":true,"Custom":"Roll","Exposed":"roll","Value":{"Float":0.0},"Init":{"Float":0.0},"Domain":{"Float":{"Min":-180.0,"Max":180.0}}}],"Outlets":[{"uuid":"848061c5-e8a0-4a13-9985-e8df30ce6d4f","ObjectName":"Outlet","id":0,"Hidden":false,"Custom":"Scene","Exposed":"scene"}]},{"uuid":"9f3c1a5e-4b7d-4e2a-8c5f-1d6e0b9a3c7f","ObjectName":"light","id":8,"Metadata":{"ScriptingName":"Light","Comment":"","Color":"Transparent1","Label":"","Touched":true},"Duration":11289600000,"Height":300.0,"StartOffset":0,"LoopDuration":11289600000,"Pos":[-190.32309114868661,-475.86251797988984],"Size":[422.0,252.0],"Loops":false,"FoldMode":0,"Inlets":[{"uuid":"485680cc-b8b9-4a01-acc7-3e8334bdc016","ObjectName":"Inlet","id":0,"Hidden":true,"Custom":"Mode","Exposed":"mode","Value":{"Int":1},"Init":{"Int":0},"Domain":{"Int":{"Values":[0,1,2,3,4,5,6]}},"Values":[["Directional",{"Int":0}],["Point",{"Int":1}],["Spot",{"Int":2}],["Rect",{"Int":3}],["Disk",{"Int":4}],["Sphere",{"Int":5}],["Dome",{"Int":6}]],"FolderPort":"","FileExtensions":""},{"uuid":"8f38638e-9f9f-48b0-ae36-1cba86ef5703","ObjectName":"Inlet","id":1,"Hidden":true,"Custom":"Color","Exposed":"color","Value":{"Vec4f":[1.0,1.0,1.0,1.0]},"Init":{"Vec4f":[1.0,1.0,1.0,1.0]},"Domain":{}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":2,"Hidden":true,"Custom":"Intensity","Exposed":"intensity","Value":{"Float":43.420101165771484},"Init":{"Float":1.0},"Domain":{"Float":{"Min":0.0,"Max":100.0}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":3,"Hidden":true,"Custom":"Range","Exposed":"range","Value":{"Float":260.58990478515625},"Init":{"Float":0.0},"Domain":{"Float":{"Min":0.0,"Max":1000.0}}},{"uuid":"485680cc-b8b9-4a01-acc7-3e8334bdc016","ObjectName":"Inlet","id":4,"Hidden":true,"Custom":"Falloff","Exposed":"falloff","Value":{"Int":2},"Init":{"Int":2},"Domain":{"Int":{"Values":[0,1,2,3]}},"Values":[["None",{"Int":0}],["Linear",{"Int":1}],["Quadratic (physical)",{"Int":2}],["Cubic",{"Int":3}]],"FolderPort":"","FileExtensions":""},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":5,"Hidden":true,"Custom":"Inner cone °","Exposed":"inner cone _","Value":{"Float":18.60381507873535},"Init":{"Float":0.0},"Domain":{"Float":{"Min":0.0,"Max":90.0}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":6,"Hidden":true,"Custom":"Outer cone °","Exposed":"outer cone _","Value":{"Float":29.28077507019043},"Init":{"Float":45.0},"Domain":{"Float":{"Min":0.0,"Max":90.0}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":7,"Hidden":true,"Custom":"Width","Exposed":"width","Value":{"Float":1.0},"Init":{"Float":1.0},"Domain":{"Float":{"Min":0.009999999776482582,"Max":100.0}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":8,"Hidden":true,"Custom":"Height","Exposed":"height","Value":{"Float":1.0},"Init":{"Float":1.0},"Domain":{"Float":{"Min":0.009999999776482582,"Max":100.0}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":9,"Hidden":true,"Custom":"Radius","Exposed":"radius","Value":{"Float":0.5},"Init":{"Float":0.5},"Domain":{"Float":{"Min":0.009999999776482582,"Max":100.0}}},{"uuid":"fb27e4cb-ea7f-41e2-ad92-2354498c1b6b","ObjectName":"Inlet","id":10,"Hidden":true,"Custom":"Cast shadow","Exposed":"cast shadow","Value":{"Bool":false},"Init":{"Bool":false},"Domain":{"Bool":null}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":11,"Hidden":true,"Custom":"Shadow bias","Exposed":"shadow bias","Value":{"Float":0.0010000000474974513},"Init":{"Float":0.0010000000474974513},"Domain":{"Float":{"Min":0.0,"Max":0.10000000149011612}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":12,"Hidden":true,"Custom":"Shadow normal bias","Exposed":"shadow normal bias","Value":{"Float":0.009999999776482582},"Init":{"Float":0.009999999776482582},"Domain":{"Float":{"Min":0.0,"Max":0.10000000149011612}}},{"uuid":"377e8205-b442-4d54-8832-3761def522b2","ObjectName":"Inlet","id":13,"Hidden":true,"Custom":"Position","Exposed":"position","Value":{"Vec3f":[1.315592885017395,-0.7994055151939392,1.4268311262130737]},"Init":{"Vec3f":[0.0,0.0,0.0]},"Domain":{"Vec3f":{"Min":[-8388608.0,-8388608.0,-8388608.0],"Max":[8388608.0,8388608.0,8388608.0],"Values":[[],[],[]]}}},{"uuid":"377e8205-b442-4d54-8832-3761def522b2","ObjectName":"Inlet","id":14,"Hidden":true,"Custom":"Rotation","Exposed":"rotation","Value":{"Vec3f":[0.0,0.0,0.0]},"Init":{"Vec3f":[0.0,0.0,0.0]},"Domain":{"Vec3f":{"Min":[0.0,0.0,0.0],"Max":[360.0,360.0,360.0],"Values":[[],[],[]]}}}],"Outlets":[{"uuid":"848061c5-e8a0-4a13-9985-e8df30ce6d4f","ObjectName":"Outlet","id":0,"Hidden":false,"Custom":"Scene","Exposed":"scene"}]},{"uuid":"74ca45ff-92c9-44a0-8f1a-754dea05ee1b","ObjectName":"gfxProcess","id":10,"Metadata":{"ScriptingName":"Smoke_noise_MsdGWn","Comment":"","Color":"Transparent1","Label":"","Touched":true},"Duration":11289600000,"Height":300.0,"StartOffset":0,"LoopDuration":11289600000,"Pos":[-624.4085536880953,224.6324709357613],"Size":[211.0,22.0],"Loops":false,"FoldMode":2,"Vertex":"","Fragment":"/*\n{\n  \"IMPORTED\" : [\n\n  ],\n  \"CATEGORIES\" : [\n    \"Automatically Converted\",\n    \"Shadertoy\"\n  ],\n  \"DESCRIPTION\" : \"Automatically converted from https:\\/\\/www.shadertoy.com\\/view\\/MsdGWn by And390.  A simple example of smoke-like curl noise. Based on simplex noise with FBM.\",\n  \"INPUTS\" : [\n\n  ]\n}\n*/\n\n\nconst int noiseSwirlSteps = 2;\nconst float noiseSwirlValue = 1.;\nconst float noiseSwirlStepValue = noiseSwirlValue / float(noiseSwirlSteps);\n\nconst float noiseScale = 2.;\nconst float noiseTimeScale = 0.1;\n\n\nfloat simplex(vec3 v);\nfloat getNoise(vec3 v);\n\n\nvoid main() {\n\n\n\n\tvec2 uv = isf_FragNormCoord;\n\tfloat noise = getNoise(vec3(uv * noiseScale, TIME * noiseTimeScale));\n    noise = noise * noise * noise * noise * 2.0;  //more contrast\n    gl_FragColor = vec4(noise, noise, noise, 1.0);\n}\n\n\n\nfloat fbm3(vec3 v) {\n    float result = simplex(v);\n    result += simplex(v * 2.) / 2.;\n    result += simplex(v * 4.) / 4.;\n    result /= (1. + 1./2. + 1./4.);\n    return result;\n}\n\nfloat fbm5(vec3 v) {\n    float result = simplex(v);\n    result += simplex(v * 2.) / 2.;\n    result += simplex(v * 4.) / 4.;\n    result += simplex(v * 8.) / 8.;\n    result += simplex(v * 16.) / 16.;\n    result /= (1. + 1./2. + 1./4. + 1./8. + 1./16.);\n    return result;\n}\n\nfloat getNoise(vec3 v) {\n    //  make it curl\n    for (int i=0; i<noiseSwirlSteps; i++) {\n    \tv.xy += vec2(fbm3(v), fbm3(vec3(v.xy, v.z + 1000.))) * noiseSwirlStepValue;\n    }\n    //  normalize\n    return fbm5(v) / 2. + 0.5;\n}\n\n//\n// Description : Array and textureless GLSL 2D/3D/4D simplex\n//               noise functions.\n//      Author : Ian McEwan, Ashima Arts.\n//  Maintainer : ijm\n//     Lastmod : 20110822 (ijm)\n//     License : Copyright (C) 2011 Ashima Arts. All rights reserved.\n//               Distributed under the MIT License. See LICENSE file.\n//               https://github.com/ashima/webgl-noise\n//\n\nvec3 mod289(vec3 x) {\n  return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n\nvec4 mod289(vec4 x) {\n  return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n\nvec4 permute(vec4 x) {\n     return mod289(((x*34.0)+1.0)*x);\n}\n\nvec4 taylorInvSqrt(vec4 r)\n{\n  return 1.79284291400159 - 0.85373472095314 * r;\n}\n\nfloat simplex(vec3 v)\n  {\n  const vec2  C = vec2(1.0/6.0, 1.0/3.0) ;\n  const vec4  D = vec4(0.0, 0.5, 1.0, 2.0);\n\n// First corner\n  vec3 i  = floor(v + dot(v, C.yyy) );\n  vec3 x0 =   v - i + dot(i, C.xxx) ;\n\n// Other corners\n  vec3 g = step(x0.yzx, x0.xyz);\n  vec3 l = 1.0 - g;\n  vec3 i1 = min( g.xyz, l.zxy );\n  vec3 i2 = max( g.xyz, l.zxy );\n\n  //   x0 = x0 - 0.0 + 0.0 * C.xxx;\n  //   x1 = x0 - i1  + 1.0 * C.xxx;\n  //   x2 = x0 - i2  + 2.0 * C.xxx;\n  //   x3 = x0 - 1.0 + 3.0 * C.xxx;\n  vec3 x1 = x0 - i1 + C.xxx;\n  vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y\n  vec3 x3 = x0 - D.yyy;      // -1.0+3.0*C.x = -0.5 = -D.y\n\n// Permutations\n  i = mod289(i);\n  vec4 p = permute( permute( permute(\n             i.z + vec4(0.0, i1.z, i2.z, 1.0 ))\n           + i.y + vec4(0.0, i1.y, i2.y, 1.0 ))\n           + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));\n\n// Gradients: 7x7 points over a square, mapped onto an octahedron.\n// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)\n  float n_ = 0.142857142857; // 1.0/7.0\n  vec3  ns = n_ * D.wyz - D.xzx;\n\n  vec4 j = p - 49.0 * floor(p * ns.z * ns.z);  //  mod(p,7*7)\n\n  vec4 x_ = floor(j * ns.z);\n  vec4 y_ = floor(j - 7.0 * x_ );    // mod(j,N)\n\n  vec4 x = x_ *ns.x + ns.yyyy;\n  vec4 y = y_ *ns.x + ns.yyyy;\n  vec4 h = 1.0 - abs(x) - abs(y);\n\n  vec4 b0 = vec4( x.xy, y.xy );\n  vec4 b1 = vec4( x.zw, y.zw );\n\n  //vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0;\n  //vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;\n  vec4 s0 = floor(b0)*2.0 + 1.0;\n  vec4 s1 = floor(b1)*2.0 + 1.0;\n  vec4 sh = -step(h, vec4(0.0));\n\n  vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;\n  vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;\n\n  vec3 p0 = vec3(a0.xy,h.x);\n  vec3 p1 = vec3(a0.zw,h.y);\n  vec3 p2 = vec3(a1.xy,h.z);\n  vec3 p3 = vec3(a1.zw,h.w);\n\n//Normalise gradients\n  vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\n  p0 *= norm.x;\n  p1 *= norm.y;\n  p2 *= norm.z;\n  p3 *= norm.w;\n\n// Mix final noise value\n  vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\n  m = m * m;\n  return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1),\n                                dot(p2,x2), dot(p3,x3) ) );\n  }\n","Root":"<PROJECT>:ossia/score/packages/default/Presets/GLSL_shaders/grigm/Smoke_noise_MsdGWn.fs","Inlets":[],"Outlets":[{"uuid":"f1c71046-b754-49a5-8e66-d01374773dfc","ObjectName":"Outlet","id":1,"Hidden":false,"Custom":"Texture Out","Exposed":"texture out"}]},{"uuid":"74ca45ff-92c9-44a0-8f1a-754dea05ee1b","ObjectName":"gfxProcess","id":12,"Metadata":{"ScriptingName":"MakeMyNoiseTheP-Flow2","Comment":"","Color":"Transparent1","Label":"","Touched":true},"Duration":11289600000,"Height":300.0,"StartOffset":0,"LoopDuration":11289600000,"Pos":[-659.6086770459356,304.14338698691085],"Size":[252.0,176.0],"Loops":false,"FoldMode":2,"Vertex":"","Fragment":"/*{\n\t\"CREDIT\": \"by mojovideotech\",\n  \"CATEGORIES\": [\n    \"noise\"\n  ],\n  \"DESCRIPTION\": \"\",\n  \"INPUTS\": [\n         {\n      \t\t\"MAX\": [0.5,0.5],\n      \t\t\"MIN\": [0.25,0.25],\n      \t\t\"NAME\": \"offset\",\n      \t\t\"DEFAULT\":[0.33,0.33],\n      \t\t\"TYPE\": \"point2D\"\n         },\n         {\n            \"NAME\": \"color1\",\n            \"TYPE\": \"float\",\n           \"DEFAULT\": 0.55,\n            \"MIN\": 0.01,\n            \"MAX\": 2.0\n          },\n           {\n            \"NAME\": \"color2\",\n            \"TYPE\": \"float\",\n           \"DEFAULT\": 0.66,\n            \"MIN\": 0.01,\n            \"MAX\": 2.0\n           },\n            {\n            \"NAME\": \"color3\",\n            \"TYPE\": \"float\",\n           \"DEFAULT\": 0.77,\n            \"MIN\": 0.01,\n            \"MAX\": 2.0\n          },\n            {\n            \"NAME\": \"detail\",\n            \"TYPE\": \"float\",\n           \"DEFAULT\": 0.07,\n            \"MIN\": 0.0,\n            \"MAX\": 1.0\n          },\n            {\n            \"NAME\": \"brightness\",\n            \"TYPE\": \"float\",\n           \"DEFAULT\": 0.53,\n            \"MIN\": 0.0,\n            \"MAX\": 1.0\n          },\n           {\n            \"NAME\": \"scale\",\n            \"TYPE\": \"float\",\n           \"DEFAULT\": 0.0025,\n            \"MIN\": 0.00125,\n            \"MAX\": 0.01\n          },\n           {\n            \"NAME\": \"phase1\",\n            \"TYPE\": \"float\",\n           \"DEFAULT\": 0.88,\n            \"MIN\": 0.01,\n            \"MAX\": 0.99\n          },\n          {\n            \"NAME\": \"phase2\",\n            \"TYPE\": \"float\",\n           \"DEFAULT\": 0.46,\n            \"MIN\": -0.5,\n            \"MAX\": 0.5\n          },\n           {\n            \"NAME\": \"rate\",\n            \"TYPE\": \"float\",\n           \"DEFAULT\": -0.6,\n            \"MIN\": -10,\n            \"MAX\": 10\n          }\n  ]\n}\n*/\n\n\n// MakeMyNoiseTheP-Flow2 by mojovideotech\n// based on :\n// http://glslsandbox.com/e#3155.0\n// GLSL implementation of 2D \"flow noise\" as presented\n// by Ken Perlin and Fabrice Neyret at Siggraph 2001.\n// Author: Stefan Gustavson (stefan.gustavson@liu.se)\n// Distributed under the terms of the MIT license.\n// changes by George Toledo, 2011 and 2012.\n\n#ifdef GL_ES\nprecision mediump float;\n#endif\n\n#define F2 0.3183098861\n#define G2 0.1784575679\n#define K 0.028876065 \n#define TPI 6.28318530718\n\nfloat permute(float x) {\n  return mod((34.0 * x + 1.0)*x, 289.0);\n}\n\nvec2 grad2(vec2 p, float rot) {\n  float u = permute(permute(p.x) + p.y) * K + rot;\n //   u = fract(u) * TPI;\n//  return vec2(cos(u-phase1), sin(u+phase2));\n    u = 4.0 * fract(u) - 2.0;\n  return vec2(abs(u)-phase1, abs(abs(u+phase2)-2.0)-1.0);\n\n}\n\nfloat srdnoise(in vec2 P, in float rot, out vec2 grad) {\n  vec2 Ps = P + dot(P, vec2(F2));\n  vec2 Pi = floor(Ps);\n  vec2 P0 = Pi - dot(Pi, vec2(G2));\n  vec2 v0 = P - P0;\n  vec2 i1 = (v0.x > v0.y) ? vec2(1.0, 0.0) : vec2 (0.0, 1.0);\n  vec2 v1 = v0 - i1 + G2;\n  vec2 v2 = v0 - 1.0 + 2.0 * G2;\n   Pi = mod(Pi, 289.0);\n  float ta,tb,tc;\n  ta = dot(v0,v0);\n  tb = dot(v1,v1);\n  tc = dot(v2,v2);\n  vec3 t = vec3(ta,tb,tc);\n  t = vec3(max(0.5-t,0.0));\n  vec3 t2 = t*t;\n  vec3 t4 = t2*t2;\n  vec2 g0 = grad2(Pi, rot);\n  vec2 g1 = grad2(Pi + i1, rot);\n  vec2 g2 = grad2(Pi + 1.0, rot);\n  vec3 gv = vec3(dot(g0,v0), dot(g1,v1), dot(g2,v2));\n  vec3 n = t4 * gv; \n  vec3 temp = t2 * t * gv;\n  vec3 gradx = temp * vec3(v0.x, v1.x, v2.x);\n  vec3 grady = temp * vec3(v0.y, v1.y, v2.y);\n  grad.x = -8.0 * (gradx.x + gradx.y + gradx.z);\n  grad.y = -8.0 * (grady.x + grady.y + grady.z);\n  grad.x += dot(t4, vec3(g0.x, g1.x, g2.x));\n  grad.y += dot(t4, vec3(g0.y, g1.y, g2.y));\n  grad *= 40.0;\n  return 40.0 * (n.x + n.y + n.z);\n}\n\nvec3 hue(vec3 hue) {\n\treturn clamp(abs(mod(hue,vec3(color2,color3,color1))),0.01,1.0);\n//\treturn clamp(abs(mod(hue * color3 + vec3(0.0,0.0,0.0),color1) - color2) - 1.0,0.0,1.0);\n}\n\n\nvoid main(void) {\n  \tvec2 p, g1, g2;\n\t p.x = ( gl_FragCoord.y - (RENDERSIZE.x*offset.x))*scale;\n\t p.y = ( gl_FragCoord.x - (RENDERSIZE.y*offset.y))*scale;\n\tfloat T = TIME * rate;\n  \tfloat n1 = srdnoise(p*0.5, 0.2*T, g1);\n  \tfloat n2 = srdnoise(p*2.0 + g1*0.5, 0.51*T, g2);\n  \tfloat n3 = srdnoise(p*4.0 + g1*0.5 + g2*0.25, 0.77*T, g2);\n  \tvec3 col = vec3(color1,color2,color3) + vec3(n1+0.95*n2+0.75*n3);\n  gl_FragColor = vec4(mix(vec3(hue(col)),col/2.0,1.0-detail),1.0);\t\n  gl_FragColor *= vec4((vec3(0.0),0.75+brightness/3.0));\t\n}","Root":"<PROJECT>:ossia/score/packages/default/Presets/GLSL_shaders/grigm/MakeMyNoiseTheP-Flow2.fs","Inlets":[{"uuid":"0adbbdda-fda4-451e-91cc-1da731bde9d5","ObjectName":"Inlet","id":0,"Hidden":true,"Custom":"offset","Exposed":"offset","Value":{"Vec2f":[0.33000001311302185,0.33000001311302185]},"Init":{"Vec2f":[0.33000001311302185,0.33000001311302185]},"Domain":{"Vec2f":{"Min":[0.25,0.25],"Max":[0.5,0.5],"Values":[[],[]]}},"Integral":false},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":1,"Hidden":true,"Custom":"color1","Exposed":"color1","Value":{"Float":0.550000011920929},"Init":{"Float":0.550000011920929},"Domain":{"Float":{"Min":0.009999999776482582,"Max":2.0}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":2,"Hidden":true,"Custom":"color2","Exposed":"color2","Value":{"Float":0.6600000262260437},"Init":{"Float":0.6600000262260437},"Domain":{"Float":{"Min":0.009999999776482582,"Max":2.0}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":3,"Hidden":true,"Custom":"color3","Exposed":"color3","Value":{"Float":0.7699999809265137},"Init":{"Float":0.7699999809265137},"Domain":{"Float":{"Min":0.009999999776482582,"Max":2.0}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":4,"Hidden":true,"Custom":"detail","Exposed":"detail","Value":{"Float":0.07000000029802322},"Init":{"Float":0.07000000029802322},"Domain":{"Float":{"Min":0.0,"Max":1.0}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":5,"Hidden":true,"Custom":"brightness","Exposed":"brightness","Value":{"Float":0.7310218811035156},"Init":{"Float":0.5299999713897705},"Domain":{"Float":{"Min":0.0,"Max":1.0}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":6,"Hidden":true,"Custom":"scale","Exposed":"scale","Value":{"Float":0.0024999999441206455},"Init":{"Float":0.0024999999441206455},"Domain":{"Float":{"Min":0.0012499999720603228,"Max":0.009999999776482582}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":7,"Hidden":true,"Custom":"phase1","Exposed":"phase1","Value":{"Float":0.8799999952316284},"Init":{"Float":0.8799999952316284},"Domain":{"Float":{"Min":0.009999999776482582,"Max":0.9900000095367432}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":8,"Hidden":true,"Custom":"phase2","Exposed":"phase2","Value":{"Float":0.46000000834465027},"Init":{"Float":0.46000000834465027},"Domain":{"Float":{"Min":-0.5,"Max":0.5}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":9,"Hidden":true,"Custom":"rate","Exposed":"rate","Value":{"Float":-0.6000000238418579},"Init":{"Float":-0.6000000238418579},"Domain":{"Float":{"Min":-10.0,"Max":10.0}}}],"Outlets":[{"uuid":"f1c71046-b754-49a5-8e66-d01374773dfc","ObjectName":"Outlet","id":1,"Hidden":false,"Custom":"Texture Out","Exposed":"texture out"}]},{"uuid":"74ca45ff-92c9-44a0-8f1a-754dea05ee1b","ObjectName":"gfxProcess","id":13,"Metadata":{"ScriptingName":"Simplex Noise","Comment":"","Color":"Transparent1","Label":"","Touched":true},"Duration":11289600000,"Height":300.0,"StartOffset":0,"LoopDuration":11289600000,"Pos":[-589.8026601105024,515.8809521569603],"Size":[180.0,71.0],"Loops":false,"FoldMode":0,"Vertex":"","Fragment":"/*{\n    \"CATEGORIES\": [\n        \"Noise\",\n        \"Utility\"\n    ],\n    \"CREDIT\": \"Tuxic\",\n    \"DESCRIPTION\": \"generates a basic simplex noise\",\n    \"INPUTS\": [\n        {\n            \"DEFAULT\": [0,0],\n            \"MAX\": [500,500],\n            \"MIN\": [-500,-500],\n            \"NAME\": \"offset\",\n            \"TYPE\": \"point2D\"\n        },\n        {\n            \"DEFAULT\": 4,\n            \"MAX\": 100,\n            \"MIN\": 0,\n            \"NAME\": \"scale\",\n            \"TYPE\": \"float\"\n        }\n    ],\n    \"ISFVSN\": \"2\"\n}\n*/\n\n// https://gist.github.com/patriciogonzalezvivo/670c22f3966e662d2f83\n// Simplex 2D noise\n//\nvec3 permute(vec3 x) { return mod(((x*34.0)+1.0)*x, 289.0); }\n\nfloat snoise(vec2 v){\n  const vec4 C = vec4(0.211324865405187, 0.366025403784439,\n           -0.577350269189626, 0.024390243902439);\n  vec2 i  = floor(v + dot(v, C.yy) );\n  vec2 x0 = v -   i + dot(i, C.xx);\n  vec2 i1;\n  i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0);\n  vec4 x12 = x0.xyxy + C.xxzz;\n  x12.xy -= i1;\n  i = mod(i, 289.0);\n  vec3 p = permute( permute( i.y + vec3(0.0, i1.y, 1.0 ))\n  + i.x + vec3(0.0, i1.x, 1.0 ));\n  vec3 m = max(0.5 - vec3(dot(x0,x0), dot(x12.xy,x12.xy),\n    dot(x12.zw,x12.zw)), 0.0);\n  m = m*m ;\n  m = m*m ;\n  vec3 x = 2.0 * fract(p * C.www) - 1.0;\n  vec3 h = abs(x) - 0.5;\n  vec3 ox = floor(x + 0.5);\n  vec3 a0 = x - ox;\n  m *= 1.79284291400159 - 0.85373472095314 * ( a0*a0 + h*h );\n  vec3 g;\n  g.x  = a0.x  * x0.x  + h.x  * x0.y;\n  g.yz = a0.yz * x12.xz + h.yz * x12.yw;\n  return 130.0 * dot(m, g);\n}\n\nvoid main()\t{\n    vec2 uv = isf_FragNormCoord.xy + offset;\n\tgl_FragColor = vec4(vec3(snoise(uv * scale)), 1.0);\n}\n","Root":"<PROJECT>:ossia/score/packages/default/Presets/GLSL_shaders/basic/generator/Simplex Noise.fs","Inlets":[{"uuid":"0adbbdda-fda4-451e-91cc-1da731bde9d5","ObjectName":"Inlet","id":0,"Hidden":true,"Custom":"offset","Exposed":"offset","Value":{"Vec2f":[0.0,0.0]},"Init":{"Vec2f":[0.0,0.0]},"Domain":{"Vec2f":{"Min":[-500.0,-500.0],"Max":[500.0,500.0],"Values":[[],[]]}},"Integral":false},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":1,"Hidden":true,"Custom":"scale","Exposed":"scale","Value":{"Float":4.0},"Init":{"Float":4.0},"Domain":{"Float":{"Min":0.0,"Max":100.0}}}],"Outlets":[{"uuid":"f1c71046-b754-49a5-8e66-d01374773dfc","ObjectName":"Outlet","id":1,"Hidden":false,"Custom":"Texture Out","Exposed":"texture out"}]},{"uuid":"74ca45ff-92c9-44a0-8f1a-754dea05ee1b","ObjectName":"gfxProcess","id":14,"Metadata":{"ScriptingName":"Bloom","Comment":"","Color":"Transparent1","Label":"","Touched":true},"Duration":11289600000,"Height":300.0,"StartOffset":0,"LoopDuration":11289600000,"Pos":[1359.2499314899978,-255.80479449999737],"Size":[292.0,160.0],"Loops":false,"FoldMode":0,"Vertex":"","Fragment":"/*{\n    \"CREDIT\": \"ossia score\",\n    \"ISFVSN\": \"2\",\n    \"DESCRIPTION\": \"Bloom / glow with iterative separable Gaussian blur. Extracts bright pixels with soft knee, blurs with 4 H/V iterations, composites onto original. HDR-aware. Smooth, wide, artifact-free.\",\n    \"CATEGORIES\": [ \"Filter\" ],\n    \"INPUTS\": [\n        { \"NAME\": \"inputImage\", \"TYPE\": \"image\" },\n        { \"NAME\": \"threshold\",  \"LABEL\": \"Threshold\",  \"TYPE\": \"float\", \"DEFAULT\": 0.8, \"MIN\": 0.0, \"MAX\": 5.0 },\n        { \"NAME\": \"soft_knee\",  \"LABEL\": \"Soft Knee\",  \"TYPE\": \"float\", \"DEFAULT\": 0.5, \"MIN\": 0.0, \"MAX\": 1.0 },\n        { \"NAME\": \"intensity\",  \"LABEL\": \"Intensity\",  \"TYPE\": \"float\", \"DEFAULT\": 0.4, \"MIN\": 0.0, \"MAX\": 2.0 },\n        { \"NAME\": \"spread\",     \"LABEL\": \"Spread\",     \"TYPE\": \"float\", \"DEFAULT\": 3.0, \"MIN\": 0.5, \"MAX\": 10.0 },\n        { \"NAME\": \"tint\",       \"LABEL\": \"Bloom Tint\", \"TYPE\": \"color\", \"DEFAULT\": [ 1.0, 1.0, 1.0, 1.0 ] }\n    ],\n    \"PASSES\": [\n        { \"TARGET\": \"bright\" },\n        { \"TARGET\": \"h1\" },\n        { \"TARGET\": \"v1\" },\n        { \"TARGET\": \"h2\" },\n        { \"TARGET\": \"v2\" },\n        { \"TARGET\": \"h3\" },\n        { \"TARGET\": \"v3\" },\n        { \"TARGET\": \"h4\" },\n        { \"TARGET\": \"v4\" },\n        {}\n    ]\n}*/\n\nconst vec3 luma_coeff = vec3(0.2126, 0.7152, 0.0722);\nconst float offsets[3] = float[3](0.0, 1.3846153846, 3.2307692308);\nconst float weights[3] = float[3](0.2270270270, 0.3162162162, 0.0702702703);\n\nvec4 blur9(sampler2D tex, vec2 uv, vec2 direction, float s) {\n    vec2 px = direction * s / RENDERSIZE;\n    vec4 c = IMG_NORM_PIXEL(tex, uv) * weights[0];\n    for (int i = 1; i < 3; i++) {\n        vec2 off = px * offsets[i];\n        c += IMG_NORM_PIXEL(tex, uv + off) * weights[i];\n        c += IMG_NORM_PIXEL(tex, uv - off) * weights[i];\n    }\n    return c;\n}\n\nvoid main() {\n    vec2 uv = isf_FragNormCoord;\n    float s = spread * 0.5;\n\n    if (PASSINDEX == 0) {\n        vec4 c = IMG_NORM_PIXEL(inputImage, uv);\n        float L = dot(luma_coeff, c.rgb);\n        float knee = threshold * soft_knee;\n        float t = max(L - threshold + knee, 0.0);\n        float blend = min(t / (2.0 * knee + 0.0001), 1.0);\n        blend *= blend;\n        gl_FragColor = vec4(c.rgb * blend, c.a);\n    }\n    else if (PASSINDEX == 1) gl_FragColor = blur9(bright, uv, vec2(1,0), s);\n    else if (PASSINDEX == 2) gl_FragColor = blur9(h1, uv, vec2(0,1), s);\n    else if (PASSINDEX == 3) gl_FragColor = blur9(v1, uv, vec2(1,0), s);\n    else if (PASSINDEX == 4) gl_FragColor = blur9(h2, uv, vec2(0,1), s);\n    else if (PASSINDEX == 5) gl_FragColor = blur9(v2, uv, vec2(1,0), s);\n    else if (PASSINDEX == 6) gl_FragColor = blur9(h3, uv, vec2(0,1), s);\n    else if (PASSINDEX == 7) gl_FragColor = blur9(v3, uv, vec2(1,0), s);\n    else if (PASSINDEX == 8) gl_FragColor = blur9(h4, uv, vec2(0,1), s);\n    else {\n        vec4 original = IMG_NORM_PIXEL(inputImage, uv);\n        vec3 bloom = IMG_NORM_PIXEL(v4, uv).rgb * intensity * tint.rgb;\n        gl_FragColor = vec4(original.rgb + bloom, original.a);\n    }\n}\n","Root":"<PROJECT>:ossia/score/packages/default/Presets/GLSL_shaders/linear/Bloom.fs","Inlets":[{"uuid":"5ac86198-2d03-4830-9e41-a6d529922d29","ObjectName":"Inlet","id":0,"Hidden":false,"Custom":"inputImage","Exposed":"inputimage","Format":8,"FormatSet":true,"Filter":2,"AddressMode":1,"MipmapMode":0},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":1,"Hidden":true,"Custom":"threshold","Exposed":"threshold","Value":{"Float":1.5430035591125488},"Init":{"Float":0.800000011920929},"Domain":{"Float":{"Min":0.0,"Max":5.0}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":2,"Hidden":true,"Custom":"soft_knee","Exposed":"soft_knee","Value":{"Float":1.0},"Init":{"Float":0.5},"Domain":{"Float":{"Min":0.0,"Max":1.0}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":3,"Hidden":true,"Custom":"intensity","Exposed":"intensity","Value":{"Float":2.0},"Init":{"Float":0.4000000059604645},"Domain":{"Float":{"Min":0.0,"Max":2.0}}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":4,"Hidden":true,"Custom":"spread","Exposed":"spread","Value":{"Float":4.690194606781006},"Init":{"Float":3.0},"Domain":{"Float":{"Min":0.5,"Max":10.0}}},{"uuid":"8f38638e-9f9f-48b0-ae36-1cba86ef5703","ObjectName":"Inlet","id":5,"Hidden":true,"Custom":"tint","Exposed":"tint","Value":{"Vec4f":[0.11670099943876266,1.0,0.02827496826648712,1.0]},"Init":{"Vec4f":[1.0,1.0,1.0,1.0]},"Domain":{}}],"Outlets":[{"uuid":"f1c71046-b754-49a5-8e66-d01374773dfc","ObjectName":"Outlet","id":1,"Hidden":false,"Custom":"Texture Out","Exposed":"texture out","Address":"Window:/"}]},{"uuid":"6e74b962-b102-4d2d-b6f1-850917e8c747","ObjectName":"avnd_vec3f","id":15,"Metadata":{"ScriptingName":"Vec3f","Comment":"","Color":"Transparent1","Label":"","Touched":true},"Duration":11289600000,"Height":300.0,"StartOffset":0,"LoopDuration":11289600000,"Pos":[-325.1968010769448,-394.70718178507707],"Size":[94.0,96.0],"Loops":false,"FoldMode":0,"Inlets":[{"uuid":"10d62b0d-5bc9-4ac9-9540-9e8ac0c24947","ObjectName":"Inlet","id":0,"Hidden":true,"Custom":"X","Exposed":"x","Value":{"Float":1.303684949874878},"Init":{"Float":1.0},"Domain":{"Float":{"Min":-8388608.0,"Max":8388608.0}}},{"uuid":"10d62b0d-5bc9-4ac9-9540-9e8ac0c24947","ObjectName":"Inlet","id":1,"Hidden":true,"Custom":"Y","Exposed":"y","Value":{"Float":1.0},"Init":{"Float":1.0},"Domain":{"Float":{"Min":-8388608.0,"Max":8388608.0}}},{"uuid":"10d62b0d-5bc9-4ac9-9540-9e8ac0c24947","ObjectName":"Inlet","id":2,"Hidden":true,"Custom":"Z","Exposed":"z","Value":{"Float":1.4482985734939575},"Init":{"Float":1.0},"Domain":{"Float":{"Min":-8388608.0,"Max":8388608.0}}}],"Outlets":[{"uuid":"cff96158-cc72-46d7-99dc-b6038171375b","ObjectName":"Outlet","id":0,"Hidden":false,"Custom":"Pair","Exposed":"pair"}]},{"uuid":"0b1b1816-c33e-4796-a16d-5aab27fe600f","ObjectName":"LFO","id":16,"Metadata":{"ScriptingName":"LFO","Comment":"","Color":"Transparent1","Label":"","Touched":true},"Duration":11289600000,"Height":300.0,"StartOffset":0,"LoopDuration":11289600000,"Pos":[-818.4108490617119,-357.70003860375914],"Size":[261.0,117.5],"Loops":false,"FoldMode":0,"Inlets":[{"uuid":"b631d9b7-cbe3-4d9c-b470-f139e348aecb","ObjectName":"Inlet","id":0,"Hidden":true,"Custom":"Period","Exposed":"period","Value":{"Vec2f":[3.3408024311065674,0.0]},"Init":{"Vec2f":[0.5,1.0]},"Domain":{"Vec2f":{"Min":[0.009999999776482582,0.0],"Max":[60.0,1.0],"Values":[[],[]]}}},{"uuid":"82427d27-084a-4ab6-9c4e-db83929a1200","ObjectName":"Inlet","id":1,"Hidden":true,"Custom":"Shape","Exposed":"shape","Value":{"Float":0.5},"Init":{"Float":0.5},"Domain":{"Float":{"Min":0.0,"Max":1.0}}},{"uuid":"7cd210d3-ebd1-4f71-9de6-cccfb639cbc3","ObjectName":"Inlet","id":2,"Hidden":true,"Custom":"Retrigger","Exposed":"retrigger","Value":{"Impulse":null},"Init":{"Impulse":null},"Domain":{"Impulse":null}},{"uuid":"82427d27-084a-4ab6-9c4e-db83929a1200","ObjectName":"Inlet","id":3,"Hidden":true,"Custom":"Ampl.","Exposed":"ampl.","Value":{"Float":0.5},"Init":{"Float":0.5},"Domain":{"Float":{"Min":0.0,"Max":2.0}}},{"uuid":"82427d27-084a-4ab6-9c4e-db83929a1200","ObjectName":"Inlet","id":4,"Hidden":true,"Custom":"Offset","Exposed":"offset","Value":{"Float":-0.003554687602445483},"Init":{"Float":0.5},"Domain":{"Float":{"Min":-1.0,"Max":1.0}}},{"uuid":"82427d27-084a-4ab6-9c4e-db83929a1200","ObjectName":"Inlet","id":5,"Hidden":true,"Custom":"Jitter","Exposed":"jitter","Value":{"Float":0.0},"Init":{"Float":0.0},"Domain":{"Float":{"Min":0.0,"Max":180.0}}},{"uuid":"82427d27-084a-4ab6-9c4e-db83929a1200","ObjectName":"Inlet","id":6,"Hidden":true,"Custom":"Phase","Exposed":"phase","Value":{"Float":0.0},"Init":{"Float":0.0},"Domain":{"Float":{"Min":0.0,"Max":360.0}}},{"uuid":"8b1d76c4-3838-4ac0-9b9c-c12bc5db8e8a","ObjectName":"Inlet","id":7,"Hidden":true,"Custom":"Waveform","Exposed":"waveform","Value":{"String":"Sin"},"Init":{"String":"Sin"},"Domain":{"String":{"Values":["Sin","Triangle","Saw","RampDown","Square","SquareOnChange","SampleAndHoldEveryTick","SampleAndHold","Noise1","Noise2","Noise3","Drift"]}},"Values":["Sin","Triangle","Saw","RampDown","Square","SquareOnChange","SampleAndHoldEveryTick","SampleAndHold","Noise1","Noise2","Noise3","Drift"],"Pixmaps":[":/icons/wave_sin_off.png",":/icons/wave_sin_on.png",":/icons/wave_triangle_off.png",":/icons/wave_triangle_on.png",":/icons/wave_saw_off.png",":/icons/wave_saw_on.png",":/icons/wave_ramp_down_off.png",":/icons/wave_ramp_down_on.png",":/icons/wave_square_ticks_off.png",":/icons/wave_square_ticks_on.png",":/icons/wave_square_changes_off.png",":/icons/wave_square_changes_on.png",":/icons/wave_sample_and_hold_ticks_off.png",":/icons/wave_sample_and_hold_ticks_on.png",":/icons/wave_sample_and_hold_changes_off.png",":/icons/wave_sample_and_hold_changes_on.png",":/icons/wave_noise1_off.png",":/icons/wave_noise1_on.png",":/icons/wave_noise2_off.png",":/icons/wave_noise2_on.png",":/icons/wave_noise3_off.png",":/icons/wave_noise3_on.png",":/icons/wave_drift_off.png",":/icons/wave_drift_on.png"]},{"uuid":"fb27e4cb-ea7f-41e2-ad92-2354498c1b6b","ObjectName":"Inlet","id":8,"Hidden":true,"Custom":"Lock to bars","Exposed":"lock to bars","Value":{"Bool":false},"Init":{"Bool":false},"Domain":{"Bool":null}}],"Outlets":[{"uuid":"cff96158-cc72-46d7-99dc-b6038171375b","ObjectName":"Outlet","id":0,"Hidden":false,"Custom":"Out","Exposed":"out"}]},{"uuid":"25c64b87-a44a-4fed-9f60-0a48906fd3ec","ObjectName":"MicroMapping","id":17,"Metadata":{"ScriptingName":"Micromap","Comment":"","Color":"Transparent1","Label":"","Touched":true},"Duration":11289600000,"Height":300.0,"StartOffset":0,"LoopDuration":11289600000,"Pos":[-523.7855231461909,-356.9917414832615],"Size":[180.0,35.0],"Loops":false,"FoldMode":0,"Inlets":[{"uuid":"769dd38a-bfb3-4dc6-b52a-b6abb7afe2a3","ObjectName":"Inlet","id":0,"Hidden":false,"Custom":"in","Exposed":"in"},{"uuid":"9ae797ea-d94c-4792-acec-9ec1932bae5d","ObjectName":"Inlet","id":1,"Hidden":true,"Custom":"Expression","Exposed":"expression","Value":{"String":"10x"},"Init":{"String":"x / 127"},"Domain":{}}],"Outlets":[{"uuid":"cff96158-cc72-46d7-99dc-b6038171375b","ObjectName":"Outlet","id":0,"Hidden":false,"Custom":"out","Exposed":"out"}]}],"SmallViewRack":[{"Processes":[1,2,3,4,6,7,8,10,12,13,14,15,16,17],"Process":null,"Height":200.0,"Nodal":true}],"FullViewRack":[{"Process":0,"Nodal":true}],"DefaultDuration":11289600000,"MinDuration":11289600000,"MaxDuration":11854080000,"GuiDuration":17547264000,"Speed":1.0,"Rigidity":false,"MinNull":false,"MaxInf":true,"Signatures":[[0,[4,4]]],"StartState":0,"EndState":1,"StartDate":0,"HeightPercentage":0.0,"NodalSlotHeight":100.0,"QuantizationRate":-1.0,"Zoom":16128000.0,"Center":0,"NodalCenter":[168.49352601354508,-114.92474986789317],"NodalScale":0.629140533519308,"ViewMode":1,"SmallViewShown":true,"HasSignature":true},"StartTimeNode":{"ObjectName":"Scenario::TimeSyncModel","id":0,"Metadata":{"ScriptingName":"Sync.start","Comment":"","Color":"Gray","Label":"","Touched":true},"Date":0,"Events":[0],"MusicalSync":-1.0,"AutoTrigger":false,"Start":true,"Active":false,"Expression":" { true == false } "},"EndTimeNode":{"ObjectName":"Scenario::TimeSyncModel","id":1,"Metadata":{"ScriptingName":"Sync.end","Comment":"","Color":"Gray","Label":"","Touched":true},"Date":11289600000,"Events":[1],"MusicalSync":-1.0,"AutoTrigger":false,"Start":false,"Active":true,"Expression":" { true == false } "},"StartEvent":{"ObjectName":"Scenario::EventModel","id":0,"Metadata":{"ScriptingName":"Event.start","Comment":"","Color":"Emphasis4","Label":"","Touched":true},"TimeNode":0,"States":[0],"Condition":"","Date":0,"Offset":0},"EndEvent":{"ObjectName":"Scenario::EventModel","id":1,"Metadata":{"ScriptingName":"Event.end","Comment":"","Color":"Emphasis4","Label":"","Touched":true},"TimeNode":1,"States":[1],"Condition":"","Date":11289600000,"Offset":0},"StartState":{"ObjectName":"Scenario::StateModel","id":0,"Metadata":{"ScriptingName":"State.start","Comment":"","Color":"Base1","Label":"","Touched":true},"Event":0,"PreviousConstraint":null,"NextConstraint":0,"HeightPercentage":0.0,"Messages":{"Name":"","Accessors":[],"Unit":"none","Previous":[],"Following":[],"User":null,"Priorities":[1,2,0]},"StateProcesses":[]},"EndState":{"ObjectName":"Scenario::StateModel","id":1,"Metadata":{"ScriptingName":"State.end","Comment":"","Color":"Base1","Label":"","Touched":true},"Event":1,"PreviousConstraint":0,"NextConstraint":null,"HeightPercentage":0.0,"Messages":{"Name":"","Accessors":[],"Unit":"none","Previous":[],"Following":[],"User":null,"Priorities":[1,2,0]},"StateProcesses":[]}},"Speed":1.0,"Cables":[{"ObjectName":"Process::Cable","id":1,"Type":0,"Source":[{"ObjectName":"Scenario::ScenarioDocumentModel","ObjectId":1},{"ObjectName":"Scenario::BaseScenario","ObjectId":0},{"ObjectName":"Scenario::IntervalModel","ObjectId":0},{"ObjectName":"3d_cube","ObjectId":2},{"ObjectName":"Outlet","ObjectId":0}],"Sink":[{"ObjectName":"Scenario::ScenarioDocumentModel","ObjectId":1},{"ObjectName":"Scenario::BaseScenario","ObjectId":0},{"ObjectName":"Scenario::IntervalModel","ObjectId":0},{"ObjectName":"pbr_mesh","ObjectId":1},{"ObjectName":"Inlet","ObjectId":0}]},{"ObjectName":"Process::Cable","id":2,"Type":0,"Source":[{"ObjectName":"Scenario::ScenarioDocumentModel","ObjectId":1},{"ObjectName":"Scenario::BaseScenario","ObjectId":0},{"ObjectName":"Scenario::IntervalModel","ObjectId":0},{"ObjectName":"gfxProcess","ObjectId":3},{"ObjectName":"Outlet","ObjectId":1}],"Sink":[{"ObjectName":"Scenario::ScenarioDocumentModel","ObjectId":1},{"ObjectName":"Scenario::BaseScenario","ObjectId":0},{"ObjectName":"Scenario::IntervalModel","ObjectId":0},{"ObjectName":"pbr_mesh","ObjectId":1},{"ObjectName":"Inlet","ObjectId":1}]},{"ObjectName":"Process::Cable","id":3,"Type":0,"Source":[{"ObjectName":"Scenario::ScenarioDocumentModel","ObjectId":1},{"ObjectName":"Scenario::BaseScenario","ObjectId":0},{"ObjectName":"Scenario::IntervalModel","ObjectId":0},{"ObjectName":"pbr_mesh","ObjectId":1},{"ObjectName":"Outlet","ObjectId":0}],"Sink":[{"ObjectName":"Scenario::ScenarioDocumentModel","ObjectId":1},{"ObjectName":"Scenario::BaseScenario","ObjectId":0},{"ObjectName":"Scenario::IntervalModel","ObjectId":0},{"ObjectName":"gfxProcess","ObjectId":4},{"ObjectName":"Inlet","ObjectId":0}]},{"ObjectName":"Process::Cable","id":4,"Type":0,"Source":[{"ObjectName":"Scenario::ScenarioDocumentModel","ObjectId":1},{"ObjectName":"Scenario::BaseScenario","ObjectId":0},{"ObjectName":"Scenario::IntervalModel","ObjectId":0},{"ObjectName":"gfxProcess","ObjectId":4},{"ObjectName":"Outlet","ObjectId":0}],"Sink":[{"ObjectName":"Scenario::ScenarioDocumentModel","ObjectId":1},{"ObjectName":"Scenario::BaseScenario","ObjectId":0},{"ObjectName":"Scenario::IntervalModel","ObjectId":0},{"ObjectName":"gfxProcess","ObjectId":6},{"ObjectName":"Inlet","ObjectId":1000}]},{"ObjectName":"Process::Cable","id":7,"Type":0,"Source":[{"ObjectName":"Scenario::ScenarioDocumentModel","ObjectId":1},{"ObjectName":"Scenario::BaseScenario","ObjectId":0},{"ObjectName":"Scenario::IntervalModel","ObjectId":0},{"ObjectName":"camera_avnd","ObjectId":7},{"ObjectName":"Outlet","ObjectId":0}],"Sink":[{"ObjectName":"Scenario::ScenarioDocumentModel","ObjectId":1},{"ObjectName":"Scenario::BaseScenario","ObjectId":0},{"ObjectName":"Scenario::IntervalModel","ObjectId":0},{"ObjectName":"gfxProcess","ObjectId":4},{"ObjectName":"Inlet","ObjectId":0}]},{"ObjectName":"Process::Cable","id":8,"Type":0,"Source":[{"ObjectName":"Scenario::ScenarioDocumentModel","ObjectId":1},{"ObjectName":"Scenario::BaseScenario","ObjectId":0},{"ObjectName":"Scenario::IntervalModel","ObjectId":0},{"ObjectName":"light","ObjectId":8},{"ObjectName":"Outlet","ObjectId":0}],"Sink":[{"ObjectName":"Scenario::ScenarioDocumentModel","ObjectId":1},{"ObjectName":"Scenario::BaseScenario","ObjectId":0},{"ObjectName":"Scenario::IntervalModel","ObjectId":0},{"ObjectName":"gfxProcess","ObjectId":4},{"ObjectName":"Inlet","ObjectId":0}]},{"ObjectName":"Process::Cable","id":13,"Type":0,"Source":[{"ObjectName":"Scenario::ScenarioDocumentModel","ObjectId":1},{"ObjectName":"Scenario::BaseScenario","ObjectId":0},{"ObjectName":"Scenario::IntervalModel","ObjectId":0},{"ObjectName":"gfxProcess","ObjectId":10},{"ObjectName":"Outlet","ObjectId":1}],"Sink":[{"ObjectName":"Scenario::ScenarioDocumentModel","ObjectId":1},{"ObjectName":"Scenario::BaseScenario","ObjectId":0},{"ObjectName":"Scenario::IntervalModel","ObjectId":0},{"ObjectName":"pbr_mesh","ObjectId":1},{"ObjectName":"Inlet","ObjectId":2}]},{"ObjectName":"Process::Cable","id":15,"Type":0,"Source":[{"ObjectName":"Scenario::ScenarioDocumentModel","ObjectId":1},{"ObjectName":"Scenario::BaseScenario","ObjectId":0},{"ObjectName":"Scenario::IntervalModel","ObjectId":0},{"ObjectName":"gfxProcess","ObjectId":12},{"ObjectName":"Outlet","ObjectId":1}],"Sink":[{"ObjectName":"Scenario::ScenarioDocumentModel","ObjectId":1},{"ObjectName":"Scenario::BaseScenario","ObjectId":0},{"ObjectName":"Scenario::IntervalModel","ObjectId":0},{"ObjectName":"pbr_mesh","ObjectId":1},{"ObjectName":"Inlet","ObjectId":3}]},{"ObjectName":"Process::Cable","id":16,"Type":0,"Source":[{"ObjectName":"Scenario::ScenarioDocumentModel","ObjectId":1},{"ObjectName":"Scenario::BaseScenario","ObjectId":0},{"ObjectName":"Scenario::IntervalModel","ObjectId":0},{"ObjectName":"gfxProcess","ObjectId":13},{"ObjectName":"Outlet","ObjectId":1}],"Sink":[{"ObjectName":"Scenario::ScenarioDocumentModel","ObjectId":1},{"ObjectName":"Scenario::BaseScenario","ObjectId":0},{"ObjectName":"Scenario::IntervalModel","ObjectId":0},{"ObjectName":"pbr_mesh","ObjectId":1},{"ObjectName":"Inlet","ObjectId":4}]},{"ObjectName":"Process::Cable","id":17,"Type":0,"Source":[{"ObjectName":"Scenario::ScenarioDocumentModel","ObjectId":1},{"ObjectName":"Scenario::BaseScenario","ObjectId":0},{"ObjectName":"Scenario::IntervalModel","ObjectId":0},{"ObjectName":"gfxProcess","ObjectId":6},{"ObjectName":"Outlet","ObjectId":1000}],"Sink":[{"ObjectName":"Scenario::ScenarioDocumentModel","ObjectId":1},{"ObjectName":"Scenario::BaseScenario","ObjectId":0},{"ObjectName":"Scenario::IntervalModel","ObjectId":0},{"ObjectName":"gfxProcess","ObjectId":14},{"ObjectName":"Inlet","ObjectId":0}]},{"ObjectName":"Process::Cable","id":18,"Type":0,"Source":[{"ObjectName":"Scenario::ScenarioDocumentModel","ObjectId":1},{"ObjectName":"Scenario::BaseScenario","ObjectId":0},{"ObjectName":"Scenario::IntervalModel","ObjectId":0},{"ObjectName":"avnd_vec3f","ObjectId":15},{"ObjectName":"Outlet","ObjectId":0}],"Sink":[{"ObjectName":"Scenario::ScenarioDocumentModel","ObjectId":1},{"ObjectName":"Scenario::BaseScenario","ObjectId":0},{"ObjectName":"Scenario::IntervalModel","ObjectId":0},{"ObjectName":"light","ObjectId":8},{"ObjectName":"Inlet","ObjectId":13}]},{"ObjectName":"Process::Cable","id":19,"Type":0,"Source":[{"ObjectName":"Scenario::ScenarioDocumentModel","ObjectId":1},{"ObjectName":"Scenario::BaseScenario","ObjectId":0},{"ObjectName":"Scenario::IntervalModel","ObjectId":0},{"ObjectName":"LFO","ObjectId":16},{"ObjectName":"Outlet","ObjectId":0}],"Sink":[{"ObjectName":"Scenario::ScenarioDocumentModel","ObjectId":1},{"ObjectName":"Scenario::BaseScenario","ObjectId":0},{"ObjectName":"Scenario::IntervalModel","ObjectId":0},{"ObjectName":"MicroMapping","ObjectId":17},{"ObjectName":"Inlet","ObjectId":0}]},{"ObjectName":"Process::Cable","id":20,"Type":0,"Source":[{"ObjectName":"Scenario::ScenarioDocumentModel","ObjectId":1},{"ObjectName":"Scenario::BaseScenario","ObjectId":0},{"ObjectName":"Scenario::IntervalModel","ObjectId":0},{"ObjectName":"MicroMapping","ObjectId":17},{"ObjectName":"Outlet","ObjectId":0}],"Sink":[{"ObjectName":"Scenario::ScenarioDocumentModel","ObjectId":1},{"ObjectName":"Scenario::BaseScenario","ObjectId":0},{"ObjectName":"Scenario::IntervalModel","ObjectId":0},{"ObjectName":"avnd_vec3f","ObjectId":15},{"ObjectName":"Inlet","ObjectId":1}]}],"BusIntervals":[]},"Plugins":[{"uuid":"aac1402f-6851-4a1a-ab50-5f213acd1262","Name":"","Author":"","Description":"","Url":"","Platforms":"","Created":"2026-10-05T03:25:00.344Z","LastSaved":"2026-10-05T03:47:06.642Z","Thumbnail":"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","AutomaticThumbnail":true},{"uuid":"1f923578-08c3-49be-9ba9-69c144ee2e32","Refresh":false,"Reconnect":false,"MidiRatio":1.0},{"uuid":"6e610e1f-9de2-4c36-90dd-0ef570002a21","RootNode":{},"Children":[{"Device":{"Name":"Window","Protocol":"5a181207-7d40-4ad8-814e-879fcdf8cc31","Mode":0,"Outputs":[],"InputWidth":1920,"InputHeight":1080,"SwapchainFlag":0,"SwapchainFormat":0},"Children":[{"Address":{"ioType":"<->","ClipMode":"Free","RepetitionFilter":false,"Value":{"String":""},"Domain":{"String":{}},"Name":"screen"}},{"Address":{"ioType":"<->","ClipMode":"Free","RepetitionFilter":false,"Value":{"Vec2f":[100.0,100.0]},"Domain":{},"Name":"position"}},{"Address":{"ClipMode":"Free","RepetitionFilter":false,"Value":{},"Domain":{},"Name":"cursor"},"Children":[{"Address":{"ioType":"<->","ClipMode":"Free","RepetitionFilter":false,"Value":{"Vec2f":[0.0,0.0]},"Domain":{"Float":{"Min":0.0,"Max":1.0}},"Name":"scaled"}},{"Address":{"ioType":"<->","ClipMode":"Free","RepetitionFilter":false,"Value":{"Vec2f":[0.0,0.0]},"Domain":{"Float":{"Min":0.0,"Max":1.0}},"Name":"gl"}},{"Address":{"ioType":"<->","ClipMode":"Free","RepetitionFilter":false,"Value":{"Vec2f":[0.0,0.0]},"Domain":{"Vec2f":{"Min":[0.0,0.0],"Max":[1280.0,270.0],"Values":[[],[]]}},"Name":"absolute"}},{"Address":{"ioType":"<->","ClipMode":"Free","RepetitionFilter":false,"Value":{"Bool":false},"Domain":{},"Name":"visible"}}]},{"Address":{"ClipMode":"Free","RepetitionFilter":false,"Value":{},"Domain":{},"Name":"tablet"},"Children":[{"Address":{"ioType":"<->","ClipMode":"Free","RepetitionFilter":false,"Value":{"Vec2f":[0.0,0.0]},"Domain":{"Float":{"Min":0.0,"Max":1.0}},"Name":"scaled"}},{"Address":{"ioType":"<->","ClipMode":"Free","RepetitionFilter":false,"Value":{"Vec2f":[0.0,0.0]},"Domain":{"Vec2f":{"Min":[0.0,0.0],"Max":[1280.0,270.0],"Values":[[],[]]}},"Name":"absolute"}},{"Address":{"ioType":"<->","ClipMode":"Free","RepetitionFilter":false,"Value":{"Int":0},"Domain":{},"Name":"z"}},{"Address":{"ioType":"<->","ClipMode":"Free","RepetitionFilter":false,"Value":{"Float":0.0},"Domain":{},"Name":"pressure"}},{"Address":{"ioType":"<->","ClipMode":"Free","RepetitionFilter":false,"Value":{"Float":0.0},"Domain":{"Float":{"Min":-1.0,"Max":1.0}},"Name":"tangential"}},{"Address":{"ioType":"<->","ClipMode":"Free","Unit":"angle.degree","RepetitionFilter":false,"Value":{"Float":0.0},"Domain":{"Float":{"Min":-180.0,"Max":180.0}},"Name":"rotation"}},{"Address":{"ioType":"<->","ClipMode":"Free","Unit":"angle.degree","RepetitionFilter":false,"Value":{"Float":0.0},"Domain":{"Float":{"Min":-60.0,"Max":60.0}},"Name":"tilt_x"}},{"Address":{"ioType":"<->","ClipMode":"Free","Unit":"angle.degree","RepetitionFilter":false,"Value":{"Float":0.0},"Domain":{"Float":{"Min":-60.0,"Max":60.0}},"Name":"tilt_y"}}]},{"Address":{"ioType":"<->","ClipMode":"Free","RepetitionFilter":false,"Value":{"Vec2f":[1280.0,720.0]},"Domain":{},"Name":"size"}},{"Address":{"ioType":"<->","ClipMode":"Free","RepetitionFilter":false,"Value":{"Vec2f":[0.0,0.0]},"Domain":{},"Extended":{"description":"Set to [0, 0] to use the viewport's size"},"Name":"rendersize"}},{"Address":{"ClipMode":"Free","RepetitionFilter":false,"Value":{},"Domain":{},"Name":"key"},"Children":[{"Address":{"ClipMode":"Free","RepetitionFilter":false,"Value":{},"Domain":{},"Name":"press"},"Children":[{"Address":{"ioType":"<->","ClipMode":"Free","RepetitionFilter":false,"Value":{"Int":0},"Domain":{},"Name":"code"}},{"Address":{"ioType":"<->","ClipMode":"Free","RepetitionFilter":false,"Value":{"String":""},"Domain":{},"Name":"text"}}]},{"Address":{"ClipMode":"Free","RepetitionFilter":false,"Value":{},"Domain":{},"Name":"release"},"Children":[{"Address":{"ioType":"<->","ClipMode":"Free","RepetitionFilter":false,"Value":{"Int":0},"Domain":{},"Name":"code"}},{"Address":{"ioType":"<->","ClipMode":"Free","RepetitionFilter":false,"Value":{"String":""},"Domain":{},"Name":"text"}}]}]},{"Address":{"ioType":"<->","ClipMode":"Free","RepetitionFilter":false,"Value":{"Bool":false},"Domain":{},"Name":"fullscreen"}},{"Address":{"ioType":"<->","ClipMode":"Free","RepetitionFilter":false,"Value":{"Float":0.0},"Domain":{},"Name":"fps"}}]}]},{"uuid":"05e72689-e02c-4c9d-a0bf-fe84c32d3d96","Data":""}],"Version":5,"Commit":"29dfd79b77f4453accf771b3491636339ad32982","Tag":"3.8.2"}