@hology/core 0.0.246 → 0.0.247

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/gameplay/actors/builtin/components/index.d.ts +2 -0
  2. package/dist/gameplay/actors/builtin/components/index.js +1 -1
  3. package/dist/gameplay/actors/builtin/components/spline-component.d.ts +65 -0
  4. package/dist/gameplay/actors/builtin/components/spline-component.js +4 -0
  5. package/dist/gameplay/actors/builtin/index.d.ts +6 -0
  6. package/dist/gameplay/actors/builtin/index.js +1 -1
  7. package/dist/gameplay/actors/builtin/navmesh-actor.js +1 -1
  8. package/dist/gameplay/actors/builtin/spline-actor.d.ts +6 -0
  9. package/dist/gameplay/actors/builtin/spline-actor.js +4 -0
  10. package/dist/gameplay/actors/builtin/water-spline-volume-actor.d.ts +13 -0
  11. package/dist/gameplay/actors/builtin/water-spline-volume-actor.js +4 -0
  12. package/dist/gameplay/actors/builtin/water-volume-actor.d.ts +8 -0
  13. package/dist/gameplay/actors/builtin/water-volume-actor.js +4 -0
  14. package/dist/gameplay/actors/index.d.ts +4 -0
  15. package/dist/gameplay/actors/index.js +1 -1
  16. package/dist/gameplay/ai/build-tile.d.ts +3 -1
  17. package/dist/gameplay/ai/build-tile.js +1 -1
  18. package/dist/gameplay/ai/dynamic-tiled-navmesh.d.ts +4 -21
  19. package/dist/gameplay/ai/dynamic-tiled-navmesh.js +1 -1
  20. package/dist/gameplay/ai/dynamic-tiled-navmesh.worker.d.ts +10 -1
  21. package/dist/gameplay/ai/dynamic-tiled-navmesh.worker.js +1 -1
  22. package/dist/gameplay/ai/index.d.ts +1 -0
  23. package/dist/gameplay/ai/index.js +1 -1
  24. package/dist/gameplay/ai/navigation-areas.d.ts +22 -0
  25. package/dist/gameplay/ai/navigation-areas.js +4 -0
  26. package/dist/gameplay/ai/navigation.d.ts +28 -4
  27. package/dist/gameplay/ai/navigation.js +1 -1
  28. package/dist/index.d.ts +2 -0
  29. package/dist/index.js +1 -1
  30. package/dist/shader/graph/compiler.js +1 -1
  31. package/dist/shader/graph/model.d.ts +1 -1
  32. package/dist/shader/graph/registry.js +1 -1
  33. package/dist/test/build-tile.test.js +1 -1
  34. package/dist/test/navmesh-worker-pool.test.js +1 -1
  35. package/dist/test/node-material-webgpu-resolver.test.js +1 -1
  36. package/dist/test/shader-graph.test.js +1 -1
  37. package/dist/test/spline-component.test.d.ts +2 -0
  38. package/dist/test/spline-component.test.js +4 -0
  39. package/dist/test/water-spline-volume-actor.test.d.ts +2 -0
  40. package/dist/test/water-spline-volume-actor.test.js +4 -0
  41. package/dist/test/worker-task-executor.test.d.ts +2 -0
  42. package/dist/test/worker-task-executor.test.js +4 -0
  43. package/dist/worker/index.d.ts +11 -2
  44. package/dist/worker/index.js +1 -1
  45. package/dist/worker/task-executor.d.ts +22 -0
  46. package/dist/worker/task-executor.js +4 -0
  47. package/dist/worker/task-worker.d.ts +3 -0
  48. package/dist/worker/task-worker.js +4 -0
  49. package/dist/worker/task.d.ts +39 -0
  50. package/dist/worker/task.js +4 -0
  51. package/package.json +1 -1
  52. package/tsconfig.tsbuildinfo +1 -1
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export{loadScene}from"./scene/bootstrap.js";export{BaseGameController}from"./controllers/base-game-controller.js";export*from"./scene/collision/collision-shape.js";export{AssetMeshInstance}from"./scene/asset-resource-loader.js";export{registerWorker,initWorker}from"./worker/index.js";export*from"./shader/index.js";export*from"./gameplay/actors/builtin/post-process-volume-actor.js";export*from"./scene/objects/prefab.js";export*from"./scene/objects/data-asset.js";export*from"./effects/sequence/index.js";export*from"./data/surface-definition.js";export*from"./scene/surface-query.js";/*
1
+ export{loadScene}from"./scene/bootstrap.js";export{BaseGameController}from"./controllers/base-game-controller.js";export*from"./scene/collision/collision-shape.js";export{AssetMeshInstance}from"./scene/asset-resource-loader.js";export{registerWorker,initWorker}from"./worker/index.js";export*from"./shader/index.js";export*from"./gameplay/actors/builtin/post-process-volume-actor.js";export*from"./gameplay/actors/builtin/water-volume-actor.js";export*from"./gameplay/actors/builtin/water-spline-volume-actor.js";export*from"./scene/objects/prefab.js";export*from"./scene/objects/data-asset.js";export*from"./effects/sequence/index.js";export*from"./data/surface-definition.js";export*from"./scene/surface-query.js";/*
2
2
  * Copyright (©) 2026 Hology Interactive AB. All rights reserved.
3
3
  * See the LICENSE.md file for details.
4
4
  */
