From 952074e527cda9cb9e3d09c9ca0397bee35cda86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Micha=C3=ABl=20Celerier?= Date: Tue, 6 Oct 2026 23:35:01 -0400 Subject: [PATCH] examples: custom-pbr uses PBR Mesh's colour controls PBR Mesh now takes its base colour as one RGBA colour and its emission as a colour times Emissive strength, instead of separate channel sliders. The score carries the same values in the new inlets and renders identically. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01JeL19ofVgPe9u9q7J1V9ex --- assets/scores/examples/3d/custom-pbr.score | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/scores/examples/3d/custom-pbr.score b/assets/scores/examples/3d/custom-pbr.score index ae06de32..0cf1fa0a 100644 --- a/assets/scores/examples/3d/custom-pbr.score +++ b/assets/scores/examples/3d/custom-pbr.score @@ -1 +1 @@ -{"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":":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: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":":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":":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":":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":"Create animated materials for 3D objects","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"} \ No newline at end of file +{"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":"8f38638e-9f9f-48b0-ae36-1cba86ef5703","ObjectName":"Inlet","id":5,"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":6,"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":7,"Hidden":true,"Custom":"Roughness","Exposed":"roughness","Value":{"Float":0.37076541781425476},"Init":{"Float":0.5},"Domain":{"Float":{"Min":0.0,"Max":1.0}}},{"uuid":"8f38638e-9f9f-48b0-ae36-1cba86ef5703","ObjectName":"Inlet","id":8,"Hidden":true,"Custom":"Emissive","Exposed":"emissive","Value":{"Vec4f":[0.10000000149011612,0.10000000149011612,0.10000000149011612,1.0]},"Init":{"Vec4f":[0.0,0.0,0.0,1.0]},"Domain":{}},{"uuid":"af2b4fc3-aecb-4c15-a5aa-1c573a239925","ObjectName":"Inlet","id":9,"Hidden":true,"Custom":"Emissive strength","Exposed":"emissive strength","Value":{"Float":0.6570943593978882},"Init":{"Float":1.0},"Domain":{"Float":{"Min":0.0,"Max":100.0}}},{"uuid":"377e8205-b442-4d54-8832-3761def522b2","ObjectName":"Inlet","id":10,"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":11,"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":12,"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":[9.999999747378752e-06,9.999999747378752e-06,9.999999747378752e-06],"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":":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: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":":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":":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":":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":"Create animated materials for 3D objects","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"} \ No newline at end of file