@@ -1,4 +1,4 @@
1
- import{BackSide as e,Color as t,DataTexture as a,DoubleSide as r,FrontSide as i,Matrix4 as u,RGBAFormat as o,Texture as n,Vector2 as s,Vector3 as l,Vector4 as p}from"three";import{BooleanNode as c,FloatNode as h,IntNode as v,Mat4Node as y,NodeShaderMaterial as d,RgbNode as m,RgbaNode as f,Sampler2DNode as g,Texture2dLookupNode as b,UniformFloatNode as x,Vec2Node as w,Vec3Node as S,Vec4Node as T,abs as I,acos as M,asin as O,attributes as C,atan as k,atan2 as N,autoVarying as G,bulge as E,bool as U,ceil as B,clamp as $,colorToNormal as P,cos as z,cross as V,degrees as A,distance as L,dot as D,exp as j,exp2 as R,float as q,floor as F,fract as H,inversesqrt as _,batchingMatrix as W,colorGradientSampler as Y,curveSampler as J,ifDefApply as K,sampleNamedEasingCurve as Q,length as X,LayerMixMode as Z,log as ee,log2 as te,mat4 as ae,max as re,min as ie,mix as ue,mixColorsByLayer as oe,particleUniforms as ne,mod as se,normalize as le,pow as pe,radians as ce,rgba as he,rgb as ve,saturate as ye,select as de,sign as me,sin as fe,smoothstep as ge,sqrt as be,standardMaterial as xe,stylizedCharacterMaterial as we,scaleTransform as Se,step as Te,tan as Ie,textureSampler2d as Me,timeUniforms as Oe,toonMaterial as Ce,translate as ke,transformed as Ne,triplanarMapping as Ge,twirl as Ee,uniformFloat as Ue,uniforms as Be,varyingAttributes as $e,vec2 as Pe,vec3 as ze,vec4 as Ve,getPaintedMaterialLayerWeight as Ae}from"../../shader-nodes/index.js";import{isWgslCompiler as Le}from"three-shader-graph";import{SpriteNodeShaderMaterial as De,getSpritePosition as je}from"../sprite-shader.js";import{oneMinus as Re}from"../../shader-nodes/index.js";import{vectorToRadial as qe,remap as Fe,hueShift as He,blendColor as _e,desaturateColor as We}from"../../shader-nodes/math.js";import{rectangleFloat as Ye,roundedRectangleFloat as Je}from"../../shader-nodes/shapes.js";import{edgeDepthEffect as Ke,fresnelEffect as Qe,depthFadeEffect as Xe}from"../../shader-nodes/effects.js";import{fragmentLinearEyeDepth as Ze,sampleSceneDepth as et,sampleSceneLinearEyeDepth as tt,screenUV as at,nearUniformName as rt,farUniformName as it}from"../../shader-nodes/depth.js";import{sampleSceneColor as ut}from"../../shader-nodes/scene-sample.js";import{decalDiscard as ot,decalUV as nt}from"../../shader-nodes/decal.js";import{sampledSurfaceRejectsDecals as st}from"../../shader-nodes/material-flags.js";import{Trail as lt,trailUV as pt}from"../../effects/vfx/trail-renderer.js";import{SimplexNoiseNode as ct,Voronoi2d as ht,rotateAxis as vt}from"../../shader-nodes/index.js";import{flipbookUv as yt}from"../../shader-nodes/texture-sequence.js";import{parallaxOcclusionMapping as dt}from"../../shader-nodes/pom.js";import{defaultInlineLiteralValueForPort as mt,inlineLiteralTypeForPort as ft,SHADER_GRAPH_NODE_DEFINITIONS as gt}from"./registry.js";import{shaderGraphParameterTypeToValueType as bt}from"./parameters.js";import{attributeVec2 as xt,varying as wt,reflect as St,refract as Tt,dFdx as It,dFdy as Mt,fwidth as Ot,uniformAmbient as Ct,uniformDirectionalLights as kt}from"three-shader-graph";import{decalNormal as Nt}from"../../shader-nodes/decal.js";import{Curve2 as Gt}from"../../utils/curve.js";const Et=(()=>{const e=new a(new Uint8Array([255,255,255,255]),1,1,o);return e.name="Missing shader graph texture parameter fallback",e.needsUpdate=!0,e})(),Ut=new Set;const Bt=new class extends v{compile(e){return{out:Le(e)?"i32(rendererDirectionalLightCount())":"NUM_DIR_LIGHTS"}}};export class ShaderGraphCompileError extends Error{constructor(e,t,a){super(e),this.nodeId=t,this.port=a,this.name="ShaderGraphCompileError"}}export const shaderGraphPostProcessWeightUniformName="hology_post_process_weight";export class ShaderGraphCompiler{constructor(e,t={}){this.graph=e,this.options=t,this.compiled=new Map,this.compiling=new Set,this.nodesById=new Map((e.nodes??[]).map(e=>[e.id,e]))}validate(){this.compile()}compile(){if(1!==this.graph.version)throw new ShaderGraphCompileError(`Unsupported shader graph version ${this.graph.version}`);return this.validateEdges(),this.validateNamedReroutes(),{output:this.compileOutput(),nodes:this.compiled}}validateEdges(){for(const e of this.graph.edges??[]){if(!this.nodesById.has(e.from.nodeId))throw new ShaderGraphCompileError(`Edge references missing source node "${e.from.nodeId}"`,e.from.nodeId,e.from.port);if(!this.nodesById.has(e.to.nodeId))throw new ShaderGraphCompileError(`Edge references missing target node "${e.to.nodeId}"`,e.to.nodeId,e.to.port)}}validateNamedReroutes(){for(const e of this.graph.nodes??[])"utility.namedRerouteUsage"===e.kind&&this.namedRerouteDeclaration(e)}compileOutput(){if("postProcess"===this.graph.target)return this.compilePostProcessOutput();const e=this.graph.outputs?.color,t={color:null!=e?this.toColorOutput(this.resolveOutputBinding(e,"color")):he("#ffffff",1),transparent:zt(this.graph)},a=this.graph.outputs?.opacity;null!=a&&(t.opacity=this.expectType(this.resolveOutputBinding(a,"opacity"),["float"],"opacity").value);const r=this.graph.outputs?.roughness;null!=r&&(t.roughness=this.expectType(this.resolveOutputBinding(r,"roughness"),["float"],"roughness").value);const i=this.graph.outputs?.metalness;null!=i&&(t.metalness=this.floatOutput(i,"metalness"));const u=this.graph.outputs?.normal;null!=u&&(t.normal=this.toVec3Output(this.resolveOutputBinding(u,"normal"),"normal"));const o=this.graph.outputs?.emissive;null!=o&&(t.emissive=this.toVec3Output(this.resolveOutputBinding(o,"emissive"),"emissive"));const n=this.graph.outputs?.ambientOcclusion;null!=n&&(t.ambientOcclusion=this.floatOutput(n,"ambientOcclusion"));const s=this.graph.outputs?.ambientOcclusionIntensity;null!=s&&(t.ambientOcclusionIntensity=this.floatOutput(s,"ambientOcclusionIntensity"));const l=this.graph.outputs?.sheenColor;null!=l&&(t.sheenColor=this.toVec3Output(this.resolveOutputBinding(l,"sheenColor"),"sheenColor"));const p=this.graph.outputs?.sheenRoughness;null!=p&&(t.sheenRoughness=this.floatOutput(p,"sheenRoughness"));const c=this.graph.outputs?.anisotropy;null!=c&&(t.anisotropy=this.floatOutput(c,"anisotropy"));const h=this.graph.outputs?.anisotropyDirection;null!=h&&(t.anisotropyDirection=this.expectType(this.resolveOutputBinding(h,"anisotropyDirection"),["vec2"],"anisotropyDirection").value);const v=this.graph.outputs?.bakedLight;null!=v&&(t.bakedLight=this.toVec3Output(this.resolveOutputBinding(v,"bakedLight"),"bakedLight"));const y=["shadowTint","subsurfaceColor","eyeIrisColor","eyeHighlightColor","rimColor"];for(const e of y){const a=this.graph.outputs?.[e];null!=a&&(t[e]=this.toVec3Output(this.resolveOutputBinding(a,e),e))}const d=["shadowThreshold","shadowSoftness","specularIntensity","specularToonness","specularThreshold","specularSoftness","environmentSpecularIntensity","skinMask","thickness","subsurfaceStrength","subsurfaceWrap","faceMask","faceShadow","faceShadowStrength","faceShadowSoftness","faceShadowOffset","rimMask","rimStrength","rimPower","rimThreshold","rimSoftness"];for(const e of d){const a=this.graph.outputs?.[e];null!=a&&(t[e]=this.floatOutput(a,e))}const m=this.graph.outputs?.transform;null!=m&&"decal"!==this.graph.target&&(t.transform=this.toMat4Output(this.resolveOutputBinding(m,"transform"),"transform"));const f=this.graph.outputs?.discard;null!=f&&(t.discard=this.expectType(this.resolveOutputBinding(f,"discard"),["boolean"],"discard").value);const g=this.graph.outputs?.transparent;null!=g&&null!=g.value&&(t.transparent=Boolean(g.value));const b=this.graph.outputs?.alphaTest;return null!=b&&null!=b.value?t.alphaTest=Number(b.value):null!=this.graph.materialOptions?.alphaTest&&(t.alphaTest=this.graph.materialOptions.alphaTest),this.applyShadingModel(t)}compilePostProcessOutput(){const e=this.screenUv(),t=this.graph.outputs?.color,a=null!=t?this.toColorOutput(this.resolveOutputBinding(t,"color")):ut(e),r=this.graph.outputs?.opacity;return $t(a,null!=r?this.expectType(this.resolveOutputBinding(r,"opacity"),["float"],"opacity").value:void 0,e)}screenUv(){return this.options.screenUV??at}applyShadingModel(e){const t=null!=e.opacity?function(e,t){if(e instanceof h)return he(ze(e,e,e),t);if(e instanceof w)return he(ze(e.x,e.y,0),t);if(e instanceof T)return he(e.rgb,e.w.multiply(t));return he(e,t)}(e.color,e.opacity):e.color;switch(this.graph.shadingModel??"standard"){case"standard":{const a={color:Dt(t),roughness:e.roughness??q(.5),...null!=e.metalness?{metalness:e.metalness}:{},..."decal"===this.graph.target?{normal:le(wt(Be.normalMatrix).multiplyVec(Nt))}:{},...null!=e.normal?{normal:e.normal}:{},...null!=e.emissive?{emissive:jt(e.emissive)}:{},...null!=e.ambientOcclusion?{ambientOcclusion:e.ambientOcclusion}:{},...null!=e.ambientOcclusionIntensity?{ambientOcclusionIntensity:e.ambientOcclusionIntensity}:{},...null!=e.sheenColor?{sheenColor:e.sheenColor.rgb}:{},...null!=e.sheenRoughness?{sheenRoughness:e.sheenRoughness}:{},...null!=e.anisotropy?{anisotropy:e.anisotropy}:{},...null!=e.anisotropyDirection?{anisotropyDirection:e.anisotropyDirection}:{},...null!=e.bakedLight?{bakedLight:e.bakedLight}:{}};return{...e,color:xe(a)}}case"toon":{const a={color:Dt(t),...null!=e.normal?{normal:e.normal}:{},...null!=e.emissive?{emissive:jt(e.emissive)}:{},...null!=e.ambientOcclusion?{ambientOcclusion:e.ambientOcclusion}:{},...null!=e.ambientOcclusionIntensity?{ambientOcclusionIntensity:e.ambientOcclusionIntensity}:{},...null!=e.bakedLight?{bakedLight:e.bakedLight}:{}};return{...e,color:Ce(a)}}case"stylizedCharacter":{const a={color:Dt(t),shadowTint:e.shadowTint??ve(9212589),shadowThreshold:e.shadowThreshold??.05,shadowSoftness:e.shadowSoftness??.12,roughness:e.roughness??1,specularIntensity:e.specularIntensity??1,specularToonness:e.specularToonness??.2,specularThreshold:e.specularThreshold??.08,specularSoftness:e.specularSoftness??.025,environmentSpecularIntensity:e.environmentSpecularIntensity??.25,skinMask:e.skinMask??0,thickness:e.thickness??0,subsurfaceColor:e.subsurfaceColor??ve(12209973),subsurfaceStrength:e.subsurfaceStrength??.6,subsurfaceWrap:e.subsurfaceWrap??.25,backscatterStrength:e.backscatterStrength??.75,backscatterPower:e.backscatterPower??3,faceMask:e.faceMask??0,faceShadow:e.faceShadow??.5,faceShadowStrength:e.faceShadowStrength??.2,faceShadowSoftness:e.faceShadowSoftness??.08,faceShadowOffset:e.faceShadowOffset??0,eyeMask:e.eyeMask??0,irisMask:e.irisMask??0,eyeHighlightMask:e.eyeHighlightMask??0,eyeLowerLightMask:e.eyeLowerLightMask??0,eyeBrightness:e.eyeBrightness??1.15,eyeIrisColor:e.eyeIrisColor??ve(6535423),eyeIrisGlow:e.eyeIrisGlow??.18,eyeHighlightColor:e.eyeHighlightColor??ve(16777215),eyeHighlightStrength:e.eyeHighlightStrength??.65,rimMask:e.rimMask??1,rimColor:e.rimColor??ve(12179967),rimStrength:e.rimStrength??.08,rimPower:e.rimPower??2.5,rimThreshold:e.rimThreshold??.45,rimSoftness:e.rimSoftness??.08,...null!=e.normal?{normal:e.normal}:{},...null!=e.emissive?{emissive:jt(e.emissive)}:{},...null!=e.ambientOcclusion?{ambientOcclusion:e.ambientOcclusion}:{},...null!=e.ambientOcclusionIntensity?{ambientOcclusionIntensity:e.ambientOcclusionIntensity}:{},...null!=e.bakedLight?{bakedLight:e.bakedLight}:{}};return{...e,color:we(a)}}case"unlit":return{...e,color:t}}}compileNode(e){const t=this.compiled.get(e);if(null!=t)return t;const a=this.nodesById.get(e);if(null==a)throw new ShaderGraphCompileError(`Missing shader graph node "${e}"`,e);if(null==gt[a.kind])throw new ShaderGraphCompileError(`Unsupported shader graph node "${a.kind}"`,a.id);if(this.compiling.has(e))throw new ShaderGraphCompileError(`Shader graph contains a cycle involving node "${e}"`,e);this.compiling.add(e);try{const t=this.compileNodeInternal(a);return this.compiled.set(e,t),t}finally{this.compiling.delete(e)}}compileNodeInternal(e){switch(e.kind){case"input.parameter":return this.output(e,this.compileParameterNode(e));case"input.slider":return this.output(e,{value:{type:"float",value:q(Qt(qt(e,"value",.5)))}});case"constant.boolean":return this.output(e,{value:{type:"boolean",value:U(Boolean(Rt(e,"value",!1)))}});case"constant.float":return this.output(e,{value:{type:"float",value:q(qt(e,"value",0))}});case"constant.vec2":return this.output(e,{value:{type:"vec2",value:ea(Rt(e,"value",[0,0]))}});case"constant.vec3":return this.output(e,{value:{type:"vec3",value:ta(Rt(e,"value",[0,0,0]))}});case"constant.rgba":return this.output(e,{value:{type:"rgba",value:aa(Rt(e,"value","#ffffff"),qt(e,"alpha",1))}});case"builtin.uv":{let t;return t="trail"===this.graph.target?pt:"decal"===this.graph.target?nt:this.uvAttribute(e),this.output(e,{value:{type:"vec2",value:!0===Rt(e,"flipY",!1)?Pe(t.x,Re(t.y)):t},u:{type:"float",value:t.x},v:{type:"float",value:t.y}})}case"builtin.screenUv":return this.output(e,{value:{type:"vec2",value:this.screenUv()}});case"builtin.color":{const t=G(C.color);return this.output(e,{value:{type:"rgba",value:t},rgb:{type:"rgb",value:t.rgb},r:{type:"float",value:t.r},g:{type:"float",value:t.g},b:{type:"float",value:t.b},a:{type:"float",value:t.a}})}case"builtin.position":{const t=G(C.position);return this.output(e,{value:{type:"vec3",value:t},x:{type:"float",value:t.x},y:{type:"float",value:t.y},z:{type:"float",value:t.z}})}case"builtin.worldPosition":{const t=G(Ne.worldPosition);return this.output(e,{value:{type:"vec3",value:t},x:{type:"float",value:t.x},y:{type:"float",value:t.y},z:{type:"float",value:t.z}})}case"builtin.objectPosition":{let t=Be.instanceMatrix.multiplyVec(Ve(0,0,0,1));t=K("USE_BATCHING",t,e=>W.multiplyVec(e));const a=G(Be.modelMatrix.multiplyVec(t).xyz);return this.output(e,{value:{type:"vec3",value:a},x:{type:"float",value:a.x},y:{type:"float",value:a.y},z:{type:"float",value:a.z}})}case"builtin.viewDir":{const t=G(Ne.viewDir);return this.output(e,{value:{type:"vec3",value:t},x:{type:"float",value:t.x},y:{type:"float",value:t.y},z:{type:"float",value:t.z}})}case"builtin.normal":{const t=G(C.normal);return this.output(e,{value:{type:"vec3",value:t},x:{type:"float",value:t.x},y:{type:"float",value:t.y},z:{type:"float",value:t.z}})}case"builtin.time":return this.output(e,{value:{type:"float",value:Oe.elapsed}});case"builtin.camera":{const t=Ue(rt),a=Ue(it),r=Be.cameraPosition;return this.output(e,{position:{type:"vec3",value:r},x:{type:"float",value:r.x},y:{type:"float",value:r.y},z:{type:"float",value:r.z},near:{type:"float",value:t},far:{type:"float",value:a}})}case"builtin.viewMatrix":return this.output(e,{value:{type:"mat4",value:Be.viewMatrix}});case"builtin.projectionMatrix":return this.output(e,{value:{type:"mat4",value:Be.projectionMatrix}});case"builtin.modelViewMatrix":return this.output(e,{value:{type:"mat4",value:Be.modelViewMatrix}});case"scene.ambientLight":return this.output(e,{color:{type:"rgb",value:Ct}});case"scene.directionalLight":return this.output(e,{color:{type:"rgb",value:kt.sum(e=>e.color).divideScalar(re(q(Bt),q(1)))},direction:{type:"vec3",value:kt.sum(e=>e.direction).divideScalar(re(q(Bt),q(1)))}});case"builtin.particle":return this.output(e,{energy:{type:"float",value:ne.energy},color:{type:"rgb",value:ne.color},opacity:{type:"float",value:ne.opacity},time:{type:"float",value:ne.time}});case"math.add":case"math.subtract":case"math.multiply":case"math.divide":return this.output(e,{value:this.compileBinaryMath(e)});case"math.oneMinus":{const t=this.expectNumeric(this.input(e,"value"));return this.output(e,{value:{type:t.type,value:Re(t.value)}})}case"math.abs":return this.output(e,{value:this.compileUnaryMath(e,I)});case"math.sign":return this.output(e,{value:this.compileUnaryMath(e,me)});case"math.floor":return this.output(e,{value:this.compileUnaryMath(e,F)});case"math.ceil":return this.output(e,{value:this.compileUnaryMath(e,B)});case"math.fract":return this.output(e,{value:this.compileUnaryMath(e,H)});case"math.sin":return this.output(e,{value:this.compileUnaryMath(e,fe)});case"math.cos":return this.output(e,{value:this.compileUnaryMath(e,z)});case"math.tan":return this.output(e,{value:this.compileUnaryMath(e,Ie)});case"math.asin":return this.output(e,{value:this.compileUnaryMath(e,O)});case"math.acos":return this.output(e,{value:this.compileUnaryMath(e,M)});case"math.atan":return this.output(e,{value:this.compileUnaryMath(e,k)});case"math.atan2":return this.output(e,{value:this.compileAtan2(e)});case"math.radians":return this.output(e,{value:this.compileUnaryMath(e,ce)});case"math.degrees":return this.output(e,{value:this.compileUnaryMath(e,A)});case"math.sqrt":return this.output(e,{value:this.compileUnaryMath(e,be)});case"math.inverseSqrt":return this.output(e,{value:this.compileUnaryMath(e,_)});case"math.exp":return this.output(e,{value:this.compileUnaryMath(e,j)});case"math.exp2":return this.output(e,{value:this.compileUnaryMath(e,R)});case"math.log":return this.output(e,{value:this.compileUnaryMath(e,ee)});case"math.log2":return this.output(e,{value:this.compileUnaryMath(e,te)});case"math.saturate":return this.output(e,{value:this.compileUnaryMath(e,ye)});case"math.length":{const t=this.expectNumeric(this.input(e,"value"));return this.output(e,{value:{type:"float",value:X(t.value)}})}case"math.normalize":return this.output(e,{value:this.compileUnaryMath(e,le)});case"math.clamp":{const t=this.expectNumeric(this.input(e,"value")),a=this.expectNumeric(this.input(e,"min",{type:"float",value:q(0)})),r=this.expectNumeric(this.input(e,"max",{type:"float",value:q(1)}));return this.output(e,{value:{type:t.type,value:$(t.value,a.value,r.value)}})}case"math.min":return this.output(e,{value:this.compileBinaryFunction(e,ie)});case"math.max":return this.output(e,{value:this.compileBinaryFunction(e,re)});case"math.pow":return this.output(e,{value:this.compileBinaryFunction(e,pe)});case"math.mod":return this.output(e,{value:this.compileBinaryFunction(e,se)});case"math.step":return this.output(e,{value:this.compileBinaryFunction(e,Te,!0)});case"math.smoothstep":{const t=this.expectNumeric(this.input(e,"edge0",{type:"float",value:q(0)})),a=this.expectNumeric(this.input(e,"edge1",{type:"float",value:q(1)})),r=this.expectNumeric(this.input(e,"value"));return this.output(e,{value:{type:r.type,value:ge(t.value,a.value,r.value)}})}case"math.mix":{const t=this.expectNumeric(this.input(e,"a")),a=this.expectNumeric(this.input(e,"b")),r=this.expectNumeric(this.input(e,"t",{type:"float",value:q(.5)})),i=Wt(t.type,a.type,e.id);return this.output(e,{value:{type:i,value:ue(t.value,a.value,r.value)}})}case"math.remap":{const t=this.expectType(this.input(e,"value"),["float"],e.id,"value").value,a=this.floatInput(e,"inMin",-1),r=this.floatInput(e,"inMax",1),i=this.floatInput(e,"outMin",0),u=this.floatInput(e,"outMax",1);return this.output(e,{value:{type:"float",value:Fe(t,a,r,i,u)}})}case"math.select":{const t=this.boolInput(e,"condition",!1),a=this.expectNumeric(this.input(e,"a")),r=this.expectNumeric(this.input(e,"b")),i=Wt(a.type,r.type,e.id);return this.output(e,{value:{type:i,value:de(t,a.value,r.value)}})}case"math.reflect":{const t=this.expectType(this.input(e,"incident"),["vec2","vec3","vec4","rgb","rgba"],e.id,"incident"),a=this.expectType(this.input(e,"normal"),["vec2","vec3","vec4","rgb","rgba"],e.id,"normal");return this.output(e,{value:{type:t.type,value:St(t.value,a.value)}})}case"math.refract":{const t=this.expectType(this.input(e,"incident"),["vec2","vec3","vec4","rgb","rgba"],e.id,"incident"),a=this.expectType(this.input(e,"normal"),["vec2","vec3","vec4","rgb","rgba"],e.id,"normal"),r=this.floatInput(e,"ior",1.5);return this.output(e,{value:{type:t.type,value:Tt(t.value,a.value,r)}})}case"math.derivative":{const t=this.expectNumeric(this.input(e,"value")),a=String(Rt(e,"mode","fwidth"));let r;return r="dFdx"===a?It(t.value):"dFdy"===a?Mt(t.value):Ot(t.value),this.output(e,{value:{type:t.type,value:r}})}case"layer.mixPainted":return this.output(e,{value:this.compilePaintedLayerMix(e)});case"math.dot":{const t=this.expectNumeric(this.input(e,"a")),a=this.expectNumeric(this.input(e,"b"));return Wt(t.type,a.type,e.id),this.output(e,{value:{type:"float",value:D(t.value,a.value)}})}case"math.distance":{const t=this.expectNumeric(this.input(e,"a")),a=this.expectNumeric(this.input(e,"b"));return Wt(t.type,a.type,e.id),this.output(e,{value:{type:"float",value:L(t.value,a.value)}})}case"math.cross":{const t=this.expectType(this.input(e,"a"),["vec3","rgb"],e.id,"a"),a=this.expectType(this.input(e,"b"),["vec3","rgb"],e.id,"b");return this.output(e,{value:{type:"vec3",value:V(t.value,a.value)}})}case"compare.greaterThan":case"compare.greaterThanOrEqual":case"compare.lessThan":case"compare.lessThanOrEqual":case"compare.equal":case"compare.notEqual":return this.output(e,{value:{type:"boolean",value:this.compileComparison(e)}});case"boolean.not":{const t=this.boolInput(e,"value",!1);return this.output(e,{value:{type:"boolean",value:de(t,U(!1),U(!0))}})}case"boolean.and":return this.output(e,{value:{type:"boolean",value:this.compileBooleanBinary(e,"and")}});case"boolean.or":return this.output(e,{value:{type:"boolean",value:this.compileBooleanBinary(e,"or")}});case"compose.vec2":return this.output(e,{value:{type:"vec2",value:Pe(this.floatInput(e,"x",0),this.floatInput(e,"y",0))}});case"compose.vec3":return this.output(e,{value:{type:"vec3",value:ze(this.floatInput(e,"x",0),this.floatInput(e,"y",0),this.floatInput(e,"z",0))}});case"compose.vec4":return this.output(e,{value:{type:"vec4",value:Ve(this.floatInput(e,"x",0),this.floatInput(e,"y",0),this.floatInput(e,"z",0),this.floatInput(e,"w",0))}});case"compose.rgba":return this.output(e,{value:{type:"rgba",value:Ve(this.floatInput(e,"r",1),this.floatInput(e,"g",1),this.floatInput(e,"b",1),this.floatInput(e,"a",1))}});case"decompose.component":{const t=this.expectNumeric(this.input(e,"value")),a=String(Rt(e,"component","x"));return this.output(e,{value:{type:"float",value:Jt(t,a,e.id)}})}case"decompose.split":{const t=this.expectNumeric(this.input(e,"value"));return this.output(e,function(e,t){const a={},r=(r,i)=>{a[r]={type:"float",value:Jt(e,i,t)}};switch(e.type){case"vec2":return r("x","x"),r("y","y"),r("u","x"),r("v","y"),a;case"vec3":return r("x","x"),r("y","y"),r("z","z"),a;case"rgb":return r("r","r"),r("g","g"),r("b","b"),r("x","x"),r("y","y"),r("z","z"),a;case"vec4":return r("x","x"),r("y","y"),r("z","z"),r("w","w"),a;case"rgba":return r("r","r"),r("g","g"),r("b","b"),r("a","a"),r("x","x"),r("y","y"),r("z","z"),r("w","w"),a;case"float":return a.x={type:"float",value:e.value},a}}(t,e.id))}case"color.gradient":{const t=this.expectType(this.input(e,"t",{type:"float",value:q(.5)}),["float"],e.id,"t"),a=Y(function(e){const t=Rt(e,"stops",[]);if(!Array.isArray(t))return[];const a=t.map((e,a)=>{if(null==e||"object"!=typeof e||Array.isArray(e))return;const r=e,i="string"==typeof r.color?r.color:"#ffffff";return{position:Xt(r.position,ra(a,t.length)),color:i,alpha:Xt(r.alpha,1)}}).filter(e=>null!=e);return a.length>0?a:[]}(e)).sample(t.value);return this.output(e,{value:{type:"rgba",value:a}})}case"utility.curve":{const t=this.expectType(this.input(e,"t",{type:"float",value:q(.5)}),["float"],e.id,"t"),a=Rt(e,"curve","Linear"),r=Q(a,t.value)??J(Gt.decode(a)).sample(t.value);return this.output(e,{value:{type:"float",value:r}})}case"utility.namedRerouteDeclaration":return this.output(e,{value:this.input(e,"value")});case"utility.namedRerouteUsage":{const t=this.compileNode(this.namedRerouteDeclaration(e).id);return this.output(e,{value:t.outputs.value})}case"color.hueShift":{const t=this.expectType(this.input(e,"color"),["rgba","rgb","vec4","vec3"],e.id,"color"),a=t.value,r="rgba"===t.type||"vec4"===t.type?a.rgb??a.xyz:a,i=this.floatInput(e,"shift",0),u=He(r,i);return"rgba"===t.type||"vec4"===t.type?this.output(e,{value:{type:t.type,value:Ve(u,a.a??a.w)}}):this.output(e,{value:{type:t.type,value:u}})}case"color.blend":{const t=this.expectType(this.input(e,"base"),["rgba","rgb","vec4","vec3"],e.id,"base"),a=this.expectType(this.input(e,"blend"),["rgba","rgb","vec4","vec3"],e.id,"blend"),r=String(Rt(e,"mode","multiply")),i=t.value,u=a.value,o="rgba"===t.type||"vec4"===t.type?i.rgb??i.xyz:i,n="rgba"===a.type||"vec4"===a.type?u.rgb??u.xyz:u;let s=_e(o,n,r);if("rgba"===a.type||"vec4"===a.type){const e=u.a??u.w;s=ue(o,s,e)}if("rgba"===t.type||"vec4"===t.type){const a=i.a??i.w;return this.output(e,{value:{type:t.type,value:Ve(s,a)}})}return this.output(e,{value:{type:t.type,value:s}})}case"color.desaturate":{const t=this.expectType(this.input(e,"color"),["rgba","rgb","vec4","vec3"],e.id,"color"),a=t.value,r="rgba"===t.type||"vec4"===t.type?a.rgb??a.xyz:a,i=this.floatInput(e,"fraction",1),u=We(r,i);return"rgba"===t.type||"vec4"===t.type?this.output(e,{value:{type:t.type,value:Ve(u,a.a??a.w)}}):this.output(e,{value:{type:t.type,value:u}})}case"color.unpackNormal":{const t=this.expectType(this.input(e,"color"),["vec3","vec4","rgb","rgba"],e.id,"color"),a=this.floatInput(e,"scale",1),r=this.optionalInput(e,"normal");return this.output(e,{value:{type:"vec3",value:P(t.value,a,r?this.expectType(r,["vec3"],e.id,"normal").value:void 0)}})}case"texture.sampler2d":{const t=this.input(e,"texture");return this.output(e,{value:this.toSampler(t,e.id)})}case"texture.sample2d":{const t=this.toSampler(this.input(e,"sampler"),e.id),a=this.expectType(this.input(e,"uv",{type:"vec2",value:this.defaultUV()}),["vec2"],e.id,"uv"),r=t.value.sample(a.value);return this.output(e,{rgba:{type:"rgba",value:r},rgb:{type:"rgb",value:r.rgb},r:{type:"float",value:r.r},g:{type:"float",value:r.g},b:{type:"float",value:r.b},a:{type:"float",value:r.a}})}case"texture.triplanarMapping":{const t=this.input(e,"sampler"),a=this.toSampler(t,e.id),r=this.expectType(this.input(e,"scale",{type:"float",value:q(1)}),["float"],e.id,"scale"),i=this.expectType(this.input(e,"normal",{type:"vec3",value:$e.normal}),["vec3"],e.id,"normal"),u=this.expectType(this.input(e,"position",{type:"vec3",value:$e.position}),["vec3"],e.id,"position"),o=Ge(a.value,r.value,i.value,u.value);return this.output(e,{rgba:{type:"rgba",value:o},rgb:{type:"rgb",value:o.rgb},r:{type:"float",value:o.r},g:{type:"float",value:o.g},b:{type:"float",value:o.b},a:{type:"float",value:o.a}})}case"scene.sampleColor":{const t=this.expectType(this.input(e,"uv",{type:"vec2",value:this.screenUv()}),["vec2"],e.id,"uv"),a=ut(t.value);return this.output(e,{rgba:{type:"rgba",value:a},rgb:{type:"rgb",value:a.rgb},r:{type:"float",value:a.r},g:{type:"float",value:a.g},b:{type:"float",value:a.b},a:{type:"float",value:a.a}})}case"scene.sampleDepth":{const t=this.expectType(this.input(e,"uv",{type:"vec2",value:this.screenUv()}),["vec2"],e.id,"uv");return this.output(e,{depth:{type:"float",value:et(t.value)},linearEyeDepth:{type:"float",value:tt(t.value)}})}case"scene.fragmentDepth":return this.output(e,{linearEyeDepth:{type:"float",value:Ze}});case"transform.translate":{const t=this.expectType(this.input(e,"offset",{type:"vec3",value:ze(0,0,0)}),["vec3","rgb"],e.id,"offset");return this.output(e,{value:{type:"mat4",value:ke(t.value)}})}case"transform.scale":{const t=this.expectType(this.input(e,"scale",{type:"vec3",value:ze(1,1,1)}),["vec3","rgb"],e.id,"scale").value;return this.output(e,{value:{type:"mat4",value:Se(t.x,t.y,t.z)}})}case"transform.rotateAxis":{const t=this.expectType(this.input(e,"axis",{type:"vec3",value:ze(0,1,0)}),["vec3","rgb"],e.id,"axis"),a=this.expectType(this.input(e,"angle",{type:"float",value:q(0)}),["float"],e.id,"angle");return this.output(e,{value:{type:"mat4",value:vt(t.value,a.value)}})}case"uv.rotate":{const t=this.expectType(this.input(e,"uv",{type:"vec2",value:this.defaultUV()}),["vec2"],e.id,"uv").value,a=this.expectType(this.input(e,"angle",{type:"float",value:q(0)}),["float"],e.id,"angle").value,r=this.expectType(this.input(e,"center",{type:"vec2",value:Pe(.5,.5)}),["vec2"],e.id,"center").value;return this.output(e,{value:{type:"vec2",value:Yt(t,a,r)}})}case"uv.twirl":{const t=this.expectType(this.input(e,"uv",{type:"vec2",value:this.defaultUV()}),["vec2"],e.id,"uv").value,a=this.expectType(this.input(e,"strength",{type:"float",value:q(1)}),["float"],e.id,"strength").value,r=this.expectType(this.input(e,"center",{type:"vec2",value:Pe(.5,.5)}),["vec2"],e.id,"center").value,i=this.expectType(this.input(e,"offset",{type:"vec2",value:Pe(0,0)}),["vec2"],e.id,"offset").value;return this.output(e,{value:{type:"vec2",value:Ee(t,a,r,i)}})}case"uv.radial":{const t=this.expectType(this.input(e,"uv",{type:"vec2",value:this.defaultUV()}),["vec2"],e.id,"uv").value,a=qe(t.subtractScalar(.5));return this.output(e,{coords:{type:"vec2",value:a.coords},radius:{type:"float",value:a.radius},angle:{type:"float",value:a.angle}})}case"uv.bulge":{const t=this.expectType(this.input(e,"uv",{type:"vec2",value:this.defaultUV()}),["vec2"],e.id,"uv").value,a=this.expectType(this.input(e,"center",{type:"vec2",value:Pe(.5,.5)}),["vec2"],e.id,"center").value,r=this.expectType(this.input(e,"power",{type:"float",value:q(1)}),["float"],e.id,"power").value;return this.output(e,{value:{type:"vec2",value:E(t,a,r)}})}case"uv.flipbook":{const t=this.expectType(this.input(e,"uv",{type:"vec2",value:this.defaultUV()}),["vec2"],e.id,"uv").value,a=this.floatInput(e,"columns",qt(e,"columns",1)),r=this.floatInput(e,"rows",qt(e,"rows",1)),i=this.floatInput(e,"fps",qt(e,"fps",60)),u=this.expectType(this.input(e,"time",{type:"float",value:Oe.elapsed}),["float"],e.id,"time").value,o=String(Rt(e,"mode","clamp"));return this.output(e,{value:{type:"vec2",value:yt(t,a,r,u,i,o)}})}case"uv.pom":{const t=this.expectType(this.input(e,"uv",{type:"vec2",value:this.defaultUV()}),["vec2"],e.id,"uv").value,a=this.input(e,"heightMap"),r=this.toSampler(a,e.id).value,i=this.floatInput(e,"heightScale",.05),u=qt(e,"minLayers",8),o=qt(e,"maxLayers",24);return this.output(e,{value:{type:"vec2",value:dt(t,r,i,u,o)}})}case"shape.rectangle":{const t=this.expectType(this.input(e,"uv",{type:"vec2",value:this.defaultUV()}),["vec2"],e.id,"uv").value;return this.output(e,{value:{type:"float",value:Ye(t,this.floatInput(e,"width",.5),this.floatInput(e,"height",.5))}})}case"shape.roundedRectangle":{const t=this.expectType(this.input(e,"uv",{type:"vec2",value:this.defaultUV()}),["vec2"],e.id,"uv").value;return this.output(e,{value:{type:"float",value:Je(t,this.floatInput(e,"width",.5),this.floatInput(e,"height",.5),this.floatInput(e,"radius",.1))}})}case"noise.simplex":{const t=this.expectType(this.input(e,"uv",{type:"vec2",value:this.defaultUV()}),["vec2"],e.id,"uv").value,a=this.floatInput(e,"scale",8);return this.output(e,{value:{type:"float",value:new ct(t.multiplyScalar(a))}})}case"noise.voronoi2d":{const t=this.expectType(this.input(e,"uv",{type:"vec2",value:this.defaultUV()}),["vec2"],e.id,"uv").value,a=this.floatInput(e,"scale",8);return this.output(e,{value:{type:"float",value:new ht(t.multiplyScalar(a))}})}case"effect.fresnel":return this.output(e,{value:{type:"float",value:G(Qe(this.floatInput(e,"power",1)))}});case"effect.edgeDepth":{const t=this.floatInput(e,"power",1);return this.output(e,{value:{type:"float",value:Ke(t)}})}case"effect.depthFade":{const t=this.floatInput(e,"distance",1);return this.output(e,{value:{type:"float",value:Xe(t)}})}case"util.panner":{const t=this.expectType(this.input(e,"uv",{type:"vec2",value:this.defaultUV()}),["vec2"],e.id,"coord"),a=this.expectType(this.input(e,"speed",{type:"vec2",value:Pe(0,0)}),["vec2"],e.id,"speed"),r=this.expectType(this.input(e,"tile",{type:"vec2",value:Pe(1,1)}),["vec2"],e.id,"tile"),i=this.expectType(this.input(e,"time",{type:"float",value:Oe.elapsed}),["float"],e.id,"time");return this.output(e,{value:{type:"vec2",value:t.value.multiply(r.value).add(a.value.multiplyScalar(i.value))}})}}}compileParameterNode(e){const t=String(Rt(e,"parameter","")),a=this.graph.parameters?.find(e=>e.name===t||e.id===t);if(null==a)throw new ShaderGraphCompileError(`Parameter "${t}" does not exist`,e.id);const r=bt(a.type),i={type:r,value:Ht(this.options.parameters?.[a.name]??a.defaultValue,r,a.name)};if("sampler2d"!==r)return{value:i};const u=this.expectType(this.input(e,"uv",{type:"vec2",value:this.defaultUV()}),["vec2"],e.id,"uv"),o=i.value.sample(u.value);return{value:{type:"rgba",value:o},rgb:{type:"rgb",value:o.rgb},r:{type:"float",value:o.r},g:{type:"float",value:o.g},b:{type:"float",value:o.b},a:{type:"float",value:o.a},sampler:i}}compileBinaryMath(e){const t=this.expectBinaryMathValue(this.input(e,"a")),a=this.expectBinaryMathValue(this.input(e,"b")),r=e.kind.split(".")[1];if("mat4"===t.type||"mat4"===a.type)return function(e,t,a,r){if("mat4"===e.type&&"mat4"===t.type&&"divide"!==a)return{type:"mat4",value:_t(e.value,t.value,a,r)};if("mat4"===e.type&&"float"===t.type&&("multiply"===a||"divide"===a))return{type:"mat4",value:_t(e.value,t.value,a,r)};if("float"===e.type&&"mat4"===t.type&&"multiply"===a)return{type:"mat4",value:_t(t.value,e.value,a,r)};if("mat4"===e.type&&"vec4"===t.type&&"multiply"===a)return{type:"vec4",value:e.value.multiplyVec(t.value)};throw new ShaderGraphCompileError(`Cannot ${a} ${e.type} and ${t.type}`,r)}(t,a,r,e.id);if(t.type===a.type)return{type:t.type,value:_t(t.value,a.value,r,e.id)};if("float"===t.type&&"float"!==a.type&&"multiply"===r)return{type:a.type,value:_t(a.value,t.value,r,e.id)};if("float"!==t.type&&"float"===a.type)return{type:t.type,value:_t(t.value,a.value,r,e.id)};throw new ShaderGraphCompileError(`Cannot ${r} ${t.type} and ${a.type}`,e.id)}expectBinaryMathValue(e){if(!Kt(e.type)&&"mat4"!==e.type)throw new ShaderGraphCompileError(`Expected a numeric value but got ${e.type}`);return e}compileUnaryMath(e,t){const a=this.expectNumeric(this.input(e,"value"));return{type:a.type,value:t(a.value)}}compileAtan2(e){const t=this.expectNumeric(this.input(e,"y")),a=this.expectNumeric(this.input(e,"x"));return{type:function(e,t,a){if(e===t)return e;if("rgb"===e&&"vec3"===t||"vec3"===e&&"rgb"===t)return"vec3";if("rgba"===e&&"vec4"===t||"vec4"===e&&"rgba"===t)return"vec4";throw new ShaderGraphCompileError(`Cannot mix ${e} and ${t}`,a)}(t.type,a.type,e.id),value:N(t.value,a.value)}}compileBinaryFunction(e,t,a=!1){const r=this.expectNumeric(this.input(e,"a")),i=this.expectNumeric(this.input(e,"b"));return{type:a&&"float"===i.type?r.type:Wt(r.type,i.type,e.id),value:t(r.value,i.value)}}compilePaintedLayerMix(e){const t=this.expectNumeric(this.input(e,"base")),a=[t.value],r=[Ae(0)];let i=t.type;for(let t=1;t<=8;t++){const u=this.optionalInput(e,`layer${t}`);if(null==u)continue;const o=this.expectNumeric(u);i=Wt(i,o.type,e.id),a.push(o.value),r.push(Ae(t))}return 1===a.length?t:{type:i,value:oe({layerColors:a,layerWeights:r,enableNoise:Boolean(Rt(e,"enableNoise",!0)),noiseScale:this.floatInput(e,"noiseScale",qt(e,"noiseScale",.1)),noiseAmount:this.floatInput(e,"noiseAmount",qt(e,"noiseAmount",.5)),decay:this.floatInput(e,"softness",qt(e,"softness",.3)),mode:"hard"===String(Rt(e,"mode","soft"))?Z.hard:Z.soft})}}defaultUV(){return"trail"===this.graph.target?pt:"decal"===this.graph.target?nt:G(C.uv)}uvAttribute(e){const t=Math.max(0,Math.floor(qt(e,"channel",0)));return 0===t?$e.uv:wt(xt(`uv${t}`))}namedRerouteDeclaration(e){const t=String(e.params?.declarationId??"");if(0===t.length)throw new ShaderGraphCompileError("Named reroute usage is missing a declaration",e.id);const a=this.nodesById.get(t);if(null==a)throw new ShaderGraphCompileError(`Named reroute declaration "${t}" does not exist`,e.id);if("utility.namedRerouteDeclaration"!==a.kind)throw new ShaderGraphCompileError(`Node "${t}" is not a named reroute declaration`,e.id);return a}input(e,t,a){const r=e.inputs?.[t];if(null!=r)return this.resolveInput(r,e.id,t);const i=(this.graph.edges??[]).find(a=>a.to.nodeId===e.id&&a.to.port===t);if(null!=i)return this.resolveSocket(i.from,e.id,t);if(null!=a)return a;const u=this.inlineLiteralFallback(e,t);if(null!=u)return u;throw new ShaderGraphCompileError(`Missing input "${t}"`,e.id,t)}optionalInput(e,t){const a=e.inputs?.[t];if(null!=a)return this.resolveInput(a,e.id,t);const r=(this.graph.edges??[]).find(a=>a.to.nodeId===e.id&&a.to.port===t);return null!=r?this.resolveSocket(r.from,e.id,t):void 0}floatInput(e,t,a){return this.expectType(this.input(e,t,{type:"float",value:q(a)}),["float"],e.id,t).value}boolInput(e,t,a){return this.expectType(this.input(e,t,{type:"boolean",value:U(a)}),["boolean"],e.id,t).value}compileComparison(e){const t=this.expectType(this.input(e,"a"),["float"],e.id,"a").value,a=this.expectType(this.input(e,"b"),["float"],e.id,"b").value;switch(e.kind){case"compare.greaterThan":return t.gt(a);case"compare.greaterThanOrEqual":return t.gte(a);case"compare.lessThan":return t.lt(a);case"compare.lessThanOrEqual":return t.lte(a);case"compare.equal":return t.equals(a);case"compare.notEqual":return t.notEquals(a)}throw new ShaderGraphCompileError(`Unsupported comparison node "${e.kind}"`,e.id)}compileBooleanBinary(e,t){const a=this.boolInput(e,"a",!1),r=this.boolInput(e,"b",!1);return"and"===t?a.and(r):a.or(r)}resolveOutputBinding(e,t){if(null!=e.input)return this.resolveSocket(e.input,void 0,t);if(void 0!==e.value)return Ft(e.value);throw new ShaderGraphCompileError(`Output "${t}" is missing an input or value`)}floatOutput(e,t){return this.expectType(this.resolveOutputBinding(e,t),["float"],t).value}resolveInput(e,t,a){return function(e){return null!=e.nodeId}(e)?this.resolveSocket(e,t,a):Ft(e.value,e.valueType)}inlineLiteralFallback(e,t){const a=gt[e.kind]?.inputs.find(e=>e.name===t);if(null==a)return;const r=ft(e.kind,a),i=mt(e.kind,a);return null!=r&&void 0!==i?Ft(i,r):void 0}resolveSocket(e,t,a){const r=this.compileNode(e.nodeId).outputs[e.port];if(null==r)throw new ShaderGraphCompileError(`Node "${e.nodeId}" does not have output "${e.port}"`,t??e.nodeId,a??e.port);return r}expectType(e,t,a,r){if(!t.includes(e.type))throw new ShaderGraphCompileError(`Expected ${t.join(" or ")} but got ${e.type}`,a,r);return e}expectNumeric(e){if(!Kt(e.type))throw new ShaderGraphCompileError(`Expected a numeric value but got ${e.type}`);return e}toSampler(e,t){if("sampler2d"===e.type)return e;if("texture2d"===e.type){const a=e.value;if(null==a)throw new ShaderGraphCompileError("Texture input is empty",t);return{type:"sampler2d",value:Me(a)}}throw new ShaderGraphCompileError(`Expected texture2d or sampler2d but got ${e.type}`,t)}toColorOutput(e){switch(e.type){case"float":case"vec2":case"vec3":case"vec4":case"rgb":case"rgba":return e.value;case"boolean":{const t=de(e.value,q(1),q(0));return he(ze(t,t,t),1)}case"mat4":throw new ShaderGraphCompileError("mat4 values cannot be used as color");case"texture2d":case"sampler2d":throw new ShaderGraphCompileError(`${e.type} must be sampled before it can be used as color`)}}toVec3Output(e,t){if("vec3"===e.type||"rgb"===e.type)return e.value;if("vec4"===e.type||"rgba"===e.type)return e.value.xyz;throw new ShaderGraphCompileError(`Output "${t}" expects vec3/rgb but got ${e.type}`)}toMat4Output(e,t){if("mat4"===e.type)return e.value;throw new ShaderGraphCompileError(`Output "${t}" expects mat4 but got ${e.type}`)}output(e,t){return{node:e,outputs:t}}}export function compileShaderGraph(e,t={}){return new ShaderGraphCompiler(e,t).compile()}export function compileShaderGraphPreview(e,t,a={}){if(null==t)return compileShaderGraph(e,a).output;const r=new ShaderGraphCompiler(e,a).compileNode(t),i=Object.values(r.outputs)[0];if(null==i)throw new ShaderGraphCompileError(`Node "${t}" has no previewable output`,t);return{color:At(i),transparent:"rgba"===i.type||"vec4"===i.type}}export function buildShaderGraphMaterial(e,a={}){if("postProcess"===e.target)return buildShaderGraphPostProcessMaterial(e,a);const r=function(e,t,a){const r=a.alphaTest??e.alphaTest??t.materialOptions?.alphaTest;return null!=r?{...e,alphaTest:r}:e}(null!=a.previewNodeId?compileShaderGraphPreview(e,a.previewNodeId,a):compileShaderGraph(e,a).output,e,a);if("sprite"===e.target)return new De({color:r.color,discard:r.discard,alphaTest:r.alphaTest,transparent:r.transparent??!0,position:je(new x("rotation",0),new x("screenSpaceSize",0),void 0,!0),uniforms:{color:{value:new t(16777215)}}});if("trail"===e.target){const{position:t}=lt.getTrailShaderNodes(a.trailBillboard??!1),i=new d({...r,position:t});return lt.applyTrailShaderParameters(i),Vt(i,e),i}if("decal"===e.target){const t=ot.or(st),a=null!=r.discard?t.or(r.discard):t,i=new d({...r,transparent:!1,discard:a});return i.userData.isDecal=!0,Vt(i,e),i}const i=new d({transparent:!1,...r});return Vt(i,e),i}export function buildShaderGraphPostProcessMaterial(e,t={}){const a=null!=t.previewNodeId?$t(compileShaderGraphPreview(e,t.previewNodeId,t).color):compileShaderGraph(e,t).output,r=new d({color:a.color,transparent:!1,fog:!1,lights:!1,outputEncoding:!1});return r.depthWrite=!1,r.depthTest=!1,r.toneMapped=!1,r.userData.isPostProcessShaderGraph=!0,r}export function buildShaderGraphInlinePreviewMaterial(e,t,a={}){const r=compileShaderGraphPreview({...e,target:"surface"},t,a),i=new d({color:r.color,transparent:r.transparent??!1,fog:!1,lights:!1});return i.depthWrite=!1,i.depthTest=!1,i.toneMapped=!1,i}function $t(e,t,a=at){const r=ut(a),i=Ue("hology_post_process_weight",1),u=ye(null!=t?i.multiply(t):i);return{color:ue(r.rgb,Pt(e),u),transparent:!1,...null!=t?{opacity:t}:{}}}function Pt(e){return e instanceof h?ze(e,e,e):e instanceof w?ze(e.x,e.y,0):e instanceof T?e.xyz:e}export function shaderGraphMaterialSideToThree(t){switch(t){case"back":return e;case"double":return r;default:return i}}function zt(e){return"decal"!==e.target&&(e.materialOptions?.transparent??"sprite"===e.target)}function Vt(e,t){"surface"===t.target&&(e.side=shaderGraphMaterialSideToThree(t.materialOptions?.side)),null!=t.materialOptions?.transparent&&(e.transparent=t.materialOptions.transparent),null!=t.materialOptions?.bloom&&(e.userData.hasBloom=t.materialOptions.bloom)}function At(e){switch(e.type){case"float":return Lt(e.value);case"vec2":{const t=e.value;return he(ze(t.x,t.y,0),1)}case"vec3":case"rgb":return he(e.value,1);case"vec4":case"rgba":return e.value;case"boolean":return Lt(de(e.value,q(1),q(0)));case"mat4":throw new ShaderGraphCompileError("mat4 values cannot be previewed as color");case"texture2d":case"sampler2d":throw new ShaderGraphCompileError(`${e.type} nodes require a sampled output to preview`)}}function Lt(e){return he(ze(e,e,e),1)}function Dt(e){return e instanceof h?ze(e,e,e).rgb:e instanceof w?ze(e.x,e.y,0).rgb:e}function jt(e){return e.rgb}function Rt(e,t,a){const r=e.params?.[t];return void 0===r?a:r}function qt(e,t,a){const r=Rt(e,t,a);return"number"==typeof r?r:Number(r??a)}function Ft(e,t){if(null!=(a=e)&&"object"==typeof a&&!Array.isArray(a)&&"value"in a)return Ft(e.value,e.valueType??t);var a;const r=t??function(e){if("boolean"==typeof e)return"boolean";if("number"==typeof e)return"float";if(Array.isArray(e))return 2===e.length?"vec2":3===e.length?"vec3":16===e.length?"mat4":"vec4";return"string"==typeof e?"rgb":"float"}(e);return{type:r,value:Ht(e,r,"literal")}}function Ht(e,a,r){switch(a){case"boolean":return e instanceof c?e:U(Boolean(e));case"float":return e instanceof h?e:q(Xt(e,0));case"vec2":return e instanceof w?e:ea(e);case"vec3":return e instanceof S?e:ta(e);case"vec4":return e instanceof T?e:function(e){const[t,a,r,i]=Zt(e,4,1);return Ve(t,a,r,i)}(e);case"mat4":return e instanceof y?e:function(e){if(e instanceof u)return ae(e);const t=new u;Array.isArray(e)&&16===e.length&&t.fromArray(e.map(e=>Xt(e,0)));return ae(t)}(e);case"rgb":return e instanceof m?e:function(e){if("string"==typeof e||"number"==typeof e||e instanceof t)return ve(e);const[a,r,i]=Zt(e,3);return ze(a,r,i).rgb}(e);case"rgba":return e instanceof f||e instanceof T?e:aa(e);case"texture2d":return e;case"sampler2d":return function(e){const t=e;return e instanceof g||e instanceof b||"function"==typeof t?.isSampler2D||!0===t?.isSampler2D}(e)?e:e instanceof n||!0===e?.isTexture?Me(e):(Ut.has(r)||(Ut.add(r),console.warn(`Shader graph parameter "${r}" is missing a texture value; using a 1x1 white fallback texture.`)),Me(Et))}}function _t(e,t,a,r){const i=`${a}Scalar`;if(t instanceof h&&"function"==typeof e[i])return e[i](t);if("function"==typeof e[a])return e[a](t);throw new ShaderGraphCompileError(`Node does not support ${a}`,r)}function Wt(e,t,a){if(e===t)return e;if("rgb"===e&&"vec3"===t||"vec3"===e&&"rgb"===t)return"vec3";if("rgba"===e&&"vec4"===t||"vec4"===e&&"rgba"===t)return"vec4";if("float"===e&&Kt(t))return t;if("float"===t&&Kt(e))return e;throw new ShaderGraphCompileError(`Cannot mix ${e} and ${t}`,a)}function Yt(e,t,a){const r=e.subtract(a),i=fe(t),u=z(t);return Pe(u.multiply(r.x).subtract(i.multiply(r.y)).add(a.x),i.multiply(r.x).add(u.multiply(r.y)).add(a.y))}function Jt(e,t,a){const r=e.value["u"===t?"x":"v"===t?"y":t];if(r instanceof h)return r;throw new ShaderGraphCompileError(`Component "${t}" is not available on ${e.type}`,a)}function Kt(e){return"float"===e||"vec2"===e||"vec3"===e||"vec4"===e||"rgb"===e||"rgba"===e}function Qt(e){return Number.isFinite(e)?Math.min(1,Math.max(0,e)):0}function Xt(e,t){if("number"==typeof e)return e;if("string"==typeof e){const a=parseFloat(e);return Number.isFinite(a)?a:t}return"boolean"==typeof e?e?1:0:t}function Zt(e,a,r=0){if(Array.isArray(e))return Array.from({length:a},(t,a)=>Xt(e[a],r));if(e instanceof s||e instanceof l||e instanceof p)return Array.from({length:a},(t,a)=>e.toArray()[a]??r);if(e instanceof t){const t=e.toArray();return Array.from({length:a},(e,a)=>t[a]??(3===a?1:r))}if(null!=e&&"object"==typeof e){const t=e,i=["x","y","z","w"];if(i.some(e=>null!=t[e]))return Array.from({length:a},(e,a)=>Xt(t[i[a]],r));const u=["r","g","b","a"];if(u.some(e=>null!=t[e]))return Array.from({length:a},(e,a)=>Xt(t[u[a]],3===a?1:r))}return Array.from({length:a},()=>Xt(e,r))}function ea(e){const[t,a]=Zt(e,2);return Pe(t,a)}function ta(e){const[t,a,r]=Zt(e,3);return ze(t,a,r)}function aa(e,a=1){if("string"==typeof e||"number"==typeof e||e instanceof t)return he(e,a);if(e instanceof S)return he(e,a);const[r,i,u,o]=Zt(e,4,a);return Ve(r,i,u,o)}function ra(e,t){return t<=1?0:e/(t-1)}/*
1
+ import{BackSide as e,Color as t,DataTexture as a,DoubleSide as r,FrontSide as i,Matrix4 as u,RGBAFormat as o,Texture as n,Vector2 as s,Vector3 as l,Vector4 as p}from"three";import{BooleanNode as c,FloatNode as h,IntNode as v,Mat4Node as y,NodeShaderMaterial as d,RgbNode as m,RgbaNode as f,Sampler2DNode as g,Texture2dLookupNode as b,UniformFloatNode as x,Vec2Node as w,Vec3Node as S,Vec4Node as T,abs as I,acos as M,asin as O,attributes as C,atan as k,atan2 as N,autoVarying as G,bulge as E,bool as U,ceil as B,clamp as $,colorToNormal as z,cos as P,cross as V,degrees as A,distance as L,dot as D,exp as j,exp2 as R,float as q,floor as F,fract as H,inversesqrt as _,batchingMatrix as W,colorGradientSampler as Y,curveSampler as J,ifDefApply as K,sampleNamedEasingCurve as Q,length as X,LayerMixMode as Z,log as ee,log2 as te,mat4 as ae,max as re,min as ie,mix as ue,mixColorsByLayer as oe,particleUniforms as ne,mod as se,normalize as le,pow as pe,radians as ce,rgba as he,rgb as ve,saturate as ye,select as de,sign as me,sin as fe,smoothstep as ge,sqrt as be,standardMaterial as xe,stylizedCharacterMaterial as we,scaleTransform as Se,step as Te,tan as Ie,transpose as Me,textureSampler2d as Oe,timeUniforms as Ce,toonMaterial as ke,translate as Ne,transformed as Ge,triplanarMapping as Ee,twirl as Ue,uniformFloat as Be,uniforms as $e,varyingAttributes as ze,vec2 as Pe,vec3 as Ve,vec4 as Ae,getPaintedMaterialLayerWeight as Le}from"../../shader-nodes/index.js";import{isWgslCompiler as De}from"three-shader-graph";import{SpriteNodeShaderMaterial as je,getSpritePosition as Re}from"../sprite-shader.js";import{oneMinus as qe}from"../../shader-nodes/index.js";import{vectorToRadial as Fe,remap as He,hueShift as _e,blendColor as We,desaturateColor as Ye}from"../../shader-nodes/math.js";import{rectangleFloat as Je,roundedRectangleFloat as Ke}from"../../shader-nodes/shapes.js";import{edgeDepthEffect as Qe,fresnelEffect as Xe,depthFadeEffect as Ze}from"../../shader-nodes/effects.js";import{depthNormal as et,fragmentLinearEyeDepth as tt,sampleSceneDepth as at,sampleSceneLinearEyeDepth as rt,screenUV as it,nearUniformName as ut,farUniformName as ot}from"../../shader-nodes/depth.js";import{sampleSceneColor as nt}from"../../shader-nodes/scene-sample.js";import{decalDiscard as st,decalUV as lt}from"../../shader-nodes/decal.js";import{sampledSurfaceRejectsDecals as pt}from"../../shader-nodes/material-flags.js";import{Trail as ct,trailUV as ht}from"../../effects/vfx/trail-renderer.js";import{SimplexNoiseNode as vt,Voronoi2d as yt,rotateAxis as dt}from"../../shader-nodes/index.js";import{flipbookUv as mt}from"../../shader-nodes/texture-sequence.js";import{parallaxOcclusionMapping as ft}from"../../shader-nodes/pom.js";import{defaultInlineLiteralValueForPort as gt,inlineLiteralTypeForPort as bt,SHADER_GRAPH_NODE_DEFINITIONS as xt}from"./registry.js";import{shaderGraphParameterTypeToValueType as wt}from"./parameters.js";import{attributeVec2 as St,varying as Tt,reflect as It,refract as Mt,dFdx as Ot,dFdy as Ct,fwidth as kt,uniformAmbient as Nt,uniformDirectionalLights as Gt}from"three-shader-graph";import{decalNormal as Et}from"../../shader-nodes/decal.js";import{Curve2 as Ut}from"../../utils/curve.js";const Bt=(()=>{const e=new a(new Uint8Array([255,255,255,255]),1,1,o);return e.name="Missing shader graph texture parameter fallback",e.needsUpdate=!0,e})(),$t=new Set;const zt=new class extends v{compile(e){return{out:De(e)?"i32(rendererDirectionalLightCount())":"NUM_DIR_LIGHTS"}}};export class ShaderGraphCompileError extends Error{constructor(e,t,a){super(e),this.nodeId=t,this.port=a,this.name="ShaderGraphCompileError"}}export const shaderGraphPostProcessWeightUniformName="hology_post_process_weight";export class ShaderGraphCompiler{constructor(e,t={}){this.graph=e,this.options=t,this.compiled=new Map,this.compiling=new Set,this.nodesById=new Map((e.nodes??[]).map(e=>[e.id,e]))}validate(){this.compile()}compile(){if(1!==this.graph.version)throw new ShaderGraphCompileError(`Unsupported shader graph version ${this.graph.version}`);return this.validateEdges(),this.validateNamedReroutes(),{output:this.compileOutput(),nodes:this.compiled}}validateEdges(){for(const e of this.graph.edges??[]){if(!this.nodesById.has(e.from.nodeId))throw new ShaderGraphCompileError(`Edge references missing source node "${e.from.nodeId}"`,e.from.nodeId,e.from.port);if(!this.nodesById.has(e.to.nodeId))throw new ShaderGraphCompileError(`Edge references missing target node "${e.to.nodeId}"`,e.to.nodeId,e.to.port)}}validateNamedReroutes(){for(const e of this.graph.nodes??[])"utility.namedRerouteUsage"===e.kind&&this.namedRerouteDeclaration(e)}compileOutput(){if("postProcess"===this.graph.target)return this.compilePostProcessOutput();const e=this.graph.outputs?.color,t={color:null!=e?this.toColorOutput(this.resolveOutputBinding(e,"color")):he("#ffffff",1),transparent:At(this.graph)},a=this.graph.outputs?.opacity;null!=a&&(t.opacity=this.expectType(this.resolveOutputBinding(a,"opacity"),["float"],"opacity").value);const r=this.graph.outputs?.roughness;null!=r&&(t.roughness=this.expectType(this.resolveOutputBinding(r,"roughness"),["float"],"roughness").value);const i=this.graph.outputs?.metalness;null!=i&&(t.metalness=this.floatOutput(i,"metalness"));const u=this.graph.outputs?.normal;null!=u&&(t.normal=this.toVec3Output(this.resolveOutputBinding(u,"normal"),"normal"));const o=this.graph.outputs?.emissive;null!=o&&(t.emissive=this.toVec3Output(this.resolveOutputBinding(o,"emissive"),"emissive"));const n=this.graph.outputs?.ambientOcclusion;null!=n&&(t.ambientOcclusion=this.floatOutput(n,"ambientOcclusion"));const s=this.graph.outputs?.ambientOcclusionIntensity;null!=s&&(t.ambientOcclusionIntensity=this.floatOutput(s,"ambientOcclusionIntensity"));const l=this.graph.outputs?.sheenColor;null!=l&&(t.sheenColor=this.toVec3Output(this.resolveOutputBinding(l,"sheenColor"),"sheenColor"));const p=this.graph.outputs?.sheenRoughness;null!=p&&(t.sheenRoughness=this.floatOutput(p,"sheenRoughness"));const c=this.graph.outputs?.anisotropy;null!=c&&(t.anisotropy=this.floatOutput(c,"anisotropy"));const h=this.graph.outputs?.anisotropyDirection;null!=h&&(t.anisotropyDirection=this.expectType(this.resolveOutputBinding(h,"anisotropyDirection"),["vec2"],"anisotropyDirection").value);const v=this.graph.outputs?.bakedLight;null!=v&&(t.bakedLight=this.toVec3Output(this.resolveOutputBinding(v,"bakedLight"),"bakedLight"));const y=["shadowTint","subsurfaceColor","eyeIrisColor","eyeHighlightColor","rimColor"];for(const e of y){const a=this.graph.outputs?.[e];null!=a&&(t[e]=this.toVec3Output(this.resolveOutputBinding(a,e),e))}const d=["shadowThreshold","shadowSoftness","specularIntensity","specularToonness","specularThreshold","specularSoftness","environmentSpecularIntensity","skinMask","thickness","subsurfaceStrength","subsurfaceWrap","faceMask","faceShadow","faceShadowStrength","faceShadowSoftness","faceShadowOffset","rimMask","rimStrength","rimPower","rimThreshold","rimSoftness"];for(const e of d){const a=this.graph.outputs?.[e];null!=a&&(t[e]=this.floatOutput(a,e))}const m=this.graph.outputs?.transform;null!=m&&"decal"!==this.graph.target&&(t.transform=this.toMat4Output(this.resolveOutputBinding(m,"transform"),"transform"));const f=this.graph.outputs?.discard;null!=f&&(t.discard=this.expectType(this.resolveOutputBinding(f,"discard"),["boolean"],"discard").value);const g=this.graph.outputs?.transparent;null!=g&&null!=g.value&&(t.transparent=Boolean(g.value));const b=this.graph.outputs?.alphaTest;return null!=b&&null!=b.value?t.alphaTest=Number(b.value):null!=this.graph.materialOptions?.alphaTest&&(t.alphaTest=this.graph.materialOptions.alphaTest),this.applyShadingModel(t)}compilePostProcessOutput(){const e=this.screenUv(),t=this.graph.outputs?.color,a=null!=t?this.toColorOutput(this.resolveOutputBinding(t,"color")):nt(e),r=this.graph.outputs?.opacity;return Pt(a,null!=r?this.expectType(this.resolveOutputBinding(r,"opacity"),["float"],"opacity").value:void 0,e)}screenUv(){return this.options.screenUV??it}applyShadingModel(e){const t=null!=e.opacity?function(e,t){if(e instanceof h)return he(Ve(e,e,e),t);if(e instanceof w)return he(Ve(e.x,e.y,0),t);if(e instanceof T)return he(e.rgb,e.w.multiply(t));return he(e,t)}(e.color,e.opacity):e.color;switch(this.graph.shadingModel??"standard"){case"standard":{const a={color:Rt(t),roughness:e.roughness??q(.5),...null!=e.metalness?{metalness:e.metalness}:{},..."decal"===this.graph.target?{normal:le(Tt($e.normalMatrix).multiplyVec(Et))}:{},...null!=e.normal?{normal:e.normal}:{},...null!=e.emissive?{emissive:qt(e.emissive)}:{},...null!=e.ambientOcclusion?{ambientOcclusion:e.ambientOcclusion}:{},...null!=e.ambientOcclusionIntensity?{ambientOcclusionIntensity:e.ambientOcclusionIntensity}:{},...null!=e.sheenColor?{sheenColor:e.sheenColor.rgb}:{},...null!=e.sheenRoughness?{sheenRoughness:e.sheenRoughness}:{},...null!=e.anisotropy?{anisotropy:e.anisotropy}:{},...null!=e.anisotropyDirection?{anisotropyDirection:e.anisotropyDirection}:{},...null!=e.bakedLight?{bakedLight:e.bakedLight}:{}};return{...e,color:xe(a)}}case"toon":{const a={color:Rt(t),...null!=e.normal?{normal:e.normal}:{},...null!=e.emissive?{emissive:qt(e.emissive)}:{},...null!=e.ambientOcclusion?{ambientOcclusion:e.ambientOcclusion}:{},...null!=e.ambientOcclusionIntensity?{ambientOcclusionIntensity:e.ambientOcclusionIntensity}:{},...null!=e.bakedLight?{bakedLight:e.bakedLight}:{}};return{...e,color:ke(a)}}case"stylizedCharacter":{const a={color:Rt(t),shadowTint:e.shadowTint??ve(9212589),shadowThreshold:e.shadowThreshold??.05,shadowSoftness:e.shadowSoftness??.12,roughness:e.roughness??1,specularIntensity:e.specularIntensity??1,specularToonness:e.specularToonness??.2,specularThreshold:e.specularThreshold??.08,specularSoftness:e.specularSoftness??.025,environmentSpecularIntensity:e.environmentSpecularIntensity??.25,skinMask:e.skinMask??0,thickness:e.thickness??0,subsurfaceColor:e.subsurfaceColor??ve(12209973),subsurfaceStrength:e.subsurfaceStrength??.6,subsurfaceWrap:e.subsurfaceWrap??.25,backscatterStrength:e.backscatterStrength??.75,backscatterPower:e.backscatterPower??3,faceMask:e.faceMask??0,faceShadow:e.faceShadow??.5,faceShadowStrength:e.faceShadowStrength??.2,faceShadowSoftness:e.faceShadowSoftness??.08,faceShadowOffset:e.faceShadowOffset??0,eyeMask:e.eyeMask??0,irisMask:e.irisMask??0,eyeHighlightMask:e.eyeHighlightMask??0,eyeLowerLightMask:e.eyeLowerLightMask??0,eyeBrightness:e.eyeBrightness??1.15,eyeIrisColor:e.eyeIrisColor??ve(6535423),eyeIrisGlow:e.eyeIrisGlow??.18,eyeHighlightColor:e.eyeHighlightColor??ve(16777215),eyeHighlightStrength:e.eyeHighlightStrength??.65,rimMask:e.rimMask??1,rimColor:e.rimColor??ve(12179967),rimStrength:e.rimStrength??.08,rimPower:e.rimPower??2.5,rimThreshold:e.rimThreshold??.45,rimSoftness:e.rimSoftness??.08,...null!=e.normal?{normal:e.normal}:{},...null!=e.emissive?{emissive:qt(e.emissive)}:{},...null!=e.ambientOcclusion?{ambientOcclusion:e.ambientOcclusion}:{},...null!=e.ambientOcclusionIntensity?{ambientOcclusionIntensity:e.ambientOcclusionIntensity}:{},...null!=e.bakedLight?{bakedLight:e.bakedLight}:{}};return{...e,color:we(a)}}case"unlit":return{...e,color:t}}}compileNode(e){const t=this.compiled.get(e);if(null!=t)return t;const a=this.nodesById.get(e);if(null==a)throw new ShaderGraphCompileError(`Missing shader graph node "${e}"`,e);if(null==xt[a.kind])throw new ShaderGraphCompileError(`Unsupported shader graph node "${a.kind}"`,a.id);if(this.compiling.has(e))throw new ShaderGraphCompileError(`Shader graph contains a cycle involving node "${e}"`,e);this.compiling.add(e);try{const t=this.compileNodeInternal(a);return this.compiled.set(e,t),t}finally{this.compiling.delete(e)}}compileNodeInternal(e){switch(e.kind){case"input.parameter":return this.output(e,this.compileParameterNode(e));case"input.slider":return this.output(e,{value:{type:"float",value:q(Zt(Ht(e,"value",.5)))}});case"constant.boolean":return this.output(e,{value:{type:"boolean",value:U(Boolean(Ft(e,"value",!1)))}});case"constant.float":return this.output(e,{value:{type:"float",value:q(Ht(e,"value",0))}});case"constant.vec2":return this.output(e,{value:{type:"vec2",value:aa(Ft(e,"value",[0,0]))}});case"constant.vec3":return this.output(e,{value:{type:"vec3",value:ra(Ft(e,"value",[0,0,0]))}});case"constant.rgba":return this.output(e,{value:{type:"rgba",value:ia(Ft(e,"value","#ffffff"),Ht(e,"alpha",1))}});case"builtin.uv":{let t;return t="trail"===this.graph.target?ht:"decal"===this.graph.target?lt:this.uvAttribute(e),this.output(e,{value:{type:"vec2",value:!0===Ft(e,"flipY",!1)?Pe(t.x,qe(t.y)):t},u:{type:"float",value:t.x},v:{type:"float",value:t.y}})}case"builtin.screenUv":return this.output(e,{value:{type:"vec2",value:this.screenUv()}});case"builtin.color":{const t=G(C.color);return this.output(e,{value:{type:"rgba",value:t},rgb:{type:"rgb",value:t.rgb},r:{type:"float",value:t.r},g:{type:"float",value:t.g},b:{type:"float",value:t.b},a:{type:"float",value:t.a}})}case"builtin.position":{const t=G(C.position);return this.output(e,{value:{type:"vec3",value:t},x:{type:"float",value:t.x},y:{type:"float",value:t.y},z:{type:"float",value:t.z}})}case"builtin.worldPosition":{const t=G(Ge.worldPosition);return this.output(e,{value:{type:"vec3",value:t},x:{type:"float",value:t.x},y:{type:"float",value:t.y},z:{type:"float",value:t.z}})}case"builtin.worldNormal":{const t="decal"===this.graph.target?le(et):le(G(Me($e.viewMatrix).multiplyVec(Ae(Ge.normal,0)).xyz));return this.output(e,{value:{type:"vec3",value:t},x:{type:"float",value:t.x},y:{type:"float",value:t.y},z:{type:"float",value:t.z}})}case"builtin.objectPosition":{let t=$e.instanceMatrix.multiplyVec(Ae(0,0,0,1));t=K("USE_BATCHING",t,e=>W.multiplyVec(e));const a=G($e.modelMatrix.multiplyVec(t).xyz);return this.output(e,{value:{type:"vec3",value:a},x:{type:"float",value:a.x},y:{type:"float",value:a.y},z:{type:"float",value:a.z}})}case"builtin.viewDir":{const t=G(Ge.viewDir);return this.output(e,{value:{type:"vec3",value:t},x:{type:"float",value:t.x},y:{type:"float",value:t.y},z:{type:"float",value:t.z}})}case"builtin.normal":{const t=G(C.normal);return this.output(e,{value:{type:"vec3",value:t},x:{type:"float",value:t.x},y:{type:"float",value:t.y},z:{type:"float",value:t.z}})}case"builtin.time":return this.output(e,{value:{type:"float",value:Ce.elapsed}});case"builtin.camera":{const t=Be(ut),a=Be(ot),r=$e.cameraPosition;return this.output(e,{position:{type:"vec3",value:r},x:{type:"float",value:r.x},y:{type:"float",value:r.y},z:{type:"float",value:r.z},near:{type:"float",value:t},far:{type:"float",value:a}})}case"builtin.viewMatrix":return this.output(e,{value:{type:"mat4",value:$e.viewMatrix}});case"builtin.projectionMatrix":return this.output(e,{value:{type:"mat4",value:$e.projectionMatrix}});case"builtin.modelViewMatrix":return this.output(e,{value:{type:"mat4",value:$e.modelViewMatrix}});case"scene.ambientLight":return this.output(e,{color:{type:"rgb",value:Nt}});case"scene.directionalLight":return this.output(e,{color:{type:"rgb",value:Gt.sum(e=>e.color).divideScalar(re(q(zt),q(1)))},direction:{type:"vec3",value:Gt.sum(e=>e.direction).divideScalar(re(q(zt),q(1)))}});case"builtin.particle":return this.output(e,{energy:{type:"float",value:ne.energy},color:{type:"rgb",value:ne.color},opacity:{type:"float",value:ne.opacity},time:{type:"float",value:ne.time}});case"math.add":case"math.subtract":case"math.multiply":case"math.divide":return this.output(e,{value:this.compileBinaryMath(e)});case"math.oneMinus":{const t=this.expectNumeric(this.input(e,"value"));return this.output(e,{value:{type:t.type,value:qe(t.value)}})}case"math.abs":return this.output(e,{value:this.compileUnaryMath(e,I)});case"math.sign":return this.output(e,{value:this.compileUnaryMath(e,me)});case"math.floor":return this.output(e,{value:this.compileUnaryMath(e,F)});case"math.ceil":return this.output(e,{value:this.compileUnaryMath(e,B)});case"math.fract":return this.output(e,{value:this.compileUnaryMath(e,H)});case"math.sin":return this.output(e,{value:this.compileUnaryMath(e,fe)});case"math.cos":return this.output(e,{value:this.compileUnaryMath(e,P)});case"math.tan":return this.output(e,{value:this.compileUnaryMath(e,Ie)});case"math.asin":return this.output(e,{value:this.compileUnaryMath(e,O)});case"math.acos":return this.output(e,{value:this.compileUnaryMath(e,M)});case"math.atan":return this.output(e,{value:this.compileUnaryMath(e,k)});case"math.atan2":return this.output(e,{value:this.compileAtan2(e)});case"math.radians":return this.output(e,{value:this.compileUnaryMath(e,ce)});case"math.degrees":return this.output(e,{value:this.compileUnaryMath(e,A)});case"math.sqrt":return this.output(e,{value:this.compileUnaryMath(e,be)});case"math.inverseSqrt":return this.output(e,{value:this.compileUnaryMath(e,_)});case"math.exp":return this.output(e,{value:this.compileUnaryMath(e,j)});case"math.exp2":return this.output(e,{value:this.compileUnaryMath(e,R)});case"math.log":return this.output(e,{value:this.compileUnaryMath(e,ee)});case"math.log2":return this.output(e,{value:this.compileUnaryMath(e,te)});case"math.saturate":return this.output(e,{value:this.compileUnaryMath(e,ye)});case"math.length":{const t=this.expectNumeric(this.input(e,"value"));return this.output(e,{value:{type:"float",value:X(t.value)}})}case"math.normalize":return this.output(e,{value:this.compileUnaryMath(e,le)});case"math.clamp":{const t=this.expectNumeric(this.input(e,"value")),a=this.expectNumeric(this.input(e,"min",{type:"float",value:q(0)})),r=this.expectNumeric(this.input(e,"max",{type:"float",value:q(1)}));return this.output(e,{value:{type:t.type,value:$(t.value,a.value,r.value)}})}case"math.min":return this.output(e,{value:this.compileBinaryFunction(e,ie)});case"math.max":return this.output(e,{value:this.compileBinaryFunction(e,re)});case"math.pow":return this.output(e,{value:this.compileBinaryFunction(e,pe)});case"math.mod":return this.output(e,{value:this.compileBinaryFunction(e,se)});case"math.step":return this.output(e,{value:this.compileBinaryFunction(e,Te,!0)});case"math.smoothstep":{const t=this.expectNumeric(this.input(e,"edge0",{type:"float",value:q(0)})),a=this.expectNumeric(this.input(e,"edge1",{type:"float",value:q(1)})),r=this.expectNumeric(this.input(e,"value"));return this.output(e,{value:{type:r.type,value:ge(t.value,a.value,r.value)}})}case"math.mix":{const t=this.expectNumeric(this.input(e,"a")),a=this.expectNumeric(this.input(e,"b")),r=this.expectNumeric(this.input(e,"t",{type:"float",value:q(.5)})),i=Jt(t.type,a.type,e.id);return this.output(e,{value:{type:i,value:ue(t.value,a.value,r.value)}})}case"math.remap":{const t=this.expectType(this.input(e,"value"),["float"],e.id,"value").value,a=this.floatInput(e,"inMin",-1),r=this.floatInput(e,"inMax",1),i=this.floatInput(e,"outMin",0),u=this.floatInput(e,"outMax",1);return this.output(e,{value:{type:"float",value:He(t,a,r,i,u)}})}case"math.select":{const t=this.boolInput(e,"condition",!1),a=this.expectNumeric(this.input(e,"a")),r=this.expectNumeric(this.input(e,"b")),i=Jt(a.type,r.type,e.id);return this.output(e,{value:{type:i,value:de(t,a.value,r.value)}})}case"math.reflect":{const t=this.expectType(this.input(e,"incident"),["vec2","vec3","vec4","rgb","rgba"],e.id,"incident"),a=this.expectType(this.input(e,"normal"),["vec2","vec3","vec4","rgb","rgba"],e.id,"normal");return this.output(e,{value:{type:t.type,value:It(t.value,a.value)}})}case"math.refract":{const t=this.expectType(this.input(e,"incident"),["vec2","vec3","vec4","rgb","rgba"],e.id,"incident"),a=this.expectType(this.input(e,"normal"),["vec2","vec3","vec4","rgb","rgba"],e.id,"normal"),r=this.floatInput(e,"ior",1.5);return this.output(e,{value:{type:t.type,value:Mt(t.value,a.value,r)}})}case"math.derivative":{const t=this.expectNumeric(this.input(e,"value")),a=String(Ft(e,"mode","fwidth"));let r;return r="dFdx"===a?Ot(t.value):"dFdy"===a?Ct(t.value):kt(t.value),this.output(e,{value:{type:t.type,value:r}})}case"layer.mixPainted":return this.output(e,{value:this.compilePaintedLayerMix(e)});case"math.dot":{const t=this.expectNumeric(this.input(e,"a")),a=this.expectNumeric(this.input(e,"b"));return Jt(t.type,a.type,e.id),this.output(e,{value:{type:"float",value:D(t.value,a.value)}})}case"math.distance":{const t=this.expectNumeric(this.input(e,"a")),a=this.expectNumeric(this.input(e,"b"));return Jt(t.type,a.type,e.id),this.output(e,{value:{type:"float",value:L(t.value,a.value)}})}case"math.cross":{const t=this.expectType(this.input(e,"a"),["vec3","rgb"],e.id,"a"),a=this.expectType(this.input(e,"b"),["vec3","rgb"],e.id,"b");return this.output(e,{value:{type:"vec3",value:V(t.value,a.value)}})}case"compare.greaterThan":case"compare.greaterThanOrEqual":case"compare.lessThan":case"compare.lessThanOrEqual":case"compare.equal":case"compare.notEqual":return this.output(e,{value:{type:"boolean",value:this.compileComparison(e)}});case"boolean.not":{const t=this.boolInput(e,"value",!1);return this.output(e,{value:{type:"boolean",value:de(t,U(!1),U(!0))}})}case"boolean.and":return this.output(e,{value:{type:"boolean",value:this.compileBooleanBinary(e,"and")}});case"boolean.or":return this.output(e,{value:{type:"boolean",value:this.compileBooleanBinary(e,"or")}});case"compose.vec2":return this.output(e,{value:{type:"vec2",value:Pe(this.floatInput(e,"x",0),this.floatInput(e,"y",0))}});case"compose.vec3":return this.output(e,{value:{type:"vec3",value:Ve(this.floatInput(e,"x",0),this.floatInput(e,"y",0),this.floatInput(e,"z",0))}});case"compose.vec4":return this.output(e,{value:{type:"vec4",value:Ae(this.floatInput(e,"x",0),this.floatInput(e,"y",0),this.floatInput(e,"z",0),this.floatInput(e,"w",0))}});case"compose.rgba":return this.output(e,{value:{type:"rgba",value:Ae(this.floatInput(e,"r",1),this.floatInput(e,"g",1),this.floatInput(e,"b",1),this.floatInput(e,"a",1))}});case"decompose.component":{const t=this.expectNumeric(this.input(e,"value")),a=String(Ft(e,"component","x"));return this.output(e,{value:{type:"float",value:Qt(t,a,e.id)}})}case"decompose.split":{const t=this.expectNumeric(this.input(e,"value"));return this.output(e,function(e,t){const a={},r=(r,i)=>{a[r]={type:"float",value:Qt(e,i,t)}};switch(e.type){case"vec2":return r("x","x"),r("y","y"),r("u","x"),r("v","y"),a;case"vec3":return r("x","x"),r("y","y"),r("z","z"),a;case"rgb":return r("r","r"),r("g","g"),r("b","b"),r("x","x"),r("y","y"),r("z","z"),a;case"vec4":return r("x","x"),r("y","y"),r("z","z"),r("w","w"),a;case"rgba":return r("r","r"),r("g","g"),r("b","b"),r("a","a"),r("x","x"),r("y","y"),r("z","z"),r("w","w"),a;case"float":return a.x={type:"float",value:e.value},a}}(t,e.id))}case"color.gradient":{const t=this.expectType(this.input(e,"t",{type:"float",value:q(.5)}),["float"],e.id,"t"),a=Y(function(e){const t=Ft(e,"stops",[]);if(!Array.isArray(t))return[];const a=t.map((e,a)=>{if(null==e||"object"!=typeof e||Array.isArray(e))return;const r=e,i="string"==typeof r.color?r.color:"#ffffff";return{position:ea(r.position,ua(a,t.length)),color:i,alpha:ea(r.alpha,1)}}).filter(e=>null!=e);return a.length>0?a:[]}(e)).sample(t.value);return this.output(e,{value:{type:"rgba",value:a}})}case"utility.curve":{const t=this.expectType(this.input(e,"t",{type:"float",value:q(.5)}),["float"],e.id,"t"),a=Ft(e,"curve","Linear"),r=Q(a,t.value)??J(Ut.decode(a)).sample(t.value);return this.output(e,{value:{type:"float",value:r}})}case"utility.namedRerouteDeclaration":return this.output(e,{value:this.input(e,"value")});case"utility.namedRerouteUsage":{const t=this.compileNode(this.namedRerouteDeclaration(e).id);return this.output(e,{value:t.outputs.value})}case"color.hueShift":{const t=this.expectType(this.input(e,"color"),["rgba","rgb","vec4","vec3"],e.id,"color"),a=t.value,r="rgba"===t.type||"vec4"===t.type?a.rgb??a.xyz:a,i=this.floatInput(e,"shift",0),u=_e(r,i);return"rgba"===t.type||"vec4"===t.type?this.output(e,{value:{type:t.type,value:Ae(u,a.a??a.w)}}):this.output(e,{value:{type:t.type,value:u}})}case"color.blend":{const t=this.expectType(this.input(e,"base"),["rgba","rgb","vec4","vec3"],e.id,"base"),a=this.expectType(this.input(e,"blend"),["rgba","rgb","vec4","vec3"],e.id,"blend"),r=String(Ft(e,"mode","multiply")),i=t.value,u=a.value,o="rgba"===t.type||"vec4"===t.type?i.rgb??i.xyz:i,n="rgba"===a.type||"vec4"===a.type?u.rgb??u.xyz:u;let s=We(o,n,r);if("rgba"===a.type||"vec4"===a.type){const e=u.a??u.w;s=ue(o,s,e)}if("rgba"===t.type||"vec4"===t.type){const a=i.a??i.w;return this.output(e,{value:{type:t.type,value:Ae(s,a)}})}return this.output(e,{value:{type:t.type,value:s}})}case"color.desaturate":{const t=this.expectType(this.input(e,"color"),["rgba","rgb","vec4","vec3"],e.id,"color"),a=t.value,r="rgba"===t.type||"vec4"===t.type?a.rgb??a.xyz:a,i=this.floatInput(e,"fraction",1),u=Ye(r,i);return"rgba"===t.type||"vec4"===t.type?this.output(e,{value:{type:t.type,value:Ae(u,a.a??a.w)}}):this.output(e,{value:{type:t.type,value:u}})}case"color.unpackNormal":{const t=this.expectType(this.input(e,"color"),["vec3","vec4","rgb","rgba"],e.id,"color"),a=this.floatInput(e,"scale",1),r=this.optionalInput(e,"normal");return this.output(e,{value:{type:"vec3",value:z(t.value,a,r?this.expectType(r,["vec3"],e.id,"normal").value:void 0)}})}case"texture.sampler2d":{const t=this.input(e,"texture");return this.output(e,{value:this.toSampler(t,e.id)})}case"texture.sample2d":{const t=this.toSampler(this.input(e,"sampler"),e.id),a=this.expectType(this.input(e,"uv",{type:"vec2",value:this.defaultUV()}),["vec2"],e.id,"uv"),r=t.value.sample(a.value);return this.output(e,{rgba:{type:"rgba",value:r},rgb:{type:"rgb",value:r.rgb},r:{type:"float",value:r.r},g:{type:"float",value:r.g},b:{type:"float",value:r.b},a:{type:"float",value:r.a}})}case"texture.triplanarMapping":{const t=this.input(e,"sampler"),a=this.toSampler(t,e.id),r=this.expectType(this.input(e,"scale",{type:"float",value:q(1)}),["float"],e.id,"scale"),i=this.expectType(this.input(e,"normal",{type:"vec3",value:ze.normal}),["vec3"],e.id,"normal"),u=this.expectType(this.input(e,"position",{type:"vec3",value:ze.position}),["vec3"],e.id,"position"),o=Ee(a.value,r.value,i.value,u.value);return this.output(e,{rgba:{type:"rgba",value:o},rgb:{type:"rgb",value:o.rgb},r:{type:"float",value:o.r},g:{type:"float",value:o.g},b:{type:"float",value:o.b},a:{type:"float",value:o.a}})}case"scene.sampleColor":{const t=this.expectType(this.input(e,"uv",{type:"vec2",value:this.screenUv()}),["vec2"],e.id,"uv"),a=nt(t.value);return this.output(e,{rgba:{type:"rgba",value:a},rgb:{type:"rgb",value:a.rgb},r:{type:"float",value:a.r},g:{type:"float",value:a.g},b:{type:"float",value:a.b},a:{type:"float",value:a.a}})}case"scene.sampleDepth":{const t=this.expectType(this.input(e,"uv",{type:"vec2",value:this.screenUv()}),["vec2"],e.id,"uv");return this.output(e,{depth:{type:"float",value:at(t.value)},linearEyeDepth:{type:"float",value:rt(t.value)}})}case"scene.fragmentDepth":return this.output(e,{linearEyeDepth:{type:"float",value:tt}});case"transform.translate":{const t=this.expectType(this.input(e,"offset",{type:"vec3",value:Ve(0,0,0)}),["vec3","rgb"],e.id,"offset");return this.output(e,{value:{type:"mat4",value:Ne(t.value)}})}case"transform.scale":{const t=this.expectType(this.input(e,"scale",{type:"vec3",value:Ve(1,1,1)}),["vec3","rgb"],e.id,"scale").value;return this.output(e,{value:{type:"mat4",value:Se(t.x,t.y,t.z)}})}case"transform.rotateAxis":{const t=this.expectType(this.input(e,"axis",{type:"vec3",value:Ve(0,1,0)}),["vec3","rgb"],e.id,"axis"),a=this.expectType(this.input(e,"angle",{type:"float",value:q(0)}),["float"],e.id,"angle");return this.output(e,{value:{type:"mat4",value:dt(t.value,a.value)}})}case"uv.rotate":{const t=this.expectType(this.input(e,"uv",{type:"vec2",value:this.defaultUV()}),["vec2"],e.id,"uv").value,a=this.expectType(this.input(e,"angle",{type:"float",value:q(0)}),["float"],e.id,"angle").value,r=this.expectType(this.input(e,"center",{type:"vec2",value:Pe(.5,.5)}),["vec2"],e.id,"center").value;return this.output(e,{value:{type:"vec2",value:Kt(t,a,r)}})}case"uv.twirl":{const t=this.expectType(this.input(e,"uv",{type:"vec2",value:this.defaultUV()}),["vec2"],e.id,"uv").value,a=this.expectType(this.input(e,"strength",{type:"float",value:q(1)}),["float"],e.id,"strength").value,r=this.expectType(this.input(e,"center",{type:"vec2",value:Pe(.5,.5)}),["vec2"],e.id,"center").value,i=this.expectType(this.input(e,"offset",{type:"vec2",value:Pe(0,0)}),["vec2"],e.id,"offset").value;return this.output(e,{value:{type:"vec2",value:Ue(t,a,r,i)}})}case"uv.radial":{const t=this.expectType(this.input(e,"uv",{type:"vec2",value:this.defaultUV()}),["vec2"],e.id,"uv").value,a=Fe(t.subtractScalar(.5));return this.output(e,{coords:{type:"vec2",value:a.coords},radius:{type:"float",value:a.radius},angle:{type:"float",value:a.angle}})}case"uv.bulge":{const t=this.expectType(this.input(e,"uv",{type:"vec2",value:this.defaultUV()}),["vec2"],e.id,"uv").value,a=this.expectType(this.input(e,"center",{type:"vec2",value:Pe(.5,.5)}),["vec2"],e.id,"center").value,r=this.expectType(this.input(e,"power",{type:"float",value:q(1)}),["float"],e.id,"power").value;return this.output(e,{value:{type:"vec2",value:E(t,a,r)}})}case"uv.flipbook":{const t=this.expectType(this.input(e,"uv",{type:"vec2",value:this.defaultUV()}),["vec2"],e.id,"uv").value,a=this.floatInput(e,"columns",Ht(e,"columns",1)),r=this.floatInput(e,"rows",Ht(e,"rows",1)),i=this.floatInput(e,"fps",Ht(e,"fps",60)),u=this.expectType(this.input(e,"time",{type:"float",value:Ce.elapsed}),["float"],e.id,"time").value,o=String(Ft(e,"mode","clamp"));return this.output(e,{value:{type:"vec2",value:mt(t,a,r,u,i,o)}})}case"uv.pom":{const t=this.expectType(this.input(e,"uv",{type:"vec2",value:this.defaultUV()}),["vec2"],e.id,"uv").value,a=this.input(e,"heightMap"),r=this.toSampler(a,e.id).value,i=this.floatInput(e,"heightScale",.05),u=Ht(e,"minLayers",8),o=Ht(e,"maxLayers",24);return this.output(e,{value:{type:"vec2",value:ft(t,r,i,u,o)}})}case"shape.rectangle":{const t=this.expectType(this.input(e,"uv",{type:"vec2",value:this.defaultUV()}),["vec2"],e.id,"uv").value;return this.output(e,{value:{type:"float",value:Je(t,this.floatInput(e,"width",.5),this.floatInput(e,"height",.5))}})}case"shape.roundedRectangle":{const t=this.expectType(this.input(e,"uv",{type:"vec2",value:this.defaultUV()}),["vec2"],e.id,"uv").value;return this.output(e,{value:{type:"float",value:Ke(t,this.floatInput(e,"width",.5),this.floatInput(e,"height",.5),this.floatInput(e,"radius",.1))}})}case"noise.simplex":{const t=this.expectType(this.input(e,"uv",{type:"vec2",value:this.defaultUV()}),["vec2"],e.id,"uv").value,a=this.floatInput(e,"scale",8);return this.output(e,{value:{type:"float",value:new vt(t.multiplyScalar(a))}})}case"noise.voronoi2d":{const t=this.expectType(this.input(e,"uv",{type:"vec2",value:this.defaultUV()}),["vec2"],e.id,"uv").value,a=this.floatInput(e,"scale",8);return this.output(e,{value:{type:"float",value:new yt(t.multiplyScalar(a))}})}case"effect.fresnel":return this.output(e,{value:{type:"float",value:G(Xe(this.floatInput(e,"power",1)))}});case"effect.edgeDepth":{const t=this.floatInput(e,"power",1);return this.output(e,{value:{type:"float",value:Qe(t)}})}case"effect.depthFade":{const t=this.floatInput(e,"distance",1);return this.output(e,{value:{type:"float",value:Ze(t)}})}case"util.panner":{const t=this.expectType(this.input(e,"uv",{type:"vec2",value:this.defaultUV()}),["vec2"],e.id,"coord"),a=this.expectType(this.input(e,"speed",{type:"vec2",value:Pe(0,0)}),["vec2"],e.id,"speed"),r=this.expectType(this.input(e,"tile",{type:"vec2",value:Pe(1,1)}),["vec2"],e.id,"tile"),i=this.expectType(this.input(e,"time",{type:"float",value:Ce.elapsed}),["float"],e.id,"time");return this.output(e,{value:{type:"vec2",value:t.value.multiply(r.value).add(a.value.multiplyScalar(i.value))}})}}}compileParameterNode(e){const t=String(Ft(e,"parameter","")),a=this.graph.parameters?.find(e=>e.name===t||e.id===t);if(null==a)throw new ShaderGraphCompileError(`Parameter "${t}" does not exist`,e.id);const r=wt(a.type),i={type:r,value:Wt(this.options.parameters?.[a.name]??a.defaultValue,r,a.name)};if("sampler2d"!==r)return{value:i};const u=this.expectType(this.input(e,"uv",{type:"vec2",value:this.defaultUV()}),["vec2"],e.id,"uv"),o=i.value.sample(u.value);return{value:{type:"rgba",value:o},rgb:{type:"rgb",value:o.rgb},r:{type:"float",value:o.r},g:{type:"float",value:o.g},b:{type:"float",value:o.b},a:{type:"float",value:o.a},sampler:i}}compileBinaryMath(e){const t=this.expectBinaryMathValue(this.input(e,"a")),a=this.expectBinaryMathValue(this.input(e,"b")),r=e.kind.split(".")[1];if("mat4"===t.type||"mat4"===a.type)return function(e,t,a,r){if("mat4"===e.type&&"mat4"===t.type&&"divide"!==a)return{type:"mat4",value:Yt(e.value,t.value,a,r)};if("mat4"===e.type&&"float"===t.type&&("multiply"===a||"divide"===a))return{type:"mat4",value:Yt(e.value,t.value,a,r)};if("float"===e.type&&"mat4"===t.type&&"multiply"===a)return{type:"mat4",value:Yt(t.value,e.value,a,r)};if("mat4"===e.type&&"vec4"===t.type&&"multiply"===a)return{type:"vec4",value:e.value.multiplyVec(t.value)};throw new ShaderGraphCompileError(`Cannot ${a} ${e.type} and ${t.type}`,r)}(t,a,r,e.id);if(t.type===a.type)return{type:t.type,value:Yt(t.value,a.value,r,e.id)};if("float"===t.type&&"float"!==a.type&&"multiply"===r)return{type:a.type,value:Yt(a.value,t.value,r,e.id)};if("float"!==t.type&&"float"===a.type)return{type:t.type,value:Yt(t.value,a.value,r,e.id)};throw new ShaderGraphCompileError(`Cannot ${r} ${t.type} and ${a.type}`,e.id)}expectBinaryMathValue(e){if(!Xt(e.type)&&"mat4"!==e.type)throw new ShaderGraphCompileError(`Expected a numeric value but got ${e.type}`);return e}compileUnaryMath(e,t){const a=this.expectNumeric(this.input(e,"value"));return{type:a.type,value:t(a.value)}}compileAtan2(e){const t=this.expectNumeric(this.input(e,"y")),a=this.expectNumeric(this.input(e,"x"));return{type:function(e,t,a){if(e===t)return e;if("rgb"===e&&"vec3"===t||"vec3"===e&&"rgb"===t)return"vec3";if("rgba"===e&&"vec4"===t||"vec4"===e&&"rgba"===t)return"vec4";throw new ShaderGraphCompileError(`Cannot mix ${e} and ${t}`,a)}(t.type,a.type,e.id),value:N(t.value,a.value)}}compileBinaryFunction(e,t,a=!1){const r=this.expectNumeric(this.input(e,"a")),i=this.expectNumeric(this.input(e,"b"));return{type:a&&"float"===i.type?r.type:Jt(r.type,i.type,e.id),value:t(r.value,i.value)}}compilePaintedLayerMix(e){const t=this.expectNumeric(this.input(e,"base")),a=[t.value],r=[Le(0)];let i=t.type;for(let t=1;t<=8;t++){const u=this.optionalInput(e,`layer${t}`);if(null==u)continue;const o=this.expectNumeric(u);i=Jt(i,o.type,e.id),a.push(o.value),r.push(Le(t))}return 1===a.length?t:{type:i,value:oe({layerColors:a,layerWeights:r,enableNoise:Boolean(Ft(e,"enableNoise",!0)),noiseScale:this.floatInput(e,"noiseScale",Ht(e,"noiseScale",.1)),noiseAmount:this.floatInput(e,"noiseAmount",Ht(e,"noiseAmount",.5)),decay:this.floatInput(e,"softness",Ht(e,"softness",.3)),mode:"hard"===String(Ft(e,"mode","soft"))?Z.hard:Z.soft})}}defaultUV(){return"trail"===this.graph.target?ht:"decal"===this.graph.target?lt:G(C.uv)}uvAttribute(e){const t=Math.max(0,Math.floor(Ht(e,"channel",0)));return 0===t?ze.uv:Tt(St(`uv${t}`))}namedRerouteDeclaration(e){const t=String(e.params?.declarationId??"");if(0===t.length)throw new ShaderGraphCompileError("Named reroute usage is missing a declaration",e.id);const a=this.nodesById.get(t);if(null==a)throw new ShaderGraphCompileError(`Named reroute declaration "${t}" does not exist`,e.id);if("utility.namedRerouteDeclaration"!==a.kind)throw new ShaderGraphCompileError(`Node "${t}" is not a named reroute declaration`,e.id);return a}input(e,t,a){const r=e.inputs?.[t];if(null!=r)return this.resolveInput(r,e.id,t);const i=(this.graph.edges??[]).find(a=>a.to.nodeId===e.id&&a.to.port===t);if(null!=i)return this.resolveSocket(i.from,e.id,t);if(null!=a)return a;const u=this.inlineLiteralFallback(e,t);if(null!=u)return u;throw new ShaderGraphCompileError(`Missing input "${t}"`,e.id,t)}optionalInput(e,t){const a=e.inputs?.[t];if(null!=a)return this.resolveInput(a,e.id,t);const r=(this.graph.edges??[]).find(a=>a.to.nodeId===e.id&&a.to.port===t);return null!=r?this.resolveSocket(r.from,e.id,t):void 0}floatInput(e,t,a){return this.expectType(this.input(e,t,{type:"float",value:q(a)}),["float"],e.id,t).value}boolInput(e,t,a){return this.expectType(this.input(e,t,{type:"boolean",value:U(a)}),["boolean"],e.id,t).value}compileComparison(e){const t=this.expectType(this.input(e,"a"),["float"],e.id,"a").value,a=this.expectType(this.input(e,"b"),["float"],e.id,"b").value;switch(e.kind){case"compare.greaterThan":return t.gt(a);case"compare.greaterThanOrEqual":return t.gte(a);case"compare.lessThan":return t.lt(a);case"compare.lessThanOrEqual":return t.lte(a);case"compare.equal":return t.equals(a);case"compare.notEqual":return t.notEquals(a)}throw new ShaderGraphCompileError(`Unsupported comparison node "${e.kind}"`,e.id)}compileBooleanBinary(e,t){const a=this.boolInput(e,"a",!1),r=this.boolInput(e,"b",!1);return"and"===t?a.and(r):a.or(r)}resolveOutputBinding(e,t){if(null!=e.input)return this.resolveSocket(e.input,void 0,t);if(void 0!==e.value)return _t(e.value);throw new ShaderGraphCompileError(`Output "${t}" is missing an input or value`)}floatOutput(e,t){return this.expectType(this.resolveOutputBinding(e,t),["float"],t).value}resolveInput(e,t,a){return function(e){return null!=e.nodeId}(e)?this.resolveSocket(e,t,a):_t(e.value,e.valueType)}inlineLiteralFallback(e,t){const a=xt[e.kind]?.inputs.find(e=>e.name===t);if(null==a)return;const r=bt(e.kind,a),i=gt(e.kind,a);return null!=r&&void 0!==i?_t(i,r):void 0}resolveSocket(e,t,a){const r=this.compileNode(e.nodeId).outputs[e.port];if(null==r)throw new ShaderGraphCompileError(`Node "${e.nodeId}" does not have output "${e.port}"`,t??e.nodeId,a??e.port);return r}expectType(e,t,a,r){if(!t.includes(e.type))throw new ShaderGraphCompileError(`Expected ${t.join(" or ")} but got ${e.type}`,a,r);return e}expectNumeric(e){if(!Xt(e.type))throw new ShaderGraphCompileError(`Expected a numeric value but got ${e.type}`);return e}toSampler(e,t){if("sampler2d"===e.type)return e;if("texture2d"===e.type){const a=e.value;if(null==a)throw new ShaderGraphCompileError("Texture input is empty",t);return{type:"sampler2d",value:Oe(a)}}throw new ShaderGraphCompileError(`Expected texture2d or sampler2d but got ${e.type}`,t)}toColorOutput(e){switch(e.type){case"float":case"vec2":case"vec3":case"vec4":case"rgb":case"rgba":return e.value;case"boolean":{const t=de(e.value,q(1),q(0));return he(Ve(t,t,t),1)}case"mat4":throw new ShaderGraphCompileError("mat4 values cannot be used as color");case"texture2d":case"sampler2d":throw new ShaderGraphCompileError(`${e.type} must be sampled before it can be used as color`)}}toVec3Output(e,t){if("vec3"===e.type||"rgb"===e.type)return e.value;if("vec4"===e.type||"rgba"===e.type)return e.value.xyz;throw new ShaderGraphCompileError(`Output "${t}" expects vec3/rgb but got ${e.type}`)}toMat4Output(e,t){if("mat4"===e.type)return e.value;throw new ShaderGraphCompileError(`Output "${t}" expects mat4 but got ${e.type}`)}output(e,t){return{node:e,outputs:t}}}export function compileShaderGraph(e,t={}){return new ShaderGraphCompiler(e,t).compile()}export function compileShaderGraphPreview(e,t,a={}){if(null==t)return compileShaderGraph(e,a).output;const r=new ShaderGraphCompiler(e,a).compileNode(t),i=Object.values(r.outputs)[0];if(null==i)throw new ShaderGraphCompileError(`Node "${t}" has no previewable output`,t);return{color:Dt(i),transparent:"rgba"===i.type||"vec4"===i.type}}export function buildShaderGraphMaterial(e,a={}){if("postProcess"===e.target)return buildShaderGraphPostProcessMaterial(e,a);const r=function(e,t,a){const r=a.alphaTest??e.alphaTest??t.materialOptions?.alphaTest;return null!=r?{...e,alphaTest:r}:e}(null!=a.previewNodeId?compileShaderGraphPreview(e,a.previewNodeId,a):compileShaderGraph(e,a).output,e,a);if("sprite"===e.target)return new je({color:r.color,discard:r.discard,alphaTest:r.alphaTest,transparent:r.transparent??!0,position:Re(new x("rotation",0),new x("screenSpaceSize",0),void 0,!0),uniforms:{color:{value:new t(16777215)}}});if("trail"===e.target){const{position:t}=ct.getTrailShaderNodes(a.trailBillboard??!1),i=new d({...r,position:t});return ct.applyTrailShaderParameters(i),Lt(i,e),i}if("decal"===e.target){const t=st.or(pt),a=null!=r.discard?t.or(r.discard):t,i=new d({...r,transparent:!1,discard:a});return i.userData.isDecal=!0,Lt(i,e),i}const i=new d({transparent:!1,...r});return Lt(i,e),i}export function buildShaderGraphPostProcessMaterial(e,t={}){const a=null!=t.previewNodeId?Pt(compileShaderGraphPreview(e,t.previewNodeId,t).color):compileShaderGraph(e,t).output,r=new d({color:a.color,transparent:!1,fog:!1,lights:!1,outputEncoding:!1});return r.depthWrite=!1,r.depthTest=!1,r.toneMapped=!1,r.userData.isPostProcessShaderGraph=!0,r}export function buildShaderGraphInlinePreviewMaterial(e,t,a={}){const r=compileShaderGraphPreview({...e,target:"surface"},t,a),i=new d({color:r.color,transparent:r.transparent??!1,fog:!1,lights:!1});return i.depthWrite=!1,i.depthTest=!1,i.toneMapped=!1,i}function Pt(e,t,a=it){const r=nt(a),i=Be("hology_post_process_weight",1),u=ye(null!=t?i.multiply(t):i);return{color:ue(r.rgb,Vt(e),u),transparent:!1,...null!=t?{opacity:t}:{}}}function Vt(e){return e instanceof h?Ve(e,e,e):e instanceof w?Ve(e.x,e.y,0):e instanceof T?e.xyz:e}export function shaderGraphMaterialSideToThree(t){switch(t){case"back":return e;case"double":return r;default:return i}}function At(e){return"decal"!==e.target&&(e.materialOptions?.transparent??"sprite"===e.target)}function Lt(e,t){"surface"===t.target&&(e.side=shaderGraphMaterialSideToThree(t.materialOptions?.side)),null!=t.materialOptions?.transparent&&(e.transparent=t.materialOptions.transparent),null!=t.materialOptions?.bloom&&(e.userData.hasBloom=t.materialOptions.bloom)}function Dt(e){switch(e.type){case"float":return jt(e.value);case"vec2":{const t=e.value;return he(Ve(t.x,t.y,0),1)}case"vec3":case"rgb":return he(e.value,1);case"vec4":case"rgba":return e.value;case"boolean":return jt(de(e.value,q(1),q(0)));case"mat4":throw new ShaderGraphCompileError("mat4 values cannot be previewed as color");case"texture2d":case"sampler2d":throw new ShaderGraphCompileError(`${e.type} nodes require a sampled output to preview`)}}function jt(e){return he(Ve(e,e,e),1)}function Rt(e){return e instanceof h?Ve(e,e,e).rgb:e instanceof w?Ve(e.x,e.y,0).rgb:e}function qt(e){return e.rgb}function Ft(e,t,a){const r=e.params?.[t];return void 0===r?a:r}function Ht(e,t,a){const r=Ft(e,t,a);return"number"==typeof r?r:Number(r??a)}function _t(e,t){if(null!=(a=e)&&"object"==typeof a&&!Array.isArray(a)&&"value"in a)return _t(e.value,e.valueType??t);var a;const r=t??function(e){if("boolean"==typeof e)return"boolean";if("number"==typeof e)return"float";if(Array.isArray(e))return 2===e.length?"vec2":3===e.length?"vec3":16===e.length?"mat4":"vec4";return"string"==typeof e?"rgb":"float"}(e);return{type:r,value:Wt(e,r,"literal")}}function Wt(e,a,r){switch(a){case"boolean":return e instanceof c?e:U(Boolean(e));case"float":return e instanceof h?e:q(ea(e,0));case"vec2":return e instanceof w?e:aa(e);case"vec3":return e instanceof S?e:ra(e);case"vec4":return e instanceof T?e:function(e){const[t,a,r,i]=ta(e,4,1);return Ae(t,a,r,i)}(e);case"mat4":return e instanceof y?e:function(e){if(e instanceof u)return ae(e);const t=new u;Array.isArray(e)&&16===e.length&&t.fromArray(e.map(e=>ea(e,0)));return ae(t)}(e);case"rgb":return e instanceof m?e:function(e){if("string"==typeof e||"number"==typeof e||e instanceof t)return ve(e);const[a,r,i]=ta(e,3);return Ve(a,r,i).rgb}(e);case"rgba":return e instanceof f||e instanceof T?e:ia(e);case"texture2d":return e;case"sampler2d":return function(e){const t=e;return e instanceof g||e instanceof b||"function"==typeof t?.isSampler2D||!0===t?.isSampler2D}(e)?e:e instanceof n||!0===e?.isTexture?Oe(e):($t.has(r)||($t.add(r),console.warn(`Shader graph parameter "${r}" is missing a texture value; using a 1x1 white fallback texture.`)),Oe(Bt))}}function Yt(e,t,a,r){const i=`${a}Scalar`;if(t instanceof h&&"function"==typeof e[i])return e[i](t);if("function"==typeof e[a])return e[a](t);throw new ShaderGraphCompileError(`Node does not support ${a}`,r)}function Jt(e,t,a){if(e===t)return e;if("rgb"===e&&"vec3"===t||"vec3"===e&&"rgb"===t)return"vec3";if("rgba"===e&&"vec4"===t||"vec4"===e&&"rgba"===t)return"vec4";if("float"===e&&Xt(t))return t;if("float"===t&&Xt(e))return e;throw new ShaderGraphCompileError(`Cannot mix ${e} and ${t}`,a)}function Kt(e,t,a){const r=e.subtract(a),i=fe(t),u=P(t);return Pe(u.multiply(r.x).subtract(i.multiply(r.y)).add(a.x),i.multiply(r.x).add(u.multiply(r.y)).add(a.y))}function Qt(e,t,a){const r=e.value["u"===t?"x":"v"===t?"y":t];if(r instanceof h)return r;throw new ShaderGraphCompileError(`Component "${t}" is not available on ${e.type}`,a)}function Xt(e){return"float"===e||"vec2"===e||"vec3"===e||"vec4"===e||"rgb"===e||"rgba"===e}function Zt(e){return Number.isFinite(e)?Math.min(1,Math.max(0,e)):0}function ea(e,t){if("number"==typeof e)return e;if("string"==typeof e){const a=parseFloat(e);return Number.isFinite(a)?a:t}return"boolean"==typeof e?e?1:0:t}function ta(e,a,r=0){if(Array.isArray(e))return Array.from({length:a},(t,a)=>ea(e[a],r));if(e instanceof s||e instanceof l||e instanceof p)return Array.from({length:a},(t,a)=>e.toArray()[a]??r);if(e instanceof t){const t=e.toArray();return Array.from({length:a},(e,a)=>t[a]??(3===a?1:r))}if(null!=e&&"object"==typeof e){const t=e,i=["x","y","z","w"];if(i.some(e=>null!=t[e]))return Array.from({length:a},(e,a)=>ea(t[i[a]],r));const u=["r","g","b","a"];if(u.some(e=>null!=t[e]))return Array.from({length:a},(e,a)=>ea(t[u[a]],3===a?1:r))}return Array.from({length:a},()=>ea(e,r))}function aa(e){const[t,a]=ta(e,2);return Pe(t,a)}function ra(e){const[t,a,r]=ta(e,3);return Ve(t,a,r)}function ia(e,a=1){if("string"==typeof e||"number"==typeof e||e instanceof t)return he(e,a);if(e instanceof S)return he(e,a);const[r,i,u,o]=ta(e,4,a);return Ae(r,i,u,o)}function ua(e,t){return t<=1?0:e/(t-1)}/*
2
2
  * Copyright (©) 2026 Hology Interactive AB. All rights reserved.
3
3
  * See the LICENSE.md file for details.
4
4
  */
@@ -4,7 +4,7 @@ export type ShaderGraphMaterialSide = 'front' | 'back' | 'double';
4
4
  export type ShaderGraphValueType = 'boolean' | 'float' | 'vec2' | 'vec3' | 'vec4' | 'mat4' | 'rgb' | 'rgba' | 'texture2d' | 'sampler2d';
5
5
  export declare const ShaderGraphParameterTypes: readonly ["float", "boolean", "vec2", "vec3", "vec4", "color", "texture"];
6
6
  export type ShaderGraphParameterType = (typeof ShaderGraphParameterTypes)[number];
7
- export type ShaderGraphNodeKind = 'input.parameter' | 'input.slider' | 'constant.boolean' | 'constant.float' | 'constant.vec2' | 'constant.vec3' | 'constant.rgba' | 'builtin.uv' | 'builtin.screenUv' | 'builtin.color' | 'builtin.position' | 'builtin.worldPosition' | 'builtin.objectPosition' | 'builtin.normal' | 'builtin.time' | 'builtin.camera' | 'builtin.viewMatrix' | 'builtin.projectionMatrix' | 'builtin.modelViewMatrix' | 'builtin.particle' | 'math.add' | 'math.subtract' | 'math.multiply' | 'math.divide' | 'math.oneMinus' | 'math.abs' | 'math.sign' | 'math.floor' | 'math.ceil' | 'math.fract' | 'math.sin' | 'math.cos' | 'math.tan' | 'math.asin' | 'math.acos' | 'math.atan' | 'math.atan2' | 'math.radians' | 'math.degrees' | 'math.sqrt' | 'math.inverseSqrt' | 'math.exp' | 'math.exp2' | 'math.log' | 'math.log2' | 'math.saturate' | 'math.length' | 'math.normalize' | 'math.clamp' | 'math.min' | 'math.max' | 'math.pow' | 'math.mod' | 'math.step' | 'math.smoothstep' | 'math.mix' | 'math.select' | 'layer.mixPainted' | 'math.dot' | 'math.distance' | 'math.cross' | 'compare.greaterThan' | 'compare.greaterThanOrEqual' | 'compare.lessThan' | 'compare.lessThanOrEqual' | 'compare.equal' | 'compare.notEqual' | 'boolean.not' | 'boolean.and' | 'boolean.or' | 'compose.vec2' | 'compose.vec3' | 'compose.vec4' | 'compose.rgba' | 'decompose.component' | 'decompose.split' | 'texture.sampler2d' | 'texture.sample2d' | 'texture.triplanarMapping' | 'scene.sampleColor' | 'scene.sampleDepth' | 'scene.fragmentDepth' | 'scene.ambientLight' | 'scene.directionalLight' | 'color.gradient' | 'utility.curve' | 'utility.namedRerouteDeclaration' | 'utility.namedRerouteUsage' | 'transform.translate' | 'transform.scale' | 'transform.rotateAxis' | 'uv.rotate' | 'uv.twirl' | 'uv.radial' | 'uv.bulge' | 'shape.rectangle' | 'shape.roundedRectangle' | 'noise.simplex' | 'noise.voronoi2d' | 'effect.fresnel' | 'effect.edgeDepth' | 'effect.depthFade' | 'util.panner' | 'uv.flipbook' | 'math.remap' | 'color.hueShift' | 'color.blend' | 'color.blend' | 'color.desaturate' | 'builtin.viewDir' | 'uv.pom' | 'math.reflect' | 'math.refract' | 'math.derivative' | 'color.unpackNormal';
7
+ export type ShaderGraphNodeKind = 'input.parameter' | 'input.slider' | 'constant.boolean' | 'constant.float' | 'constant.vec2' | 'constant.vec3' | 'constant.rgba' | 'builtin.uv' | 'builtin.screenUv' | 'builtin.color' | 'builtin.position' | 'builtin.worldPosition' | 'builtin.worldNormal' | 'builtin.objectPosition' | 'builtin.normal' | 'builtin.time' | 'builtin.camera' | 'builtin.viewMatrix' | 'builtin.projectionMatrix' | 'builtin.modelViewMatrix' | 'builtin.particle' | 'math.add' | 'math.subtract' | 'math.multiply' | 'math.divide' | 'math.oneMinus' | 'math.abs' | 'math.sign' | 'math.floor' | 'math.ceil' | 'math.fract' | 'math.sin' | 'math.cos' | 'math.tan' | 'math.asin' | 'math.acos' | 'math.atan' | 'math.atan2' | 'math.radians' | 'math.degrees' | 'math.sqrt' | 'math.inverseSqrt' | 'math.exp' | 'math.exp2' | 'math.log' | 'math.log2' | 'math.saturate' | 'math.length' | 'math.normalize' | 'math.clamp' | 'math.min' | 'math.max' | 'math.pow' | 'math.mod' | 'math.step' | 'math.smoothstep' | 'math.mix' | 'math.select' | 'layer.mixPainted' | 'math.dot' | 'math.distance' | 'math.cross' | 'compare.greaterThan' | 'compare.greaterThanOrEqual' | 'compare.lessThan' | 'compare.lessThanOrEqual' | 'compare.equal' | 'compare.notEqual' | 'boolean.not' | 'boolean.and' | 'boolean.or' | 'compose.vec2' | 'compose.vec3' | 'compose.vec4' | 'compose.rgba' | 'decompose.component' | 'decompose.split' | 'texture.sampler2d' | 'texture.sample2d' | 'texture.triplanarMapping' | 'scene.sampleColor' | 'scene.sampleDepth' | 'scene.fragmentDepth' | 'scene.ambientLight' | 'scene.directionalLight' | 'color.gradient' | 'utility.curve' | 'utility.namedRerouteDeclaration' | 'utility.namedRerouteUsage' | 'transform.translate' | 'transform.scale' | 'transform.rotateAxis' | 'uv.rotate' | 'uv.twirl' | 'uv.radial' | 'uv.bulge' | 'shape.rectangle' | 'shape.roundedRectangle' | 'noise.simplex' | 'noise.voronoi2d' | 'effect.fresnel' | 'effect.edgeDepth' | 'effect.depthFade' | 'util.panner' | 'uv.flipbook' | 'math.remap' | 'color.hueShift' | 'color.blend' | 'color.blend' | 'color.desaturate' | 'builtin.viewDir' | 'uv.pom' | 'math.reflect' | 'math.refract' | 'math.derivative' | 'color.unpackNormal';
8
8
  export type ShaderGraphSerializableValue = null | boolean | number | string | ShaderGraphSerializableValue[] | {
9
9
  [key: string]: ShaderGraphSerializableValue;
10
10
  };
@@ -1,4 +1,4 @@
1
- export const SHADER_GRAPH_NODE_DEFINITIONS={"input.parameter":{kind:"input.parameter",label:"Parameter",category:"Inputs",inputs:[],outputs:[{name:"value",type:"dynamic"}]},"input.slider":{kind:"input.slider",label:"Slider",category:"Inputs",inputs:[],outputs:[{name:"value",type:"float"}]},"constant.boolean":{kind:"constant.boolean",label:"Boolean",category:"Inputs",inputs:[],outputs:[{name:"value",type:"boolean"}]},"constant.float":{kind:"constant.float",label:"Float",category:"Inputs",inputs:[],outputs:[{name:"value",type:"float"}]},"constant.vec2":{kind:"constant.vec2",label:"Vec2",category:"Inputs",inputs:[],outputs:[{name:"value",type:"vec2"}]},"constant.vec3":{kind:"constant.vec3",label:"Vec3",category:"Inputs",inputs:[],outputs:[{name:"value",type:"vec3"}]},"constant.rgba":{kind:"constant.rgba",label:"Color",category:"Inputs",inputs:[],outputs:[{name:"value",type:"rgba"}]},"builtin.uv":{kind:"builtin.uv",label:"UV",category:"Attributes",inputs:[],outputs:[{name:"value",type:"vec2"},{name:"u",type:"float"},{name:"v",type:"float"}]},"builtin.screenUv":{kind:"builtin.screenUv",label:"Screen UV",category:"Attributes",inputs:[],outputs:[{name:"value",type:"vec2"}]},"builtin.color":{kind:"builtin.color",label:"Color Attribute",category:"Attributes",inputs:[],outputs:[{name:"value",type:"rgba"},{name:"rgb",type:"rgb"},{name:"r",type:"float"},{name:"g",type:"float"},{name:"b",type:"float"},{name:"a",type:"float"}]},"builtin.position":{kind:"builtin.position",label:"Position Attribute",category:"Attributes",inputs:[],outputs:[{name:"value",type:"vec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]},"builtin.worldPosition":{kind:"builtin.worldPosition",label:"World Position",category:"Attributes",inputs:[],outputs:[{name:"value",type:"vec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]},"builtin.objectPosition":{kind:"builtin.objectPosition",label:"Object Position",category:"Attributes",inputs:[],outputs:[{name:"value",type:"vec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]},"builtin.normal":{kind:"builtin.normal",label:"Normal Attribute",category:"Attributes",inputs:[],outputs:[{name:"value",type:"vec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]},"builtin.particle":{kind:"builtin.particle",label:"Particle",category:"Attributes",inputs:[],outputs:[{name:"energy",type:"float"},{name:"color",type:"rgb"},{name:"opacity",type:"float"},{name:"time",type:"float"}]},"builtin.time":{kind:"builtin.time",label:"Time",category:"Inputs",inputs:[],outputs:[{name:"value",type:"float"}]},"builtin.viewDir":{kind:"builtin.viewDir",label:"View Direction",category:"Attributes",inputs:[],outputs:[{name:"value",type:"vec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]},"builtin.camera":{kind:"builtin.camera",label:"Camera",category:"Inputs",inputs:[],outputs:[{name:"position",type:"vec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"},{name:"near",type:"float"},{name:"far",type:"float"}]},"builtin.viewMatrix":{kind:"builtin.viewMatrix",label:"View Matrix",category:"Inputs",inputs:[],outputs:[{name:"value",type:"mat4"}]},"builtin.projectionMatrix":{kind:"builtin.projectionMatrix",label:"Projection Matrix",category:"Inputs",inputs:[],outputs:[{name:"value",type:"mat4"}]},"builtin.modelViewMatrix":{kind:"builtin.modelViewMatrix",label:"Model View Matrix",category:"Inputs",inputs:[],outputs:[{name:"value",type:"mat4"}]},"scene.ambientLight":{kind:"scene.ambientLight",label:"Ambient Light",category:"Scene",inputs:[],outputs:[{name:"color",type:"rgb"}]},"scene.directionalLight":{kind:"scene.directionalLight",label:"Directional Light",category:"Scene",inputs:[],outputs:[{name:"color",type:"rgb"},{name:"direction",type:"vec3"}]},"math.add":{kind:"math.add",label:"Add",category:"Math",inputs:[{name:"a",type:"dynamic"},{name:"b",type:"dynamic"}],outputs:[{name:"value",type:"dynamic"}]},"math.subtract":{kind:"math.subtract",label:"Subtract",category:"Math",inputs:[{name:"a",type:"dynamic"},{name:"b",type:"dynamic"}],outputs:[{name:"value",type:"dynamic"}]},"math.multiply":{kind:"math.multiply",label:"Multiply",category:"Math",inputs:[{name:"a",type:"dynamic"},{name:"b",type:"dynamic"}],outputs:[{name:"value",type:"dynamic"}]},"math.divide":{kind:"math.divide",label:"Divide",category:"Math",inputs:[{name:"a",type:"dynamic"},{name:"b",type:"dynamic"}],outputs:[{name:"value",type:"dynamic"}]},"math.oneMinus":{kind:"math.oneMinus",label:"One Minus",category:"Math",inputs:[{name:"value",type:"dynamic"}],outputs:[{name:"value",type:"dynamic"}]},"math.abs":e("math.abs","Abs","Math"),"math.sign":e("math.sign","Sign","Math"),"math.floor":e("math.floor","Floor","Math"),"math.ceil":e("math.ceil","Ceil","Math"),"math.fract":e("math.fract","Fract","Math"),"math.sin":e("math.sin","Sine","Trigonometry"),"math.cos":e("math.cos","Cosine","Trigonometry"),"math.tan":e("math.tan","Tangent","Trigonometry"),"math.asin":e("math.asin","Arc Sine","Trigonometry"),"math.acos":e("math.acos","Arc Cosine","Trigonometry"),"math.atan":e("math.atan","Arc Tangent","Trigonometry"),"math.atan2":{kind:"math.atan2",label:"Arc Tangent 2",category:"Trigonometry",inputs:[{name:"y",type:"dynamic"},{name:"x",type:"dynamic"}],outputs:[{name:"value",type:"dynamic"}]},"math.radians":e("math.radians","Radians","Trigonometry"),"math.degrees":e("math.degrees","Degrees","Trigonometry"),"math.sqrt":e("math.sqrt","Square Root","Math"),"math.inverseSqrt":e("math.inverseSqrt","Inverse Square Root","Math"),"math.exp":e("math.exp","Exp","Math"),"math.exp2":e("math.exp2","Exp2","Math"),"math.log":e("math.log","Log","Math"),"math.log2":e("math.log2","Log2","Math"),"math.saturate":e("math.saturate","Saturate","Math"),"math.length":{kind:"math.length",label:"Length",category:"Vectors",inputs:[{name:"value",type:"dynamic"}],outputs:[{name:"value",type:"float"}]},"math.normalize":e("math.normalize","Normalize","Vectors"),"math.clamp":{kind:"math.clamp",label:"Clamp",category:"Math",inputs:[{name:"value",type:"dynamic"},{name:"min",type:"dynamic",defaultValue:0},{name:"max",type:"dynamic",defaultValue:1}],outputs:[{name:"value",type:"dynamic"}]},"math.min":t("math.min","Min"),"math.max":t("math.max","Max"),"math.pow":t("math.pow","Power"),"math.mod":t("math.mod","Modulo"),"math.step":t("math.step","Step"),"math.smoothstep":{kind:"math.smoothstep",label:"Smoothstep",category:"Math",inputs:[{name:"edge0",type:"dynamic",defaultValue:0},{name:"edge1",type:"dynamic",defaultValue:1},{name:"value",type:"dynamic"}],outputs:[{name:"value",type:"dynamic"}]},"math.mix":{kind:"math.mix",label:"Mix",category:"Math",inputs:[{name:"a",type:"dynamic"},{name:"b",type:"dynamic"},{name:"t",type:"dynamic",defaultValue:.5}],outputs:[{name:"value",type:"dynamic"}]},"math.remap":{kind:"math.remap",label:"Remap",category:"Math",inputs:[{name:"value",type:"float"},{name:"inMin",type:"float",defaultValue:-1},{name:"inMax",type:"float",defaultValue:1},{name:"outMin",type:"float",defaultValue:0},{name:"outMax",type:"float",defaultValue:1}],outputs:[{name:"value",type:"float"}]},"math.reflect":{kind:"math.reflect",label:"Reflect",category:"Math",inputs:[{name:"incident",type:"dynamic"},{name:"normal",type:"dynamic"}],outputs:[{name:"value",type:"dynamic"}]},"math.refract":{kind:"math.refract",label:"Refract",category:"Math",inputs:[{name:"incident",type:"dynamic"},{name:"normal",type:"dynamic"},{name:"ior",type:"float",defaultValue:1.5}],outputs:[{name:"value",type:"dynamic"}]},"math.derivative":{kind:"math.derivative",label:"Derivative",category:"Math",inputs:[{name:"value",type:"dynamic"}],outputs:[{name:"value",type:"dynamic"}]},"math.select":{kind:"math.select",label:"Select",category:"Math",inputs:[{name:"condition",type:"boolean"},{name:"a",type:"dynamic"},{name:"b",type:"dynamic"}],outputs:[{name:"value",type:"dynamic"}]},"layer.mixPainted":{kind:"layer.mixPainted",label:"Mix Painted Layers",category:"Layers",inputs:[{name:"base",type:"dynamic"},...Array.from({length:8},(e,t)=>({name:`layer${t+1}`,label:`Layer ${t+1}`,type:"dynamic",optional:!0})),{name:"softness",type:"float",optional:!0},{name:"noiseScale",label:"Noise Scale",type:"float",optional:!0},{name:"noiseAmount",label:"Noise Amount",type:"float",optional:!0}],outputs:[{name:"value",type:"dynamic"}]},"math.dot":{kind:"math.dot",label:"Dot Product",category:"Vectors",inputs:[{name:"a",type:"dynamic"},{name:"b",type:"dynamic"}],outputs:[{name:"value",type:"float"}]},"math.distance":{kind:"math.distance",label:"Distance",category:"Vectors",inputs:[{name:"a",type:"dynamic"},{name:"b",type:"dynamic"}],outputs:[{name:"value",type:"float"}]},"math.cross":{kind:"math.cross",label:"Cross Product",category:"Vectors",inputs:[{name:"a",type:"vec3"},{name:"b",type:"vec3"}],outputs:[{name:"value",type:"vec3"}]},"compare.greaterThan":a("compare.greaterThan","Greater Than"),"compare.greaterThanOrEqual":a("compare.greaterThanOrEqual","Greater Than Or Equal"),"compare.lessThan":a("compare.lessThan","Less Than"),"compare.lessThanOrEqual":a("compare.lessThanOrEqual","Less Than Or Equal"),"compare.equal":a("compare.equal","Equal"),"compare.notEqual":a("compare.notEqual","Not Equal"),"boolean.not":{kind:"boolean.not",label:"Not",category:"Boolean",inputs:[{name:"value",type:"boolean"}],outputs:[{name:"value",type:"boolean"}]},"boolean.and":n("boolean.and","And"),"boolean.or":n("boolean.or","Or"),"compose.vec2":{kind:"compose.vec2",label:"Compose Vec2",category:"Vectors",inputs:[{name:"x",type:"float"},{name:"y",type:"float"}],outputs:[{name:"value",type:"vec2"}]},"compose.vec3":{kind:"compose.vec3",label:"Compose Vec3",category:"Vectors",inputs:[{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}],outputs:[{name:"value",type:"vec3"}]},"compose.vec4":{kind:"compose.vec4",label:"Compose Vec4",category:"Vectors",inputs:[{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"},{name:"w",type:"float"}],outputs:[{name:"value",type:"vec4"}]},"compose.rgba":{kind:"compose.rgba",label:"Compose RGBA",category:"Color",inputs:[{name:"r",type:"float",defaultValue:1},{name:"g",type:"float",defaultValue:1},{name:"b",type:"float",defaultValue:1},{name:"a",type:"float",defaultValue:1}],outputs:[{name:"value",type:"rgba"}]},"decompose.component":{kind:"decompose.component",label:"Component",category:"Vectors",inputs:[{name:"value",type:"dynamic"}],outputs:[{name:"value",type:"float"}]},"decompose.split":{kind:"decompose.split",label:"Split Components",category:"Vectors",inputs:[{name:"value",type:"dynamic"}],outputs:[{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"},{name:"w",type:"float"},{name:"r",type:"float"},{name:"g",type:"float"},{name:"b",type:"float"},{name:"a",type:"float"},{name:"u",type:"float"},{name:"v",type:"float"}]},"color.gradient":{kind:"color.gradient",label:"Gradient",category:"Color",inputs:[{name:"t",type:"float",defaultValue:.5}],outputs:[{name:"value",type:"rgba"}]},"utility.curve":{kind:"utility.curve",label:"Curve",category:"Utilities",inputs:[{name:"t",type:"float",defaultValue:.5}],outputs:[{name:"value",type:"float"}]},"utility.namedRerouteDeclaration":{kind:"utility.namedRerouteDeclaration",label:"Named Reroute Declaration",category:"Utilities",inputs:[{name:"value",type:"dynamic"}],outputs:[{name:"value",type:"dynamic"}]},"utility.namedRerouteUsage":{kind:"utility.namedRerouteUsage",label:"Named Reroute Usage",category:"Utilities",inputs:[],outputs:[{name:"value",type:"dynamic"}]},"color.hueShift":{kind:"color.hueShift",label:"Hue Shift",category:"Color",inputs:[{name:"color",type:"dynamic"},{name:"shift",type:"float"}],outputs:[{name:"value",type:"dynamic"}]},"color.blend":{kind:"color.blend",label:"Blend Colors",category:"Color",inputs:[{name:"base",type:"dynamic"},{name:"blend",type:"dynamic"}],outputs:[{name:"value",type:"dynamic"}]},"color.desaturate":{kind:"color.desaturate",label:"Desaturate",category:"Color",inputs:[{name:"color",type:"dynamic"},{name:"fraction",type:"float",defaultValue:1}],outputs:[{name:"value",type:"dynamic"}]},"color.unpackNormal":{kind:"color.unpackNormal",label:"Unpack Normal",category:"Textures",inputs:[{name:"color",type:"dynamic"},{name:"scale",type:"float",defaultValue:1},{name:"normal",type:"vec3",optional:!0,inlineLiteral:!1}],outputs:[{name:"value",type:"vec3"}]},"texture.sampler2d":{kind:"texture.sampler2d",label:"Sampler 2D",category:"Texture",inputs:[{name:"texture",type:"texture2d"}],outputs:[{name:"value",type:"sampler2d"}]},"texture.sample2d":{kind:"texture.sample2d",label:"Sample Texture 2D",category:"Textures",inputs:[{name:"sampler",type:"sampler2d"},{name:"uv",type:"vec2",inlineLiteral:!1}],outputs:[{name:"rgba",type:"rgba"},{name:"rgb",type:"rgb"},{name:"r",type:"float"},{name:"g",type:"float"},{name:"b",type:"float"},{name:"a",type:"float"}]},"texture.triplanarMapping":{kind:"texture.triplanarMapping",label:"Triplanar Mapping",category:"Textures",inputs:[{name:"sampler",type:"sampler2d"},{name:"scale",type:"float",defaultValue:1},{name:"normal",type:"vec3",inlineLiteral:!1},{name:"position",type:"vec3",inlineLiteral:!1}],outputs:[{name:"rgba",type:"rgba"},{name:"rgb",type:"rgb"},{name:"r",type:"float"},{name:"g",type:"float"},{name:"b",type:"float"},{name:"a",type:"float"}]},"scene.sampleColor":{kind:"scene.sampleColor",label:"Sample Scene Color",category:"Texture",inputs:[{name:"uv",type:"vec2",inlineLiteral:!1}],outputs:[{name:"rgba",type:"rgba"},{name:"rgb",type:"rgb"},{name:"r",type:"float"},{name:"g",type:"float"},{name:"b",type:"float"},{name:"a",type:"float"}]},"scene.sampleDepth":{kind:"scene.sampleDepth",label:"Sample Scene Depth",category:"Texture",inputs:[{name:"uv",type:"vec2",inlineLiteral:!1}],outputs:[{name:"depth",type:"float"},{name:"linearEyeDepth",type:"float"}]},"scene.fragmentDepth":{kind:"scene.fragmentDepth",label:"Fragment Depth",category:"Texture",inputs:[],outputs:[{name:"linearEyeDepth",type:"float"}]},"transform.translate":{kind:"transform.translate",label:"Translate",category:"Transform",inputs:[{name:"offset",type:"vec3",defaultValue:[0,0,0]}],outputs:[{name:"value",type:"mat4"}]},"transform.scale":{kind:"transform.scale",label:"Scale",category:"Transform",inputs:[{name:"scale",type:"vec3",defaultValue:[1,1,1]}],outputs:[{name:"value",type:"mat4"}]},"transform.rotateAxis":{kind:"transform.rotateAxis",label:"Rotate Axis",category:"Transform",inputs:[{name:"axis",type:"vec3",defaultValue:[0,1,0]},{name:"angle",type:"float",defaultValue:0}],outputs:[{name:"value",type:"mat4"}]},"uv.rotate":{kind:"uv.rotate",label:"Rotate UV",category:"UV",inputs:[{name:"uv",type:"vec2",inlineLiteral:!1},{name:"angle",type:"float",defaultValue:0},{name:"center",type:"vec2",optional:!0,defaultValue:[.5,.5]}],outputs:[{name:"value",type:"vec2"}]},"uv.twirl":{kind:"uv.twirl",label:"Twirl UV",category:"UV",inputs:[{name:"uv",type:"vec2",inlineLiteral:!1},{name:"strength",type:"float",defaultValue:1},{name:"center",type:"vec2",optional:!0,defaultValue:[.5,.5]},{name:"offset",type:"vec2",optional:!0,defaultValue:[0,0]}],outputs:[{name:"value",type:"vec2"}]},"uv.radial":{kind:"uv.radial",label:"Radial UV",category:"UV",inputs:[{name:"uv",type:"vec2",inlineLiteral:!1}],outputs:[{name:"coords",type:"vec2"},{name:"radius",type:"float"},{name:"angle",type:"float"}]},"uv.bulge":{kind:"uv.bulge",label:"Bulge UV",category:"UV",inputs:[{name:"uv",type:"vec2",inlineLiteral:!1},{name:"center",type:"vec2",optional:!0,defaultValue:[.5,.5]},{name:"power",type:"float",optional:!0,defaultValue:1}],outputs:[{name:"value",type:"vec2"}]},"uv.flipbook":{kind:"uv.flipbook",label:"Flipbook UV",category:"UV",inputs:[{name:"uv",type:"vec2",optional:!0,inlineLiteral:!1},{name:"columns",type:"float",optional:!0,defaultValue:1},{name:"rows",type:"float",optional:!0,defaultValue:1},{name:"fps",type:"float",optional:!0,defaultValue:60},{name:"time",type:"float",optional:!0,inlineLiteral:!1}],outputs:[{name:"value",type:"vec2"}]},"uv.pom":{kind:"uv.pom",label:"Parallax Occlusion",category:"UV",inputs:[{name:"uv",type:"vec2",optional:!0,inlineLiteral:!1},{name:"heightMap",type:"sampler2d"},{name:"heightScale",type:"float",optional:!0,defaultValue:.05}],outputs:[{name:"value",type:"vec2"}]},"shape.rectangle":{kind:"shape.rectangle",label:"Rectangle",category:"Shapes",inputs:[{name:"uv",type:"vec2",inlineLiteral:!1},{name:"width",type:"float",defaultValue:.5},{name:"height",type:"float",defaultValue:.5}],outputs:[{name:"value",type:"float"}]},"shape.roundedRectangle":{kind:"shape.roundedRectangle",label:"Rounded Rectangle",category:"Shapes",inputs:[{name:"uv",type:"vec2",inlineLiteral:!1},{name:"width",type:"float",defaultValue:.5},{name:"height",type:"float",defaultValue:.5},{name:"radius",type:"float",defaultValue:.1}],outputs:[{name:"value",type:"float"}]},"noise.simplex":{kind:"noise.simplex",label:"Simplex Noise",category:"Noise",inputs:[{name:"uv",type:"vec2",inlineLiteral:!1},{name:"scale",type:"float",optional:!0,defaultValue:8}],outputs:[{name:"value",type:"float"}]},"noise.voronoi2d":{kind:"noise.voronoi2d",label:"Voronoi",category:"Noise",inputs:[{name:"uv",type:"vec2",inlineLiteral:!1},{name:"scale",type:"float",optional:!0,defaultValue:8}],outputs:[{name:"value",type:"float"}]},"effect.fresnel":{kind:"effect.fresnel",label:"Fresnel",category:"Effects",inputs:[{name:"power",type:"float",optional:!0,defaultValue:1}],outputs:[{name:"value",type:"float"}]},"effect.edgeDepth":{kind:"effect.edgeDepth",label:"Edge Depth",category:"Effects",inputs:[{name:"power",type:"float",optional:!0,defaultValue:1}],outputs:[{name:"value",type:"float"}]},"effect.depthFade":{kind:"effect.depthFade",label:"Depth Fade",category:"Effects",inputs:[{name:"distance",type:"float",optional:!0,defaultValue:1}],outputs:[{name:"value",type:"float"}]},"util.panner":{kind:"util.panner",label:"Panner",category:"Utilities",inputs:[{name:"uv",type:"vec2",inlineLiteral:!1},{name:"speed",type:"vec2",defaultValue:[0,0]},{name:"tile",type:"vec2",defaultValue:[1,1]},{name:"time",type:"float",optional:!0,inlineLiteral:!1}],outputs:[{name:"value",type:"vec2"}]}};export const SHADER_GRAPH_NODE_KINDS=Object.keys(SHADER_GRAPH_NODE_DEFINITIONS);function e(e,t,a){return{kind:e,label:t,category:a,inputs:[{name:"value",type:"dynamic"}],outputs:[{name:"value",type:"dynamic"}]}}function t(e,t){return{kind:e,label:t,category:"Math",inputs:[{name:"a",type:"dynamic"},{name:"b",type:"dynamic"}],outputs:[{name:"value",type:"dynamic"}]}}function a(e,t){return{kind:e,label:t,category:"Comparison",inputs:[{name:"a",type:"float"},{name:"b",type:"float"}],outputs:[{name:"value",type:"boolean"}]}}function n(e,t){return{kind:e,label:t,category:"Boolean",inputs:[{name:"a",type:"boolean"},{name:"b",type:"boolean"}],outputs:[{name:"value",type:"boolean"}]}}export function inlineLiteralTypeForPort(e,t){if(!1!==t.inlineLiteral)return"float"===t.type||"vec2"===t.type||"vec3"===t.type||"vec4"===t.type?t.type:"dynamic"===t.type&&function(e){return e.startsWith("math.")&&"math.reflect"!==e&&"math.refract"!==e}(e)?"float":void 0}export function defaultInlineLiteralValueForPort(e,t){const a=inlineLiteralTypeForPort(e,t);if(null!=a){if(void 0!==t.defaultValue)return l(t.defaultValue);if("math.multiply"===e)return 1;switch(a){case"float":return 0;case"vec2":return[0,0];case"vec3":return[0,0,0];case"vec4":return[0,0,0,1]}}}function l(e){return Array.isArray(e)?e.map(e=>l(e)):null!=e&&"object"==typeof e?Object.fromEntries(Object.entries(e).map(([e,t])=>[e,l(t)])):e}/*
1
+ export const SHADER_GRAPH_NODE_DEFINITIONS={"input.parameter":{kind:"input.parameter",label:"Parameter",category:"Inputs",inputs:[],outputs:[{name:"value",type:"dynamic"}]},"input.slider":{kind:"input.slider",label:"Slider",category:"Inputs",inputs:[],outputs:[{name:"value",type:"float"}]},"constant.boolean":{kind:"constant.boolean",label:"Boolean",category:"Inputs",inputs:[],outputs:[{name:"value",type:"boolean"}]},"constant.float":{kind:"constant.float",label:"Float",category:"Inputs",inputs:[],outputs:[{name:"value",type:"float"}]},"constant.vec2":{kind:"constant.vec2",label:"Vec2",category:"Inputs",inputs:[],outputs:[{name:"value",type:"vec2"}]},"constant.vec3":{kind:"constant.vec3",label:"Vec3",category:"Inputs",inputs:[],outputs:[{name:"value",type:"vec3"}]},"constant.rgba":{kind:"constant.rgba",label:"Color",category:"Inputs",inputs:[],outputs:[{name:"value",type:"rgba"}]},"builtin.uv":{kind:"builtin.uv",label:"UV",category:"Attributes",inputs:[],outputs:[{name:"value",type:"vec2"},{name:"u",type:"float"},{name:"v",type:"float"}]},"builtin.screenUv":{kind:"builtin.screenUv",label:"Screen UV",category:"Attributes",inputs:[],outputs:[{name:"value",type:"vec2"}]},"builtin.color":{kind:"builtin.color",label:"Color Attribute",category:"Attributes",inputs:[],outputs:[{name:"value",type:"rgba"},{name:"rgb",type:"rgb"},{name:"r",type:"float"},{name:"g",type:"float"},{name:"b",type:"float"},{name:"a",type:"float"}]},"builtin.position":{kind:"builtin.position",label:"Position Attribute",category:"Attributes",inputs:[],outputs:[{name:"value",type:"vec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]},"builtin.worldPosition":{kind:"builtin.worldPosition",label:"World Position",category:"Attributes",inputs:[],outputs:[{name:"value",type:"vec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]},"builtin.worldNormal":{kind:"builtin.worldNormal",label:"World Normal",category:"Attributes",inputs:[],outputs:[{name:"value",type:"vec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]},"builtin.objectPosition":{kind:"builtin.objectPosition",label:"Object Position",category:"Attributes",inputs:[],outputs:[{name:"value",type:"vec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]},"builtin.normal":{kind:"builtin.normal",label:"Normal Attribute",category:"Attributes",inputs:[],outputs:[{name:"value",type:"vec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]},"builtin.particle":{kind:"builtin.particle",label:"Particle",category:"Attributes",inputs:[],outputs:[{name:"energy",type:"float"},{name:"color",type:"rgb"},{name:"opacity",type:"float"},{name:"time",type:"float"}]},"builtin.time":{kind:"builtin.time",label:"Time",category:"Inputs",inputs:[],outputs:[{name:"value",type:"float"}]},"builtin.viewDir":{kind:"builtin.viewDir",label:"View Direction",category:"Attributes",inputs:[],outputs:[{name:"value",type:"vec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]},"builtin.camera":{kind:"builtin.camera",label:"Camera",category:"Inputs",inputs:[],outputs:[{name:"position",type:"vec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"},{name:"near",type:"float"},{name:"far",type:"float"}]},"builtin.viewMatrix":{kind:"builtin.viewMatrix",label:"View Matrix",category:"Inputs",inputs:[],outputs:[{name:"value",type:"mat4"}]},"builtin.projectionMatrix":{kind:"builtin.projectionMatrix",label:"Projection Matrix",category:"Inputs",inputs:[],outputs:[{name:"value",type:"mat4"}]},"builtin.modelViewMatrix":{kind:"builtin.modelViewMatrix",label:"Model View Matrix",category:"Inputs",inputs:[],outputs:[{name:"value",type:"mat4"}]},"scene.ambientLight":{kind:"scene.ambientLight",label:"Ambient Light",category:"Scene",inputs:[],outputs:[{name:"color",type:"rgb"}]},"scene.directionalLight":{kind:"scene.directionalLight",label:"Directional Light",category:"Scene",inputs:[],outputs:[{name:"color",type:"rgb"},{name:"direction",type:"vec3"}]},"math.add":{kind:"math.add",label:"Add",category:"Math",inputs:[{name:"a",type:"dynamic"},{name:"b",type:"dynamic"}],outputs:[{name:"value",type:"dynamic"}]},"math.subtract":{kind:"math.subtract",label:"Subtract",category:"Math",inputs:[{name:"a",type:"dynamic"},{name:"b",type:"dynamic"}],outputs:[{name:"value",type:"dynamic"}]},"math.multiply":{kind:"math.multiply",label:"Multiply",category:"Math",inputs:[{name:"a",type:"dynamic"},{name:"b",type:"dynamic"}],outputs:[{name:"value",type:"dynamic"}]},"math.divide":{kind:"math.divide",label:"Divide",category:"Math",inputs:[{name:"a",type:"dynamic"},{name:"b",type:"dynamic"}],outputs:[{name:"value",type:"dynamic"}]},"math.oneMinus":{kind:"math.oneMinus",label:"One Minus",category:"Math",inputs:[{name:"value",type:"dynamic"}],outputs:[{name:"value",type:"dynamic"}]},"math.abs":e("math.abs","Abs","Math"),"math.sign":e("math.sign","Sign","Math"),"math.floor":e("math.floor","Floor","Math"),"math.ceil":e("math.ceil","Ceil","Math"),"math.fract":e("math.fract","Fract","Math"),"math.sin":e("math.sin","Sine","Trigonometry"),"math.cos":e("math.cos","Cosine","Trigonometry"),"math.tan":e("math.tan","Tangent","Trigonometry"),"math.asin":e("math.asin","Arc Sine","Trigonometry"),"math.acos":e("math.acos","Arc Cosine","Trigonometry"),"math.atan":e("math.atan","Arc Tangent","Trigonometry"),"math.atan2":{kind:"math.atan2",label:"Arc Tangent 2",category:"Trigonometry",inputs:[{name:"y",type:"dynamic"},{name:"x",type:"dynamic"}],outputs:[{name:"value",type:"dynamic"}]},"math.radians":e("math.radians","Radians","Trigonometry"),"math.degrees":e("math.degrees","Degrees","Trigonometry"),"math.sqrt":e("math.sqrt","Square Root","Math"),"math.inverseSqrt":e("math.inverseSqrt","Inverse Square Root","Math"),"math.exp":e("math.exp","Exp","Math"),"math.exp2":e("math.exp2","Exp2","Math"),"math.log":e("math.log","Log","Math"),"math.log2":e("math.log2","Log2","Math"),"math.saturate":e("math.saturate","Saturate","Math"),"math.length":{kind:"math.length",label:"Length",category:"Vectors",inputs:[{name:"value",type:"dynamic"}],outputs:[{name:"value",type:"float"}]},"math.normalize":e("math.normalize","Normalize","Vectors"),"math.clamp":{kind:"math.clamp",label:"Clamp",category:"Math",inputs:[{name:"value",type:"dynamic"},{name:"min",type:"dynamic",defaultValue:0},{name:"max",type:"dynamic",defaultValue:1}],outputs:[{name:"value",type:"dynamic"}]},"math.min":t("math.min","Min"),"math.max":t("math.max","Max"),"math.pow":t("math.pow","Power"),"math.mod":t("math.mod","Modulo"),"math.step":t("math.step","Step"),"math.smoothstep":{kind:"math.smoothstep",label:"Smoothstep",category:"Math",inputs:[{name:"edge0",type:"dynamic",defaultValue:0},{name:"edge1",type:"dynamic",defaultValue:1},{name:"value",type:"dynamic"}],outputs:[{name:"value",type:"dynamic"}]},"math.mix":{kind:"math.mix",label:"Mix",category:"Math",inputs:[{name:"a",type:"dynamic"},{name:"b",type:"dynamic"},{name:"t",type:"dynamic",defaultValue:.5}],outputs:[{name:"value",type:"dynamic"}]},"math.remap":{kind:"math.remap",label:"Remap",category:"Math",inputs:[{name:"value",type:"float"},{name:"inMin",type:"float",defaultValue:-1},{name:"inMax",type:"float",defaultValue:1},{name:"outMin",type:"float",defaultValue:0},{name:"outMax",type:"float",defaultValue:1}],outputs:[{name:"value",type:"float"}]},"math.reflect":{kind:"math.reflect",label:"Reflect",category:"Math",inputs:[{name:"incident",type:"dynamic"},{name:"normal",type:"dynamic"}],outputs:[{name:"value",type:"dynamic"}]},"math.refract":{kind:"math.refract",label:"Refract",category:"Math",inputs:[{name:"incident",type:"dynamic"},{name:"normal",type:"dynamic"},{name:"ior",type:"float",defaultValue:1.5}],outputs:[{name:"value",type:"dynamic"}]},"math.derivative":{kind:"math.derivative",label:"Derivative",category:"Math",inputs:[{name:"value",type:"dynamic"}],outputs:[{name:"value",type:"dynamic"}]},"math.select":{kind:"math.select",label:"Select",category:"Math",inputs:[{name:"condition",type:"boolean"},{name:"a",type:"dynamic"},{name:"b",type:"dynamic"}],outputs:[{name:"value",type:"dynamic"}]},"layer.mixPainted":{kind:"layer.mixPainted",label:"Mix Painted Layers",category:"Layers",inputs:[{name:"base",type:"dynamic"},...Array.from({length:8},(e,t)=>({name:`layer${t+1}`,label:`Layer ${t+1}`,type:"dynamic",optional:!0})),{name:"softness",type:"float",optional:!0},{name:"noiseScale",label:"Noise Scale",type:"float",optional:!0},{name:"noiseAmount",label:"Noise Amount",type:"float",optional:!0}],outputs:[{name:"value",type:"dynamic"}]},"math.dot":{kind:"math.dot",label:"Dot Product",category:"Vectors",inputs:[{name:"a",type:"dynamic"},{name:"b",type:"dynamic"}],outputs:[{name:"value",type:"float"}]},"math.distance":{kind:"math.distance",label:"Distance",category:"Vectors",inputs:[{name:"a",type:"dynamic"},{name:"b",type:"dynamic"}],outputs:[{name:"value",type:"float"}]},"math.cross":{kind:"math.cross",label:"Cross Product",category:"Vectors",inputs:[{name:"a",type:"vec3"},{name:"b",type:"vec3"}],outputs:[{name:"value",type:"vec3"}]},"compare.greaterThan":a("compare.greaterThan","Greater Than"),"compare.greaterThanOrEqual":a("compare.greaterThanOrEqual","Greater Than Or Equal"),"compare.lessThan":a("compare.lessThan","Less Than"),"compare.lessThanOrEqual":a("compare.lessThanOrEqual","Less Than Or Equal"),"compare.equal":a("compare.equal","Equal"),"compare.notEqual":a("compare.notEqual","Not Equal"),"boolean.not":{kind:"boolean.not",label:"Not",category:"Boolean",inputs:[{name:"value",type:"boolean"}],outputs:[{name:"value",type:"boolean"}]},"boolean.and":n("boolean.and","And"),"boolean.or":n("boolean.or","Or"),"compose.vec2":{kind:"compose.vec2",label:"Compose Vec2",category:"Vectors",inputs:[{name:"x",type:"float"},{name:"y",type:"float"}],outputs:[{name:"value",type:"vec2"}]},"compose.vec3":{kind:"compose.vec3",label:"Compose Vec3",category:"Vectors",inputs:[{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}],outputs:[{name:"value",type:"vec3"}]},"compose.vec4":{kind:"compose.vec4",label:"Compose Vec4",category:"Vectors",inputs:[{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"},{name:"w",type:"float"}],outputs:[{name:"value",type:"vec4"}]},"compose.rgba":{kind:"compose.rgba",label:"Compose RGBA",category:"Color",inputs:[{name:"r",type:"float",defaultValue:1},{name:"g",type:"float",defaultValue:1},{name:"b",type:"float",defaultValue:1},{name:"a",type:"float",defaultValue:1}],outputs:[{name:"value",type:"rgba"}]},"decompose.component":{kind:"decompose.component",label:"Component",category:"Vectors",inputs:[{name:"value",type:"dynamic"}],outputs:[{name:"value",type:"float"}]},"decompose.split":{kind:"decompose.split",label:"Split Components",category:"Vectors",inputs:[{name:"value",type:"dynamic"}],outputs:[{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"},{name:"w",type:"float"},{name:"r",type:"float"},{name:"g",type:"float"},{name:"b",type:"float"},{name:"a",type:"float"},{name:"u",type:"float"},{name:"v",type:"float"}]},"color.gradient":{kind:"color.gradient",label:"Gradient",category:"Color",inputs:[{name:"t",type:"float",defaultValue:.5}],outputs:[{name:"value",type:"rgba"}]},"utility.curve":{kind:"utility.curve",label:"Curve",category:"Utilities",inputs:[{name:"t",type:"float",defaultValue:.5}],outputs:[{name:"value",type:"float"}]},"utility.namedRerouteDeclaration":{kind:"utility.namedRerouteDeclaration",label:"Named Reroute Declaration",category:"Utilities",inputs:[{name:"value",type:"dynamic"}],outputs:[{name:"value",type:"dynamic"}]},"utility.namedRerouteUsage":{kind:"utility.namedRerouteUsage",label:"Named Reroute Usage",category:"Utilities",inputs:[],outputs:[{name:"value",type:"dynamic"}]},"color.hueShift":{kind:"color.hueShift",label:"Hue Shift",category:"Color",inputs:[{name:"color",type:"dynamic"},{name:"shift",type:"float"}],outputs:[{name:"value",type:"dynamic"}]},"color.blend":{kind:"color.blend",label:"Blend Colors",category:"Color",inputs:[{name:"base",type:"dynamic"},{name:"blend",type:"dynamic"}],outputs:[{name:"value",type:"dynamic"}]},"color.desaturate":{kind:"color.desaturate",label:"Desaturate",category:"Color",inputs:[{name:"color",type:"dynamic"},{name:"fraction",type:"float",defaultValue:1}],outputs:[{name:"value",type:"dynamic"}]},"color.unpackNormal":{kind:"color.unpackNormal",label:"Unpack Normal",category:"Textures",inputs:[{name:"color",type:"dynamic"},{name:"scale",type:"float",defaultValue:1},{name:"normal",type:"vec3",optional:!0,inlineLiteral:!1}],outputs:[{name:"value",type:"vec3"}]},"texture.sampler2d":{kind:"texture.sampler2d",label:"Sampler 2D",category:"Texture",inputs:[{name:"texture",type:"texture2d"}],outputs:[{name:"value",type:"sampler2d"}]},"texture.sample2d":{kind:"texture.sample2d",label:"Sample Texture 2D",category:"Textures",inputs:[{name:"sampler",type:"sampler2d"},{name:"uv",type:"vec2",inlineLiteral:!1}],outputs:[{name:"rgba",type:"rgba"},{name:"rgb",type:"rgb"},{name:"r",type:"float"},{name:"g",type:"float"},{name:"b",type:"float"},{name:"a",type:"float"}]},"texture.triplanarMapping":{kind:"texture.triplanarMapping",label:"Triplanar Mapping",category:"Textures",inputs:[{name:"sampler",type:"sampler2d"},{name:"scale",type:"float",defaultValue:1},{name:"normal",type:"vec3",inlineLiteral:!1},{name:"position",type:"vec3",inlineLiteral:!1}],outputs:[{name:"rgba",type:"rgba"},{name:"rgb",type:"rgb"},{name:"r",type:"float"},{name:"g",type:"float"},{name:"b",type:"float"},{name:"a",type:"float"}]},"scene.sampleColor":{kind:"scene.sampleColor",label:"Sample Scene Color",category:"Texture",inputs:[{name:"uv",type:"vec2",inlineLiteral:!1}],outputs:[{name:"rgba",type:"rgba"},{name:"rgb",type:"rgb"},{name:"r",type:"float"},{name:"g",type:"float"},{name:"b",type:"float"},{name:"a",type:"float"}]},"scene.sampleDepth":{kind:"scene.sampleDepth",label:"Sample Scene Depth",category:"Texture",inputs:[{name:"uv",type:"vec2",inlineLiteral:!1}],outputs:[{name:"depth",type:"float"},{name:"linearEyeDepth",type:"float"}]},"scene.fragmentDepth":{kind:"scene.fragmentDepth",label:"Fragment Depth",category:"Texture",inputs:[],outputs:[{name:"linearEyeDepth",type:"float"}]},"transform.translate":{kind:"transform.translate",label:"Translate",category:"Transform",inputs:[{name:"offset",type:"vec3",defaultValue:[0,0,0]}],outputs:[{name:"value",type:"mat4"}]},"transform.scale":{kind:"transform.scale",label:"Scale",category:"Transform",inputs:[{name:"scale",type:"vec3",defaultValue:[1,1,1]}],outputs:[{name:"value",type:"mat4"}]},"transform.rotateAxis":{kind:"transform.rotateAxis",label:"Rotate Axis",category:"Transform",inputs:[{name:"axis",type:"vec3",defaultValue:[0,1,0]},{name:"angle",type:"float",defaultValue:0}],outputs:[{name:"value",type:"mat4"}]},"uv.rotate":{kind:"uv.rotate",label:"Rotate UV",category:"UV",inputs:[{name:"uv",type:"vec2",inlineLiteral:!1},{name:"angle",type:"float",defaultValue:0},{name:"center",type:"vec2",optional:!0,defaultValue:[.5,.5]}],outputs:[{name:"value",type:"vec2"}]},"uv.twirl":{kind:"uv.twirl",label:"Twirl UV",category:"UV",inputs:[{name:"uv",type:"vec2",inlineLiteral:!1},{name:"strength",type:"float",defaultValue:1},{name:"center",type:"vec2",optional:!0,defaultValue:[.5,.5]},{name:"offset",type:"vec2",optional:!0,defaultValue:[0,0]}],outputs:[{name:"value",type:"vec2"}]},"uv.radial":{kind:"uv.radial",label:"Radial UV",category:"UV",inputs:[{name:"uv",type:"vec2",inlineLiteral:!1}],outputs:[{name:"coords",type:"vec2"},{name:"radius",type:"float"},{name:"angle",type:"float"}]},"uv.bulge":{kind:"uv.bulge",label:"Bulge UV",category:"UV",inputs:[{name:"uv",type:"vec2",inlineLiteral:!1},{name:"center",type:"vec2",optional:!0,defaultValue:[.5,.5]},{name:"power",type:"float",optional:!0,defaultValue:1}],outputs:[{name:"value",type:"vec2"}]},"uv.flipbook":{kind:"uv.flipbook",label:"Flipbook UV",category:"UV",inputs:[{name:"uv",type:"vec2",optional:!0,inlineLiteral:!1},{name:"columns",type:"float",optional:!0,defaultValue:1},{name:"rows",type:"float",optional:!0,defaultValue:1},{name:"fps",type:"float",optional:!0,defaultValue:60},{name:"time",type:"float",optional:!0,inlineLiteral:!1}],outputs:[{name:"value",type:"vec2"}]},"uv.pom":{kind:"uv.pom",label:"Parallax Occlusion",category:"UV",inputs:[{name:"uv",type:"vec2",optional:!0,inlineLiteral:!1},{name:"heightMap",type:"sampler2d"},{name:"heightScale",type:"float",optional:!0,defaultValue:.05}],outputs:[{name:"value",type:"vec2"}]},"shape.rectangle":{kind:"shape.rectangle",label:"Rectangle",category:"Shapes",inputs:[{name:"uv",type:"vec2",inlineLiteral:!1},{name:"width",type:"float",defaultValue:.5},{name:"height",type:"float",defaultValue:.5}],outputs:[{name:"value",type:"float"}]},"shape.roundedRectangle":{kind:"shape.roundedRectangle",label:"Rounded Rectangle",category:"Shapes",inputs:[{name:"uv",type:"vec2",inlineLiteral:!1},{name:"width",type:"float",defaultValue:.5},{name:"height",type:"float",defaultValue:.5},{name:"radius",type:"float",defaultValue:.1}],outputs:[{name:"value",type:"float"}]},"noise.simplex":{kind:"noise.simplex",label:"Simplex Noise",category:"Noise",inputs:[{name:"uv",type:"vec2",inlineLiteral:!1},{name:"scale",type:"float",optional:!0,defaultValue:8}],outputs:[{name:"value",type:"float"}]},"noise.voronoi2d":{kind:"noise.voronoi2d",label:"Voronoi",category:"Noise",inputs:[{name:"uv",type:"vec2",inlineLiteral:!1},{name:"scale",type:"float",optional:!0,defaultValue:8}],outputs:[{name:"value",type:"float"}]},"effect.fresnel":{kind:"effect.fresnel",label:"Fresnel",category:"Effects",inputs:[{name:"power",type:"float",optional:!0,defaultValue:1}],outputs:[{name:"value",type:"float"}]},"effect.edgeDepth":{kind:"effect.edgeDepth",label:"Edge Depth",category:"Effects",inputs:[{name:"power",type:"float",optional:!0,defaultValue:1}],outputs:[{name:"value",type:"float"}]},"effect.depthFade":{kind:"effect.depthFade",label:"Depth Fade",category:"Effects",inputs:[{name:"distance",type:"float",optional:!0,defaultValue:1}],outputs:[{name:"value",type:"float"}]},"util.panner":{kind:"util.panner",label:"Panner",category:"Utilities",inputs:[{name:"uv",type:"vec2",inlineLiteral:!1},{name:"speed",type:"vec2",defaultValue:[0,0]},{name:"tile",type:"vec2",defaultValue:[1,1]},{name:"time",type:"float",optional:!0,inlineLiteral:!1}],outputs:[{name:"value",type:"vec2"}]}};export const SHADER_GRAPH_NODE_KINDS=Object.keys(SHADER_GRAPH_NODE_DEFINITIONS);function e(e,t,a){return{kind:e,label:t,category:a,inputs:[{name:"value",type:"dynamic"}],outputs:[{name:"value",type:"dynamic"}]}}function t(e,t){return{kind:e,label:t,category:"Math",inputs:[{name:"a",type:"dynamic"},{name:"b",type:"dynamic"}],outputs:[{name:"value",type:"dynamic"}]}}function a(e,t){return{kind:e,label:t,category:"Comparison",inputs:[{name:"a",type:"float"},{name:"b",type:"float"}],outputs:[{name:"value",type:"boolean"}]}}function n(e,t){return{kind:e,label:t,category:"Boolean",inputs:[{name:"a",type:"boolean"},{name:"b",type:"boolean"}],outputs:[{name:"value",type:"boolean"}]}}export function inlineLiteralTypeForPort(e,t){if(!1!==t.inlineLiteral)return"float"===t.type||"vec2"===t.type||"vec3"===t.type||"vec4"===t.type?t.type:"dynamic"===t.type&&function(e){return e.startsWith("math.")&&"math.reflect"!==e&&"math.refract"!==e}(e)?"float":void 0}export function defaultInlineLiteralValueForPort(e,t){const a=inlineLiteralTypeForPort(e,t);if(null!=a){if(void 0!==t.defaultValue)return l(t.defaultValue);if("math.multiply"===e)return 1;switch(a){case"float":return 0;case"vec2":return[0,0];case"vec3":return[0,0,0];case"vec4":return[0,0,0,1]}}}function l(e){return Array.isArray(e)?e.map(e=>l(e)):null!=e&&"object"==typeof e?Object.fromEntries(Object.entries(e).map(([e,t])=>[e,l(t)])):e}/*
2
2
  * Copyright (©) 2026 Hology Interactive AB. All rights reserved.
3
3
  * See the LICENSE.md file for details.
4
4
  */
@@ -1,4 +1,4 @@
1
- import{beforeAll as e,describe as a,expect as i,it as t}from"vitest";import{init as n,recastConfigDefaults as o}from"recast-navigation";import{buildTile as l}from"../gameplay/ai/build-tile.js";a("buildTile",()=>{e(async()=>{await n()}),t("builds Detour data for a walkable plane",()=>{const e=l({positions:new Float32Array([-8,0,-8,8,0,-8,-8,0,8,8,0,8]),indices:new Uint32Array([0,2,1,1,2,3]),navMeshBounds:[[-10,-2,-10],[10,2,10]],tileBoundsMin:[-10,-2,-10],tileBoundsMax:[10,2,10],tileX:0,tileY:0,keepIntermediates:!1,recastConfig:{...o,cs:.2,ch:.2,tileSize:100,walkableHeight:10,walkableRadius:2,walkableClimb:1,minRegionArea:0,mergeRegionArea:0}});i(e.success).toBe(!0),i("data"in e?e.data:void 0).toBeDefined(),"data"in e&&e.data?.destroy()})});/*
1
+ import{beforeAll as e,describe as a,expect as t,it as i}from"vitest";import{init as s,NavMesh as n,NavMeshQuery as o,QueryFilter as l,recastConfigDefaults as r}from"recast-navigation";import{buildTile as c}from"../gameplay/ai/build-tile.js";import{NavigationArea as d,NavigationTraversalFlag as u}from"../gameplay/ai/navigation-areas.js";a("buildTile",()=>{e(async()=>{await s()}),i("builds Detour data for a walkable plane",()=>{const e=c({positions:new Float32Array([-8,0,-8,8,0,-8,-8,0,8,8,0,8]),indices:new Uint32Array([0,2,1,1,2,3]),navMeshBounds:[[-10,-2,-10],[10,2,10]],tileBoundsMin:[-10,-2,-10],tileBoundsMax:[10,2,10],tileX:0,tileY:0,keepIntermediates:!1,recastConfig:{...r,cs:.2,ch:.2,tileSize:100,walkableHeight:10,walkableRadius:2,walkableClimb:1,minRegionArea:0,mergeRegionArea:0}});t(e.success).toBe(!0),t("data"in e?e.data:void 0).toBeDefined(),"data"in e&&e.data?.destroy()}),i("marks water polygons so query filters can exclude or traverse them",()=>{const e=c({positions:new Float32Array([-8,0,-8,8,0,-8,-8,0,8,8,0,8]),indices:new Uint32Array([0,2,1,1,2,3]),navMeshBounds:[[-10,-2,-10],[10,2,10]],tileBoundsMin:[-10,-2,-10],tileBoundsMax:[10,2,10],tileX:0,tileY:0,keepIntermediates:!1,areaModifiers:[{area:d.Water,vertices:[[-1,0,-8],[1,0,-8],[1,0,8],[-1,0,8]],minHeight:-1,maxHeight:1}],recastConfig:{...r,cs:.2,ch:.2,tileSize:100,walkableHeight:10,walkableRadius:2,walkableClimb:1,minRegionArea:0,mergeRegionArea:0}});if(t(e.success).toBe(!0),!e.success||null==e.data)return;const a=new n;t(a.initSolo(e.data)).toBe(!0);const i=new o(a),s=new l;s.includeFlags=u.Walk,s.excludeFlags=u.Swim;const m=new l;m.includeFlags=u.Walk|u.Swim,m.excludeFlags=0;const g=i.findClosestPoint({x:0,y:0,z:0},{filter:s});t(g.success).toBe(!0),t(Math.abs(g.point.x)).toBeGreaterThan(.8);const h=i.findClosestPoint({x:0,y:0,z:0},{filter:m});t(h.success).toBe(!0),t(Math.abs(h.point.x)).toBeLessThan(.2);const w=i.computePath({x:-4,y:0,z:0},{x:4,y:0,z:0},{filter:s});t(w.path.at(-1).x).toBeLessThan(-.8);const p=i.computePath({x:-4,y:0,z:0},{x:4,y:0,z:0},{filter:m});t(p.success).toBe(!0),t(p.path.at(-1).x).toBeGreaterThan(3.8),i.destroy(),a.destroy()})});/*
2
2
  * Copyright (©) 2026 Hology Interactive AB. All rights reserved.
3
3
  * See the LICENSE.md file for details.
4
4
  */
@@ -1,4 +1,4 @@
1
- import{describe as e,expect as t,it as s,vi as a}from"vitest";import*as n from"three";import{getTileBounds as o,NavMeshWorkerPool as l}from"../gameplay/ai/dynamic-tiled-navmesh.js";e("getTileBounds",()=>{s("creates adjacent fixed-size tiles relative to the navmesh minimum",()=>{const e=new n.Vector3(-100,-5,-200),s=new n.Vector3(300,25,400);t(o(e,s,2,3,10)).toEqual([[-80,-5,-170],[-70,25,-160]])})}),e("NavMeshWorkerPool",()=>{s("creates workers lazily and caps concurrent work",()=>{const e=[],s=new l(()=>{const t=new r;return e.push(t),t}),n={},o=a.fn();t(e).toHaveLength(0);for(let e=0;e<8;e++)s.schedule(n,{tileX:e},void 0,o,24);t(e).toHaveLength(4),t(e.flatMap(e=>e.messages)).toHaveLength(4),e[0].complete(0),t(e).toHaveLength(4),t(e.flatMap(e=>e.messages)).toHaveLength(5),t(o).toHaveBeenCalledTimes(1)}),s("does not deliver queued or active results after an owner is cancelled",()=>{const e=[],s=new l(()=>{const t=new r;return e.push(t),t}),n={},o=a.fn();s.schedule(n,{tileX:0},void 0,o,1),s.schedule(n,{tileX:1},void 0,o,1),s.cancel(n),e[0].complete(0),t(o).not.toHaveBeenCalled(),t(e[0].messages).toHaveLength(1)})});class r{constructor(){this.onmessage=null,this.onerror=null,this.messages=[],this.terminate=a.fn()}postMessage(e){this.messages.push(e)}complete(e){this.onmessage?.({data:{tileX:e,tileY:0,navMeshData:new Uint8Array}})}}/*
1
+ import{describe as e,expect as t,it as i}from"vitest";import*as m from"three";import{getTileBounds as a}from"../gameplay/ai/dynamic-tiled-navmesh.js";e("getTileBounds",()=>{i("creates adjacent fixed-size tiles relative to the navmesh minimum",()=>{const e=new m.Vector3(-100,-5,-200),i=new m.Vector3(300,25,400);t(a(e,i,2,3,10)).toEqual([[-80,-5,-170],[-70,25,-160]])})});/*
2
2
  * Copyright (©) 2026 Hology Interactive AB. All rights reserved.
3
3
  * See the LICENSE.md file for details.
4
4
  */
@@ -1,4 +1,4 @@
1
- import{describe as e,expect as t,it as o}from"vitest";import{DataTexture as n,Material as a,MeshStandardMaterial as r,RGBAFormat as i,SpriteMaterial as s,Vector4 as l}from"three";import{batchingUniformVec4 as d,float as h,NodeShaderMaterial as u,rgb as m,rgba as c,standardMaterial as p,translateX as f,uniformFloat as S,uniformVec4 as v,uniformSampler2d as g,varyingAttributes as w,vec3 as x,vec4 as C}from"three-shader-graph";import{createNodeMaterialSignature as y,markMaterialUniformValuesNeedUpdate as B,NodeMaterialWebGpuResolver as M,setMaterialUniformValuesAutoUpdate as b,withThreeDefaultVertexAttributeValues as T}from"../rendering/node-material-webgpu-resolver.js";import{LandscapeCompositeShader as L}from"../shader/builtin/landscape-composite-shader.js";import{DecalUnlitShader as W}from"../shader/builtin/decal-unlit-shader.js";import{getSpritePosition as _}from"../shader/sprite-shader.js";import{depthNormal as G,depthWorldPosition as A,fragmentLinearEyeDepth as U,sampleSceneDepth as I,screenUV as V}from"../shader-nodes/depth.js";import{sampleSceneColor as k}from"../shader-nodes/scene-sample.js";import{applyDithering as j}from"../shader-nodes/dither.js";import{parallaxOcclusionMapping as D}from"../shader-nodes/pom.js";import{elapsedTimeUniformName as E}from"../shader-nodes/time.js";import{Trail as F}from"../effects/vfx/trail-renderer.js";import{particleUniforms as O}from"../shader-nodes/particle.js";import{buildShaderGraphMaterial as q,createDefaultShaderGraphDocument as P}from"../shader/graph/index.js";class z extends a{set uniformValuesNeedsUpdate(e){e&&this.uniformValuesAutoVersion++}constructor(e){super(),this.disposed=!1,this.uniformValuesAutoUpdate=!0,this.uniformValuesAutoVersion=0,this.vertexShader=e.vertexShader,this.fragmentShader=e.fragmentShader,this.depthVertexShader=e.depthVertexShader??null,this.depthFragmentShader=e.depthFragmentShader??null,this.pointShadowVertexShader=e.pointShadowVertexShader??null,this.pointShadowFragmentShader=e.pointShadowFragmentShader??null,this.uniforms=e.uniforms,this.sceneTextures=e.sceneTextures??{},this.graphTextures=e.graphTextures??{},this.vertexAttributes=e.vertexAttributes??[],this.transparent=e.transparent??!1,this.alphaTest=e.alphaTest??0,this.depthTest=e.depthTest??!0,this.depthWrite=e.depthWrite??!0,this.side=e.side??this.side}dispose(){this.disposed=!0,super.dispose()}}e("NodeMaterialWebGpuResolver",()=>{o("derives a textured, darkened albedo outline and updates its controls",()=>{const e=new n(new Uint8Array([128,96,64,255]),1,1,i);e.needsUpdate=!0;const o=g("outlineAlbedo",e).sample(w.uv),a=new u({color:p({color:o})});a.userData.outlineParameters={colorMode:"darkenedAlbedo",thickness:.012,darkening:.65,alpha:.8};const r=new M({WGSLShaderMaterial:z}),s=r.resolve(a,"outline");t(s).toBeInstanceOf(z),t(s.side).toBe(1),t(s.vertexShader).toContain("materialUniforms.outlineThickness"),t(s.vertexAttributes).toEqual(t.arrayContaining([t.objectContaining({name:"skinIndex"}),t.objectContaining({name:"skinWeight"})])),t(s.vertexShader).toContain("rendererSkinPosition"),t(s.vertexShader).toContain("outline_local_position_"),t(s.vertexShader).toContain("outline_local_normal_"),t(s.vertexShader).toContain("sqrt("),t(s.fragmentShader).toContain("outlineAlbedoTexture"),t(s.fragmentShader).toContain("materialUniforms.outlineDarkening"),t(s.uniforms.outlineThickness.value).toBe(.012),t(s.uniforms.outlineDarkening.value).toBe(.65),t(s.uniforms.outlineAlpha.value).toBe(.8),a.userData.outlineParameters.darkening=2,a.userData.outlineParameters.thickness=.02;const l=r.resolve(a,"outline");t(l).toBe(s),t(l.uniforms.outlineThickness.value).toBe(.02),t(l.uniforms.outlineDarkening.value).toBe(1)}),o("declines an albedo outline when the source graph has no albedo output",()=>{const e=new u({color:c(16777215)}),o=new M({WGSLShaderMaterial:z});t(o.resolve(e,"outline")).toBeUndefined()}),o("compiles shader graph scene-light nodes against the renderer light ABI",()=>{const e=P("surface");e.shadingModel="unlit",e.nodes.push({id:"ambient",kind:"scene.ambientLight"},{id:"directional",kind:"scene.directionalLight"},{id:"combined",kind:"math.add"}),e.edges.push({from:{nodeId:"ambient",port:"color"},to:{nodeId:"combined",port:"a"}},{from:{nodeId:"directional",port:"color"},to:{nodeId:"combined",port:"b"}}),e.outputs.color={input:{nodeId:"combined",port:"value"}};const o=new M({WGSLShaderMaterial:z}).resolve(q(e));t(o?.fragmentShader).toContain("rendererAmbientLight()"),t(o?.fragmentShader).toContain("rendererDirectionalLightForLight"),t(o?.fragmentShader).toContain("rendererDirectionalLightCount()"),t(o?.fragmentShader).not.toContain("NUM_DIR_LIGHTS")}),o("compiles decal surface rejection without undefined WGSL expressions",()=>{const e=(new W).build(),o=new M({WGSLShaderMaterial:z}).resolve(e);t(o?.fragmentShader).not.toContain("undefined"),t(o?.fragmentShader).toContain("hology_scene_mapTexture")}),o("recompiles an opaque variant when receiveDecals changes",()=>{const e=new u({color:c(16777215)});e.userData.receiveDecals=!0;const o=new M({WGSLShaderMaterial:z},e=>[c(16777215,!1===e.userData.receiveDecals?0:2)]),n=o.resolve(e,"opaque");e.userData.receiveDecals=!1,e.needsUpdate=!0;const a=o.resolve(e,"opaque");t(a).not.toBe(n),t(n.disposed).toBe(!0),t(n.fragmentShader).not.toBe(a.fragmentShader)}),o("maps Hology elapsed time to the renderer frame clock",()=>{const e=S(E),o=new u({color:c(x(e)),transform:f(e)}),n=new M({WGSLShaderMaterial:z}).resolve(o);t(n?.vertexShader).toContain("rendererElapsedTime()"),t(n?.fragmentShader).toContain("rendererElapsedTime()"),t(n?.depthVertexShader).toContain("rendererElapsedTime()"),t(n?.pointShadowVertexShader).toContain("rendererElapsedTime()"),t(n?.uniforms).not.toHaveProperty(E)}),o("compiles the native sprite billboard position without a GLSL fallback",()=>{const e=new u({color:c(16777215),position:_(S("rotation",.25),S("screenSpaceSize",0),S("lockYAxis",1))}),o=new M({WGSLShaderMaterial:z}).resolve(e);t(o).toBeInstanceOf(z),t(o?.vertexShader).toContain("cos("),t(o?.vertexShader).toContain("sin("),t(o?.vertexShader).toContain("materialUniforms.lockYAxis"),t(o?.vertexShader).not.toContain("customFunction_")}),o("uses the per-instance rotation attribute for instanced sprites",()=>{const e=new u({color:c(16777215),position:_(S("rotation",0),void 0,void 0,!0)}),o=new M({WGSLShaderMaterial:z}).resolve(e);t(o?.vertexAttributes).toEqual(t.arrayContaining([t.objectContaining({name:"rotation",format:"float32",stepMode:"instance"})])),t(o?.vertexShader).toContain("input.rotation"),t(o?.vertexShader).not.toContain("materialUniforms.rotation")}),o("uses per-instance particle opacity in WebGPU fragment shaders",()=>{const e=new u({color:c(m(16777215),O.opacity)}),o=new M({WGSLShaderMaterial:z}).resolve(e);t(o?.vertexAttributes).toEqual(t.arrayContaining([t.objectContaining({name:"particleData",format:"float32x3",stepMode:"instance"})])),t(o?.fragmentShader).toContain(".x"),t(o?.fragmentShader).toContain("> 0.5")}),o("maps THREE.SpriteMaterial to the native sprite shader",()=>{const e=new n(new Uint8Array([255,255,255,255]),1,1,i),o=new s({map:e,color:8429760,opacity:.6,rotation:.25,sizeAttenuation:!1,alphaTest:.2,transparent:!0}),a=new M({WGSLShaderMaterial:z}),r=a.resolve(o);t(r).toBeInstanceOf(z),t(r?.vertexShader).toContain("materialUniforms.rotation"),t(r?.vertexShader).toContain("materialUniforms.screenSpaceSize"),t(r?.fragmentShader).toContain("textureSample("),t(r?.alphaTest).toBe(.2),t(r?.transparent).toBe(!0),t(r?.uniforms.rotation.value).toBe(.25),t(r?.uniforms.screenSpaceSize.value).toBe(1),o.rotation=.75;const l=a.resolve(o);t(l).toBe(r),t(l?.uniforms.rotation.value).toBe(.75)}),o("memoizes node-material signatures for repeated lookups",()=>{const e=["version","vertexShader","fragmentShader","alphaTest","alphaToCoverage","blending","colorWrite","depthFunc","depthTest","depthWrite","polygonOffset","polygonOffsetFactor","polygonOffsetUnits","premultipliedAlpha","side","stencilWrite","transparent"],o=new Map([["version",1],["vertexShader","#vertex"],["fragmentShader","#fragment"],["alphaTest",0],["alphaToCoverage",!1],["blending",1],["colorWrite",!0],["depthFunc",3],["depthTest",!0],["depthWrite",!0],["polygonOffset",!1],["polygonOffsetFactor",0],["polygonOffsetUnits",0],["premultipliedAlpha",!1],["side",0],["stencilWrite",!1],["transparent",!1]]);let n=0;const a=new Proxy({},{get:(t,a)=>"string"==typeof a&&e.includes(a)?(n+=1,o.get(a)):Reflect.get(t,a)});y(a),y(a),t(n).toBe(e.length)}),o("adapts a NodeShaderMaterial without replacing its scene material",()=>{const e=S("intensity",.75),o=new u({color:p({color:m(5210052).multiplyScalar(e),roughness:.42,metalness:.18}),transparent:!0,alphaTest:.25}),n=new M({WGSLShaderMaterial:z}),a=n.resolve(o);t(a).toBeInstanceOf(z),t(a).not.toBe(o),t(a?.transparent).toBe(!0),t(a?.alphaTest).toBe(.25),t(a?.fragmentShader).toContain("rendererPointLightForLight"),t(o.isShaderMaterial).toBe(!0),e.value=.25,t(n.resolve(o)).toBe(a),t(a?.uniforms.intensity?.value).toBe(.25)}),o("syncs direct NodeShaderMaterial uniform mutations to the resolved material",()=>{const e=v("trailTint",new l(0,0,0,0)),o=S("hology_particle_energy",1),n=new u({color:e.multiplyScalar(o)}),a=new M({WGSLShaderMaterial:z});n.uniforms.trailTint.value=new l(1,.25,.5,.75),n.uniforms.hology_particle_energy.value=.4;const r=a.resolve(n);t(r?.uniforms.trailTint.value).toEqual(new l(1,.25,.5,.75)),t(r?.uniforms.hology_particle_energy.value).toBe(.4),n.uniforms.trailTint.value.set(.2,.4,.6,.8),n.uniforms.hology_particle_energy.value=.1,t(a.resolve(n)).toBe(r),t(r?.uniforms.trailTint.value).toEqual(new l(.2,.4,.6,.8)),t(r?.uniforms.hology_particle_energy.value).toBe(.1)}),o("only syncs explicitly invalidated uniforms when auto update is disabled",()=>{const e=S("intensity",.75),o=new u({color:c(x(e))});o.uniformValuesAutoUpdate=!1;const n=new M({WGSLShaderMaterial:z}),a=n.resolve(o),r=a.uniformValuesAutoVersion;e.value=.25,t(n.resolve(o)).toBe(a),t(a?.uniforms.intensity.value).toBe(.75),t(a?.uniformValuesAutoVersion).toBe(r),o.uniformValuesNeedsUpdate=!0,t(n.resolve(o)).toBe(a),t(a?.uniforms.intensity.value).toBe(.25),t(a?.uniformValuesAutoVersion).toBe(r+1)}),o("supports explicit invalidation for mapped Three.js materials",()=>{const e=new r({roughness:.8});b(e,!1);const o=new M({WGSLShaderMaterial:z}),n=o.resolve(e);e.roughness=.2,t(o.resolve(e)).toBe(n),t(n?.uniforms.roughness.value).toBe(.8),B(e),t(o.resolve(e)).toBe(n),t(n?.uniforms.roughness.value).toBe(.2)}),o("binds uniforms referenced only by an MRT material output",()=>{const e=S("roughness",.7),o=new u({color:c(5601177),alphaTest:.1});o.outputRoughness=e;const n=new M({WGSLShaderMaterial:z},e=>[e.outputColor,C(x(0,0,1),e.outputRoughness)]).resolve(o);t(n?.fragmentShader).toContain("materialUniforms.roughness"),t(n?.fragmentShader).not.toContain("graphColor"),t(n?.fragmentShader).toMatch(/if \(.+ < 0\.1\) \{ discard; \}/),t(n?.uniforms.roughness?.value).toBe(.7)}),o("compiles a landscape composite built from node material semantic outputs",()=>{const e=new M({WGSLShaderMaterial:z}),o=new u({color:p({color:m(5147450),roughness:.82,metalness:0})}),n=new u({color:p({color:m(7432286),roughness:.6,metalness:.05})}),a=new L;a.layers=[o,n];const r=e.resolve(a.build());t(r).toBeInstanceOf(z),t(r?.fragmentShader).toContain("rendererDirectionalLightForLight"),t(r?.vertexShader).toContain("@location(6) material: vec4<f32>"),t(r?.vertexShader).toContain("@location(8) hole: f32")}),o("allocates the trail's authored vertex attributes",()=>{const e=new M({WGSLShaderMaterial:z}).resolve(F.createBaseMaterial());t(e).toBeInstanceOf(z),t(e?.vertexAttributes).toEqual(t.arrayContaining([t.objectContaining({name:"nodeID",shaderLocation:6,format:"float32"}),t.objectContaining({name:"nodeCenter",shaderLocation:7,format:"float32x3"})]))}),o("uses Three's default value when a geometry has no uv1 attribute",()=>{const e=T([{name:"uv1",shaderLocation:6,format:"float32x2"},{name:"custom",shaderLocation:7,format:"float32"}]);t(e).toEqual(t.arrayContaining([t.objectContaining({name:"uv1",defaultValue:[0,0]}),t.objectContaining({name:"custom"})])),t(e[1]).not.toHaveProperty("defaultValue")}),o("compiles the foliage transform and named texture-uniform pattern",()=>{const e=new M({WGSLShaderMaterial:z}),o=new n(new Uint8Array([255,255,255,255]),1,1,i),a=new u({color:g("map").sample(w.uv),transform:f(S("windOffset",.25)),uniforms:{map:{value:o}},alphaTest:.5}),r=e.resolve(a);t(r).toBeInstanceOf(z),t(r?.vertexShader).toContain("rendererClipPosition(_ng_localPosition"),t(r?.depthVertexShader).toContain("materialUniforms.windOffset"),t(r?.depthFragmentShader).toContain("textureSample("),t(r?.depthFragmentShader).toContain("< 0.5) { discard;"),t(r?.pointShadowFragmentShader).toContain("distanceToLight")}),o("rebuilds cached materials when scene-local texture bindings change",()=>{const e=new M({WGSLShaderMaterial:z}),o=new n(new Uint8Array([255,255,255,255]),1,1,i),a=new n(new Uint8Array([32,64,128,255]),1,1,i),r=new u({color:g("map").sample(w.uv),uniforms:{map:{value:o}},alphaTest:.5}),s=e.resolve(r);r.uniforms.map.value=a;const l=e.resolve(r);t(l).not.toBe(s),t(s.disposed).toBe(!0),r.dispose();const d=e.resolve(r);t(d).not.toBe(l),t(l.disposed).toBe(!0)}),o("uses the renderer batch id without Three’s batchingIdTexture",()=>{const e=new M({WGSLShaderMaterial:z}),o=new n(new Uint8Array([255,96,24,255]),1,1,i),a=new u({color:c(d("vp0")),uniforms:{vp0:{value:o}}}),r=e.resolve(a);t(r).toBeInstanceOf(z),t(r?.vertexShader).toContain("rendererBatchingId(input.instanceIndex)")}),o("compiles depth nodes that use fragment-coordinate expressions",()=>{const e=new M({WGSLShaderMaterial:z}),o=new u({color:c(x(V.x,V.y,U))}),n=e.resolve(o);t(n).toBeInstanceOf(z),t(n?.fragmentShader).toContain("input.position.xy"),t(n?.fragmentShader).toContain("input.position.z"),t(n?.fragmentShader).toContain("rendererViewportSize()"),t(n?.fragmentShader).not.toContain("gl_FragCoord")}),o("maps scene color and depth nodes to renderer-owned textures",()=>{const e=new M({WGSLShaderMaterial:z}),o=new u({color:k(V).multiplyScalar(I(V))}),n=e.resolve(o);t(n.sceneTextures).toEqual({hology_scene_map:"sceneColor",hology_depth_map:"sceneDepth"}),t(n.graphTextures).toEqual({}),t(n.fragmentShader).toContain("hology_scene_mapTexture"),t(n.fragmentShader).toContain("hology_depth_mapTexture"),t(n.fragmentShader).toContain("vec4<f32>(textureSample(hology_depth_mapTexture")}),o("caches distinct material variants for opaque and late draw stages",()=>{const e=new M({WGSLShaderMaterial:z},(e,t)=>"opaque"===t?[c(x(1)),c(x(0))]:void 0),o=new u({color:c(x(1))}),n=e.resolve(o,"opaque"),a=e.resolve(o,"late");t(n).not.toBe(a),t(e.resolve(o,"opaque")).toBe(n),t(e.resolve(o,"late")).toBe(a),t(n?.fragmentShader).toContain("@location(1)"),t(a?.fragmentShader).not.toContain("@location(1)")}),o("reconstructs WebGPU depth positions with inverted NDC Y",()=>{const e=new M({WGSLShaderMaterial:z}),o=new u({color:c(A.add(G.multiplyScalar(0)))}),n=e.resolve(o);t(n.fragmentShader).toContain("vec2<f32>(2.0, -2.0)"),t(n.fragmentShader).toMatch(/-\(float_op_\d+\)/)}),o("emits dither and parallax nodes without GLSL custom functions",()=>{const e=new M({WGSLShaderMaterial:z}),o=new n(new Uint8Array([128,128,128,255]),1,1,i),a=D(w.uv,g("heightMap",o),h(.03)),r=new u({color:C(a.x,a.y,j(x(.2,.4,.8)).z,1)}),s=e.resolve(r);t(s).toBeInstanceOf(z),t(s?.fragmentShader).toContain("textureSampleLevel(heightMapTexture, heightMapSampler"),t(s?.fragmentShader).toMatch(/= -dpdy\(-pom_\d+ViewPosition\)/),t(s?.fragmentShader).toMatch(/= -dpdy\(pom_\d+Uv\)/),t(s?.fragmentShader).not.toContain("customFunction_"),t(s?.fragmentShader).not.toContain("gl_FragCoord")}),o("inherits, updates, and clears the WebGPU world environment",()=>{const e=new n(new Uint8Array([255,255,255,255]),1,1,i),o=new u({color:p({color:m(8421504),roughness:.5,metalness:.1})}),a=new M({WGSLShaderMaterial:z});a.setWorldEnvironment({texture:e,intensity:.75});const r=a.resolve(o);t(r.fragmentShader).toContain("envMapTexture"),t(r.uniforms.envMapIntensity?.value).toBe(.75),t(o.envMap).toBeUndefined(),a.setWorldEnvironment({texture:e,intensity:.25});const s=a.resolve(o);t(s).toBe(r),t(s.uniforms.envMapIntensity?.value).toBe(.25),a.setWorldEnvironment(null);const l=a.resolve(o);t(l).not.toBe(r),t(r.disposed).toBe(!0),t(l.fragmentShader).not.toContain("envMapTexture")}),o("keeps an authored material environment ahead of the world environment",()=>{const e=new n(new Uint8Array([255,255,255,255]),1,1,i),o=new n(new Uint8Array([64,96,128,255]),1,1,i),a=new u({color:p({color:m(8421504),roughness:.5,metalness:.1}),envMap:o}),r=new M({WGSLShaderMaterial:z});r.setWorldEnvironment({texture:e,intensity:.2}),r.resolve(a),t(a.uniforms.envMap.value).toBe(o),t(a.envMap).toBe(o)})});/*
1
+ import{describe as e,expect as t,it as o}from"vitest";import{DataTexture as n,Material as r,MeshStandardMaterial as a,RGBAFormat as i,SpriteMaterial as s,Vector4 as l}from"three";import{batchingUniformVec4 as d,float as h,NodeShaderMaterial as u,rgb as m,rgba as c,standardMaterial as p,translateX as f,uniformFloat as v,uniformVec4 as S,uniformSampler2d as g,varyingAttributes as w,vec3 as x,vec4 as C}from"three-shader-graph";import{createNodeMaterialSignature as y,markMaterialUniformValuesNeedUpdate as B,NodeMaterialWebGpuResolver as M,setMaterialUniformValuesAutoUpdate as b,withThreeDefaultVertexAttributeValues as L}from"../rendering/node-material-webgpu-resolver.js";import{LandscapeCompositeShader as T}from"../shader/builtin/landscape-composite-shader.js";import{DecalUnlitShader as W}from"../shader/builtin/decal-unlit-shader.js";import{getSpritePosition as _}from"../shader/sprite-shader.js";import{depthNormal as G,depthWorldPosition as A,fragmentLinearEyeDepth as U,sampleSceneDepth as I,screenUV as V}from"../shader-nodes/depth.js";import{sampleSceneColor as k}from"../shader-nodes/scene-sample.js";import{applyDithering as j}from"../shader-nodes/dither.js";import{parallaxOcclusionMapping as D}from"../shader-nodes/pom.js";import{elapsedTimeUniformName as E}from"../shader-nodes/time.js";import{Trail as F}from"../effects/vfx/trail-renderer.js";import{particleUniforms as O}from"../shader-nodes/particle.js";import{buildShaderGraphMaterial as q,createDefaultShaderGraphDocument as P}from"../shader/graph/index.js";class z extends r{set uniformValuesNeedsUpdate(e){e&&this.uniformValuesAutoVersion++}constructor(e){super(),this.disposed=!1,this.uniformValuesAutoUpdate=!0,this.uniformValuesAutoVersion=0,this.vertexShader=e.vertexShader,this.fragmentShader=e.fragmentShader,this.depthVertexShader=e.depthVertexShader??null,this.depthFragmentShader=e.depthFragmentShader??null,this.pointShadowVertexShader=e.pointShadowVertexShader??null,this.pointShadowFragmentShader=e.pointShadowFragmentShader??null,this.uniforms=e.uniforms,this.sceneTextures=e.sceneTextures??{},this.graphTextures=e.graphTextures??{},this.vertexAttributes=e.vertexAttributes??[],this.transparent=e.transparent??!1,this.alphaTest=e.alphaTest??0,this.depthTest=e.depthTest??!0,this.depthWrite=e.depthWrite??!0,this.side=e.side??this.side}dispose(){this.disposed=!0,super.dispose()}}e("NodeMaterialWebGpuResolver",()=>{o("derives a textured, darkened albedo outline and updates its controls",()=>{const e=new n(new Uint8Array([128,96,64,255]),1,1,i);e.needsUpdate=!0;const o=g("outlineAlbedo",e).sample(w.uv),r=new u({color:p({color:o})});r.userData.outlineParameters={colorMode:"darkenedAlbedo",thickness:.012,darkening:.65,alpha:.8};const a=new M({WGSLShaderMaterial:z}),s=a.resolve(r,"outline");t(s).toBeInstanceOf(z),t(s.side).toBe(1),t(s.vertexShader).toContain("materialUniforms.outlineThickness"),t(s.vertexAttributes).toEqual(t.arrayContaining([t.objectContaining({name:"skinIndex"}),t.objectContaining({name:"skinWeight"})])),t(s.vertexShader).toContain("rendererSkinPosition"),t(s.vertexShader).toContain("outline_local_position_"),t(s.vertexShader).toContain("outline_local_normal_"),t(s.vertexShader).toContain("sqrt("),t(s.fragmentShader).toContain("outlineAlbedoTexture"),t(s.fragmentShader).toContain("materialUniforms.outlineDarkening"),t(s.uniforms.outlineThickness.value).toBe(.012),t(s.uniforms.outlineDarkening.value).toBe(.65),t(s.uniforms.outlineAlpha.value).toBe(.8),r.userData.outlineParameters.darkening=2,r.userData.outlineParameters.thickness=.02;const l=a.resolve(r,"outline");t(l).toBe(s),t(l.uniforms.outlineThickness.value).toBe(.02),t(l.uniforms.outlineDarkening.value).toBe(1)}),o("declines an albedo outline when the source graph has no albedo output",()=>{const e=new u({color:c(16777215)}),o=new M({WGSLShaderMaterial:z});t(o.resolve(e,"outline")).toBeUndefined()}),o("compiles shader graph scene-light nodes against the renderer light ABI",()=>{const e=P("surface");e.shadingModel="unlit",e.nodes.push({id:"ambient",kind:"scene.ambientLight"},{id:"directional",kind:"scene.directionalLight"},{id:"combined",kind:"math.add"}),e.edges.push({from:{nodeId:"ambient",port:"color"},to:{nodeId:"combined",port:"a"}},{from:{nodeId:"directional",port:"color"},to:{nodeId:"combined",port:"b"}}),e.outputs.color={input:{nodeId:"combined",port:"value"}};const o=new M({WGSLShaderMaterial:z}).resolve(q(e));t(o?.fragmentShader).toContain("rendererAmbientLight()"),t(o?.fragmentShader).toContain("rendererDirectionalLightForLight"),t(o?.fragmentShader).toContain("rendererDirectionalLightCount()"),t(o?.fragmentShader).not.toContain("NUM_DIR_LIGHTS")}),o("compiles the shader graph world normal without a WGSL matrix inverse",()=>{const e=P("surface");e.shadingModel="unlit",e.nodes.push({id:"world-normal",kind:"builtin.worldNormal"}),e.outputs.color={input:{nodeId:"world-normal",port:"value"}};const o=new M({WGSLShaderMaterial:z}).resolve(q(e));t(o?.vertexShader).toContain("transpose(rendererViewMatrix())"),t(o?.vertexShader).not.toContain("nodeInverseMat4")}),o("compiles decal surface rejection without undefined WGSL expressions",()=>{const e=(new W).build(),o=new M({WGSLShaderMaterial:z}).resolve(e);t(o?.fragmentShader).not.toContain("undefined"),t(o?.fragmentShader).toContain("hology_scene_mapTexture")}),o("recompiles an opaque variant when receiveDecals changes",()=>{const e=new u({color:c(16777215)});e.userData.receiveDecals=!0;const o=new M({WGSLShaderMaterial:z},e=>[c(16777215,!1===e.userData.receiveDecals?0:2)]),n=o.resolve(e,"opaque");e.userData.receiveDecals=!1,e.needsUpdate=!0;const r=o.resolve(e,"opaque");t(r).not.toBe(n),t(n.disposed).toBe(!0),t(n.fragmentShader).not.toBe(r.fragmentShader)}),o("maps Hology elapsed time to the renderer frame clock",()=>{const e=v(E),o=new u({color:c(x(e)),transform:f(e)}),n=new M({WGSLShaderMaterial:z}).resolve(o);t(n?.vertexShader).toContain("rendererElapsedTime()"),t(n?.fragmentShader).toContain("rendererElapsedTime()"),t(n?.depthVertexShader).toContain("rendererElapsedTime()"),t(n?.pointShadowVertexShader).toContain("rendererElapsedTime()"),t(n?.uniforms).not.toHaveProperty(E)}),o("compiles the native sprite billboard position without a GLSL fallback",()=>{const e=new u({color:c(16777215),position:_(v("rotation",.25),v("screenSpaceSize",0),v("lockYAxis",1))}),o=new M({WGSLShaderMaterial:z}).resolve(e);t(o).toBeInstanceOf(z),t(o?.vertexShader).toContain("cos("),t(o?.vertexShader).toContain("sin("),t(o?.vertexShader).toContain("materialUniforms.lockYAxis"),t(o?.vertexShader).not.toContain("customFunction_")}),o("uses the per-instance rotation attribute for instanced sprites",()=>{const e=new u({color:c(16777215),position:_(v("rotation",0),void 0,void 0,!0)}),o=new M({WGSLShaderMaterial:z}).resolve(e);t(o?.vertexAttributes).toEqual(t.arrayContaining([t.objectContaining({name:"rotation",format:"float32",stepMode:"instance"})])),t(o?.vertexShader).toContain("input.rotation"),t(o?.vertexShader).not.toContain("materialUniforms.rotation")}),o("uses per-instance particle opacity in WebGPU fragment shaders",()=>{const e=new u({color:c(m(16777215),O.opacity)}),o=new M({WGSLShaderMaterial:z}).resolve(e);t(o?.vertexAttributes).toEqual(t.arrayContaining([t.objectContaining({name:"particleData",format:"float32x3",stepMode:"instance"})])),t(o?.fragmentShader).toContain(".x"),t(o?.fragmentShader).toContain("> 0.5")}),o("maps THREE.SpriteMaterial to the native sprite shader",()=>{const e=new n(new Uint8Array([255,255,255,255]),1,1,i),o=new s({map:e,color:8429760,opacity:.6,rotation:.25,sizeAttenuation:!1,alphaTest:.2,transparent:!0}),r=new M({WGSLShaderMaterial:z}),a=r.resolve(o);t(a).toBeInstanceOf(z),t(a?.vertexShader).toContain("materialUniforms.rotation"),t(a?.vertexShader).toContain("materialUniforms.screenSpaceSize"),t(a?.fragmentShader).toContain("textureSample("),t(a?.alphaTest).toBe(.2),t(a?.transparent).toBe(!0),t(a?.uniforms.rotation.value).toBe(.25),t(a?.uniforms.screenSpaceSize.value).toBe(1),o.rotation=.75;const l=r.resolve(o);t(l).toBe(a),t(l?.uniforms.rotation.value).toBe(.75)}),o("memoizes node-material signatures for repeated lookups",()=>{const e=["version","vertexShader","fragmentShader","alphaTest","alphaToCoverage","blending","colorWrite","depthFunc","depthTest","depthWrite","polygonOffset","polygonOffsetFactor","polygonOffsetUnits","premultipliedAlpha","side","stencilWrite","transparent"],o=new Map([["version",1],["vertexShader","#vertex"],["fragmentShader","#fragment"],["alphaTest",0],["alphaToCoverage",!1],["blending",1],["colorWrite",!0],["depthFunc",3],["depthTest",!0],["depthWrite",!0],["polygonOffset",!1],["polygonOffsetFactor",0],["polygonOffsetUnits",0],["premultipliedAlpha",!1],["side",0],["stencilWrite",!1],["transparent",!1]]);let n=0;const r=new Proxy({},{get:(t,r)=>"string"==typeof r&&e.includes(r)?(n+=1,o.get(r)):Reflect.get(t,r)});y(r),y(r),t(n).toBe(e.length)}),o("adapts a NodeShaderMaterial without replacing its scene material",()=>{const e=v("intensity",.75),o=new u({color:p({color:m(5210052).multiplyScalar(e),roughness:.42,metalness:.18}),transparent:!0,alphaTest:.25}),n=new M({WGSLShaderMaterial:z}),r=n.resolve(o);t(r).toBeInstanceOf(z),t(r).not.toBe(o),t(r?.transparent).toBe(!0),t(r?.alphaTest).toBe(.25),t(r?.fragmentShader).toContain("rendererPointLightForLight"),t(o.isShaderMaterial).toBe(!0),e.value=.25,t(n.resolve(o)).toBe(r),t(r?.uniforms.intensity?.value).toBe(.25)}),o("syncs direct NodeShaderMaterial uniform mutations to the resolved material",()=>{const e=S("trailTint",new l(0,0,0,0)),o=v("hology_particle_energy",1),n=new u({color:e.multiplyScalar(o)}),r=new M({WGSLShaderMaterial:z});n.uniforms.trailTint.value=new l(1,.25,.5,.75),n.uniforms.hology_particle_energy.value=.4;const a=r.resolve(n);t(a?.uniforms.trailTint.value).toEqual(new l(1,.25,.5,.75)),t(a?.uniforms.hology_particle_energy.value).toBe(.4),n.uniforms.trailTint.value.set(.2,.4,.6,.8),n.uniforms.hology_particle_energy.value=.1,t(r.resolve(n)).toBe(a),t(a?.uniforms.trailTint.value).toEqual(new l(.2,.4,.6,.8)),t(a?.uniforms.hology_particle_energy.value).toBe(.1)}),o("only syncs explicitly invalidated uniforms when auto update is disabled",()=>{const e=v("intensity",.75),o=new u({color:c(x(e))});o.uniformValuesAutoUpdate=!1;const n=new M({WGSLShaderMaterial:z}),r=n.resolve(o),a=r.uniformValuesAutoVersion;e.value=.25,t(n.resolve(o)).toBe(r),t(r?.uniforms.intensity.value).toBe(.75),t(r?.uniformValuesAutoVersion).toBe(a),o.uniformValuesNeedsUpdate=!0,t(n.resolve(o)).toBe(r),t(r?.uniforms.intensity.value).toBe(.25),t(r?.uniformValuesAutoVersion).toBe(a+1)}),o("supports explicit invalidation for mapped Three.js materials",()=>{const e=new a({roughness:.8});b(e,!1);const o=new M({WGSLShaderMaterial:z}),n=o.resolve(e);e.roughness=.2,t(o.resolve(e)).toBe(n),t(n?.uniforms.roughness.value).toBe(.8),B(e),t(o.resolve(e)).toBe(n),t(n?.uniforms.roughness.value).toBe(.2)}),o("binds uniforms referenced only by an MRT material output",()=>{const e=v("roughness",.7),o=new u({color:c(5601177),alphaTest:.1});o.outputRoughness=e;const n=new M({WGSLShaderMaterial:z},e=>[e.outputColor,C(x(0,0,1),e.outputRoughness)]).resolve(o);t(n?.fragmentShader).toContain("materialUniforms.roughness"),t(n?.fragmentShader).not.toContain("graphColor"),t(n?.fragmentShader).toMatch(/if \(.+ < 0\.1\) \{ discard; \}/),t(n?.uniforms.roughness?.value).toBe(.7)}),o("compiles a landscape composite built from node material semantic outputs",()=>{const e=new M({WGSLShaderMaterial:z}),o=new u({color:p({color:m(5147450),roughness:.82,metalness:0})}),n=new u({color:p({color:m(7432286),roughness:.6,metalness:.05})}),r=new T;r.layers=[o,n];const a=e.resolve(r.build());t(a).toBeInstanceOf(z),t(a?.fragmentShader).toContain("rendererDirectionalLightForLight"),t(a?.vertexShader).toContain("@location(6) material: vec4<f32>"),t(a?.vertexShader).toContain("@location(8) hole: f32")}),o("allocates the trail's authored vertex attributes",()=>{const e=new M({WGSLShaderMaterial:z}).resolve(F.createBaseMaterial());t(e).toBeInstanceOf(z),t(e?.vertexAttributes).toEqual(t.arrayContaining([t.objectContaining({name:"nodeID",shaderLocation:6,format:"float32"}),t.objectContaining({name:"nodeCenter",shaderLocation:7,format:"float32x3"})]))}),o("uses Three's default value when a geometry has no uv1 attribute",()=>{const e=L([{name:"uv1",shaderLocation:6,format:"float32x2"},{name:"custom",shaderLocation:7,format:"float32"}]);t(e).toEqual(t.arrayContaining([t.objectContaining({name:"uv1",defaultValue:[0,0]}),t.objectContaining({name:"custom"})])),t(e[1]).not.toHaveProperty("defaultValue")}),o("compiles the foliage transform and named texture-uniform pattern",()=>{const e=new M({WGSLShaderMaterial:z}),o=new n(new Uint8Array([255,255,255,255]),1,1,i),r=new u({color:g("map").sample(w.uv),transform:f(v("windOffset",.25)),uniforms:{map:{value:o}},alphaTest:.5}),a=e.resolve(r);t(a).toBeInstanceOf(z),t(a?.vertexShader).toContain("rendererClipPosition(_ng_localPosition"),t(a?.depthVertexShader).toContain("materialUniforms.windOffset"),t(a?.depthFragmentShader).toContain("textureSample("),t(a?.depthFragmentShader).toContain("< 0.5) { discard;"),t(a?.pointShadowFragmentShader).toContain("distanceToLight")}),o("rebuilds cached materials when scene-local texture bindings change",()=>{const e=new M({WGSLShaderMaterial:z}),o=new n(new Uint8Array([255,255,255,255]),1,1,i),r=new n(new Uint8Array([32,64,128,255]),1,1,i),a=new u({color:g("map").sample(w.uv),uniforms:{map:{value:o}},alphaTest:.5}),s=e.resolve(a);a.uniforms.map.value=r;const l=e.resolve(a);t(l).not.toBe(s),t(s.disposed).toBe(!0),a.dispose();const d=e.resolve(a);t(d).not.toBe(l),t(l.disposed).toBe(!0)}),o("uses the renderer batch id without Three’s batchingIdTexture",()=>{const e=new M({WGSLShaderMaterial:z}),o=new n(new Uint8Array([255,96,24,255]),1,1,i),r=new u({color:c(d("vp0")),uniforms:{vp0:{value:o}}}),a=e.resolve(r);t(a).toBeInstanceOf(z),t(a?.vertexShader).toContain("rendererBatchingId(input.instanceIndex)")}),o("compiles depth nodes that use fragment-coordinate expressions",()=>{const e=new M({WGSLShaderMaterial:z}),o=new u({color:c(x(V.x,V.y,U))}),n=e.resolve(o);t(n).toBeInstanceOf(z),t(n?.fragmentShader).toContain("input.position.xy"),t(n?.fragmentShader).toContain("input.position.z"),t(n?.fragmentShader).toContain("rendererViewportSize()"),t(n?.fragmentShader).not.toContain("gl_FragCoord")}),o("maps scene color and depth nodes to renderer-owned textures",()=>{const e=new M({WGSLShaderMaterial:z}),o=new u({color:k(V).multiplyScalar(I(V))}),n=e.resolve(o);t(n.sceneTextures).toEqual({hology_scene_map:"sceneColor",hology_depth_map:"sceneDepth"}),t(n.graphTextures).toEqual({}),t(n.fragmentShader).toContain("hology_scene_mapTexture"),t(n.fragmentShader).toContain("hology_depth_mapTexture"),t(n.fragmentShader).toContain("vec4<f32>(textureSample(hology_depth_mapTexture")}),o("caches distinct material variants for opaque and late draw stages",()=>{const e=new M({WGSLShaderMaterial:z},(e,t)=>"opaque"===t?[c(x(1)),c(x(0))]:void 0),o=new u({color:c(x(1))}),n=e.resolve(o,"opaque"),r=e.resolve(o,"late");t(n).not.toBe(r),t(e.resolve(o,"opaque")).toBe(n),t(e.resolve(o,"late")).toBe(r),t(n?.fragmentShader).toContain("@location(1)"),t(r?.fragmentShader).not.toContain("@location(1)")}),o("reconstructs WebGPU depth positions with inverted NDC Y",()=>{const e=new M({WGSLShaderMaterial:z}),o=new u({color:c(A.add(G.multiplyScalar(0)))}),n=e.resolve(o);t(n.fragmentShader).toContain("vec2<f32>(2.0, -2.0)"),t(n.fragmentShader).toMatch(/-\(float_op_\d+\)/)}),o("emits dither and parallax nodes without GLSL custom functions",()=>{const e=new M({WGSLShaderMaterial:z}),o=new n(new Uint8Array([128,128,128,255]),1,1,i),r=D(w.uv,g("heightMap",o),h(.03)),a=new u({color:C(r.x,r.y,j(x(.2,.4,.8)).z,1)}),s=e.resolve(a);t(s).toBeInstanceOf(z),t(s?.fragmentShader).toContain("textureSampleLevel(heightMapTexture, heightMapSampler"),t(s?.fragmentShader).toMatch(/= -dpdy\(-pom_\d+ViewPosition\)/),t(s?.fragmentShader).toMatch(/= -dpdy\(pom_\d+Uv\)/),t(s?.fragmentShader).not.toContain("customFunction_"),t(s?.fragmentShader).not.toContain("gl_FragCoord")}),o("inherits, updates, and clears the WebGPU world environment",()=>{const e=new n(new Uint8Array([255,255,255,255]),1,1,i),o=new u({color:p({color:m(8421504),roughness:.5,metalness:.1})}),r=new M({WGSLShaderMaterial:z});r.setWorldEnvironment({texture:e,intensity:.75});const a=r.resolve(o);t(a.fragmentShader).toContain("envMapTexture"),t(a.uniforms.envMapIntensity?.value).toBe(.75),t(o.envMap).toBeUndefined(),r.setWorldEnvironment({texture:e,intensity:.25});const s=r.resolve(o);t(s).toBe(a),t(s.uniforms.envMapIntensity?.value).toBe(.25),r.setWorldEnvironment(null);const l=r.resolve(o);t(l).not.toBe(a),t(a.disposed).toBe(!0),t(l.fragmentShader).not.toContain("envMapTexture")}),o("keeps an authored material environment ahead of the world environment",()=>{const e=new n(new Uint8Array([255,255,255,255]),1,1,i),o=new n(new Uint8Array([64,96,128,255]),1,1,i),r=new u({color:p({color:m(8421504),roughness:.5,metalness:.1}),envMap:o}),a=new M({WGSLShaderMaterial:z});a.setWorldEnvironment({texture:e,intensity:.2}),a.resolve(r),t(r.uniforms.envMap.value).toBe(o),t(r.envMap).toBe(o)})});/*
2
2
  * Copyright (©) 2026 Hology Interactive AB. All rights reserved.
3
3
  * See the LICENSE.md file for details.
4
4
  */