Name
*
Code
{"properties":{"frame":0,"maxFrame":600,"maxFrameLocked":false,"realtimeState":true,"mainCameraPath":"/cameras/cameras:sopGroup/perspectiveCamera1","versions":{"polygonjs":"1.5.5"}},"root":{"type":"root","nodes":{"geo1":{"type":"geo","nodes":{"MAT":{"type":"materialsNetwork","nodes":{"meshStandard_RHINO":{"type":"meshStandard"},"pointsBuilder1":{"type":"pointsBuilder","nodes":{"globals1":{"type":"globals"},"output1":{"type":"output","inputs":[null,null,{"index":2,"inputName":"color","node":"laserColor1","output":"baseColor"},{"index":3,"inputName":"alpha","node":"multAdd6","output":"val"},null,{"index":5,"inputName":"gl_PointSize","node":"multAdd4","output":"val"}]},"disk1":{"type":"disk","params":{"position":{"overriden_options":{}},"center":{"raw_input":[0.5,0.5],"overriden_options":{}},"radius":{"raw_input":0.2,"overriden_options":{}},"feather":{"raw_input":0.24,"overriden_options":{}}},"inputs":[{"index":0,"inputName":"position","node":"globals1","output":"gl_PointCoord"}]},"constant1":{"type":"constant","params":{"float":0.03},"connection_points":{"in":[],"out":[{"name":"val","type":"float"}]}},"multAdd1":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":6},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"globals1","output":"time"}],"connection_points":{"in":[{"name":"value","type":"float"},{"name":"preAdd","type":"float"},{"name":"mult","type":"float"},{"name":"postAdd","type":"float"}],"out":[{"name":"val","type":"float"}]}},"attribute1":{"type":"attribute","params":{"name":"id"},"connection_points":{"in":[],"out":[{"name":"val","type":"float"}]}},"round1":{"type":"round","params":{"in":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"in","node":"attribute1","output":"val"}],"connection_points":{"in":[{"name":"in","type":"float"}],"out":[{"name":"val","type":"float"}]}},"random1":{"type":"random","params":{"seed":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"seed","node":"floatToVec2_1","output":"vec2"}]},"floatToVec2_1":{"type":"floatToVec2","params":{"x":{"overriden_options":{}},"y":{"raw_input":0.54,"overriden_options":{}}},"inputs":[{"index":0,"inputName":"x","node":"round1","output":"val"}]},"multAdd2":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"multAdd5","output":"val"},{"index":1,"inputName":"preAdd","node":"multAdd1","output":"val"}],"connection_points":{"in":[{"name":"value","type":"float"},{"name":"preAdd","type":"float"},{"name":"mult","type":"float"},{"name":"postAdd","type":"float"}],"out":[{"name":"val","type":"float"}]}},"cos1":{"type":"cos","params":{"radians":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"radians","node":"multAdd2","output":"val"}],"connection_points":{"in":[{"name":"radians","type":"float"}],"out":[{"name":"val","type":"float"}]}},"multAdd3":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"cos1","output":"val"}],"connection_points":{"in":[{"name":"value","type":"float"},{"name":"preAdd","type":"float"},{"name":"mult","type":"float"},{"name":"postAdd","type":"float"}],"out":[{"name":"val","type":"float"}]}},"fit1":{"type":"fit","params":{"val":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"srcMin":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":-1},"srcMax":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"destMin":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.22},"destMax":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"val","node":"cos1","output":"val"}],"connection_points":{"in":[{"name":"val","type":"float"},{"name":"srcMin","type":"float"},{"name":"srcMax","type":"float"},{"name":"destMin","type":"float"},{"name":"destMax","type":"float"}],"out":[{"name":"val","type":"float"}]}},"multAdd4":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"fit1","output":"val"},null,{"index":2,"inputName":"mult","node":"constant1","output":"val"}],"connection_points":{"in":[{"name":"value","type":"float"},{"name":"preAdd","type":"float"},{"name":"mult","type":"float"},{"name":"postAdd","type":"float"}],"out":[{"name":"val","type":"float"}]}},"multAdd5":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":4.4},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"random1","output":"rand"}],"connection_points":{"in":[{"name":"value","type":"float"},{"name":"preAdd","type":"float"},{"name":"mult","type":"float"},{"name":"postAdd","type":"float"}],"out":[{"name":"val","type":"float"}]}},"laserColor1":{"type":"laserColor","polyNode":{"locked":true},"params":{"baseColor":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"connection_points":{"in":[{"name":"baseColor","type":"vec3"}],"out":[{"name":"baseColor","type":"vec3"}]}},"multAdd6":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.33},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"disk1","output":"float"}],"connection_points":{"in":[{"name":"value","type":"float"},{"name":"preAdd","type":"float"},{"name":"mult","type":"float"},{"name":"postAdd","type":"float"}],"out":[{"name":"val","type":"float"}]}}},"params":{"transparent":true,"alphaTest":0.07,"blending":2},"persisted_config":{"material":{"metadata":{"version":4.5,"type":"Material","generator":"Material.toJSON"},"uuid":"/geo1/MAT/pointsBuilder1-main","type":"PointsMaterial","color":16777215,"size":1,"sizeAttenuation":true,"blending":2,"transparent":true,"depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"alphaTest":0.07,"fog":false},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[],"timeDependent":true,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false},"customMaterials":{"customDistanceMaterial":{"material":{"metadata":{"version":4.5,"type":"Material","generator":"Material.toJSON"},"uuid":"/geo1/MAT/pointsBuilder1-customDistanceMaterial","type":"ShaderMaterial","name":"customDistanceMaterial","depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"alphaTest":0.07,"forceSinglePass":true,"fog":false,"glslVersion":null,"uniforms":{"diffuse":{"type":"c","value":16777215},"opacity":{"value":1},"map":{"value":null},"mapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"alphaMap":{"value":null},"alphaMapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"alphaTest":{"value":0.07},"displacementMap":{"value":null},"displacementMapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"displacementScale":{"value":1},"displacementBias":{"value":0},"size":{"value":1},"scale":{"value":1}},"defines":{"USE_SIZEATTENUATION":1,"DEPTH_PACKING":3200},"vertexShader":"\nuniform float size;\nuniform float scale;\n#include <common>\n#include <clipping_planes_pars_vertex>\nvarying float vViewZDepth;\n\n// INSERT DEFINES\n\n\n// vHighPrecisionZW is added to match CustomMeshDepth.frag\n// which is itself taken from threejs\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t// INSERT BODY\n\n\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\tvViewZDepth = - mvPosition.z;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\n\tvHighPrecisionZW = gl_Position.zw;\n\n}\n","fragmentShader":"\n// INSERT DEFINES\n\n\n#if DEPTH_PACKING == 3200\n\n\tuniform float opacity;\n\n#endif\n\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tdiffuseColor.a = opacity;\n\n\t#endif\n\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\n\t// INSERT BODY\n\t// the new body lines should be added before the alphatest_fragment\n\t// so that alpha is set before (which is really how it would be set if the alphamap_fragment above was used by the material node parameters)\n\n\t#include <alphatest_fragment>\n\n\t#include <logdepthbuf_fragment>\n\n\n\t// Higher precision equivalent of gl_FragCoord.z. This assumes depthRange has been left to its default values.\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), diffuseColor.a );\n\n\t#elif DEPTH_PACKING == 3201\n\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\n\t#endif\n\n}\n","lights":false,"clipping":false},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[],"timeDependent":true,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false}},"customDepthMaterial":{"material":{"metadata":{"version":4.5,"type":"Material","generator":"Material.toJSON"},"uuid":"/geo1/MAT/pointsBuilder1-customDepthMaterial","type":"ShaderMaterial","name":"customDepthMaterial","depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"alphaTest":0.07,"forceSinglePass":true,"fog":false,"glslVersion":null,"uniforms":{"diffuse":{"type":"c","value":16777215},"opacity":{"value":1},"map":{"value":null},"mapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"alphaMap":{"value":null},"alphaMapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"alphaTest":{"value":0.07},"displacementMap":{"value":null},"displacementMapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"displacementScale":{"value":1},"displacementBias":{"value":0},"size":{"value":1},"scale":{"value":1}},"defines":{"USE_SIZEATTENUATION":1,"DEPTH_PACKING":3201},"vertexShader":"\nuniform float size;\nuniform float scale;\n#include <common>\n#include <clipping_planes_pars_vertex>\nvarying float vViewZDepth;\n\n// INSERT DEFINES\n\n\n// vHighPrecisionZW is added to match CustomMeshDepth.frag\n// which is itself taken from threejs\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t// INSERT BODY\n\n\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\tvViewZDepth = - mvPosition.z;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\n\tvHighPrecisionZW = gl_Position.zw;\n\n}\n","fragmentShader":"\n// INSERT DEFINES\n\n\n#if DEPTH_PACKING == 3200\n\n\tuniform float opacity;\n\n#endif\n\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tdiffuseColor.a = opacity;\n\n\t#endif\n\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\n\t// INSERT BODY\n\t// the new body lines should be added before the alphatest_fragment\n\t// so that alpha is set before (which is really how it would be set if the alphamap_fragment above was used by the material node parameters)\n\n\t#include <alphatest_fragment>\n\n\t#include <logdepthbuf_fragment>\n\n\n\t// Higher precision equivalent of gl_FragCoord.z. This assumes depthRange has been left to its default values.\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), diffuseColor.a );\n\n\t#elif DEPTH_PACKING == 3201\n\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\n\t#endif\n\n}\n","lights":false,"clipping":false},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[],"timeDependent":true,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false}},"customDepthDOFMaterial":{"material":{"metadata":{"version":4.5,"type":"Material","generator":"Material.toJSON"},"uuid":"/geo1/MAT/pointsBuilder1-customDepthDOFMaterial","type":"ShaderMaterial","name":"customDepthDOFMaterial","depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"alphaTest":0.07,"forceSinglePass":true,"fog":false,"glslVersion":null,"uniforms":{"size":{"value":1},"scale":{"value":1},"mNear":{"value":0},"mFar":{"value":10}},"defines":{"USE_SIZEATTENUATION":1},"vertexShader":"\nuniform float size;\nuniform float scale;\n#include <common>\n\nvarying float vViewZDepth;\n\n// INSERT DEFINES\n\n\n\nvoid main() {\n\n\t// INSERT BODY\n\n\n\t#include <project_vertex>\n\n\tvViewZDepth = - mvPosition.z;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\n}\n","fragmentShader":"\nuniform float mNear;\nuniform float mFar;\n\nvarying float vViewZDepth;\n\n// INSERT DEFINES\n\nvoid main() {\n\n\tfloat color = 1.0 - smoothstep( mNear, mFar, vViewZDepth );\n\tgl_FragColor = vec4( vec3( color ), 1.0 );\n\tvec4 diffuseColor = gl_FragColor;\n\n\t// INSERT BODY\n\n\tgl_FragColor.a = diffuseColor.a;\n}\n","lights":false,"clipping":false},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[],"timeDependent":true,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false}}}}},"lineBasicBuilder_LIGHTING":{"type":"lineBasicBuilder","nodes":{"globals1":{"type":"globals"},"output1":{"type":"output","inputs":[{"index":0,"inputName":"position","node":"max1","output":"val"},{"index":1,"inputName":"color","node":"multScalar2","output":"val"},{"index":2,"inputName":"alpha","node":"constant3","output":"val"}]},"constant3":{"type":"constant","params":{"float":0.86},"connection_points":{"in":[],"out":[{"name":"val","type":"float"}]}},"laserColor1":{"type":"laserColor","polyNode":{"locked":true},"params":{"baseColor":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"connection_points":{"in":[{"name":"baseColor","type":"vec3"}],"out":[{"name":"baseColor","type":"vec3"}]}},"param1":{"type":"param","params":{"name":"destPos","type":4},"connection_points":{"in":[],"out":[{"name":"val","type":"vec3"}]}},"attribute1":{"type":"attribute","params":{"name":"idn"},"connection_points":{"in":[],"out":[{"name":"val","type":"float"}]}},"constant1":{"type":"constant","params":{"type":4},"connection_points":{"in":[],"out":[{"name":"val","type":"vec3"}]}},"mix1":{"type":"mix","params":{"value0":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"value1":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"blend":{"type":"float","default_value":0.5,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value0","node":"constant1","output":"val"},{"index":1,"inputName":"value1","node":"param1","output":"val"},{"index":2,"inputName":"blend","node":"attribute1","output":"val"}],"connection_points":{"in":[{"name":"value0","type":"vec3"},{"name":"value1","type":"vec3"},{"name":"blend","type":"float"}],"out":[{"name":"mix","type":"vec3"}]}},"noise1":{"type":"noise","params":{"octaves":6,"amp":{"type":"vector3","default_value":[1,1,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":[0.19999999999999996,0.19999999999999996,0.19999999999999996]},"position":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"freq":{"type":"vector3","default_value":[1,1,1],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"offset":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":4,"inputs":[{"index":0,"inputName":"amp","node":"multScalar1","output":"val"},{"index":1,"inputName":"position","node":"floatToVec3_3","output":"vec3"},null,{"index":3,"inputName":"offset","node":"floatToVec3_2","output":"vec3"}],"connection_points":{"in":[{"name":"amp","type":"vec3"},{"name":"position","type":"vec3"},{"name":"freq","type":"vec3"},{"name":"offset","type":"vec3"}],"out":[{"name":"noise","type":"vec3"}]}},"smoothstep1":{"type":"smoothstep","params":{"edge0":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"edge1":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.1},"x":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[null,null,{"index":2,"inputName":"x","node":"attribute1","output":"val"}],"connection_points":{"in":[{"name":"edge0","type":"float"},{"name":"edge1","type":"float"},{"name":"x","type":"float"}],"out":[{"name":"val","type":"float"}]}},"smoothstep2":{"type":"smoothstep","params":{"edge0":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":1},"edge1":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.83},"x":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[null,null,{"index":2,"inputName":"x","node":"attribute1","output":"val"}],"connection_points":{"in":[{"name":"edge0","type":"float"},{"name":"edge1","type":"float"},{"name":"x","type":"float"}],"out":[{"name":"val","type":"float"}]}},"min1":{"type":"min","params":{"in0":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":1},"in1":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":1}},"inputs":[{"index":0,"inputName":"in0","node":"smoothstep1","output":"val"},{"index":1,"inputName":"in1","node":"smoothstep2","output":"val"}],"connection_points":{"in":[{"name":"in0","type":"float"},{"name":"in1","type":"float"}],"out":[{"name":"val","type":"float"}]}},"floatToVec3_1":{"type":"floatToVec3","params":{"x":{"overriden_options":{}},"y":{"overriden_options":{}},"z":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"x","node":"min1","output":"val"},{"index":1,"inputName":"y","node":"min1","output":"val"},{"index":2,"inputName":"z","node":"min1","output":"val"}]},"add1":{"type":"add","params":{"add0":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"add1":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"add2":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"add0","node":"mix1","output":"mix"},{"index":1,"inputName":"add1","node":"noise1","output":"noise"}],"connection_points":{"in":[{"name":"add0","type":"vec3"},{"name":"add1","type":"vec3"},{"name":"add2","type":"vec3"}],"out":[{"name":"sum","type":"vec3"}]}},"multScalar1":{"type":"multScalar","params":{"value":{"type":"vector3","default_value":[1,1,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.42}},"inputs":[{"index":0,"inputName":"value","node":"floatToVec3_1","output":"vec3"}],"connection_points":{"in":[{"name":"value","type":"vec3"},{"name":"mult","type":"float"}],"out":[{"name":"val","type":"vec3"}]}},"globals2":{"type":"globals"},"multAdd1":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.79},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"globals2","output":"time"}],"connection_points":{"in":[{"name":"value","type":"float"},{"name":"preAdd","type":"float"},{"name":"mult","type":"float"},{"name":"postAdd","type":"float"}],"out":[{"name":"val","type":"float"}]}},"floatToVec3_2":{"type":"floatToVec3","params":{"x":{"overriden_options":{}},"y":{"overriden_options":{}},"z":{"raw_input":0.21,"overriden_options":{}}},"inputs":[null,{"index":1,"inputName":"y","node":"multAdd1","output":"val"}]},"max1":{"type":"max","params":{"in0":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"in1":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":[-1000,0,-1000]}},"inputs":[{"index":0,"inputName":"in0","node":"add1","output":"sum"}],"connection_points":{"in":[{"name":"in0","type":"vec3"},{"name":"in1","type":"vec3"}],"out":[{"name":"val","type":"vec3"}]}},"vec3ToFloat1":{"type":"vec3ToFloat","params":{"vec":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"vec","node":"mix1","output":"mix"}]},"floatToVec3_3":{"type":"floatToVec3","params":{"x":{"overriden_options":{}},"y":{"overriden_options":{}},"z":{"raw_input":0.37,"overriden_options":{}}},"inputs":[null,{"index":1,"inputName":"y","node":"attribute2","output":"val"},{"index":2,"inputName":"z","node":"multAdd2","output":"val"}]},"multAdd2":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"attribute1","output":"val"},null,null,{"index":3,"inputName":"postAdd","node":"multAdd3","output":"val"}],"connection_points":{"in":[{"name":"value","type":"float"},{"name":"preAdd","type":"float"},{"name":"mult","type":"float"},{"name":"postAdd","type":"float"}],"out":[{"name":"val","type":"float"}]}},"multAdd3":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":-1},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"globals2","output":"time"}],"connection_points":{"in":[{"name":"value","type":"float"},{"name":"preAdd","type":"float"},{"name":"mult","type":"float"},{"name":"postAdd","type":"float"}],"out":[{"name":"val","type":"float"}]}},"attribute2":{"type":"attribute","params":{"name":"id"},"connection_points":{"in":[],"out":[{"name":"val","type":"float"}]}},"multScalar2":{"type":"multScalar","params":{"value":{"type":"vector3","default_value":[1,1,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":12}},"inputs":[{"index":0,"inputName":"value","node":"laserColor1","output":"baseColor"}],"connection_points":{"in":[{"name":"value","type":"vec3"},{"name":"mult","type":"float"}],"out":[{"name":"val","type":"vec3"}]}}},"params":{"transparent":true,"linewidth":2.3,"destPos":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"computeOnDirty":true,"cook":false,"dependentOnFoundNode":true},"raw_input":[-2.3,1.4,0],"overriden_options":{"callback":"{}"}}},"persisted_config":{"material":{"metadata":{"version":4.5,"type":"Material","generator":"Material.toJSON"},"uuid":"/geo1/MAT/lineBasicBuilder_LIGHTING-main","type":"LineBasicMaterial","color":16777215,"transparent":true,"depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"linewidth":2.3},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[{"type":"vector3","name":"destPos","defaultValue":[0,0,0],"uniformName":"v_POLY_param_destPos"}],"timeDependent":true,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false},"customMaterials":{"customDistanceMaterial":{"material":{"metadata":{"version":4.5,"type":"Material","generator":"Material.toJSON"},"uuid":"/geo1/MAT/lineBasicBuilder_LIGHTING-customDistanceMaterial","type":"ShaderMaterial","name":"customDistanceMaterial","depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"forceSinglePass":true,"fog":false,"glslVersion":null,"uniforms":{"diffuse":{"type":"c","value":16777215},"opacity":{"value":1},"map":{"value":null},"mapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"alphaMap":{"value":null},"alphaMapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"alphaTest":{"value":0},"displacementMap":{"value":null},"displacementMapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"displacementScale":{"value":1},"displacementBias":{"value":0},"referencePosition":{"type":"v3","value":[0,0,0]},"nearDistance":{"value":1},"farDistance":{"value":1000}},"defines":{"USE_SIZEATTENUATION":1,"DEPTH_PACKING":3201},"vertexShader":"\nuniform float scale;\nattribute float lineDistance;\n\nvarying float vLineDistance;\n\n#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\n// INSERT DEFINES\n\n\n// vHighPrecisionZW is added to match CustomMeshDepth.frag\n// which is itself taken from threejs\nvarying vec2 vHighPrecisionZW;\n\n\nvoid main() {\n\n\t// INSERT BODY\n\n\n\tvLineDistance = scale * lineDistance;\n\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\n\n\tvHighPrecisionZW = gl_Position.zw;\n}\n","fragmentShader":"\n// INSERT DEFINES\n\n#define DISTANCE\n\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main () {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\n\t// INSERT BODY\n\n\t#include <alphatest_fragment>\n\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist ); // clamp to [ 0, 1 ]\n\n\tgl_FragColor = packDepthToRGBA( dist );\n\n}\n","lights":false,"clipping":false},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[{"type":"vector3","name":"destPos","defaultValue":[0,0,0],"uniformName":"v_POLY_param_destPos"}],"timeDependent":true,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false}},"customDepthMaterial":{"material":{"metadata":{"version":4.5,"type":"Material","generator":"Material.toJSON"},"uuid":"/geo1/MAT/lineBasicBuilder_LIGHTING-customDepthMaterial","type":"ShaderMaterial","name":"customDepthMaterial","depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"forceSinglePass":true,"fog":false,"glslVersion":null,"uniforms":{"diffuse":{"type":"c","value":16777215},"opacity":{"value":1},"map":{"value":null},"mapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"alphaMap":{"value":null},"alphaMapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"alphaTest":{"value":0},"displacementMap":{"value":null},"displacementMapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"displacementScale":{"value":1},"displacementBias":{"value":0}},"defines":{"DEPTH_PACKING":3201},"vertexShader":"\nuniform float scale;\nattribute float lineDistance;\n\nvarying float vLineDistance;\n\n\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\n// INSERT DEFINES\n\n\n// vHighPrecisionZW is added to match CustomMeshDepth.frag\n// which is itself taken from threejs\nvarying vec2 vHighPrecisionZW;\n\n\nvoid main() {\n\n\t// INSERT BODY\n\n\n\tvLineDistance = scale * lineDistance;\n\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\n\n\tvHighPrecisionZW = gl_Position.zw;\n}\n","fragmentShader":"\n// INSERT DEFINES\n\n\n#if DEPTH_PACKING == 3200\n\n\tuniform float opacity;\n\n#endif\n\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tdiffuseColor.a = opacity;\n\n\t#endif\n\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\n\t// INSERT BODY\n\t// the new body lines should be added before the alphatest_fragment\n\t// so that alpha is set before (which is really how it would be set if the alphamap_fragment above was used by the material node parameters)\n\n\t#include <alphatest_fragment>\n\n\t#include <logdepthbuf_fragment>\n\n\n\t// Higher precision equivalent of gl_FragCoord.z. This assumes depthRange has been left to its default values.\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), diffuseColor.a );\n\n\t#elif DEPTH_PACKING == 3201\n\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\n\t#endif\n\n}\n","lights":false,"clipping":false},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[{"type":"vector3","name":"destPos","defaultValue":[0,0,0],"uniformName":"v_POLY_param_destPos"}],"timeDependent":true,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false}},"customDepthDOFMaterial":{"material":{"metadata":{"version":4.5,"type":"Material","generator":"Material.toJSON"},"uuid":"/geo1/MAT/lineBasicBuilder_LIGHTING-customDepthDOFMaterial","type":"ShaderMaterial","name":"customDepthDOFMaterial","depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"forceSinglePass":true,"fog":false,"glslVersion":null,"uniforms":{"diffuse":{"type":"c","value":16777215},"opacity":{"value":1},"map":{"value":null},"mapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"alphaMap":{"value":null},"alphaMapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"alphaTest":{"value":0},"displacementMap":{"value":null},"displacementMapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"displacementScale":{"value":1},"displacementBias":{"value":0}},"defines":{"DEPTH_PACKING":3200},"vertexShader":"\nuniform float scale;\nattribute float lineDistance;\n\nvarying float vLineDistance;\n\n\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\n// INSERT DEFINES\n\n\n// vHighPrecisionZW is added to match CustomMeshDepth.frag\n// which is itself taken from threejs\nvarying vec2 vHighPrecisionZW;\n\n\nvoid main() {\n\n\t// INSERT BODY\n\n\n\tvLineDistance = scale * lineDistance;\n\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\n\n\tvHighPrecisionZW = gl_Position.zw;\n}\n","fragmentShader":"\n// INSERT DEFINES\n\n\n#if DEPTH_PACKING == 3200\n\n\tuniform float opacity;\n\n#endif\n\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tdiffuseColor.a = opacity;\n\n\t#endif\n\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\n\t// INSERT BODY\n\t// the new body lines should be added before the alphatest_fragment\n\t// so that alpha is set before (which is really how it would be set if the alphamap_fragment above was used by the material node parameters)\n\n\t#include <alphatest_fragment>\n\n\t#include <logdepthbuf_fragment>\n\n\n\t// Higher precision equivalent of gl_FragCoord.z. This assumes depthRange has been left to its default values.\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), diffuseColor.a );\n\n\t#elif DEPTH_PACKING == 3201\n\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\n\t#endif\n\n}\n","lights":false,"clipping":false},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[{"type":"vector3","name":"destPos","defaultValue":[0,0,0],"uniformName":"v_POLY_param_destPos"}],"timeDependent":true,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false}}}}}}},"circle1":{"type":"circle","params":{"radius":3,"segments":100}},"line1":{"type":"line","params":{"pointsCount":400,"direction":[0,0,1]}},"copy1":{"type":"copy","inputs":["attribCreate2","delete2"]},"attribDelete1":{"type":"attribDelete","params":{"name":"N"},"inputs":["jitter1"]},"merge1":{"type":"merge","inputs":["actor_for_lines_parent","objectProperties3","actor1"],"flags":{"display":true},"cloned_state_overriden":true},"objectProperties2":{"type":"objectProperties","params":{"tname":true,"name":"line-`@objnum`"},"inputs":["material3"]},"hierarchy2":{"type":"hierarchy","inputs":["actor_for_each_line"]},"actor_for_each_line":{"type":"actor","nodes":{"onTick1":{"type":"onTick"},"getObjectProperty1":{"type":"getObjectProperty"},"subtract1":{"type":"subtract","params":{"sub0":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"sub1":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"sub2":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"sub0","node":"add2","output":"sum"},{"index":1,"inputName":"sub1","node":"getObjectProperty1","output":"position"}],"connection_points":{"in":[{"name":"sub0","type":"Vector3","isArray":false},{"name":"sub1","type":"Vector3","isArray":false},{"name":"sub2","type":"Vector3","isArray":false}],"out":[{"name":"sub","type":"Vector3","isArray":false}]}},"rayIntersectObject1":{"type":"rayIntersectObject","maxInputsCount":3,"inputs":[{"index":0,"inputName":"Ray","node":"ray1","output":"Ray"},{"index":1,"inputName":"Object3D","node":"getObject1","output":"Object3D"}]},"getObject1":{"type":"getObject","params":{"getCurrentObject":false,"mask":"*/rhino"},"maxInputsCount":2},"getIntersectionProperty1":{"type":"getIntersectionProperty","inputs":[{"index":0,"inputName":"Intersection","node":"rayIntersectObject1","output":"Intersection"}]},"ray1":{"type":"ray","params":{"origin":{"overriden_options":{}},"direction":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"origin","node":"getObjectProperty1","output":"position"},{"index":1,"inputName":"direction","node":"multScalar1","output":"val"}]},"getParent1":{"type":"getParent"},"getObjectAttribute1":{"type":"getObjectAttribute","params":{"type":6,"attribName":{"type":"string","default_value":"","options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":"getObjectAttribute1"},"defaultVector3":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"Object3D","node":"getParent1","output":"Object3D"},{"index":1,"inputName":"attribName","node":"constant2","output":"val"}],"connection_points":{"in":[{"name":"Object3D","type":"Object3D","isArray":false},{"name":"attribName","type":"string","isArray":false},{"name":"defaultVector3","type":"Vector3","isArray":false}],"out":[{"name":"val","type":"Vector3","isArray":false}]}},"constant2":{"type":"constant","params":{"type":4,"string":"rayHit"},"connection_points":{"in":[],"out":[{"name":"val","type":"string","isArray":false}]}},"getObjectAttribute2":{"type":"getObjectAttribute","params":{"attribName":{"type":"string","default_value":"","options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":"idn"},"defaultFloat":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":3,"connection_points":{"in":[{"name":"Object3D","type":"Object3D","isArray":false},{"name":"attribName","type":"string","isArray":false},{"name":"defaultFloat","type":"float","isArray":false}],"out":[{"name":"val","type":"float","isArray":false}]}},"rand1":{"type":"rand","params":{"value0":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"value1":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value0","node":"getObjectAttribute2","output":"val"}],"connection_points":{"in":[{"name":"value0","type":"float","isArray":false},{"name":"value1","type":"float","isArray":false}],"out":[{"name":"rand","type":"float","isArray":false}]}},"onTick2":{"type":"onTick"},"add1":{"type":"add","params":{"add0":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"add1":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"add2":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"add0","node":"multAdd4","output":"val"},{"index":1,"inputName":"add1","node":"multAdd2","output":"val"}],"connection_points":{"in":[{"name":"add0","type":"float","isArray":false},{"name":"add1","type":"float","isArray":false},{"name":"add2","type":"float","isArray":false}],"out":[{"name":"sum","type":"float","isArray":false}]}},"sin1":{"type":"sin","params":{"angle":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"angle","node":"add1","output":"sum"}],"connection_points":{"in":[{"name":"angle","type":"float","isArray":false}],"out":[{"name":"sin","type":"float","isArray":false}]}},"floatToVec3_1":{"type":"floatToVec3","params":{"x":{"overriden_options":{}},"y":{"overriden_options":{}},"z":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"x","node":"multAdd3","output":"val"},{"index":1,"inputName":"y","node":"multAdd1","output":"val"}]},"add2":{"type":"add","params":{"add0":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"add1":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"add2":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"add0","node":"getObjectAttribute1","output":"val"},{"index":1,"inputName":"add1","node":"floatToVec3_1","output":"vec3"}],"connection_points":{"in":[{"name":"add0","type":"Vector3","isArray":false},{"name":"add1","type":"Vector3","isArray":false},{"name":"add2","type":"Vector3","isArray":false}],"out":[{"name":"sum","type":"Vector3","isArray":false}]}},"multAdd1":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.04},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"sin1","output":"sin"}],"connection_points":{"in":[{"name":"value","type":"float","isArray":false},{"name":"preAdd","type":"float","isArray":false},{"name":"mult","type":"float","isArray":false},{"name":"postAdd","type":"float","isArray":false}],"out":[{"name":"val","type":"float","isArray":false}]}},"multAdd2":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":4},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"onTick2","output":"time"}],"connection_points":{"in":[{"name":"value","type":"float","isArray":false},{"name":"preAdd","type":"float","isArray":false},{"name":"mult","type":"float","isArray":false},{"name":"postAdd","type":"float","isArray":false}],"out":[{"name":"val","type":"float","isArray":false}]}},"rand2":{"type":"rand","params":{"value0":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"value1":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":18.08}},"inputs":[{"index":0,"inputName":"value0","node":"getObjectAttribute2","output":"val"}],"connection_points":{"in":[{"name":"value0","type":"float","isArray":false},{"name":"value1","type":"float","isArray":false}],"out":[{"name":"rand","type":"float","isArray":false}]}},"add3":{"type":"add","params":{"add0":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"add1":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"add2":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"add0","node":"multAdd5","output":"val"},{"index":1,"inputName":"add1","node":"multAdd2","output":"val"}],"connection_points":{"in":[{"name":"add0","type":"float","isArray":false},{"name":"add1","type":"float","isArray":false},{"name":"add2","type":"float","isArray":false}],"out":[{"name":"sum","type":"float","isArray":false}]}},"cos1":{"type":"cos","params":{"angle":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"angle","node":"add3","output":"sum"}],"connection_points":{"in":[{"name":"angle","type":"float","isArray":false}],"out":[{"name":"cos","type":"float","isArray":false}]}},"multAdd3":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.03},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"cos1","output":"cos"}],"connection_points":{"in":[{"name":"value","type":"float","isArray":false},{"name":"preAdd","type":"float","isArray":false},{"name":"mult","type":"float","isArray":false},{"name":"postAdd","type":"float","isArray":false}],"out":[{"name":"val","type":"float","isArray":false}]}},"multAdd4":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":12},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"rand1","output":"rand"}],"connection_points":{"in":[{"name":"value","type":"float","isArray":false},{"name":"preAdd","type":"float","isArray":false},{"name":"mult","type":"float","isArray":false},{"name":"postAdd","type":"float","isArray":false}],"out":[{"name":"val","type":"float","isArray":false}]}},"multAdd5":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":51},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"rand2","output":"rand"}],"connection_points":{"in":[{"name":"value","type":"float","isArray":false},{"name":"preAdd","type":"float","isArray":false},{"name":"mult","type":"float","isArray":false},{"name":"postAdd","type":"float","isArray":false}],"out":[{"name":"val","type":"float","isArray":false}]}},"setObjectAttribute1":{"type":"setObjectAttribute","params":{"type":6,"attribName":{"type":"string","default_value":"","options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":"rayHit"},"lerp":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"val":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":5,"inputs":[{"index":0,"inputName":"trigger","node":"triggerFilter1","output":"trigger"},null,{"index":2,"inputName":"attribName","node":"constant3","output":"val"},null,{"index":4,"inputName":"val","node":"twoWaySwitch1","output":"val"}],"connection_points":{"in":[{"name":"trigger","type":"trigger","isArray":false},{"name":"Object3D","type":"Object3D","isArray":false},{"name":"attribName","type":"string","isArray":false},{"name":"lerp","type":"float","isArray":false},{"name":"val","type":"Vector3","isArray":false}],"out":[{"name":"trigger","type":"trigger","isArray":false},{"name":"Object3D","type":"Object3D","isArray":false}]}},"constant3":{"type":"constant","params":{"type":4,"string":"rayHit"},"connection_points":{"in":[],"out":[{"name":"val","type":"string","isArray":false}]}},"onObjectAttributeUpdate1":{"type":"onObjectAttributeUpdate","params":{"type":6,"attribName":{"type":"string","default_value":"","options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[null,{"index":1,"inputName":"attribName","node":"constant3","output":"val"}],"connection_points":{"in":[{"name":"Object3D","type":"Object3D","isArray":false},{"name":"attribName","type":"string","isArray":false}],"out":[{"name":"trigger","type":"trigger","isArray":false},{"name":"newValue","type":"Vector3","isArray":false},{"name":"previousValue","type":"Vector3","isArray":false}]}},"length1":{"type":"length","params":{"v":{"type":"vector3","default_value":[1,1,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"v","node":"getIntersectionProperty1","output":"point"}],"connection_points":{"in":[{"name":"v","type":"Vector3","isArray":false}],"out":[{"name":"val","type":"float","isArray":false}]}},"compare1":{"type":"compare","params":{"test":2,"value0":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"value1":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.04}},"inputs":[{"index":0,"inputName":"value0","node":"length1","output":"val"}],"connection_points":{"in":[{"name":"value0","type":"float","isArray":false},{"name":"value1","type":"float","isArray":false}],"out":[{"name":"val","type":"boolean","isArray":false}]}},"constant5":{"type":"constant","params":{"type":4,"int":1,"string":"destPos"},"connection_points":{"in":[],"out":[{"name":"val","type":"string","isArray":false}]}},"subtract3":{"type":"subtract","params":{"sub0":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"sub1":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"sub2":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"sub0","node":"getIntersectionProperty1","output":"point"},{"index":1,"inputName":"sub1","node":"getObjectProperty1","output":"position"}],"connection_points":{"in":[{"name":"sub0","type":"Vector3","isArray":false},{"name":"sub1","type":"Vector3","isArray":false},{"name":"sub2","type":"Vector3","isArray":false}],"out":[{"name":"sub","type":"Vector3","isArray":false}]}},"twoWaySwitch1":{"type":"twoWaySwitch","params":{"condition":{"type":"boolean","default_value":false,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"ifTrue":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"ifFalse":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"condition","node":"compare1","output":"val"},{"index":1,"inputName":"ifTrue","node":"subtract3","output":"sub"},{"index":2,"inputName":"ifFalse","node":"add4","output":"sum"}],"connection_points":{"in":[{"name":"condition","type":"boolean","isArray":false},{"name":"ifTrue","type":"Vector3","isArray":false},{"name":"ifFalse","type":"Vector3","isArray":false}],"out":[{"name":"val","type":"Vector3","isArray":false}]}},"multScalar1":{"type":"multScalar","params":{"value":{"type":"vector3","default_value":[1,1,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":100}},"inputs":[{"index":0,"inputName":"value","node":"subtract1","output":"sub"}],"connection_points":{"in":[{"name":"value","type":"Vector3","isArray":false},{"name":"mult","type":"float","isArray":false}],"out":[{"name":"val","type":"Vector3","isArray":false}]}},"add4":{"type":"add","params":{"add0":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"add1":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"add2":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"add0","node":"getObjectProperty1","output":"position"},{"index":1,"inputName":"add1","node":"multScalar1","output":"val"}],"connection_points":{"in":[{"name":"add0","type":"Vector3","isArray":false},{"name":"add1","type":"Vector3","isArray":false},{"name":"add2","type":"Vector3","isArray":false}],"out":[{"name":"sum","type":"Vector3","isArray":false}]}},"setMaterialUniform1":{"type":"setMaterialUniform","params":{"type":5,"Vector3":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"uniformName":{"type":"string","default_value":"","options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"lerp":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":5,"inputs":[{"index":0,"inputName":"trigger","node":"onObjectAttributeUpdate1","output":"trigger"},null,{"index":2,"inputName":"Vector3","node":"onObjectAttributeUpdate1","output":"newValue"},{"index":3,"inputName":"uniformName","node":"constant5","output":"val"}],"connection_points":{"in":[{"name":"trigger","type":"trigger","isArray":false},{"name":"Material","type":"Material","isArray":false},{"name":"Vector3","type":"Vector3","isArray":false},{"name":"uniformName","type":"string","isArray":false},{"name":"lerp","type":"float","isArray":false}],"out":[{"name":"trigger","type":"trigger","isArray":false},{"name":"Material","type":"Material","isArray":false},{"name":"Vector3","type":"Vector3","isArray":false},{"name":"uniformName","type":"string","isArray":false},{"name":"lerp","type":"float","isArray":false}]}},"triggerFilter1":{"type":"triggerFilter","params":{"condition":{"overriden_options":{}}},"maxInputsCount":2,"inputs":[{"index":0,"inputName":"trigger","node":"onTick1","output":"trigger"},{"index":1,"inputName":"condition","node":"compare1","output":"val"}]}},"inputs":["attribId1"],"persisted_config":{"variableNames":["VAR__getObjectAttribute1_defaultVector3","VAR__onObjectAttributeUpdate1_","VAR__floatToVec3_1_","VAR__add2_add0","VAR__add2_add1","VAR__add2_add2","VAR__subtract1_sub0","VAR__subtract1_sub1","VAR__subtract1_sub2","VAR__multScalar1_value","VAR__multScalar1__1","VAR__ray1_origin","VAR__ray1_direction","VAR__ray1__2","VAR__add4_add0","VAR__add4_add1","VAR__add4_add2","VAR__getIntersectionProperty1_","VAR__length1_v","VAR__subtract3_sub0","VAR__subtract3_sub1","VAR__subtract3_sub2","VAR__twoWaySwitch1_ifTrue","VAR__twoWaySwitch1_ifFalse","VAR__setObjectAttribute1_val","VAR__setMaterialUniform1_Vector3"],"variables":[{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Ray","data":{"origin":[0,0,0],"direction":[0,0,-1]}},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]}],"functionNames":["getObjectProperty","getParent","getObjectAttribute","globalsTime","globalsTimeDelta","getObject","rand","mathFloat_2","multAdd","mathFloat_4","getObjectAttributeAutoDefault","addNumber","mathFloat_1","floatToVec3","addVector","subtractVector","multScalarVector3","raySet","rayIntersectObject3D","getIntersectionPropertyPoint","lengthVector","getObjectAttributeRef","setObjectAttribute","setMaterialUniformVectorColor"],"serializedParamConfigs":[],"eventDatas":[]}},"actor_for_lines_parent":{"type":"actor","nodes":{"rayFromCursor1":{"type":"rayFromCursor"},"rayIntersectObject1":{"type":"rayIntersectObject","maxInputsCount":3,"inputs":[{"index":0,"inputName":"Ray","node":"rayFromCursor1","output":"Ray"},{"index":1,"inputName":"Object3D","node":"getObject1","output":"Object3D"}]},"getObject1":{"type":"getObject","params":{"getCurrentObject":false,"mask":"*/rhino"},"maxInputsCount":2},"getIntersectionProperty1":{"type":"getIntersectionProperty","inputs":[{"index":0,"inputName":"Intersection","node":"rayIntersectObject1","output":"Intersection"}]},"setObjectAttribute1":{"type":"setObjectAttribute","params":{"type":6,"attribName":{"type":"string","default_value":"","options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"lerp":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.18},"val":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":5,"inputs":[{"index":0,"inputName":"trigger","node":"triggerFilter1","output":"trigger"},null,{"index":2,"inputName":"attribName","node":"constant2","output":"val"},null,{"index":4,"inputName":"val","node":"getIntersectionProperty1","output":"point"}],"connection_points":{"in":[{"name":"trigger","type":"trigger","isArray":false},{"name":"Object3D","type":"Object3D","isArray":false},{"name":"attribName","type":"string","isArray":false},{"name":"lerp","type":"float","isArray":false},{"name":"val","type":"Vector3","isArray":false}],"out":[{"name":"trigger","type":"trigger","isArray":false},{"name":"Object3D","type":"Object3D","isArray":false}]}},"constant2":{"type":"constant","params":{"type":4,"string":"rayHit"},"connection_points":{"in":[],"out":[{"name":"val","type":"string","isArray":false}]}},"onTick1":{"type":"onTick"},"triggerFilter1":{"type":"triggerFilter","params":{"condition":{"overriden_options":{}}},"maxInputsCount":2,"inputs":[{"index":0,"inputName":"trigger","node":"onTick1","output":"trigger"},{"index":1,"inputName":"condition","node":"compare1","output":"val"}]},"length1":{"type":"length","params":{"v":{"type":"vector3","default_value":[1,1,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"v","node":"getIntersectionProperty1","output":"point"}],"connection_points":{"in":[{"name":"v","type":"Vector3","isArray":false}],"out":[{"name":"val","type":"float","isArray":false}]}},"compare1":{"type":"compare","params":{"test":2,"value0":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"value1":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.02}},"inputs":[{"index":0,"inputName":"value0","node":"length1","output":"val"}],"connection_points":{"in":[{"name":"value0","type":"float","isArray":false},{"name":"value1","type":"float","isArray":false}],"out":[{"name":"val","type":"boolean","isArray":false}]}}},"inputs":["objectProperties4"],"persisted_config":{"variableNames":["VAR__getIntersectionProperty1_","VAR__length1_v","VAR__setObjectAttribute1_val"],"variables":[{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]}],"functionNames":["globalsRayFromCursor","getObject","rayIntersectObject3D","getIntersectionPropertyPoint","lengthVector","globalsTime","globalsTimeDelta","setObjectAttribute"],"serializedParamConfigs":[],"eventDatas":[{"type":"pointermove","emitter":"canvas","jsType":"rayFromCursor"},{"type":"touchmove","emitter":"canvas","jsType":"rayFromCursor"}]}},"attribCreate1":{"type":"attribCreate","params":{"name":"rayHit","size":3},"inputs":["hierarchy2"]},"attribId1":{"type":"attribId","params":{"class":3,"id":false},"inputs":["objectProperties2"]},"add1":{"type":"add"},"merge2":{"type":"merge","inputs":["material2","attribId2"]},"hierarchy3":{"type":"hierarchy","inputs":["attribCreate2"]},"material2":{"type":"material","params":{"material":"../MAT/pointsBuilder1"},"inputs":["add1"]},"attribCreate2":{"type":"attribCreate","params":{"name":"id","value1":"copy('../copy1')"},"inputs":["attribId2"]},"jitter1":{"type":"jitter","params":{"mult":[1,0,1]},"inputs":["circle1"]},"delete1":{"type":"delete","params":{"class":3,"invert":true,"keepPoints":true},"inputs":["attribDelete1"],"flags":{"bypass":true}},"delete2":{"type":"delete","params":{"invert":true,"byExpression":true,"expression":"@ptnum<=1"},"inputs":["delete1"],"flags":{"bypass":true}},"attribId2":{"type":"attribId","params":{"id":false},"inputs":["line1"]},"material3":{"type":"material","params":{"material":"../MAT/lineBasicBuilder_LIGHTING","cloneMat":true,"shareCustomUniforms":false},"inputs":["copy1"]},"pointLight1":{"type":"pointLight","params":{"color":[0.8962693533719567,0.2704977910022518,0.010960094003125918],"intensity":4,"decay":0.8,"castShadow":true}},"actor1":{"type":"actor","nodes":{"getObjectAttribute1":{"type":"getObjectAttribute","params":{"type":6,"attribName":{"type":"string","default_value":"","options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":"getObjectAttribute1"},"defaultVector3":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"Object3D","node":"getObject1","output":"Object3D"},{"index":1,"inputName":"attribName","node":"constant2","output":"val"}],"connection_points":{"in":[{"name":"Object3D","type":"Object3D","isArray":false},{"name":"attribName","type":"string","isArray":false},{"name":"defaultVector3","type":"Vector3","isArray":false}],"out":[{"name":"val","type":"Vector3","isArray":false}]}},"constant2":{"type":"constant","params":{"type":4,"string":"rayHit"},"connection_points":{"in":[],"out":[{"name":"val","type":"string","isArray":false}]}},"getObject1":{"type":"getObject","params":{"getCurrentObject":false,"mask":" /geo1/geo1:sopGroup/linesParent"},"maxInputsCount":2},"setObjectPosition1":{"type":"setObjectPosition","params":{"position":{"overriden_options":{}},"lerp":{"overriden_options":{}},"updateMatrix":{"overriden_options":{}}},"maxInputsCount":5,"inputs":[{"index":0,"inputName":"trigger","node":"onTick1","output":"trigger"},null,{"index":2,"inputName":"position","node":"add1","output":"sum"}]},"onTick1":{"type":"onTick"},"noiseImproved1":{"type":"noiseImproved","params":{"position":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"amp":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.32},"freq":{"type":"vector3","default_value":[1,1,1],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":[4,4,4]},"offset":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"octaves":{"type":"integer","default_value":3,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"ampMult":{"type":"float","default_value":0.5,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"freqMult":{"type":"float","default_value":2,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"position","node":"floatToVec3_1","output":"vec3"}],"connection_points":{"in":[{"name":"position","type":"Vector3","isArray":false},{"name":"amp","type":"float","isArray":false},{"name":"freq","type":"Vector3","isArray":false},{"name":"offset","type":"Vector3","isArray":false},{"name":"octaves","type":"int","isArray":false},{"name":"ampMult","type":"float","isArray":false},{"name":"freqMult","type":"float","isArray":false}],"out":[{"name":"noise","type":"float","isArray":false}]}},"onTick2":{"type":"onTick"},"floatToVec3_1":{"type":"floatToVec3","params":{"x":{"overriden_options":{}},"y":{"overriden_options":{}},"z":{"overriden_options":{}}},"inputs":[null,{"index":1,"inputName":"y","node":"onTick2","output":"time"}]},"floatToVec3_2":{"type":"floatToVec3","params":{"x":{"overriden_options":{}},"y":{"overriden_options":{}},"z":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"x","node":"noiseImproved1","output":"noise"},{"index":1,"inputName":"y","node":"noiseImproved1","output":"noise"},{"index":2,"inputName":"z","node":"noiseImproved1","output":"noise"}]},"add1":{"type":"add","params":{"add0":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"add1":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"add2":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"add0","node":"getObjectAttribute1","output":"val"},{"index":1,"inputName":"add1","node":"floatToVec3_2","output":"vec3"}],"connection_points":{"in":[{"name":"add0","type":"Vector3","isArray":false},{"name":"add1","type":"Vector3","isArray":false},{"name":"add2","type":"Vector3","isArray":false}],"out":[{"name":"sum","type":"Vector3","isArray":false}]}}},"inputs":["pointLight1"],"persisted_config":{"variableNames":["VAR__getObjectAttribute1_defaultVector3","VAR__floatToVec3_1_","VAR__noiseImproved1_position","VAR__noiseImproved1_freq","VAR__noiseImproved1_offset","VAR__floatToVec3_2_","VAR__add1_add0","VAR__add1_add1","VAR__add1_add2","VAR__setObjectPosition1_position"],"variables":[{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]}],"functionNames":["getObject","globalsTime","globalsTimeDelta","getObjectAttribute","floatToVec3","noiseImprovedVector3","addVector","setObjectPosition"],"serializedParamConfigs":[],"eventDatas":[]}},"objectProperties4":{"type":"objectProperties","params":{"tname":true,"name":"linesParent"},"inputs":["attribCreate1"]},"fileGLTF1":{"type":"fileGLTF","params":{"url":"https://raw.githubusercontent.com/polygonjs/polygonjs-assets/master/models/resources/threedscans.com/rhino.glb"}},"transform1":{"type":"transform","params":{"scale":2},"inputs":["hierarchy1"]},"hierarchy1":{"type":"hierarchy","params":{"mode":1},"inputs":["fileGLTF1"]},"BVHVisualizer1":{"type":"BVHVisualizer","params":{"depth":22},"inputs":["BVH1"]},"objectProperties1":{"type":"objectProperties","params":{"tcastShadow":true},"inputs":["transform1"]},"objectProperties3":{"type":"objectProperties","params":{"tname":true,"name":"rhino","tcastShadow":true},"inputs":["BVH1"]},"tube1":{"type":"tube","params":{"radius":0.2,"height":0.69,"center":[0,"ch(\"height\")/2",0],"direction":[0,1,0]}},"circle2":{"type":"circle","params":{"radius":1.5,"segments":8,"center":[-0.1926780242463501,0,0]}},"copy2":{"type":"copy","inputs":["tube1","circle2"]},"merge3":{"type":"merge","params":{"compact":true,"preserveMaterials":false},"inputs":["objectProperties1","attribDelete2"]},"BVH1":{"type":"BVH","inputs":["material1"]},"material1":{"type":"material","params":{"material":"../MAT/meshStandard_RHINO"},"inputs":["merge3"]},"merge4":{"type":"merge","params":{"compact":true},"inputs":["copy2"]},"attribDelete2":{"type":"attribDelete","params":{"name":"uv"},"inputs":["merge4"]}},"params":{"CADLinearTolerance":{"overriden_options":{"callback":"{}"}},"CADAngularTolerance":{"overriden_options":{"callback":"{}"}},"CADCurveAbscissa":{"overriden_options":{"callback":"{}"}},"CADCurveTolerance":{"overriden_options":{"callback":"{}"}},"CADDisplayEdges":{"overriden_options":{"callback":"{}"}},"CADEdgesColor":{"overriden_options":{"callback":"{}"}},"CADDisplayMeshes":{"overriden_options":{"callback":"{}"}},"CADMeshesColor":{"overriden_options":{"callback":"{}"}},"CADWireframe":{"overriden_options":{"callback":"{}"}},"CSGFacetAngle":{"overriden_options":{"callback":"{}"}},"CSGLinesColor":{"overriden_options":{"callback":"{}"}},"CSGMeshesColor":{"overriden_options":{"callback":"{}"}},"CSGWireframe":{"overriden_options":{"callback":"{}"}},"QUADTriangles":{"overriden_options":{"callback":"{}"}},"QUADWireframe":{"overriden_options":{"callback":"{}"}},"TetScale":{"overriden_options":{"callback":"{}"}},"TetDisplayLines":{"overriden_options":{"callback":"{}"}},"TetDisplaySharedFaces":{"overriden_options":{"callback":"{}"}},"TetDisplayPoints":{"overriden_options":{"callback":"{}"}},"TetDisplayCenter":{"overriden_options":{"callback":"{}"}},"TetDisplaySphere":{"overriden_options":{"callback":"{}"}}},"flags":{"display":true}},"COP":{"type":"copNetwork","nodes":{"envMap":{"type":"envMap","inputs":["imageEnv"]},"imageEnv":{"type":"imageEXR","params":{"tminFilter":true,"tmagFilter":true,"tanisotropy":true,"useRendererMaxAnisotropy":true}},"image1":{"type":"image"}}},"cameras":{"type":"geo","nodes":{"perspectiveCamera1":{"type":"perspectiveCamera","params":{"position":[1.5361847575543766,1.5296423416813052,3.039352398645094],"rotation":[-14.730925683314853,24.51076221722142,6.225038400920149]}},"cameraControls1":{"type":"cameraControls","nodes":{"cameraOrbitControls1":{"type":"cameraOrbitControls","params":{"target":[-0.4879600871858414,0.7948351424091571,-0.7615732841484815]}}},"params":{"node":"cameraOrbitControls1"},"inputs":["perspectiveCamera1"]},"cameraPostProcess1":{"type":"cameraPostProcess","nodes":{"bloom1":{"type":"bloom","params":{"strength":0.24,"threshold":1.66,"scale":0.54,"kernelSize":5,"luminanceSmoothing":0.05}},"toneMapping1":{"type":"toneMapping","inputs":["bloom1"]},"OUT":{"type":"null","inputs":["toneMapping1"],"flags":{"display":true}}},"params":{"sampling":1,"tTextureType":true,"textureType":1016},"inputs":["cameraRenderer1"],"flags":{"display":true}},"cameraRenderer1":{"type":"cameraRenderer","nodes":{"WebGLRenderer1":{"type":"WebGLRenderer","params":{"toneMapping":0}}},"params":{"node":"WebGLRenderer1"},"inputs":["cameraControls1"]}},"params":{"CADLinearTolerance":{"overriden_options":{"callback":"{}"}},"CADAngularTolerance":{"overriden_options":{"callback":"{}"}},"CADCurveAbscissa":{"overriden_options":{"callback":"{}"}},"CADCurveTolerance":{"overriden_options":{"callback":"{}"}},"CADDisplayEdges":{"overriden_options":{"callback":"{}"}},"CADEdgesColor":{"overriden_options":{"callback":"{}"}},"CADDisplayMeshes":{"overriden_options":{"callback":"{}"}},"CADMeshesColor":{"overriden_options":{"callback":"{}"}},"CADWireframe":{"overriden_options":{"callback":"{}"}},"CSGFacetAngle":{"overriden_options":{"callback":"{}"}},"CSGLinesColor":{"overriden_options":{"callback":"{}"}},"CSGMeshesColor":{"overriden_options":{"callback":"{}"}},"CSGWireframe":{"overriden_options":{"callback":"{}"}},"QUADTriangles":{"overriden_options":{"callback":"{}"}},"QUADWireframe":{"overriden_options":{"callback":"{}"}},"TetScale":{"overriden_options":{"callback":"{}"}},"TetDisplayLines":{"overriden_options":{"callback":"{}"}},"TetDisplaySharedFaces":{"overriden_options":{"callback":"{}"}},"TetDisplayPoints":{"overriden_options":{"callback":"{}"}},"TetDisplayCenter":{"overriden_options":{"callback":"{}"}},"TetDisplaySphere":{"overriden_options":{"callback":"{}"}}},"flags":{"display":true}},"env":{"type":"geo","nodes":{"material1":{"type":"material","params":{"material":"../MAT/meshStandardBuilder1"},"inputs":["box1"]},"MAT":{"type":"materialsNetwork","nodes":{"meshStandardBuilder1":{"type":"meshStandardBuilder","nodes":{"globals1":{"type":"globals"},"output1":{"type":"output","inputs":[null,null,{"index":2,"inputName":"color","node":"mix1","output":"mix"}]},"vec3ToFloat1":{"type":"vec3ToFloat","params":{"vec":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"vec","node":"globals1","output":"position"}]},"floatToVec2_1":{"type":"floatToVec2","params":{"x":{"overriden_options":{}},"y":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"x","node":"vec3ToFloat1","output":"x"},{"index":1,"inputName":"y","node":"vec3ToFloat1","output":"z"}]},"checkers1":{"type":"checkers","params":{"uv":{"overriden_options":{}},"freq":{"overriden_options":{}},"freqMult":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"uv","node":"floatToVec2_1","output":"vec2"}]},"mix1":{"type":"mix","params":{"value0":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"value1":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"blend":{"type":"float","default_value":0.5,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value0","node":"constant1","output":"val"},{"index":1,"inputName":"value1","node":"constant2","output":"val"},{"index":2,"inputName":"blend","node":"checkers1","output":"checker"}],"connection_points":{"in":[{"name":"value0","type":"vec3"},{"name":"value1","type":"vec3"},{"name":"blend","type":"float"}],"out":[{"name":"mix","type":"vec3"}]}},"constant1":{"type":"constant","params":{"type":4,"color":[0.24313725490196078,0.5098039215686274,0.8549019607843137],"asColor":true},"connection_points":{"in":[],"out":[{"name":"val","type":"vec3"}]}},"constant2":{"type":"constant","params":{"type":4,"color":[0.047058823529411764,0.10196078431372549,0.17647058823529413],"asColor":true},"connection_points":{"in":[],"out":[{"name":"val","type":"vec3"}]}}},"persisted_config":{"material":{"metadata":{"version":4.5,"type":"Material","generator":"Material.toJSON"},"uuid":"/env/MAT/meshStandardBuilder1-main","type":"MeshStandardMaterial","color":16777215,"roughness":1,"metalness":0,"emissive":0,"envMapIntensity":1,"depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"fog":false},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[],"timeDependent":false,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false},"customMaterials":{"customDepthMaterial":{"material":{"metadata":{"version":4.5,"type":"Material","generator":"Material.toJSON"},"uuid":"/env/MAT/meshStandardBuilder1-customDepthMaterial","type":"MeshDepthMaterial","name":"customDepthMaterial","depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"depthPacking":3201},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[],"timeDependent":false,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false}},"customDistanceMaterial":{"material":{"metadata":{"version":4.5,"type":"Material","generator":"Material.toJSON"},"uuid":"/env/MAT/meshStandardBuilder1-customDistanceMaterial","type":"MeshDistanceMaterial","name":"customDistanceMaterial","side":1,"depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[],"timeDependent":false,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false}},"customDepthDOFMaterial":{"material":{"metadata":{"version":4.5,"type":"Material","generator":"Material.toJSON"},"uuid":"/env/MAT/meshStandardBuilder1-customDepthDOFMaterial","type":"MeshDepthMaterial","name":"customDepthDOFMaterial","depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"depthPacking":3200},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[],"timeDependent":false,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false}}}}},"sky1":{"type":"sky","params":{"azimuth":0.07}}}},"box1":{"type":"box","params":{"sizes":[9.98,1,9.98],"center":[0,-0.5,0]}},"sphere1":{"type":"sphere","params":{"radius":21}},"material2":{"type":"material","params":{"material":"../MAT/sky1"},"inputs":["transform1"]},"merge1":{"type":"merge","inputs":["material1","material2"],"flags":{"display":true}},"transform1":{"type":"transform","params":{"applyOn":1},"inputs":["sphere1"],"flags":{"bypass":true}}},"params":{"CADLinearTolerance":{"overriden_options":{"callback":"{}"}},"CADAngularTolerance":{"overriden_options":{"callback":"{}"}},"CADCurveAbscissa":{"overriden_options":{"callback":"{}"}},"CADCurveTolerance":{"overriden_options":{"callback":"{}"}},"CADDisplayEdges":{"overriden_options":{"callback":"{}"}},"CADEdgesColor":{"overriden_options":{"callback":"{}"}},"CADDisplayMeshes":{"overriden_options":{"callback":"{}"}},"CADMeshesColor":{"overriden_options":{"callback":"{}"}},"CADWireframe":{"overriden_options":{"callback":"{}"}},"CSGFacetAngle":{"overriden_options":{"callback":"{}"}},"CSGLinesColor":{"overriden_options":{"callback":"{}"}},"CSGMeshesColor":{"overriden_options":{"callback":"{}"}},"CSGWireframe":{"overriden_options":{"callback":"{}"}},"QUADTriangles":{"overriden_options":{"callback":"{}"}},"QUADWireframe":{"overriden_options":{"callback":"{}"}},"TetScale":{"overriden_options":{"callback":"{}"}},"TetDisplayLines":{"overriden_options":{"callback":"{}"}},"TetDisplaySharedFaces":{"overriden_options":{"callback":"{}"}},"TetDisplayPoints":{"overriden_options":{"callback":"{}"}},"TetDisplayCenter":{"overriden_options":{"callback":"{}"}},"TetDisplaySphere":{"overriden_options":{"callback":"{}"}}},"flags":{"display":true}},"lights":{"type":"geo","nodes":{"hemisphereLight1":{"type":"hemisphereLight","params":{"intensity":0.18},"flags":{"bypass":true}},"polarTransform1":{"type":"polarTransform","params":{"center":[0,0.7,0],"longitude":-93.6,"latitude":25.2,"depth":3},"inputs":["areaLight1"]},"merge1":{"type":"merge","inputs":["hemisphereLight1","merge2"],"flags":{"display":true}},"areaLight1":{"type":"areaLight","params":{"intensity":0.5,"width":3.2,"height":2.6}},"spotLight1":{"type":"spotLight","params":{"intensity":0.3,"penumbra":0.36,"castShadow":true},"flags":{"bypass":true}},"merge2":{"type":"merge","inputs":["polarTransform1","polarTransform2"]},"polarTransform2":{"type":"polarTransform","params":{"center":[0,0.7,0],"longitude":50.4,"latitude":25.2,"depth":6.5},"inputs":["spotLight1"]}},"params":{"CADLinearTolerance":{"overriden_options":{"callback":"{}"}},"CADAngularTolerance":{"overriden_options":{"callback":"{}"}},"CADCurveAbscissa":{"overriden_options":{"callback":"{}"}},"CADCurveTolerance":{"overriden_options":{"callback":"{}"}},"CADDisplayEdges":{"overriden_options":{"callback":"{}"}},"CADEdgesColor":{"overriden_options":{"callback":"{}"}},"CADDisplayMeshes":{"overriden_options":{"callback":"{}"}},"CADMeshesColor":{"overriden_options":{"callback":"{}"}},"CADWireframe":{"overriden_options":{"callback":"{}"}},"CSGFacetAngle":{"overriden_options":{"callback":"{}"}},"CSGLinesColor":{"overriden_options":{"callback":"{}"}},"CSGMeshesColor":{"overriden_options":{"callback":"{}"}},"CSGWireframe":{"overriden_options":{"callback":"{}"}},"QUADTriangles":{"overriden_options":{"callback":"{}"}},"QUADWireframe":{"overriden_options":{"callback":"{}"}},"TetScale":{"overriden_options":{"callback":"{}"}},"TetDisplayLines":{"overriden_options":{"callback":"{}"}},"TetDisplaySharedFaces":{"overriden_options":{"callback":"{}"}},"TetDisplayPoints":{"overriden_options":{"callback":"{}"}},"TetDisplayCenter":{"overriden_options":{"callback":"{}"}},"TetDisplaySphere":{"overriden_options":{"callback":"{}"}}},"flags":{"display":true}}},"params":{"mainCameraPath":"/cameras/cameras:sopGroup/perspectiveCamera1"}},"ui":{"nodes":{"geo1":{"pos":[50,-250],"nodes":{"MAT":{"pos":[-1250,800],"nodes":{"meshStandard_RHINO":{"pos":[0,0]},"pointsBuilder1":{"pos":[0,400],"nodes":{"globals1":{"pos":[-500,0]},"output1":{"pos":[750,0]},"disk1":{"pos":[-100,200]},"constant1":{"pos":[50,300]},"multAdd1":{"pos":[-250,0]},"attribute1":{"pos":[-750,-250]},"round1":{"pos":[-600,-250]},"random1":{"pos":[-350,-250]},"floatToVec2_1":{"pos":[-500,-250]},"multAdd2":{"pos":[-50,-250]},"cos1":{"pos":[100,-250]},"multAdd3":{"pos":[250,-250]},"fit1":{"pos":[250,-150]},"multAdd4":{"pos":[450,250]},"multAdd5":{"pos":[-200,-250]},"laserColor1":{"pos":[150,-450]},"multAdd6":{"pos":[150,150]}}},"lineBasicBuilder_LIGHTING":{"pos":[0,250],"nodes":{"globals1":{"pos":[-400,-650]},"output1":{"pos":[1250,-400]},"constant3":{"pos":[1000,-50]},"laserColor1":{"pos":[950,-250]},"param1":{"pos":[-550,-200]},"attribute1":{"pos":[-700,0]},"constant1":{"pos":[-550,-400]},"mix1":{"pos":[-350,-350]},"noise1":{"pos":[350,-200]},"smoothstep1":{"pos":[-350,0]},"smoothstep2":{"pos":[-350,100]},"min1":{"pos":[-200,50]},"floatToVec3_1":{"pos":[-50,50]},"add1":{"pos":[450,-400]},"multScalar1":{"pos":[50,50]},"globals2":{"pos":[-750,400]},"multAdd1":{"pos":[-550,500]},"floatToVec3_2":{"pos":[100,400]},"max1":{"pos":[750,-350]},"vec3ToFloat1":{"pos":[-200,-250]},"floatToVec3_3":{"pos":[-50,-250]},"multAdd2":{"pos":[-250,-150]},"multAdd3":{"pos":[-550,300]},"attribute2":{"pos":[-700,150]},"multScalar2":{"pos":[1050,-250]}}}}},"circle1":{"pos":[-500,-350]},"line1":{"pos":[-800,-800]},"copy1":{"pos":[-800,350]},"attribDelete1":{"pos":[-500,-150]},"merge1":{"pos":[-350,1650]},"objectProperties2":{"pos":[-800,600]},"hierarchy2":{"pos":[-800,1050]},"actor_for_each_line":{"pos":[-800,900],"selection":["getParent1","getObjectAttribute1","constant2"],"nodes":{"onTick1":{"pos":[850,200]},"getObjectProperty1":{"pos":[-650,750]},"subtract1":{"pos":[-400,500]},"rayIntersectObject1":{"pos":[250,950]},"getObject1":{"pos":[100,1100]},"getIntersectionProperty1":{"pos":[400,950]},"ray1":{"pos":[100,850]},"getParent1":{"pos":[-1200,150]},"getObjectAttribute1":{"pos":[-1000,150]},"constant2":{"pos":[-1200,300]},"getObjectAttribute2":{"pos":[-1950,400]},"rand1":{"pos":[-1550,450]},"onTick2":{"pos":[-1800,700]},"add1":{"pos":[-1250,500]},"sin1":{"pos":[-1050,500]},"floatToVec3_1":{"pos":[-800,500]},"add2":{"pos":[-600,300]},"multAdd1":{"pos":[-950,500]},"multAdd2":{"pos":[-1650,700]},"rand2":{"pos":[-1550,600]},"add3":{"pos":[-1300,650]},"cos1":{"pos":[-1100,650]},"multAdd3":{"pos":[-950,650]},"multAdd4":{"pos":[-1400,450]},"multAdd5":{"pos":[-1400,600]},"setObjectAttribute1":{"pos":[1350,450]},"constant3":{"pos":[950,1000]},"onObjectAttributeUpdate1":{"pos":[1050,1400]},"length1":{"pos":[550,550]},"compare1":{"pos":[650,550]},"constant5":{"pos":[1350,1600]},"subtract3":{"pos":[700,750]},"twoWaySwitch1":{"pos":[1000,600]},"multScalar1":{"pos":[-200,650]},"add4":{"pos":[200,650]},"setMaterialUniform1":{"pos":[1500,1400]},"triggerFilter1":{"pos":[1150,350]}}},"actor_for_lines_parent":{"pos":[-800,1500],"nodes":{"rayFromCursor1":{"pos":[-550,-200]},"rayIntersectObject1":{"pos":[-300,0]},"getObject1":{"pos":[-550,150]},"getIntersectionProperty1":{"pos":[-150,0]},"setObjectAttribute1":{"pos":[550,-50]},"constant2":{"pos":[250,-150]},"onTick1":{"pos":[50,-450]},"triggerFilter1":{"pos":[300,-450]},"length1":{"pos":[50,-300]},"compare1":{"pos":[200,-300]}}},"attribCreate1":{"pos":[-800,1200]},"attribId1":{"pos":[-800,750]},"add1":{"pos":[-1150,-600]},"merge2":{"pos":[-1000,-250]},"hierarchy3":{"pos":[-1000,150]},"material2":{"pos":[-1150,-450]},"attribCreate2":{"pos":[-850,-100]},"jitter1":{"pos":[-500,-250]},"delete1":{"pos":[-500,0]},"delete2":{"pos":[-500,150]},"attribId2":{"pos":[-800,-650]},"material3":{"pos":[-800,500]},"pointLight1":{"pos":[100,1200]},"actor1":{"pos":[100,1350],"selection":["noiseImproved1"],"nodes":{"getObjectAttribute1":{"pos":[100,50]},"constant2":{"pos":[-100,200]},"getObject1":{"pos":[-200,-100]},"setObjectPosition1":{"pos":[800,0]},"onTick1":{"pos":[200,-150]},"noiseImproved1":{"pos":[400,350]},"onTick2":{"pos":[0,350]},"floatToVec3_1":{"pos":[200,350]},"floatToVec3_2":{"pos":[600,350]},"add1":{"pos":[650,50]}}},"objectProperties4":{"pos":[-800,1350]},"fileGLTF1":{"pos":[-150,-250]},"transform1":{"pos":[-150,50]},"hierarchy1":{"pos":[-150,-100]},"BVHVisualizer1":{"pos":[100,1050]},"objectProperties1":{"pos":[-150,300]},"objectProperties3":{"pos":[-150,1100]},"tube1":{"pos":[350,100]},"circle2":{"pos":[650,100]},"copy2":{"pos":[450,300]},"merge3":{"pos":[-150,700]},"BVH1":{"pos":[-150,950]},"material1":{"pos":[-150,800]},"merge4":{"pos":[450,450]},"attribDelete2":{"pos":[450,550]}}},"COP":{"pos":[-200,50],"selection":["image1"],"nodes":{"envMap":{"pos":[50,250]},"imageEnv":{"pos":[50,100]},"image1":{"pos":[-200,100]}}},"cameras":{"pos":[50,-50],"nodes":{"perspectiveCamera1":{"pos":[0,-50]},"cameraControls1":{"pos":[0,150],"nodes":{"cameraOrbitControls1":{"pos":[0,0]}}},"cameraPostProcess1":{"pos":[0,550],"nodes":{"bloom1":{"pos":[0,-200]},"toneMapping1":{"pos":[0,0]},"OUT":{"pos":[0,200]}}},"cameraRenderer1":{"pos":[0,350],"nodes":{"WebGLRenderer1":{"pos":[0,0]}}}}},"env":{"pos":[50,-350],"nodes":{"material1":{"pos":[0,300]},"MAT":{"pos":[-200,300],"nodes":{"meshStandardBuilder1":{"pos":[0,200],"nodes":{"globals1":{"pos":[-450,0]},"output1":{"pos":[400,0]},"vec3ToFloat1":{"pos":[-200,200]},"floatToVec2_1":{"pos":[-100,200]},"checkers1":{"pos":[50,200]},"mix1":{"pos":[250,0]},"constant1":{"pos":[50,-150]},"constant2":{"pos":[0,0]}}},"sky1":{"pos":[0,400]}}},"box1":{"pos":[0,100]},"sphere1":{"pos":[300,100]},"material2":{"pos":[300,350]},"merge1":{"pos":[100,550]},"transform1":{"pos":[300,200]}}},"lights":{"pos":[50,-150],"nodes":{"hemisphereLight1":{"pos":[50,-50]},"polarTransform1":{"pos":[300,150]},"merge1":{"pos":[100,350]},"areaLight1":{"pos":[300,-100]},"spotLight1":{"pos":[450,-100]},"merge2":{"pos":[400,250]},"polarTransform2":{"pos":[450,100]}}}}},"shaders":{"/geo1/MAT/pointsBuilder1":{"vertex":"uniform float size;\nuniform float scale;\n#include <common>\n\n\n\n// /geo1/MAT/pointsBuilder1/fit1\n//\n//\n// FIT\n//\n//\nfloat fit(float val, float srcMin, float srcMax, float destMin, float destMax){\n\tfloat src_range = srcMax - srcMin;\n\tfloat dest_range = destMax - destMin;\n\n\tfloat r = (val - srcMin) / src_range;\n\treturn (r * dest_range) + destMin;\n}\nvec2 fit(vec2 val, vec2 srcMin, vec2 srcMax, vec2 destMin, vec2 destMax){\n\treturn vec2(\n\t\tfit(val.x, srcMin.x, srcMax.x, destMin.x, destMax.x),\n\t\tfit(val.y, srcMin.y, srcMax.y, destMin.y, destMax.y)\n\t);\n}\nvec3 fit(vec3 val, vec3 srcMin, vec3 srcMax, vec3 destMin, vec3 destMax){\n\treturn vec3(\n\t\tfit(val.x, srcMin.x, srcMax.x, destMin.x, destMax.x),\n\t\tfit(val.y, srcMin.y, srcMax.y, destMin.y, destMax.y),\n\t\tfit(val.z, srcMin.z, srcMax.z, destMin.z, destMax.z)\n\t);\n}\nvec4 fit(vec4 val, vec4 srcMin, vec4 srcMax, vec4 destMin, vec4 destMax){\n\treturn vec4(\n\t\tfit(val.x, srcMin.x, srcMax.x, destMin.x, destMax.x),\n\t\tfit(val.y, srcMin.y, srcMax.y, destMin.y, destMax.y),\n\t\tfit(val.z, srcMin.z, srcMax.z, destMin.z, destMax.z),\n\t\tfit(val.w, srcMin.w, srcMax.w, destMin.w, destMax.w)\n\t);\n}\n\n//\n//\n// FIT TO 01\n// fits the range [srcMin, srcMax] to [0, 1]\n//\nfloat fitTo01(float val, float srcMin, float srcMax){\n\tfloat size = srcMax - srcMin;\n\treturn (val - srcMin) / size;\n}\nvec2 fitTo01(vec2 val, vec2 srcMin, vec2 srcMax){\n\treturn vec2(\n\t\tfitTo01(val.x, srcMin.x, srcMax.x),\n\t\tfitTo01(val.y, srcMin.y, srcMax.y)\n\t);\n}\nvec3 fitTo01(vec3 val, vec3 srcMin, vec3 srcMax){\n\treturn vec3(\n\t\tfitTo01(val.x, srcMin.x, srcMax.x),\n\t\tfitTo01(val.y, srcMin.y, srcMax.y),\n\t\tfitTo01(val.z, srcMin.z, srcMax.z)\n\t);\n}\nvec4 fitTo01(vec4 val, vec4 srcMin, vec4 srcMax){\n\treturn vec4(\n\t\tfitTo01(val.x, srcMin.x, srcMax.x),\n\t\tfitTo01(val.y, srcMin.y, srcMax.y),\n\t\tfitTo01(val.z, srcMin.z, srcMax.z),\n\t\tfitTo01(val.w, srcMin.w, srcMax.w)\n\t);\n}\n\n//\n//\n// FIT FROM 01\n// fits the range [0, 1] to [destMin, destMax]\n//\nfloat fitFrom01(float val, float destMin, float destMax){\n\treturn fit(val, 0.0, 1.0, destMin, destMax);\n}\nvec2 fitFrom01(vec2 val, vec2 srcMin, vec2 srcMax){\n\treturn vec2(\n\t\tfitFrom01(val.x, srcMin.x, srcMax.x),\n\t\tfitFrom01(val.y, srcMin.y, srcMax.y)\n\t);\n}\nvec3 fitFrom01(vec3 val, vec3 srcMin, vec3 srcMax){\n\treturn vec3(\n\t\tfitFrom01(val.x, srcMin.x, srcMax.x),\n\t\tfitFrom01(val.y, srcMin.y, srcMax.y),\n\t\tfitFrom01(val.z, srcMin.z, srcMax.z)\n\t);\n}\nvec4 fitFrom01(vec4 val, vec4 srcMin, vec4 srcMax){\n\treturn vec4(\n\t\tfitFrom01(val.x, srcMin.x, srcMax.x),\n\t\tfitFrom01(val.y, srcMin.y, srcMax.y),\n\t\tfitFrom01(val.z, srcMin.z, srcMax.z),\n\t\tfitFrom01(val.w, srcMin.w, srcMax.w)\n\t);\n}\n\n//\n//\n// FIT FROM 01 TO VARIANCE\n// fits the range [0, 1] to [center - variance, center + variance]\n//\nfloat fitFrom01ToVariance(float val, float center, float variance){\n\treturn fitFrom01(val, center - variance, center + variance);\n}\nvec2 fitFrom01ToVariance(vec2 val, vec2 center, vec2 variance){\n\treturn vec2(\n\t\tfitFrom01ToVariance(val.x, center.x, variance.x),\n\t\tfitFrom01ToVariance(val.y, center.y, variance.y)\n\t);\n}\nvec3 fitFrom01ToVariance(vec3 val, vec3 center, vec3 variance){\n\treturn vec3(\n\t\tfitFrom01ToVariance(val.x, center.x, variance.x),\n\t\tfitFrom01ToVariance(val.y, center.y, variance.y),\n\t\tfitFrom01ToVariance(val.z, center.z, variance.z)\n\t);\n}\nvec4 fitFrom01ToVariance(vec4 val, vec4 center, vec4 variance){\n\treturn vec4(\n\t\tfitFrom01ToVariance(val.x, center.x, variance.x),\n\t\tfitFrom01ToVariance(val.y, center.y, variance.y),\n\t\tfitFrom01ToVariance(val.z, center.z, variance.z),\n\t\tfitFrom01ToVariance(val.w, center.w, variance.w)\n\t);\n}\n\n\n\n\n\n\n\n// /geo1/MAT/pointsBuilder1/globals1\nuniform float time;\n\n// /geo1/MAT/pointsBuilder1/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n// /geo1/MAT/pointsBuilder1/attribute1\nattribute float id;\n\n\n\n\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n#ifdef USE_POINTS_UV\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\nvoid main() {\n\t#ifdef USE_POINTS_UV\n\t\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\t#endif\n\t#include <color_vertex>\n\n\n\n\t// /geo1/MAT/pointsBuilder1/attribute1\n\tfloat v_POLY_attribute1_val = id;\n\t\n\t// /geo1/MAT/pointsBuilder1/globals1\n\tfloat v_POLY_globals1_time = time;\n\t\n\t// /geo1/MAT/pointsBuilder1/constant1\n\tfloat v_POLY_constant1_val = 0.03;\n\t\n\t// /geo1/MAT/pointsBuilder1/laserColor1\n\tfloat v_POLY_laserColor1_attribute1_val = id;\n\tv_POLY_attribute_id = float(id);\n\t\n\t// /geo1/MAT/pointsBuilder1/round1\n\tfloat v_POLY_round1_val = sign(v_POLY_attribute1_val)*floor(abs(v_POLY_attribute1_val)+0.5);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd1\n\tfloat v_POLY_multAdd1_val = (6.0*(v_POLY_globals1_time + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/floatToVec2_1\n\tvec2 v_POLY_floatToVec2_1_vec2 = vec2(v_POLY_round1_val, 0.54);\n\t\n\t// /geo1/MAT/pointsBuilder1/random1\n\tfloat v_POLY_random1_rand = rand(v_POLY_floatToVec2_1_vec2);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd5\n\tfloat v_POLY_multAdd5_val = (4.4*(v_POLY_random1_rand + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd2\n\tfloat v_POLY_multAdd2_val = (1.0*(v_POLY_multAdd5_val + v_POLY_multAdd1_val)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/cos1\n\tfloat v_POLY_cos1_val = cos(v_POLY_multAdd2_val);\n\t\n\t// /geo1/MAT/pointsBuilder1/fit1\n\tfloat v_POLY_fit1_val = fit(v_POLY_cos1_val, -1.0, 1.0, 0.22, 1.0);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd4\n\tfloat v_POLY_multAdd4_val = (v_POLY_constant1_val*(v_POLY_fit1_val + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/output1\n\tvec3 transformed = position;\n\tvec3 objectNormal = normal;\n\t#ifdef USE_TANGENT\n\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t#endif\n\tgl_PointSize = v_POLY_multAdd4_val * size * 10.0;\n\n\n\n\t#include <morphcolor_vertex>\n// removed:\n//\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n// removed:\n//\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <fog_vertex>\n}","fragment":"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n\n\n\n// /geo1/MAT/pointsBuilder1/laserColor1/rgbToOklab1\n//////////////////////////////////////////////////////////////////////\n//\n// Visualizing Björn Ottosson's \"oklab\" colorspace\n//\n// shadertoy implementation by mattz\n//\n// license CC0 (public domain)\n// https://creativecommons.org/share-your-work/public-domain/cc0/\n//\n// Click and drag to set lightness (mouse x) and chroma (mouse y).\n// Hue varies linearly across the image from left to right.\n//\n// While mouse is down, plotted curves show oklab components\n// L (red), a (green), and b (blue). \n//\n// To test the inverse mapping, the plotted curves are generated\n// by mapping the (pre-clipping) linear RGB color back to oklab \n// space.\n//\n// White bars on top of the image (and black bars on the bottom of\n// the image) indicate clipping when one or more of the R, G, B \n// components are greater than 1.0 (or less than 0.0 respectively).\n//\n// The color accompanying the black/white bar shows which channels\n// are out of gamut.\n//\n// Click in the bottom left to reset the view.\n//\n// Hit the 'G' key to toggle displaying a gamut test:\n//\n// * black pixels indicate that RGB values for some hues\n// were clipped to 0 at the given lightness/chroma pair.\n//\n// * white pixels indicate that RGB values for some hues\n// were clipped to 1 at the given lightness/chroma pair\n//\n// * gray pixels indicate that both types of clipping happened\n//\n// Hit the 'U' key to display a uniform sampling of linear sRGB \n// space, converted into oklab lightness (x position) and chroma\n// (y position) coordinates. If you mouse over a colored dot, the\n// spectrum on screen should include that exact color.\n//\n//////////////////////////////////////////////////////////////////////\n\n//////////////////////////////////////////////////////////////////////\n// sRGB color transform and inverse from \n// https://bottosson.github.io/posts/colorwrong/#what-can-we-do%3F\n\nvec3 srgb_from_linear_srgb(vec3 x) {\n\n vec3 xlo = 12.92*x;\n vec3 xhi = 1.055 * pow(x, vec3(0.4166666666666667)) - 0.055;\n \n return mix(xlo, xhi, step(vec3(0.0031308), x));\n\n}\n\nvec3 linear_srgb_from_srgb(vec3 x) {\n\n vec3 xlo = x / 12.92;\n vec3 xhi = pow((x + 0.055)/(1.055), vec3(2.4));\n \n return mix(xlo, xhi, step(vec3(0.04045), x));\n\n}\n\n//////////////////////////////////////////////////////////////////////\n// oklab transform and inverse from\n// https://bottosson.github.io/posts/oklab/\n\n\nconst mat3 fwdA = mat3(1.0, 1.0, 1.0,\n 0.3963377774, -0.1055613458, -0.0894841775,\n 0.2158037573, -0.0638541728, -1.2914855480);\n \nconst mat3 fwdB = mat3(4.0767245293, -1.2681437731, -0.0041119885,\n -3.3072168827, 2.6093323231, -0.7034763098,\n 0.2307590544, -0.3411344290, 1.7068625689);\n\nconst mat3 invB = mat3(0.4121656120, 0.2118591070, 0.0883097947,\n 0.5362752080, 0.6807189584, 0.2818474174,\n 0.0514575653, 0.1074065790, 0.6302613616);\n \nconst mat3 invA = mat3(0.2104542553, 1.9779984951, 0.0259040371,\n 0.7936177850, -2.4285922050, 0.7827717662,\n -0.0040720468, 0.4505937099, -0.8086757660);\n\nvec3 oklab_from_linear_srgb(vec3 c) {\n\n vec3 lms = invB * c;\n \n return invA * (sign(lms)*pow(abs(lms), vec3(0.3333333333333)));\n \n}\n\nvec3 linear_srgb_from_oklab(vec3 c) {\n\n vec3 lms = fwdA * c;\n \n return fwdB * (lms * lms * lms);\n \n}\n\n\n// https://www.shadertoy.com/view/WtccD7\nconst float max_chroma = 0.33;\nvec3 uvToOklab(vec3 uvw){\n\n // setup oklab color\n float theta = 2.*3.141592653589793*uvw.x;\n \n float L = 0.8;\n float chroma = 0.1;\n \n //if (max(iMouse.x, iMouse.y) > 0.05 * iResolution.y) {\n L = uvw.y;//iMouse.x / iResolution.x;\n chroma = uvw.z * max_chroma;// / iResolution.y;\n //}\n \n float a = chroma*cos(theta);\n float b = chroma*sin(theta);\n \n vec3 lab = vec3(L, a, b);\n\treturn lab;\n\n // convert to rgb \n // vec3 rgb = linear_srgb_from_oklab(lab);\n\n}\n\n// /geo1/MAT/pointsBuilder1/disk1\nfloat disk_feather(float dist, float radius, float feather){\n\tif(feather <= 0.0){\n\t\tif(dist < radius){return 1.0;}else{return 0.0;}\n\t} else {\n\t\tfloat half_feather = feather * 0.5;\n\t\tif(dist < (radius - half_feather)){\n\t\t\treturn 1.0;\n\t\t} else {\n\t\t\tif(dist > (radius + half_feather)){\n\t\t\t\treturn 0.0;\n\t\t\t} else {\n\t\t\t\tfloat feather_start = (radius - half_feather);\n\t\t\t\tfloat blend = 1.0 - (dist - feather_start) / feather;\n\t\t\t\treturn blend;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfloat disk2d(vec2 pos, vec2 center, float radius, float feather){\n\tfloat dist = distance(pos, center);\n\treturn disk_feather(dist, radius, feather);\n}\n\n// function could be called sphere, but is an overload of disk, and is the same\nfloat disk3d(vec3 pos, vec3 center, float radius, float feather){\n\tfloat dist = distance(pos, center);\n\treturn disk_feather(dist, radius, feather);\n}\n\n\n\n\n\n\n\n// /geo1/MAT/pointsBuilder1/globals1\nuniform float time;\n\n// /geo1/MAT/pointsBuilder1/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n\n\n\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\n\n\t// /geo1/MAT/pointsBuilder1/globals1\n\tvec2 v_POLY_globals1_gl_PointCoord = gl_PointCoord;\n\tfloat v_POLY_globals1_time = time;\n\t\n\t// /geo1/MAT/pointsBuilder1/laserColor1\n\tvec3 v_POLY_laserColor1_baseColor = vec3(0.0, 0.0, 0.0);\n\tif(true){\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/constant2\n\t\tvec3 v_POLY_laserColor1_constant2_val = vec3(0.6653872982754769, 0.5583403896257968, 0.005181516700061659);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/constant1\n\t\tvec3 v_POLY_laserColor1_constant1_val = vec3(0.7011018919268015, 0.018500220124016656, 0.005181516700061659);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/attribute1\n\t\tfloat v_POLY_laserColor1_attribute1_val = v_POLY_attribute_id;\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/rgbToOklab1\n\t\tvec3 v_POLY_laserColor1_rgbToOklab1_oklab = oklab_from_linear_srgb(v_POLY_laserColor1_constant2_val);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/rgbToOklab2\n\t\tvec3 v_POLY_laserColor1_rgbToOklab2_oklab = oklab_from_linear_srgb(v_POLY_laserColor1_constant1_val);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/round1\n\t\tfloat v_POLY_laserColor1_round1_val = sign(v_POLY_laserColor1_attribute1_val)*floor(abs(v_POLY_laserColor1_attribute1_val)+0.5);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/floatToVec2_1\n\t\tvec2 v_POLY_laserColor1_floatToVec2_1_vec2 = vec2(v_POLY_laserColor1_round1_val, 0.54);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/random1\n\t\tfloat v_POLY_laserColor1_random1_rand = rand(v_POLY_laserColor1_floatToVec2_1_vec2);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/pow1\n\t\tfloat v_POLY_laserColor1_pow1_val = pow(v_POLY_laserColor1_random1_rand, 0.27);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/mix1\n\t\tvec3 v_POLY_laserColor1_mix1_mix = mix(v_POLY_laserColor1_rgbToOklab1_oklab, v_POLY_laserColor1_rgbToOklab2_oklab, v_POLY_laserColor1_pow1_val);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/oklabToRgb1\n\t\tvec3 v_POLY_laserColor1_oklabToRgb1_rgb = linear_srgb_from_oklab(v_POLY_laserColor1_mix1_mix);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/subnetOutput1\n\t\tv_POLY_laserColor1_baseColor = v_POLY_laserColor1_oklabToRgb1_rgb;\n\t}\n\t\n\t// /geo1/MAT/pointsBuilder1/disk1\n\tfloat v_POLY_disk1_float = disk2d(v_POLY_globals1_gl_PointCoord, vec2(0.5, 0.5), 0.2, 0.24);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd6\n\tfloat v_POLY_multAdd6_val = (0.33*(v_POLY_disk1_float + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/output1\n\tdiffuseColor.xyz = v_POLY_laserColor1_baseColor;\n\tdiffuseColor.a = v_POLY_multAdd6_val;\n\n\n\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}","customDistanceMaterial.vertex":"\nuniform float size;\nuniform float scale;\n#include <common>\n#include <clipping_planes_pars_vertex>\nvarying float vViewZDepth;\n\n// INSERT DEFINES\n\n\n\n// /geo1/MAT/pointsBuilder1/fit1\n//\n//\n// FIT\n//\n//\nfloat fit(float val, float srcMin, float srcMax, float destMin, float destMax){\n\tfloat src_range = srcMax - srcMin;\n\tfloat dest_range = destMax - destMin;\n\n\tfloat r = (val - srcMin) / src_range;\n\treturn (r * dest_range) + destMin;\n}\nvec2 fit(vec2 val, vec2 srcMin, vec2 srcMax, vec2 destMin, vec2 destMax){\n\treturn vec2(\n\t\tfit(val.x, srcMin.x, srcMax.x, destMin.x, destMax.x),\n\t\tfit(val.y, srcMin.y, srcMax.y, destMin.y, destMax.y)\n\t);\n}\nvec3 fit(vec3 val, vec3 srcMin, vec3 srcMax, vec3 destMin, vec3 destMax){\n\treturn vec3(\n\t\tfit(val.x, srcMin.x, srcMax.x, destMin.x, destMax.x),\n\t\tfit(val.y, srcMin.y, srcMax.y, destMin.y, destMax.y),\n\t\tfit(val.z, srcMin.z, srcMax.z, destMin.z, destMax.z)\n\t);\n}\nvec4 fit(vec4 val, vec4 srcMin, vec4 srcMax, vec4 destMin, vec4 destMax){\n\treturn vec4(\n\t\tfit(val.x, srcMin.x, srcMax.x, destMin.x, destMax.x),\n\t\tfit(val.y, srcMin.y, srcMax.y, destMin.y, destMax.y),\n\t\tfit(val.z, srcMin.z, srcMax.z, destMin.z, destMax.z),\n\t\tfit(val.w, srcMin.w, srcMax.w, destMin.w, destMax.w)\n\t);\n}\n\n//\n//\n// FIT TO 01\n// fits the range [srcMin, srcMax] to [0, 1]\n//\nfloat fitTo01(float val, float srcMin, float srcMax){\n\tfloat size = srcMax - srcMin;\n\treturn (val - srcMin) / size;\n}\nvec2 fitTo01(vec2 val, vec2 srcMin, vec2 srcMax){\n\treturn vec2(\n\t\tfitTo01(val.x, srcMin.x, srcMax.x),\n\t\tfitTo01(val.y, srcMin.y, srcMax.y)\n\t);\n}\nvec3 fitTo01(vec3 val, vec3 srcMin, vec3 srcMax){\n\treturn vec3(\n\t\tfitTo01(val.x, srcMin.x, srcMax.x),\n\t\tfitTo01(val.y, srcMin.y, srcMax.y),\n\t\tfitTo01(val.z, srcMin.z, srcMax.z)\n\t);\n}\nvec4 fitTo01(vec4 val, vec4 srcMin, vec4 srcMax){\n\treturn vec4(\n\t\tfitTo01(val.x, srcMin.x, srcMax.x),\n\t\tfitTo01(val.y, srcMin.y, srcMax.y),\n\t\tfitTo01(val.z, srcMin.z, srcMax.z),\n\t\tfitTo01(val.w, srcMin.w, srcMax.w)\n\t);\n}\n\n//\n//\n// FIT FROM 01\n// fits the range [0, 1] to [destMin, destMax]\n//\nfloat fitFrom01(float val, float destMin, float destMax){\n\treturn fit(val, 0.0, 1.0, destMin, destMax);\n}\nvec2 fitFrom01(vec2 val, vec2 srcMin, vec2 srcMax){\n\treturn vec2(\n\t\tfitFrom01(val.x, srcMin.x, srcMax.x),\n\t\tfitFrom01(val.y, srcMin.y, srcMax.y)\n\t);\n}\nvec3 fitFrom01(vec3 val, vec3 srcMin, vec3 srcMax){\n\treturn vec3(\n\t\tfitFrom01(val.x, srcMin.x, srcMax.x),\n\t\tfitFrom01(val.y, srcMin.y, srcMax.y),\n\t\tfitFrom01(val.z, srcMin.z, srcMax.z)\n\t);\n}\nvec4 fitFrom01(vec4 val, vec4 srcMin, vec4 srcMax){\n\treturn vec4(\n\t\tfitFrom01(val.x, srcMin.x, srcMax.x),\n\t\tfitFrom01(val.y, srcMin.y, srcMax.y),\n\t\tfitFrom01(val.z, srcMin.z, srcMax.z),\n\t\tfitFrom01(val.w, srcMin.w, srcMax.w)\n\t);\n}\n\n//\n//\n// FIT FROM 01 TO VARIANCE\n// fits the range [0, 1] to [center - variance, center + variance]\n//\nfloat fitFrom01ToVariance(float val, float center, float variance){\n\treturn fitFrom01(val, center - variance, center + variance);\n}\nvec2 fitFrom01ToVariance(vec2 val, vec2 center, vec2 variance){\n\treturn vec2(\n\t\tfitFrom01ToVariance(val.x, center.x, variance.x),\n\t\tfitFrom01ToVariance(val.y, center.y, variance.y)\n\t);\n}\nvec3 fitFrom01ToVariance(vec3 val, vec3 center, vec3 variance){\n\treturn vec3(\n\t\tfitFrom01ToVariance(val.x, center.x, variance.x),\n\t\tfitFrom01ToVariance(val.y, center.y, variance.y),\n\t\tfitFrom01ToVariance(val.z, center.z, variance.z)\n\t);\n}\nvec4 fitFrom01ToVariance(vec4 val, vec4 center, vec4 variance){\n\treturn vec4(\n\t\tfitFrom01ToVariance(val.x, center.x, variance.x),\n\t\tfitFrom01ToVariance(val.y, center.y, variance.y),\n\t\tfitFrom01ToVariance(val.z, center.z, variance.z),\n\t\tfitFrom01ToVariance(val.w, center.w, variance.w)\n\t);\n}\n\n\n\n\n\n\n\n// /geo1/MAT/pointsBuilder1/globals1\nuniform float time;\n\n// /geo1/MAT/pointsBuilder1/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n// /geo1/MAT/pointsBuilder1/attribute1\nattribute float id;\n\n\n\n\n\n\n// vHighPrecisionZW is added to match CustomMeshDepth.frag\n// which is itself taken from threejs\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t// INSERT BODY\n\n\n\n\t// /geo1/MAT/pointsBuilder1/attribute1\n\tfloat v_POLY_attribute1_val = id;\n\t\n\t// /geo1/MAT/pointsBuilder1/globals1\n\tfloat v_POLY_globals1_time = time;\n\t\n\t// /geo1/MAT/pointsBuilder1/constant1\n\tfloat v_POLY_constant1_val = 0.03;\n\t\n\t// /geo1/MAT/pointsBuilder1/laserColor1\n\tfloat v_POLY_laserColor1_attribute1_val = id;\n\tv_POLY_attribute_id = float(id);\n\t\n\t// /geo1/MAT/pointsBuilder1/round1\n\tfloat v_POLY_round1_val = sign(v_POLY_attribute1_val)*floor(abs(v_POLY_attribute1_val)+0.5);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd1\n\tfloat v_POLY_multAdd1_val = (6.0*(v_POLY_globals1_time + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/floatToVec2_1\n\tvec2 v_POLY_floatToVec2_1_vec2 = vec2(v_POLY_round1_val, 0.54);\n\t\n\t// /geo1/MAT/pointsBuilder1/random1\n\tfloat v_POLY_random1_rand = rand(v_POLY_floatToVec2_1_vec2);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd5\n\tfloat v_POLY_multAdd5_val = (4.4*(v_POLY_random1_rand + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd2\n\tfloat v_POLY_multAdd2_val = (1.0*(v_POLY_multAdd5_val + v_POLY_multAdd1_val)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/cos1\n\tfloat v_POLY_cos1_val = cos(v_POLY_multAdd2_val);\n\t\n\t// /geo1/MAT/pointsBuilder1/fit1\n\tfloat v_POLY_fit1_val = fit(v_POLY_cos1_val, -1.0, 1.0, 0.22, 1.0);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd4\n\tfloat v_POLY_multAdd4_val = (v_POLY_constant1_val*(v_POLY_fit1_val + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/output1\n\tvec3 transformed = position;\n\tvec3 objectNormal = normal;\n\t#ifdef USE_TANGENT\n\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t#endif\n\tgl_PointSize = v_POLY_multAdd4_val * size * 10.0;\n\n\n\n\n\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\tvViewZDepth = - mvPosition.z;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\n\tvHighPrecisionZW = gl_Position.zw;\n\n}\n","customDistanceMaterial.fragment":"\n// INSERT DEFINES\n\n\n\n// /geo1/MAT/pointsBuilder1/laserColor1/rgbToOklab1\n//////////////////////////////////////////////////////////////////////\n//\n// Visualizing Björn Ottosson's \"oklab\" colorspace\n//\n// shadertoy implementation by mattz\n//\n// license CC0 (public domain)\n// https://creativecommons.org/share-your-work/public-domain/cc0/\n//\n// Click and drag to set lightness (mouse x) and chroma (mouse y).\n// Hue varies linearly across the image from left to right.\n//\n// While mouse is down, plotted curves show oklab components\n// L (red), a (green), and b (blue). \n//\n// To test the inverse mapping, the plotted curves are generated\n// by mapping the (pre-clipping) linear RGB color back to oklab \n// space.\n//\n// White bars on top of the image (and black bars on the bottom of\n// the image) indicate clipping when one or more of the R, G, B \n// components are greater than 1.0 (or less than 0.0 respectively).\n//\n// The color accompanying the black/white bar shows which channels\n// are out of gamut.\n//\n// Click in the bottom left to reset the view.\n//\n// Hit the 'G' key to toggle displaying a gamut test:\n//\n// * black pixels indicate that RGB values for some hues\n// were clipped to 0 at the given lightness/chroma pair.\n//\n// * white pixels indicate that RGB values for some hues\n// were clipped to 1 at the given lightness/chroma pair\n//\n// * gray pixels indicate that both types of clipping happened\n//\n// Hit the 'U' key to display a uniform sampling of linear sRGB \n// space, converted into oklab lightness (x position) and chroma\n// (y position) coordinates. If you mouse over a colored dot, the\n// spectrum on screen should include that exact color.\n//\n//////////////////////////////////////////////////////////////////////\n\n//////////////////////////////////////////////////////////////////////\n// sRGB color transform and inverse from \n// https://bottosson.github.io/posts/colorwrong/#what-can-we-do%3F\n\nvec3 srgb_from_linear_srgb(vec3 x) {\n\n vec3 xlo = 12.92*x;\n vec3 xhi = 1.055 * pow(x, vec3(0.4166666666666667)) - 0.055;\n \n return mix(xlo, xhi, step(vec3(0.0031308), x));\n\n}\n\nvec3 linear_srgb_from_srgb(vec3 x) {\n\n vec3 xlo = x / 12.92;\n vec3 xhi = pow((x + 0.055)/(1.055), vec3(2.4));\n \n return mix(xlo, xhi, step(vec3(0.04045), x));\n\n}\n\n//////////////////////////////////////////////////////////////////////\n// oklab transform and inverse from\n// https://bottosson.github.io/posts/oklab/\n\n\nconst mat3 fwdA = mat3(1.0, 1.0, 1.0,\n 0.3963377774, -0.1055613458, -0.0894841775,\n 0.2158037573, -0.0638541728, -1.2914855480);\n \nconst mat3 fwdB = mat3(4.0767245293, -1.2681437731, -0.0041119885,\n -3.3072168827, 2.6093323231, -0.7034763098,\n 0.2307590544, -0.3411344290, 1.7068625689);\n\nconst mat3 invB = mat3(0.4121656120, 0.2118591070, 0.0883097947,\n 0.5362752080, 0.6807189584, 0.2818474174,\n 0.0514575653, 0.1074065790, 0.6302613616);\n \nconst mat3 invA = mat3(0.2104542553, 1.9779984951, 0.0259040371,\n 0.7936177850, -2.4285922050, 0.7827717662,\n -0.0040720468, 0.4505937099, -0.8086757660);\n\nvec3 oklab_from_linear_srgb(vec3 c) {\n\n vec3 lms = invB * c;\n \n return invA * (sign(lms)*pow(abs(lms), vec3(0.3333333333333)));\n \n}\n\nvec3 linear_srgb_from_oklab(vec3 c) {\n\n vec3 lms = fwdA * c;\n \n return fwdB * (lms * lms * lms);\n \n}\n\n\n// https://www.shadertoy.com/view/WtccD7\nconst float max_chroma = 0.33;\nvec3 uvToOklab(vec3 uvw){\n\n // setup oklab color\n float theta = 2.*3.141592653589793*uvw.x;\n \n float L = 0.8;\n float chroma = 0.1;\n \n //if (max(iMouse.x, iMouse.y) > 0.05 * iResolution.y) {\n L = uvw.y;//iMouse.x / iResolution.x;\n chroma = uvw.z * max_chroma;// / iResolution.y;\n //}\n \n float a = chroma*cos(theta);\n float b = chroma*sin(theta);\n \n vec3 lab = vec3(L, a, b);\n\treturn lab;\n\n // convert to rgb \n // vec3 rgb = linear_srgb_from_oklab(lab);\n\n}\n\n// /geo1/MAT/pointsBuilder1/disk1\nfloat disk_feather(float dist, float radius, float feather){\n\tif(feather <= 0.0){\n\t\tif(dist < radius){return 1.0;}else{return 0.0;}\n\t} else {\n\t\tfloat half_feather = feather * 0.5;\n\t\tif(dist < (radius - half_feather)){\n\t\t\treturn 1.0;\n\t\t} else {\n\t\t\tif(dist > (radius + half_feather)){\n\t\t\t\treturn 0.0;\n\t\t\t} else {\n\t\t\t\tfloat feather_start = (radius - half_feather);\n\t\t\t\tfloat blend = 1.0 - (dist - feather_start) / feather;\n\t\t\t\treturn blend;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfloat disk2d(vec2 pos, vec2 center, float radius, float feather){\n\tfloat dist = distance(pos, center);\n\treturn disk_feather(dist, radius, feather);\n}\n\n// function could be called sphere, but is an overload of disk, and is the same\nfloat disk3d(vec3 pos, vec3 center, float radius, float feather){\n\tfloat dist = distance(pos, center);\n\treturn disk_feather(dist, radius, feather);\n}\n\n\n\n\n\n\n\n// /geo1/MAT/pointsBuilder1/globals1\nuniform float time;\n\n// /geo1/MAT/pointsBuilder1/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n\n\n\n\n\n#if DEPTH_PACKING == 3200\n\n\tuniform float opacity;\n\n#endif\n\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tdiffuseColor.a = opacity;\n\n\t#endif\n\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\n\t// INSERT BODY\n\n\n\n\t// /geo1/MAT/pointsBuilder1/globals1\n\tvec2 v_POLY_globals1_gl_PointCoord = gl_PointCoord;\n\tfloat v_POLY_globals1_time = time;\n\t\n\t// /geo1/MAT/pointsBuilder1/laserColor1\n\tvec3 v_POLY_laserColor1_baseColor = vec3(0.0, 0.0, 0.0);\n\tif(true){\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/constant2\n\t\tvec3 v_POLY_laserColor1_constant2_val = vec3(0.6653872982754769, 0.5583403896257968, 0.005181516700061659);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/constant1\n\t\tvec3 v_POLY_laserColor1_constant1_val = vec3(0.7011018919268015, 0.018500220124016656, 0.005181516700061659);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/attribute1\n\t\tfloat v_POLY_laserColor1_attribute1_val = v_POLY_attribute_id;\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/rgbToOklab1\n\t\tvec3 v_POLY_laserColor1_rgbToOklab1_oklab = oklab_from_linear_srgb(v_POLY_laserColor1_constant2_val);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/rgbToOklab2\n\t\tvec3 v_POLY_laserColor1_rgbToOklab2_oklab = oklab_from_linear_srgb(v_POLY_laserColor1_constant1_val);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/round1\n\t\tfloat v_POLY_laserColor1_round1_val = sign(v_POLY_laserColor1_attribute1_val)*floor(abs(v_POLY_laserColor1_attribute1_val)+0.5);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/floatToVec2_1\n\t\tvec2 v_POLY_laserColor1_floatToVec2_1_vec2 = vec2(v_POLY_laserColor1_round1_val, 0.54);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/random1\n\t\tfloat v_POLY_laserColor1_random1_rand = rand(v_POLY_laserColor1_floatToVec2_1_vec2);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/pow1\n\t\tfloat v_POLY_laserColor1_pow1_val = pow(v_POLY_laserColor1_random1_rand, 0.27);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/mix1\n\t\tvec3 v_POLY_laserColor1_mix1_mix = mix(v_POLY_laserColor1_rgbToOklab1_oklab, v_POLY_laserColor1_rgbToOklab2_oklab, v_POLY_laserColor1_pow1_val);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/oklabToRgb1\n\t\tvec3 v_POLY_laserColor1_oklabToRgb1_rgb = linear_srgb_from_oklab(v_POLY_laserColor1_mix1_mix);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/subnetOutput1\n\t\tv_POLY_laserColor1_baseColor = v_POLY_laserColor1_oklabToRgb1_rgb;\n\t}\n\t\n\t// /geo1/MAT/pointsBuilder1/disk1\n\tfloat v_POLY_disk1_float = disk2d(v_POLY_globals1_gl_PointCoord, vec2(0.5, 0.5), 0.2, 0.24);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd6\n\tfloat v_POLY_multAdd6_val = (0.33*(v_POLY_disk1_float + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/output1\n\tdiffuseColor.xyz = v_POLY_laserColor1_baseColor;\n\tdiffuseColor.a = v_POLY_multAdd6_val;\n\n\n\n\t// the new body lines should be added before the alphatest_fragment\n\t// so that alpha is set before (which is really how it would be set if the alphamap_fragment above was used by the material node parameters)\n\n\t#include <alphatest_fragment>\n\n\t#include <logdepthbuf_fragment>\n\n\n\t// Higher precision equivalent of gl_FragCoord.z. This assumes depthRange has been left to its default values.\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), diffuseColor.a );\n\n\t#elif DEPTH_PACKING == 3201\n\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\n\t#endif\n\n}\n","customDepthMaterial.vertex":"\nuniform float size;\nuniform float scale;\n#include <common>\n#include <clipping_planes_pars_vertex>\nvarying float vViewZDepth;\n\n// INSERT DEFINES\n\n\n\n// /geo1/MAT/pointsBuilder1/fit1\n//\n//\n// FIT\n//\n//\nfloat fit(float val, float srcMin, float srcMax, float destMin, float destMax){\n\tfloat src_range = srcMax - srcMin;\n\tfloat dest_range = destMax - destMin;\n\n\tfloat r = (val - srcMin) / src_range;\n\treturn (r * dest_range) + destMin;\n}\nvec2 fit(vec2 val, vec2 srcMin, vec2 srcMax, vec2 destMin, vec2 destMax){\n\treturn vec2(\n\t\tfit(val.x, srcMin.x, srcMax.x, destMin.x, destMax.x),\n\t\tfit(val.y, srcMin.y, srcMax.y, destMin.y, destMax.y)\n\t);\n}\nvec3 fit(vec3 val, vec3 srcMin, vec3 srcMax, vec3 destMin, vec3 destMax){\n\treturn vec3(\n\t\tfit(val.x, srcMin.x, srcMax.x, destMin.x, destMax.x),\n\t\tfit(val.y, srcMin.y, srcMax.y, destMin.y, destMax.y),\n\t\tfit(val.z, srcMin.z, srcMax.z, destMin.z, destMax.z)\n\t);\n}\nvec4 fit(vec4 val, vec4 srcMin, vec4 srcMax, vec4 destMin, vec4 destMax){\n\treturn vec4(\n\t\tfit(val.x, srcMin.x, srcMax.x, destMin.x, destMax.x),\n\t\tfit(val.y, srcMin.y, srcMax.y, destMin.y, destMax.y),\n\t\tfit(val.z, srcMin.z, srcMax.z, destMin.z, destMax.z),\n\t\tfit(val.w, srcMin.w, srcMax.w, destMin.w, destMax.w)\n\t);\n}\n\n//\n//\n// FIT TO 01\n// fits the range [srcMin, srcMax] to [0, 1]\n//\nfloat fitTo01(float val, float srcMin, float srcMax){\n\tfloat size = srcMax - srcMin;\n\treturn (val - srcMin) / size;\n}\nvec2 fitTo01(vec2 val, vec2 srcMin, vec2 srcMax){\n\treturn vec2(\n\t\tfitTo01(val.x, srcMin.x, srcMax.x),\n\t\tfitTo01(val.y, srcMin.y, srcMax.y)\n\t);\n}\nvec3 fitTo01(vec3 val, vec3 srcMin, vec3 srcMax){\n\treturn vec3(\n\t\tfitTo01(val.x, srcMin.x, srcMax.x),\n\t\tfitTo01(val.y, srcMin.y, srcMax.y),\n\t\tfitTo01(val.z, srcMin.z, srcMax.z)\n\t);\n}\nvec4 fitTo01(vec4 val, vec4 srcMin, vec4 srcMax){\n\treturn vec4(\n\t\tfitTo01(val.x, srcMin.x, srcMax.x),\n\t\tfitTo01(val.y, srcMin.y, srcMax.y),\n\t\tfitTo01(val.z, srcMin.z, srcMax.z),\n\t\tfitTo01(val.w, srcMin.w, srcMax.w)\n\t);\n}\n\n//\n//\n// FIT FROM 01\n// fits the range [0, 1] to [destMin, destMax]\n//\nfloat fitFrom01(float val, float destMin, float destMax){\n\treturn fit(val, 0.0, 1.0, destMin, destMax);\n}\nvec2 fitFrom01(vec2 val, vec2 srcMin, vec2 srcMax){\n\treturn vec2(\n\t\tfitFrom01(val.x, srcMin.x, srcMax.x),\n\t\tfitFrom01(val.y, srcMin.y, srcMax.y)\n\t);\n}\nvec3 fitFrom01(vec3 val, vec3 srcMin, vec3 srcMax){\n\treturn vec3(\n\t\tfitFrom01(val.x, srcMin.x, srcMax.x),\n\t\tfitFrom01(val.y, srcMin.y, srcMax.y),\n\t\tfitFrom01(val.z, srcMin.z, srcMax.z)\n\t);\n}\nvec4 fitFrom01(vec4 val, vec4 srcMin, vec4 srcMax){\n\treturn vec4(\n\t\tfitFrom01(val.x, srcMin.x, srcMax.x),\n\t\tfitFrom01(val.y, srcMin.y, srcMax.y),\n\t\tfitFrom01(val.z, srcMin.z, srcMax.z),\n\t\tfitFrom01(val.w, srcMin.w, srcMax.w)\n\t);\n}\n\n//\n//\n// FIT FROM 01 TO VARIANCE\n// fits the range [0, 1] to [center - variance, center + variance]\n//\nfloat fitFrom01ToVariance(float val, float center, float variance){\n\treturn fitFrom01(val, center - variance, center + variance);\n}\nvec2 fitFrom01ToVariance(vec2 val, vec2 center, vec2 variance){\n\treturn vec2(\n\t\tfitFrom01ToVariance(val.x, center.x, variance.x),\n\t\tfitFrom01ToVariance(val.y, center.y, variance.y)\n\t);\n}\nvec3 fitFrom01ToVariance(vec3 val, vec3 center, vec3 variance){\n\treturn vec3(\n\t\tfitFrom01ToVariance(val.x, center.x, variance.x),\n\t\tfitFrom01ToVariance(val.y, center.y, variance.y),\n\t\tfitFrom01ToVariance(val.z, center.z, variance.z)\n\t);\n}\nvec4 fitFrom01ToVariance(vec4 val, vec4 center, vec4 variance){\n\treturn vec4(\n\t\tfitFrom01ToVariance(val.x, center.x, variance.x),\n\t\tfitFrom01ToVariance(val.y, center.y, variance.y),\n\t\tfitFrom01ToVariance(val.z, center.z, variance.z),\n\t\tfitFrom01ToVariance(val.w, center.w, variance.w)\n\t);\n}\n\n\n\n\n\n\n\n// /geo1/MAT/pointsBuilder1/globals1\nuniform float time;\n\n// /geo1/MAT/pointsBuilder1/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n// /geo1/MAT/pointsBuilder1/attribute1\nattribute float id;\n\n\n\n\n\n\n// vHighPrecisionZW is added to match CustomMeshDepth.frag\n// which is itself taken from threejs\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t// INSERT BODY\n\n\n\n\t// /geo1/MAT/pointsBuilder1/attribute1\n\tfloat v_POLY_attribute1_val = id;\n\t\n\t// /geo1/MAT/pointsBuilder1/globals1\n\tfloat v_POLY_globals1_time = time;\n\t\n\t// /geo1/MAT/pointsBuilder1/constant1\n\tfloat v_POLY_constant1_val = 0.03;\n\t\n\t// /geo1/MAT/pointsBuilder1/laserColor1\n\tfloat v_POLY_laserColor1_attribute1_val = id;\n\tv_POLY_attribute_id = float(id);\n\t\n\t// /geo1/MAT/pointsBuilder1/round1\n\tfloat v_POLY_round1_val = sign(v_POLY_attribute1_val)*floor(abs(v_POLY_attribute1_val)+0.5);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd1\n\tfloat v_POLY_multAdd1_val = (6.0*(v_POLY_globals1_time + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/floatToVec2_1\n\tvec2 v_POLY_floatToVec2_1_vec2 = vec2(v_POLY_round1_val, 0.54);\n\t\n\t// /geo1/MAT/pointsBuilder1/random1\n\tfloat v_POLY_random1_rand = rand(v_POLY_floatToVec2_1_vec2);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd5\n\tfloat v_POLY_multAdd5_val = (4.4*(v_POLY_random1_rand + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd2\n\tfloat v_POLY_multAdd2_val = (1.0*(v_POLY_multAdd5_val + v_POLY_multAdd1_val)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/cos1\n\tfloat v_POLY_cos1_val = cos(v_POLY_multAdd2_val);\n\t\n\t// /geo1/MAT/pointsBuilder1/fit1\n\tfloat v_POLY_fit1_val = fit(v_POLY_cos1_val, -1.0, 1.0, 0.22, 1.0);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd4\n\tfloat v_POLY_multAdd4_val = (v_POLY_constant1_val*(v_POLY_fit1_val + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/output1\n\tvec3 transformed = position;\n\tvec3 objectNormal = normal;\n\t#ifdef USE_TANGENT\n\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t#endif\n\tgl_PointSize = v_POLY_multAdd4_val * size * 10.0;\n\n\n\n\n\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\tvViewZDepth = - mvPosition.z;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\n\tvHighPrecisionZW = gl_Position.zw;\n\n}\n","customDepthMaterial.fragment":"\n// INSERT DEFINES\n\n\n\n// /geo1/MAT/pointsBuilder1/laserColor1/rgbToOklab1\n//////////////////////////////////////////////////////////////////////\n//\n// Visualizing Björn Ottosson's \"oklab\" colorspace\n//\n// shadertoy implementation by mattz\n//\n// license CC0 (public domain)\n// https://creativecommons.org/share-your-work/public-domain/cc0/\n//\n// Click and drag to set lightness (mouse x) and chroma (mouse y).\n// Hue varies linearly across the image from left to right.\n//\n// While mouse is down, plotted curves show oklab components\n// L (red), a (green), and b (blue). \n//\n// To test the inverse mapping, the plotted curves are generated\n// by mapping the (pre-clipping) linear RGB color back to oklab \n// space.\n//\n// White bars on top of the image (and black bars on the bottom of\n// the image) indicate clipping when one or more of the R, G, B \n// components are greater than 1.0 (or less than 0.0 respectively).\n//\n// The color accompanying the black/white bar shows which channels\n// are out of gamut.\n//\n// Click in the bottom left to reset the view.\n//\n// Hit the 'G' key to toggle displaying a gamut test:\n//\n// * black pixels indicate that RGB values for some hues\n// were clipped to 0 at the given lightness/chroma pair.\n//\n// * white pixels indicate that RGB values for some hues\n// were clipped to 1 at the given lightness/chroma pair\n//\n// * gray pixels indicate that both types of clipping happened\n//\n// Hit the 'U' key to display a uniform sampling of linear sRGB \n// space, converted into oklab lightness (x position) and chroma\n// (y position) coordinates. If you mouse over a colored dot, the\n// spectrum on screen should include that exact color.\n//\n//////////////////////////////////////////////////////////////////////\n\n//////////////////////////////////////////////////////////////////////\n// sRGB color transform and inverse from \n// https://bottosson.github.io/posts/colorwrong/#what-can-we-do%3F\n\nvec3 srgb_from_linear_srgb(vec3 x) {\n\n vec3 xlo = 12.92*x;\n vec3 xhi = 1.055 * pow(x, vec3(0.4166666666666667)) - 0.055;\n \n return mix(xlo, xhi, step(vec3(0.0031308), x));\n\n}\n\nvec3 linear_srgb_from_srgb(vec3 x) {\n\n vec3 xlo = x / 12.92;\n vec3 xhi = pow((x + 0.055)/(1.055), vec3(2.4));\n \n return mix(xlo, xhi, step(vec3(0.04045), x));\n\n}\n\n//////////////////////////////////////////////////////////////////////\n// oklab transform and inverse from\n// https://bottosson.github.io/posts/oklab/\n\n\nconst mat3 fwdA = mat3(1.0, 1.0, 1.0,\n 0.3963377774, -0.1055613458, -0.0894841775,\n 0.2158037573, -0.0638541728, -1.2914855480);\n \nconst mat3 fwdB = mat3(4.0767245293, -1.2681437731, -0.0041119885,\n -3.3072168827, 2.6093323231, -0.7034763098,\n 0.2307590544, -0.3411344290, 1.7068625689);\n\nconst mat3 invB = mat3(0.4121656120, 0.2118591070, 0.0883097947,\n 0.5362752080, 0.6807189584, 0.2818474174,\n 0.0514575653, 0.1074065790, 0.6302613616);\n \nconst mat3 invA = mat3(0.2104542553, 1.9779984951, 0.0259040371,\n 0.7936177850, -2.4285922050, 0.7827717662,\n -0.0040720468, 0.4505937099, -0.8086757660);\n\nvec3 oklab_from_linear_srgb(vec3 c) {\n\n vec3 lms = invB * c;\n \n return invA * (sign(lms)*pow(abs(lms), vec3(0.3333333333333)));\n \n}\n\nvec3 linear_srgb_from_oklab(vec3 c) {\n\n vec3 lms = fwdA * c;\n \n return fwdB * (lms * lms * lms);\n \n}\n\n\n// https://www.shadertoy.com/view/WtccD7\nconst float max_chroma = 0.33;\nvec3 uvToOklab(vec3 uvw){\n\n // setup oklab color\n float theta = 2.*3.141592653589793*uvw.x;\n \n float L = 0.8;\n float chroma = 0.1;\n \n //if (max(iMouse.x, iMouse.y) > 0.05 * iResolution.y) {\n L = uvw.y;//iMouse.x / iResolution.x;\n chroma = uvw.z * max_chroma;// / iResolution.y;\n //}\n \n float a = chroma*cos(theta);\n float b = chroma*sin(theta);\n \n vec3 lab = vec3(L, a, b);\n\treturn lab;\n\n // convert to rgb \n // vec3 rgb = linear_srgb_from_oklab(lab);\n\n}\n\n// /geo1/MAT/pointsBuilder1/disk1\nfloat disk_feather(float dist, float radius, float feather){\n\tif(feather <= 0.0){\n\t\tif(dist < radius){return 1.0;}else{return 0.0;}\n\t} else {\n\t\tfloat half_feather = feather * 0.5;\n\t\tif(dist < (radius - half_feather)){\n\t\t\treturn 1.0;\n\t\t} else {\n\t\t\tif(dist > (radius + half_feather)){\n\t\t\t\treturn 0.0;\n\t\t\t} else {\n\t\t\t\tfloat feather_start = (radius - half_feather);\n\t\t\t\tfloat blend = 1.0 - (dist - feather_start) / feather;\n\t\t\t\treturn blend;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfloat disk2d(vec2 pos, vec2 center, float radius, float feather){\n\tfloat dist = distance(pos, center);\n\treturn disk_feather(dist, radius, feather);\n}\n\n// function could be called sphere, but is an overload of disk, and is the same\nfloat disk3d(vec3 pos, vec3 center, float radius, float feather){\n\tfloat dist = distance(pos, center);\n\treturn disk_feather(dist, radius, feather);\n}\n\n\n\n\n\n\n\n// /geo1/MAT/pointsBuilder1/globals1\nuniform float time;\n\n// /geo1/MAT/pointsBuilder1/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n\n\n\n\n\n#if DEPTH_PACKING == 3200\n\n\tuniform float opacity;\n\n#endif\n\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tdiffuseColor.a = opacity;\n\n\t#endif\n\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\n\t// INSERT BODY\n\n\n\n\t// /geo1/MAT/pointsBuilder1/globals1\n\tvec2 v_POLY_globals1_gl_PointCoord = gl_PointCoord;\n\tfloat v_POLY_globals1_time = time;\n\t\n\t// /geo1/MAT/pointsBuilder1/laserColor1\n\tvec3 v_POLY_laserColor1_baseColor = vec3(0.0, 0.0, 0.0);\n\tif(true){\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/constant2\n\t\tvec3 v_POLY_laserColor1_constant2_val = vec3(0.6653872982754769, 0.5583403896257968, 0.005181516700061659);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/constant1\n\t\tvec3 v_POLY_laserColor1_constant1_val = vec3(0.7011018919268015, 0.018500220124016656, 0.005181516700061659);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/attribute1\n\t\tfloat v_POLY_laserColor1_attribute1_val = v_POLY_attribute_id;\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/rgbToOklab1\n\t\tvec3 v_POLY_laserColor1_rgbToOklab1_oklab = oklab_from_linear_srgb(v_POLY_laserColor1_constant2_val);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/rgbToOklab2\n\t\tvec3 v_POLY_laserColor1_rgbToOklab2_oklab = oklab_from_linear_srgb(v_POLY_laserColor1_constant1_val);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/round1\n\t\tfloat v_POLY_laserColor1_round1_val = sign(v_POLY_laserColor1_attribute1_val)*floor(abs(v_POLY_laserColor1_attribute1_val)+0.5);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/floatToVec2_1\n\t\tvec2 v_POLY_laserColor1_floatToVec2_1_vec2 = vec2(v_POLY_laserColor1_round1_val, 0.54);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/random1\n\t\tfloat v_POLY_laserColor1_random1_rand = rand(v_POLY_laserColor1_floatToVec2_1_vec2);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/pow1\n\t\tfloat v_POLY_laserColor1_pow1_val = pow(v_POLY_laserColor1_random1_rand, 0.27);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/mix1\n\t\tvec3 v_POLY_laserColor1_mix1_mix = mix(v_POLY_laserColor1_rgbToOklab1_oklab, v_POLY_laserColor1_rgbToOklab2_oklab, v_POLY_laserColor1_pow1_val);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/oklabToRgb1\n\t\tvec3 v_POLY_laserColor1_oklabToRgb1_rgb = linear_srgb_from_oklab(v_POLY_laserColor1_mix1_mix);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/subnetOutput1\n\t\tv_POLY_laserColor1_baseColor = v_POLY_laserColor1_oklabToRgb1_rgb;\n\t}\n\t\n\t// /geo1/MAT/pointsBuilder1/disk1\n\tfloat v_POLY_disk1_float = disk2d(v_POLY_globals1_gl_PointCoord, vec2(0.5, 0.5), 0.2, 0.24);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd6\n\tfloat v_POLY_multAdd6_val = (0.33*(v_POLY_disk1_float + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/output1\n\tdiffuseColor.xyz = v_POLY_laserColor1_baseColor;\n\tdiffuseColor.a = v_POLY_multAdd6_val;\n\n\n\n\t// the new body lines should be added before the alphatest_fragment\n\t// so that alpha is set before (which is really how it would be set if the alphamap_fragment above was used by the material node parameters)\n\n\t#include <alphatest_fragment>\n\n\t#include <logdepthbuf_fragment>\n\n\n\t// Higher precision equivalent of gl_FragCoord.z. This assumes depthRange has been left to its default values.\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), diffuseColor.a );\n\n\t#elif DEPTH_PACKING == 3201\n\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\n\t#endif\n\n}\n","customDepthDOFMaterial.vertex":"\nuniform float size;\nuniform float scale;\n#include <common>\n\nvarying float vViewZDepth;\n\n// INSERT DEFINES\n\n\n\n// /geo1/MAT/pointsBuilder1/fit1\n//\n//\n// FIT\n//\n//\nfloat fit(float val, float srcMin, float srcMax, float destMin, float destMax){\n\tfloat src_range = srcMax - srcMin;\n\tfloat dest_range = destMax - destMin;\n\n\tfloat r = (val - srcMin) / src_range;\n\treturn (r * dest_range) + destMin;\n}\nvec2 fit(vec2 val, vec2 srcMin, vec2 srcMax, vec2 destMin, vec2 destMax){\n\treturn vec2(\n\t\tfit(val.x, srcMin.x, srcMax.x, destMin.x, destMax.x),\n\t\tfit(val.y, srcMin.y, srcMax.y, destMin.y, destMax.y)\n\t);\n}\nvec3 fit(vec3 val, vec3 srcMin, vec3 srcMax, vec3 destMin, vec3 destMax){\n\treturn vec3(\n\t\tfit(val.x, srcMin.x, srcMax.x, destMin.x, destMax.x),\n\t\tfit(val.y, srcMin.y, srcMax.y, destMin.y, destMax.y),\n\t\tfit(val.z, srcMin.z, srcMax.z, destMin.z, destMax.z)\n\t);\n}\nvec4 fit(vec4 val, vec4 srcMin, vec4 srcMax, vec4 destMin, vec4 destMax){\n\treturn vec4(\n\t\tfit(val.x, srcMin.x, srcMax.x, destMin.x, destMax.x),\n\t\tfit(val.y, srcMin.y, srcMax.y, destMin.y, destMax.y),\n\t\tfit(val.z, srcMin.z, srcMax.z, destMin.z, destMax.z),\n\t\tfit(val.w, srcMin.w, srcMax.w, destMin.w, destMax.w)\n\t);\n}\n\n//\n//\n// FIT TO 01\n// fits the range [srcMin, srcMax] to [0, 1]\n//\nfloat fitTo01(float val, float srcMin, float srcMax){\n\tfloat size = srcMax - srcMin;\n\treturn (val - srcMin) / size;\n}\nvec2 fitTo01(vec2 val, vec2 srcMin, vec2 srcMax){\n\treturn vec2(\n\t\tfitTo01(val.x, srcMin.x, srcMax.x),\n\t\tfitTo01(val.y, srcMin.y, srcMax.y)\n\t);\n}\nvec3 fitTo01(vec3 val, vec3 srcMin, vec3 srcMax){\n\treturn vec3(\n\t\tfitTo01(val.x, srcMin.x, srcMax.x),\n\t\tfitTo01(val.y, srcMin.y, srcMax.y),\n\t\tfitTo01(val.z, srcMin.z, srcMax.z)\n\t);\n}\nvec4 fitTo01(vec4 val, vec4 srcMin, vec4 srcMax){\n\treturn vec4(\n\t\tfitTo01(val.x, srcMin.x, srcMax.x),\n\t\tfitTo01(val.y, srcMin.y, srcMax.y),\n\t\tfitTo01(val.z, srcMin.z, srcMax.z),\n\t\tfitTo01(val.w, srcMin.w, srcMax.w)\n\t);\n}\n\n//\n//\n// FIT FROM 01\n// fits the range [0, 1] to [destMin, destMax]\n//\nfloat fitFrom01(float val, float destMin, float destMax){\n\treturn fit(val, 0.0, 1.0, destMin, destMax);\n}\nvec2 fitFrom01(vec2 val, vec2 srcMin, vec2 srcMax){\n\treturn vec2(\n\t\tfitFrom01(val.x, srcMin.x, srcMax.x),\n\t\tfitFrom01(val.y, srcMin.y, srcMax.y)\n\t);\n}\nvec3 fitFrom01(vec3 val, vec3 srcMin, vec3 srcMax){\n\treturn vec3(\n\t\tfitFrom01(val.x, srcMin.x, srcMax.x),\n\t\tfitFrom01(val.y, srcMin.y, srcMax.y),\n\t\tfitFrom01(val.z, srcMin.z, srcMax.z)\n\t);\n}\nvec4 fitFrom01(vec4 val, vec4 srcMin, vec4 srcMax){\n\treturn vec4(\n\t\tfitFrom01(val.x, srcMin.x, srcMax.x),\n\t\tfitFrom01(val.y, srcMin.y, srcMax.y),\n\t\tfitFrom01(val.z, srcMin.z, srcMax.z),\n\t\tfitFrom01(val.w, srcMin.w, srcMax.w)\n\t);\n}\n\n//\n//\n// FIT FROM 01 TO VARIANCE\n// fits the range [0, 1] to [center - variance, center + variance]\n//\nfloat fitFrom01ToVariance(float val, float center, float variance){\n\treturn fitFrom01(val, center - variance, center + variance);\n}\nvec2 fitFrom01ToVariance(vec2 val, vec2 center, vec2 variance){\n\treturn vec2(\n\t\tfitFrom01ToVariance(val.x, center.x, variance.x),\n\t\tfitFrom01ToVariance(val.y, center.y, variance.y)\n\t);\n}\nvec3 fitFrom01ToVariance(vec3 val, vec3 center, vec3 variance){\n\treturn vec3(\n\t\tfitFrom01ToVariance(val.x, center.x, variance.x),\n\t\tfitFrom01ToVariance(val.y, center.y, variance.y),\n\t\tfitFrom01ToVariance(val.z, center.z, variance.z)\n\t);\n}\nvec4 fitFrom01ToVariance(vec4 val, vec4 center, vec4 variance){\n\treturn vec4(\n\t\tfitFrom01ToVariance(val.x, center.x, variance.x),\n\t\tfitFrom01ToVariance(val.y, center.y, variance.y),\n\t\tfitFrom01ToVariance(val.z, center.z, variance.z),\n\t\tfitFrom01ToVariance(val.w, center.w, variance.w)\n\t);\n}\n\n\n\n\n\n\n\n// /geo1/MAT/pointsBuilder1/globals1\nuniform float time;\n\n// /geo1/MAT/pointsBuilder1/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n// /geo1/MAT/pointsBuilder1/attribute1\nattribute float id;\n\n\n\n\n\n\n\nvoid main() {\n\n\t// INSERT BODY\n\n\n\n\t// /geo1/MAT/pointsBuilder1/attribute1\n\tfloat v_POLY_attribute1_val = id;\n\t\n\t// /geo1/MAT/pointsBuilder1/globals1\n\tfloat v_POLY_globals1_time = time;\n\t\n\t// /geo1/MAT/pointsBuilder1/constant1\n\tfloat v_POLY_constant1_val = 0.03;\n\t\n\t// /geo1/MAT/pointsBuilder1/laserColor1\n\tfloat v_POLY_laserColor1_attribute1_val = id;\n\tv_POLY_attribute_id = float(id);\n\t\n\t// /geo1/MAT/pointsBuilder1/round1\n\tfloat v_POLY_round1_val = sign(v_POLY_attribute1_val)*floor(abs(v_POLY_attribute1_val)+0.5);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd1\n\tfloat v_POLY_multAdd1_val = (6.0*(v_POLY_globals1_time + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/floatToVec2_1\n\tvec2 v_POLY_floatToVec2_1_vec2 = vec2(v_POLY_round1_val, 0.54);\n\t\n\t// /geo1/MAT/pointsBuilder1/random1\n\tfloat v_POLY_random1_rand = rand(v_POLY_floatToVec2_1_vec2);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd5\n\tfloat v_POLY_multAdd5_val = (4.4*(v_POLY_random1_rand + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd2\n\tfloat v_POLY_multAdd2_val = (1.0*(v_POLY_multAdd5_val + v_POLY_multAdd1_val)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/cos1\n\tfloat v_POLY_cos1_val = cos(v_POLY_multAdd2_val);\n\t\n\t// /geo1/MAT/pointsBuilder1/fit1\n\tfloat v_POLY_fit1_val = fit(v_POLY_cos1_val, -1.0, 1.0, 0.22, 1.0);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd4\n\tfloat v_POLY_multAdd4_val = (v_POLY_constant1_val*(v_POLY_fit1_val + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/output1\n\tvec3 transformed = position;\n\tvec3 objectNormal = normal;\n\t#ifdef USE_TANGENT\n\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t#endif\n\tgl_PointSize = v_POLY_multAdd4_val * size * 10.0;\n\n\n\n\n\n\t#include <project_vertex>\n\n\tvViewZDepth = - mvPosition.z;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\n}\n","customDepthDOFMaterial.fragment":"\nuniform float mNear;\nuniform float mFar;\n\nvarying float vViewZDepth;\n\n// INSERT DEFINES\n\nvoid main() {\n\n\tfloat color = 1.0 - smoothstep( mNear, mFar, vViewZDepth );\n\tgl_FragColor = vec4( vec3( color ), 1.0 );\n\tvec4 diffuseColor = gl_FragColor;\n\n\t// INSERT BODY\n\n\tgl_FragColor.a = diffuseColor.a;\n}\n"},"/geo1/MAT/lineBasicBuilder_LIGHTING":{"vertex":"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/noise1\n// Modulo 289 without a division (only multiplications)\nfloat mod289(float x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\nvec2 mod289(vec2 x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\nvec3 mod289(vec3 x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\nvec4 mod289(vec4 x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n// Modulo 7 without a division\nvec3 mod7(vec3 x) {\n return x - floor(x * (1.0 / 7.0)) * 7.0;\n}\n\n// Permutation polynomial: (34x^2 + x) mod 289\nfloat permute(float x) {\n return mod289(((x*34.0)+1.0)*x);\n}\nvec3 permute(vec3 x) {\n return mod289((34.0 * x + 1.0) * x);\n}\nvec4 permute(vec4 x) {\n return mod289(((x*34.0)+1.0)*x);\n}\n\nfloat taylorInvSqrt(float r)\n{\n return 1.79284291400159 - 0.85373472095314 * r;\n}\nvec4 taylorInvSqrt(vec4 r)\n{\n return 1.79284291400159 - 0.85373472095314 * r;\n}\n\nvec2 fade(vec2 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\nvec3 fade(vec3 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\nvec4 fade(vec4 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\n//\n// Description : Array and textureless GLSL 2D/3D/4D simplex \n// noise functions.\n// Author : Ian McEwan, Ashima Arts.\n// Maintainer : stegu\n// Lastmod : 20110822 (ijm)\n// License : Copyright (C) 2011 Ashima Arts. All rights reserved.\n// Distributed under the MIT License. See LICENSE file.\n// https://github.com/ashima/webgl-noise\n// https://github.com/stegu/webgl-noise\n// \n\n\n\nfloat snoise(vec3 v)\n { \n const vec2 C = vec2(1.0/6.0, 1.0/3.0) ;\n const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);\n\n// First corner\n vec3 i = floor(v + dot(v, C.yyy) );\n vec3 x0 = v - i + dot(i, C.xxx) ;\n\n// Other corners\n vec3 g = step(x0.yzx, x0.xyz);\n vec3 l = 1.0 - g;\n vec3 i1 = min( g.xyz, l.zxy );\n vec3 i2 = max( g.xyz, l.zxy );\n\n // x0 = x0 - 0.0 + 0.0 * C.xxx;\n // x1 = x0 - i1 + 1.0 * C.xxx;\n // x2 = x0 - i2 + 2.0 * C.xxx;\n // x3 = x0 - 1.0 + 3.0 * C.xxx;\n vec3 x1 = x0 - i1 + C.xxx;\n vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y\n vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y\n\n// Permutations\n i = mod289(i); \n vec4 p = permute( permute( permute( \n i.z + vec4(0.0, i1.z, i2.z, 1.0 ))\n + i.y + vec4(0.0, i1.y, i2.y, 1.0 )) \n + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));\n\n// Gradients: 7x7 points over a square, mapped onto an octahedron.\n// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)\n float n_ = 0.142857142857; // 1.0/7.0\n vec3 ns = n_ * D.wyz - D.xzx;\n\n vec4 j = p - 49.0 * floor(p * ns.z * ns.z); // mod(p,7*7)\n\n vec4 x_ = floor(j * ns.z);\n vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N)\n\n vec4 x = x_ *ns.x + ns.yyyy;\n vec4 y = y_ *ns.x + ns.yyyy;\n vec4 h = 1.0 - abs(x) - abs(y);\n\n vec4 b0 = vec4( x.xy, y.xy );\n vec4 b1 = vec4( x.zw, y.zw );\n\n //vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0;\n //vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;\n vec4 s0 = floor(b0)*2.0 + 1.0;\n vec4 s1 = floor(b1)*2.0 + 1.0;\n vec4 sh = -step(h, vec4(0.0));\n\n vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;\n vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;\n\n vec3 p0 = vec3(a0.xy,h.x);\n vec3 p1 = vec3(a0.zw,h.y);\n vec3 p2 = vec3(a1.xy,h.z);\n vec3 p3 = vec3(a1.zw,h.w);\n\n//Normalise gradients\n vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\n p0 *= norm.x;\n p1 *= norm.y;\n p2 *= norm.z;\n p3 *= norm.w;\n\n// Mix final noise value\n vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\n m = m * m;\n return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1), \n dot(p2,x2), dot(p3,x3) ) );\n }\n\n\nfloat fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1(in vec3 st) {\n\tfloat value = 0.0;\n\tfloat amplitude = 1.0;\n\tfor (int i = 0; i < 6; i++) {\n\t\tvalue += amplitude * snoise(st);\n\t\tst *= 2.0;\n\t\tamplitude *= 0.5;\n\t}\n\treturn value;\n}\n\n\n\n\n\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/param1\nuniform vec3 v_POLY_param_destPos;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/globals2\nuniform float time;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute1\nattribute float idn;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute2\nattribute float id;\n\n\n\n\n#include <uv_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\n\n\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/constant1\n\tvec3 v_POLY_constant1_val = vec3(0.0, 0.0, 0.0);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/param1\n\tvec3 v_POLY_param1_val = v_POLY_param_destPos;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute1\n\tfloat v_POLY_attribute1_val = idn;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute2\n\tfloat v_POLY_attribute2_val = id;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/globals2\n\tfloat v_POLY_globals2_time = time;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1\n\tfloat v_POLY_laserColor1_attribute1_val = id;\n\tv_POLY_attribute_id = float(id);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/mix1\n\tvec3 v_POLY_mix1_mix = mix(v_POLY_constant1_val, v_POLY_param1_val, v_POLY_attribute1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/smoothstep1\n\tfloat v_POLY_smoothstep1_val = smoothstep(0.0, 0.1, v_POLY_attribute1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/smoothstep2\n\tfloat v_POLY_smoothstep2_val = smoothstep(1.0, 0.83, v_POLY_attribute1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multAdd3\n\tfloat v_POLY_multAdd3_val = (-1.0*(v_POLY_globals2_time + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multAdd1\n\tfloat v_POLY_multAdd1_val = (0.79*(v_POLY_globals2_time + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/min1\n\tfloat v_POLY_min1_val = min(v_POLY_smoothstep1_val, v_POLY_smoothstep2_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multAdd2\n\tfloat v_POLY_multAdd2_val = (1.0*(v_POLY_attribute1_val + 0.0)) + v_POLY_multAdd3_val;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/floatToVec3_2\n\tvec3 v_POLY_floatToVec3_2_vec3 = vec3(0.0, v_POLY_multAdd1_val, 0.21);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/floatToVec3_1\n\tvec3 v_POLY_floatToVec3_1_vec3 = vec3(v_POLY_min1_val, v_POLY_min1_val, v_POLY_min1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/floatToVec3_3\n\tvec3 v_POLY_floatToVec3_3_vec3 = vec3(0.0, v_POLY_attribute2_val, v_POLY_multAdd2_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multScalar1\n\tvec3 v_POLY_multScalar1_val = (0.42*v_POLY_floatToVec3_1_vec3);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/noise1\n\tfloat v_POLY_noise1_noisex = (v_POLY_multScalar1_val*fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1((v_POLY_floatToVec3_3_vec3*vec3(1.0, 1.0, 1.0))+(v_POLY_floatToVec3_2_vec3+vec3(0.0, 0.0, 0.0)))).x;\n\tfloat v_POLY_noise1_noisey = (v_POLY_multScalar1_val*fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1((v_POLY_floatToVec3_3_vec3*vec3(1.0, 1.0, 1.0))+(v_POLY_floatToVec3_2_vec3+vec3(1000.0, 1000.0, 1000.0)))).y;\n\tfloat v_POLY_noise1_noisez = (v_POLY_multScalar1_val*fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1((v_POLY_floatToVec3_3_vec3*vec3(1.0, 1.0, 1.0))+(v_POLY_floatToVec3_2_vec3+vec3(2000.0, 2000.0, 2000.0)))).z;\n\tvec3 v_POLY_noise1_noise = vec3(v_POLY_noise1_noisex, v_POLY_noise1_noisey, v_POLY_noise1_noisez);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/add1\n\tvec3 v_POLY_add1_sum = (v_POLY_mix1_mix + v_POLY_noise1_noise + vec3(0.0, 0.0, 0.0));\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/max1\n\tvec3 v_POLY_max1_val = max(v_POLY_add1_sum, vec3(-1000.0, 0.0, -1000.0));\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/output1\n\tvec3 transformed = v_POLY_max1_val;vec4 mvPosition = vec4( transformed, 1.0 ); gl_Position = projectionMatrix * modelViewMatrix * mvPosition;\n\n\n\n\t#include <morphcolor_vertex>\n// removed:\n//\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n// removed:\n//\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}","fragment":"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/rgbToOklab1\n//////////////////////////////////////////////////////////////////////\n//\n// Visualizing Björn Ottosson's \"oklab\" colorspace\n//\n// shadertoy implementation by mattz\n//\n// license CC0 (public domain)\n// https://creativecommons.org/share-your-work/public-domain/cc0/\n//\n// Click and drag to set lightness (mouse x) and chroma (mouse y).\n// Hue varies linearly across the image from left to right.\n//\n// While mouse is down, plotted curves show oklab components\n// L (red), a (green), and b (blue). \n//\n// To test the inverse mapping, the plotted curves are generated\n// by mapping the (pre-clipping) linear RGB color back to oklab \n// space.\n//\n// White bars on top of the image (and black bars on the bottom of\n// the image) indicate clipping when one or more of the R, G, B \n// components are greater than 1.0 (or less than 0.0 respectively).\n//\n// The color accompanying the black/white bar shows which channels\n// are out of gamut.\n//\n// Click in the bottom left to reset the view.\n//\n// Hit the 'G' key to toggle displaying a gamut test:\n//\n// * black pixels indicate that RGB values for some hues\n// were clipped to 0 at the given lightness/chroma pair.\n//\n// * white pixels indicate that RGB values for some hues\n// were clipped to 1 at the given lightness/chroma pair\n//\n// * gray pixels indicate that both types of clipping happened\n//\n// Hit the 'U' key to display a uniform sampling of linear sRGB \n// space, converted into oklab lightness (x position) and chroma\n// (y position) coordinates. If you mouse over a colored dot, the\n// spectrum on screen should include that exact color.\n//\n//////////////////////////////////////////////////////////////////////\n\n//////////////////////////////////////////////////////////////////////\n// sRGB color transform and inverse from \n// https://bottosson.github.io/posts/colorwrong/#what-can-we-do%3F\n\nvec3 srgb_from_linear_srgb(vec3 x) {\n\n vec3 xlo = 12.92*x;\n vec3 xhi = 1.055 * pow(x, vec3(0.4166666666666667)) - 0.055;\n \n return mix(xlo, xhi, step(vec3(0.0031308), x));\n\n}\n\nvec3 linear_srgb_from_srgb(vec3 x) {\n\n vec3 xlo = x / 12.92;\n vec3 xhi = pow((x + 0.055)/(1.055), vec3(2.4));\n \n return mix(xlo, xhi, step(vec3(0.04045), x));\n\n}\n\n//////////////////////////////////////////////////////////////////////\n// oklab transform and inverse from\n// https://bottosson.github.io/posts/oklab/\n\n\nconst mat3 fwdA = mat3(1.0, 1.0, 1.0,\n 0.3963377774, -0.1055613458, -0.0894841775,\n 0.2158037573, -0.0638541728, -1.2914855480);\n \nconst mat3 fwdB = mat3(4.0767245293, -1.2681437731, -0.0041119885,\n -3.3072168827, 2.6093323231, -0.7034763098,\n 0.2307590544, -0.3411344290, 1.7068625689);\n\nconst mat3 invB = mat3(0.4121656120, 0.2118591070, 0.0883097947,\n 0.5362752080, 0.6807189584, 0.2818474174,\n 0.0514575653, 0.1074065790, 0.6302613616);\n \nconst mat3 invA = mat3(0.2104542553, 1.9779984951, 0.0259040371,\n 0.7936177850, -2.4285922050, 0.7827717662,\n -0.0040720468, 0.4505937099, -0.8086757660);\n\nvec3 oklab_from_linear_srgb(vec3 c) {\n\n vec3 lms = invB * c;\n \n return invA * (sign(lms)*pow(abs(lms), vec3(0.3333333333333)));\n \n}\n\nvec3 linear_srgb_from_oklab(vec3 c) {\n\n vec3 lms = fwdA * c;\n \n return fwdB * (lms * lms * lms);\n \n}\n\n\n// https://www.shadertoy.com/view/WtccD7\nconst float max_chroma = 0.33;\nvec3 uvToOklab(vec3 uvw){\n\n // setup oklab color\n float theta = 2.*3.141592653589793*uvw.x;\n \n float L = 0.8;\n float chroma = 0.1;\n \n //if (max(iMouse.x, iMouse.y) > 0.05 * iResolution.y) {\n L = uvw.y;//iMouse.x / iResolution.x;\n chroma = uvw.z * max_chroma;// / iResolution.y;\n //}\n \n float a = chroma*cos(theta);\n float b = chroma*sin(theta);\n \n vec3 lab = vec3(L, a, b);\n\treturn lab;\n\n // convert to rgb \n // vec3 rgb = linear_srgb_from_oklab(lab);\n\n}\n\n\n\n\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n\n\n\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\n\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1\n\tvec3 v_POLY_laserColor1_baseColor = vec3(0.0, 0.0, 0.0);\n\tif(true){\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/constant2\n\t\tvec3 v_POLY_laserColor1_constant2_val = vec3(0.6653872982754769, 0.5583403896257968, 0.005181516700061659);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/constant1\n\t\tvec3 v_POLY_laserColor1_constant1_val = vec3(0.7011018919268015, 0.018500220124016656, 0.005181516700061659);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/attribute1\n\t\tfloat v_POLY_laserColor1_attribute1_val = v_POLY_attribute_id;\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/rgbToOklab1\n\t\tvec3 v_POLY_laserColor1_rgbToOklab1_oklab = oklab_from_linear_srgb(v_POLY_laserColor1_constant2_val);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/rgbToOklab2\n\t\tvec3 v_POLY_laserColor1_rgbToOklab2_oklab = oklab_from_linear_srgb(v_POLY_laserColor1_constant1_val);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/round1\n\t\tfloat v_POLY_laserColor1_round1_val = sign(v_POLY_laserColor1_attribute1_val)*floor(abs(v_POLY_laserColor1_attribute1_val)+0.5);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/floatToVec2_1\n\t\tvec2 v_POLY_laserColor1_floatToVec2_1_vec2 = vec2(v_POLY_laserColor1_round1_val, 0.54);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/random1\n\t\tfloat v_POLY_laserColor1_random1_rand = rand(v_POLY_laserColor1_floatToVec2_1_vec2);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/pow1\n\t\tfloat v_POLY_laserColor1_pow1_val = pow(v_POLY_laserColor1_random1_rand, 0.27);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/mix1\n\t\tvec3 v_POLY_laserColor1_mix1_mix = mix(v_POLY_laserColor1_rgbToOklab1_oklab, v_POLY_laserColor1_rgbToOklab2_oklab, v_POLY_laserColor1_pow1_val);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/oklabToRgb1\n\t\tvec3 v_POLY_laserColor1_oklabToRgb1_rgb = linear_srgb_from_oklab(v_POLY_laserColor1_mix1_mix);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/subnetOutput1\n\t\tv_POLY_laserColor1_baseColor = v_POLY_laserColor1_oklabToRgb1_rgb;\n\t}\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/constant3\n\tfloat v_POLY_constant3_val = 0.86;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multScalar2\n\tvec3 v_POLY_multScalar2_val = (12.0*v_POLY_laserColor1_baseColor);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/output1\n\tdiffuseColor.xyz = v_POLY_multScalar2_val;\n\tdiffuseColor.w = v_POLY_constant3_val;\n\n\n\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}","customDistanceMaterial.vertex":"\nuniform float scale;\nattribute float lineDistance;\n\nvarying float vLineDistance;\n\n#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\n// INSERT DEFINES\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/noise1\n// Modulo 289 without a division (only multiplications)\nfloat mod289(float x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\nvec2 mod289(vec2 x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\nvec3 mod289(vec3 x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\nvec4 mod289(vec4 x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n// Modulo 7 without a division\nvec3 mod7(vec3 x) {\n return x - floor(x * (1.0 / 7.0)) * 7.0;\n}\n\n// Permutation polynomial: (34x^2 + x) mod 289\nfloat permute(float x) {\n return mod289(((x*34.0)+1.0)*x);\n}\nvec3 permute(vec3 x) {\n return mod289((34.0 * x + 1.0) * x);\n}\nvec4 permute(vec4 x) {\n return mod289(((x*34.0)+1.0)*x);\n}\n\nfloat taylorInvSqrt(float r)\n{\n return 1.79284291400159 - 0.85373472095314 * r;\n}\nvec4 taylorInvSqrt(vec4 r)\n{\n return 1.79284291400159 - 0.85373472095314 * r;\n}\n\nvec2 fade(vec2 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\nvec3 fade(vec3 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\nvec4 fade(vec4 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\n//\n// Description : Array and textureless GLSL 2D/3D/4D simplex \n// noise functions.\n// Author : Ian McEwan, Ashima Arts.\n// Maintainer : stegu\n// Lastmod : 20110822 (ijm)\n// License : Copyright (C) 2011 Ashima Arts. All rights reserved.\n// Distributed under the MIT License. See LICENSE file.\n// https://github.com/ashima/webgl-noise\n// https://github.com/stegu/webgl-noise\n// \n\n\n\nfloat snoise(vec3 v)\n { \n const vec2 C = vec2(1.0/6.0, 1.0/3.0) ;\n const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);\n\n// First corner\n vec3 i = floor(v + dot(v, C.yyy) );\n vec3 x0 = v - i + dot(i, C.xxx) ;\n\n// Other corners\n vec3 g = step(x0.yzx, x0.xyz);\n vec3 l = 1.0 - g;\n vec3 i1 = min( g.xyz, l.zxy );\n vec3 i2 = max( g.xyz, l.zxy );\n\n // x0 = x0 - 0.0 + 0.0 * C.xxx;\n // x1 = x0 - i1 + 1.0 * C.xxx;\n // x2 = x0 - i2 + 2.0 * C.xxx;\n // x3 = x0 - 1.0 + 3.0 * C.xxx;\n vec3 x1 = x0 - i1 + C.xxx;\n vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y\n vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y\n\n// Permutations\n i = mod289(i); \n vec4 p = permute( permute( permute( \n i.z + vec4(0.0, i1.z, i2.z, 1.0 ))\n + i.y + vec4(0.0, i1.y, i2.y, 1.0 )) \n + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));\n\n// Gradients: 7x7 points over a square, mapped onto an octahedron.\n// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)\n float n_ = 0.142857142857; // 1.0/7.0\n vec3 ns = n_ * D.wyz - D.xzx;\n\n vec4 j = p - 49.0 * floor(p * ns.z * ns.z); // mod(p,7*7)\n\n vec4 x_ = floor(j * ns.z);\n vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N)\n\n vec4 x = x_ *ns.x + ns.yyyy;\n vec4 y = y_ *ns.x + ns.yyyy;\n vec4 h = 1.0 - abs(x) - abs(y);\n\n vec4 b0 = vec4( x.xy, y.xy );\n vec4 b1 = vec4( x.zw, y.zw );\n\n //vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0;\n //vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;\n vec4 s0 = floor(b0)*2.0 + 1.0;\n vec4 s1 = floor(b1)*2.0 + 1.0;\n vec4 sh = -step(h, vec4(0.0));\n\n vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;\n vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;\n\n vec3 p0 = vec3(a0.xy,h.x);\n vec3 p1 = vec3(a0.zw,h.y);\n vec3 p2 = vec3(a1.xy,h.z);\n vec3 p3 = vec3(a1.zw,h.w);\n\n//Normalise gradients\n vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\n p0 *= norm.x;\n p1 *= norm.y;\n p2 *= norm.z;\n p3 *= norm.w;\n\n// Mix final noise value\n vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\n m = m * m;\n return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1), \n dot(p2,x2), dot(p3,x3) ) );\n }\n\n\nfloat fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1(in vec3 st) {\n\tfloat value = 0.0;\n\tfloat amplitude = 1.0;\n\tfor (int i = 0; i < 6; i++) {\n\t\tvalue += amplitude * snoise(st);\n\t\tst *= 2.0;\n\t\tamplitude *= 0.5;\n\t}\n\treturn value;\n}\n\n\n\n\n\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/param1\nuniform vec3 v_POLY_param_destPos;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/globals2\nuniform float time;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute1\nattribute float idn;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute2\nattribute float id;\n\n\n\n\n\n\n// vHighPrecisionZW is added to match CustomMeshDepth.frag\n// which is itself taken from threejs\nvarying vec2 vHighPrecisionZW;\n\n\nvoid main() {\n\n\t// INSERT BODY\n\n\n\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/constant1\n\tvec3 v_POLY_constant1_val = vec3(0.0, 0.0, 0.0);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/param1\n\tvec3 v_POLY_param1_val = v_POLY_param_destPos;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute1\n\tfloat v_POLY_attribute1_val = idn;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute2\n\tfloat v_POLY_attribute2_val = id;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/globals2\n\tfloat v_POLY_globals2_time = time;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1\n\tfloat v_POLY_laserColor1_attribute1_val = id;\n\tv_POLY_attribute_id = float(id);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/mix1\n\tvec3 v_POLY_mix1_mix = mix(v_POLY_constant1_val, v_POLY_param1_val, v_POLY_attribute1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/smoothstep1\n\tfloat v_POLY_smoothstep1_val = smoothstep(0.0, 0.1, v_POLY_attribute1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/smoothstep2\n\tfloat v_POLY_smoothstep2_val = smoothstep(1.0, 0.83, v_POLY_attribute1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multAdd3\n\tfloat v_POLY_multAdd3_val = (-1.0*(v_POLY_globals2_time + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multAdd1\n\tfloat v_POLY_multAdd1_val = (0.79*(v_POLY_globals2_time + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/min1\n\tfloat v_POLY_min1_val = min(v_POLY_smoothstep1_val, v_POLY_smoothstep2_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multAdd2\n\tfloat v_POLY_multAdd2_val = (1.0*(v_POLY_attribute1_val + 0.0)) + v_POLY_multAdd3_val;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/floatToVec3_2\n\tvec3 v_POLY_floatToVec3_2_vec3 = vec3(0.0, v_POLY_multAdd1_val, 0.21);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/floatToVec3_1\n\tvec3 v_POLY_floatToVec3_1_vec3 = vec3(v_POLY_min1_val, v_POLY_min1_val, v_POLY_min1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/floatToVec3_3\n\tvec3 v_POLY_floatToVec3_3_vec3 = vec3(0.0, v_POLY_attribute2_val, v_POLY_multAdd2_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multScalar1\n\tvec3 v_POLY_multScalar1_val = (0.42*v_POLY_floatToVec3_1_vec3);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/noise1\n\tfloat v_POLY_noise1_noisex = (v_POLY_multScalar1_val*fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1((v_POLY_floatToVec3_3_vec3*vec3(1.0, 1.0, 1.0))+(v_POLY_floatToVec3_2_vec3+vec3(0.0, 0.0, 0.0)))).x;\n\tfloat v_POLY_noise1_noisey = (v_POLY_multScalar1_val*fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1((v_POLY_floatToVec3_3_vec3*vec3(1.0, 1.0, 1.0))+(v_POLY_floatToVec3_2_vec3+vec3(1000.0, 1000.0, 1000.0)))).y;\n\tfloat v_POLY_noise1_noisez = (v_POLY_multScalar1_val*fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1((v_POLY_floatToVec3_3_vec3*vec3(1.0, 1.0, 1.0))+(v_POLY_floatToVec3_2_vec3+vec3(2000.0, 2000.0, 2000.0)))).z;\n\tvec3 v_POLY_noise1_noise = vec3(v_POLY_noise1_noisex, v_POLY_noise1_noisey, v_POLY_noise1_noisez);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/add1\n\tvec3 v_POLY_add1_sum = (v_POLY_mix1_mix + v_POLY_noise1_noise + vec3(0.0, 0.0, 0.0));\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/max1\n\tvec3 v_POLY_max1_val = max(v_POLY_add1_sum, vec3(-1000.0, 0.0, -1000.0));\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/output1\n\tvec3 transformed = v_POLY_max1_val;vec4 mvPosition = vec4( transformed, 1.0 ); gl_Position = projectionMatrix * modelViewMatrix * mvPosition;\n\n\n\n\n\n\tvLineDistance = scale * lineDistance;\n\n\t#include <color_vertex>\n// removed:\n//\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n// removed:\n//\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\n\n\tvHighPrecisionZW = gl_Position.zw;\n}\n","customDistanceMaterial.fragment":"\n// INSERT DEFINES\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/rgbToOklab1\n//////////////////////////////////////////////////////////////////////\n//\n// Visualizing Björn Ottosson's \"oklab\" colorspace\n//\n// shadertoy implementation by mattz\n//\n// license CC0 (public domain)\n// https://creativecommons.org/share-your-work/public-domain/cc0/\n//\n// Click and drag to set lightness (mouse x) and chroma (mouse y).\n// Hue varies linearly across the image from left to right.\n//\n// While mouse is down, plotted curves show oklab components\n// L (red), a (green), and b (blue). \n//\n// To test the inverse mapping, the plotted curves are generated\n// by mapping the (pre-clipping) linear RGB color back to oklab \n// space.\n//\n// White bars on top of the image (and black bars on the bottom of\n// the image) indicate clipping when one or more of the R, G, B \n// components are greater than 1.0 (or less than 0.0 respectively).\n//\n// The color accompanying the black/white bar shows which channels\n// are out of gamut.\n//\n// Click in the bottom left to reset the view.\n//\n// Hit the 'G' key to toggle displaying a gamut test:\n//\n// * black pixels indicate that RGB values for some hues\n// were clipped to 0 at the given lightness/chroma pair.\n//\n// * white pixels indicate that RGB values for some hues\n// were clipped to 1 at the given lightness/chroma pair\n//\n// * gray pixels indicate that both types of clipping happened\n//\n// Hit the 'U' key to display a uniform sampling of linear sRGB \n// space, converted into oklab lightness (x position) and chroma\n// (y position) coordinates. If you mouse over a colored dot, the\n// spectrum on screen should include that exact color.\n//\n//////////////////////////////////////////////////////////////////////\n\n//////////////////////////////////////////////////////////////////////\n// sRGB color transform and inverse from \n// https://bottosson.github.io/posts/colorwrong/#what-can-we-do%3F\n\nvec3 srgb_from_linear_srgb(vec3 x) {\n\n vec3 xlo = 12.92*x;\n vec3 xhi = 1.055 * pow(x, vec3(0.4166666666666667)) - 0.055;\n \n return mix(xlo, xhi, step(vec3(0.0031308), x));\n\n}\n\nvec3 linear_srgb_from_srgb(vec3 x) {\n\n vec3 xlo = x / 12.92;\n vec3 xhi = pow((x + 0.055)/(1.055), vec3(2.4));\n \n return mix(xlo, xhi, step(vec3(0.04045), x));\n\n}\n\n//////////////////////////////////////////////////////////////////////\n// oklab transform and inverse from\n// https://bottosson.github.io/posts/oklab/\n\n\nconst mat3 fwdA = mat3(1.0, 1.0, 1.0,\n 0.3963377774, -0.1055613458, -0.0894841775,\n 0.2158037573, -0.0638541728, -1.2914855480);\n \nconst mat3 fwdB = mat3(4.0767245293, -1.2681437731, -0.0041119885,\n -3.3072168827, 2.6093323231, -0.7034763098,\n 0.2307590544, -0.3411344290, 1.7068625689);\n\nconst mat3 invB = mat3(0.4121656120, 0.2118591070, 0.0883097947,\n 0.5362752080, 0.6807189584, 0.2818474174,\n 0.0514575653, 0.1074065790, 0.6302613616);\n \nconst mat3 invA = mat3(0.2104542553, 1.9779984951, 0.0259040371,\n 0.7936177850, -2.4285922050, 0.7827717662,\n -0.0040720468, 0.4505937099, -0.8086757660);\n\nvec3 oklab_from_linear_srgb(vec3 c) {\n\n vec3 lms = invB * c;\n \n return invA * (sign(lms)*pow(abs(lms), vec3(0.3333333333333)));\n \n}\n\nvec3 linear_srgb_from_oklab(vec3 c) {\n\n vec3 lms = fwdA * c;\n \n return fwdB * (lms * lms * lms);\n \n}\n\n\n// https://www.shadertoy.com/view/WtccD7\nconst float max_chroma = 0.33;\nvec3 uvToOklab(vec3 uvw){\n\n // setup oklab color\n float theta = 2.*3.141592653589793*uvw.x;\n \n float L = 0.8;\n float chroma = 0.1;\n \n //if (max(iMouse.x, iMouse.y) > 0.05 * iResolution.y) {\n L = uvw.y;//iMouse.x / iResolution.x;\n chroma = uvw.z * max_chroma;// / iResolution.y;\n //}\n \n float a = chroma*cos(theta);\n float b = chroma*sin(theta);\n \n vec3 lab = vec3(L, a, b);\n\treturn lab;\n\n // convert to rgb \n // vec3 rgb = linear_srgb_from_oklab(lab);\n\n}\n\n\n\n\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n\n\n\n\n#define DISTANCE\n\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main () {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\n\t// INSERT BODY\n\n\n\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1\n\tvec3 v_POLY_laserColor1_baseColor = vec3(0.0, 0.0, 0.0);\n\tif(true){\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/constant2\n\t\tvec3 v_POLY_laserColor1_constant2_val = vec3(0.6653872982754769, 0.5583403896257968, 0.005181516700061659);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/constant1\n\t\tvec3 v_POLY_laserColor1_constant1_val = vec3(0.7011018919268015, 0.018500220124016656, 0.005181516700061659);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/attribute1\n\t\tfloat v_POLY_laserColor1_attribute1_val = v_POLY_attribute_id;\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/rgbToOklab1\n\t\tvec3 v_POLY_laserColor1_rgbToOklab1_oklab = oklab_from_linear_srgb(v_POLY_laserColor1_constant2_val);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/rgbToOklab2\n\t\tvec3 v_POLY_laserColor1_rgbToOklab2_oklab = oklab_from_linear_srgb(v_POLY_laserColor1_constant1_val);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/round1\n\t\tfloat v_POLY_laserColor1_round1_val = sign(v_POLY_laserColor1_attribute1_val)*floor(abs(v_POLY_laserColor1_attribute1_val)+0.5);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/floatToVec2_1\n\t\tvec2 v_POLY_laserColor1_floatToVec2_1_vec2 = vec2(v_POLY_laserColor1_round1_val, 0.54);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/random1\n\t\tfloat v_POLY_laserColor1_random1_rand = rand(v_POLY_laserColor1_floatToVec2_1_vec2);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/pow1\n\t\tfloat v_POLY_laserColor1_pow1_val = pow(v_POLY_laserColor1_random1_rand, 0.27);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/mix1\n\t\tvec3 v_POLY_laserColor1_mix1_mix = mix(v_POLY_laserColor1_rgbToOklab1_oklab, v_POLY_laserColor1_rgbToOklab2_oklab, v_POLY_laserColor1_pow1_val);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/oklabToRgb1\n\t\tvec3 v_POLY_laserColor1_oklabToRgb1_rgb = linear_srgb_from_oklab(v_POLY_laserColor1_mix1_mix);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/subnetOutput1\n\t\tv_POLY_laserColor1_baseColor = v_POLY_laserColor1_oklabToRgb1_rgb;\n\t}\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/constant3\n\tfloat v_POLY_constant3_val = 0.86;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multScalar2\n\tvec3 v_POLY_multScalar2_val = (12.0*v_POLY_laserColor1_baseColor);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/output1\n\tdiffuseColor.xyz = v_POLY_multScalar2_val;\n\tdiffuseColor.w = v_POLY_constant3_val;\n\n\n\n\n\t#include <alphatest_fragment>\n\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist ); // clamp to [ 0, 1 ]\n\n\tgl_FragColor = packDepthToRGBA( dist );\n\n}\n","customDepthMaterial.vertex":"\nuniform float scale;\nattribute float lineDistance;\n\nvarying float vLineDistance;\n\n\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\n// INSERT DEFINES\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/noise1\n// Modulo 289 without a division (only multiplications)\nfloat mod289(float x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\nvec2 mod289(vec2 x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\nvec3 mod289(vec3 x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\nvec4 mod289(vec4 x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n// Modulo 7 without a division\nvec3 mod7(vec3 x) {\n return x - floor(x * (1.0 / 7.0)) * 7.0;\n}\n\n// Permutation polynomial: (34x^2 + x) mod 289\nfloat permute(float x) {\n return mod289(((x*34.0)+1.0)*x);\n}\nvec3 permute(vec3 x) {\n return mod289((34.0 * x + 1.0) * x);\n}\nvec4 permute(vec4 x) {\n return mod289(((x*34.0)+1.0)*x);\n}\n\nfloat taylorInvSqrt(float r)\n{\n return 1.79284291400159 - 0.85373472095314 * r;\n}\nvec4 taylorInvSqrt(vec4 r)\n{\n return 1.79284291400159 - 0.85373472095314 * r;\n}\n\nvec2 fade(vec2 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\nvec3 fade(vec3 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\nvec4 fade(vec4 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\n//\n// Description : Array and textureless GLSL 2D/3D/4D simplex \n// noise functions.\n// Author : Ian McEwan, Ashima Arts.\n// Maintainer : stegu\n// Lastmod : 20110822 (ijm)\n// License : Copyright (C) 2011 Ashima Arts. All rights reserved.\n// Distributed under the MIT License. See LICENSE file.\n// https://github.com/ashima/webgl-noise\n// https://github.com/stegu/webgl-noise\n// \n\n\n\nfloat snoise(vec3 v)\n { \n const vec2 C = vec2(1.0/6.0, 1.0/3.0) ;\n const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);\n\n// First corner\n vec3 i = floor(v + dot(v, C.yyy) );\n vec3 x0 = v - i + dot(i, C.xxx) ;\n\n// Other corners\n vec3 g = step(x0.yzx, x0.xyz);\n vec3 l = 1.0 - g;\n vec3 i1 = min( g.xyz, l.zxy );\n vec3 i2 = max( g.xyz, l.zxy );\n\n // x0 = x0 - 0.0 + 0.0 * C.xxx;\n // x1 = x0 - i1 + 1.0 * C.xxx;\n // x2 = x0 - i2 + 2.0 * C.xxx;\n // x3 = x0 - 1.0 + 3.0 * C.xxx;\n vec3 x1 = x0 - i1 + C.xxx;\n vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y\n vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y\n\n// Permutations\n i = mod289(i); \n vec4 p = permute( permute( permute( \n i.z + vec4(0.0, i1.z, i2.z, 1.0 ))\n + i.y + vec4(0.0, i1.y, i2.y, 1.0 )) \n + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));\n\n// Gradients: 7x7 points over a square, mapped onto an octahedron.\n// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)\n float n_ = 0.142857142857; // 1.0/7.0\n vec3 ns = n_ * D.wyz - D.xzx;\n\n vec4 j = p - 49.0 * floor(p * ns.z * ns.z); // mod(p,7*7)\n\n vec4 x_ = floor(j * ns.z);\n vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N)\n\n vec4 x = x_ *ns.x + ns.yyyy;\n vec4 y = y_ *ns.x + ns.yyyy;\n vec4 h = 1.0 - abs(x) - abs(y);\n\n vec4 b0 = vec4( x.xy, y.xy );\n vec4 b1 = vec4( x.zw, y.zw );\n\n //vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0;\n //vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;\n vec4 s0 = floor(b0)*2.0 + 1.0;\n vec4 s1 = floor(b1)*2.0 + 1.0;\n vec4 sh = -step(h, vec4(0.0));\n\n vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;\n vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;\n\n vec3 p0 = vec3(a0.xy,h.x);\n vec3 p1 = vec3(a0.zw,h.y);\n vec3 p2 = vec3(a1.xy,h.z);\n vec3 p3 = vec3(a1.zw,h.w);\n\n//Normalise gradients\n vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\n p0 *= norm.x;\n p1 *= norm.y;\n p2 *= norm.z;\n p3 *= norm.w;\n\n// Mix final noise value\n vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\n m = m * m;\n return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1), \n dot(p2,x2), dot(p3,x3) ) );\n }\n\n\nfloat fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1(in vec3 st) {\n\tfloat value = 0.0;\n\tfloat amplitude = 1.0;\n\tfor (int i = 0; i < 6; i++) {\n\t\tvalue += amplitude * snoise(st);\n\t\tst *= 2.0;\n\t\tamplitude *= 0.5;\n\t}\n\treturn value;\n}\n\n\n\n\n\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/param1\nuniform vec3 v_POLY_param_destPos;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/globals2\nuniform float time;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute1\nattribute float idn;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute2\nattribute float id;\n\n\n\n\n\n\n// vHighPrecisionZW is added to match CustomMeshDepth.frag\n// which is itself taken from threejs\nvarying vec2 vHighPrecisionZW;\n\n\nvoid main() {\n\n\t// INSERT BODY\n\n\n\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/constant1\n\tvec3 v_POLY_constant1_val = vec3(0.0, 0.0, 0.0);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/param1\n\tvec3 v_POLY_param1_val = v_POLY_param_destPos;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute1\n\tfloat v_POLY_attribute1_val = idn;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute2\n\tfloat v_POLY_attribute2_val = id;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/globals2\n\tfloat v_POLY_globals2_time = time;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1\n\tfloat v_POLY_laserColor1_attribute1_val = id;\n\tv_POLY_attribute_id = float(id);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/mix1\n\tvec3 v_POLY_mix1_mix = mix(v_POLY_constant1_val, v_POLY_param1_val, v_POLY_attribute1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/smoothstep1\n\tfloat v_POLY_smoothstep1_val = smoothstep(0.0, 0.1, v_POLY_attribute1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/smoothstep2\n\tfloat v_POLY_smoothstep2_val = smoothstep(1.0, 0.83, v_POLY_attribute1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multAdd3\n\tfloat v_POLY_multAdd3_val = (-1.0*(v_POLY_globals2_time + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multAdd1\n\tfloat v_POLY_multAdd1_val = (0.79*(v_POLY_globals2_time + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/min1\n\tfloat v_POLY_min1_val = min(v_POLY_smoothstep1_val, v_POLY_smoothstep2_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multAdd2\n\tfloat v_POLY_multAdd2_val = (1.0*(v_POLY_attribute1_val + 0.0)) + v_POLY_multAdd3_val;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/floatToVec3_2\n\tvec3 v_POLY_floatToVec3_2_vec3 = vec3(0.0, v_POLY_multAdd1_val, 0.21);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/floatToVec3_1\n\tvec3 v_POLY_floatToVec3_1_vec3 = vec3(v_POLY_min1_val, v_POLY_min1_val, v_POLY_min1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/floatToVec3_3\n\tvec3 v_POLY_floatToVec3_3_vec3 = vec3(0.0, v_POLY_attribute2_val, v_POLY_multAdd2_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multScalar1\n\tvec3 v_POLY_multScalar1_val = (0.42*v_POLY_floatToVec3_1_vec3);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/noise1\n\tfloat v_POLY_noise1_noisex = (v_POLY_multScalar1_val*fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1((v_POLY_floatToVec3_3_vec3*vec3(1.0, 1.0, 1.0))+(v_POLY_floatToVec3_2_vec3+vec3(0.0, 0.0, 0.0)))).x;\n\tfloat v_POLY_noise1_noisey = (v_POLY_multScalar1_val*fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1((v_POLY_floatToVec3_3_vec3*vec3(1.0, 1.0, 1.0))+(v_POLY_floatToVec3_2_vec3+vec3(1000.0, 1000.0, 1000.0)))).y;\n\tfloat v_POLY_noise1_noisez = (v_POLY_multScalar1_val*fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1((v_POLY_floatToVec3_3_vec3*vec3(1.0, 1.0, 1.0))+(v_POLY_floatToVec3_2_vec3+vec3(2000.0, 2000.0, 2000.0)))).z;\n\tvec3 v_POLY_noise1_noise = vec3(v_POLY_noise1_noisex, v_POLY_noise1_noisey, v_POLY_noise1_noisez);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/add1\n\tvec3 v_POLY_add1_sum = (v_POLY_mix1_mix + v_POLY_noise1_noise + vec3(0.0, 0.0, 0.0));\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/max1\n\tvec3 v_POLY_max1_val = max(v_POLY_add1_sum, vec3(-1000.0, 0.0, -1000.0));\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/output1\n\tvec3 transformed = v_POLY_max1_val;vec4 mvPosition = vec4( transformed, 1.0 ); gl_Position = projectionMatrix * modelViewMatrix * mvPosition;\n\n\n\n\n\n\tvLineDistance = scale * lineDistance;\n\n\t#include <color_vertex>\n// removed:\n//\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n// removed:\n//\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\n\n\tvHighPrecisionZW = gl_Position.zw;\n}\n","customDepthMaterial.fragment":"\n// INSERT DEFINES\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/rgbToOklab1\n//////////////////////////////////////////////////////////////////////\n//\n// Visualizing Björn Ottosson's \"oklab\" colorspace\n//\n// shadertoy implementation by mattz\n//\n// license CC0 (public domain)\n// https://creativecommons.org/share-your-work/public-domain/cc0/\n//\n// Click and drag to set lightness (mouse x) and chroma (mouse y).\n// Hue varies linearly across the image from left to right.\n//\n// While mouse is down, plotted curves show oklab components\n// L (red), a (green), and b (blue). \n//\n// To test the inverse mapping, the plotted curves are generated\n// by mapping the (pre-clipping) linear RGB color back to oklab \n// space.\n//\n// White bars on top of the image (and black bars on the bottom of\n// the image) indicate clipping when one or more of the R, G, B \n// components are greater than 1.0 (or less than 0.0 respectively).\n//\n// The color accompanying the black/white bar shows which channels\n// are out of gamut.\n//\n// Click in the bottom left to reset the view.\n//\n// Hit the 'G' key to toggle displaying a gamut test:\n//\n// * black pixels indicate that RGB values for some hues\n// were clipped to 0 at the given lightness/chroma pair.\n//\n// * white pixels indicate that RGB values for some hues\n// were clipped to 1 at the given lightness/chroma pair\n//\n// * gray pixels indicate that both types of clipping happened\n//\n// Hit the 'U' key to display a uniform sampling of linear sRGB \n// space, converted into oklab lightness (x position) and chroma\n// (y position) coordinates. If you mouse over a colored dot, the\n// spectrum on screen should include that exact color.\n//\n//////////////////////////////////////////////////////////////////////\n\n//////////////////////////////////////////////////////////////////////\n// sRGB color transform and inverse from \n// https://bottosson.github.io/posts/colorwrong/#what-can-we-do%3F\n\nvec3 srgb_from_linear_srgb(vec3 x) {\n\n vec3 xlo = 12.92*x;\n vec3 xhi = 1.055 * pow(x, vec3(0.4166666666666667)) - 0.055;\n \n return mix(xlo, xhi, step(vec3(0.0031308), x));\n\n}\n\nvec3 linear_srgb_from_srgb(vec3 x) {\n\n vec3 xlo = x / 12.92;\n vec3 xhi = pow((x + 0.055)/(1.055), vec3(2.4));\n \n return mix(xlo, xhi, step(vec3(0.04045), x));\n\n}\n\n//////////////////////////////////////////////////////////////////////\n// oklab transform and inverse from\n// https://bottosson.github.io/posts/oklab/\n\n\nconst mat3 fwdA = mat3(1.0, 1.0, 1.0,\n 0.3963377774, -0.1055613458, -0.0894841775,\n 0.2158037573, -0.0638541728, -1.2914855480);\n \nconst mat3 fwdB = mat3(4.0767245293, -1.2681437731, -0.0041119885,\n -3.3072168827, 2.6093323231, -0.7034763098,\n 0.2307590544, -0.3411344290, 1.7068625689);\n\nconst mat3 invB = mat3(0.4121656120, 0.2118591070, 0.0883097947,\n 0.5362752080, 0.6807189584, 0.2818474174,\n 0.0514575653, 0.1074065790, 0.6302613616);\n \nconst mat3 invA = mat3(0.2104542553, 1.9779984951, 0.0259040371,\n 0.7936177850, -2.4285922050, 0.7827717662,\n -0.0040720468, 0.4505937099, -0.8086757660);\n\nvec3 oklab_from_linear_srgb(vec3 c) {\n\n vec3 lms = invB * c;\n \n return invA * (sign(lms)*pow(abs(lms), vec3(0.3333333333333)));\n \n}\n\nvec3 linear_srgb_from_oklab(vec3 c) {\n\n vec3 lms = fwdA * c;\n \n return fwdB * (lms * lms * lms);\n \n}\n\n\n// https://www.shadertoy.com/view/WtccD7\nconst float max_chroma = 0.33;\nvec3 uvToOklab(vec3 uvw){\n\n // setup oklab color\n float theta = 2.*3.141592653589793*uvw.x;\n \n float L = 0.8;\n float chroma = 0.1;\n \n //if (max(iMouse.x, iMouse.y) > 0.05 * iResolution.y) {\n L = uvw.y;//iMouse.x / iResolution.x;\n chroma = uvw.z * max_chroma;// / iResolution.y;\n //}\n \n float a = chroma*cos(theta);\n float b = chroma*sin(theta);\n \n vec3 lab = vec3(L, a, b);\n\treturn lab;\n\n // convert to rgb \n // vec3 rgb = linear_srgb_from_oklab(lab);\n\n}\n\n\n\n\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n\n\n\n\n\n#if DEPTH_PACKING == 3200\n\n\tuniform float opacity;\n\n#endif\n\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tdiffuseColor.a = opacity;\n\n\t#endif\n\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\n\t// INSERT BODY\n\n\n\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1\n\tvec3 v_POLY_laserColor1_baseColor = vec3(0.0, 0.0, 0.0);\n\tif(true){\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/constant2\n\t\tvec3 v_POLY_laserColor1_constant2_val = vec3(0.6653872982754769, 0.5583403896257968, 0.005181516700061659);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/constant1\n\t\tvec3 v_POLY_laserColor1_constant1_val = vec3(0.7011018919268015, 0.018500220124016656, 0.005181516700061659);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/attribute1\n\t\tfloat v_POLY_laserColor1_attribute1_val = v_POLY_attribute_id;\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/rgbToOklab1\n\t\tvec3 v_POLY_laserColor1_rgbToOklab1_oklab = oklab_from_linear_srgb(v_POLY_laserColor1_constant2_val);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/rgbToOklab2\n\t\tvec3 v_POLY_laserColor1_rgbToOklab2_oklab = oklab_from_linear_srgb(v_POLY_laserColor1_constant1_val);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/round1\n\t\tfloat v_POLY_laserColor1_round1_val = sign(v_POLY_laserColor1_attribute1_val)*floor(abs(v_POLY_laserColor1_attribute1_val)+0.5);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/floatToVec2_1\n\t\tvec2 v_POLY_laserColor1_floatToVec2_1_vec2 = vec2(v_POLY_laserColor1_round1_val, 0.54);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/random1\n\t\tfloat v_POLY_laserColor1_random1_rand = rand(v_POLY_laserColor1_floatToVec2_1_vec2);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/pow1\n\t\tfloat v_POLY_laserColor1_pow1_val = pow(v_POLY_laserColor1_random1_rand, 0.27);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/mix1\n\t\tvec3 v_POLY_laserColor1_mix1_mix = mix(v_POLY_laserColor1_rgbToOklab1_oklab, v_POLY_laserColor1_rgbToOklab2_oklab, v_POLY_laserColor1_pow1_val);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/oklabToRgb1\n\t\tvec3 v_POLY_laserColor1_oklabToRgb1_rgb = linear_srgb_from_oklab(v_POLY_laserColor1_mix1_mix);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/subnetOutput1\n\t\tv_POLY_laserColor1_baseColor = v_POLY_laserColor1_oklabToRgb1_rgb;\n\t}\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/constant3\n\tfloat v_POLY_constant3_val = 0.86;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multScalar2\n\tvec3 v_POLY_multScalar2_val = (12.0*v_POLY_laserColor1_baseColor);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/output1\n\tdiffuseColor.xyz = v_POLY_multScalar2_val;\n\tdiffuseColor.w = v_POLY_constant3_val;\n\n\n\n\t// the new body lines should be added before the alphatest_fragment\n\t// so that alpha is set before (which is really how it would be set if the alphamap_fragment above was used by the material node parameters)\n\n\t#include <alphatest_fragment>\n\n\t#include <logdepthbuf_fragment>\n\n\n\t// Higher precision equivalent of gl_FragCoord.z. This assumes depthRange has been left to its default values.\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), diffuseColor.a );\n\n\t#elif DEPTH_PACKING == 3201\n\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\n\t#endif\n\n}\n","customDepthDOFMaterial.vertex":"\nuniform float scale;\nattribute float lineDistance;\n\nvarying float vLineDistance;\n\n\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\n// INSERT DEFINES\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/noise1\n// Modulo 289 without a division (only multiplications)\nfloat mod289(float x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\nvec2 mod289(vec2 x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\nvec3 mod289(vec3 x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\nvec4 mod289(vec4 x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n// Modulo 7 without a division\nvec3 mod7(vec3 x) {\n return x - floor(x * (1.0 / 7.0)) * 7.0;\n}\n\n// Permutation polynomial: (34x^2 + x) mod 289\nfloat permute(float x) {\n return mod289(((x*34.0)+1.0)*x);\n}\nvec3 permute(vec3 x) {\n return mod289((34.0 * x + 1.0) * x);\n}\nvec4 permute(vec4 x) {\n return mod289(((x*34.0)+1.0)*x);\n}\n\nfloat taylorInvSqrt(float r)\n{\n return 1.79284291400159 - 0.85373472095314 * r;\n}\nvec4 taylorInvSqrt(vec4 r)\n{\n return 1.79284291400159 - 0.85373472095314 * r;\n}\n\nvec2 fade(vec2 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\nvec3 fade(vec3 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\nvec4 fade(vec4 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\n//\n// Description : Array and textureless GLSL 2D/3D/4D simplex \n// noise functions.\n// Author : Ian McEwan, Ashima Arts.\n// Maintainer : stegu\n// Lastmod : 20110822 (ijm)\n// License : Copyright (C) 2011 Ashima Arts. All rights reserved.\n// Distributed under the MIT License. See LICENSE file.\n// https://github.com/ashima/webgl-noise\n// https://github.com/stegu/webgl-noise\n// \n\n\n\nfloat snoise(vec3 v)\n { \n const vec2 C = vec2(1.0/6.0, 1.0/3.0) ;\n const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);\n\n// First corner\n vec3 i = floor(v + dot(v, C.yyy) );\n vec3 x0 = v - i + dot(i, C.xxx) ;\n\n// Other corners\n vec3 g = step(x0.yzx, x0.xyz);\n vec3 l = 1.0 - g;\n vec3 i1 = min( g.xyz, l.zxy );\n vec3 i2 = max( g.xyz, l.zxy );\n\n // x0 = x0 - 0.0 + 0.0 * C.xxx;\n // x1 = x0 - i1 + 1.0 * C.xxx;\n // x2 = x0 - i2 + 2.0 * C.xxx;\n // x3 = x0 - 1.0 + 3.0 * C.xxx;\n vec3 x1 = x0 - i1 + C.xxx;\n vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y\n vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y\n\n// Permutations\n i = mod289(i); \n vec4 p = permute( permute( permute( \n i.z + vec4(0.0, i1.z, i2.z, 1.0 ))\n + i.y + vec4(0.0, i1.y, i2.y, 1.0 )) \n + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));\n\n// Gradients: 7x7 points over a square, mapped onto an octahedron.\n// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)\n float n_ = 0.142857142857; // 1.0/7.0\n vec3 ns = n_ * D.wyz - D.xzx;\n\n vec4 j = p - 49.0 * floor(p * ns.z * ns.z); // mod(p,7*7)\n\n vec4 x_ = floor(j * ns.z);\n vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N)\n\n vec4 x = x_ *ns.x + ns.yyyy;\n vec4 y = y_ *ns.x + ns.yyyy;\n vec4 h = 1.0 - abs(x) - abs(y);\n\n vec4 b0 = vec4( x.xy, y.xy );\n vec4 b1 = vec4( x.zw, y.zw );\n\n //vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0;\n //vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;\n vec4 s0 = floor(b0)*2.0 + 1.0;\n vec4 s1 = floor(b1)*2.0 + 1.0;\n vec4 sh = -step(h, vec4(0.0));\n\n vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;\n vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;\n\n vec3 p0 = vec3(a0.xy,h.x);\n vec3 p1 = vec3(a0.zw,h.y);\n vec3 p2 = vec3(a1.xy,h.z);\n vec3 p3 = vec3(a1.zw,h.w);\n\n//Normalise gradients\n vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\n p0 *= norm.x;\n p1 *= norm.y;\n p2 *= norm.z;\n p3 *= norm.w;\n\n// Mix final noise value\n vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\n m = m * m;\n return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1), \n dot(p2,x2), dot(p3,x3) ) );\n }\n\n\nfloat fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1(in vec3 st) {\n\tfloat value = 0.0;\n\tfloat amplitude = 1.0;\n\tfor (int i = 0; i < 6; i++) {\n\t\tvalue += amplitude * snoise(st);\n\t\tst *= 2.0;\n\t\tamplitude *= 0.5;\n\t}\n\treturn value;\n}\n\n\n\n\n\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/param1\nuniform vec3 v_POLY_param_destPos;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/globals2\nuniform float time;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute1\nattribute float idn;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute2\nattribute float id;\n\n\n\n\n\n\n// vHighPrecisionZW is added to match CustomMeshDepth.frag\n// which is itself taken from threejs\nvarying vec2 vHighPrecisionZW;\n\n\nvoid main() {\n\n\t// INSERT BODY\n\n\n\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/constant1\n\tvec3 v_POLY_constant1_val = vec3(0.0, 0.0, 0.0);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/param1\n\tvec3 v_POLY_param1_val = v_POLY_param_destPos;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute1\n\tfloat v_POLY_attribute1_val = idn;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute2\n\tfloat v_POLY_attribute2_val = id;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/globals2\n\tfloat v_POLY_globals2_time = time;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1\n\tfloat v_POLY_laserColor1_attribute1_val = id;\n\tv_POLY_attribute_id = float(id);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/mix1\n\tvec3 v_POLY_mix1_mix = mix(v_POLY_constant1_val, v_POLY_param1_val, v_POLY_attribute1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/smoothstep1\n\tfloat v_POLY_smoothstep1_val = smoothstep(0.0, 0.1, v_POLY_attribute1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/smoothstep2\n\tfloat v_POLY_smoothstep2_val = smoothstep(1.0, 0.83, v_POLY_attribute1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multAdd3\n\tfloat v_POLY_multAdd3_val = (-1.0*(v_POLY_globals2_time + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multAdd1\n\tfloat v_POLY_multAdd1_val = (0.79*(v_POLY_globals2_time + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/min1\n\tfloat v_POLY_min1_val = min(v_POLY_smoothstep1_val, v_POLY_smoothstep2_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multAdd2\n\tfloat v_POLY_multAdd2_val = (1.0*(v_POLY_attribute1_val + 0.0)) + v_POLY_multAdd3_val;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/floatToVec3_2\n\tvec3 v_POLY_floatToVec3_2_vec3 = vec3(0.0, v_POLY_multAdd1_val, 0.21);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/floatToVec3_1\n\tvec3 v_POLY_floatToVec3_1_vec3 = vec3(v_POLY_min1_val, v_POLY_min1_val, v_POLY_min1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/floatToVec3_3\n\tvec3 v_POLY_floatToVec3_3_vec3 = vec3(0.0, v_POLY_attribute2_val, v_POLY_multAdd2_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multScalar1\n\tvec3 v_POLY_multScalar1_val = (0.42*v_POLY_floatToVec3_1_vec3);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/noise1\n\tfloat v_POLY_noise1_noisex = (v_POLY_multScalar1_val*fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1((v_POLY_floatToVec3_3_vec3*vec3(1.0, 1.0, 1.0))+(v_POLY_floatToVec3_2_vec3+vec3(0.0, 0.0, 0.0)))).x;\n\tfloat v_POLY_noise1_noisey = (v_POLY_multScalar1_val*fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1((v_POLY_floatToVec3_3_vec3*vec3(1.0, 1.0, 1.0))+(v_POLY_floatToVec3_2_vec3+vec3(1000.0, 1000.0, 1000.0)))).y;\n\tfloat v_POLY_noise1_noisez = (v_POLY_multScalar1_val*fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1((v_POLY_floatToVec3_3_vec3*vec3(1.0, 1.0, 1.0))+(v_POLY_floatToVec3_2_vec3+vec3(2000.0, 2000.0, 2000.0)))).z;\n\tvec3 v_POLY_noise1_noise = vec3(v_POLY_noise1_noisex, v_POLY_noise1_noisey, v_POLY_noise1_noisez);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/add1\n\tvec3 v_POLY_add1_sum = (v_POLY_mix1_mix + v_POLY_noise1_noise + vec3(0.0, 0.0, 0.0));\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/max1\n\tvec3 v_POLY_max1_val = max(v_POLY_add1_sum, vec3(-1000.0, 0.0, -1000.0));\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/output1\n\tvec3 transformed = v_POLY_max1_val;vec4 mvPosition = vec4( transformed, 1.0 ); gl_Position = projectionMatrix * modelViewMatrix * mvPosition;\n\n\n\n\n\n\tvLineDistance = scale * lineDistance;\n\n\t#include <color_vertex>\n// removed:\n//\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n// removed:\n//\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\n\n\tvHighPrecisionZW = gl_Position.zw;\n}\n","customDepthDOFMaterial.fragment":"\n// INSERT DEFINES\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/rgbToOklab1\n//////////////////////////////////////////////////////////////////////\n//\n// Visualizing Björn Ottosson's \"oklab\" colorspace\n//\n// shadertoy implementation by mattz\n//\n// license CC0 (public domain)\n// https://creativecommons.org/share-your-work/public-domain/cc0/\n//\n// Click and drag to set lightness (mouse x) and chroma (mouse y).\n// Hue varies linearly across the image from left to right.\n//\n// While mouse is down, plotted curves show oklab components\n// L (red), a (green), and b (blue). \n//\n// To test the inverse mapping, the plotted curves are generated\n// by mapping the (pre-clipping) linear RGB color back to oklab \n// space.\n//\n// White bars on top of the image (and black bars on the bottom of\n// the image) indicate clipping when one or more of the R, G, B \n// components are greater than 1.0 (or less than 0.0 respectively).\n//\n// The color accompanying the black/white bar shows which channels\n// are out of gamut.\n//\n// Click in the bottom left to reset the view.\n//\n// Hit the 'G' key to toggle displaying a gamut test:\n//\n// * black pixels indicate that RGB values for some hues\n// were clipped to 0 at the given lightness/chroma pair.\n//\n// * white pixels indicate that RGB values for some hues\n// were clipped to 1 at the given lightness/chroma pair\n//\n// * gray pixels indicate that both types of clipping happened\n//\n// Hit the 'U' key to display a uniform sampling of linear sRGB \n// space, converted into oklab lightness (x position) and chroma\n// (y position) coordinates. If you mouse over a colored dot, the\n// spectrum on screen should include that exact color.\n//\n//////////////////////////////////////////////////////////////////////\n\n//////////////////////////////////////////////////////////////////////\n// sRGB color transform and inverse from \n// https://bottosson.github.io/posts/colorwrong/#what-can-we-do%3F\n\nvec3 srgb_from_linear_srgb(vec3 x) {\n\n vec3 xlo = 12.92*x;\n vec3 xhi = 1.055 * pow(x, vec3(0.4166666666666667)) - 0.055;\n \n return mix(xlo, xhi, step(vec3(0.0031308), x));\n\n}\n\nvec3 linear_srgb_from_srgb(vec3 x) {\n\n vec3 xlo = x / 12.92;\n vec3 xhi = pow((x + 0.055)/(1.055), vec3(2.4));\n \n return mix(xlo, xhi, step(vec3(0.04045), x));\n\n}\n\n//////////////////////////////////////////////////////////////////////\n// oklab transform and inverse from\n// https://bottosson.github.io/posts/oklab/\n\n\nconst mat3 fwdA = mat3(1.0, 1.0, 1.0,\n 0.3963377774, -0.1055613458, -0.0894841775,\n 0.2158037573, -0.0638541728, -1.2914855480);\n \nconst mat3 fwdB = mat3(4.0767245293, -1.2681437731, -0.0041119885,\n -3.3072168827, 2.6093323231, -0.7034763098,\n 0.2307590544, -0.3411344290, 1.7068625689);\n\nconst mat3 invB = mat3(0.4121656120, 0.2118591070, 0.0883097947,\n 0.5362752080, 0.6807189584, 0.2818474174,\n 0.0514575653, 0.1074065790, 0.6302613616);\n \nconst mat3 invA = mat3(0.2104542553, 1.9779984951, 0.0259040371,\n 0.7936177850, -2.4285922050, 0.7827717662,\n -0.0040720468, 0.4505937099, -0.8086757660);\n\nvec3 oklab_from_linear_srgb(vec3 c) {\n\n vec3 lms = invB * c;\n \n return invA * (sign(lms)*pow(abs(lms), vec3(0.3333333333333)));\n \n}\n\nvec3 linear_srgb_from_oklab(vec3 c) {\n\n vec3 lms = fwdA * c;\n \n return fwdB * (lms * lms * lms);\n \n}\n\n\n// https://www.shadertoy.com/view/WtccD7\nconst float max_chroma = 0.33;\nvec3 uvToOklab(vec3 uvw){\n\n // setup oklab color\n float theta = 2.*3.141592653589793*uvw.x;\n \n float L = 0.8;\n float chroma = 0.1;\n \n //if (max(iMouse.x, iMouse.y) > 0.05 * iResolution.y) {\n L = uvw.y;//iMouse.x / iResolution.x;\n chroma = uvw.z * max_chroma;// / iResolution.y;\n //}\n \n float a = chroma*cos(theta);\n float b = chroma*sin(theta);\n \n vec3 lab = vec3(L, a, b);\n\treturn lab;\n\n // convert to rgb \n // vec3 rgb = linear_srgb_from_oklab(lab);\n\n}\n\n\n\n\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n\n\n\n\n\n#if DEPTH_PACKING == 3200\n\n\tuniform float opacity;\n\n#endif\n\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tdiffuseColor.a = opacity;\n\n\t#endif\n\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\n\t// INSERT BODY\n\n\n\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1\n\tvec3 v_POLY_laserColor1_baseColor = vec3(0.0, 0.0, 0.0);\n\tif(true){\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/constant2\n\t\tvec3 v_POLY_laserColor1_constant2_val = vec3(0.6653872982754769, 0.5583403896257968, 0.005181516700061659);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/constant1\n\t\tvec3 v_POLY_laserColor1_constant1_val = vec3(0.7011018919268015, 0.018500220124016656, 0.005181516700061659);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/attribute1\n\t\tfloat v_POLY_laserColor1_attribute1_val = v_POLY_attribute_id;\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/rgbToOklab1\n\t\tvec3 v_POLY_laserColor1_rgbToOklab1_oklab = oklab_from_linear_srgb(v_POLY_laserColor1_constant2_val);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/rgbToOklab2\n\t\tvec3 v_POLY_laserColor1_rgbToOklab2_oklab = oklab_from_linear_srgb(v_POLY_laserColor1_constant1_val);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/round1\n\t\tfloat v_POLY_laserColor1_round1_val = sign(v_POLY_laserColor1_attribute1_val)*floor(abs(v_POLY_laserColor1_attribute1_val)+0.5);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/floatToVec2_1\n\t\tvec2 v_POLY_laserColor1_floatToVec2_1_vec2 = vec2(v_POLY_laserColor1_round1_val, 0.54);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/random1\n\t\tfloat v_POLY_laserColor1_random1_rand = rand(v_POLY_laserColor1_floatToVec2_1_vec2);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/pow1\n\t\tfloat v_POLY_laserColor1_pow1_val = pow(v_POLY_laserColor1_random1_rand, 0.27);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/mix1\n\t\tvec3 v_POLY_laserColor1_mix1_mix = mix(v_POLY_laserColor1_rgbToOklab1_oklab, v_POLY_laserColor1_rgbToOklab2_oklab, v_POLY_laserColor1_pow1_val);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/oklabToRgb1\n\t\tvec3 v_POLY_laserColor1_oklabToRgb1_rgb = linear_srgb_from_oklab(v_POLY_laserColor1_mix1_mix);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/subnetOutput1\n\t\tv_POLY_laserColor1_baseColor = v_POLY_laserColor1_oklabToRgb1_rgb;\n\t}\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/constant3\n\tfloat v_POLY_constant3_val = 0.86;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multScalar2\n\tvec3 v_POLY_multScalar2_val = (12.0*v_POLY_laserColor1_baseColor);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/output1\n\tdiffuseColor.xyz = v_POLY_multScalar2_val;\n\tdiffuseColor.w = v_POLY_constant3_val;\n\n\n\n\t// the new body lines should be added before the alphatest_fragment\n\t// so that alpha is set before (which is really how it would be set if the alphamap_fragment above was used by the material node parameters)\n\n\t#include <alphatest_fragment>\n\n\t#include <logdepthbuf_fragment>\n\n\n\t// Higher precision equivalent of gl_FragCoord.z. This assumes depthRange has been left to its default values.\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), diffuseColor.a );\n\n\t#elif DEPTH_PACKING == 3201\n\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\n\t#endif\n\n}\n"},"/env/MAT/meshStandardBuilder1":{"vertex":"#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n\n\n\n// /env/MAT/meshStandardBuilder1/globals1\nvarying vec3 v_POLY_globals1_position;\n\n\n\n\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\n\n\n\t// /env/MAT/meshStandardBuilder1/globals1\n\tv_POLY_globals1_position = vec3(position);\n\t\n\t// /env/MAT/meshStandardBuilder1/output1\n\tvec3 transformed = position;\n\tvec3 objectNormal = normal;\n\t#ifdef USE_TANGENT\n\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t#endif\n\n\n\n\t#include <morphcolor_vertex>\n// removed:\n//\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n// removed:\n//\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}","fragment":"#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define USE_SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n\tuniform float ior;\n#endif\n#ifdef USE_SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULAR_COLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_IRIDESCENCE\n\tuniform float iridescence;\n\tuniform float iridescenceIOR;\n\tuniform float iridescenceThicknessMinimum;\n\tuniform float iridescenceThicknessMaximum;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\nvarying vec3 vViewPosition;\n#include <common>\n\n\n\n// /env/MAT/meshStandardBuilder1/checkers1\n// https://iquilezles.org/articles/checkerfiltering/\nfloat checkers(vec2 p) {\n\tvec2 s = sign(fract(p*.5)-.5);\n\treturn .5 - .5*s.x*s.y;\n}\nfloat checkersGrad( in vec2 p, in vec2 ddx, in vec2 ddy )\n{\n // filter kernel\n vec2 w = max(abs(ddx), abs(ddy)) + 0.01;\n // analytical integral (box filter)\n vec2 i = 2.0*(abs(fract((p-0.5*w)/2.0)-0.5)-abs(fract((p+0.5*w)/2.0)-0.5))/w;\n // xor pattern\n return 0.5 - 0.5*i.x*i.y;\n}\n\n\n\n\n\n\n\n\n// /env/MAT/meshStandardBuilder1/globals1\nvarying vec3 v_POLY_globals1_position;\n\n\n\n\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <iridescence_fragment>\n#include <cube_uv_reflection_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_physical_pars_fragment>\n#include <fog_pars_fragment>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_physical_pars_fragment>\n#include <transmission_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <clearcoat_pars_fragment>\n#include <iridescence_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nstruct SSSModel {\n\tbool isActive;\n\tvec3 color;\n\tfloat thickness;\n\tfloat power;\n\tfloat scale;\n\tfloat distortion;\n\tfloat ambient;\n\tfloat attenuation;\n};\n\nvoid RE_Direct_Scattering(\n\tconst in IncidentLight directLight,\n\tconst in GeometricContext geometry,\n\tconst in SSSModel sssModel,\n\tinout ReflectedLight reflectedLight\n\t){\n\tvec3 scatteringHalf = normalize(directLight.direction + (geometry.normal * sssModel.distortion));\n\tfloat scatteringDot = pow(saturate(dot(geometry.viewDir, -scatteringHalf)), sssModel.power) * sssModel.scale;\n\tvec3 scatteringIllu = (scatteringDot + sssModel.ambient) * (sssModel.color * (1.0-sssModel.thickness));\n\treflectedLight.directDiffuse += scatteringIllu * sssModel.attenuation * directLight.color;\n}\n\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\n\n\t// /env/MAT/meshStandardBuilder1/constant1\n\tvec3 v_POLY_constant1_val = vec3(0.24313725490196078, 0.5098039215686274, 0.8549019607843137);\n\t\n\t// /env/MAT/meshStandardBuilder1/constant2\n\tvec3 v_POLY_constant2_val = vec3(0.047058823529411764, 0.10196078431372549, 0.17647058823529413);\n\t\n\t// /env/MAT/meshStandardBuilder1/vec3ToFloat1\n\tfloat v_POLY_vec3ToFloat1_x = v_POLY_globals1_position.x;\n\tfloat v_POLY_vec3ToFloat1_z = v_POLY_globals1_position.z;\n\t\n\t// /env/MAT/meshStandardBuilder1/floatToVec2_1\n\tvec2 v_POLY_floatToVec2_1_vec2 = vec2(v_POLY_vec3ToFloat1_x, v_POLY_vec3ToFloat1_z);\n\t\n\t// /env/MAT/meshStandardBuilder1/checkers1\n\tvec2 v_POLY_checkers1_coord = v_POLY_floatToVec2_1_vec2*vec2(1.0, 1.0)*1.0;\n\tfloat v_POLY_checkers1_checker = checkersGrad(v_POLY_checkers1_coord, dFdx(v_POLY_checkers1_coord), dFdy(v_POLY_checkers1_coord));\n\t\n\t// /env/MAT/meshStandardBuilder1/mix1\n\tvec3 v_POLY_mix1_mix = mix(v_POLY_constant1_val, v_POLY_constant2_val, v_POLY_checkers1_checker);\n\t\n\t// /env/MAT/meshStandardBuilder1/output1\n\tdiffuseColor.xyz = v_POLY_mix1_mix;\n\tfloat POLY_metalness = 1.0;\n\tfloat POLY_roughness = 1.0;\n\tvec3 POLY_emissive = vec3(1.0, 1.0, 1.0);\n\tSSSModel POLY_SSSModel = SSSModel(/*isActive*/false,/*color*/vec3(1.0, 1.0, 1.0), /*thickness*/0.1, /*power*/2.0, /*scale*/16.0, /*distortion*/0.1,/*ambient*/0.4,/*attenuation*/0.8 );\n\n\n\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive * POLY_emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\tfloat roughnessFactor = roughness * POLY_roughness;\n\n#ifdef USE_ROUGHNESSMAP\n\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\n\t// reads channel G, compatible with a combined OcclusionRoughnessMetallic (RGB) texture\n\troughnessFactor *= texelRoughness.g;\n\n#endif\n\n\tfloat metalnessFactor = metalness * POLY_metalness;\n\n#ifdef USE_METALNESSMAP\n\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\n\t// reads channel B, compatible with a combined OcclusionRoughnessMetallic (RGB) texture\n\tmetalnessFactor *= texelMetalness.b;\n\n#endif\n\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <clearcoat_normal_fragment_begin>\n\t#include <clearcoat_normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_fragment_begin>\nif(POLY_SSSModel.isActive){\n\tRE_Direct_Scattering(directLight, geometry, POLY_SSSModel, reflectedLight);\n}\n\n\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\t#include <transmission_fragment>\n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\t#ifdef USE_SHEEN\n\t\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\n\t\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecular;\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + clearcoatSpecular * material.clearcoat;\n\t#endif\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}","customDepthMaterial.vertex":"#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n\n\n\n// /env/MAT/meshStandardBuilder1/globals1\nvarying vec3 v_POLY_globals1_position;\n\n\n\n\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n// removed:\n//\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n// removed:\n//\t#include <begin_vertex>\n\n\n\n\t// /env/MAT/meshStandardBuilder1/globals1\n\tv_POLY_globals1_position = vec3(position);\n\t\n\t// /env/MAT/meshStandardBuilder1/output1\n\tvec3 transformed = position;\n\tvec3 objectNormal = normal;\n\t#ifdef USE_TANGENT\n\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t#endif\n\n\n\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvHighPrecisionZW = gl_Position.zw;\n}","customDepthMaterial.fragment":"\n// INSERT DEFINES\n\n\n#if DEPTH_PACKING == 3200\n\n\tuniform float opacity;\n\n#endif\n\n#include <common>\n\n\n\n// /env/MAT/meshStandardBuilder1/checkers1\n// https://iquilezles.org/articles/checkerfiltering/\nfloat checkers(vec2 p) {\n\tvec2 s = sign(fract(p*.5)-.5);\n\treturn .5 - .5*s.x*s.y;\n}\nfloat checkersGrad( in vec2 p, in vec2 ddx, in vec2 ddy )\n{\n // filter kernel\n vec2 w = max(abs(ddx), abs(ddy)) + 0.01;\n // analytical integral (box filter)\n vec2 i = 2.0*(abs(fract((p-0.5*w)/2.0)-0.5)-abs(fract((p+0.5*w)/2.0)-0.5))/w;\n // xor pattern\n return 0.5 - 0.5*i.x*i.y;\n}\n\n\n\n\n\n\n\n\n// /env/MAT/meshStandardBuilder1/globals1\nvarying vec3 v_POLY_globals1_position;\n\n\n\n\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvarying vec2 vHighPrecisionZW;\n\nstruct SSSModel {\n\tbool isActive;\n\tvec3 color;\n\tfloat thickness;\n\tfloat power;\n\tfloat scale;\n\tfloat distortion;\n\tfloat ambient;\n\tfloat attenuation;\n};\n\nvoid RE_Direct_Scattering(\n\tconst in IncidentLight directLight,\n\tconst in GeometricContext geometry,\n\tconst in SSSModel sssModel,\n\tinout ReflectedLight reflectedLight\n\t){\n\tvec3 scatteringHalf = normalize(directLight.direction + (geometry.normal * sssModel.distortion));\n\tfloat scatteringDot = pow(saturate(dot(geometry.viewDir, -scatteringHalf)), sssModel.power) * sssModel.scale;\n\tvec3 scatteringIllu = (scatteringDot + sssModel.ambient) * (sssModel.color * (1.0-sssModel.thickness));\n\treflectedLight.directDiffuse += scatteringIllu * sssModel.attenuation * directLight.color;\n}\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tdiffuseColor.a = opacity;\n\n\t#endif\n\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\n\n\n\t// /env/MAT/meshStandardBuilder1/constant1\n\tvec3 v_POLY_constant1_val = vec3(0.24313725490196078, 0.5098039215686274, 0.8549019607843137);\n\t\n\t// /env/MAT/meshStandardBuilder1/constant2\n\tvec3 v_POLY_constant2_val = vec3(0.047058823529411764, 0.10196078431372549, 0.17647058823529413);\n\t\n\t// /env/MAT/meshStandardBuilder1/vec3ToFloat1\n\tfloat v_POLY_vec3ToFloat1_x = v_POLY_globals1_position.x;\n\tfloat v_POLY_vec3ToFloat1_z = v_POLY_globals1_position.z;\n\t\n\t// /env/MAT/meshStandardBuilder1/floatToVec2_1\n\tvec2 v_POLY_floatToVec2_1_vec2 = vec2(v_POLY_vec3ToFloat1_x, v_POLY_vec3ToFloat1_z);\n\t\n\t// /env/MAT/meshStandardBuilder1/checkers1\n\tvec2 v_POLY_checkers1_coord = v_POLY_floatToVec2_1_vec2*vec2(1.0, 1.0)*1.0;\n\tfloat v_POLY_checkers1_checker = checkersGrad(v_POLY_checkers1_coord, dFdx(v_POLY_checkers1_coord), dFdy(v_POLY_checkers1_coord));\n\t\n\t// /env/MAT/meshStandardBuilder1/mix1\n\tvec3 v_POLY_mix1_mix = mix(v_POLY_constant1_val, v_POLY_constant2_val, v_POLY_checkers1_checker);\n\t\n\t// /env/MAT/meshStandardBuilder1/output1\n\tdiffuseColor.xyz = v_POLY_mix1_mix;\n\tfloat POLY_metalness = 1.0;\n\tfloat POLY_roughness = 1.0;\n\tvec3 POLY_emissive = vec3(1.0, 1.0, 1.0);\n\tSSSModel POLY_SSSModel = SSSModel(/*isActive*/false,/*color*/vec3(1.0, 1.0, 1.0), /*thickness*/0.1, /*power*/2.0, /*scale*/16.0, /*distortion*/0.1,/*ambient*/0.4,/*attenuation*/0.8 );\n\n\n\n\n\t// INSERT BODY\n\t// the new body lines should be added before the alphatest_fragment\n\t// so that alpha is set before (which is really how it would be set if the alphamap_fragment above was used by the material node parameters)\n\n\t#include <alphatest_fragment>\n\n\t#include <logdepthbuf_fragment>\n\n\n\t// Higher precision equivalent of gl_FragCoord.z. This assumes depthRange has been left to its default values.\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), diffuseColor.a );\n\n\t#elif DEPTH_PACKING == 3201\n\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\n\t#endif\n\n}\n","customDistanceMaterial.vertex":"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n\n\n\n// /env/MAT/meshStandardBuilder1/globals1\nvarying vec3 v_POLY_globals1_position;\n\n\n\n\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n// removed:\n//\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n// removed:\n//\t#include <begin_vertex>\n\n\n\n\t// /env/MAT/meshStandardBuilder1/globals1\n\tv_POLY_globals1_position = vec3(position);\n\t\n\t// /env/MAT/meshStandardBuilder1/output1\n\tvec3 transformed = position;\n\tvec3 objectNormal = normal;\n\t#ifdef USE_TANGENT\n\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t#endif\n\n\n\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition.xyz;\n}","customDistanceMaterial.fragment":"\n// INSERT DEFINES\n\n#define DISTANCE\n\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n\n#include <common>\n\n\n\n// /env/MAT/meshStandardBuilder1/checkers1\n// https://iquilezles.org/articles/checkerfiltering/\nfloat checkers(vec2 p) {\n\tvec2 s = sign(fract(p*.5)-.5);\n\treturn .5 - .5*s.x*s.y;\n}\nfloat checkersGrad( in vec2 p, in vec2 ddx, in vec2 ddy )\n{\n // filter kernel\n vec2 w = max(abs(ddx), abs(ddy)) + 0.01;\n // analytical integral (box filter)\n vec2 i = 2.0*(abs(fract((p-0.5*w)/2.0)-0.5)-abs(fract((p+0.5*w)/2.0)-0.5))/w;\n // xor pattern\n return 0.5 - 0.5*i.x*i.y;\n}\n\n\n\n\n\n\n\n\n// /env/MAT/meshStandardBuilder1/globals1\nvarying vec3 v_POLY_globals1_position;\n\n\n\n\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nstruct SSSModel {\n\tbool isActive;\n\tvec3 color;\n\tfloat thickness;\n\tfloat power;\n\tfloat scale;\n\tfloat distortion;\n\tfloat ambient;\n\tfloat attenuation;\n};\n\nvoid RE_Direct_Scattering(\n\tconst in IncidentLight directLight,\n\tconst in GeometricContext geometry,\n\tconst in SSSModel sssModel,\n\tinout ReflectedLight reflectedLight\n\t){\n\tvec3 scatteringHalf = normalize(directLight.direction + (geometry.normal * sssModel.distortion));\n\tfloat scatteringDot = pow(saturate(dot(geometry.viewDir, -scatteringHalf)), sssModel.power) * sssModel.scale;\n\tvec3 scatteringIllu = (scatteringDot + sssModel.ambient) * (sssModel.color * (1.0-sssModel.thickness));\n\treflectedLight.directDiffuse += scatteringIllu * sssModel.attenuation * directLight.color;\n}\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\n\n\n\t// /env/MAT/meshStandardBuilder1/constant1\n\tvec3 v_POLY_constant1_val = vec3(0.24313725490196078, 0.5098039215686274, 0.8549019607843137);\n\t\n\t// /env/MAT/meshStandardBuilder1/constant2\n\tvec3 v_POLY_constant2_val = vec3(0.047058823529411764, 0.10196078431372549, 0.17647058823529413);\n\t\n\t// /env/MAT/meshStandardBuilder1/vec3ToFloat1\n\tfloat v_POLY_vec3ToFloat1_x = v_POLY_globals1_position.x;\n\tfloat v_POLY_vec3ToFloat1_z = v_POLY_globals1_position.z;\n\t\n\t// /env/MAT/meshStandardBuilder1/floatToVec2_1\n\tvec2 v_POLY_floatToVec2_1_vec2 = vec2(v_POLY_vec3ToFloat1_x, v_POLY_vec3ToFloat1_z);\n\t\n\t// /env/MAT/meshStandardBuilder1/checkers1\n\tvec2 v_POLY_checkers1_coord = v_POLY_floatToVec2_1_vec2*vec2(1.0, 1.0)*1.0;\n\tfloat v_POLY_checkers1_checker = checkersGrad(v_POLY_checkers1_coord, dFdx(v_POLY_checkers1_coord), dFdy(v_POLY_checkers1_coord));\n\t\n\t// /env/MAT/meshStandardBuilder1/mix1\n\tvec3 v_POLY_mix1_mix = mix(v_POLY_constant1_val, v_POLY_constant2_val, v_POLY_checkers1_checker);\n\t\n\t// /env/MAT/meshStandardBuilder1/output1\n\tdiffuseColor.xyz = v_POLY_mix1_mix;\n\tfloat POLY_metalness = 1.0;\n\tfloat POLY_roughness = 1.0;\n\tvec3 POLY_emissive = vec3(1.0, 1.0, 1.0);\n\tSSSModel POLY_SSSModel = SSSModel(/*isActive*/false,/*color*/vec3(1.0, 1.0, 1.0), /*thickness*/0.1, /*power*/2.0, /*scale*/16.0, /*distortion*/0.1,/*ambient*/0.4,/*attenuation*/0.8 );\n\n\n\n\n\t// INSERT BODY\n\n\t#include <alphatest_fragment>\n\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist ); // clamp to [ 0, 1 ]\n\n\tgl_FragColor = packDepthToRGBA( dist );\n\n}\n","customDepthDOFMaterial.vertex":"#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n\n\n\n// /env/MAT/meshStandardBuilder1/globals1\nvarying vec3 v_POLY_globals1_position;\n\n\n\n\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n// removed:\n//\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n// removed:\n//\t#include <begin_vertex>\n\n\n\n\t// /env/MAT/meshStandardBuilder1/globals1\n\tv_POLY_globals1_position = vec3(position);\n\t\n\t// /env/MAT/meshStandardBuilder1/output1\n\tvec3 transformed = position;\n\tvec3 objectNormal = normal;\n\t#ifdef USE_TANGENT\n\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t#endif\n\n\n\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvHighPrecisionZW = gl_Position.zw;\n}","customDepthDOFMaterial.fragment":"\n// INSERT DEFINES\n\n\n#if DEPTH_PACKING == 3200\n\n\tuniform float opacity;\n\n#endif\n\n#include <common>\n\n\n\n// /env/MAT/meshStandardBuilder1/checkers1\n// https://iquilezles.org/articles/checkerfiltering/\nfloat checkers(vec2 p) {\n\tvec2 s = sign(fract(p*.5)-.5);\n\treturn .5 - .5*s.x*s.y;\n}\nfloat checkersGrad( in vec2 p, in vec2 ddx, in vec2 ddy )\n{\n // filter kernel\n vec2 w = max(abs(ddx), abs(ddy)) + 0.01;\n // analytical integral (box filter)\n vec2 i = 2.0*(abs(fract((p-0.5*w)/2.0)-0.5)-abs(fract((p+0.5*w)/2.0)-0.5))/w;\n // xor pattern\n return 0.5 - 0.5*i.x*i.y;\n}\n\n\n\n\n\n\n\n\n// /env/MAT/meshStandardBuilder1/globals1\nvarying vec3 v_POLY_globals1_position;\n\n\n\n\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvarying vec2 vHighPrecisionZW;\n\nstruct SSSModel {\n\tbool isActive;\n\tvec3 color;\n\tfloat thickness;\n\tfloat power;\n\tfloat scale;\n\tfloat distortion;\n\tfloat ambient;\n\tfloat attenuation;\n};\n\nvoid RE_Direct_Scattering(\n\tconst in IncidentLight directLight,\n\tconst in GeometricContext geometry,\n\tconst in SSSModel sssModel,\n\tinout ReflectedLight reflectedLight\n\t){\n\tvec3 scatteringHalf = normalize(directLight.direction + (geometry.normal * sssModel.distortion));\n\tfloat scatteringDot = pow(saturate(dot(geometry.viewDir, -scatteringHalf)), sssModel.power) * sssModel.scale;\n\tvec3 scatteringIllu = (scatteringDot + sssModel.ambient) * (sssModel.color * (1.0-sssModel.thickness));\n\treflectedLight.directDiffuse += scatteringIllu * sssModel.attenuation * directLight.color;\n}\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tdiffuseColor.a = opacity;\n\n\t#endif\n\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\n\n\n\t// /env/MAT/meshStandardBuilder1/constant1\n\tvec3 v_POLY_constant1_val = vec3(0.24313725490196078, 0.5098039215686274, 0.8549019607843137);\n\t\n\t// /env/MAT/meshStandardBuilder1/constant2\n\tvec3 v_POLY_constant2_val = vec3(0.047058823529411764, 0.10196078431372549, 0.17647058823529413);\n\t\n\t// /env/MAT/meshStandardBuilder1/vec3ToFloat1\n\tfloat v_POLY_vec3ToFloat1_x = v_POLY_globals1_position.x;\n\tfloat v_POLY_vec3ToFloat1_z = v_POLY_globals1_position.z;\n\t\n\t// /env/MAT/meshStandardBuilder1/floatToVec2_1\n\tvec2 v_POLY_floatToVec2_1_vec2 = vec2(v_POLY_vec3ToFloat1_x, v_POLY_vec3ToFloat1_z);\n\t\n\t// /env/MAT/meshStandardBuilder1/checkers1\n\tvec2 v_POLY_checkers1_coord = v_POLY_floatToVec2_1_vec2*vec2(1.0, 1.0)*1.0;\n\tfloat v_POLY_checkers1_checker = checkersGrad(v_POLY_checkers1_coord, dFdx(v_POLY_checkers1_coord), dFdy(v_POLY_checkers1_coord));\n\t\n\t// /env/MAT/meshStandardBuilder1/mix1\n\tvec3 v_POLY_mix1_mix = mix(v_POLY_constant1_val, v_POLY_constant2_val, v_POLY_checkers1_checker);\n\t\n\t// /env/MAT/meshStandardBuilder1/output1\n\tdiffuseColor.xyz = v_POLY_mix1_mix;\n\tfloat POLY_metalness = 1.0;\n\tfloat POLY_roughness = 1.0;\n\tvec3 POLY_emissive = vec3(1.0, 1.0, 1.0);\n\tSSSModel POLY_SSSModel = SSSModel(/*isActive*/false,/*color*/vec3(1.0, 1.0, 1.0), /*thickness*/0.1, /*power*/2.0, /*scale*/16.0, /*distortion*/0.1,/*ambient*/0.4,/*attenuation*/0.8 );\n\n\n\n\n\t// INSERT BODY\n\t// the new body lines should be added before the alphatest_fragment\n\t// so that alpha is set before (which is really how it would be set if the alphamap_fragment above was used by the material node parameters)\n\n\t#include <alphatest_fragment>\n\n\t#include <logdepthbuf_fragment>\n\n\n\t// Higher precision equivalent of gl_FragCoord.z. This assumes depthRange has been left to its default values.\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), diffuseColor.a );\n\n\t#elif DEPTH_PACKING == 3201\n\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\n\t#endif\n\n}\n"}},"jsFunctionBodies":{"/geo1/actor_for_each_line":"// insert defines\nclass CustomActorEvaluator extends ActorEvaluator {\n\t// insert members\n\n\t// /geo1/actor_for_each_line/getObjectProperty1\n\tv_POLY_getObjectProperty1_position = computed(() => getObjectProperty(this.object3D, \"position\"));\n\n\t// /geo1/actor_for_each_line/getParent1\n\tv_POLY_getParent1_Object3D = computed(() => getParent(this.object3D));\n\n\t// /geo1/actor_for_each_line/getObjectAttribute2\n\tv_POLY_getObjectAttribute2_val = computed(() => getObjectAttribute(this.object3D, \"idn\", \"float\", 0.0));\n\n\t// /geo1/actor_for_each_line/onTick2\n\tv_POLY_onTick2_time = computed(() => globalsTime());\n\tv_POLY_onTick2_delta = computed(() => globalsTimeDelta());\n\n\t// /geo1/actor_for_each_line/getObject1\n\tv_POLY_getObject1_Object3D = computed(() => getObject(this.object3D, false, \"*/rhino\"));\n\n\t// /geo1/actor_for_each_line/getObjectAttribute1\n\tv_POLY_getObjectAttribute1_val = computed(() =>\n\t\tgetObjectAttribute(\n\t\t\tthis.v_POLY_getParent1_Object3D.value,\n\t\t\tthis.v_POLY_constant2_val.value,\n\t\t\t\"Vector3\",\n\t\t\tVAR__getObjectAttribute1_defaultVector3.set(0, 0, 0)\n\t\t)\n\t);\n\n\t// /geo1/actor_for_each_line/rand2\n\tv_POLY_rand2_rand = computed(() => mathFloat_2(rand, this.v_POLY_getObjectAttribute2_val.value, 18.08));\n\n\t// /geo1/actor_for_each_line/rand1\n\tv_POLY_rand1_rand = computed(() => mathFloat_2(rand, this.v_POLY_getObjectAttribute2_val.value, 0.0));\n\n\t// /geo1/actor_for_each_line/multAdd2\n\tv_POLY_multAdd2_val = computed(() => mathFloat_4(multAdd, this.v_POLY_onTick2_time.value, 0.0, 4.0, 0.0));\n\n\t// /geo1/actor_for_each_line/onObjectAttributeUpdate1\n\tv_POLY_onObjectAttributeUpdate1_newValue = computed(() =>\n\t\tgetObjectAttributeAutoDefault(this.object3D, this.v_POLY_constant3_val.value, \"Vector3\")\n\t);\n\n\t// /geo1/actor_for_each_line/multAdd5\n\tv_POLY_multAdd5_val = computed(() => mathFloat_4(multAdd, this.v_POLY_rand2_rand.value, 0.0, 51.0, 0.0));\n\n\t// /geo1/actor_for_each_line/multAdd4\n\tv_POLY_multAdd4_val = computed(() => mathFloat_4(multAdd, this.v_POLY_rand1_rand.value, 0.0, 12.0, 0.0));\n\n\t// /geo1/actor_for_each_line/add3\n\tv_POLY_add3_sum = computed(() => addNumber(this.v_POLY_multAdd5_val.value, this.v_POLY_multAdd2_val.value, 0.0));\n\n\t// /geo1/actor_for_each_line/add1\n\tv_POLY_add1_sum = computed(() => addNumber(this.v_POLY_multAdd4_val.value, this.v_POLY_multAdd2_val.value, 0.0));\n\n\t// /geo1/actor_for_each_line/cos1\n\tv_POLY_cos1_cos = computed(() => mathFloat_1(Math.cos, this.v_POLY_add3_sum.value));\n\n\t// /geo1/actor_for_each_line/sin1\n\tv_POLY_sin1_sin = computed(() => mathFloat_1(Math.sin, this.v_POLY_add1_sum.value));\n\n\t// /geo1/actor_for_each_line/multAdd3\n\tv_POLY_multAdd3_val = computed(() => mathFloat_4(multAdd, this.v_POLY_cos1_cos.value, 0.0, 0.03, 0.0));\n\n\t// /geo1/actor_for_each_line/multAdd1\n\tv_POLY_multAdd1_val = computed(() => mathFloat_4(multAdd, this.v_POLY_sin1_sin.value, 0.0, 0.04, 0.0));\n\n\t// /geo1/actor_for_each_line/floatToVec3_1\n\tv_POLY_floatToVec3_1_vec3 = computed(() =>\n\t\tfloatToVec3(this.v_POLY_multAdd3_val.value, this.v_POLY_multAdd1_val.value, 0.0, VAR__floatToVec3_1_)\n\t);\n\n\t// /geo1/actor_for_each_line/add2\n\tv_POLY_add2_sum = computed(() =>\n\t\taddVector(\n\t\t\tVAR__add2_add0.copy(this.v_POLY_getObjectAttribute1_val.value),\n\t\t\tVAR__add2_add1.copy(this.v_POLY_floatToVec3_1_vec3.value),\n\t\t\tVAR__add2_add2.set(0, 0, 0)\n\t\t)\n\t);\n\n\t// /geo1/actor_for_each_line/subtract1\n\tv_POLY_subtract1_sub = computed(() =>\n\t\tsubtractVector(\n\t\t\tVAR__subtract1_sub0.copy(this.v_POLY_add2_sum.value),\n\t\t\tVAR__subtract1_sub1.copy(this.v_POLY_getObjectProperty1_position.value),\n\t\t\tVAR__subtract1_sub2.set(0, 0, 0)\n\t\t)\n\t);\n\n\t// /geo1/actor_for_each_line/multScalar1\n\tv_POLY_multScalar1_val = computed(() =>\n\t\tmultScalarVector3(VAR__multScalar1_value.copy(this.v_POLY_subtract1_sub.value), 100.0, VAR__multScalar1__1)\n\t);\n\n\t// /geo1/actor_for_each_line/ray1\n\tv_POLY_ray1_Ray = computed(() =>\n\t\traySet(\n\t\t\tVAR__ray1_origin.copy(this.v_POLY_getObjectProperty1_position.value),\n\t\t\tVAR__ray1_direction.copy(this.v_POLY_multScalar1_val.value),\n\t\t\tVAR__ray1__2\n\t\t)\n\t);\n\n\t// /geo1/actor_for_each_line/add4\n\tv_POLY_add4_sum = computed(() =>\n\t\taddVector(\n\t\t\tVAR__add4_add0.copy(this.v_POLY_getObjectProperty1_position.value),\n\t\t\tVAR__add4_add1.copy(this.v_POLY_multScalar1_val.value),\n\t\t\tVAR__add4_add2.set(0, 0, 0)\n\t\t)\n\t);\n\n\t// /geo1/actor_for_each_line/rayIntersectObject1\n\tv_POLY_rayIntersectObject1_Intersection = computed(() =>\n\t\trayIntersectObject3D(this.v_POLY_ray1_Ray.value, this.v_POLY_getObject1_Object3D.value, false)\n\t);\n\n\t// /geo1/actor_for_each_line/getIntersectionProperty1\n\tv_POLY_getIntersectionProperty1_point = computed(() =>\n\t\tgetIntersectionPropertyPoint(this.v_POLY_rayIntersectObject1_Intersection.value, VAR__getIntersectionProperty1_)\n\t);\n\n\t// /geo1/actor_for_each_line/length1\n\tv_POLY_length1_val = computed(() =>\n\t\tlengthVector(VAR__length1_v.copy(this.v_POLY_getIntersectionProperty1_point.value))\n\t);\n\n\t// /geo1/actor_for_each_line/subtract3\n\tv_POLY_subtract3_sub = computed(() =>\n\t\tsubtractVector(\n\t\t\tVAR__subtract3_sub0.copy(this.v_POLY_getIntersectionProperty1_point.value),\n\t\t\tVAR__subtract3_sub1.copy(this.v_POLY_getObjectProperty1_position.value),\n\t\t\tVAR__subtract3_sub2.set(0, 0, 0)\n\t\t)\n\t);\n\n\t// /geo1/actor_for_each_line/compare1\n\tv_POLY_compare1_val = computed(() => this.v_POLY_length1_val.value > 0.04);\n\n\t// /geo1/actor_for_each_line/twoWaySwitch1\n\tv_POLY_twoWaySwitch1_val = computed(() =>\n\t\tthis.v_POLY_compare1_val.value\n\t\t\t? VAR__twoWaySwitch1_ifTrue.copy(this.v_POLY_subtract3_sub.value)\n\t\t\t: VAR__twoWaySwitch1_ifFalse.copy(this.v_POLY_add4_sum.value)\n\t);\n\n\t// /geo1/actor_for_each_line/onTick1\n\tv_POLY_onTick1_time = computed(() => globalsTime());\n\tv_POLY_onTick1_delta = computed(() => globalsTimeDelta());\n\n\t// /geo1/actor_for_each_line/constant2\n\tv_POLY_constant2_val = { value: \"rayHit\" };\n\n\t// /geo1/actor_for_each_line/constant3\n\tv_POLY_constant3_val = { value: \"rayHit\" };\n\n\t// /geo1/actor_for_each_line/constant5\n\tv_POLY_constant5_val = { value: \"destPos\" };\n\n\tconstructor(node, object3D) {\n\t\tsuper(node, object3D);\n\t\t// insert after constructor\n\n\t\t// /geo1/actor_for_each_line/onObjectAttributeUpdate1\n\n\t\tthis._watchStopHandles.push(\n\t\t\twatch(\n\t\t\t\tgetObjectAttributeRef(this.object3D, this.v_POLY_constant3_val.value, \"Vector3\"),\n\t\t\t\t() => {\n\t\t\t\t\tthis.onObjectAttributeUpdate1();\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tdeep: true,\n\t\t\t\t}\n\t\t\t)\n\t\t);\n\t}\n\t// insert body\n\n\tonTick() {\n\t\tthis.onTick1();\n\t}\n\t// /geo1/actor_for_each_line/onObjectAttributeUpdate1\n\tonObjectAttributeUpdate1() {\n\t\tthis.setMaterialUniform1(0);\n\t}\n\n\t// /geo1/actor_for_each_line/onTick1\n\tonTick1() {\n\t\tthis.triggerFilter1(0);\n\t}\n\n\t// /geo1/actor_for_each_line/triggerFilter1\n\ttriggerFilter1() {\n\t\tif (this.v_POLY_compare1_val.value == false) {\n\t\t\treturn;\n\t\t}\n\t\tthis.setObjectAttribute1(0);\n\t}\n\n\t// /geo1/actor_for_each_line/setObjectAttribute1\n\tsetObjectAttribute1() {\n\t\tsetObjectAttribute(\n\t\t\tthis.object3D,\n\t\t\tthis.v_POLY_constant3_val.value,\n\t\t\t1.0,\n\t\t\tVAR__setObjectAttribute1_val.copy(this.v_POLY_twoWaySwitch1_val.value),\n\t\t\t\"Vector3\"\n\t\t);\n\t}\n\n\t// /geo1/actor_for_each_line/setMaterialUniform1\n\tsetMaterialUniform1() {\n\t\tsetMaterialUniformVectorColor(\n\t\t\tthis.object3D.material,\n\t\t\tthis.v_POLY_constant5_val.value,\n\t\t\tVAR__setMaterialUniform1_Vector3.copy(this.v_POLY_onObjectAttributeUpdate1_newValue.value),\n\t\t\t1.0,\n\t\t\ttrue,\n\t\t\ttrue\n\t\t);\n\t}\n}\nreturn CustomActorEvaluator;\n","/geo1/actor_for_lines_parent":"// insert defines\nclass CustomActorEvaluator extends ActorEvaluator {\n\t// insert members\n\n\t// /geo1/actor_for_lines_parent/rayFromCursor1\n\tv_POLY_rayFromCursor1_Ray = computed(() => globalsRayFromCursor());\n\n\t// /geo1/actor_for_lines_parent/getObject1\n\tv_POLY_getObject1_Object3D = computed(() => getObject(this.object3D, false, \"*/rhino\"));\n\n\t// /geo1/actor_for_lines_parent/rayIntersectObject1\n\tv_POLY_rayIntersectObject1_Intersection = computed(() =>\n\t\trayIntersectObject3D(this.v_POLY_rayFromCursor1_Ray.value, this.v_POLY_getObject1_Object3D.value, false)\n\t);\n\n\t// /geo1/actor_for_lines_parent/getIntersectionProperty1\n\tv_POLY_getIntersectionProperty1_point = computed(() =>\n\t\tgetIntersectionPropertyPoint(this.v_POLY_rayIntersectObject1_Intersection.value, VAR__getIntersectionProperty1_)\n\t);\n\n\t// /geo1/actor_for_lines_parent/length1\n\tv_POLY_length1_val = computed(() =>\n\t\tlengthVector(VAR__length1_v.copy(this.v_POLY_getIntersectionProperty1_point.value))\n\t);\n\n\t// /geo1/actor_for_lines_parent/compare1\n\tv_POLY_compare1_val = computed(() => this.v_POLY_length1_val.value > 0.02);\n\n\t// /geo1/actor_for_lines_parent/onTick1\n\tv_POLY_onTick1_time = computed(() => globalsTime());\n\tv_POLY_onTick1_delta = computed(() => globalsTimeDelta());\n\n\t// /geo1/actor_for_lines_parent/constant2\n\tv_POLY_constant2_val = { value: \"rayHit\" };\n\n\tconstructor(node, object3D) {\n\t\tsuper(node, object3D);\n\t\t// insert after constructor\n\t}\n\t// insert body\n\n\tonTick() {\n\t\tthis.onTick1();\n\t}\n\t// /geo1/actor_for_lines_parent/onTick1\n\tonTick1() {\n\t\tthis.triggerFilter1(0);\n\t}\n\n\t// /geo1/actor_for_lines_parent/triggerFilter1\n\ttriggerFilter1() {\n\t\tif (this.v_POLY_compare1_val.value == false) {\n\t\t\treturn;\n\t\t}\n\t\tthis.setObjectAttribute1(0);\n\t}\n\n\t// /geo1/actor_for_lines_parent/setObjectAttribute1\n\tsetObjectAttribute1() {\n\t\tsetObjectAttribute(\n\t\t\tthis.object3D,\n\t\t\tthis.v_POLY_constant2_val.value,\n\t\t\t0.18,\n\t\t\tVAR__setObjectAttribute1_val.copy(this.v_POLY_getIntersectionProperty1_point.value),\n\t\t\t\"Vector3\"\n\t\t);\n\t}\n}\nreturn CustomActorEvaluator;\n","/geo1/actor1":"// insert defines\nclass CustomActorEvaluator extends ActorEvaluator {\n\t// insert members\n\n\t// /geo1/actor1/getObject1\n\tv_POLY_getObject1_Object3D = computed(() => getObject(this.object3D, false, \" /geo1/geo1:sopGroup/linesParent\"));\n\n\t// /geo1/actor1/onTick2\n\tv_POLY_onTick2_time = computed(() => globalsTime());\n\tv_POLY_onTick2_delta = computed(() => globalsTimeDelta());\n\n\t// /geo1/actor1/getObjectAttribute1\n\tv_POLY_getObjectAttribute1_val = computed(() =>\n\t\tgetObjectAttribute(\n\t\t\tthis.v_POLY_getObject1_Object3D.value,\n\t\t\tthis.v_POLY_constant2_val.value,\n\t\t\t\"Vector3\",\n\t\t\tVAR__getObjectAttribute1_defaultVector3.set(0, 0, 0)\n\t\t)\n\t);\n\n\t// /geo1/actor1/floatToVec3_1\n\tv_POLY_floatToVec3_1_vec3 = computed(() =>\n\t\tfloatToVec3(0.0, this.v_POLY_onTick2_time.value, 0.0, VAR__floatToVec3_1_)\n\t);\n\n\t// /geo1/actor1/noiseImproved1\n\tv_POLY_noiseImproved1_noise = computed(() =>\n\t\tnoiseImprovedVector3(\n\t\t\tVAR__noiseImproved1_position.copy(this.v_POLY_floatToVec3_1_vec3.value),\n\t\t\t0.32,\n\t\t\tVAR__noiseImproved1_freq.set(4, 4, 4),\n\t\t\tVAR__noiseImproved1_offset.set(0, 0, 0),\n\t\t\t3.0,\n\t\t\t0.5,\n\t\t\t2.0\n\t\t)\n\t);\n\n\t// /geo1/actor1/floatToVec3_2\n\tv_POLY_floatToVec3_2_vec3 = computed(() =>\n\t\tfloatToVec3(\n\t\t\tthis.v_POLY_noiseImproved1_noise.value,\n\t\t\tthis.v_POLY_noiseImproved1_noise.value,\n\t\t\tthis.v_POLY_noiseImproved1_noise.value,\n\t\t\tVAR__floatToVec3_2_\n\t\t)\n\t);\n\n\t// /geo1/actor1/add1\n\tv_POLY_add1_sum = computed(() =>\n\t\taddVector(\n\t\t\tVAR__add1_add0.copy(this.v_POLY_getObjectAttribute1_val.value),\n\t\t\tVAR__add1_add1.copy(this.v_POLY_floatToVec3_2_vec3.value),\n\t\t\tVAR__add1_add2.set(0, 0, 0)\n\t\t)\n\t);\n\n\t// /geo1/actor1/onTick1\n\tv_POLY_onTick1_time = computed(() => globalsTime());\n\tv_POLY_onTick1_delta = computed(() => globalsTimeDelta());\n\n\t// /geo1/actor1/constant2\n\tv_POLY_constant2_val = { value: \"rayHit\" };\n\n\tconstructor(node, object3D) {\n\t\tsuper(node, object3D);\n\t\t// insert after constructor\n\t}\n\t// insert body\n\n\tonTick() {\n\t\tthis.onTick1();\n\t}\n\t// /geo1/actor1/onTick1\n\tonTick1() {\n\t\tthis.setObjectPosition1(0);\n\t}\n\n\t// /geo1/actor1/setObjectPosition1\n\tsetObjectPosition1() {\n\t\tsetObjectPosition(this.object3D, VAR__setObjectPosition1_position.copy(this.v_POLY_add1_sum.value), 1.0, true);\n\t}\n}\nreturn CustomActorEvaluator;\n"},"embeddedPolyNodes":{"gl/laserColor":{"metadata":{"version":{"editor":"1.5.3-1","polygonjs":"1.5.3"},"createdAt":1696608084140},"nodeContext":"gl","inputs":{"typed":{"types":[{"name":"baseColor","type":"vec3"}]}},"params":[],"nodes":{"constant1":{"type":"constant","params":{"type":4,"color":[0.7011018919268015,0.018500220124016656,0.005181516700061659],"asColor":true},"connection_points":{"in":[],"out":[{"name":"val","type":"vec3"}]}},"attribute1":{"type":"attribute","params":{"name":"id"},"connection_points":{"in":[],"out":[{"name":"val","type":"float"}]}},"round1":{"type":"round","params":{"in":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"overriden_options":{}}},"inputs":[{"index":0,"inputName":"in","node":"attribute1","output":"val"}],"connection_points":{"in":[{"name":"in","type":"float"}],"out":[{"name":"val","type":"float"}]}},"random1":{"type":"random","params":{"seed":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"seed","node":"floatToVec2_1","output":"vec2"}]},"floatToVec2_1":{"type":"floatToVec2","params":{"x":{"overriden_options":{}},"y":{"raw_input":0.54,"overriden_options":{}}},"inputs":[{"index":0,"inputName":"x","node":"round1","output":"val"}]},"multAdd5":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":4.4},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"random1","output":"rand"}],"connection_points":{"in":[{"name":"value","type":"float"},{"name":"preAdd","type":"float"},{"name":"mult","type":"float"},{"name":"postAdd","type":"float"}],"out":[{"name":"val","type":"float"}]}},"constant2":{"type":"constant","params":{"type":4,"color":[0.6653872982754769,0.5583403896257968,0.005181516700061659],"asColor":true},"connection_points":{"in":[],"out":[{"name":"val","type":"vec3"}]}},"rgbToOklab1":{"type":"rgbToOklab","params":{"rgb":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"rgb","node":"constant2","output":"val"}]},"rgbToOklab2":{"type":"rgbToOklab","params":{"rgb":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"rgb","node":"constant1","output":"val"}]},"oklabToRgb1":{"type":"oklabToRgb","params":{"oklab":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"oklab","node":"mix1","output":"mix"}]},"mix1":{"type":"mix","params":{"value0":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"overriden_options":{}},"value1":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"blend":{"type":"float","default_value":0.5,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value0","node":"rgbToOklab1","output":"oklab"},{"index":1,"inputName":"value1","node":"rgbToOklab2","output":"oklab"},{"index":2,"inputName":"blend","node":"pow1","output":"val"}],"connection_points":{"in":[{"name":"value0","type":"vec3"},{"name":"value1","type":"vec3"},{"name":"blend","type":"float"}],"out":[{"name":"mix","type":"vec3"}]}},"pow1":{"type":"pow","params":{"x":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"y":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.27}},"inputs":[{"index":0,"inputName":"x","node":"random1","output":"rand"}],"connection_points":{"in":[{"name":"x","type":"float"},{"name":"y","type":"float"}],"out":[{"name":"val","type":"float"}]}},"subnetOutput1":{"type":"subnetOutput","inputs":[{"index":0,"inputName":"baseColor","node":"oklabToRgb1","output":"rgb"}],"connection_points":{"in":[{"name":"baseColor","type":"vec3"}],"out":[]}}},"ui":{"constant1":{"pos":[-550,400]},"attribute1":{"pos":[-800,650]},"round1":{"pos":[-650,650]},"random1":{"pos":[-400,650]},"floatToVec2_1":{"pos":[-550,650]},"multAdd5":{"pos":[-250,650]},"constant2":{"pos":[-550,200]},"rgbToOklab1":{"pos":[-350,200]},"rgbToOklab2":{"pos":[-350,400]},"oklabToRgb1":{"pos":[150,350]},"mix1":{"pos":[0,300]},"pow1":{"pos":[-200,450]},"subnetOutput1":{"pos":[300,300]}}}}}
Code editor
{"multiple_panel":{"split_ratio":0.5,"split_panel0":{"split_ratio":0.5543217692883486,"split_panel0":{"panelTypes":["viewer"],"currentPanelIndex":0,"panel_data":{"camera":"/cameras/cameras:sopGroup/perspectiveCamera1","isViewerInitLayoutData":true,"linkIndex":1,"overlayedNetwork":{"allowed":false,"displayed":false,"initLayoutData":{"camera":{"position":{"x":0,"y":0},"zoom":1},"history":{"2":{"position":{"x":0,"y":0},"zoom":1},"36":{"position":{"x":300,"y":-425},"zoom":1},"104":{"position":{"x":0,"y":-50},"zoom":1},"299":{"position":{"x":0,"y":-200},"zoom":1},"910":{"position":{"x":0,"y":0},"zoom":1},"913":{"position":{"x":0,"y":0},"zoom":1},"1026":{"position":{"x":-250,"y":75},"zoom":1},"2100":{"position":{"x":300,"y":-425},"zoom":1},"4945":{"position":{"x":0,"y":-50},"zoom":1},"5075":{"position":{"x":-50,"y":-325},"zoom":1}},"paramsDisplayed":false,"linkIndex":1}}}},"split_panel1":{"panelTypes":["params"],"currentPanelIndex":0,"panel_data":{"active_folder":null,"linkIndex":1}},"split_mode":"vertical"},"split_panel1":{"panelTypes":["network","params","viewer"],"currentPanelIndex":0,"panel_data":{"camera":{"position":{"x":-60.65218075353923,"y":0.978260979895794},"zoom":1.0222221069335933},"history":{"2":{"position":{"x":22.43683175060204,"y":167.39745353456354},"zoom":1.0222221069335933},"36":{"position":{"x":357.3897817112609,"y":-1405.6283403273815},"zoom":0.6032221069335929},"104":{"position":{"x":-45.000005075206516,"y":-329.78264025019706},"zoom":1.0222221069335933},"299":{"position":{"x":-190.6428804219207,"y":-410.5360505529037},"zoom":0.6352221069335929},"910":{"position":{"x":0,"y":0},"zoom":1.0222221069335933},"913":{"position":{"x":130.743275046037,"y":-324.1874453255788},"zoom":0.8202221069335931},"1026":{"position":{"x":-913.1056710327676,"y":136.337274570531},"zoom":0.6032221069335929},"2100":{"position":{"x":187.45471933471558,"y":-932.3478979039483},"zoom":0.4252221069335932},"2746":{"position":{"x":-60.65218075353923,"y":0.978260979895794},"zoom":1.0222221069335933},"4945":{"position":{"x":0,"y":-50},"zoom":1.0222221069335933},"5075":{"position":{"x":-89.13043919583176,"y":-325.9782609798958},"zoom":1.0222221069335933}},"paramsDisplayed":false,"linkIndex":1}},"split_mode":"horizontal"},"currentNodes":["/cameras/cameraPostProcess1","/","/","/","/","/","/","/"],"navigationHistory":{"nodePaths":{"1":["/geo1","/","/cameras","/","/geo1","/geo1/MAT","/geo1/MAT/lineBasicBuilder_LIGHTING","/geo1/MAT","/geo1","/","/cameras","/","/geo1","/geo1/MAT","/geo1/MAT/lineBasicBuilder_LIGHTING","/geo1/MAT","/geo1","/","/cameras","/cameras/cameraPostProcess1"],"2":["/"],"3":["/"],"4":["/"],"5":["/"],"6":["/"],"7":["/"],"8":["/"]},"index":{"1":19,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0}},"fullscreenPanelId":null,"saveOptions":{"createExport":false,"checkRemoteAssetsUse":true,"minimizeFilesCount":false,"compressJs":true,"createZip":false,"runPostExportCommand":false},"paramsModal":[]}
Used nodes
cop/envMap;cop/image;cop/imageEXR;event/cameraOrbitControls;mat/lineBasicBuilder;mat/meshStandard;mat/meshStandardBuilder;mat/pointsBuilder;mat/sky;obj/copNetwork;obj/geo;post/bloom;post/null;post/toneMapping;rop/WebGLRenderer;sop/BVH;sop/BVHVisualizer;sop/actor;sop/add;sop/areaLight;sop/attribCreate;sop/attribDelete;sop/attribId;sop/box;sop/cameraControls;sop/cameraPostProcess;sop/cameraRenderer;sop/circle;sop/copy;sop/delete;sop/fileGLTF;sop/hemisphereLight;sop/hierarchy;sop/jitter;sop/line;sop/material;sop/materialsNetwork;sop/merge;sop/objectProperties;sop/perspectiveCamera;sop/pointLight;sop/polarTransform;sop/sphere;sop/spotLight;sop/transform;sop/tube
Used operations
Used modules
Used assemblers
GL_LINE;GL_MESH_STANDARD;GL_POINTS;JS_ACTOR
Used integrations
[]
Used assets
Nodes map
{"/geo1":"obj/geo","/geo1/MAT":"sop/materialsNetwork","/geo1/MAT/meshStandard_RHINO":"mat/meshStandard","/geo1/MAT/pointsBuilder1":"mat/pointsBuilder","/geo1/MAT/lineBasicBuilder_LIGHTING":"mat/lineBasicBuilder","/geo1/circle1":"sop/circle","/geo1/line1":"sop/line","/geo1/copy1":"sop/copy","/geo1/attribDelete1":"sop/attribDelete","/geo1/merge1":"sop/merge","/geo1/objectProperties2":"sop/objectProperties","/geo1/hierarchy2":"sop/hierarchy","/geo1/actor_for_each_line":"sop/actor","/geo1/actor_for_lines_parent":"sop/actor","/geo1/attribCreate1":"sop/attribCreate","/geo1/attribId1":"sop/attribId","/geo1/add1":"sop/add","/geo1/merge2":"sop/merge","/geo1/hierarchy3":"sop/hierarchy","/geo1/material2":"sop/material","/geo1/attribCreate2":"sop/attribCreate","/geo1/jitter1":"sop/jitter","/geo1/delete1":"sop/delete","/geo1/delete2":"sop/delete","/geo1/attribId2":"sop/attribId","/geo1/material3":"sop/material","/geo1/pointLight1":"sop/pointLight","/geo1/actor1":"sop/actor","/geo1/objectProperties4":"sop/objectProperties","/geo1/fileGLTF1":"sop/fileGLTF","/geo1/transform1":"sop/transform","/geo1/hierarchy1":"sop/hierarchy","/geo1/BVHVisualizer1":"sop/BVHVisualizer","/geo1/objectProperties1":"sop/objectProperties","/geo1/objectProperties3":"sop/objectProperties","/geo1/tube1":"sop/tube","/geo1/circle2":"sop/circle","/geo1/copy2":"sop/copy","/geo1/merge3":"sop/merge","/geo1/BVH1":"sop/BVH","/geo1/material1":"sop/material","/geo1/merge4":"sop/merge","/geo1/attribDelete2":"sop/attribDelete","/COP":"obj/copNetwork","/COP/envMap":"cop/envMap","/COP/imageEnv":"cop/imageEXR","/COP/image1":"cop/image","/cameras":"obj/geo","/cameras/perspectiveCamera1":"sop/perspectiveCamera","/cameras/cameraControls1":"sop/cameraControls","/cameras/cameraControls1/cameraOrbitControls1":"event/cameraOrbitControls","/cameras/cameraPostProcess1":"sop/cameraPostProcess","/cameras/cameraPostProcess1/bloom1":"post/bloom","/cameras/cameraPostProcess1/toneMapping1":"post/toneMapping","/cameras/cameraPostProcess1/OUT":"post/null","/cameras/cameraRenderer1":"sop/cameraRenderer","/cameras/cameraRenderer1/WebGLRenderer1":"rop/WebGLRenderer","/env":"obj/geo","/env/material1":"sop/material","/env/MAT":"sop/materialsNetwork","/env/MAT/meshStandardBuilder1":"mat/meshStandardBuilder","/env/MAT/sky1":"mat/sky","/env/box1":"sop/box","/env/sphere1":"sop/sphere","/env/material2":"sop/material","/env/merge1":"sop/merge","/env/transform1":"sop/transform","/lights":"obj/geo","/lights/hemisphereLight1":"sop/hemisphereLight","/lights/polarTransform1":"sop/polarTransform","/lights/merge1":"sop/merge","/lights/areaLight1":"sop/areaLight","/lights/spotLight1":"sop/spotLight","/lights/merge2":"sop/merge","/lights/polarTransform2":"sop/polarTransform"}
Js version
Editor version
Engine version
Name
*
Code
{"properties":{"frame":0,"maxFrame":600,"maxFrameLocked":false,"realtimeState":true,"mainCameraPath":"/cameras/cameras:sopGroup/perspectiveCamera1","versions":{"polygonjs":"1.5.5"}},"root":{"type":"root","nodes":{"geo1":{"type":"geo","nodes":{"MAT":{"type":"materialsNetwork","nodes":{"meshStandard_RHINO":{"type":"meshStandard"},"pointsBuilder1":{"type":"pointsBuilder","nodes":{"globals1":{"type":"globals"},"output1":{"type":"output","inputs":[null,null,{"index":2,"inputName":"color","node":"laserColor1","output":"baseColor"},{"index":3,"inputName":"alpha","node":"multAdd6","output":"val"},null,{"index":5,"inputName":"gl_PointSize","node":"multAdd4","output":"val"}]},"disk1":{"type":"disk","params":{"position":{"overriden_options":{}},"center":{"raw_input":[0.5,0.5],"overriden_options":{}},"radius":{"raw_input":0.2,"overriden_options":{}},"feather":{"raw_input":0.24,"overriden_options":{}}},"inputs":[{"index":0,"inputName":"position","node":"globals1","output":"gl_PointCoord"}]},"constant1":{"type":"constant","params":{"float":0.03},"connection_points":{"in":[],"out":[{"name":"val","type":"float"}]}},"multAdd1":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":6},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"globals1","output":"time"}],"connection_points":{"in":[{"name":"value","type":"float"},{"name":"preAdd","type":"float"},{"name":"mult","type":"float"},{"name":"postAdd","type":"float"}],"out":[{"name":"val","type":"float"}]}},"attribute1":{"type":"attribute","params":{"name":"id"},"connection_points":{"in":[],"out":[{"name":"val","type":"float"}]}},"round1":{"type":"round","params":{"in":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"in","node":"attribute1","output":"val"}],"connection_points":{"in":[{"name":"in","type":"float"}],"out":[{"name":"val","type":"float"}]}},"random1":{"type":"random","params":{"seed":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"seed","node":"floatToVec2_1","output":"vec2"}]},"floatToVec2_1":{"type":"floatToVec2","params":{"x":{"overriden_options":{}},"y":{"raw_input":0.54,"overriden_options":{}}},"inputs":[{"index":0,"inputName":"x","node":"round1","output":"val"}]},"multAdd2":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"multAdd5","output":"val"},{"index":1,"inputName":"preAdd","node":"multAdd1","output":"val"}],"connection_points":{"in":[{"name":"value","type":"float"},{"name":"preAdd","type":"float"},{"name":"mult","type":"float"},{"name":"postAdd","type":"float"}],"out":[{"name":"val","type":"float"}]}},"cos1":{"type":"cos","params":{"radians":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"radians","node":"multAdd2","output":"val"}],"connection_points":{"in":[{"name":"radians","type":"float"}],"out":[{"name":"val","type":"float"}]}},"multAdd3":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"cos1","output":"val"}],"connection_points":{"in":[{"name":"value","type":"float"},{"name":"preAdd","type":"float"},{"name":"mult","type":"float"},{"name":"postAdd","type":"float"}],"out":[{"name":"val","type":"float"}]}},"fit1":{"type":"fit","params":{"val":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"srcMin":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":-1},"srcMax":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"destMin":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.22},"destMax":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"val","node":"cos1","output":"val"}],"connection_points":{"in":[{"name":"val","type":"float"},{"name":"srcMin","type":"float"},{"name":"srcMax","type":"float"},{"name":"destMin","type":"float"},{"name":"destMax","type":"float"}],"out":[{"name":"val","type":"float"}]}},"multAdd4":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"fit1","output":"val"},null,{"index":2,"inputName":"mult","node":"constant1","output":"val"}],"connection_points":{"in":[{"name":"value","type":"float"},{"name":"preAdd","type":"float"},{"name":"mult","type":"float"},{"name":"postAdd","type":"float"}],"out":[{"name":"val","type":"float"}]}},"multAdd5":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":4.4},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"random1","output":"rand"}],"connection_points":{"in":[{"name":"value","type":"float"},{"name":"preAdd","type":"float"},{"name":"mult","type":"float"},{"name":"postAdd","type":"float"}],"out":[{"name":"val","type":"float"}]}},"laserColor1":{"type":"laserColor","polyNode":{"locked":true},"params":{"baseColor":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"connection_points":{"in":[{"name":"baseColor","type":"vec3"}],"out":[{"name":"baseColor","type":"vec3"}]}},"multAdd6":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.33},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"disk1","output":"float"}],"connection_points":{"in":[{"name":"value","type":"float"},{"name":"preAdd","type":"float"},{"name":"mult","type":"float"},{"name":"postAdd","type":"float"}],"out":[{"name":"val","type":"float"}]}}},"params":{"transparent":true,"alphaTest":0.07,"blending":2},"persisted_config":{"material":{"metadata":{"version":4.5,"type":"Material","generator":"Material.toJSON"},"uuid":"/geo1/MAT/pointsBuilder1-main","type":"PointsMaterial","color":16777215,"size":1,"sizeAttenuation":true,"blending":2,"transparent":true,"depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"alphaTest":0.07,"fog":false},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[],"timeDependent":true,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false},"customMaterials":{"customDistanceMaterial":{"material":{"metadata":{"version":4.5,"type":"Material","generator":"Material.toJSON"},"uuid":"/geo1/MAT/pointsBuilder1-customDistanceMaterial","type":"ShaderMaterial","name":"customDistanceMaterial","depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"alphaTest":0.07,"forceSinglePass":true,"fog":false,"glslVersion":null,"uniforms":{"diffuse":{"type":"c","value":16777215},"opacity":{"value":1},"map":{"value":null},"mapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"alphaMap":{"value":null},"alphaMapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"alphaTest":{"value":0.07},"displacementMap":{"value":null},"displacementMapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"displacementScale":{"value":1},"displacementBias":{"value":0},"size":{"value":1},"scale":{"value":1}},"defines":{"USE_SIZEATTENUATION":1,"DEPTH_PACKING":3200},"vertexShader":"\nuniform float size;\nuniform float scale;\n#include <common>\n#include <clipping_planes_pars_vertex>\nvarying float vViewZDepth;\n\n// INSERT DEFINES\n\n\n// vHighPrecisionZW is added to match CustomMeshDepth.frag\n// which is itself taken from threejs\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t// INSERT BODY\n\n\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\tvViewZDepth = - mvPosition.z;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\n\tvHighPrecisionZW = gl_Position.zw;\n\n}\n","fragmentShader":"\n// INSERT DEFINES\n\n\n#if DEPTH_PACKING == 3200\n\n\tuniform float opacity;\n\n#endif\n\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tdiffuseColor.a = opacity;\n\n\t#endif\n\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\n\t// INSERT BODY\n\t// the new body lines should be added before the alphatest_fragment\n\t// so that alpha is set before (which is really how it would be set if the alphamap_fragment above was used by the material node parameters)\n\n\t#include <alphatest_fragment>\n\n\t#include <logdepthbuf_fragment>\n\n\n\t// Higher precision equivalent of gl_FragCoord.z. This assumes depthRange has been left to its default values.\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), diffuseColor.a );\n\n\t#elif DEPTH_PACKING == 3201\n\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\n\t#endif\n\n}\n","lights":false,"clipping":false},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[],"timeDependent":true,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false}},"customDepthMaterial":{"material":{"metadata":{"version":4.5,"type":"Material","generator":"Material.toJSON"},"uuid":"/geo1/MAT/pointsBuilder1-customDepthMaterial","type":"ShaderMaterial","name":"customDepthMaterial","depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"alphaTest":0.07,"forceSinglePass":true,"fog":false,"glslVersion":null,"uniforms":{"diffuse":{"type":"c","value":16777215},"opacity":{"value":1},"map":{"value":null},"mapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"alphaMap":{"value":null},"alphaMapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"alphaTest":{"value":0.07},"displacementMap":{"value":null},"displacementMapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"displacementScale":{"value":1},"displacementBias":{"value":0},"size":{"value":1},"scale":{"value":1}},"defines":{"USE_SIZEATTENUATION":1,"DEPTH_PACKING":3201},"vertexShader":"\nuniform float size;\nuniform float scale;\n#include <common>\n#include <clipping_planes_pars_vertex>\nvarying float vViewZDepth;\n\n// INSERT DEFINES\n\n\n// vHighPrecisionZW is added to match CustomMeshDepth.frag\n// which is itself taken from threejs\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t// INSERT BODY\n\n\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\tvViewZDepth = - mvPosition.z;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\n\tvHighPrecisionZW = gl_Position.zw;\n\n}\n","fragmentShader":"\n// INSERT DEFINES\n\n\n#if DEPTH_PACKING == 3200\n\n\tuniform float opacity;\n\n#endif\n\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tdiffuseColor.a = opacity;\n\n\t#endif\n\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\n\t// INSERT BODY\n\t// the new body lines should be added before the alphatest_fragment\n\t// so that alpha is set before (which is really how it would be set if the alphamap_fragment above was used by the material node parameters)\n\n\t#include <alphatest_fragment>\n\n\t#include <logdepthbuf_fragment>\n\n\n\t// Higher precision equivalent of gl_FragCoord.z. This assumes depthRange has been left to its default values.\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), diffuseColor.a );\n\n\t#elif DEPTH_PACKING == 3201\n\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\n\t#endif\n\n}\n","lights":false,"clipping":false},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[],"timeDependent":true,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false}},"customDepthDOFMaterial":{"material":{"metadata":{"version":4.5,"type":"Material","generator":"Material.toJSON"},"uuid":"/geo1/MAT/pointsBuilder1-customDepthDOFMaterial","type":"ShaderMaterial","name":"customDepthDOFMaterial","depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"alphaTest":0.07,"forceSinglePass":true,"fog":false,"glslVersion":null,"uniforms":{"size":{"value":1},"scale":{"value":1},"mNear":{"value":0},"mFar":{"value":10}},"defines":{"USE_SIZEATTENUATION":1},"vertexShader":"\nuniform float size;\nuniform float scale;\n#include <common>\n\nvarying float vViewZDepth;\n\n// INSERT DEFINES\n\n\n\nvoid main() {\n\n\t// INSERT BODY\n\n\n\t#include <project_vertex>\n\n\tvViewZDepth = - mvPosition.z;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\n}\n","fragmentShader":"\nuniform float mNear;\nuniform float mFar;\n\nvarying float vViewZDepth;\n\n// INSERT DEFINES\n\nvoid main() {\n\n\tfloat color = 1.0 - smoothstep( mNear, mFar, vViewZDepth );\n\tgl_FragColor = vec4( vec3( color ), 1.0 );\n\tvec4 diffuseColor = gl_FragColor;\n\n\t// INSERT BODY\n\n\tgl_FragColor.a = diffuseColor.a;\n}\n","lights":false,"clipping":false},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[],"timeDependent":true,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false}}}}},"lineBasicBuilder_LIGHTING":{"type":"lineBasicBuilder","nodes":{"globals1":{"type":"globals"},"output1":{"type":"output","inputs":[{"index":0,"inputName":"position","node":"max1","output":"val"},{"index":1,"inputName":"color","node":"multScalar2","output":"val"},{"index":2,"inputName":"alpha","node":"constant3","output":"val"}]},"constant3":{"type":"constant","params":{"float":0.86},"connection_points":{"in":[],"out":[{"name":"val","type":"float"}]}},"laserColor1":{"type":"laserColor","polyNode":{"locked":true},"params":{"baseColor":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"connection_points":{"in":[{"name":"baseColor","type":"vec3"}],"out":[{"name":"baseColor","type":"vec3"}]}},"param1":{"type":"param","params":{"name":"destPos","type":4},"connection_points":{"in":[],"out":[{"name":"val","type":"vec3"}]}},"attribute1":{"type":"attribute","params":{"name":"idn"},"connection_points":{"in":[],"out":[{"name":"val","type":"float"}]}},"constant1":{"type":"constant","params":{"type":4},"connection_points":{"in":[],"out":[{"name":"val","type":"vec3"}]}},"mix1":{"type":"mix","params":{"value0":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"value1":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"blend":{"type":"float","default_value":0.5,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value0","node":"constant1","output":"val"},{"index":1,"inputName":"value1","node":"param1","output":"val"},{"index":2,"inputName":"blend","node":"attribute1","output":"val"}],"connection_points":{"in":[{"name":"value0","type":"vec3"},{"name":"value1","type":"vec3"},{"name":"blend","type":"float"}],"out":[{"name":"mix","type":"vec3"}]}},"noise1":{"type":"noise","params":{"octaves":6,"amp":{"type":"vector3","default_value":[1,1,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":[0.19999999999999996,0.19999999999999996,0.19999999999999996]},"position":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"freq":{"type":"vector3","default_value":[1,1,1],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"offset":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":4,"inputs":[{"index":0,"inputName":"amp","node":"multScalar1","output":"val"},{"index":1,"inputName":"position","node":"floatToVec3_3","output":"vec3"},null,{"index":3,"inputName":"offset","node":"floatToVec3_2","output":"vec3"}],"connection_points":{"in":[{"name":"amp","type":"vec3"},{"name":"position","type":"vec3"},{"name":"freq","type":"vec3"},{"name":"offset","type":"vec3"}],"out":[{"name":"noise","type":"vec3"}]}},"smoothstep1":{"type":"smoothstep","params":{"edge0":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"edge1":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.1},"x":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[null,null,{"index":2,"inputName":"x","node":"attribute1","output":"val"}],"connection_points":{"in":[{"name":"edge0","type":"float"},{"name":"edge1","type":"float"},{"name":"x","type":"float"}],"out":[{"name":"val","type":"float"}]}},"smoothstep2":{"type":"smoothstep","params":{"edge0":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":1},"edge1":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.83},"x":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[null,null,{"index":2,"inputName":"x","node":"attribute1","output":"val"}],"connection_points":{"in":[{"name":"edge0","type":"float"},{"name":"edge1","type":"float"},{"name":"x","type":"float"}],"out":[{"name":"val","type":"float"}]}},"min1":{"type":"min","params":{"in0":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":1},"in1":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":1}},"inputs":[{"index":0,"inputName":"in0","node":"smoothstep1","output":"val"},{"index":1,"inputName":"in1","node":"smoothstep2","output":"val"}],"connection_points":{"in":[{"name":"in0","type":"float"},{"name":"in1","type":"float"}],"out":[{"name":"val","type":"float"}]}},"floatToVec3_1":{"type":"floatToVec3","params":{"x":{"overriden_options":{}},"y":{"overriden_options":{}},"z":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"x","node":"min1","output":"val"},{"index":1,"inputName":"y","node":"min1","output":"val"},{"index":2,"inputName":"z","node":"min1","output":"val"}]},"add1":{"type":"add","params":{"add0":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"add1":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"add2":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"add0","node":"mix1","output":"mix"},{"index":1,"inputName":"add1","node":"noise1","output":"noise"}],"connection_points":{"in":[{"name":"add0","type":"vec3"},{"name":"add1","type":"vec3"},{"name":"add2","type":"vec3"}],"out":[{"name":"sum","type":"vec3"}]}},"multScalar1":{"type":"multScalar","params":{"value":{"type":"vector3","default_value":[1,1,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.42}},"inputs":[{"index":0,"inputName":"value","node":"floatToVec3_1","output":"vec3"}],"connection_points":{"in":[{"name":"value","type":"vec3"},{"name":"mult","type":"float"}],"out":[{"name":"val","type":"vec3"}]}},"globals2":{"type":"globals"},"multAdd1":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.79},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"globals2","output":"time"}],"connection_points":{"in":[{"name":"value","type":"float"},{"name":"preAdd","type":"float"},{"name":"mult","type":"float"},{"name":"postAdd","type":"float"}],"out":[{"name":"val","type":"float"}]}},"floatToVec3_2":{"type":"floatToVec3","params":{"x":{"overriden_options":{}},"y":{"overriden_options":{}},"z":{"raw_input":0.21,"overriden_options":{}}},"inputs":[null,{"index":1,"inputName":"y","node":"multAdd1","output":"val"}]},"max1":{"type":"max","params":{"in0":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"in1":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":[-1000,0,-1000]}},"inputs":[{"index":0,"inputName":"in0","node":"add1","output":"sum"}],"connection_points":{"in":[{"name":"in0","type":"vec3"},{"name":"in1","type":"vec3"}],"out":[{"name":"val","type":"vec3"}]}},"vec3ToFloat1":{"type":"vec3ToFloat","params":{"vec":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"vec","node":"mix1","output":"mix"}]},"floatToVec3_3":{"type":"floatToVec3","params":{"x":{"overriden_options":{}},"y":{"overriden_options":{}},"z":{"raw_input":0.37,"overriden_options":{}}},"inputs":[null,{"index":1,"inputName":"y","node":"attribute2","output":"val"},{"index":2,"inputName":"z","node":"multAdd2","output":"val"}]},"multAdd2":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"attribute1","output":"val"},null,null,{"index":3,"inputName":"postAdd","node":"multAdd3","output":"val"}],"connection_points":{"in":[{"name":"value","type":"float"},{"name":"preAdd","type":"float"},{"name":"mult","type":"float"},{"name":"postAdd","type":"float"}],"out":[{"name":"val","type":"float"}]}},"multAdd3":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":-1},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"globals2","output":"time"}],"connection_points":{"in":[{"name":"value","type":"float"},{"name":"preAdd","type":"float"},{"name":"mult","type":"float"},{"name":"postAdd","type":"float"}],"out":[{"name":"val","type":"float"}]}},"attribute2":{"type":"attribute","params":{"name":"id"},"connection_points":{"in":[],"out":[{"name":"val","type":"float"}]}},"multScalar2":{"type":"multScalar","params":{"value":{"type":"vector3","default_value":[1,1,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":12}},"inputs":[{"index":0,"inputName":"value","node":"laserColor1","output":"baseColor"}],"connection_points":{"in":[{"name":"value","type":"vec3"},{"name":"mult","type":"float"}],"out":[{"name":"val","type":"vec3"}]}}},"params":{"transparent":true,"linewidth":2.3,"destPos":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"computeOnDirty":true,"cook":false,"dependentOnFoundNode":true},"raw_input":[-2.3,1.4,0],"overriden_options":{"callback":"{}"}}},"persisted_config":{"material":{"metadata":{"version":4.5,"type":"Material","generator":"Material.toJSON"},"uuid":"/geo1/MAT/lineBasicBuilder_LIGHTING-main","type":"LineBasicMaterial","color":16777215,"transparent":true,"depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"linewidth":2.3},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[{"type":"vector3","name":"destPos","defaultValue":[0,0,0],"uniformName":"v_POLY_param_destPos"}],"timeDependent":true,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false},"customMaterials":{"customDistanceMaterial":{"material":{"metadata":{"version":4.5,"type":"Material","generator":"Material.toJSON"},"uuid":"/geo1/MAT/lineBasicBuilder_LIGHTING-customDistanceMaterial","type":"ShaderMaterial","name":"customDistanceMaterial","depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"forceSinglePass":true,"fog":false,"glslVersion":null,"uniforms":{"diffuse":{"type":"c","value":16777215},"opacity":{"value":1},"map":{"value":null},"mapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"alphaMap":{"value":null},"alphaMapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"alphaTest":{"value":0},"displacementMap":{"value":null},"displacementMapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"displacementScale":{"value":1},"displacementBias":{"value":0},"referencePosition":{"type":"v3","value":[0,0,0]},"nearDistance":{"value":1},"farDistance":{"value":1000}},"defines":{"USE_SIZEATTENUATION":1,"DEPTH_PACKING":3201},"vertexShader":"\nuniform float scale;\nattribute float lineDistance;\n\nvarying float vLineDistance;\n\n#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\n// INSERT DEFINES\n\n\n// vHighPrecisionZW is added to match CustomMeshDepth.frag\n// which is itself taken from threejs\nvarying vec2 vHighPrecisionZW;\n\n\nvoid main() {\n\n\t// INSERT BODY\n\n\n\tvLineDistance = scale * lineDistance;\n\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\n\n\tvHighPrecisionZW = gl_Position.zw;\n}\n","fragmentShader":"\n// INSERT DEFINES\n\n#define DISTANCE\n\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main () {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\n\t// INSERT BODY\n\n\t#include <alphatest_fragment>\n\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist ); // clamp to [ 0, 1 ]\n\n\tgl_FragColor = packDepthToRGBA( dist );\n\n}\n","lights":false,"clipping":false},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[{"type":"vector3","name":"destPos","defaultValue":[0,0,0],"uniformName":"v_POLY_param_destPos"}],"timeDependent":true,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false}},"customDepthMaterial":{"material":{"metadata":{"version":4.5,"type":"Material","generator":"Material.toJSON"},"uuid":"/geo1/MAT/lineBasicBuilder_LIGHTING-customDepthMaterial","type":"ShaderMaterial","name":"customDepthMaterial","depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"forceSinglePass":true,"fog":false,"glslVersion":null,"uniforms":{"diffuse":{"type":"c","value":16777215},"opacity":{"value":1},"map":{"value":null},"mapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"alphaMap":{"value":null},"alphaMapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"alphaTest":{"value":0},"displacementMap":{"value":null},"displacementMapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"displacementScale":{"value":1},"displacementBias":{"value":0}},"defines":{"DEPTH_PACKING":3201},"vertexShader":"\nuniform float scale;\nattribute float lineDistance;\n\nvarying float vLineDistance;\n\n\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\n// INSERT DEFINES\n\n\n// vHighPrecisionZW is added to match CustomMeshDepth.frag\n// which is itself taken from threejs\nvarying vec2 vHighPrecisionZW;\n\n\nvoid main() {\n\n\t// INSERT BODY\n\n\n\tvLineDistance = scale * lineDistance;\n\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\n\n\tvHighPrecisionZW = gl_Position.zw;\n}\n","fragmentShader":"\n// INSERT DEFINES\n\n\n#if DEPTH_PACKING == 3200\n\n\tuniform float opacity;\n\n#endif\n\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tdiffuseColor.a = opacity;\n\n\t#endif\n\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\n\t// INSERT BODY\n\t// the new body lines should be added before the alphatest_fragment\n\t// so that alpha is set before (which is really how it would be set if the alphamap_fragment above was used by the material node parameters)\n\n\t#include <alphatest_fragment>\n\n\t#include <logdepthbuf_fragment>\n\n\n\t// Higher precision equivalent of gl_FragCoord.z. This assumes depthRange has been left to its default values.\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), diffuseColor.a );\n\n\t#elif DEPTH_PACKING == 3201\n\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\n\t#endif\n\n}\n","lights":false,"clipping":false},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[{"type":"vector3","name":"destPos","defaultValue":[0,0,0],"uniformName":"v_POLY_param_destPos"}],"timeDependent":true,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false}},"customDepthDOFMaterial":{"material":{"metadata":{"version":4.5,"type":"Material","generator":"Material.toJSON"},"uuid":"/geo1/MAT/lineBasicBuilder_LIGHTING-customDepthDOFMaterial","type":"ShaderMaterial","name":"customDepthDOFMaterial","depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"forceSinglePass":true,"fog":false,"glslVersion":null,"uniforms":{"diffuse":{"type":"c","value":16777215},"opacity":{"value":1},"map":{"value":null},"mapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"alphaMap":{"value":null},"alphaMapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"alphaTest":{"value":0},"displacementMap":{"value":null},"displacementMapTransform":{"type":"m3","value":[1,0,0,0,1,0,0,0,1]},"displacementScale":{"value":1},"displacementBias":{"value":0}},"defines":{"DEPTH_PACKING":3200},"vertexShader":"\nuniform float scale;\nattribute float lineDistance;\n\nvarying float vLineDistance;\n\n\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\n// INSERT DEFINES\n\n\n// vHighPrecisionZW is added to match CustomMeshDepth.frag\n// which is itself taken from threejs\nvarying vec2 vHighPrecisionZW;\n\n\nvoid main() {\n\n\t// INSERT BODY\n\n\n\tvLineDistance = scale * lineDistance;\n\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\n\n\tvHighPrecisionZW = gl_Position.zw;\n}\n","fragmentShader":"\n// INSERT DEFINES\n\n\n#if DEPTH_PACKING == 3200\n\n\tuniform float opacity;\n\n#endif\n\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tdiffuseColor.a = opacity;\n\n\t#endif\n\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\n\t// INSERT BODY\n\t// the new body lines should be added before the alphatest_fragment\n\t// so that alpha is set before (which is really how it would be set if the alphamap_fragment above was used by the material node parameters)\n\n\t#include <alphatest_fragment>\n\n\t#include <logdepthbuf_fragment>\n\n\n\t// Higher precision equivalent of gl_FragCoord.z. This assumes depthRange has been left to its default values.\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), diffuseColor.a );\n\n\t#elif DEPTH_PACKING == 3201\n\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\n\t#endif\n\n}\n","lights":false,"clipping":false},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[{"type":"vector3","name":"destPos","defaultValue":[0,0,0],"uniformName":"v_POLY_param_destPos"}],"timeDependent":true,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false}}}}}}},"circle1":{"type":"circle","params":{"radius":3,"segments":100}},"line1":{"type":"line","params":{"pointsCount":400,"direction":[0,0,1]}},"copy1":{"type":"copy","inputs":["attribCreate2","delete2"]},"attribDelete1":{"type":"attribDelete","params":{"name":"N"},"inputs":["jitter1"]},"merge1":{"type":"merge","inputs":["actor_for_lines_parent","objectProperties3","actor1"],"flags":{"display":true},"cloned_state_overriden":true},"objectProperties2":{"type":"objectProperties","params":{"tname":true,"name":"line-`@objnum`"},"inputs":["material3"]},"hierarchy2":{"type":"hierarchy","inputs":["actor_for_each_line"]},"actor_for_each_line":{"type":"actor","nodes":{"onTick1":{"type":"onTick"},"getObjectProperty1":{"type":"getObjectProperty"},"subtract1":{"type":"subtract","params":{"sub0":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"sub1":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"sub2":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"sub0","node":"add2","output":"sum"},{"index":1,"inputName":"sub1","node":"getObjectProperty1","output":"position"}],"connection_points":{"in":[{"name":"sub0","type":"Vector3","isArray":false},{"name":"sub1","type":"Vector3","isArray":false},{"name":"sub2","type":"Vector3","isArray":false}],"out":[{"name":"sub","type":"Vector3","isArray":false}]}},"rayIntersectObject1":{"type":"rayIntersectObject","maxInputsCount":3,"inputs":[{"index":0,"inputName":"Ray","node":"ray1","output":"Ray"},{"index":1,"inputName":"Object3D","node":"getObject1","output":"Object3D"}]},"getObject1":{"type":"getObject","params":{"getCurrentObject":false,"mask":"*/rhino"},"maxInputsCount":2},"getIntersectionProperty1":{"type":"getIntersectionProperty","inputs":[{"index":0,"inputName":"Intersection","node":"rayIntersectObject1","output":"Intersection"}]},"ray1":{"type":"ray","params":{"origin":{"overriden_options":{}},"direction":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"origin","node":"getObjectProperty1","output":"position"},{"index":1,"inputName":"direction","node":"multScalar1","output":"val"}]},"getParent1":{"type":"getParent"},"getObjectAttribute1":{"type":"getObjectAttribute","params":{"type":6,"attribName":{"type":"string","default_value":"","options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":"getObjectAttribute1"},"defaultVector3":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"Object3D","node":"getParent1","output":"Object3D"},{"index":1,"inputName":"attribName","node":"constant2","output":"val"}],"connection_points":{"in":[{"name":"Object3D","type":"Object3D","isArray":false},{"name":"attribName","type":"string","isArray":false},{"name":"defaultVector3","type":"Vector3","isArray":false}],"out":[{"name":"val","type":"Vector3","isArray":false}]}},"constant2":{"type":"constant","params":{"type":4,"string":"rayHit"},"connection_points":{"in":[],"out":[{"name":"val","type":"string","isArray":false}]}},"getObjectAttribute2":{"type":"getObjectAttribute","params":{"attribName":{"type":"string","default_value":"","options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":"idn"},"defaultFloat":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":3,"connection_points":{"in":[{"name":"Object3D","type":"Object3D","isArray":false},{"name":"attribName","type":"string","isArray":false},{"name":"defaultFloat","type":"float","isArray":false}],"out":[{"name":"val","type":"float","isArray":false}]}},"rand1":{"type":"rand","params":{"value0":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"value1":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value0","node":"getObjectAttribute2","output":"val"}],"connection_points":{"in":[{"name":"value0","type":"float","isArray":false},{"name":"value1","type":"float","isArray":false}],"out":[{"name":"rand","type":"float","isArray":false}]}},"onTick2":{"type":"onTick"},"add1":{"type":"add","params":{"add0":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"add1":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"add2":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"add0","node":"multAdd4","output":"val"},{"index":1,"inputName":"add1","node":"multAdd2","output":"val"}],"connection_points":{"in":[{"name":"add0","type":"float","isArray":false},{"name":"add1","type":"float","isArray":false},{"name":"add2","type":"float","isArray":false}],"out":[{"name":"sum","type":"float","isArray":false}]}},"sin1":{"type":"sin","params":{"angle":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"angle","node":"add1","output":"sum"}],"connection_points":{"in":[{"name":"angle","type":"float","isArray":false}],"out":[{"name":"sin","type":"float","isArray":false}]}},"floatToVec3_1":{"type":"floatToVec3","params":{"x":{"overriden_options":{}},"y":{"overriden_options":{}},"z":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"x","node":"multAdd3","output":"val"},{"index":1,"inputName":"y","node":"multAdd1","output":"val"}]},"add2":{"type":"add","params":{"add0":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"add1":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"add2":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"add0","node":"getObjectAttribute1","output":"val"},{"index":1,"inputName":"add1","node":"floatToVec3_1","output":"vec3"}],"connection_points":{"in":[{"name":"add0","type":"Vector3","isArray":false},{"name":"add1","type":"Vector3","isArray":false},{"name":"add2","type":"Vector3","isArray":false}],"out":[{"name":"sum","type":"Vector3","isArray":false}]}},"multAdd1":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.04},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"sin1","output":"sin"}],"connection_points":{"in":[{"name":"value","type":"float","isArray":false},{"name":"preAdd","type":"float","isArray":false},{"name":"mult","type":"float","isArray":false},{"name":"postAdd","type":"float","isArray":false}],"out":[{"name":"val","type":"float","isArray":false}]}},"multAdd2":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":4},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"onTick2","output":"time"}],"connection_points":{"in":[{"name":"value","type":"float","isArray":false},{"name":"preAdd","type":"float","isArray":false},{"name":"mult","type":"float","isArray":false},{"name":"postAdd","type":"float","isArray":false}],"out":[{"name":"val","type":"float","isArray":false}]}},"rand2":{"type":"rand","params":{"value0":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"value1":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":18.08}},"inputs":[{"index":0,"inputName":"value0","node":"getObjectAttribute2","output":"val"}],"connection_points":{"in":[{"name":"value0","type":"float","isArray":false},{"name":"value1","type":"float","isArray":false}],"out":[{"name":"rand","type":"float","isArray":false}]}},"add3":{"type":"add","params":{"add0":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"add1":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"add2":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"add0","node":"multAdd5","output":"val"},{"index":1,"inputName":"add1","node":"multAdd2","output":"val"}],"connection_points":{"in":[{"name":"add0","type":"float","isArray":false},{"name":"add1","type":"float","isArray":false},{"name":"add2","type":"float","isArray":false}],"out":[{"name":"sum","type":"float","isArray":false}]}},"cos1":{"type":"cos","params":{"angle":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"angle","node":"add3","output":"sum"}],"connection_points":{"in":[{"name":"angle","type":"float","isArray":false}],"out":[{"name":"cos","type":"float","isArray":false}]}},"multAdd3":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.03},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"cos1","output":"cos"}],"connection_points":{"in":[{"name":"value","type":"float","isArray":false},{"name":"preAdd","type":"float","isArray":false},{"name":"mult","type":"float","isArray":false},{"name":"postAdd","type":"float","isArray":false}],"out":[{"name":"val","type":"float","isArray":false}]}},"multAdd4":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":12},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"rand1","output":"rand"}],"connection_points":{"in":[{"name":"value","type":"float","isArray":false},{"name":"preAdd","type":"float","isArray":false},{"name":"mult","type":"float","isArray":false},{"name":"postAdd","type":"float","isArray":false}],"out":[{"name":"val","type":"float","isArray":false}]}},"multAdd5":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":51},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"rand2","output":"rand"}],"connection_points":{"in":[{"name":"value","type":"float","isArray":false},{"name":"preAdd","type":"float","isArray":false},{"name":"mult","type":"float","isArray":false},{"name":"postAdd","type":"float","isArray":false}],"out":[{"name":"val","type":"float","isArray":false}]}},"setObjectAttribute1":{"type":"setObjectAttribute","params":{"type":6,"attribName":{"type":"string","default_value":"","options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":"rayHit"},"lerp":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"val":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":5,"inputs":[{"index":0,"inputName":"trigger","node":"triggerFilter1","output":"trigger"},null,{"index":2,"inputName":"attribName","node":"constant3","output":"val"},null,{"index":4,"inputName":"val","node":"twoWaySwitch1","output":"val"}],"connection_points":{"in":[{"name":"trigger","type":"trigger","isArray":false},{"name":"Object3D","type":"Object3D","isArray":false},{"name":"attribName","type":"string","isArray":false},{"name":"lerp","type":"float","isArray":false},{"name":"val","type":"Vector3","isArray":false}],"out":[{"name":"trigger","type":"trigger","isArray":false},{"name":"Object3D","type":"Object3D","isArray":false}]}},"constant3":{"type":"constant","params":{"type":4,"string":"rayHit"},"connection_points":{"in":[],"out":[{"name":"val","type":"string","isArray":false}]}},"onObjectAttributeUpdate1":{"type":"onObjectAttributeUpdate","params":{"type":6,"attribName":{"type":"string","default_value":"","options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[null,{"index":1,"inputName":"attribName","node":"constant3","output":"val"}],"connection_points":{"in":[{"name":"Object3D","type":"Object3D","isArray":false},{"name":"attribName","type":"string","isArray":false}],"out":[{"name":"trigger","type":"trigger","isArray":false},{"name":"newValue","type":"Vector3","isArray":false},{"name":"previousValue","type":"Vector3","isArray":false}]}},"length1":{"type":"length","params":{"v":{"type":"vector3","default_value":[1,1,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"v","node":"getIntersectionProperty1","output":"point"}],"connection_points":{"in":[{"name":"v","type":"Vector3","isArray":false}],"out":[{"name":"val","type":"float","isArray":false}]}},"compare1":{"type":"compare","params":{"test":2,"value0":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"value1":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.04}},"inputs":[{"index":0,"inputName":"value0","node":"length1","output":"val"}],"connection_points":{"in":[{"name":"value0","type":"float","isArray":false},{"name":"value1","type":"float","isArray":false}],"out":[{"name":"val","type":"boolean","isArray":false}]}},"constant5":{"type":"constant","params":{"type":4,"int":1,"string":"destPos"},"connection_points":{"in":[],"out":[{"name":"val","type":"string","isArray":false}]}},"subtract3":{"type":"subtract","params":{"sub0":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"sub1":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"sub2":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"sub0","node":"getIntersectionProperty1","output":"point"},{"index":1,"inputName":"sub1","node":"getObjectProperty1","output":"position"}],"connection_points":{"in":[{"name":"sub0","type":"Vector3","isArray":false},{"name":"sub1","type":"Vector3","isArray":false},{"name":"sub2","type":"Vector3","isArray":false}],"out":[{"name":"sub","type":"Vector3","isArray":false}]}},"twoWaySwitch1":{"type":"twoWaySwitch","params":{"condition":{"type":"boolean","default_value":false,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"ifTrue":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"ifFalse":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"condition","node":"compare1","output":"val"},{"index":1,"inputName":"ifTrue","node":"subtract3","output":"sub"},{"index":2,"inputName":"ifFalse","node":"add4","output":"sum"}],"connection_points":{"in":[{"name":"condition","type":"boolean","isArray":false},{"name":"ifTrue","type":"Vector3","isArray":false},{"name":"ifFalse","type":"Vector3","isArray":false}],"out":[{"name":"val","type":"Vector3","isArray":false}]}},"multScalar1":{"type":"multScalar","params":{"value":{"type":"vector3","default_value":[1,1,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":100}},"inputs":[{"index":0,"inputName":"value","node":"subtract1","output":"sub"}],"connection_points":{"in":[{"name":"value","type":"Vector3","isArray":false},{"name":"mult","type":"float","isArray":false}],"out":[{"name":"val","type":"Vector3","isArray":false}]}},"add4":{"type":"add","params":{"add0":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"add1":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"add2":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"add0","node":"getObjectProperty1","output":"position"},{"index":1,"inputName":"add1","node":"multScalar1","output":"val"}],"connection_points":{"in":[{"name":"add0","type":"Vector3","isArray":false},{"name":"add1","type":"Vector3","isArray":false},{"name":"add2","type":"Vector3","isArray":false}],"out":[{"name":"sum","type":"Vector3","isArray":false}]}},"setMaterialUniform1":{"type":"setMaterialUniform","params":{"type":5,"Vector3":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"uniformName":{"type":"string","default_value":"","options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"lerp":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":5,"inputs":[{"index":0,"inputName":"trigger","node":"onObjectAttributeUpdate1","output":"trigger"},null,{"index":2,"inputName":"Vector3","node":"onObjectAttributeUpdate1","output":"newValue"},{"index":3,"inputName":"uniformName","node":"constant5","output":"val"}],"connection_points":{"in":[{"name":"trigger","type":"trigger","isArray":false},{"name":"Material","type":"Material","isArray":false},{"name":"Vector3","type":"Vector3","isArray":false},{"name":"uniformName","type":"string","isArray":false},{"name":"lerp","type":"float","isArray":false}],"out":[{"name":"trigger","type":"trigger","isArray":false},{"name":"Material","type":"Material","isArray":false},{"name":"Vector3","type":"Vector3","isArray":false},{"name":"uniformName","type":"string","isArray":false},{"name":"lerp","type":"float","isArray":false}]}},"triggerFilter1":{"type":"triggerFilter","params":{"condition":{"overriden_options":{}}},"maxInputsCount":2,"inputs":[{"index":0,"inputName":"trigger","node":"onTick1","output":"trigger"},{"index":1,"inputName":"condition","node":"compare1","output":"val"}]}},"inputs":["attribId1"],"persisted_config":{"variableNames":["VAR__getObjectAttribute1_defaultVector3","VAR__onObjectAttributeUpdate1_","VAR__floatToVec3_1_","VAR__add2_add0","VAR__add2_add1","VAR__add2_add2","VAR__subtract1_sub0","VAR__subtract1_sub1","VAR__subtract1_sub2","VAR__multScalar1_value","VAR__multScalar1__1","VAR__ray1_origin","VAR__ray1_direction","VAR__ray1__2","VAR__add4_add0","VAR__add4_add1","VAR__add4_add2","VAR__getIntersectionProperty1_","VAR__length1_v","VAR__subtract3_sub0","VAR__subtract3_sub1","VAR__subtract3_sub2","VAR__twoWaySwitch1_ifTrue","VAR__twoWaySwitch1_ifFalse","VAR__setObjectAttribute1_val","VAR__setMaterialUniform1_Vector3"],"variables":[{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Ray","data":{"origin":[0,0,0],"direction":[0,0,-1]}},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]}],"functionNames":["getObjectProperty","getParent","getObjectAttribute","globalsTime","globalsTimeDelta","getObject","rand","mathFloat_2","multAdd","mathFloat_4","getObjectAttributeAutoDefault","addNumber","mathFloat_1","floatToVec3","addVector","subtractVector","multScalarVector3","raySet","rayIntersectObject3D","getIntersectionPropertyPoint","lengthVector","getObjectAttributeRef","setObjectAttribute","setMaterialUniformVectorColor"],"serializedParamConfigs":[],"eventDatas":[]}},"actor_for_lines_parent":{"type":"actor","nodes":{"rayFromCursor1":{"type":"rayFromCursor"},"rayIntersectObject1":{"type":"rayIntersectObject","maxInputsCount":3,"inputs":[{"index":0,"inputName":"Ray","node":"rayFromCursor1","output":"Ray"},{"index":1,"inputName":"Object3D","node":"getObject1","output":"Object3D"}]},"getObject1":{"type":"getObject","params":{"getCurrentObject":false,"mask":"*/rhino"},"maxInputsCount":2},"getIntersectionProperty1":{"type":"getIntersectionProperty","inputs":[{"index":0,"inputName":"Intersection","node":"rayIntersectObject1","output":"Intersection"}]},"setObjectAttribute1":{"type":"setObjectAttribute","params":{"type":6,"attribName":{"type":"string","default_value":"","options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"lerp":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.18},"val":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":5,"inputs":[{"index":0,"inputName":"trigger","node":"triggerFilter1","output":"trigger"},null,{"index":2,"inputName":"attribName","node":"constant2","output":"val"},null,{"index":4,"inputName":"val","node":"getIntersectionProperty1","output":"point"}],"connection_points":{"in":[{"name":"trigger","type":"trigger","isArray":false},{"name":"Object3D","type":"Object3D","isArray":false},{"name":"attribName","type":"string","isArray":false},{"name":"lerp","type":"float","isArray":false},{"name":"val","type":"Vector3","isArray":false}],"out":[{"name":"trigger","type":"trigger","isArray":false},{"name":"Object3D","type":"Object3D","isArray":false}]}},"constant2":{"type":"constant","params":{"type":4,"string":"rayHit"},"connection_points":{"in":[],"out":[{"name":"val","type":"string","isArray":false}]}},"onTick1":{"type":"onTick"},"triggerFilter1":{"type":"triggerFilter","params":{"condition":{"overriden_options":{}}},"maxInputsCount":2,"inputs":[{"index":0,"inputName":"trigger","node":"onTick1","output":"trigger"},{"index":1,"inputName":"condition","node":"compare1","output":"val"}]},"length1":{"type":"length","params":{"v":{"type":"vector3","default_value":[1,1,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"v","node":"getIntersectionProperty1","output":"point"}],"connection_points":{"in":[{"name":"v","type":"Vector3","isArray":false}],"out":[{"name":"val","type":"float","isArray":false}]}},"compare1":{"type":"compare","params":{"test":2,"value0":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"value1":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.02}},"inputs":[{"index":0,"inputName":"value0","node":"length1","output":"val"}],"connection_points":{"in":[{"name":"value0","type":"float","isArray":false},{"name":"value1","type":"float","isArray":false}],"out":[{"name":"val","type":"boolean","isArray":false}]}}},"inputs":["objectProperties4"],"persisted_config":{"variableNames":["VAR__getIntersectionProperty1_","VAR__length1_v","VAR__setObjectAttribute1_val"],"variables":[{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]}],"functionNames":["globalsRayFromCursor","getObject","rayIntersectObject3D","getIntersectionPropertyPoint","lengthVector","globalsTime","globalsTimeDelta","setObjectAttribute"],"serializedParamConfigs":[],"eventDatas":[{"type":"pointermove","emitter":"canvas","jsType":"rayFromCursor"},{"type":"touchmove","emitter":"canvas","jsType":"rayFromCursor"}]}},"attribCreate1":{"type":"attribCreate","params":{"name":"rayHit","size":3},"inputs":["hierarchy2"]},"attribId1":{"type":"attribId","params":{"class":3,"id":false},"inputs":["objectProperties2"]},"add1":{"type":"add"},"merge2":{"type":"merge","inputs":["material2","attribId2"]},"hierarchy3":{"type":"hierarchy","inputs":["attribCreate2"]},"material2":{"type":"material","params":{"material":"../MAT/pointsBuilder1"},"inputs":["add1"]},"attribCreate2":{"type":"attribCreate","params":{"name":"id","value1":"copy('../copy1')"},"inputs":["attribId2"]},"jitter1":{"type":"jitter","params":{"mult":[1,0,1]},"inputs":["circle1"]},"delete1":{"type":"delete","params":{"class":3,"invert":true,"keepPoints":true},"inputs":["attribDelete1"],"flags":{"bypass":true}},"delete2":{"type":"delete","params":{"invert":true,"byExpression":true,"expression":"@ptnum<=1"},"inputs":["delete1"],"flags":{"bypass":true}},"attribId2":{"type":"attribId","params":{"id":false},"inputs":["line1"]},"material3":{"type":"material","params":{"material":"../MAT/lineBasicBuilder_LIGHTING","cloneMat":true,"shareCustomUniforms":false},"inputs":["copy1"]},"pointLight1":{"type":"pointLight","params":{"color":[0.8962693533719567,0.2704977910022518,0.010960094003125918],"intensity":4,"decay":0.8,"castShadow":true}},"actor1":{"type":"actor","nodes":{"getObjectAttribute1":{"type":"getObjectAttribute","params":{"type":6,"attribName":{"type":"string","default_value":"","options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":"getObjectAttribute1"},"defaultVector3":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"Object3D","node":"getObject1","output":"Object3D"},{"index":1,"inputName":"attribName","node":"constant2","output":"val"}],"connection_points":{"in":[{"name":"Object3D","type":"Object3D","isArray":false},{"name":"attribName","type":"string","isArray":false},{"name":"defaultVector3","type":"Vector3","isArray":false}],"out":[{"name":"val","type":"Vector3","isArray":false}]}},"constant2":{"type":"constant","params":{"type":4,"string":"rayHit"},"connection_points":{"in":[],"out":[{"name":"val","type":"string","isArray":false}]}},"getObject1":{"type":"getObject","params":{"getCurrentObject":false,"mask":" /geo1/geo1:sopGroup/linesParent"},"maxInputsCount":2},"setObjectPosition1":{"type":"setObjectPosition","params":{"position":{"overriden_options":{}},"lerp":{"overriden_options":{}},"updateMatrix":{"overriden_options":{}}},"maxInputsCount":5,"inputs":[{"index":0,"inputName":"trigger","node":"onTick1","output":"trigger"},null,{"index":2,"inputName":"position","node":"add1","output":"sum"}]},"onTick1":{"type":"onTick"},"noiseImproved1":{"type":"noiseImproved","params":{"position":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"amp":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.32},"freq":{"type":"vector3","default_value":[1,1,1],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":[4,4,4]},"offset":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"octaves":{"type":"integer","default_value":3,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"ampMult":{"type":"float","default_value":0.5,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"freqMult":{"type":"float","default_value":2,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"position","node":"floatToVec3_1","output":"vec3"}],"connection_points":{"in":[{"name":"position","type":"Vector3","isArray":false},{"name":"amp","type":"float","isArray":false},{"name":"freq","type":"Vector3","isArray":false},{"name":"offset","type":"Vector3","isArray":false},{"name":"octaves","type":"int","isArray":false},{"name":"ampMult","type":"float","isArray":false},{"name":"freqMult","type":"float","isArray":false}],"out":[{"name":"noise","type":"float","isArray":false}]}},"onTick2":{"type":"onTick"},"floatToVec3_1":{"type":"floatToVec3","params":{"x":{"overriden_options":{}},"y":{"overriden_options":{}},"z":{"overriden_options":{}}},"inputs":[null,{"index":1,"inputName":"y","node":"onTick2","output":"time"}]},"floatToVec3_2":{"type":"floatToVec3","params":{"x":{"overriden_options":{}},"y":{"overriden_options":{}},"z":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"x","node":"noiseImproved1","output":"noise"},{"index":1,"inputName":"y","node":"noiseImproved1","output":"noise"},{"index":2,"inputName":"z","node":"noiseImproved1","output":"noise"}]},"add1":{"type":"add","params":{"add0":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"add1":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"add2":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"add0","node":"getObjectAttribute1","output":"val"},{"index":1,"inputName":"add1","node":"floatToVec3_2","output":"vec3"}],"connection_points":{"in":[{"name":"add0","type":"Vector3","isArray":false},{"name":"add1","type":"Vector3","isArray":false},{"name":"add2","type":"Vector3","isArray":false}],"out":[{"name":"sum","type":"Vector3","isArray":false}]}}},"inputs":["pointLight1"],"persisted_config":{"variableNames":["VAR__getObjectAttribute1_defaultVector3","VAR__floatToVec3_1_","VAR__noiseImproved1_position","VAR__noiseImproved1_freq","VAR__noiseImproved1_offset","VAR__floatToVec3_2_","VAR__add1_add0","VAR__add1_add1","VAR__add1_add2","VAR__setObjectPosition1_position"],"variables":[{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]},{"type":"Vector3","data":[0,0,0]}],"functionNames":["getObject","globalsTime","globalsTimeDelta","getObjectAttribute","floatToVec3","noiseImprovedVector3","addVector","setObjectPosition"],"serializedParamConfigs":[],"eventDatas":[]}},"objectProperties4":{"type":"objectProperties","params":{"tname":true,"name":"linesParent"},"inputs":["attribCreate1"]},"fileGLTF1":{"type":"fileGLTF","params":{"url":"https://raw.githubusercontent.com/polygonjs/polygonjs-assets/master/models/resources/threedscans.com/rhino.glb"}},"transform1":{"type":"transform","params":{"scale":2},"inputs":["hierarchy1"]},"hierarchy1":{"type":"hierarchy","params":{"mode":1},"inputs":["fileGLTF1"]},"BVHVisualizer1":{"type":"BVHVisualizer","params":{"depth":22},"inputs":["BVH1"]},"objectProperties1":{"type":"objectProperties","params":{"tcastShadow":true},"inputs":["transform1"]},"objectProperties3":{"type":"objectProperties","params":{"tname":true,"name":"rhino","tcastShadow":true},"inputs":["BVH1"]},"tube1":{"type":"tube","params":{"radius":0.2,"height":0.69,"center":[0,"ch(\"height\")/2",0],"direction":[0,1,0]}},"circle2":{"type":"circle","params":{"radius":1.5,"segments":8,"center":[-0.1926780242463501,0,0]}},"copy2":{"type":"copy","inputs":["tube1","circle2"]},"merge3":{"type":"merge","params":{"compact":true,"preserveMaterials":false},"inputs":["objectProperties1","attribDelete2"]},"BVH1":{"type":"BVH","inputs":["material1"]},"material1":{"type":"material","params":{"material":"../MAT/meshStandard_RHINO"},"inputs":["merge3"]},"merge4":{"type":"merge","params":{"compact":true},"inputs":["copy2"]},"attribDelete2":{"type":"attribDelete","params":{"name":"uv"},"inputs":["merge4"]}},"params":{"CADLinearTolerance":{"overriden_options":{"callback":"{}"}},"CADAngularTolerance":{"overriden_options":{"callback":"{}"}},"CADCurveAbscissa":{"overriden_options":{"callback":"{}"}},"CADCurveTolerance":{"overriden_options":{"callback":"{}"}},"CADDisplayEdges":{"overriden_options":{"callback":"{}"}},"CADEdgesColor":{"overriden_options":{"callback":"{}"}},"CADDisplayMeshes":{"overriden_options":{"callback":"{}"}},"CADMeshesColor":{"overriden_options":{"callback":"{}"}},"CADWireframe":{"overriden_options":{"callback":"{}"}},"CSGFacetAngle":{"overriden_options":{"callback":"{}"}},"CSGLinesColor":{"overriden_options":{"callback":"{}"}},"CSGMeshesColor":{"overriden_options":{"callback":"{}"}},"CSGWireframe":{"overriden_options":{"callback":"{}"}},"QUADTriangles":{"overriden_options":{"callback":"{}"}},"QUADWireframe":{"overriden_options":{"callback":"{}"}},"TetScale":{"overriden_options":{"callback":"{}"}},"TetDisplayLines":{"overriden_options":{"callback":"{}"}},"TetDisplaySharedFaces":{"overriden_options":{"callback":"{}"}},"TetDisplayPoints":{"overriden_options":{"callback":"{}"}},"TetDisplayCenter":{"overriden_options":{"callback":"{}"}},"TetDisplaySphere":{"overriden_options":{"callback":"{}"}}},"flags":{"display":true}},"COP":{"type":"copNetwork","nodes":{"envMap":{"type":"envMap","inputs":["imageEnv"]},"imageEnv":{"type":"imageEXR","params":{"tminFilter":true,"tmagFilter":true,"tanisotropy":true,"useRendererMaxAnisotropy":true}},"image1":{"type":"image"}}},"cameras":{"type":"geo","nodes":{"perspectiveCamera1":{"type":"perspectiveCamera","params":{"position":[1.5361847575543766,1.5296423416813052,3.039352398645094],"rotation":[-14.730925683314853,24.51076221722142,6.225038400920149]}},"cameraControls1":{"type":"cameraControls","nodes":{"cameraOrbitControls1":{"type":"cameraOrbitControls","params":{"target":[-0.4879600871858414,0.7948351424091571,-0.7615732841484815]}}},"params":{"node":"cameraOrbitControls1"},"inputs":["perspectiveCamera1"]},"cameraPostProcess1":{"type":"cameraPostProcess","nodes":{"bloom1":{"type":"bloom","params":{"strength":0.24,"threshold":1.66,"scale":0.54,"kernelSize":5,"luminanceSmoothing":0.05}},"toneMapping1":{"type":"toneMapping","inputs":["bloom1"]},"OUT":{"type":"null","inputs":["toneMapping1"],"flags":{"display":true}}},"params":{"sampling":1,"tTextureType":true,"textureType":1016},"inputs":["cameraRenderer1"],"flags":{"display":true}},"cameraRenderer1":{"type":"cameraRenderer","nodes":{"WebGLRenderer1":{"type":"WebGLRenderer","params":{"toneMapping":0}}},"params":{"node":"WebGLRenderer1"},"inputs":["cameraControls1"]}},"params":{"CADLinearTolerance":{"overriden_options":{"callback":"{}"}},"CADAngularTolerance":{"overriden_options":{"callback":"{}"}},"CADCurveAbscissa":{"overriden_options":{"callback":"{}"}},"CADCurveTolerance":{"overriden_options":{"callback":"{}"}},"CADDisplayEdges":{"overriden_options":{"callback":"{}"}},"CADEdgesColor":{"overriden_options":{"callback":"{}"}},"CADDisplayMeshes":{"overriden_options":{"callback":"{}"}},"CADMeshesColor":{"overriden_options":{"callback":"{}"}},"CADWireframe":{"overriden_options":{"callback":"{}"}},"CSGFacetAngle":{"overriden_options":{"callback":"{}"}},"CSGLinesColor":{"overriden_options":{"callback":"{}"}},"CSGMeshesColor":{"overriden_options":{"callback":"{}"}},"CSGWireframe":{"overriden_options":{"callback":"{}"}},"QUADTriangles":{"overriden_options":{"callback":"{}"}},"QUADWireframe":{"overriden_options":{"callback":"{}"}},"TetScale":{"overriden_options":{"callback":"{}"}},"TetDisplayLines":{"overriden_options":{"callback":"{}"}},"TetDisplaySharedFaces":{"overriden_options":{"callback":"{}"}},"TetDisplayPoints":{"overriden_options":{"callback":"{}"}},"TetDisplayCenter":{"overriden_options":{"callback":"{}"}},"TetDisplaySphere":{"overriden_options":{"callback":"{}"}}},"flags":{"display":true}},"env":{"type":"geo","nodes":{"material1":{"type":"material","params":{"material":"../MAT/meshStandardBuilder1"},"inputs":["box1"]},"MAT":{"type":"materialsNetwork","nodes":{"meshStandardBuilder1":{"type":"meshStandardBuilder","nodes":{"globals1":{"type":"globals"},"output1":{"type":"output","inputs":[null,null,{"index":2,"inputName":"color","node":"mix1","output":"mix"}]},"vec3ToFloat1":{"type":"vec3ToFloat","params":{"vec":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"vec","node":"globals1","output":"position"}]},"floatToVec2_1":{"type":"floatToVec2","params":{"x":{"overriden_options":{}},"y":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"x","node":"vec3ToFloat1","output":"x"},{"index":1,"inputName":"y","node":"vec3ToFloat1","output":"z"}]},"checkers1":{"type":"checkers","params":{"uv":{"overriden_options":{}},"freq":{"overriden_options":{}},"freqMult":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"uv","node":"floatToVec2_1","output":"vec2"}]},"mix1":{"type":"mix","params":{"value0":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"value1":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"blend":{"type":"float","default_value":0.5,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value0","node":"constant1","output":"val"},{"index":1,"inputName":"value1","node":"constant2","output":"val"},{"index":2,"inputName":"blend","node":"checkers1","output":"checker"}],"connection_points":{"in":[{"name":"value0","type":"vec3"},{"name":"value1","type":"vec3"},{"name":"blend","type":"float"}],"out":[{"name":"mix","type":"vec3"}]}},"constant1":{"type":"constant","params":{"type":4,"color":[0.24313725490196078,0.5098039215686274,0.8549019607843137],"asColor":true},"connection_points":{"in":[],"out":[{"name":"val","type":"vec3"}]}},"constant2":{"type":"constant","params":{"type":4,"color":[0.047058823529411764,0.10196078431372549,0.17647058823529413],"asColor":true},"connection_points":{"in":[],"out":[{"name":"val","type":"vec3"}]}}},"persisted_config":{"material":{"metadata":{"version":4.5,"type":"Material","generator":"Material.toJSON"},"uuid":"/env/MAT/meshStandardBuilder1-main","type":"MeshStandardMaterial","color":16777215,"roughness":1,"metalness":0,"emissive":0,"envMapIntensity":1,"depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"fog":false},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[],"timeDependent":false,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false},"customMaterials":{"customDepthMaterial":{"material":{"metadata":{"version":4.5,"type":"Material","generator":"Material.toJSON"},"uuid":"/env/MAT/meshStandardBuilder1-customDepthMaterial","type":"MeshDepthMaterial","name":"customDepthMaterial","depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"depthPacking":3201},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[],"timeDependent":false,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false}},"customDistanceMaterial":{"material":{"metadata":{"version":4.5,"type":"Material","generator":"Material.toJSON"},"uuid":"/env/MAT/meshStandardBuilder1-customDistanceMaterial","type":"MeshDistanceMaterial","name":"customDistanceMaterial","side":1,"depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[],"timeDependent":false,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false}},"customDepthDOFMaterial":{"material":{"metadata":{"version":4.5,"type":"Material","generator":"Material.toJSON"},"uuid":"/env/MAT/meshStandardBuilder1-customDepthDOFMaterial","type":"MeshDepthMaterial","name":"customDepthDOFMaterial","depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"depthPacking":3200},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[],"timeDependent":false,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false}}}}},"sky1":{"type":"sky","params":{"azimuth":0.07}}}},"box1":{"type":"box","params":{"sizes":[9.98,1,9.98],"center":[0,-0.5,0]}},"sphere1":{"type":"sphere","params":{"radius":21}},"material2":{"type":"material","params":{"material":"../MAT/sky1"},"inputs":["transform1"]},"merge1":{"type":"merge","inputs":["material1","material2"],"flags":{"display":true}},"transform1":{"type":"transform","params":{"applyOn":1},"inputs":["sphere1"],"flags":{"bypass":true}}},"params":{"CADLinearTolerance":{"overriden_options":{"callback":"{}"}},"CADAngularTolerance":{"overriden_options":{"callback":"{}"}},"CADCurveAbscissa":{"overriden_options":{"callback":"{}"}},"CADCurveTolerance":{"overriden_options":{"callback":"{}"}},"CADDisplayEdges":{"overriden_options":{"callback":"{}"}},"CADEdgesColor":{"overriden_options":{"callback":"{}"}},"CADDisplayMeshes":{"overriden_options":{"callback":"{}"}},"CADMeshesColor":{"overriden_options":{"callback":"{}"}},"CADWireframe":{"overriden_options":{"callback":"{}"}},"CSGFacetAngle":{"overriden_options":{"callback":"{}"}},"CSGLinesColor":{"overriden_options":{"callback":"{}"}},"CSGMeshesColor":{"overriden_options":{"callback":"{}"}},"CSGWireframe":{"overriden_options":{"callback":"{}"}},"QUADTriangles":{"overriden_options":{"callback":"{}"}},"QUADWireframe":{"overriden_options":{"callback":"{}"}},"TetScale":{"overriden_options":{"callback":"{}"}},"TetDisplayLines":{"overriden_options":{"callback":"{}"}},"TetDisplaySharedFaces":{"overriden_options":{"callback":"{}"}},"TetDisplayPoints":{"overriden_options":{"callback":"{}"}},"TetDisplayCenter":{"overriden_options":{"callback":"{}"}},"TetDisplaySphere":{"overriden_options":{"callback":"{}"}}},"flags":{"display":true}},"lights":{"type":"geo","nodes":{"hemisphereLight1":{"type":"hemisphereLight","params":{"intensity":0.18},"flags":{"bypass":true}},"polarTransform1":{"type":"polarTransform","params":{"center":[0,0.7,0],"longitude":-93.6,"latitude":25.2,"depth":3},"inputs":["areaLight1"]},"merge1":{"type":"merge","inputs":["hemisphereLight1","merge2"],"flags":{"display":true}},"areaLight1":{"type":"areaLight","params":{"intensity":0.5,"width":3.2,"height":2.6}},"spotLight1":{"type":"spotLight","params":{"intensity":0.3,"penumbra":0.36,"castShadow":true},"flags":{"bypass":true}},"merge2":{"type":"merge","inputs":["polarTransform1","polarTransform2"]},"polarTransform2":{"type":"polarTransform","params":{"center":[0,0.7,0],"longitude":50.4,"latitude":25.2,"depth":6.5},"inputs":["spotLight1"]}},"params":{"CADLinearTolerance":{"overriden_options":{"callback":"{}"}},"CADAngularTolerance":{"overriden_options":{"callback":"{}"}},"CADCurveAbscissa":{"overriden_options":{"callback":"{}"}},"CADCurveTolerance":{"overriden_options":{"callback":"{}"}},"CADDisplayEdges":{"overriden_options":{"callback":"{}"}},"CADEdgesColor":{"overriden_options":{"callback":"{}"}},"CADDisplayMeshes":{"overriden_options":{"callback":"{}"}},"CADMeshesColor":{"overriden_options":{"callback":"{}"}},"CADWireframe":{"overriden_options":{"callback":"{}"}},"CSGFacetAngle":{"overriden_options":{"callback":"{}"}},"CSGLinesColor":{"overriden_options":{"callback":"{}"}},"CSGMeshesColor":{"overriden_options":{"callback":"{}"}},"CSGWireframe":{"overriden_options":{"callback":"{}"}},"QUADTriangles":{"overriden_options":{"callback":"{}"}},"QUADWireframe":{"overriden_options":{"callback":"{}"}},"TetScale":{"overriden_options":{"callback":"{}"}},"TetDisplayLines":{"overriden_options":{"callback":"{}"}},"TetDisplaySharedFaces":{"overriden_options":{"callback":"{}"}},"TetDisplayPoints":{"overriden_options":{"callback":"{}"}},"TetDisplayCenter":{"overriden_options":{"callback":"{}"}},"TetDisplaySphere":{"overriden_options":{"callback":"{}"}}},"flags":{"display":true}}},"params":{"mainCameraPath":"/cameras/cameras:sopGroup/perspectiveCamera1"}},"ui":{"nodes":{"geo1":{"pos":[50,-250],"nodes":{"MAT":{"pos":[-1250,800],"nodes":{"meshStandard_RHINO":{"pos":[0,0]},"pointsBuilder1":{"pos":[0,400],"nodes":{"globals1":{"pos":[-500,0]},"output1":{"pos":[750,0]},"disk1":{"pos":[-100,200]},"constant1":{"pos":[50,300]},"multAdd1":{"pos":[-250,0]},"attribute1":{"pos":[-750,-250]},"round1":{"pos":[-600,-250]},"random1":{"pos":[-350,-250]},"floatToVec2_1":{"pos":[-500,-250]},"multAdd2":{"pos":[-50,-250]},"cos1":{"pos":[100,-250]},"multAdd3":{"pos":[250,-250]},"fit1":{"pos":[250,-150]},"multAdd4":{"pos":[450,250]},"multAdd5":{"pos":[-200,-250]},"laserColor1":{"pos":[150,-450]},"multAdd6":{"pos":[150,150]}}},"lineBasicBuilder_LIGHTING":{"pos":[0,250],"nodes":{"globals1":{"pos":[-400,-650]},"output1":{"pos":[1250,-400]},"constant3":{"pos":[1000,-50]},"laserColor1":{"pos":[950,-250]},"param1":{"pos":[-550,-200]},"attribute1":{"pos":[-700,0]},"constant1":{"pos":[-550,-400]},"mix1":{"pos":[-350,-350]},"noise1":{"pos":[350,-200]},"smoothstep1":{"pos":[-350,0]},"smoothstep2":{"pos":[-350,100]},"min1":{"pos":[-200,50]},"floatToVec3_1":{"pos":[-50,50]},"add1":{"pos":[450,-400]},"multScalar1":{"pos":[50,50]},"globals2":{"pos":[-750,400]},"multAdd1":{"pos":[-550,500]},"floatToVec3_2":{"pos":[100,400]},"max1":{"pos":[750,-350]},"vec3ToFloat1":{"pos":[-200,-250]},"floatToVec3_3":{"pos":[-50,-250]},"multAdd2":{"pos":[-250,-150]},"multAdd3":{"pos":[-550,300]},"attribute2":{"pos":[-700,150]},"multScalar2":{"pos":[1050,-250]}}}}},"circle1":{"pos":[-500,-350]},"line1":{"pos":[-800,-800]},"copy1":{"pos":[-800,350]},"attribDelete1":{"pos":[-500,-150]},"merge1":{"pos":[-350,1650]},"objectProperties2":{"pos":[-800,600]},"hierarchy2":{"pos":[-800,1050]},"actor_for_each_line":{"pos":[-800,900],"selection":["getParent1","getObjectAttribute1","constant2"],"nodes":{"onTick1":{"pos":[850,200]},"getObjectProperty1":{"pos":[-650,750]},"subtract1":{"pos":[-400,500]},"rayIntersectObject1":{"pos":[250,950]},"getObject1":{"pos":[100,1100]},"getIntersectionProperty1":{"pos":[400,950]},"ray1":{"pos":[100,850]},"getParent1":{"pos":[-1200,150]},"getObjectAttribute1":{"pos":[-1000,150]},"constant2":{"pos":[-1200,300]},"getObjectAttribute2":{"pos":[-1950,400]},"rand1":{"pos":[-1550,450]},"onTick2":{"pos":[-1800,700]},"add1":{"pos":[-1250,500]},"sin1":{"pos":[-1050,500]},"floatToVec3_1":{"pos":[-800,500]},"add2":{"pos":[-600,300]},"multAdd1":{"pos":[-950,500]},"multAdd2":{"pos":[-1650,700]},"rand2":{"pos":[-1550,600]},"add3":{"pos":[-1300,650]},"cos1":{"pos":[-1100,650]},"multAdd3":{"pos":[-950,650]},"multAdd4":{"pos":[-1400,450]},"multAdd5":{"pos":[-1400,600]},"setObjectAttribute1":{"pos":[1350,450]},"constant3":{"pos":[950,1000]},"onObjectAttributeUpdate1":{"pos":[1050,1400]},"length1":{"pos":[550,550]},"compare1":{"pos":[650,550]},"constant5":{"pos":[1350,1600]},"subtract3":{"pos":[700,750]},"twoWaySwitch1":{"pos":[1000,600]},"multScalar1":{"pos":[-200,650]},"add4":{"pos":[200,650]},"setMaterialUniform1":{"pos":[1500,1400]},"triggerFilter1":{"pos":[1150,350]}}},"actor_for_lines_parent":{"pos":[-800,1500],"nodes":{"rayFromCursor1":{"pos":[-550,-200]},"rayIntersectObject1":{"pos":[-300,0]},"getObject1":{"pos":[-550,150]},"getIntersectionProperty1":{"pos":[-150,0]},"setObjectAttribute1":{"pos":[550,-50]},"constant2":{"pos":[250,-150]},"onTick1":{"pos":[50,-450]},"triggerFilter1":{"pos":[300,-450]},"length1":{"pos":[50,-300]},"compare1":{"pos":[200,-300]}}},"attribCreate1":{"pos":[-800,1200]},"attribId1":{"pos":[-800,750]},"add1":{"pos":[-1150,-600]},"merge2":{"pos":[-1000,-250]},"hierarchy3":{"pos":[-1000,150]},"material2":{"pos":[-1150,-450]},"attribCreate2":{"pos":[-850,-100]},"jitter1":{"pos":[-500,-250]},"delete1":{"pos":[-500,0]},"delete2":{"pos":[-500,150]},"attribId2":{"pos":[-800,-650]},"material3":{"pos":[-800,500]},"pointLight1":{"pos":[100,1200]},"actor1":{"pos":[100,1350],"selection":["noiseImproved1"],"nodes":{"getObjectAttribute1":{"pos":[100,50]},"constant2":{"pos":[-100,200]},"getObject1":{"pos":[-200,-100]},"setObjectPosition1":{"pos":[800,0]},"onTick1":{"pos":[200,-150]},"noiseImproved1":{"pos":[400,350]},"onTick2":{"pos":[0,350]},"floatToVec3_1":{"pos":[200,350]},"floatToVec3_2":{"pos":[600,350]},"add1":{"pos":[650,50]}}},"objectProperties4":{"pos":[-800,1350]},"fileGLTF1":{"pos":[-150,-250]},"transform1":{"pos":[-150,50]},"hierarchy1":{"pos":[-150,-100]},"BVHVisualizer1":{"pos":[100,1050]},"objectProperties1":{"pos":[-150,300]},"objectProperties3":{"pos":[-150,1100]},"tube1":{"pos":[350,100]},"circle2":{"pos":[650,100]},"copy2":{"pos":[450,300]},"merge3":{"pos":[-150,700]},"BVH1":{"pos":[-150,950]},"material1":{"pos":[-150,800]},"merge4":{"pos":[450,450]},"attribDelete2":{"pos":[450,550]}}},"COP":{"pos":[-200,50],"selection":["image1"],"nodes":{"envMap":{"pos":[50,250]},"imageEnv":{"pos":[50,100]},"image1":{"pos":[-200,100]}}},"cameras":{"pos":[50,-50],"nodes":{"perspectiveCamera1":{"pos":[0,-50]},"cameraControls1":{"pos":[0,150],"nodes":{"cameraOrbitControls1":{"pos":[0,0]}}},"cameraPostProcess1":{"pos":[0,550],"nodes":{"bloom1":{"pos":[0,-200]},"toneMapping1":{"pos":[0,0]},"OUT":{"pos":[0,200]}}},"cameraRenderer1":{"pos":[0,350],"nodes":{"WebGLRenderer1":{"pos":[0,0]}}}}},"env":{"pos":[50,-350],"nodes":{"material1":{"pos":[0,300]},"MAT":{"pos":[-200,300],"nodes":{"meshStandardBuilder1":{"pos":[0,200],"nodes":{"globals1":{"pos":[-450,0]},"output1":{"pos":[400,0]},"vec3ToFloat1":{"pos":[-200,200]},"floatToVec2_1":{"pos":[-100,200]},"checkers1":{"pos":[50,200]},"mix1":{"pos":[250,0]},"constant1":{"pos":[50,-150]},"constant2":{"pos":[0,0]}}},"sky1":{"pos":[0,400]}}},"box1":{"pos":[0,100]},"sphere1":{"pos":[300,100]},"material2":{"pos":[300,350]},"merge1":{"pos":[100,550]},"transform1":{"pos":[300,200]}}},"lights":{"pos":[50,-150],"nodes":{"hemisphereLight1":{"pos":[50,-50]},"polarTransform1":{"pos":[300,150]},"merge1":{"pos":[100,350]},"areaLight1":{"pos":[300,-100]},"spotLight1":{"pos":[450,-100]},"merge2":{"pos":[400,250]},"polarTransform2":{"pos":[450,100]}}}}},"shaders":{"/geo1/MAT/pointsBuilder1":{"vertex":"uniform float size;\nuniform float scale;\n#include <common>\n\n\n\n// /geo1/MAT/pointsBuilder1/fit1\n//\n//\n// FIT\n//\n//\nfloat fit(float val, float srcMin, float srcMax, float destMin, float destMax){\n\tfloat src_range = srcMax - srcMin;\n\tfloat dest_range = destMax - destMin;\n\n\tfloat r = (val - srcMin) / src_range;\n\treturn (r * dest_range) + destMin;\n}\nvec2 fit(vec2 val, vec2 srcMin, vec2 srcMax, vec2 destMin, vec2 destMax){\n\treturn vec2(\n\t\tfit(val.x, srcMin.x, srcMax.x, destMin.x, destMax.x),\n\t\tfit(val.y, srcMin.y, srcMax.y, destMin.y, destMax.y)\n\t);\n}\nvec3 fit(vec3 val, vec3 srcMin, vec3 srcMax, vec3 destMin, vec3 destMax){\n\treturn vec3(\n\t\tfit(val.x, srcMin.x, srcMax.x, destMin.x, destMax.x),\n\t\tfit(val.y, srcMin.y, srcMax.y, destMin.y, destMax.y),\n\t\tfit(val.z, srcMin.z, srcMax.z, destMin.z, destMax.z)\n\t);\n}\nvec4 fit(vec4 val, vec4 srcMin, vec4 srcMax, vec4 destMin, vec4 destMax){\n\treturn vec4(\n\t\tfit(val.x, srcMin.x, srcMax.x, destMin.x, destMax.x),\n\t\tfit(val.y, srcMin.y, srcMax.y, destMin.y, destMax.y),\n\t\tfit(val.z, srcMin.z, srcMax.z, destMin.z, destMax.z),\n\t\tfit(val.w, srcMin.w, srcMax.w, destMin.w, destMax.w)\n\t);\n}\n\n//\n//\n// FIT TO 01\n// fits the range [srcMin, srcMax] to [0, 1]\n//\nfloat fitTo01(float val, float srcMin, float srcMax){\n\tfloat size = srcMax - srcMin;\n\treturn (val - srcMin) / size;\n}\nvec2 fitTo01(vec2 val, vec2 srcMin, vec2 srcMax){\n\treturn vec2(\n\t\tfitTo01(val.x, srcMin.x, srcMax.x),\n\t\tfitTo01(val.y, srcMin.y, srcMax.y)\n\t);\n}\nvec3 fitTo01(vec3 val, vec3 srcMin, vec3 srcMax){\n\treturn vec3(\n\t\tfitTo01(val.x, srcMin.x, srcMax.x),\n\t\tfitTo01(val.y, srcMin.y, srcMax.y),\n\t\tfitTo01(val.z, srcMin.z, srcMax.z)\n\t);\n}\nvec4 fitTo01(vec4 val, vec4 srcMin, vec4 srcMax){\n\treturn vec4(\n\t\tfitTo01(val.x, srcMin.x, srcMax.x),\n\t\tfitTo01(val.y, srcMin.y, srcMax.y),\n\t\tfitTo01(val.z, srcMin.z, srcMax.z),\n\t\tfitTo01(val.w, srcMin.w, srcMax.w)\n\t);\n}\n\n//\n//\n// FIT FROM 01\n// fits the range [0, 1] to [destMin, destMax]\n//\nfloat fitFrom01(float val, float destMin, float destMax){\n\treturn fit(val, 0.0, 1.0, destMin, destMax);\n}\nvec2 fitFrom01(vec2 val, vec2 srcMin, vec2 srcMax){\n\treturn vec2(\n\t\tfitFrom01(val.x, srcMin.x, srcMax.x),\n\t\tfitFrom01(val.y, srcMin.y, srcMax.y)\n\t);\n}\nvec3 fitFrom01(vec3 val, vec3 srcMin, vec3 srcMax){\n\treturn vec3(\n\t\tfitFrom01(val.x, srcMin.x, srcMax.x),\n\t\tfitFrom01(val.y, srcMin.y, srcMax.y),\n\t\tfitFrom01(val.z, srcMin.z, srcMax.z)\n\t);\n}\nvec4 fitFrom01(vec4 val, vec4 srcMin, vec4 srcMax){\n\treturn vec4(\n\t\tfitFrom01(val.x, srcMin.x, srcMax.x),\n\t\tfitFrom01(val.y, srcMin.y, srcMax.y),\n\t\tfitFrom01(val.z, srcMin.z, srcMax.z),\n\t\tfitFrom01(val.w, srcMin.w, srcMax.w)\n\t);\n}\n\n//\n//\n// FIT FROM 01 TO VARIANCE\n// fits the range [0, 1] to [center - variance, center + variance]\n//\nfloat fitFrom01ToVariance(float val, float center, float variance){\n\treturn fitFrom01(val, center - variance, center + variance);\n}\nvec2 fitFrom01ToVariance(vec2 val, vec2 center, vec2 variance){\n\treturn vec2(\n\t\tfitFrom01ToVariance(val.x, center.x, variance.x),\n\t\tfitFrom01ToVariance(val.y, center.y, variance.y)\n\t);\n}\nvec3 fitFrom01ToVariance(vec3 val, vec3 center, vec3 variance){\n\treturn vec3(\n\t\tfitFrom01ToVariance(val.x, center.x, variance.x),\n\t\tfitFrom01ToVariance(val.y, center.y, variance.y),\n\t\tfitFrom01ToVariance(val.z, center.z, variance.z)\n\t);\n}\nvec4 fitFrom01ToVariance(vec4 val, vec4 center, vec4 variance){\n\treturn vec4(\n\t\tfitFrom01ToVariance(val.x, center.x, variance.x),\n\t\tfitFrom01ToVariance(val.y, center.y, variance.y),\n\t\tfitFrom01ToVariance(val.z, center.z, variance.z),\n\t\tfitFrom01ToVariance(val.w, center.w, variance.w)\n\t);\n}\n\n\n\n\n\n\n\n// /geo1/MAT/pointsBuilder1/globals1\nuniform float time;\n\n// /geo1/MAT/pointsBuilder1/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n// /geo1/MAT/pointsBuilder1/attribute1\nattribute float id;\n\n\n\n\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n#ifdef USE_POINTS_UV\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\nvoid main() {\n\t#ifdef USE_POINTS_UV\n\t\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\t#endif\n\t#include <color_vertex>\n\n\n\n\t// /geo1/MAT/pointsBuilder1/attribute1\n\tfloat v_POLY_attribute1_val = id;\n\t\n\t// /geo1/MAT/pointsBuilder1/globals1\n\tfloat v_POLY_globals1_time = time;\n\t\n\t// /geo1/MAT/pointsBuilder1/constant1\n\tfloat v_POLY_constant1_val = 0.03;\n\t\n\t// /geo1/MAT/pointsBuilder1/laserColor1\n\tfloat v_POLY_laserColor1_attribute1_val = id;\n\tv_POLY_attribute_id = float(id);\n\t\n\t// /geo1/MAT/pointsBuilder1/round1\n\tfloat v_POLY_round1_val = sign(v_POLY_attribute1_val)*floor(abs(v_POLY_attribute1_val)+0.5);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd1\n\tfloat v_POLY_multAdd1_val = (6.0*(v_POLY_globals1_time + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/floatToVec2_1\n\tvec2 v_POLY_floatToVec2_1_vec2 = vec2(v_POLY_round1_val, 0.54);\n\t\n\t// /geo1/MAT/pointsBuilder1/random1\n\tfloat v_POLY_random1_rand = rand(v_POLY_floatToVec2_1_vec2);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd5\n\tfloat v_POLY_multAdd5_val = (4.4*(v_POLY_random1_rand + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd2\n\tfloat v_POLY_multAdd2_val = (1.0*(v_POLY_multAdd5_val + v_POLY_multAdd1_val)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/cos1\n\tfloat v_POLY_cos1_val = cos(v_POLY_multAdd2_val);\n\t\n\t// /geo1/MAT/pointsBuilder1/fit1\n\tfloat v_POLY_fit1_val = fit(v_POLY_cos1_val, -1.0, 1.0, 0.22, 1.0);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd4\n\tfloat v_POLY_multAdd4_val = (v_POLY_constant1_val*(v_POLY_fit1_val + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/output1\n\tvec3 transformed = position;\n\tvec3 objectNormal = normal;\n\t#ifdef USE_TANGENT\n\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t#endif\n\tgl_PointSize = v_POLY_multAdd4_val * size * 10.0;\n\n\n\n\t#include <morphcolor_vertex>\n// removed:\n//\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n// removed:\n//\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <fog_vertex>\n}","fragment":"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n\n\n\n// /geo1/MAT/pointsBuilder1/laserColor1/rgbToOklab1\n//////////////////////////////////////////////////////////////////////\n//\n// Visualizing Björn Ottosson's \"oklab\" colorspace\n//\n// shadertoy implementation by mattz\n//\n// license CC0 (public domain)\n// https://creativecommons.org/share-your-work/public-domain/cc0/\n//\n// Click and drag to set lightness (mouse x) and chroma (mouse y).\n// Hue varies linearly across the image from left to right.\n//\n// While mouse is down, plotted curves show oklab components\n// L (red), a (green), and b (blue). \n//\n// To test the inverse mapping, the plotted curves are generated\n// by mapping the (pre-clipping) linear RGB color back to oklab \n// space.\n//\n// White bars on top of the image (and black bars on the bottom of\n// the image) indicate clipping when one or more of the R, G, B \n// components are greater than 1.0 (or less than 0.0 respectively).\n//\n// The color accompanying the black/white bar shows which channels\n// are out of gamut.\n//\n// Click in the bottom left to reset the view.\n//\n// Hit the 'G' key to toggle displaying a gamut test:\n//\n// * black pixels indicate that RGB values for some hues\n// were clipped to 0 at the given lightness/chroma pair.\n//\n// * white pixels indicate that RGB values for some hues\n// were clipped to 1 at the given lightness/chroma pair\n//\n// * gray pixels indicate that both types of clipping happened\n//\n// Hit the 'U' key to display a uniform sampling of linear sRGB \n// space, converted into oklab lightness (x position) and chroma\n// (y position) coordinates. If you mouse over a colored dot, the\n// spectrum on screen should include that exact color.\n//\n//////////////////////////////////////////////////////////////////////\n\n//////////////////////////////////////////////////////////////////////\n// sRGB color transform and inverse from \n// https://bottosson.github.io/posts/colorwrong/#what-can-we-do%3F\n\nvec3 srgb_from_linear_srgb(vec3 x) {\n\n vec3 xlo = 12.92*x;\n vec3 xhi = 1.055 * pow(x, vec3(0.4166666666666667)) - 0.055;\n \n return mix(xlo, xhi, step(vec3(0.0031308), x));\n\n}\n\nvec3 linear_srgb_from_srgb(vec3 x) {\n\n vec3 xlo = x / 12.92;\n vec3 xhi = pow((x + 0.055)/(1.055), vec3(2.4));\n \n return mix(xlo, xhi, step(vec3(0.04045), x));\n\n}\n\n//////////////////////////////////////////////////////////////////////\n// oklab transform and inverse from\n// https://bottosson.github.io/posts/oklab/\n\n\nconst mat3 fwdA = mat3(1.0, 1.0, 1.0,\n 0.3963377774, -0.1055613458, -0.0894841775,\n 0.2158037573, -0.0638541728, -1.2914855480);\n \nconst mat3 fwdB = mat3(4.0767245293, -1.2681437731, -0.0041119885,\n -3.3072168827, 2.6093323231, -0.7034763098,\n 0.2307590544, -0.3411344290, 1.7068625689);\n\nconst mat3 invB = mat3(0.4121656120, 0.2118591070, 0.0883097947,\n 0.5362752080, 0.6807189584, 0.2818474174,\n 0.0514575653, 0.1074065790, 0.6302613616);\n \nconst mat3 invA = mat3(0.2104542553, 1.9779984951, 0.0259040371,\n 0.7936177850, -2.4285922050, 0.7827717662,\n -0.0040720468, 0.4505937099, -0.8086757660);\n\nvec3 oklab_from_linear_srgb(vec3 c) {\n\n vec3 lms = invB * c;\n \n return invA * (sign(lms)*pow(abs(lms), vec3(0.3333333333333)));\n \n}\n\nvec3 linear_srgb_from_oklab(vec3 c) {\n\n vec3 lms = fwdA * c;\n \n return fwdB * (lms * lms * lms);\n \n}\n\n\n// https://www.shadertoy.com/view/WtccD7\nconst float max_chroma = 0.33;\nvec3 uvToOklab(vec3 uvw){\n\n // setup oklab color\n float theta = 2.*3.141592653589793*uvw.x;\n \n float L = 0.8;\n float chroma = 0.1;\n \n //if (max(iMouse.x, iMouse.y) > 0.05 * iResolution.y) {\n L = uvw.y;//iMouse.x / iResolution.x;\n chroma = uvw.z * max_chroma;// / iResolution.y;\n //}\n \n float a = chroma*cos(theta);\n float b = chroma*sin(theta);\n \n vec3 lab = vec3(L, a, b);\n\treturn lab;\n\n // convert to rgb \n // vec3 rgb = linear_srgb_from_oklab(lab);\n\n}\n\n// /geo1/MAT/pointsBuilder1/disk1\nfloat disk_feather(float dist, float radius, float feather){\n\tif(feather <= 0.0){\n\t\tif(dist < radius){return 1.0;}else{return 0.0;}\n\t} else {\n\t\tfloat half_feather = feather * 0.5;\n\t\tif(dist < (radius - half_feather)){\n\t\t\treturn 1.0;\n\t\t} else {\n\t\t\tif(dist > (radius + half_feather)){\n\t\t\t\treturn 0.0;\n\t\t\t} else {\n\t\t\t\tfloat feather_start = (radius - half_feather);\n\t\t\t\tfloat blend = 1.0 - (dist - feather_start) / feather;\n\t\t\t\treturn blend;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfloat disk2d(vec2 pos, vec2 center, float radius, float feather){\n\tfloat dist = distance(pos, center);\n\treturn disk_feather(dist, radius, feather);\n}\n\n// function could be called sphere, but is an overload of disk, and is the same\nfloat disk3d(vec3 pos, vec3 center, float radius, float feather){\n\tfloat dist = distance(pos, center);\n\treturn disk_feather(dist, radius, feather);\n}\n\n\n\n\n\n\n\n// /geo1/MAT/pointsBuilder1/globals1\nuniform float time;\n\n// /geo1/MAT/pointsBuilder1/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n\n\n\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\n\n\t// /geo1/MAT/pointsBuilder1/globals1\n\tvec2 v_POLY_globals1_gl_PointCoord = gl_PointCoord;\n\tfloat v_POLY_globals1_time = time;\n\t\n\t// /geo1/MAT/pointsBuilder1/laserColor1\n\tvec3 v_POLY_laserColor1_baseColor = vec3(0.0, 0.0, 0.0);\n\tif(true){\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/constant2\n\t\tvec3 v_POLY_laserColor1_constant2_val = vec3(0.6653872982754769, 0.5583403896257968, 0.005181516700061659);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/constant1\n\t\tvec3 v_POLY_laserColor1_constant1_val = vec3(0.7011018919268015, 0.018500220124016656, 0.005181516700061659);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/attribute1\n\t\tfloat v_POLY_laserColor1_attribute1_val = v_POLY_attribute_id;\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/rgbToOklab1\n\t\tvec3 v_POLY_laserColor1_rgbToOklab1_oklab = oklab_from_linear_srgb(v_POLY_laserColor1_constant2_val);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/rgbToOklab2\n\t\tvec3 v_POLY_laserColor1_rgbToOklab2_oklab = oklab_from_linear_srgb(v_POLY_laserColor1_constant1_val);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/round1\n\t\tfloat v_POLY_laserColor1_round1_val = sign(v_POLY_laserColor1_attribute1_val)*floor(abs(v_POLY_laserColor1_attribute1_val)+0.5);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/floatToVec2_1\n\t\tvec2 v_POLY_laserColor1_floatToVec2_1_vec2 = vec2(v_POLY_laserColor1_round1_val, 0.54);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/random1\n\t\tfloat v_POLY_laserColor1_random1_rand = rand(v_POLY_laserColor1_floatToVec2_1_vec2);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/pow1\n\t\tfloat v_POLY_laserColor1_pow1_val = pow(v_POLY_laserColor1_random1_rand, 0.27);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/mix1\n\t\tvec3 v_POLY_laserColor1_mix1_mix = mix(v_POLY_laserColor1_rgbToOklab1_oklab, v_POLY_laserColor1_rgbToOklab2_oklab, v_POLY_laserColor1_pow1_val);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/oklabToRgb1\n\t\tvec3 v_POLY_laserColor1_oklabToRgb1_rgb = linear_srgb_from_oklab(v_POLY_laserColor1_mix1_mix);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/subnetOutput1\n\t\tv_POLY_laserColor1_baseColor = v_POLY_laserColor1_oklabToRgb1_rgb;\n\t}\n\t\n\t// /geo1/MAT/pointsBuilder1/disk1\n\tfloat v_POLY_disk1_float = disk2d(v_POLY_globals1_gl_PointCoord, vec2(0.5, 0.5), 0.2, 0.24);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd6\n\tfloat v_POLY_multAdd6_val = (0.33*(v_POLY_disk1_float + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/output1\n\tdiffuseColor.xyz = v_POLY_laserColor1_baseColor;\n\tdiffuseColor.a = v_POLY_multAdd6_val;\n\n\n\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}","customDistanceMaterial.vertex":"\nuniform float size;\nuniform float scale;\n#include <common>\n#include <clipping_planes_pars_vertex>\nvarying float vViewZDepth;\n\n// INSERT DEFINES\n\n\n\n// /geo1/MAT/pointsBuilder1/fit1\n//\n//\n// FIT\n//\n//\nfloat fit(float val, float srcMin, float srcMax, float destMin, float destMax){\n\tfloat src_range = srcMax - srcMin;\n\tfloat dest_range = destMax - destMin;\n\n\tfloat r = (val - srcMin) / src_range;\n\treturn (r * dest_range) + destMin;\n}\nvec2 fit(vec2 val, vec2 srcMin, vec2 srcMax, vec2 destMin, vec2 destMax){\n\treturn vec2(\n\t\tfit(val.x, srcMin.x, srcMax.x, destMin.x, destMax.x),\n\t\tfit(val.y, srcMin.y, srcMax.y, destMin.y, destMax.y)\n\t);\n}\nvec3 fit(vec3 val, vec3 srcMin, vec3 srcMax, vec3 destMin, vec3 destMax){\n\treturn vec3(\n\t\tfit(val.x, srcMin.x, srcMax.x, destMin.x, destMax.x),\n\t\tfit(val.y, srcMin.y, srcMax.y, destMin.y, destMax.y),\n\t\tfit(val.z, srcMin.z, srcMax.z, destMin.z, destMax.z)\n\t);\n}\nvec4 fit(vec4 val, vec4 srcMin, vec4 srcMax, vec4 destMin, vec4 destMax){\n\treturn vec4(\n\t\tfit(val.x, srcMin.x, srcMax.x, destMin.x, destMax.x),\n\t\tfit(val.y, srcMin.y, srcMax.y, destMin.y, destMax.y),\n\t\tfit(val.z, srcMin.z, srcMax.z, destMin.z, destMax.z),\n\t\tfit(val.w, srcMin.w, srcMax.w, destMin.w, destMax.w)\n\t);\n}\n\n//\n//\n// FIT TO 01\n// fits the range [srcMin, srcMax] to [0, 1]\n//\nfloat fitTo01(float val, float srcMin, float srcMax){\n\tfloat size = srcMax - srcMin;\n\treturn (val - srcMin) / size;\n}\nvec2 fitTo01(vec2 val, vec2 srcMin, vec2 srcMax){\n\treturn vec2(\n\t\tfitTo01(val.x, srcMin.x, srcMax.x),\n\t\tfitTo01(val.y, srcMin.y, srcMax.y)\n\t);\n}\nvec3 fitTo01(vec3 val, vec3 srcMin, vec3 srcMax){\n\treturn vec3(\n\t\tfitTo01(val.x, srcMin.x, srcMax.x),\n\t\tfitTo01(val.y, srcMin.y, srcMax.y),\n\t\tfitTo01(val.z, srcMin.z, srcMax.z)\n\t);\n}\nvec4 fitTo01(vec4 val, vec4 srcMin, vec4 srcMax){\n\treturn vec4(\n\t\tfitTo01(val.x, srcMin.x, srcMax.x),\n\t\tfitTo01(val.y, srcMin.y, srcMax.y),\n\t\tfitTo01(val.z, srcMin.z, srcMax.z),\n\t\tfitTo01(val.w, srcMin.w, srcMax.w)\n\t);\n}\n\n//\n//\n// FIT FROM 01\n// fits the range [0, 1] to [destMin, destMax]\n//\nfloat fitFrom01(float val, float destMin, float destMax){\n\treturn fit(val, 0.0, 1.0, destMin, destMax);\n}\nvec2 fitFrom01(vec2 val, vec2 srcMin, vec2 srcMax){\n\treturn vec2(\n\t\tfitFrom01(val.x, srcMin.x, srcMax.x),\n\t\tfitFrom01(val.y, srcMin.y, srcMax.y)\n\t);\n}\nvec3 fitFrom01(vec3 val, vec3 srcMin, vec3 srcMax){\n\treturn vec3(\n\t\tfitFrom01(val.x, srcMin.x, srcMax.x),\n\t\tfitFrom01(val.y, srcMin.y, srcMax.y),\n\t\tfitFrom01(val.z, srcMin.z, srcMax.z)\n\t);\n}\nvec4 fitFrom01(vec4 val, vec4 srcMin, vec4 srcMax){\n\treturn vec4(\n\t\tfitFrom01(val.x, srcMin.x, srcMax.x),\n\t\tfitFrom01(val.y, srcMin.y, srcMax.y),\n\t\tfitFrom01(val.z, srcMin.z, srcMax.z),\n\t\tfitFrom01(val.w, srcMin.w, srcMax.w)\n\t);\n}\n\n//\n//\n// FIT FROM 01 TO VARIANCE\n// fits the range [0, 1] to [center - variance, center + variance]\n//\nfloat fitFrom01ToVariance(float val, float center, float variance){\n\treturn fitFrom01(val, center - variance, center + variance);\n}\nvec2 fitFrom01ToVariance(vec2 val, vec2 center, vec2 variance){\n\treturn vec2(\n\t\tfitFrom01ToVariance(val.x, center.x, variance.x),\n\t\tfitFrom01ToVariance(val.y, center.y, variance.y)\n\t);\n}\nvec3 fitFrom01ToVariance(vec3 val, vec3 center, vec3 variance){\n\treturn vec3(\n\t\tfitFrom01ToVariance(val.x, center.x, variance.x),\n\t\tfitFrom01ToVariance(val.y, center.y, variance.y),\n\t\tfitFrom01ToVariance(val.z, center.z, variance.z)\n\t);\n}\nvec4 fitFrom01ToVariance(vec4 val, vec4 center, vec4 variance){\n\treturn vec4(\n\t\tfitFrom01ToVariance(val.x, center.x, variance.x),\n\t\tfitFrom01ToVariance(val.y, center.y, variance.y),\n\t\tfitFrom01ToVariance(val.z, center.z, variance.z),\n\t\tfitFrom01ToVariance(val.w, center.w, variance.w)\n\t);\n}\n\n\n\n\n\n\n\n// /geo1/MAT/pointsBuilder1/globals1\nuniform float time;\n\n// /geo1/MAT/pointsBuilder1/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n// /geo1/MAT/pointsBuilder1/attribute1\nattribute float id;\n\n\n\n\n\n\n// vHighPrecisionZW is added to match CustomMeshDepth.frag\n// which is itself taken from threejs\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t// INSERT BODY\n\n\n\n\t// /geo1/MAT/pointsBuilder1/attribute1\n\tfloat v_POLY_attribute1_val = id;\n\t\n\t// /geo1/MAT/pointsBuilder1/globals1\n\tfloat v_POLY_globals1_time = time;\n\t\n\t// /geo1/MAT/pointsBuilder1/constant1\n\tfloat v_POLY_constant1_val = 0.03;\n\t\n\t// /geo1/MAT/pointsBuilder1/laserColor1\n\tfloat v_POLY_laserColor1_attribute1_val = id;\n\tv_POLY_attribute_id = float(id);\n\t\n\t// /geo1/MAT/pointsBuilder1/round1\n\tfloat v_POLY_round1_val = sign(v_POLY_attribute1_val)*floor(abs(v_POLY_attribute1_val)+0.5);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd1\n\tfloat v_POLY_multAdd1_val = (6.0*(v_POLY_globals1_time + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/floatToVec2_1\n\tvec2 v_POLY_floatToVec2_1_vec2 = vec2(v_POLY_round1_val, 0.54);\n\t\n\t// /geo1/MAT/pointsBuilder1/random1\n\tfloat v_POLY_random1_rand = rand(v_POLY_floatToVec2_1_vec2);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd5\n\tfloat v_POLY_multAdd5_val = (4.4*(v_POLY_random1_rand + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd2\n\tfloat v_POLY_multAdd2_val = (1.0*(v_POLY_multAdd5_val + v_POLY_multAdd1_val)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/cos1\n\tfloat v_POLY_cos1_val = cos(v_POLY_multAdd2_val);\n\t\n\t// /geo1/MAT/pointsBuilder1/fit1\n\tfloat v_POLY_fit1_val = fit(v_POLY_cos1_val, -1.0, 1.0, 0.22, 1.0);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd4\n\tfloat v_POLY_multAdd4_val = (v_POLY_constant1_val*(v_POLY_fit1_val + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/output1\n\tvec3 transformed = position;\n\tvec3 objectNormal = normal;\n\t#ifdef USE_TANGENT\n\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t#endif\n\tgl_PointSize = v_POLY_multAdd4_val * size * 10.0;\n\n\n\n\n\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\tvViewZDepth = - mvPosition.z;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\n\tvHighPrecisionZW = gl_Position.zw;\n\n}\n","customDistanceMaterial.fragment":"\n// INSERT DEFINES\n\n\n\n// /geo1/MAT/pointsBuilder1/laserColor1/rgbToOklab1\n//////////////////////////////////////////////////////////////////////\n//\n// Visualizing Björn Ottosson's \"oklab\" colorspace\n//\n// shadertoy implementation by mattz\n//\n// license CC0 (public domain)\n// https://creativecommons.org/share-your-work/public-domain/cc0/\n//\n// Click and drag to set lightness (mouse x) and chroma (mouse y).\n// Hue varies linearly across the image from left to right.\n//\n// While mouse is down, plotted curves show oklab components\n// L (red), a (green), and b (blue). \n//\n// To test the inverse mapping, the plotted curves are generated\n// by mapping the (pre-clipping) linear RGB color back to oklab \n// space.\n//\n// White bars on top of the image (and black bars on the bottom of\n// the image) indicate clipping when one or more of the R, G, B \n// components are greater than 1.0 (or less than 0.0 respectively).\n//\n// The color accompanying the black/white bar shows which channels\n// are out of gamut.\n//\n// Click in the bottom left to reset the view.\n//\n// Hit the 'G' key to toggle displaying a gamut test:\n//\n// * black pixels indicate that RGB values for some hues\n// were clipped to 0 at the given lightness/chroma pair.\n//\n// * white pixels indicate that RGB values for some hues\n// were clipped to 1 at the given lightness/chroma pair\n//\n// * gray pixels indicate that both types of clipping happened\n//\n// Hit the 'U' key to display a uniform sampling of linear sRGB \n// space, converted into oklab lightness (x position) and chroma\n// (y position) coordinates. If you mouse over a colored dot, the\n// spectrum on screen should include that exact color.\n//\n//////////////////////////////////////////////////////////////////////\n\n//////////////////////////////////////////////////////////////////////\n// sRGB color transform and inverse from \n// https://bottosson.github.io/posts/colorwrong/#what-can-we-do%3F\n\nvec3 srgb_from_linear_srgb(vec3 x) {\n\n vec3 xlo = 12.92*x;\n vec3 xhi = 1.055 * pow(x, vec3(0.4166666666666667)) - 0.055;\n \n return mix(xlo, xhi, step(vec3(0.0031308), x));\n\n}\n\nvec3 linear_srgb_from_srgb(vec3 x) {\n\n vec3 xlo = x / 12.92;\n vec3 xhi = pow((x + 0.055)/(1.055), vec3(2.4));\n \n return mix(xlo, xhi, step(vec3(0.04045), x));\n\n}\n\n//////////////////////////////////////////////////////////////////////\n// oklab transform and inverse from\n// https://bottosson.github.io/posts/oklab/\n\n\nconst mat3 fwdA = mat3(1.0, 1.0, 1.0,\n 0.3963377774, -0.1055613458, -0.0894841775,\n 0.2158037573, -0.0638541728, -1.2914855480);\n \nconst mat3 fwdB = mat3(4.0767245293, -1.2681437731, -0.0041119885,\n -3.3072168827, 2.6093323231, -0.7034763098,\n 0.2307590544, -0.3411344290, 1.7068625689);\n\nconst mat3 invB = mat3(0.4121656120, 0.2118591070, 0.0883097947,\n 0.5362752080, 0.6807189584, 0.2818474174,\n 0.0514575653, 0.1074065790, 0.6302613616);\n \nconst mat3 invA = mat3(0.2104542553, 1.9779984951, 0.0259040371,\n 0.7936177850, -2.4285922050, 0.7827717662,\n -0.0040720468, 0.4505937099, -0.8086757660);\n\nvec3 oklab_from_linear_srgb(vec3 c) {\n\n vec3 lms = invB * c;\n \n return invA * (sign(lms)*pow(abs(lms), vec3(0.3333333333333)));\n \n}\n\nvec3 linear_srgb_from_oklab(vec3 c) {\n\n vec3 lms = fwdA * c;\n \n return fwdB * (lms * lms * lms);\n \n}\n\n\n// https://www.shadertoy.com/view/WtccD7\nconst float max_chroma = 0.33;\nvec3 uvToOklab(vec3 uvw){\n\n // setup oklab color\n float theta = 2.*3.141592653589793*uvw.x;\n \n float L = 0.8;\n float chroma = 0.1;\n \n //if (max(iMouse.x, iMouse.y) > 0.05 * iResolution.y) {\n L = uvw.y;//iMouse.x / iResolution.x;\n chroma = uvw.z * max_chroma;// / iResolution.y;\n //}\n \n float a = chroma*cos(theta);\n float b = chroma*sin(theta);\n \n vec3 lab = vec3(L, a, b);\n\treturn lab;\n\n // convert to rgb \n // vec3 rgb = linear_srgb_from_oklab(lab);\n\n}\n\n// /geo1/MAT/pointsBuilder1/disk1\nfloat disk_feather(float dist, float radius, float feather){\n\tif(feather <= 0.0){\n\t\tif(dist < radius){return 1.0;}else{return 0.0;}\n\t} else {\n\t\tfloat half_feather = feather * 0.5;\n\t\tif(dist < (radius - half_feather)){\n\t\t\treturn 1.0;\n\t\t} else {\n\t\t\tif(dist > (radius + half_feather)){\n\t\t\t\treturn 0.0;\n\t\t\t} else {\n\t\t\t\tfloat feather_start = (radius - half_feather);\n\t\t\t\tfloat blend = 1.0 - (dist - feather_start) / feather;\n\t\t\t\treturn blend;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfloat disk2d(vec2 pos, vec2 center, float radius, float feather){\n\tfloat dist = distance(pos, center);\n\treturn disk_feather(dist, radius, feather);\n}\n\n// function could be called sphere, but is an overload of disk, and is the same\nfloat disk3d(vec3 pos, vec3 center, float radius, float feather){\n\tfloat dist = distance(pos, center);\n\treturn disk_feather(dist, radius, feather);\n}\n\n\n\n\n\n\n\n// /geo1/MAT/pointsBuilder1/globals1\nuniform float time;\n\n// /geo1/MAT/pointsBuilder1/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n\n\n\n\n\n#if DEPTH_PACKING == 3200\n\n\tuniform float opacity;\n\n#endif\n\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tdiffuseColor.a = opacity;\n\n\t#endif\n\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\n\t// INSERT BODY\n\n\n\n\t// /geo1/MAT/pointsBuilder1/globals1\n\tvec2 v_POLY_globals1_gl_PointCoord = gl_PointCoord;\n\tfloat v_POLY_globals1_time = time;\n\t\n\t// /geo1/MAT/pointsBuilder1/laserColor1\n\tvec3 v_POLY_laserColor1_baseColor = vec3(0.0, 0.0, 0.0);\n\tif(true){\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/constant2\n\t\tvec3 v_POLY_laserColor1_constant2_val = vec3(0.6653872982754769, 0.5583403896257968, 0.005181516700061659);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/constant1\n\t\tvec3 v_POLY_laserColor1_constant1_val = vec3(0.7011018919268015, 0.018500220124016656, 0.005181516700061659);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/attribute1\n\t\tfloat v_POLY_laserColor1_attribute1_val = v_POLY_attribute_id;\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/rgbToOklab1\n\t\tvec3 v_POLY_laserColor1_rgbToOklab1_oklab = oklab_from_linear_srgb(v_POLY_laserColor1_constant2_val);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/rgbToOklab2\n\t\tvec3 v_POLY_laserColor1_rgbToOklab2_oklab = oklab_from_linear_srgb(v_POLY_laserColor1_constant1_val);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/round1\n\t\tfloat v_POLY_laserColor1_round1_val = sign(v_POLY_laserColor1_attribute1_val)*floor(abs(v_POLY_laserColor1_attribute1_val)+0.5);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/floatToVec2_1\n\t\tvec2 v_POLY_laserColor1_floatToVec2_1_vec2 = vec2(v_POLY_laserColor1_round1_val, 0.54);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/random1\n\t\tfloat v_POLY_laserColor1_random1_rand = rand(v_POLY_laserColor1_floatToVec2_1_vec2);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/pow1\n\t\tfloat v_POLY_laserColor1_pow1_val = pow(v_POLY_laserColor1_random1_rand, 0.27);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/mix1\n\t\tvec3 v_POLY_laserColor1_mix1_mix = mix(v_POLY_laserColor1_rgbToOklab1_oklab, v_POLY_laserColor1_rgbToOklab2_oklab, v_POLY_laserColor1_pow1_val);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/oklabToRgb1\n\t\tvec3 v_POLY_laserColor1_oklabToRgb1_rgb = linear_srgb_from_oklab(v_POLY_laserColor1_mix1_mix);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/subnetOutput1\n\t\tv_POLY_laserColor1_baseColor = v_POLY_laserColor1_oklabToRgb1_rgb;\n\t}\n\t\n\t// /geo1/MAT/pointsBuilder1/disk1\n\tfloat v_POLY_disk1_float = disk2d(v_POLY_globals1_gl_PointCoord, vec2(0.5, 0.5), 0.2, 0.24);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd6\n\tfloat v_POLY_multAdd6_val = (0.33*(v_POLY_disk1_float + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/output1\n\tdiffuseColor.xyz = v_POLY_laserColor1_baseColor;\n\tdiffuseColor.a = v_POLY_multAdd6_val;\n\n\n\n\t// the new body lines should be added before the alphatest_fragment\n\t// so that alpha is set before (which is really how it would be set if the alphamap_fragment above was used by the material node parameters)\n\n\t#include <alphatest_fragment>\n\n\t#include <logdepthbuf_fragment>\n\n\n\t// Higher precision equivalent of gl_FragCoord.z. This assumes depthRange has been left to its default values.\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), diffuseColor.a );\n\n\t#elif DEPTH_PACKING == 3201\n\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\n\t#endif\n\n}\n","customDepthMaterial.vertex":"\nuniform float size;\nuniform float scale;\n#include <common>\n#include <clipping_planes_pars_vertex>\nvarying float vViewZDepth;\n\n// INSERT DEFINES\n\n\n\n// /geo1/MAT/pointsBuilder1/fit1\n//\n//\n// FIT\n//\n//\nfloat fit(float val, float srcMin, float srcMax, float destMin, float destMax){\n\tfloat src_range = srcMax - srcMin;\n\tfloat dest_range = destMax - destMin;\n\n\tfloat r = (val - srcMin) / src_range;\n\treturn (r * dest_range) + destMin;\n}\nvec2 fit(vec2 val, vec2 srcMin, vec2 srcMax, vec2 destMin, vec2 destMax){\n\treturn vec2(\n\t\tfit(val.x, srcMin.x, srcMax.x, destMin.x, destMax.x),\n\t\tfit(val.y, srcMin.y, srcMax.y, destMin.y, destMax.y)\n\t);\n}\nvec3 fit(vec3 val, vec3 srcMin, vec3 srcMax, vec3 destMin, vec3 destMax){\n\treturn vec3(\n\t\tfit(val.x, srcMin.x, srcMax.x, destMin.x, destMax.x),\n\t\tfit(val.y, srcMin.y, srcMax.y, destMin.y, destMax.y),\n\t\tfit(val.z, srcMin.z, srcMax.z, destMin.z, destMax.z)\n\t);\n}\nvec4 fit(vec4 val, vec4 srcMin, vec4 srcMax, vec4 destMin, vec4 destMax){\n\treturn vec4(\n\t\tfit(val.x, srcMin.x, srcMax.x, destMin.x, destMax.x),\n\t\tfit(val.y, srcMin.y, srcMax.y, destMin.y, destMax.y),\n\t\tfit(val.z, srcMin.z, srcMax.z, destMin.z, destMax.z),\n\t\tfit(val.w, srcMin.w, srcMax.w, destMin.w, destMax.w)\n\t);\n}\n\n//\n//\n// FIT TO 01\n// fits the range [srcMin, srcMax] to [0, 1]\n//\nfloat fitTo01(float val, float srcMin, float srcMax){\n\tfloat size = srcMax - srcMin;\n\treturn (val - srcMin) / size;\n}\nvec2 fitTo01(vec2 val, vec2 srcMin, vec2 srcMax){\n\treturn vec2(\n\t\tfitTo01(val.x, srcMin.x, srcMax.x),\n\t\tfitTo01(val.y, srcMin.y, srcMax.y)\n\t);\n}\nvec3 fitTo01(vec3 val, vec3 srcMin, vec3 srcMax){\n\treturn vec3(\n\t\tfitTo01(val.x, srcMin.x, srcMax.x),\n\t\tfitTo01(val.y, srcMin.y, srcMax.y),\n\t\tfitTo01(val.z, srcMin.z, srcMax.z)\n\t);\n}\nvec4 fitTo01(vec4 val, vec4 srcMin, vec4 srcMax){\n\treturn vec4(\n\t\tfitTo01(val.x, srcMin.x, srcMax.x),\n\t\tfitTo01(val.y, srcMin.y, srcMax.y),\n\t\tfitTo01(val.z, srcMin.z, srcMax.z),\n\t\tfitTo01(val.w, srcMin.w, srcMax.w)\n\t);\n}\n\n//\n//\n// FIT FROM 01\n// fits the range [0, 1] to [destMin, destMax]\n//\nfloat fitFrom01(float val, float destMin, float destMax){\n\treturn fit(val, 0.0, 1.0, destMin, destMax);\n}\nvec2 fitFrom01(vec2 val, vec2 srcMin, vec2 srcMax){\n\treturn vec2(\n\t\tfitFrom01(val.x, srcMin.x, srcMax.x),\n\t\tfitFrom01(val.y, srcMin.y, srcMax.y)\n\t);\n}\nvec3 fitFrom01(vec3 val, vec3 srcMin, vec3 srcMax){\n\treturn vec3(\n\t\tfitFrom01(val.x, srcMin.x, srcMax.x),\n\t\tfitFrom01(val.y, srcMin.y, srcMax.y),\n\t\tfitFrom01(val.z, srcMin.z, srcMax.z)\n\t);\n}\nvec4 fitFrom01(vec4 val, vec4 srcMin, vec4 srcMax){\n\treturn vec4(\n\t\tfitFrom01(val.x, srcMin.x, srcMax.x),\n\t\tfitFrom01(val.y, srcMin.y, srcMax.y),\n\t\tfitFrom01(val.z, srcMin.z, srcMax.z),\n\t\tfitFrom01(val.w, srcMin.w, srcMax.w)\n\t);\n}\n\n//\n//\n// FIT FROM 01 TO VARIANCE\n// fits the range [0, 1] to [center - variance, center + variance]\n//\nfloat fitFrom01ToVariance(float val, float center, float variance){\n\treturn fitFrom01(val, center - variance, center + variance);\n}\nvec2 fitFrom01ToVariance(vec2 val, vec2 center, vec2 variance){\n\treturn vec2(\n\t\tfitFrom01ToVariance(val.x, center.x, variance.x),\n\t\tfitFrom01ToVariance(val.y, center.y, variance.y)\n\t);\n}\nvec3 fitFrom01ToVariance(vec3 val, vec3 center, vec3 variance){\n\treturn vec3(\n\t\tfitFrom01ToVariance(val.x, center.x, variance.x),\n\t\tfitFrom01ToVariance(val.y, center.y, variance.y),\n\t\tfitFrom01ToVariance(val.z, center.z, variance.z)\n\t);\n}\nvec4 fitFrom01ToVariance(vec4 val, vec4 center, vec4 variance){\n\treturn vec4(\n\t\tfitFrom01ToVariance(val.x, center.x, variance.x),\n\t\tfitFrom01ToVariance(val.y, center.y, variance.y),\n\t\tfitFrom01ToVariance(val.z, center.z, variance.z),\n\t\tfitFrom01ToVariance(val.w, center.w, variance.w)\n\t);\n}\n\n\n\n\n\n\n\n// /geo1/MAT/pointsBuilder1/globals1\nuniform float time;\n\n// /geo1/MAT/pointsBuilder1/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n// /geo1/MAT/pointsBuilder1/attribute1\nattribute float id;\n\n\n\n\n\n\n// vHighPrecisionZW is added to match CustomMeshDepth.frag\n// which is itself taken from threejs\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t// INSERT BODY\n\n\n\n\t// /geo1/MAT/pointsBuilder1/attribute1\n\tfloat v_POLY_attribute1_val = id;\n\t\n\t// /geo1/MAT/pointsBuilder1/globals1\n\tfloat v_POLY_globals1_time = time;\n\t\n\t// /geo1/MAT/pointsBuilder1/constant1\n\tfloat v_POLY_constant1_val = 0.03;\n\t\n\t// /geo1/MAT/pointsBuilder1/laserColor1\n\tfloat v_POLY_laserColor1_attribute1_val = id;\n\tv_POLY_attribute_id = float(id);\n\t\n\t// /geo1/MAT/pointsBuilder1/round1\n\tfloat v_POLY_round1_val = sign(v_POLY_attribute1_val)*floor(abs(v_POLY_attribute1_val)+0.5);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd1\n\tfloat v_POLY_multAdd1_val = (6.0*(v_POLY_globals1_time + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/floatToVec2_1\n\tvec2 v_POLY_floatToVec2_1_vec2 = vec2(v_POLY_round1_val, 0.54);\n\t\n\t// /geo1/MAT/pointsBuilder1/random1\n\tfloat v_POLY_random1_rand = rand(v_POLY_floatToVec2_1_vec2);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd5\n\tfloat v_POLY_multAdd5_val = (4.4*(v_POLY_random1_rand + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd2\n\tfloat v_POLY_multAdd2_val = (1.0*(v_POLY_multAdd5_val + v_POLY_multAdd1_val)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/cos1\n\tfloat v_POLY_cos1_val = cos(v_POLY_multAdd2_val);\n\t\n\t// /geo1/MAT/pointsBuilder1/fit1\n\tfloat v_POLY_fit1_val = fit(v_POLY_cos1_val, -1.0, 1.0, 0.22, 1.0);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd4\n\tfloat v_POLY_multAdd4_val = (v_POLY_constant1_val*(v_POLY_fit1_val + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/output1\n\tvec3 transformed = position;\n\tvec3 objectNormal = normal;\n\t#ifdef USE_TANGENT\n\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t#endif\n\tgl_PointSize = v_POLY_multAdd4_val * size * 10.0;\n\n\n\n\n\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\tvViewZDepth = - mvPosition.z;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\n\tvHighPrecisionZW = gl_Position.zw;\n\n}\n","customDepthMaterial.fragment":"\n// INSERT DEFINES\n\n\n\n// /geo1/MAT/pointsBuilder1/laserColor1/rgbToOklab1\n//////////////////////////////////////////////////////////////////////\n//\n// Visualizing Björn Ottosson's \"oklab\" colorspace\n//\n// shadertoy implementation by mattz\n//\n// license CC0 (public domain)\n// https://creativecommons.org/share-your-work/public-domain/cc0/\n//\n// Click and drag to set lightness (mouse x) and chroma (mouse y).\n// Hue varies linearly across the image from left to right.\n//\n// While mouse is down, plotted curves show oklab components\n// L (red), a (green), and b (blue). \n//\n// To test the inverse mapping, the plotted curves are generated\n// by mapping the (pre-clipping) linear RGB color back to oklab \n// space.\n//\n// White bars on top of the image (and black bars on the bottom of\n// the image) indicate clipping when one or more of the R, G, B \n// components are greater than 1.0 (or less than 0.0 respectively).\n//\n// The color accompanying the black/white bar shows which channels\n// are out of gamut.\n//\n// Click in the bottom left to reset the view.\n//\n// Hit the 'G' key to toggle displaying a gamut test:\n//\n// * black pixels indicate that RGB values for some hues\n// were clipped to 0 at the given lightness/chroma pair.\n//\n// * white pixels indicate that RGB values for some hues\n// were clipped to 1 at the given lightness/chroma pair\n//\n// * gray pixels indicate that both types of clipping happened\n//\n// Hit the 'U' key to display a uniform sampling of linear sRGB \n// space, converted into oklab lightness (x position) and chroma\n// (y position) coordinates. If you mouse over a colored dot, the\n// spectrum on screen should include that exact color.\n//\n//////////////////////////////////////////////////////////////////////\n\n//////////////////////////////////////////////////////////////////////\n// sRGB color transform and inverse from \n// https://bottosson.github.io/posts/colorwrong/#what-can-we-do%3F\n\nvec3 srgb_from_linear_srgb(vec3 x) {\n\n vec3 xlo = 12.92*x;\n vec3 xhi = 1.055 * pow(x, vec3(0.4166666666666667)) - 0.055;\n \n return mix(xlo, xhi, step(vec3(0.0031308), x));\n\n}\n\nvec3 linear_srgb_from_srgb(vec3 x) {\n\n vec3 xlo = x / 12.92;\n vec3 xhi = pow((x + 0.055)/(1.055), vec3(2.4));\n \n return mix(xlo, xhi, step(vec3(0.04045), x));\n\n}\n\n//////////////////////////////////////////////////////////////////////\n// oklab transform and inverse from\n// https://bottosson.github.io/posts/oklab/\n\n\nconst mat3 fwdA = mat3(1.0, 1.0, 1.0,\n 0.3963377774, -0.1055613458, -0.0894841775,\n 0.2158037573, -0.0638541728, -1.2914855480);\n \nconst mat3 fwdB = mat3(4.0767245293, -1.2681437731, -0.0041119885,\n -3.3072168827, 2.6093323231, -0.7034763098,\n 0.2307590544, -0.3411344290, 1.7068625689);\n\nconst mat3 invB = mat3(0.4121656120, 0.2118591070, 0.0883097947,\n 0.5362752080, 0.6807189584, 0.2818474174,\n 0.0514575653, 0.1074065790, 0.6302613616);\n \nconst mat3 invA = mat3(0.2104542553, 1.9779984951, 0.0259040371,\n 0.7936177850, -2.4285922050, 0.7827717662,\n -0.0040720468, 0.4505937099, -0.8086757660);\n\nvec3 oklab_from_linear_srgb(vec3 c) {\n\n vec3 lms = invB * c;\n \n return invA * (sign(lms)*pow(abs(lms), vec3(0.3333333333333)));\n \n}\n\nvec3 linear_srgb_from_oklab(vec3 c) {\n\n vec3 lms = fwdA * c;\n \n return fwdB * (lms * lms * lms);\n \n}\n\n\n// https://www.shadertoy.com/view/WtccD7\nconst float max_chroma = 0.33;\nvec3 uvToOklab(vec3 uvw){\n\n // setup oklab color\n float theta = 2.*3.141592653589793*uvw.x;\n \n float L = 0.8;\n float chroma = 0.1;\n \n //if (max(iMouse.x, iMouse.y) > 0.05 * iResolution.y) {\n L = uvw.y;//iMouse.x / iResolution.x;\n chroma = uvw.z * max_chroma;// / iResolution.y;\n //}\n \n float a = chroma*cos(theta);\n float b = chroma*sin(theta);\n \n vec3 lab = vec3(L, a, b);\n\treturn lab;\n\n // convert to rgb \n // vec3 rgb = linear_srgb_from_oklab(lab);\n\n}\n\n// /geo1/MAT/pointsBuilder1/disk1\nfloat disk_feather(float dist, float radius, float feather){\n\tif(feather <= 0.0){\n\t\tif(dist < radius){return 1.0;}else{return 0.0;}\n\t} else {\n\t\tfloat half_feather = feather * 0.5;\n\t\tif(dist < (radius - half_feather)){\n\t\t\treturn 1.0;\n\t\t} else {\n\t\t\tif(dist > (radius + half_feather)){\n\t\t\t\treturn 0.0;\n\t\t\t} else {\n\t\t\t\tfloat feather_start = (radius - half_feather);\n\t\t\t\tfloat blend = 1.0 - (dist - feather_start) / feather;\n\t\t\t\treturn blend;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfloat disk2d(vec2 pos, vec2 center, float radius, float feather){\n\tfloat dist = distance(pos, center);\n\treturn disk_feather(dist, radius, feather);\n}\n\n// function could be called sphere, but is an overload of disk, and is the same\nfloat disk3d(vec3 pos, vec3 center, float radius, float feather){\n\tfloat dist = distance(pos, center);\n\treturn disk_feather(dist, radius, feather);\n}\n\n\n\n\n\n\n\n// /geo1/MAT/pointsBuilder1/globals1\nuniform float time;\n\n// /geo1/MAT/pointsBuilder1/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n\n\n\n\n\n#if DEPTH_PACKING == 3200\n\n\tuniform float opacity;\n\n#endif\n\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tdiffuseColor.a = opacity;\n\n\t#endif\n\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\n\t// INSERT BODY\n\n\n\n\t// /geo1/MAT/pointsBuilder1/globals1\n\tvec2 v_POLY_globals1_gl_PointCoord = gl_PointCoord;\n\tfloat v_POLY_globals1_time = time;\n\t\n\t// /geo1/MAT/pointsBuilder1/laserColor1\n\tvec3 v_POLY_laserColor1_baseColor = vec3(0.0, 0.0, 0.0);\n\tif(true){\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/constant2\n\t\tvec3 v_POLY_laserColor1_constant2_val = vec3(0.6653872982754769, 0.5583403896257968, 0.005181516700061659);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/constant1\n\t\tvec3 v_POLY_laserColor1_constant1_val = vec3(0.7011018919268015, 0.018500220124016656, 0.005181516700061659);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/attribute1\n\t\tfloat v_POLY_laserColor1_attribute1_val = v_POLY_attribute_id;\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/rgbToOklab1\n\t\tvec3 v_POLY_laserColor1_rgbToOklab1_oklab = oklab_from_linear_srgb(v_POLY_laserColor1_constant2_val);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/rgbToOklab2\n\t\tvec3 v_POLY_laserColor1_rgbToOklab2_oklab = oklab_from_linear_srgb(v_POLY_laserColor1_constant1_val);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/round1\n\t\tfloat v_POLY_laserColor1_round1_val = sign(v_POLY_laserColor1_attribute1_val)*floor(abs(v_POLY_laserColor1_attribute1_val)+0.5);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/floatToVec2_1\n\t\tvec2 v_POLY_laserColor1_floatToVec2_1_vec2 = vec2(v_POLY_laserColor1_round1_val, 0.54);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/random1\n\t\tfloat v_POLY_laserColor1_random1_rand = rand(v_POLY_laserColor1_floatToVec2_1_vec2);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/pow1\n\t\tfloat v_POLY_laserColor1_pow1_val = pow(v_POLY_laserColor1_random1_rand, 0.27);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/mix1\n\t\tvec3 v_POLY_laserColor1_mix1_mix = mix(v_POLY_laserColor1_rgbToOklab1_oklab, v_POLY_laserColor1_rgbToOklab2_oklab, v_POLY_laserColor1_pow1_val);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/oklabToRgb1\n\t\tvec3 v_POLY_laserColor1_oklabToRgb1_rgb = linear_srgb_from_oklab(v_POLY_laserColor1_mix1_mix);\n\t\n\t\t// /geo1/MAT/pointsBuilder1/laserColor1/subnetOutput1\n\t\tv_POLY_laserColor1_baseColor = v_POLY_laserColor1_oklabToRgb1_rgb;\n\t}\n\t\n\t// /geo1/MAT/pointsBuilder1/disk1\n\tfloat v_POLY_disk1_float = disk2d(v_POLY_globals1_gl_PointCoord, vec2(0.5, 0.5), 0.2, 0.24);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd6\n\tfloat v_POLY_multAdd6_val = (0.33*(v_POLY_disk1_float + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/output1\n\tdiffuseColor.xyz = v_POLY_laserColor1_baseColor;\n\tdiffuseColor.a = v_POLY_multAdd6_val;\n\n\n\n\t// the new body lines should be added before the alphatest_fragment\n\t// so that alpha is set before (which is really how it would be set if the alphamap_fragment above was used by the material node parameters)\n\n\t#include <alphatest_fragment>\n\n\t#include <logdepthbuf_fragment>\n\n\n\t// Higher precision equivalent of gl_FragCoord.z. This assumes depthRange has been left to its default values.\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), diffuseColor.a );\n\n\t#elif DEPTH_PACKING == 3201\n\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\n\t#endif\n\n}\n","customDepthDOFMaterial.vertex":"\nuniform float size;\nuniform float scale;\n#include <common>\n\nvarying float vViewZDepth;\n\n// INSERT DEFINES\n\n\n\n// /geo1/MAT/pointsBuilder1/fit1\n//\n//\n// FIT\n//\n//\nfloat fit(float val, float srcMin, float srcMax, float destMin, float destMax){\n\tfloat src_range = srcMax - srcMin;\n\tfloat dest_range = destMax - destMin;\n\n\tfloat r = (val - srcMin) / src_range;\n\treturn (r * dest_range) + destMin;\n}\nvec2 fit(vec2 val, vec2 srcMin, vec2 srcMax, vec2 destMin, vec2 destMax){\n\treturn vec2(\n\t\tfit(val.x, srcMin.x, srcMax.x, destMin.x, destMax.x),\n\t\tfit(val.y, srcMin.y, srcMax.y, destMin.y, destMax.y)\n\t);\n}\nvec3 fit(vec3 val, vec3 srcMin, vec3 srcMax, vec3 destMin, vec3 destMax){\n\treturn vec3(\n\t\tfit(val.x, srcMin.x, srcMax.x, destMin.x, destMax.x),\n\t\tfit(val.y, srcMin.y, srcMax.y, destMin.y, destMax.y),\n\t\tfit(val.z, srcMin.z, srcMax.z, destMin.z, destMax.z)\n\t);\n}\nvec4 fit(vec4 val, vec4 srcMin, vec4 srcMax, vec4 destMin, vec4 destMax){\n\treturn vec4(\n\t\tfit(val.x, srcMin.x, srcMax.x, destMin.x, destMax.x),\n\t\tfit(val.y, srcMin.y, srcMax.y, destMin.y, destMax.y),\n\t\tfit(val.z, srcMin.z, srcMax.z, destMin.z, destMax.z),\n\t\tfit(val.w, srcMin.w, srcMax.w, destMin.w, destMax.w)\n\t);\n}\n\n//\n//\n// FIT TO 01\n// fits the range [srcMin, srcMax] to [0, 1]\n//\nfloat fitTo01(float val, float srcMin, float srcMax){\n\tfloat size = srcMax - srcMin;\n\treturn (val - srcMin) / size;\n}\nvec2 fitTo01(vec2 val, vec2 srcMin, vec2 srcMax){\n\treturn vec2(\n\t\tfitTo01(val.x, srcMin.x, srcMax.x),\n\t\tfitTo01(val.y, srcMin.y, srcMax.y)\n\t);\n}\nvec3 fitTo01(vec3 val, vec3 srcMin, vec3 srcMax){\n\treturn vec3(\n\t\tfitTo01(val.x, srcMin.x, srcMax.x),\n\t\tfitTo01(val.y, srcMin.y, srcMax.y),\n\t\tfitTo01(val.z, srcMin.z, srcMax.z)\n\t);\n}\nvec4 fitTo01(vec4 val, vec4 srcMin, vec4 srcMax){\n\treturn vec4(\n\t\tfitTo01(val.x, srcMin.x, srcMax.x),\n\t\tfitTo01(val.y, srcMin.y, srcMax.y),\n\t\tfitTo01(val.z, srcMin.z, srcMax.z),\n\t\tfitTo01(val.w, srcMin.w, srcMax.w)\n\t);\n}\n\n//\n//\n// FIT FROM 01\n// fits the range [0, 1] to [destMin, destMax]\n//\nfloat fitFrom01(float val, float destMin, float destMax){\n\treturn fit(val, 0.0, 1.0, destMin, destMax);\n}\nvec2 fitFrom01(vec2 val, vec2 srcMin, vec2 srcMax){\n\treturn vec2(\n\t\tfitFrom01(val.x, srcMin.x, srcMax.x),\n\t\tfitFrom01(val.y, srcMin.y, srcMax.y)\n\t);\n}\nvec3 fitFrom01(vec3 val, vec3 srcMin, vec3 srcMax){\n\treturn vec3(\n\t\tfitFrom01(val.x, srcMin.x, srcMax.x),\n\t\tfitFrom01(val.y, srcMin.y, srcMax.y),\n\t\tfitFrom01(val.z, srcMin.z, srcMax.z)\n\t);\n}\nvec4 fitFrom01(vec4 val, vec4 srcMin, vec4 srcMax){\n\treturn vec4(\n\t\tfitFrom01(val.x, srcMin.x, srcMax.x),\n\t\tfitFrom01(val.y, srcMin.y, srcMax.y),\n\t\tfitFrom01(val.z, srcMin.z, srcMax.z),\n\t\tfitFrom01(val.w, srcMin.w, srcMax.w)\n\t);\n}\n\n//\n//\n// FIT FROM 01 TO VARIANCE\n// fits the range [0, 1] to [center - variance, center + variance]\n//\nfloat fitFrom01ToVariance(float val, float center, float variance){\n\treturn fitFrom01(val, center - variance, center + variance);\n}\nvec2 fitFrom01ToVariance(vec2 val, vec2 center, vec2 variance){\n\treturn vec2(\n\t\tfitFrom01ToVariance(val.x, center.x, variance.x),\n\t\tfitFrom01ToVariance(val.y, center.y, variance.y)\n\t);\n}\nvec3 fitFrom01ToVariance(vec3 val, vec3 center, vec3 variance){\n\treturn vec3(\n\t\tfitFrom01ToVariance(val.x, center.x, variance.x),\n\t\tfitFrom01ToVariance(val.y, center.y, variance.y),\n\t\tfitFrom01ToVariance(val.z, center.z, variance.z)\n\t);\n}\nvec4 fitFrom01ToVariance(vec4 val, vec4 center, vec4 variance){\n\treturn vec4(\n\t\tfitFrom01ToVariance(val.x, center.x, variance.x),\n\t\tfitFrom01ToVariance(val.y, center.y, variance.y),\n\t\tfitFrom01ToVariance(val.z, center.z, variance.z),\n\t\tfitFrom01ToVariance(val.w, center.w, variance.w)\n\t);\n}\n\n\n\n\n\n\n\n// /geo1/MAT/pointsBuilder1/globals1\nuniform float time;\n\n// /geo1/MAT/pointsBuilder1/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n// /geo1/MAT/pointsBuilder1/attribute1\nattribute float id;\n\n\n\n\n\n\n\nvoid main() {\n\n\t// INSERT BODY\n\n\n\n\t// /geo1/MAT/pointsBuilder1/attribute1\n\tfloat v_POLY_attribute1_val = id;\n\t\n\t// /geo1/MAT/pointsBuilder1/globals1\n\tfloat v_POLY_globals1_time = time;\n\t\n\t// /geo1/MAT/pointsBuilder1/constant1\n\tfloat v_POLY_constant1_val = 0.03;\n\t\n\t// /geo1/MAT/pointsBuilder1/laserColor1\n\tfloat v_POLY_laserColor1_attribute1_val = id;\n\tv_POLY_attribute_id = float(id);\n\t\n\t// /geo1/MAT/pointsBuilder1/round1\n\tfloat v_POLY_round1_val = sign(v_POLY_attribute1_val)*floor(abs(v_POLY_attribute1_val)+0.5);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd1\n\tfloat v_POLY_multAdd1_val = (6.0*(v_POLY_globals1_time + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/floatToVec2_1\n\tvec2 v_POLY_floatToVec2_1_vec2 = vec2(v_POLY_round1_val, 0.54);\n\t\n\t// /geo1/MAT/pointsBuilder1/random1\n\tfloat v_POLY_random1_rand = rand(v_POLY_floatToVec2_1_vec2);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd5\n\tfloat v_POLY_multAdd5_val = (4.4*(v_POLY_random1_rand + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd2\n\tfloat v_POLY_multAdd2_val = (1.0*(v_POLY_multAdd5_val + v_POLY_multAdd1_val)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/cos1\n\tfloat v_POLY_cos1_val = cos(v_POLY_multAdd2_val);\n\t\n\t// /geo1/MAT/pointsBuilder1/fit1\n\tfloat v_POLY_fit1_val = fit(v_POLY_cos1_val, -1.0, 1.0, 0.22, 1.0);\n\t\n\t// /geo1/MAT/pointsBuilder1/multAdd4\n\tfloat v_POLY_multAdd4_val = (v_POLY_constant1_val*(v_POLY_fit1_val + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/pointsBuilder1/output1\n\tvec3 transformed = position;\n\tvec3 objectNormal = normal;\n\t#ifdef USE_TANGENT\n\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t#endif\n\tgl_PointSize = v_POLY_multAdd4_val * size * 10.0;\n\n\n\n\n\n\t#include <project_vertex>\n\n\tvViewZDepth = - mvPosition.z;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\n}\n","customDepthDOFMaterial.fragment":"\nuniform float mNear;\nuniform float mFar;\n\nvarying float vViewZDepth;\n\n// INSERT DEFINES\n\nvoid main() {\n\n\tfloat color = 1.0 - smoothstep( mNear, mFar, vViewZDepth );\n\tgl_FragColor = vec4( vec3( color ), 1.0 );\n\tvec4 diffuseColor = gl_FragColor;\n\n\t// INSERT BODY\n\n\tgl_FragColor.a = diffuseColor.a;\n}\n"},"/geo1/MAT/lineBasicBuilder_LIGHTING":{"vertex":"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/noise1\n// Modulo 289 without a division (only multiplications)\nfloat mod289(float x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\nvec2 mod289(vec2 x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\nvec3 mod289(vec3 x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\nvec4 mod289(vec4 x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n// Modulo 7 without a division\nvec3 mod7(vec3 x) {\n return x - floor(x * (1.0 / 7.0)) * 7.0;\n}\n\n// Permutation polynomial: (34x^2 + x) mod 289\nfloat permute(float x) {\n return mod289(((x*34.0)+1.0)*x);\n}\nvec3 permute(vec3 x) {\n return mod289((34.0 * x + 1.0) * x);\n}\nvec4 permute(vec4 x) {\n return mod289(((x*34.0)+1.0)*x);\n}\n\nfloat taylorInvSqrt(float r)\n{\n return 1.79284291400159 - 0.85373472095314 * r;\n}\nvec4 taylorInvSqrt(vec4 r)\n{\n return 1.79284291400159 - 0.85373472095314 * r;\n}\n\nvec2 fade(vec2 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\nvec3 fade(vec3 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\nvec4 fade(vec4 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\n//\n// Description : Array and textureless GLSL 2D/3D/4D simplex \n// noise functions.\n// Author : Ian McEwan, Ashima Arts.\n// Maintainer : stegu\n// Lastmod : 20110822 (ijm)\n// License : Copyright (C) 2011 Ashima Arts. All rights reserved.\n// Distributed under the MIT License. See LICENSE file.\n// https://github.com/ashima/webgl-noise\n// https://github.com/stegu/webgl-noise\n// \n\n\n\nfloat snoise(vec3 v)\n { \n const vec2 C = vec2(1.0/6.0, 1.0/3.0) ;\n const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);\n\n// First corner\n vec3 i = floor(v + dot(v, C.yyy) );\n vec3 x0 = v - i + dot(i, C.xxx) ;\n\n// Other corners\n vec3 g = step(x0.yzx, x0.xyz);\n vec3 l = 1.0 - g;\n vec3 i1 = min( g.xyz, l.zxy );\n vec3 i2 = max( g.xyz, l.zxy );\n\n // x0 = x0 - 0.0 + 0.0 * C.xxx;\n // x1 = x0 - i1 + 1.0 * C.xxx;\n // x2 = x0 - i2 + 2.0 * C.xxx;\n // x3 = x0 - 1.0 + 3.0 * C.xxx;\n vec3 x1 = x0 - i1 + C.xxx;\n vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y\n vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y\n\n// Permutations\n i = mod289(i); \n vec4 p = permute( permute( permute( \n i.z + vec4(0.0, i1.z, i2.z, 1.0 ))\n + i.y + vec4(0.0, i1.y, i2.y, 1.0 )) \n + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));\n\n// Gradients: 7x7 points over a square, mapped onto an octahedron.\n// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)\n float n_ = 0.142857142857; // 1.0/7.0\n vec3 ns = n_ * D.wyz - D.xzx;\n\n vec4 j = p - 49.0 * floor(p * ns.z * ns.z); // mod(p,7*7)\n\n vec4 x_ = floor(j * ns.z);\n vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N)\n\n vec4 x = x_ *ns.x + ns.yyyy;\n vec4 y = y_ *ns.x + ns.yyyy;\n vec4 h = 1.0 - abs(x) - abs(y);\n\n vec4 b0 = vec4( x.xy, y.xy );\n vec4 b1 = vec4( x.zw, y.zw );\n\n //vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0;\n //vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;\n vec4 s0 = floor(b0)*2.0 + 1.0;\n vec4 s1 = floor(b1)*2.0 + 1.0;\n vec4 sh = -step(h, vec4(0.0));\n\n vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;\n vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;\n\n vec3 p0 = vec3(a0.xy,h.x);\n vec3 p1 = vec3(a0.zw,h.y);\n vec3 p2 = vec3(a1.xy,h.z);\n vec3 p3 = vec3(a1.zw,h.w);\n\n//Normalise gradients\n vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\n p0 *= norm.x;\n p1 *= norm.y;\n p2 *= norm.z;\n p3 *= norm.w;\n\n// Mix final noise value\n vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\n m = m * m;\n return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1), \n dot(p2,x2), dot(p3,x3) ) );\n }\n\n\nfloat fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1(in vec3 st) {\n\tfloat value = 0.0;\n\tfloat amplitude = 1.0;\n\tfor (int i = 0; i < 6; i++) {\n\t\tvalue += amplitude * snoise(st);\n\t\tst *= 2.0;\n\t\tamplitude *= 0.5;\n\t}\n\treturn value;\n}\n\n\n\n\n\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/param1\nuniform vec3 v_POLY_param_destPos;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/globals2\nuniform float time;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute1\nattribute float idn;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute2\nattribute float id;\n\n\n\n\n#include <uv_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\n\n\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/constant1\n\tvec3 v_POLY_constant1_val = vec3(0.0, 0.0, 0.0);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/param1\n\tvec3 v_POLY_param1_val = v_POLY_param_destPos;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute1\n\tfloat v_POLY_attribute1_val = idn;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute2\n\tfloat v_POLY_attribute2_val = id;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/globals2\n\tfloat v_POLY_globals2_time = time;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1\n\tfloat v_POLY_laserColor1_attribute1_val = id;\n\tv_POLY_attribute_id = float(id);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/mix1\n\tvec3 v_POLY_mix1_mix = mix(v_POLY_constant1_val, v_POLY_param1_val, v_POLY_attribute1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/smoothstep1\n\tfloat v_POLY_smoothstep1_val = smoothstep(0.0, 0.1, v_POLY_attribute1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/smoothstep2\n\tfloat v_POLY_smoothstep2_val = smoothstep(1.0, 0.83, v_POLY_attribute1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multAdd3\n\tfloat v_POLY_multAdd3_val = (-1.0*(v_POLY_globals2_time + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multAdd1\n\tfloat v_POLY_multAdd1_val = (0.79*(v_POLY_globals2_time + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/min1\n\tfloat v_POLY_min1_val = min(v_POLY_smoothstep1_val, v_POLY_smoothstep2_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multAdd2\n\tfloat v_POLY_multAdd2_val = (1.0*(v_POLY_attribute1_val + 0.0)) + v_POLY_multAdd3_val;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/floatToVec3_2\n\tvec3 v_POLY_floatToVec3_2_vec3 = vec3(0.0, v_POLY_multAdd1_val, 0.21);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/floatToVec3_1\n\tvec3 v_POLY_floatToVec3_1_vec3 = vec3(v_POLY_min1_val, v_POLY_min1_val, v_POLY_min1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/floatToVec3_3\n\tvec3 v_POLY_floatToVec3_3_vec3 = vec3(0.0, v_POLY_attribute2_val, v_POLY_multAdd2_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multScalar1\n\tvec3 v_POLY_multScalar1_val = (0.42*v_POLY_floatToVec3_1_vec3);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/noise1\n\tfloat v_POLY_noise1_noisex = (v_POLY_multScalar1_val*fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1((v_POLY_floatToVec3_3_vec3*vec3(1.0, 1.0, 1.0))+(v_POLY_floatToVec3_2_vec3+vec3(0.0, 0.0, 0.0)))).x;\n\tfloat v_POLY_noise1_noisey = (v_POLY_multScalar1_val*fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1((v_POLY_floatToVec3_3_vec3*vec3(1.0, 1.0, 1.0))+(v_POLY_floatToVec3_2_vec3+vec3(1000.0, 1000.0, 1000.0)))).y;\n\tfloat v_POLY_noise1_noisez = (v_POLY_multScalar1_val*fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1((v_POLY_floatToVec3_3_vec3*vec3(1.0, 1.0, 1.0))+(v_POLY_floatToVec3_2_vec3+vec3(2000.0, 2000.0, 2000.0)))).z;\n\tvec3 v_POLY_noise1_noise = vec3(v_POLY_noise1_noisex, v_POLY_noise1_noisey, v_POLY_noise1_noisez);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/add1\n\tvec3 v_POLY_add1_sum = (v_POLY_mix1_mix + v_POLY_noise1_noise + vec3(0.0, 0.0, 0.0));\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/max1\n\tvec3 v_POLY_max1_val = max(v_POLY_add1_sum, vec3(-1000.0, 0.0, -1000.0));\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/output1\n\tvec3 transformed = v_POLY_max1_val;vec4 mvPosition = vec4( transformed, 1.0 ); gl_Position = projectionMatrix * modelViewMatrix * mvPosition;\n\n\n\n\t#include <morphcolor_vertex>\n// removed:\n//\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n// removed:\n//\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}","fragment":"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/rgbToOklab1\n//////////////////////////////////////////////////////////////////////\n//\n// Visualizing Björn Ottosson's \"oklab\" colorspace\n//\n// shadertoy implementation by mattz\n//\n// license CC0 (public domain)\n// https://creativecommons.org/share-your-work/public-domain/cc0/\n//\n// Click and drag to set lightness (mouse x) and chroma (mouse y).\n// Hue varies linearly across the image from left to right.\n//\n// While mouse is down, plotted curves show oklab components\n// L (red), a (green), and b (blue). \n//\n// To test the inverse mapping, the plotted curves are generated\n// by mapping the (pre-clipping) linear RGB color back to oklab \n// space.\n//\n// White bars on top of the image (and black bars on the bottom of\n// the image) indicate clipping when one or more of the R, G, B \n// components are greater than 1.0 (or less than 0.0 respectively).\n//\n// The color accompanying the black/white bar shows which channels\n// are out of gamut.\n//\n// Click in the bottom left to reset the view.\n//\n// Hit the 'G' key to toggle displaying a gamut test:\n//\n// * black pixels indicate that RGB values for some hues\n// were clipped to 0 at the given lightness/chroma pair.\n//\n// * white pixels indicate that RGB values for some hues\n// were clipped to 1 at the given lightness/chroma pair\n//\n// * gray pixels indicate that both types of clipping happened\n//\n// Hit the 'U' key to display a uniform sampling of linear sRGB \n// space, converted into oklab lightness (x position) and chroma\n// (y position) coordinates. If you mouse over a colored dot, the\n// spectrum on screen should include that exact color.\n//\n//////////////////////////////////////////////////////////////////////\n\n//////////////////////////////////////////////////////////////////////\n// sRGB color transform and inverse from \n// https://bottosson.github.io/posts/colorwrong/#what-can-we-do%3F\n\nvec3 srgb_from_linear_srgb(vec3 x) {\n\n vec3 xlo = 12.92*x;\n vec3 xhi = 1.055 * pow(x, vec3(0.4166666666666667)) - 0.055;\n \n return mix(xlo, xhi, step(vec3(0.0031308), x));\n\n}\n\nvec3 linear_srgb_from_srgb(vec3 x) {\n\n vec3 xlo = x / 12.92;\n vec3 xhi = pow((x + 0.055)/(1.055), vec3(2.4));\n \n return mix(xlo, xhi, step(vec3(0.04045), x));\n\n}\n\n//////////////////////////////////////////////////////////////////////\n// oklab transform and inverse from\n// https://bottosson.github.io/posts/oklab/\n\n\nconst mat3 fwdA = mat3(1.0, 1.0, 1.0,\n 0.3963377774, -0.1055613458, -0.0894841775,\n 0.2158037573, -0.0638541728, -1.2914855480);\n \nconst mat3 fwdB = mat3(4.0767245293, -1.2681437731, -0.0041119885,\n -3.3072168827, 2.6093323231, -0.7034763098,\n 0.2307590544, -0.3411344290, 1.7068625689);\n\nconst mat3 invB = mat3(0.4121656120, 0.2118591070, 0.0883097947,\n 0.5362752080, 0.6807189584, 0.2818474174,\n 0.0514575653, 0.1074065790, 0.6302613616);\n \nconst mat3 invA = mat3(0.2104542553, 1.9779984951, 0.0259040371,\n 0.7936177850, -2.4285922050, 0.7827717662,\n -0.0040720468, 0.4505937099, -0.8086757660);\n\nvec3 oklab_from_linear_srgb(vec3 c) {\n\n vec3 lms = invB * c;\n \n return invA * (sign(lms)*pow(abs(lms), vec3(0.3333333333333)));\n \n}\n\nvec3 linear_srgb_from_oklab(vec3 c) {\n\n vec3 lms = fwdA * c;\n \n return fwdB * (lms * lms * lms);\n \n}\n\n\n// https://www.shadertoy.com/view/WtccD7\nconst float max_chroma = 0.33;\nvec3 uvToOklab(vec3 uvw){\n\n // setup oklab color\n float theta = 2.*3.141592653589793*uvw.x;\n \n float L = 0.8;\n float chroma = 0.1;\n \n //if (max(iMouse.x, iMouse.y) > 0.05 * iResolution.y) {\n L = uvw.y;//iMouse.x / iResolution.x;\n chroma = uvw.z * max_chroma;// / iResolution.y;\n //}\n \n float a = chroma*cos(theta);\n float b = chroma*sin(theta);\n \n vec3 lab = vec3(L, a, b);\n\treturn lab;\n\n // convert to rgb \n // vec3 rgb = linear_srgb_from_oklab(lab);\n\n}\n\n\n\n\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n\n\n\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\n\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1\n\tvec3 v_POLY_laserColor1_baseColor = vec3(0.0, 0.0, 0.0);\n\tif(true){\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/constant2\n\t\tvec3 v_POLY_laserColor1_constant2_val = vec3(0.6653872982754769, 0.5583403896257968, 0.005181516700061659);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/constant1\n\t\tvec3 v_POLY_laserColor1_constant1_val = vec3(0.7011018919268015, 0.018500220124016656, 0.005181516700061659);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/attribute1\n\t\tfloat v_POLY_laserColor1_attribute1_val = v_POLY_attribute_id;\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/rgbToOklab1\n\t\tvec3 v_POLY_laserColor1_rgbToOklab1_oklab = oklab_from_linear_srgb(v_POLY_laserColor1_constant2_val);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/rgbToOklab2\n\t\tvec3 v_POLY_laserColor1_rgbToOklab2_oklab = oklab_from_linear_srgb(v_POLY_laserColor1_constant1_val);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/round1\n\t\tfloat v_POLY_laserColor1_round1_val = sign(v_POLY_laserColor1_attribute1_val)*floor(abs(v_POLY_laserColor1_attribute1_val)+0.5);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/floatToVec2_1\n\t\tvec2 v_POLY_laserColor1_floatToVec2_1_vec2 = vec2(v_POLY_laserColor1_round1_val, 0.54);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/random1\n\t\tfloat v_POLY_laserColor1_random1_rand = rand(v_POLY_laserColor1_floatToVec2_1_vec2);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/pow1\n\t\tfloat v_POLY_laserColor1_pow1_val = pow(v_POLY_laserColor1_random1_rand, 0.27);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/mix1\n\t\tvec3 v_POLY_laserColor1_mix1_mix = mix(v_POLY_laserColor1_rgbToOklab1_oklab, v_POLY_laserColor1_rgbToOklab2_oklab, v_POLY_laserColor1_pow1_val);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/oklabToRgb1\n\t\tvec3 v_POLY_laserColor1_oklabToRgb1_rgb = linear_srgb_from_oklab(v_POLY_laserColor1_mix1_mix);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/subnetOutput1\n\t\tv_POLY_laserColor1_baseColor = v_POLY_laserColor1_oklabToRgb1_rgb;\n\t}\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/constant3\n\tfloat v_POLY_constant3_val = 0.86;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multScalar2\n\tvec3 v_POLY_multScalar2_val = (12.0*v_POLY_laserColor1_baseColor);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/output1\n\tdiffuseColor.xyz = v_POLY_multScalar2_val;\n\tdiffuseColor.w = v_POLY_constant3_val;\n\n\n\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}","customDistanceMaterial.vertex":"\nuniform float scale;\nattribute float lineDistance;\n\nvarying float vLineDistance;\n\n#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\n// INSERT DEFINES\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/noise1\n// Modulo 289 without a division (only multiplications)\nfloat mod289(float x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\nvec2 mod289(vec2 x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\nvec3 mod289(vec3 x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\nvec4 mod289(vec4 x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n// Modulo 7 without a division\nvec3 mod7(vec3 x) {\n return x - floor(x * (1.0 / 7.0)) * 7.0;\n}\n\n// Permutation polynomial: (34x^2 + x) mod 289\nfloat permute(float x) {\n return mod289(((x*34.0)+1.0)*x);\n}\nvec3 permute(vec3 x) {\n return mod289((34.0 * x + 1.0) * x);\n}\nvec4 permute(vec4 x) {\n return mod289(((x*34.0)+1.0)*x);\n}\n\nfloat taylorInvSqrt(float r)\n{\n return 1.79284291400159 - 0.85373472095314 * r;\n}\nvec4 taylorInvSqrt(vec4 r)\n{\n return 1.79284291400159 - 0.85373472095314 * r;\n}\n\nvec2 fade(vec2 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\nvec3 fade(vec3 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\nvec4 fade(vec4 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\n//\n// Description : Array and textureless GLSL 2D/3D/4D simplex \n// noise functions.\n// Author : Ian McEwan, Ashima Arts.\n// Maintainer : stegu\n// Lastmod : 20110822 (ijm)\n// License : Copyright (C) 2011 Ashima Arts. All rights reserved.\n// Distributed under the MIT License. See LICENSE file.\n// https://github.com/ashima/webgl-noise\n// https://github.com/stegu/webgl-noise\n// \n\n\n\nfloat snoise(vec3 v)\n { \n const vec2 C = vec2(1.0/6.0, 1.0/3.0) ;\n const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);\n\n// First corner\n vec3 i = floor(v + dot(v, C.yyy) );\n vec3 x0 = v - i + dot(i, C.xxx) ;\n\n// Other corners\n vec3 g = step(x0.yzx, x0.xyz);\n vec3 l = 1.0 - g;\n vec3 i1 = min( g.xyz, l.zxy );\n vec3 i2 = max( g.xyz, l.zxy );\n\n // x0 = x0 - 0.0 + 0.0 * C.xxx;\n // x1 = x0 - i1 + 1.0 * C.xxx;\n // x2 = x0 - i2 + 2.0 * C.xxx;\n // x3 = x0 - 1.0 + 3.0 * C.xxx;\n vec3 x1 = x0 - i1 + C.xxx;\n vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y\n vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y\n\n// Permutations\n i = mod289(i); \n vec4 p = permute( permute( permute( \n i.z + vec4(0.0, i1.z, i2.z, 1.0 ))\n + i.y + vec4(0.0, i1.y, i2.y, 1.0 )) \n + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));\n\n// Gradients: 7x7 points over a square, mapped onto an octahedron.\n// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)\n float n_ = 0.142857142857; // 1.0/7.0\n vec3 ns = n_ * D.wyz - D.xzx;\n\n vec4 j = p - 49.0 * floor(p * ns.z * ns.z); // mod(p,7*7)\n\n vec4 x_ = floor(j * ns.z);\n vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N)\n\n vec4 x = x_ *ns.x + ns.yyyy;\n vec4 y = y_ *ns.x + ns.yyyy;\n vec4 h = 1.0 - abs(x) - abs(y);\n\n vec4 b0 = vec4( x.xy, y.xy );\n vec4 b1 = vec4( x.zw, y.zw );\n\n //vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0;\n //vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;\n vec4 s0 = floor(b0)*2.0 + 1.0;\n vec4 s1 = floor(b1)*2.0 + 1.0;\n vec4 sh = -step(h, vec4(0.0));\n\n vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;\n vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;\n\n vec3 p0 = vec3(a0.xy,h.x);\n vec3 p1 = vec3(a0.zw,h.y);\n vec3 p2 = vec3(a1.xy,h.z);\n vec3 p3 = vec3(a1.zw,h.w);\n\n//Normalise gradients\n vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\n p0 *= norm.x;\n p1 *= norm.y;\n p2 *= norm.z;\n p3 *= norm.w;\n\n// Mix final noise value\n vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\n m = m * m;\n return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1), \n dot(p2,x2), dot(p3,x3) ) );\n }\n\n\nfloat fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1(in vec3 st) {\n\tfloat value = 0.0;\n\tfloat amplitude = 1.0;\n\tfor (int i = 0; i < 6; i++) {\n\t\tvalue += amplitude * snoise(st);\n\t\tst *= 2.0;\n\t\tamplitude *= 0.5;\n\t}\n\treturn value;\n}\n\n\n\n\n\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/param1\nuniform vec3 v_POLY_param_destPos;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/globals2\nuniform float time;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute1\nattribute float idn;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute2\nattribute float id;\n\n\n\n\n\n\n// vHighPrecisionZW is added to match CustomMeshDepth.frag\n// which is itself taken from threejs\nvarying vec2 vHighPrecisionZW;\n\n\nvoid main() {\n\n\t// INSERT BODY\n\n\n\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/constant1\n\tvec3 v_POLY_constant1_val = vec3(0.0, 0.0, 0.0);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/param1\n\tvec3 v_POLY_param1_val = v_POLY_param_destPos;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute1\n\tfloat v_POLY_attribute1_val = idn;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute2\n\tfloat v_POLY_attribute2_val = id;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/globals2\n\tfloat v_POLY_globals2_time = time;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1\n\tfloat v_POLY_laserColor1_attribute1_val = id;\n\tv_POLY_attribute_id = float(id);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/mix1\n\tvec3 v_POLY_mix1_mix = mix(v_POLY_constant1_val, v_POLY_param1_val, v_POLY_attribute1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/smoothstep1\n\tfloat v_POLY_smoothstep1_val = smoothstep(0.0, 0.1, v_POLY_attribute1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/smoothstep2\n\tfloat v_POLY_smoothstep2_val = smoothstep(1.0, 0.83, v_POLY_attribute1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multAdd3\n\tfloat v_POLY_multAdd3_val = (-1.0*(v_POLY_globals2_time + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multAdd1\n\tfloat v_POLY_multAdd1_val = (0.79*(v_POLY_globals2_time + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/min1\n\tfloat v_POLY_min1_val = min(v_POLY_smoothstep1_val, v_POLY_smoothstep2_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multAdd2\n\tfloat v_POLY_multAdd2_val = (1.0*(v_POLY_attribute1_val + 0.0)) + v_POLY_multAdd3_val;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/floatToVec3_2\n\tvec3 v_POLY_floatToVec3_2_vec3 = vec3(0.0, v_POLY_multAdd1_val, 0.21);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/floatToVec3_1\n\tvec3 v_POLY_floatToVec3_1_vec3 = vec3(v_POLY_min1_val, v_POLY_min1_val, v_POLY_min1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/floatToVec3_3\n\tvec3 v_POLY_floatToVec3_3_vec3 = vec3(0.0, v_POLY_attribute2_val, v_POLY_multAdd2_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multScalar1\n\tvec3 v_POLY_multScalar1_val = (0.42*v_POLY_floatToVec3_1_vec3);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/noise1\n\tfloat v_POLY_noise1_noisex = (v_POLY_multScalar1_val*fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1((v_POLY_floatToVec3_3_vec3*vec3(1.0, 1.0, 1.0))+(v_POLY_floatToVec3_2_vec3+vec3(0.0, 0.0, 0.0)))).x;\n\tfloat v_POLY_noise1_noisey = (v_POLY_multScalar1_val*fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1((v_POLY_floatToVec3_3_vec3*vec3(1.0, 1.0, 1.0))+(v_POLY_floatToVec3_2_vec3+vec3(1000.0, 1000.0, 1000.0)))).y;\n\tfloat v_POLY_noise1_noisez = (v_POLY_multScalar1_val*fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1((v_POLY_floatToVec3_3_vec3*vec3(1.0, 1.0, 1.0))+(v_POLY_floatToVec3_2_vec3+vec3(2000.0, 2000.0, 2000.0)))).z;\n\tvec3 v_POLY_noise1_noise = vec3(v_POLY_noise1_noisex, v_POLY_noise1_noisey, v_POLY_noise1_noisez);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/add1\n\tvec3 v_POLY_add1_sum = (v_POLY_mix1_mix + v_POLY_noise1_noise + vec3(0.0, 0.0, 0.0));\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/max1\n\tvec3 v_POLY_max1_val = max(v_POLY_add1_sum, vec3(-1000.0, 0.0, -1000.0));\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/output1\n\tvec3 transformed = v_POLY_max1_val;vec4 mvPosition = vec4( transformed, 1.0 ); gl_Position = projectionMatrix * modelViewMatrix * mvPosition;\n\n\n\n\n\n\tvLineDistance = scale * lineDistance;\n\n\t#include <color_vertex>\n// removed:\n//\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n// removed:\n//\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\n\n\tvHighPrecisionZW = gl_Position.zw;\n}\n","customDistanceMaterial.fragment":"\n// INSERT DEFINES\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/rgbToOklab1\n//////////////////////////////////////////////////////////////////////\n//\n// Visualizing Björn Ottosson's \"oklab\" colorspace\n//\n// shadertoy implementation by mattz\n//\n// license CC0 (public domain)\n// https://creativecommons.org/share-your-work/public-domain/cc0/\n//\n// Click and drag to set lightness (mouse x) and chroma (mouse y).\n// Hue varies linearly across the image from left to right.\n//\n// While mouse is down, plotted curves show oklab components\n// L (red), a (green), and b (blue). \n//\n// To test the inverse mapping, the plotted curves are generated\n// by mapping the (pre-clipping) linear RGB color back to oklab \n// space.\n//\n// White bars on top of the image (and black bars on the bottom of\n// the image) indicate clipping when one or more of the R, G, B \n// components are greater than 1.0 (or less than 0.0 respectively).\n//\n// The color accompanying the black/white bar shows which channels\n// are out of gamut.\n//\n// Click in the bottom left to reset the view.\n//\n// Hit the 'G' key to toggle displaying a gamut test:\n//\n// * black pixels indicate that RGB values for some hues\n// were clipped to 0 at the given lightness/chroma pair.\n//\n// * white pixels indicate that RGB values for some hues\n// were clipped to 1 at the given lightness/chroma pair\n//\n// * gray pixels indicate that both types of clipping happened\n//\n// Hit the 'U' key to display a uniform sampling of linear sRGB \n// space, converted into oklab lightness (x position) and chroma\n// (y position) coordinates. If you mouse over a colored dot, the\n// spectrum on screen should include that exact color.\n//\n//////////////////////////////////////////////////////////////////////\n\n//////////////////////////////////////////////////////////////////////\n// sRGB color transform and inverse from \n// https://bottosson.github.io/posts/colorwrong/#what-can-we-do%3F\n\nvec3 srgb_from_linear_srgb(vec3 x) {\n\n vec3 xlo = 12.92*x;\n vec3 xhi = 1.055 * pow(x, vec3(0.4166666666666667)) - 0.055;\n \n return mix(xlo, xhi, step(vec3(0.0031308), x));\n\n}\n\nvec3 linear_srgb_from_srgb(vec3 x) {\n\n vec3 xlo = x / 12.92;\n vec3 xhi = pow((x + 0.055)/(1.055), vec3(2.4));\n \n return mix(xlo, xhi, step(vec3(0.04045), x));\n\n}\n\n//////////////////////////////////////////////////////////////////////\n// oklab transform and inverse from\n// https://bottosson.github.io/posts/oklab/\n\n\nconst mat3 fwdA = mat3(1.0, 1.0, 1.0,\n 0.3963377774, -0.1055613458, -0.0894841775,\n 0.2158037573, -0.0638541728, -1.2914855480);\n \nconst mat3 fwdB = mat3(4.0767245293, -1.2681437731, -0.0041119885,\n -3.3072168827, 2.6093323231, -0.7034763098,\n 0.2307590544, -0.3411344290, 1.7068625689);\n\nconst mat3 invB = mat3(0.4121656120, 0.2118591070, 0.0883097947,\n 0.5362752080, 0.6807189584, 0.2818474174,\n 0.0514575653, 0.1074065790, 0.6302613616);\n \nconst mat3 invA = mat3(0.2104542553, 1.9779984951, 0.0259040371,\n 0.7936177850, -2.4285922050, 0.7827717662,\n -0.0040720468, 0.4505937099, -0.8086757660);\n\nvec3 oklab_from_linear_srgb(vec3 c) {\n\n vec3 lms = invB * c;\n \n return invA * (sign(lms)*pow(abs(lms), vec3(0.3333333333333)));\n \n}\n\nvec3 linear_srgb_from_oklab(vec3 c) {\n\n vec3 lms = fwdA * c;\n \n return fwdB * (lms * lms * lms);\n \n}\n\n\n// https://www.shadertoy.com/view/WtccD7\nconst float max_chroma = 0.33;\nvec3 uvToOklab(vec3 uvw){\n\n // setup oklab color\n float theta = 2.*3.141592653589793*uvw.x;\n \n float L = 0.8;\n float chroma = 0.1;\n \n //if (max(iMouse.x, iMouse.y) > 0.05 * iResolution.y) {\n L = uvw.y;//iMouse.x / iResolution.x;\n chroma = uvw.z * max_chroma;// / iResolution.y;\n //}\n \n float a = chroma*cos(theta);\n float b = chroma*sin(theta);\n \n vec3 lab = vec3(L, a, b);\n\treturn lab;\n\n // convert to rgb \n // vec3 rgb = linear_srgb_from_oklab(lab);\n\n}\n\n\n\n\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n\n\n\n\n#define DISTANCE\n\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main () {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\n\t// INSERT BODY\n\n\n\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1\n\tvec3 v_POLY_laserColor1_baseColor = vec3(0.0, 0.0, 0.0);\n\tif(true){\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/constant2\n\t\tvec3 v_POLY_laserColor1_constant2_val = vec3(0.6653872982754769, 0.5583403896257968, 0.005181516700061659);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/constant1\n\t\tvec3 v_POLY_laserColor1_constant1_val = vec3(0.7011018919268015, 0.018500220124016656, 0.005181516700061659);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/attribute1\n\t\tfloat v_POLY_laserColor1_attribute1_val = v_POLY_attribute_id;\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/rgbToOklab1\n\t\tvec3 v_POLY_laserColor1_rgbToOklab1_oklab = oklab_from_linear_srgb(v_POLY_laserColor1_constant2_val);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/rgbToOklab2\n\t\tvec3 v_POLY_laserColor1_rgbToOklab2_oklab = oklab_from_linear_srgb(v_POLY_laserColor1_constant1_val);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/round1\n\t\tfloat v_POLY_laserColor1_round1_val = sign(v_POLY_laserColor1_attribute1_val)*floor(abs(v_POLY_laserColor1_attribute1_val)+0.5);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/floatToVec2_1\n\t\tvec2 v_POLY_laserColor1_floatToVec2_1_vec2 = vec2(v_POLY_laserColor1_round1_val, 0.54);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/random1\n\t\tfloat v_POLY_laserColor1_random1_rand = rand(v_POLY_laserColor1_floatToVec2_1_vec2);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/pow1\n\t\tfloat v_POLY_laserColor1_pow1_val = pow(v_POLY_laserColor1_random1_rand, 0.27);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/mix1\n\t\tvec3 v_POLY_laserColor1_mix1_mix = mix(v_POLY_laserColor1_rgbToOklab1_oklab, v_POLY_laserColor1_rgbToOklab2_oklab, v_POLY_laserColor1_pow1_val);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/oklabToRgb1\n\t\tvec3 v_POLY_laserColor1_oklabToRgb1_rgb = linear_srgb_from_oklab(v_POLY_laserColor1_mix1_mix);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/subnetOutput1\n\t\tv_POLY_laserColor1_baseColor = v_POLY_laserColor1_oklabToRgb1_rgb;\n\t}\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/constant3\n\tfloat v_POLY_constant3_val = 0.86;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multScalar2\n\tvec3 v_POLY_multScalar2_val = (12.0*v_POLY_laserColor1_baseColor);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/output1\n\tdiffuseColor.xyz = v_POLY_multScalar2_val;\n\tdiffuseColor.w = v_POLY_constant3_val;\n\n\n\n\n\t#include <alphatest_fragment>\n\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist ); // clamp to [ 0, 1 ]\n\n\tgl_FragColor = packDepthToRGBA( dist );\n\n}\n","customDepthMaterial.vertex":"\nuniform float scale;\nattribute float lineDistance;\n\nvarying float vLineDistance;\n\n\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\n// INSERT DEFINES\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/noise1\n// Modulo 289 without a division (only multiplications)\nfloat mod289(float x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\nvec2 mod289(vec2 x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\nvec3 mod289(vec3 x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\nvec4 mod289(vec4 x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n// Modulo 7 without a division\nvec3 mod7(vec3 x) {\n return x - floor(x * (1.0 / 7.0)) * 7.0;\n}\n\n// Permutation polynomial: (34x^2 + x) mod 289\nfloat permute(float x) {\n return mod289(((x*34.0)+1.0)*x);\n}\nvec3 permute(vec3 x) {\n return mod289((34.0 * x + 1.0) * x);\n}\nvec4 permute(vec4 x) {\n return mod289(((x*34.0)+1.0)*x);\n}\n\nfloat taylorInvSqrt(float r)\n{\n return 1.79284291400159 - 0.85373472095314 * r;\n}\nvec4 taylorInvSqrt(vec4 r)\n{\n return 1.79284291400159 - 0.85373472095314 * r;\n}\n\nvec2 fade(vec2 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\nvec3 fade(vec3 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\nvec4 fade(vec4 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\n//\n// Description : Array and textureless GLSL 2D/3D/4D simplex \n// noise functions.\n// Author : Ian McEwan, Ashima Arts.\n// Maintainer : stegu\n// Lastmod : 20110822 (ijm)\n// License : Copyright (C) 2011 Ashima Arts. All rights reserved.\n// Distributed under the MIT License. See LICENSE file.\n// https://github.com/ashima/webgl-noise\n// https://github.com/stegu/webgl-noise\n// \n\n\n\nfloat snoise(vec3 v)\n { \n const vec2 C = vec2(1.0/6.0, 1.0/3.0) ;\n const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);\n\n// First corner\n vec3 i = floor(v + dot(v, C.yyy) );\n vec3 x0 = v - i + dot(i, C.xxx) ;\n\n// Other corners\n vec3 g = step(x0.yzx, x0.xyz);\n vec3 l = 1.0 - g;\n vec3 i1 = min( g.xyz, l.zxy );\n vec3 i2 = max( g.xyz, l.zxy );\n\n // x0 = x0 - 0.0 + 0.0 * C.xxx;\n // x1 = x0 - i1 + 1.0 * C.xxx;\n // x2 = x0 - i2 + 2.0 * C.xxx;\n // x3 = x0 - 1.0 + 3.0 * C.xxx;\n vec3 x1 = x0 - i1 + C.xxx;\n vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y\n vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y\n\n// Permutations\n i = mod289(i); \n vec4 p = permute( permute( permute( \n i.z + vec4(0.0, i1.z, i2.z, 1.0 ))\n + i.y + vec4(0.0, i1.y, i2.y, 1.0 )) \n + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));\n\n// Gradients: 7x7 points over a square, mapped onto an octahedron.\n// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)\n float n_ = 0.142857142857; // 1.0/7.0\n vec3 ns = n_ * D.wyz - D.xzx;\n\n vec4 j = p - 49.0 * floor(p * ns.z * ns.z); // mod(p,7*7)\n\n vec4 x_ = floor(j * ns.z);\n vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N)\n\n vec4 x = x_ *ns.x + ns.yyyy;\n vec4 y = y_ *ns.x + ns.yyyy;\n vec4 h = 1.0 - abs(x) - abs(y);\n\n vec4 b0 = vec4( x.xy, y.xy );\n vec4 b1 = vec4( x.zw, y.zw );\n\n //vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0;\n //vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;\n vec4 s0 = floor(b0)*2.0 + 1.0;\n vec4 s1 = floor(b1)*2.0 + 1.0;\n vec4 sh = -step(h, vec4(0.0));\n\n vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;\n vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;\n\n vec3 p0 = vec3(a0.xy,h.x);\n vec3 p1 = vec3(a0.zw,h.y);\n vec3 p2 = vec3(a1.xy,h.z);\n vec3 p3 = vec3(a1.zw,h.w);\n\n//Normalise gradients\n vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\n p0 *= norm.x;\n p1 *= norm.y;\n p2 *= norm.z;\n p3 *= norm.w;\n\n// Mix final noise value\n vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\n m = m * m;\n return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1), \n dot(p2,x2), dot(p3,x3) ) );\n }\n\n\nfloat fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1(in vec3 st) {\n\tfloat value = 0.0;\n\tfloat amplitude = 1.0;\n\tfor (int i = 0; i < 6; i++) {\n\t\tvalue += amplitude * snoise(st);\n\t\tst *= 2.0;\n\t\tamplitude *= 0.5;\n\t}\n\treturn value;\n}\n\n\n\n\n\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/param1\nuniform vec3 v_POLY_param_destPos;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/globals2\nuniform float time;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute1\nattribute float idn;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute2\nattribute float id;\n\n\n\n\n\n\n// vHighPrecisionZW is added to match CustomMeshDepth.frag\n// which is itself taken from threejs\nvarying vec2 vHighPrecisionZW;\n\n\nvoid main() {\n\n\t// INSERT BODY\n\n\n\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/constant1\n\tvec3 v_POLY_constant1_val = vec3(0.0, 0.0, 0.0);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/param1\n\tvec3 v_POLY_param1_val = v_POLY_param_destPos;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute1\n\tfloat v_POLY_attribute1_val = idn;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute2\n\tfloat v_POLY_attribute2_val = id;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/globals2\n\tfloat v_POLY_globals2_time = time;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1\n\tfloat v_POLY_laserColor1_attribute1_val = id;\n\tv_POLY_attribute_id = float(id);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/mix1\n\tvec3 v_POLY_mix1_mix = mix(v_POLY_constant1_val, v_POLY_param1_val, v_POLY_attribute1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/smoothstep1\n\tfloat v_POLY_smoothstep1_val = smoothstep(0.0, 0.1, v_POLY_attribute1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/smoothstep2\n\tfloat v_POLY_smoothstep2_val = smoothstep(1.0, 0.83, v_POLY_attribute1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multAdd3\n\tfloat v_POLY_multAdd3_val = (-1.0*(v_POLY_globals2_time + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multAdd1\n\tfloat v_POLY_multAdd1_val = (0.79*(v_POLY_globals2_time + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/min1\n\tfloat v_POLY_min1_val = min(v_POLY_smoothstep1_val, v_POLY_smoothstep2_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multAdd2\n\tfloat v_POLY_multAdd2_val = (1.0*(v_POLY_attribute1_val + 0.0)) + v_POLY_multAdd3_val;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/floatToVec3_2\n\tvec3 v_POLY_floatToVec3_2_vec3 = vec3(0.0, v_POLY_multAdd1_val, 0.21);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/floatToVec3_1\n\tvec3 v_POLY_floatToVec3_1_vec3 = vec3(v_POLY_min1_val, v_POLY_min1_val, v_POLY_min1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/floatToVec3_3\n\tvec3 v_POLY_floatToVec3_3_vec3 = vec3(0.0, v_POLY_attribute2_val, v_POLY_multAdd2_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multScalar1\n\tvec3 v_POLY_multScalar1_val = (0.42*v_POLY_floatToVec3_1_vec3);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/noise1\n\tfloat v_POLY_noise1_noisex = (v_POLY_multScalar1_val*fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1((v_POLY_floatToVec3_3_vec3*vec3(1.0, 1.0, 1.0))+(v_POLY_floatToVec3_2_vec3+vec3(0.0, 0.0, 0.0)))).x;\n\tfloat v_POLY_noise1_noisey = (v_POLY_multScalar1_val*fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1((v_POLY_floatToVec3_3_vec3*vec3(1.0, 1.0, 1.0))+(v_POLY_floatToVec3_2_vec3+vec3(1000.0, 1000.0, 1000.0)))).y;\n\tfloat v_POLY_noise1_noisez = (v_POLY_multScalar1_val*fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1((v_POLY_floatToVec3_3_vec3*vec3(1.0, 1.0, 1.0))+(v_POLY_floatToVec3_2_vec3+vec3(2000.0, 2000.0, 2000.0)))).z;\n\tvec3 v_POLY_noise1_noise = vec3(v_POLY_noise1_noisex, v_POLY_noise1_noisey, v_POLY_noise1_noisez);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/add1\n\tvec3 v_POLY_add1_sum = (v_POLY_mix1_mix + v_POLY_noise1_noise + vec3(0.0, 0.0, 0.0));\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/max1\n\tvec3 v_POLY_max1_val = max(v_POLY_add1_sum, vec3(-1000.0, 0.0, -1000.0));\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/output1\n\tvec3 transformed = v_POLY_max1_val;vec4 mvPosition = vec4( transformed, 1.0 ); gl_Position = projectionMatrix * modelViewMatrix * mvPosition;\n\n\n\n\n\n\tvLineDistance = scale * lineDistance;\n\n\t#include <color_vertex>\n// removed:\n//\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n// removed:\n//\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\n\n\tvHighPrecisionZW = gl_Position.zw;\n}\n","customDepthMaterial.fragment":"\n// INSERT DEFINES\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/rgbToOklab1\n//////////////////////////////////////////////////////////////////////\n//\n// Visualizing Björn Ottosson's \"oklab\" colorspace\n//\n// shadertoy implementation by mattz\n//\n// license CC0 (public domain)\n// https://creativecommons.org/share-your-work/public-domain/cc0/\n//\n// Click and drag to set lightness (mouse x) and chroma (mouse y).\n// Hue varies linearly across the image from left to right.\n//\n// While mouse is down, plotted curves show oklab components\n// L (red), a (green), and b (blue). \n//\n// To test the inverse mapping, the plotted curves are generated\n// by mapping the (pre-clipping) linear RGB color back to oklab \n// space.\n//\n// White bars on top of the image (and black bars on the bottom of\n// the image) indicate clipping when one or more of the R, G, B \n// components are greater than 1.0 (or less than 0.0 respectively).\n//\n// The color accompanying the black/white bar shows which channels\n// are out of gamut.\n//\n// Click in the bottom left to reset the view.\n//\n// Hit the 'G' key to toggle displaying a gamut test:\n//\n// * black pixels indicate that RGB values for some hues\n// were clipped to 0 at the given lightness/chroma pair.\n//\n// * white pixels indicate that RGB values for some hues\n// were clipped to 1 at the given lightness/chroma pair\n//\n// * gray pixels indicate that both types of clipping happened\n//\n// Hit the 'U' key to display a uniform sampling of linear sRGB \n// space, converted into oklab lightness (x position) and chroma\n// (y position) coordinates. If you mouse over a colored dot, the\n// spectrum on screen should include that exact color.\n//\n//////////////////////////////////////////////////////////////////////\n\n//////////////////////////////////////////////////////////////////////\n// sRGB color transform and inverse from \n// https://bottosson.github.io/posts/colorwrong/#what-can-we-do%3F\n\nvec3 srgb_from_linear_srgb(vec3 x) {\n\n vec3 xlo = 12.92*x;\n vec3 xhi = 1.055 * pow(x, vec3(0.4166666666666667)) - 0.055;\n \n return mix(xlo, xhi, step(vec3(0.0031308), x));\n\n}\n\nvec3 linear_srgb_from_srgb(vec3 x) {\n\n vec3 xlo = x / 12.92;\n vec3 xhi = pow((x + 0.055)/(1.055), vec3(2.4));\n \n return mix(xlo, xhi, step(vec3(0.04045), x));\n\n}\n\n//////////////////////////////////////////////////////////////////////\n// oklab transform and inverse from\n// https://bottosson.github.io/posts/oklab/\n\n\nconst mat3 fwdA = mat3(1.0, 1.0, 1.0,\n 0.3963377774, -0.1055613458, -0.0894841775,\n 0.2158037573, -0.0638541728, -1.2914855480);\n \nconst mat3 fwdB = mat3(4.0767245293, -1.2681437731, -0.0041119885,\n -3.3072168827, 2.6093323231, -0.7034763098,\n 0.2307590544, -0.3411344290, 1.7068625689);\n\nconst mat3 invB = mat3(0.4121656120, 0.2118591070, 0.0883097947,\n 0.5362752080, 0.6807189584, 0.2818474174,\n 0.0514575653, 0.1074065790, 0.6302613616);\n \nconst mat3 invA = mat3(0.2104542553, 1.9779984951, 0.0259040371,\n 0.7936177850, -2.4285922050, 0.7827717662,\n -0.0040720468, 0.4505937099, -0.8086757660);\n\nvec3 oklab_from_linear_srgb(vec3 c) {\n\n vec3 lms = invB * c;\n \n return invA * (sign(lms)*pow(abs(lms), vec3(0.3333333333333)));\n \n}\n\nvec3 linear_srgb_from_oklab(vec3 c) {\n\n vec3 lms = fwdA * c;\n \n return fwdB * (lms * lms * lms);\n \n}\n\n\n// https://www.shadertoy.com/view/WtccD7\nconst float max_chroma = 0.33;\nvec3 uvToOklab(vec3 uvw){\n\n // setup oklab color\n float theta = 2.*3.141592653589793*uvw.x;\n \n float L = 0.8;\n float chroma = 0.1;\n \n //if (max(iMouse.x, iMouse.y) > 0.05 * iResolution.y) {\n L = uvw.y;//iMouse.x / iResolution.x;\n chroma = uvw.z * max_chroma;// / iResolution.y;\n //}\n \n float a = chroma*cos(theta);\n float b = chroma*sin(theta);\n \n vec3 lab = vec3(L, a, b);\n\treturn lab;\n\n // convert to rgb \n // vec3 rgb = linear_srgb_from_oklab(lab);\n\n}\n\n\n\n\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n\n\n\n\n\n#if DEPTH_PACKING == 3200\n\n\tuniform float opacity;\n\n#endif\n\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tdiffuseColor.a = opacity;\n\n\t#endif\n\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\n\t// INSERT BODY\n\n\n\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1\n\tvec3 v_POLY_laserColor1_baseColor = vec3(0.0, 0.0, 0.0);\n\tif(true){\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/constant2\n\t\tvec3 v_POLY_laserColor1_constant2_val = vec3(0.6653872982754769, 0.5583403896257968, 0.005181516700061659);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/constant1\n\t\tvec3 v_POLY_laserColor1_constant1_val = vec3(0.7011018919268015, 0.018500220124016656, 0.005181516700061659);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/attribute1\n\t\tfloat v_POLY_laserColor1_attribute1_val = v_POLY_attribute_id;\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/rgbToOklab1\n\t\tvec3 v_POLY_laserColor1_rgbToOklab1_oklab = oklab_from_linear_srgb(v_POLY_laserColor1_constant2_val);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/rgbToOklab2\n\t\tvec3 v_POLY_laserColor1_rgbToOklab2_oklab = oklab_from_linear_srgb(v_POLY_laserColor1_constant1_val);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/round1\n\t\tfloat v_POLY_laserColor1_round1_val = sign(v_POLY_laserColor1_attribute1_val)*floor(abs(v_POLY_laserColor1_attribute1_val)+0.5);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/floatToVec2_1\n\t\tvec2 v_POLY_laserColor1_floatToVec2_1_vec2 = vec2(v_POLY_laserColor1_round1_val, 0.54);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/random1\n\t\tfloat v_POLY_laserColor1_random1_rand = rand(v_POLY_laserColor1_floatToVec2_1_vec2);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/pow1\n\t\tfloat v_POLY_laserColor1_pow1_val = pow(v_POLY_laserColor1_random1_rand, 0.27);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/mix1\n\t\tvec3 v_POLY_laserColor1_mix1_mix = mix(v_POLY_laserColor1_rgbToOklab1_oklab, v_POLY_laserColor1_rgbToOklab2_oklab, v_POLY_laserColor1_pow1_val);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/oklabToRgb1\n\t\tvec3 v_POLY_laserColor1_oklabToRgb1_rgb = linear_srgb_from_oklab(v_POLY_laserColor1_mix1_mix);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/subnetOutput1\n\t\tv_POLY_laserColor1_baseColor = v_POLY_laserColor1_oklabToRgb1_rgb;\n\t}\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/constant3\n\tfloat v_POLY_constant3_val = 0.86;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multScalar2\n\tvec3 v_POLY_multScalar2_val = (12.0*v_POLY_laserColor1_baseColor);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/output1\n\tdiffuseColor.xyz = v_POLY_multScalar2_val;\n\tdiffuseColor.w = v_POLY_constant3_val;\n\n\n\n\t// the new body lines should be added before the alphatest_fragment\n\t// so that alpha is set before (which is really how it would be set if the alphamap_fragment above was used by the material node parameters)\n\n\t#include <alphatest_fragment>\n\n\t#include <logdepthbuf_fragment>\n\n\n\t// Higher precision equivalent of gl_FragCoord.z. This assumes depthRange has been left to its default values.\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), diffuseColor.a );\n\n\t#elif DEPTH_PACKING == 3201\n\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\n\t#endif\n\n}\n","customDepthDOFMaterial.vertex":"\nuniform float scale;\nattribute float lineDistance;\n\nvarying float vLineDistance;\n\n\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\n// INSERT DEFINES\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/noise1\n// Modulo 289 without a division (only multiplications)\nfloat mod289(float x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\nvec2 mod289(vec2 x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\nvec3 mod289(vec3 x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\nvec4 mod289(vec4 x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n// Modulo 7 without a division\nvec3 mod7(vec3 x) {\n return x - floor(x * (1.0 / 7.0)) * 7.0;\n}\n\n// Permutation polynomial: (34x^2 + x) mod 289\nfloat permute(float x) {\n return mod289(((x*34.0)+1.0)*x);\n}\nvec3 permute(vec3 x) {\n return mod289((34.0 * x + 1.0) * x);\n}\nvec4 permute(vec4 x) {\n return mod289(((x*34.0)+1.0)*x);\n}\n\nfloat taylorInvSqrt(float r)\n{\n return 1.79284291400159 - 0.85373472095314 * r;\n}\nvec4 taylorInvSqrt(vec4 r)\n{\n return 1.79284291400159 - 0.85373472095314 * r;\n}\n\nvec2 fade(vec2 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\nvec3 fade(vec3 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\nvec4 fade(vec4 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\n//\n// Description : Array and textureless GLSL 2D/3D/4D simplex \n// noise functions.\n// Author : Ian McEwan, Ashima Arts.\n// Maintainer : stegu\n// Lastmod : 20110822 (ijm)\n// License : Copyright (C) 2011 Ashima Arts. All rights reserved.\n// Distributed under the MIT License. See LICENSE file.\n// https://github.com/ashima/webgl-noise\n// https://github.com/stegu/webgl-noise\n// \n\n\n\nfloat snoise(vec3 v)\n { \n const vec2 C = vec2(1.0/6.0, 1.0/3.0) ;\n const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);\n\n// First corner\n vec3 i = floor(v + dot(v, C.yyy) );\n vec3 x0 = v - i + dot(i, C.xxx) ;\n\n// Other corners\n vec3 g = step(x0.yzx, x0.xyz);\n vec3 l = 1.0 - g;\n vec3 i1 = min( g.xyz, l.zxy );\n vec3 i2 = max( g.xyz, l.zxy );\n\n // x0 = x0 - 0.0 + 0.0 * C.xxx;\n // x1 = x0 - i1 + 1.0 * C.xxx;\n // x2 = x0 - i2 + 2.0 * C.xxx;\n // x3 = x0 - 1.0 + 3.0 * C.xxx;\n vec3 x1 = x0 - i1 + C.xxx;\n vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y\n vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y\n\n// Permutations\n i = mod289(i); \n vec4 p = permute( permute( permute( \n i.z + vec4(0.0, i1.z, i2.z, 1.0 ))\n + i.y + vec4(0.0, i1.y, i2.y, 1.0 )) \n + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));\n\n// Gradients: 7x7 points over a square, mapped onto an octahedron.\n// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)\n float n_ = 0.142857142857; // 1.0/7.0\n vec3 ns = n_ * D.wyz - D.xzx;\n\n vec4 j = p - 49.0 * floor(p * ns.z * ns.z); // mod(p,7*7)\n\n vec4 x_ = floor(j * ns.z);\n vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N)\n\n vec4 x = x_ *ns.x + ns.yyyy;\n vec4 y = y_ *ns.x + ns.yyyy;\n vec4 h = 1.0 - abs(x) - abs(y);\n\n vec4 b0 = vec4( x.xy, y.xy );\n vec4 b1 = vec4( x.zw, y.zw );\n\n //vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0;\n //vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;\n vec4 s0 = floor(b0)*2.0 + 1.0;\n vec4 s1 = floor(b1)*2.0 + 1.0;\n vec4 sh = -step(h, vec4(0.0));\n\n vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;\n vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;\n\n vec3 p0 = vec3(a0.xy,h.x);\n vec3 p1 = vec3(a0.zw,h.y);\n vec3 p2 = vec3(a1.xy,h.z);\n vec3 p3 = vec3(a1.zw,h.w);\n\n//Normalise gradients\n vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\n p0 *= norm.x;\n p1 *= norm.y;\n p2 *= norm.z;\n p3 *= norm.w;\n\n// Mix final noise value\n vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\n m = m * m;\n return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1), \n dot(p2,x2), dot(p3,x3) ) );\n }\n\n\nfloat fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1(in vec3 st) {\n\tfloat value = 0.0;\n\tfloat amplitude = 1.0;\n\tfor (int i = 0; i < 6; i++) {\n\t\tvalue += amplitude * snoise(st);\n\t\tst *= 2.0;\n\t\tamplitude *= 0.5;\n\t}\n\treturn value;\n}\n\n\n\n\n\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/param1\nuniform vec3 v_POLY_param_destPos;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/globals2\nuniform float time;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute1\nattribute float idn;\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute2\nattribute float id;\n\n\n\n\n\n\n// vHighPrecisionZW is added to match CustomMeshDepth.frag\n// which is itself taken from threejs\nvarying vec2 vHighPrecisionZW;\n\n\nvoid main() {\n\n\t// INSERT BODY\n\n\n\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/constant1\n\tvec3 v_POLY_constant1_val = vec3(0.0, 0.0, 0.0);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/param1\n\tvec3 v_POLY_param1_val = v_POLY_param_destPos;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute1\n\tfloat v_POLY_attribute1_val = idn;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/attribute2\n\tfloat v_POLY_attribute2_val = id;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/globals2\n\tfloat v_POLY_globals2_time = time;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1\n\tfloat v_POLY_laserColor1_attribute1_val = id;\n\tv_POLY_attribute_id = float(id);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/mix1\n\tvec3 v_POLY_mix1_mix = mix(v_POLY_constant1_val, v_POLY_param1_val, v_POLY_attribute1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/smoothstep1\n\tfloat v_POLY_smoothstep1_val = smoothstep(0.0, 0.1, v_POLY_attribute1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/smoothstep2\n\tfloat v_POLY_smoothstep2_val = smoothstep(1.0, 0.83, v_POLY_attribute1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multAdd3\n\tfloat v_POLY_multAdd3_val = (-1.0*(v_POLY_globals2_time + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multAdd1\n\tfloat v_POLY_multAdd1_val = (0.79*(v_POLY_globals2_time + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/min1\n\tfloat v_POLY_min1_val = min(v_POLY_smoothstep1_val, v_POLY_smoothstep2_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multAdd2\n\tfloat v_POLY_multAdd2_val = (1.0*(v_POLY_attribute1_val + 0.0)) + v_POLY_multAdd3_val;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/floatToVec3_2\n\tvec3 v_POLY_floatToVec3_2_vec3 = vec3(0.0, v_POLY_multAdd1_val, 0.21);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/floatToVec3_1\n\tvec3 v_POLY_floatToVec3_1_vec3 = vec3(v_POLY_min1_val, v_POLY_min1_val, v_POLY_min1_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/floatToVec3_3\n\tvec3 v_POLY_floatToVec3_3_vec3 = vec3(0.0, v_POLY_attribute2_val, v_POLY_multAdd2_val);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multScalar1\n\tvec3 v_POLY_multScalar1_val = (0.42*v_POLY_floatToVec3_1_vec3);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/noise1\n\tfloat v_POLY_noise1_noisex = (v_POLY_multScalar1_val*fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1((v_POLY_floatToVec3_3_vec3*vec3(1.0, 1.0, 1.0))+(v_POLY_floatToVec3_2_vec3+vec3(0.0, 0.0, 0.0)))).x;\n\tfloat v_POLY_noise1_noisey = (v_POLY_multScalar1_val*fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1((v_POLY_floatToVec3_3_vec3*vec3(1.0, 1.0, 1.0))+(v_POLY_floatToVec3_2_vec3+vec3(1000.0, 1000.0, 1000.0)))).y;\n\tfloat v_POLY_noise1_noisez = (v_POLY_multScalar1_val*fbm_snoise_geo1_MAT_lineBasicBuilder_LIGHTING_noise1((v_POLY_floatToVec3_3_vec3*vec3(1.0, 1.0, 1.0))+(v_POLY_floatToVec3_2_vec3+vec3(2000.0, 2000.0, 2000.0)))).z;\n\tvec3 v_POLY_noise1_noise = vec3(v_POLY_noise1_noisex, v_POLY_noise1_noisey, v_POLY_noise1_noisez);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/add1\n\tvec3 v_POLY_add1_sum = (v_POLY_mix1_mix + v_POLY_noise1_noise + vec3(0.0, 0.0, 0.0));\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/max1\n\tvec3 v_POLY_max1_val = max(v_POLY_add1_sum, vec3(-1000.0, 0.0, -1000.0));\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/output1\n\tvec3 transformed = v_POLY_max1_val;vec4 mvPosition = vec4( transformed, 1.0 ); gl_Position = projectionMatrix * modelViewMatrix * mvPosition;\n\n\n\n\n\n\tvLineDistance = scale * lineDistance;\n\n\t#include <color_vertex>\n// removed:\n//\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n// removed:\n//\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\n\n\tvHighPrecisionZW = gl_Position.zw;\n}\n","customDepthDOFMaterial.fragment":"\n// INSERT DEFINES\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/rgbToOklab1\n//////////////////////////////////////////////////////////////////////\n//\n// Visualizing Björn Ottosson's \"oklab\" colorspace\n//\n// shadertoy implementation by mattz\n//\n// license CC0 (public domain)\n// https://creativecommons.org/share-your-work/public-domain/cc0/\n//\n// Click and drag to set lightness (mouse x) and chroma (mouse y).\n// Hue varies linearly across the image from left to right.\n//\n// While mouse is down, plotted curves show oklab components\n// L (red), a (green), and b (blue). \n//\n// To test the inverse mapping, the plotted curves are generated\n// by mapping the (pre-clipping) linear RGB color back to oklab \n// space.\n//\n// White bars on top of the image (and black bars on the bottom of\n// the image) indicate clipping when one or more of the R, G, B \n// components are greater than 1.0 (or less than 0.0 respectively).\n//\n// The color accompanying the black/white bar shows which channels\n// are out of gamut.\n//\n// Click in the bottom left to reset the view.\n//\n// Hit the 'G' key to toggle displaying a gamut test:\n//\n// * black pixels indicate that RGB values for some hues\n// were clipped to 0 at the given lightness/chroma pair.\n//\n// * white pixels indicate that RGB values for some hues\n// were clipped to 1 at the given lightness/chroma pair\n//\n// * gray pixels indicate that both types of clipping happened\n//\n// Hit the 'U' key to display a uniform sampling of linear sRGB \n// space, converted into oklab lightness (x position) and chroma\n// (y position) coordinates. If you mouse over a colored dot, the\n// spectrum on screen should include that exact color.\n//\n//////////////////////////////////////////////////////////////////////\n\n//////////////////////////////////////////////////////////////////////\n// sRGB color transform and inverse from \n// https://bottosson.github.io/posts/colorwrong/#what-can-we-do%3F\n\nvec3 srgb_from_linear_srgb(vec3 x) {\n\n vec3 xlo = 12.92*x;\n vec3 xhi = 1.055 * pow(x, vec3(0.4166666666666667)) - 0.055;\n \n return mix(xlo, xhi, step(vec3(0.0031308), x));\n\n}\n\nvec3 linear_srgb_from_srgb(vec3 x) {\n\n vec3 xlo = x / 12.92;\n vec3 xhi = pow((x + 0.055)/(1.055), vec3(2.4));\n \n return mix(xlo, xhi, step(vec3(0.04045), x));\n\n}\n\n//////////////////////////////////////////////////////////////////////\n// oklab transform and inverse from\n// https://bottosson.github.io/posts/oklab/\n\n\nconst mat3 fwdA = mat3(1.0, 1.0, 1.0,\n 0.3963377774, -0.1055613458, -0.0894841775,\n 0.2158037573, -0.0638541728, -1.2914855480);\n \nconst mat3 fwdB = mat3(4.0767245293, -1.2681437731, -0.0041119885,\n -3.3072168827, 2.6093323231, -0.7034763098,\n 0.2307590544, -0.3411344290, 1.7068625689);\n\nconst mat3 invB = mat3(0.4121656120, 0.2118591070, 0.0883097947,\n 0.5362752080, 0.6807189584, 0.2818474174,\n 0.0514575653, 0.1074065790, 0.6302613616);\n \nconst mat3 invA = mat3(0.2104542553, 1.9779984951, 0.0259040371,\n 0.7936177850, -2.4285922050, 0.7827717662,\n -0.0040720468, 0.4505937099, -0.8086757660);\n\nvec3 oklab_from_linear_srgb(vec3 c) {\n\n vec3 lms = invB * c;\n \n return invA * (sign(lms)*pow(abs(lms), vec3(0.3333333333333)));\n \n}\n\nvec3 linear_srgb_from_oklab(vec3 c) {\n\n vec3 lms = fwdA * c;\n \n return fwdB * (lms * lms * lms);\n \n}\n\n\n// https://www.shadertoy.com/view/WtccD7\nconst float max_chroma = 0.33;\nvec3 uvToOklab(vec3 uvw){\n\n // setup oklab color\n float theta = 2.*3.141592653589793*uvw.x;\n \n float L = 0.8;\n float chroma = 0.1;\n \n //if (max(iMouse.x, iMouse.y) > 0.05 * iResolution.y) {\n L = uvw.y;//iMouse.x / iResolution.x;\n chroma = uvw.z * max_chroma;// / iResolution.y;\n //}\n \n float a = chroma*cos(theta);\n float b = chroma*sin(theta);\n \n vec3 lab = vec3(L, a, b);\n\treturn lab;\n\n // convert to rgb \n // vec3 rgb = linear_srgb_from_oklab(lab);\n\n}\n\n\n\n\n\n\n\n// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/attribute1\nvarying float v_POLY_attribute_id;\n\n\n\n\n\n\n#if DEPTH_PACKING == 3200\n\n\tuniform float opacity;\n\n#endif\n\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tdiffuseColor.a = opacity;\n\n\t#endif\n\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\n\t// INSERT BODY\n\n\n\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1\n\tvec3 v_POLY_laserColor1_baseColor = vec3(0.0, 0.0, 0.0);\n\tif(true){\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/constant2\n\t\tvec3 v_POLY_laserColor1_constant2_val = vec3(0.6653872982754769, 0.5583403896257968, 0.005181516700061659);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/constant1\n\t\tvec3 v_POLY_laserColor1_constant1_val = vec3(0.7011018919268015, 0.018500220124016656, 0.005181516700061659);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/attribute1\n\t\tfloat v_POLY_laserColor1_attribute1_val = v_POLY_attribute_id;\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/rgbToOklab1\n\t\tvec3 v_POLY_laserColor1_rgbToOklab1_oklab = oklab_from_linear_srgb(v_POLY_laserColor1_constant2_val);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/rgbToOklab2\n\t\tvec3 v_POLY_laserColor1_rgbToOklab2_oklab = oklab_from_linear_srgb(v_POLY_laserColor1_constant1_val);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/round1\n\t\tfloat v_POLY_laserColor1_round1_val = sign(v_POLY_laserColor1_attribute1_val)*floor(abs(v_POLY_laserColor1_attribute1_val)+0.5);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/floatToVec2_1\n\t\tvec2 v_POLY_laserColor1_floatToVec2_1_vec2 = vec2(v_POLY_laserColor1_round1_val, 0.54);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/random1\n\t\tfloat v_POLY_laserColor1_random1_rand = rand(v_POLY_laserColor1_floatToVec2_1_vec2);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/pow1\n\t\tfloat v_POLY_laserColor1_pow1_val = pow(v_POLY_laserColor1_random1_rand, 0.27);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/mix1\n\t\tvec3 v_POLY_laserColor1_mix1_mix = mix(v_POLY_laserColor1_rgbToOklab1_oklab, v_POLY_laserColor1_rgbToOklab2_oklab, v_POLY_laserColor1_pow1_val);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/oklabToRgb1\n\t\tvec3 v_POLY_laserColor1_oklabToRgb1_rgb = linear_srgb_from_oklab(v_POLY_laserColor1_mix1_mix);\n\t\n\t\t// /geo1/MAT/lineBasicBuilder_LIGHTING/laserColor1/subnetOutput1\n\t\tv_POLY_laserColor1_baseColor = v_POLY_laserColor1_oklabToRgb1_rgb;\n\t}\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/constant3\n\tfloat v_POLY_constant3_val = 0.86;\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/multScalar2\n\tvec3 v_POLY_multScalar2_val = (12.0*v_POLY_laserColor1_baseColor);\n\t\n\t// /geo1/MAT/lineBasicBuilder_LIGHTING/output1\n\tdiffuseColor.xyz = v_POLY_multScalar2_val;\n\tdiffuseColor.w = v_POLY_constant3_val;\n\n\n\n\t// the new body lines should be added before the alphatest_fragment\n\t// so that alpha is set before (which is really how it would be set if the alphamap_fragment above was used by the material node parameters)\n\n\t#include <alphatest_fragment>\n\n\t#include <logdepthbuf_fragment>\n\n\n\t// Higher precision equivalent of gl_FragCoord.z. This assumes depthRange has been left to its default values.\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), diffuseColor.a );\n\n\t#elif DEPTH_PACKING == 3201\n\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\n\t#endif\n\n}\n"},"/env/MAT/meshStandardBuilder1":{"vertex":"#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n\n\n\n// /env/MAT/meshStandardBuilder1/globals1\nvarying vec3 v_POLY_globals1_position;\n\n\n\n\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\n\n\n\t// /env/MAT/meshStandardBuilder1/globals1\n\tv_POLY_globals1_position = vec3(position);\n\t\n\t// /env/MAT/meshStandardBuilder1/output1\n\tvec3 transformed = position;\n\tvec3 objectNormal = normal;\n\t#ifdef USE_TANGENT\n\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t#endif\n\n\n\n\t#include <morphcolor_vertex>\n// removed:\n//\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n// removed:\n//\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}","fragment":"#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define USE_SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n\tuniform float ior;\n#endif\n#ifdef USE_SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULAR_COLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_IRIDESCENCE\n\tuniform float iridescence;\n\tuniform float iridescenceIOR;\n\tuniform float iridescenceThicknessMinimum;\n\tuniform float iridescenceThicknessMaximum;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\nvarying vec3 vViewPosition;\n#include <common>\n\n\n\n// /env/MAT/meshStandardBuilder1/checkers1\n// https://iquilezles.org/articles/checkerfiltering/\nfloat checkers(vec2 p) {\n\tvec2 s = sign(fract(p*.5)-.5);\n\treturn .5 - .5*s.x*s.y;\n}\nfloat checkersGrad( in vec2 p, in vec2 ddx, in vec2 ddy )\n{\n // filter kernel\n vec2 w = max(abs(ddx), abs(ddy)) + 0.01;\n // analytical integral (box filter)\n vec2 i = 2.0*(abs(fract((p-0.5*w)/2.0)-0.5)-abs(fract((p+0.5*w)/2.0)-0.5))/w;\n // xor pattern\n return 0.5 - 0.5*i.x*i.y;\n}\n\n\n\n\n\n\n\n\n// /env/MAT/meshStandardBuilder1/globals1\nvarying vec3 v_POLY_globals1_position;\n\n\n\n\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <iridescence_fragment>\n#include <cube_uv_reflection_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_physical_pars_fragment>\n#include <fog_pars_fragment>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_physical_pars_fragment>\n#include <transmission_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <clearcoat_pars_fragment>\n#include <iridescence_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nstruct SSSModel {\n\tbool isActive;\n\tvec3 color;\n\tfloat thickness;\n\tfloat power;\n\tfloat scale;\n\tfloat distortion;\n\tfloat ambient;\n\tfloat attenuation;\n};\n\nvoid RE_Direct_Scattering(\n\tconst in IncidentLight directLight,\n\tconst in GeometricContext geometry,\n\tconst in SSSModel sssModel,\n\tinout ReflectedLight reflectedLight\n\t){\n\tvec3 scatteringHalf = normalize(directLight.direction + (geometry.normal * sssModel.distortion));\n\tfloat scatteringDot = pow(saturate(dot(geometry.viewDir, -scatteringHalf)), sssModel.power) * sssModel.scale;\n\tvec3 scatteringIllu = (scatteringDot + sssModel.ambient) * (sssModel.color * (1.0-sssModel.thickness));\n\treflectedLight.directDiffuse += scatteringIllu * sssModel.attenuation * directLight.color;\n}\n\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\n\n\t// /env/MAT/meshStandardBuilder1/constant1\n\tvec3 v_POLY_constant1_val = vec3(0.24313725490196078, 0.5098039215686274, 0.8549019607843137);\n\t\n\t// /env/MAT/meshStandardBuilder1/constant2\n\tvec3 v_POLY_constant2_val = vec3(0.047058823529411764, 0.10196078431372549, 0.17647058823529413);\n\t\n\t// /env/MAT/meshStandardBuilder1/vec3ToFloat1\n\tfloat v_POLY_vec3ToFloat1_x = v_POLY_globals1_position.x;\n\tfloat v_POLY_vec3ToFloat1_z = v_POLY_globals1_position.z;\n\t\n\t// /env/MAT/meshStandardBuilder1/floatToVec2_1\n\tvec2 v_POLY_floatToVec2_1_vec2 = vec2(v_POLY_vec3ToFloat1_x, v_POLY_vec3ToFloat1_z);\n\t\n\t// /env/MAT/meshStandardBuilder1/checkers1\n\tvec2 v_POLY_checkers1_coord = v_POLY_floatToVec2_1_vec2*vec2(1.0, 1.0)*1.0;\n\tfloat v_POLY_checkers1_checker = checkersGrad(v_POLY_checkers1_coord, dFdx(v_POLY_checkers1_coord), dFdy(v_POLY_checkers1_coord));\n\t\n\t// /env/MAT/meshStandardBuilder1/mix1\n\tvec3 v_POLY_mix1_mix = mix(v_POLY_constant1_val, v_POLY_constant2_val, v_POLY_checkers1_checker);\n\t\n\t// /env/MAT/meshStandardBuilder1/output1\n\tdiffuseColor.xyz = v_POLY_mix1_mix;\n\tfloat POLY_metalness = 1.0;\n\tfloat POLY_roughness = 1.0;\n\tvec3 POLY_emissive = vec3(1.0, 1.0, 1.0);\n\tSSSModel POLY_SSSModel = SSSModel(/*isActive*/false,/*color*/vec3(1.0, 1.0, 1.0), /*thickness*/0.1, /*power*/2.0, /*scale*/16.0, /*distortion*/0.1,/*ambient*/0.4,/*attenuation*/0.8 );\n\n\n\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive * POLY_emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\tfloat roughnessFactor = roughness * POLY_roughness;\n\n#ifdef USE_ROUGHNESSMAP\n\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\n\t// reads channel G, compatible with a combined OcclusionRoughnessMetallic (RGB) texture\n\troughnessFactor *= texelRoughness.g;\n\n#endif\n\n\tfloat metalnessFactor = metalness * POLY_metalness;\n\n#ifdef USE_METALNESSMAP\n\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\n\t// reads channel B, compatible with a combined OcclusionRoughnessMetallic (RGB) texture\n\tmetalnessFactor *= texelMetalness.b;\n\n#endif\n\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <clearcoat_normal_fragment_begin>\n\t#include <clearcoat_normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_fragment_begin>\nif(POLY_SSSModel.isActive){\n\tRE_Direct_Scattering(directLight, geometry, POLY_SSSModel, reflectedLight);\n}\n\n\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\t#include <transmission_fragment>\n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\t#ifdef USE_SHEEN\n\t\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\n\t\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecular;\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + clearcoatSpecular * material.clearcoat;\n\t#endif\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}","customDepthMaterial.vertex":"#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n\n\n\n// /env/MAT/meshStandardBuilder1/globals1\nvarying vec3 v_POLY_globals1_position;\n\n\n\n\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n// removed:\n//\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n// removed:\n//\t#include <begin_vertex>\n\n\n\n\t// /env/MAT/meshStandardBuilder1/globals1\n\tv_POLY_globals1_position = vec3(position);\n\t\n\t// /env/MAT/meshStandardBuilder1/output1\n\tvec3 transformed = position;\n\tvec3 objectNormal = normal;\n\t#ifdef USE_TANGENT\n\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t#endif\n\n\n\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvHighPrecisionZW = gl_Position.zw;\n}","customDepthMaterial.fragment":"\n// INSERT DEFINES\n\n\n#if DEPTH_PACKING == 3200\n\n\tuniform float opacity;\n\n#endif\n\n#include <common>\n\n\n\n// /env/MAT/meshStandardBuilder1/checkers1\n// https://iquilezles.org/articles/checkerfiltering/\nfloat checkers(vec2 p) {\n\tvec2 s = sign(fract(p*.5)-.5);\n\treturn .5 - .5*s.x*s.y;\n}\nfloat checkersGrad( in vec2 p, in vec2 ddx, in vec2 ddy )\n{\n // filter kernel\n vec2 w = max(abs(ddx), abs(ddy)) + 0.01;\n // analytical integral (box filter)\n vec2 i = 2.0*(abs(fract((p-0.5*w)/2.0)-0.5)-abs(fract((p+0.5*w)/2.0)-0.5))/w;\n // xor pattern\n return 0.5 - 0.5*i.x*i.y;\n}\n\n\n\n\n\n\n\n\n// /env/MAT/meshStandardBuilder1/globals1\nvarying vec3 v_POLY_globals1_position;\n\n\n\n\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvarying vec2 vHighPrecisionZW;\n\nstruct SSSModel {\n\tbool isActive;\n\tvec3 color;\n\tfloat thickness;\n\tfloat power;\n\tfloat scale;\n\tfloat distortion;\n\tfloat ambient;\n\tfloat attenuation;\n};\n\nvoid RE_Direct_Scattering(\n\tconst in IncidentLight directLight,\n\tconst in GeometricContext geometry,\n\tconst in SSSModel sssModel,\n\tinout ReflectedLight reflectedLight\n\t){\n\tvec3 scatteringHalf = normalize(directLight.direction + (geometry.normal * sssModel.distortion));\n\tfloat scatteringDot = pow(saturate(dot(geometry.viewDir, -scatteringHalf)), sssModel.power) * sssModel.scale;\n\tvec3 scatteringIllu = (scatteringDot + sssModel.ambient) * (sssModel.color * (1.0-sssModel.thickness));\n\treflectedLight.directDiffuse += scatteringIllu * sssModel.attenuation * directLight.color;\n}\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tdiffuseColor.a = opacity;\n\n\t#endif\n\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\n\n\n\t// /env/MAT/meshStandardBuilder1/constant1\n\tvec3 v_POLY_constant1_val = vec3(0.24313725490196078, 0.5098039215686274, 0.8549019607843137);\n\t\n\t// /env/MAT/meshStandardBuilder1/constant2\n\tvec3 v_POLY_constant2_val = vec3(0.047058823529411764, 0.10196078431372549, 0.17647058823529413);\n\t\n\t// /env/MAT/meshStandardBuilder1/vec3ToFloat1\n\tfloat v_POLY_vec3ToFloat1_x = v_POLY_globals1_position.x;\n\tfloat v_POLY_vec3ToFloat1_z = v_POLY_globals1_position.z;\n\t\n\t// /env/MAT/meshStandardBuilder1/floatToVec2_1\n\tvec2 v_POLY_floatToVec2_1_vec2 = vec2(v_POLY_vec3ToFloat1_x, v_POLY_vec3ToFloat1_z);\n\t\n\t// /env/MAT/meshStandardBuilder1/checkers1\n\tvec2 v_POLY_checkers1_coord = v_POLY_floatToVec2_1_vec2*vec2(1.0, 1.0)*1.0;\n\tfloat v_POLY_checkers1_checker = checkersGrad(v_POLY_checkers1_coord, dFdx(v_POLY_checkers1_coord), dFdy(v_POLY_checkers1_coord));\n\t\n\t// /env/MAT/meshStandardBuilder1/mix1\n\tvec3 v_POLY_mix1_mix = mix(v_POLY_constant1_val, v_POLY_constant2_val, v_POLY_checkers1_checker);\n\t\n\t// /env/MAT/meshStandardBuilder1/output1\n\tdiffuseColor.xyz = v_POLY_mix1_mix;\n\tfloat POLY_metalness = 1.0;\n\tfloat POLY_roughness = 1.0;\n\tvec3 POLY_emissive = vec3(1.0, 1.0, 1.0);\n\tSSSModel POLY_SSSModel = SSSModel(/*isActive*/false,/*color*/vec3(1.0, 1.0, 1.0), /*thickness*/0.1, /*power*/2.0, /*scale*/16.0, /*distortion*/0.1,/*ambient*/0.4,/*attenuation*/0.8 );\n\n\n\n\n\t// INSERT BODY\n\t// the new body lines should be added before the alphatest_fragment\n\t// so that alpha is set before (which is really how it would be set if the alphamap_fragment above was used by the material node parameters)\n\n\t#include <alphatest_fragment>\n\n\t#include <logdepthbuf_fragment>\n\n\n\t// Higher precision equivalent of gl_FragCoord.z. This assumes depthRange has been left to its default values.\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), diffuseColor.a );\n\n\t#elif DEPTH_PACKING == 3201\n\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\n\t#endif\n\n}\n","customDistanceMaterial.vertex":"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n\n\n\n// /env/MAT/meshStandardBuilder1/globals1\nvarying vec3 v_POLY_globals1_position;\n\n\n\n\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n// removed:\n//\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n// removed:\n//\t#include <begin_vertex>\n\n\n\n\t// /env/MAT/meshStandardBuilder1/globals1\n\tv_POLY_globals1_position = vec3(position);\n\t\n\t// /env/MAT/meshStandardBuilder1/output1\n\tvec3 transformed = position;\n\tvec3 objectNormal = normal;\n\t#ifdef USE_TANGENT\n\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t#endif\n\n\n\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition.xyz;\n}","customDistanceMaterial.fragment":"\n// INSERT DEFINES\n\n#define DISTANCE\n\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n\n#include <common>\n\n\n\n// /env/MAT/meshStandardBuilder1/checkers1\n// https://iquilezles.org/articles/checkerfiltering/\nfloat checkers(vec2 p) {\n\tvec2 s = sign(fract(p*.5)-.5);\n\treturn .5 - .5*s.x*s.y;\n}\nfloat checkersGrad( in vec2 p, in vec2 ddx, in vec2 ddy )\n{\n // filter kernel\n vec2 w = max(abs(ddx), abs(ddy)) + 0.01;\n // analytical integral (box filter)\n vec2 i = 2.0*(abs(fract((p-0.5*w)/2.0)-0.5)-abs(fract((p+0.5*w)/2.0)-0.5))/w;\n // xor pattern\n return 0.5 - 0.5*i.x*i.y;\n}\n\n\n\n\n\n\n\n\n// /env/MAT/meshStandardBuilder1/globals1\nvarying vec3 v_POLY_globals1_position;\n\n\n\n\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nstruct SSSModel {\n\tbool isActive;\n\tvec3 color;\n\tfloat thickness;\n\tfloat power;\n\tfloat scale;\n\tfloat distortion;\n\tfloat ambient;\n\tfloat attenuation;\n};\n\nvoid RE_Direct_Scattering(\n\tconst in IncidentLight directLight,\n\tconst in GeometricContext geometry,\n\tconst in SSSModel sssModel,\n\tinout ReflectedLight reflectedLight\n\t){\n\tvec3 scatteringHalf = normalize(directLight.direction + (geometry.normal * sssModel.distortion));\n\tfloat scatteringDot = pow(saturate(dot(geometry.viewDir, -scatteringHalf)), sssModel.power) * sssModel.scale;\n\tvec3 scatteringIllu = (scatteringDot + sssModel.ambient) * (sssModel.color * (1.0-sssModel.thickness));\n\treflectedLight.directDiffuse += scatteringIllu * sssModel.attenuation * directLight.color;\n}\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\n\n\n\t// /env/MAT/meshStandardBuilder1/constant1\n\tvec3 v_POLY_constant1_val = vec3(0.24313725490196078, 0.5098039215686274, 0.8549019607843137);\n\t\n\t// /env/MAT/meshStandardBuilder1/constant2\n\tvec3 v_POLY_constant2_val = vec3(0.047058823529411764, 0.10196078431372549, 0.17647058823529413);\n\t\n\t// /env/MAT/meshStandardBuilder1/vec3ToFloat1\n\tfloat v_POLY_vec3ToFloat1_x = v_POLY_globals1_position.x;\n\tfloat v_POLY_vec3ToFloat1_z = v_POLY_globals1_position.z;\n\t\n\t// /env/MAT/meshStandardBuilder1/floatToVec2_1\n\tvec2 v_POLY_floatToVec2_1_vec2 = vec2(v_POLY_vec3ToFloat1_x, v_POLY_vec3ToFloat1_z);\n\t\n\t// /env/MAT/meshStandardBuilder1/checkers1\n\tvec2 v_POLY_checkers1_coord = v_POLY_floatToVec2_1_vec2*vec2(1.0, 1.0)*1.0;\n\tfloat v_POLY_checkers1_checker = checkersGrad(v_POLY_checkers1_coord, dFdx(v_POLY_checkers1_coord), dFdy(v_POLY_checkers1_coord));\n\t\n\t// /env/MAT/meshStandardBuilder1/mix1\n\tvec3 v_POLY_mix1_mix = mix(v_POLY_constant1_val, v_POLY_constant2_val, v_POLY_checkers1_checker);\n\t\n\t// /env/MAT/meshStandardBuilder1/output1\n\tdiffuseColor.xyz = v_POLY_mix1_mix;\n\tfloat POLY_metalness = 1.0;\n\tfloat POLY_roughness = 1.0;\n\tvec3 POLY_emissive = vec3(1.0, 1.0, 1.0);\n\tSSSModel POLY_SSSModel = SSSModel(/*isActive*/false,/*color*/vec3(1.0, 1.0, 1.0), /*thickness*/0.1, /*power*/2.0, /*scale*/16.0, /*distortion*/0.1,/*ambient*/0.4,/*attenuation*/0.8 );\n\n\n\n\n\t// INSERT BODY\n\n\t#include <alphatest_fragment>\n\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist ); // clamp to [ 0, 1 ]\n\n\tgl_FragColor = packDepthToRGBA( dist );\n\n}\n","customDepthDOFMaterial.vertex":"#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n\n\n\n// /env/MAT/meshStandardBuilder1/globals1\nvarying vec3 v_POLY_globals1_position;\n\n\n\n\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n// removed:\n//\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n// removed:\n//\t#include <begin_vertex>\n\n\n\n\t// /env/MAT/meshStandardBuilder1/globals1\n\tv_POLY_globals1_position = vec3(position);\n\t\n\t// /env/MAT/meshStandardBuilder1/output1\n\tvec3 transformed = position;\n\tvec3 objectNormal = normal;\n\t#ifdef USE_TANGENT\n\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t#endif\n\n\n\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvHighPrecisionZW = gl_Position.zw;\n}","customDepthDOFMaterial.fragment":"\n// INSERT DEFINES\n\n\n#if DEPTH_PACKING == 3200\n\n\tuniform float opacity;\n\n#endif\n\n#include <common>\n\n\n\n// /env/MAT/meshStandardBuilder1/checkers1\n// https://iquilezles.org/articles/checkerfiltering/\nfloat checkers(vec2 p) {\n\tvec2 s = sign(fract(p*.5)-.5);\n\treturn .5 - .5*s.x*s.y;\n}\nfloat checkersGrad( in vec2 p, in vec2 ddx, in vec2 ddy )\n{\n // filter kernel\n vec2 w = max(abs(ddx), abs(ddy)) + 0.01;\n // analytical integral (box filter)\n vec2 i = 2.0*(abs(fract((p-0.5*w)/2.0)-0.5)-abs(fract((p+0.5*w)/2.0)-0.5))/w;\n // xor pattern\n return 0.5 - 0.5*i.x*i.y;\n}\n\n\n\n\n\n\n\n\n// /env/MAT/meshStandardBuilder1/globals1\nvarying vec3 v_POLY_globals1_position;\n\n\n\n\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvarying vec2 vHighPrecisionZW;\n\nstruct SSSModel {\n\tbool isActive;\n\tvec3 color;\n\tfloat thickness;\n\tfloat power;\n\tfloat scale;\n\tfloat distortion;\n\tfloat ambient;\n\tfloat attenuation;\n};\n\nvoid RE_Direct_Scattering(\n\tconst in IncidentLight directLight,\n\tconst in GeometricContext geometry,\n\tconst in SSSModel sssModel,\n\tinout ReflectedLight reflectedLight\n\t){\n\tvec3 scatteringHalf = normalize(directLight.direction + (geometry.normal * sssModel.distortion));\n\tfloat scatteringDot = pow(saturate(dot(geometry.viewDir, -scatteringHalf)), sssModel.power) * sssModel.scale;\n\tvec3 scatteringIllu = (scatteringDot + sssModel.ambient) * (sssModel.color * (1.0-sssModel.thickness));\n\treflectedLight.directDiffuse += scatteringIllu * sssModel.attenuation * directLight.color;\n}\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tdiffuseColor.a = opacity;\n\n\t#endif\n\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\n\n\n\t// /env/MAT/meshStandardBuilder1/constant1\n\tvec3 v_POLY_constant1_val = vec3(0.24313725490196078, 0.5098039215686274, 0.8549019607843137);\n\t\n\t// /env/MAT/meshStandardBuilder1/constant2\n\tvec3 v_POLY_constant2_val = vec3(0.047058823529411764, 0.10196078431372549, 0.17647058823529413);\n\t\n\t// /env/MAT/meshStandardBuilder1/vec3ToFloat1\n\tfloat v_POLY_vec3ToFloat1_x = v_POLY_globals1_position.x;\n\tfloat v_POLY_vec3ToFloat1_z = v_POLY_globals1_position.z;\n\t\n\t// /env/MAT/meshStandardBuilder1/floatToVec2_1\n\tvec2 v_POLY_floatToVec2_1_vec2 = vec2(v_POLY_vec3ToFloat1_x, v_POLY_vec3ToFloat1_z);\n\t\n\t// /env/MAT/meshStandardBuilder1/checkers1\n\tvec2 v_POLY_checkers1_coord = v_POLY_floatToVec2_1_vec2*vec2(1.0, 1.0)*1.0;\n\tfloat v_POLY_checkers1_checker = checkersGrad(v_POLY_checkers1_coord, dFdx(v_POLY_checkers1_coord), dFdy(v_POLY_checkers1_coord));\n\t\n\t// /env/MAT/meshStandardBuilder1/mix1\n\tvec3 v_POLY_mix1_mix = mix(v_POLY_constant1_val, v_POLY_constant2_val, v_POLY_checkers1_checker);\n\t\n\t// /env/MAT/meshStandardBuilder1/output1\n\tdiffuseColor.xyz = v_POLY_mix1_mix;\n\tfloat POLY_metalness = 1.0;\n\tfloat POLY_roughness = 1.0;\n\tvec3 POLY_emissive = vec3(1.0, 1.0, 1.0);\n\tSSSModel POLY_SSSModel = SSSModel(/*isActive*/false,/*color*/vec3(1.0, 1.0, 1.0), /*thickness*/0.1, /*power*/2.0, /*scale*/16.0, /*distortion*/0.1,/*ambient*/0.4,/*attenuation*/0.8 );\n\n\n\n\n\t// INSERT BODY\n\t// the new body lines should be added before the alphatest_fragment\n\t// so that alpha is set before (which is really how it would be set if the alphamap_fragment above was used by the material node parameters)\n\n\t#include <alphatest_fragment>\n\n\t#include <logdepthbuf_fragment>\n\n\n\t// Higher precision equivalent of gl_FragCoord.z. This assumes depthRange has been left to its default values.\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), diffuseColor.a );\n\n\t#elif DEPTH_PACKING == 3201\n\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\n\t#endif\n\n}\n"}},"jsFunctionBodies":{"/geo1/actor_for_each_line":"// insert defines\nclass CustomActorEvaluator extends ActorEvaluator {\n\t// insert members\n\n\t// /geo1/actor_for_each_line/getObjectProperty1\n\tv_POLY_getObjectProperty1_position = computed(() => getObjectProperty(this.object3D, \"position\"));\n\n\t// /geo1/actor_for_each_line/getParent1\n\tv_POLY_getParent1_Object3D = computed(() => getParent(this.object3D));\n\n\t// /geo1/actor_for_each_line/getObjectAttribute2\n\tv_POLY_getObjectAttribute2_val = computed(() => getObjectAttribute(this.object3D, \"idn\", \"float\", 0.0));\n\n\t// /geo1/actor_for_each_line/onTick2\n\tv_POLY_onTick2_time = computed(() => globalsTime());\n\tv_POLY_onTick2_delta = computed(() => globalsTimeDelta());\n\n\t// /geo1/actor_for_each_line/getObject1\n\tv_POLY_getObject1_Object3D = computed(() => getObject(this.object3D, false, \"*/rhino\"));\n\n\t// /geo1/actor_for_each_line/getObjectAttribute1\n\tv_POLY_getObjectAttribute1_val = computed(() =>\n\t\tgetObjectAttribute(\n\t\t\tthis.v_POLY_getParent1_Object3D.value,\n\t\t\tthis.v_POLY_constant2_val.value,\n\t\t\t\"Vector3\",\n\t\t\tVAR__getObjectAttribute1_defaultVector3.set(0, 0, 0)\n\t\t)\n\t);\n\n\t// /geo1/actor_for_each_line/rand2\n\tv_POLY_rand2_rand = computed(() => mathFloat_2(rand, this.v_POLY_getObjectAttribute2_val.value, 18.08));\n\n\t// /geo1/actor_for_each_line/rand1\n\tv_POLY_rand1_rand = computed(() => mathFloat_2(rand, this.v_POLY_getObjectAttribute2_val.value, 0.0));\n\n\t// /geo1/actor_for_each_line/multAdd2\n\tv_POLY_multAdd2_val = computed(() => mathFloat_4(multAdd, this.v_POLY_onTick2_time.value, 0.0, 4.0, 0.0));\n\n\t// /geo1/actor_for_each_line/onObjectAttributeUpdate1\n\tv_POLY_onObjectAttributeUpdate1_newValue = computed(() =>\n\t\tgetObjectAttributeAutoDefault(this.object3D, this.v_POLY_constant3_val.value, \"Vector3\")\n\t);\n\n\t// /geo1/actor_for_each_line/multAdd5\n\tv_POLY_multAdd5_val = computed(() => mathFloat_4(multAdd, this.v_POLY_rand2_rand.value, 0.0, 51.0, 0.0));\n\n\t// /geo1/actor_for_each_line/multAdd4\n\tv_POLY_multAdd4_val = computed(() => mathFloat_4(multAdd, this.v_POLY_rand1_rand.value, 0.0, 12.0, 0.0));\n\n\t// /geo1/actor_for_each_line/add3\n\tv_POLY_add3_sum = computed(() => addNumber(this.v_POLY_multAdd5_val.value, this.v_POLY_multAdd2_val.value, 0.0));\n\n\t// /geo1/actor_for_each_line/add1\n\tv_POLY_add1_sum = computed(() => addNumber(this.v_POLY_multAdd4_val.value, this.v_POLY_multAdd2_val.value, 0.0));\n\n\t// /geo1/actor_for_each_line/cos1\n\tv_POLY_cos1_cos = computed(() => mathFloat_1(Math.cos, this.v_POLY_add3_sum.value));\n\n\t// /geo1/actor_for_each_line/sin1\n\tv_POLY_sin1_sin = computed(() => mathFloat_1(Math.sin, this.v_POLY_add1_sum.value));\n\n\t// /geo1/actor_for_each_line/multAdd3\n\tv_POLY_multAdd3_val = computed(() => mathFloat_4(multAdd, this.v_POLY_cos1_cos.value, 0.0, 0.03, 0.0));\n\n\t// /geo1/actor_for_each_line/multAdd1\n\tv_POLY_multAdd1_val = computed(() => mathFloat_4(multAdd, this.v_POLY_sin1_sin.value, 0.0, 0.04, 0.0));\n\n\t// /geo1/actor_for_each_line/floatToVec3_1\n\tv_POLY_floatToVec3_1_vec3 = computed(() =>\n\t\tfloatToVec3(this.v_POLY_multAdd3_val.value, this.v_POLY_multAdd1_val.value, 0.0, VAR__floatToVec3_1_)\n\t);\n\n\t// /geo1/actor_for_each_line/add2\n\tv_POLY_add2_sum = computed(() =>\n\t\taddVector(\n\t\t\tVAR__add2_add0.copy(this.v_POLY_getObjectAttribute1_val.value),\n\t\t\tVAR__add2_add1.copy(this.v_POLY_floatToVec3_1_vec3.value),\n\t\t\tVAR__add2_add2.set(0, 0, 0)\n\t\t)\n\t);\n\n\t// /geo1/actor_for_each_line/subtract1\n\tv_POLY_subtract1_sub = computed(() =>\n\t\tsubtractVector(\n\t\t\tVAR__subtract1_sub0.copy(this.v_POLY_add2_sum.value),\n\t\t\tVAR__subtract1_sub1.copy(this.v_POLY_getObjectProperty1_position.value),\n\t\t\tVAR__subtract1_sub2.set(0, 0, 0)\n\t\t)\n\t);\n\n\t// /geo1/actor_for_each_line/multScalar1\n\tv_POLY_multScalar1_val = computed(() =>\n\t\tmultScalarVector3(VAR__multScalar1_value.copy(this.v_POLY_subtract1_sub.value), 100.0, VAR__multScalar1__1)\n\t);\n\n\t// /geo1/actor_for_each_line/ray1\n\tv_POLY_ray1_Ray = computed(() =>\n\t\traySet(\n\t\t\tVAR__ray1_origin.copy(this.v_POLY_getObjectProperty1_position.value),\n\t\t\tVAR__ray1_direction.copy(this.v_POLY_multScalar1_val.value),\n\t\t\tVAR__ray1__2\n\t\t)\n\t);\n\n\t// /geo1/actor_for_each_line/add4\n\tv_POLY_add4_sum = computed(() =>\n\t\taddVector(\n\t\t\tVAR__add4_add0.copy(this.v_POLY_getObjectProperty1_position.value),\n\t\t\tVAR__add4_add1.copy(this.v_POLY_multScalar1_val.value),\n\t\t\tVAR__add4_add2.set(0, 0, 0)\n\t\t)\n\t);\n\n\t// /geo1/actor_for_each_line/rayIntersectObject1\n\tv_POLY_rayIntersectObject1_Intersection = computed(() =>\n\t\trayIntersectObject3D(this.v_POLY_ray1_Ray.value, this.v_POLY_getObject1_Object3D.value, false)\n\t);\n\n\t// /geo1/actor_for_each_line/getIntersectionProperty1\n\tv_POLY_getIntersectionProperty1_point = computed(() =>\n\t\tgetIntersectionPropertyPoint(this.v_POLY_rayIntersectObject1_Intersection.value, VAR__getIntersectionProperty1_)\n\t);\n\n\t// /geo1/actor_for_each_line/length1\n\tv_POLY_length1_val = computed(() =>\n\t\tlengthVector(VAR__length1_v.copy(this.v_POLY_getIntersectionProperty1_point.value))\n\t);\n\n\t// /geo1/actor_for_each_line/subtract3\n\tv_POLY_subtract3_sub = computed(() =>\n\t\tsubtractVector(\n\t\t\tVAR__subtract3_sub0.copy(this.v_POLY_getIntersectionProperty1_point.value),\n\t\t\tVAR__subtract3_sub1.copy(this.v_POLY_getObjectProperty1_position.value),\n\t\t\tVAR__subtract3_sub2.set(0, 0, 0)\n\t\t)\n\t);\n\n\t// /geo1/actor_for_each_line/compare1\n\tv_POLY_compare1_val = computed(() => this.v_POLY_length1_val.value > 0.04);\n\n\t// /geo1/actor_for_each_line/twoWaySwitch1\n\tv_POLY_twoWaySwitch1_val = computed(() =>\n\t\tthis.v_POLY_compare1_val.value\n\t\t\t? VAR__twoWaySwitch1_ifTrue.copy(this.v_POLY_subtract3_sub.value)\n\t\t\t: VAR__twoWaySwitch1_ifFalse.copy(this.v_POLY_add4_sum.value)\n\t);\n\n\t// /geo1/actor_for_each_line/onTick1\n\tv_POLY_onTick1_time = computed(() => globalsTime());\n\tv_POLY_onTick1_delta = computed(() => globalsTimeDelta());\n\n\t// /geo1/actor_for_each_line/constant2\n\tv_POLY_constant2_val = { value: \"rayHit\" };\n\n\t// /geo1/actor_for_each_line/constant3\n\tv_POLY_constant3_val = { value: \"rayHit\" };\n\n\t// /geo1/actor_for_each_line/constant5\n\tv_POLY_constant5_val = { value: \"destPos\" };\n\n\tconstructor(node, object3D) {\n\t\tsuper(node, object3D);\n\t\t// insert after constructor\n\n\t\t// /geo1/actor_for_each_line/onObjectAttributeUpdate1\n\n\t\tthis._watchStopHandles.push(\n\t\t\twatch(\n\t\t\t\tgetObjectAttributeRef(this.object3D, this.v_POLY_constant3_val.value, \"Vector3\"),\n\t\t\t\t() => {\n\t\t\t\t\tthis.onObjectAttributeUpdate1();\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tdeep: true,\n\t\t\t\t}\n\t\t\t)\n\t\t);\n\t}\n\t// insert body\n\n\tonTick() {\n\t\tthis.onTick1();\n\t}\n\t// /geo1/actor_for_each_line/onObjectAttributeUpdate1\n\tonObjectAttributeUpdate1() {\n\t\tthis.setMaterialUniform1(0);\n\t}\n\n\t// /geo1/actor_for_each_line/onTick1\n\tonTick1() {\n\t\tthis.triggerFilter1(0);\n\t}\n\n\t// /geo1/actor_for_each_line/triggerFilter1\n\ttriggerFilter1() {\n\t\tif (this.v_POLY_compare1_val.value == false) {\n\t\t\treturn;\n\t\t}\n\t\tthis.setObjectAttribute1(0);\n\t}\n\n\t// /geo1/actor_for_each_line/setObjectAttribute1\n\tsetObjectAttribute1() {\n\t\tsetObjectAttribute(\n\t\t\tthis.object3D,\n\t\t\tthis.v_POLY_constant3_val.value,\n\t\t\t1.0,\n\t\t\tVAR__setObjectAttribute1_val.copy(this.v_POLY_twoWaySwitch1_val.value),\n\t\t\t\"Vector3\"\n\t\t);\n\t}\n\n\t// /geo1/actor_for_each_line/setMaterialUniform1\n\tsetMaterialUniform1() {\n\t\tsetMaterialUniformVectorColor(\n\t\t\tthis.object3D.material,\n\t\t\tthis.v_POLY_constant5_val.value,\n\t\t\tVAR__setMaterialUniform1_Vector3.copy(this.v_POLY_onObjectAttributeUpdate1_newValue.value),\n\t\t\t1.0,\n\t\t\ttrue,\n\t\t\ttrue\n\t\t);\n\t}\n}\nreturn CustomActorEvaluator;\n","/geo1/actor_for_lines_parent":"// insert defines\nclass CustomActorEvaluator extends ActorEvaluator {\n\t// insert members\n\n\t// /geo1/actor_for_lines_parent/rayFromCursor1\n\tv_POLY_rayFromCursor1_Ray = computed(() => globalsRayFromCursor());\n\n\t// /geo1/actor_for_lines_parent/getObject1\n\tv_POLY_getObject1_Object3D = computed(() => getObject(this.object3D, false, \"*/rhino\"));\n\n\t// /geo1/actor_for_lines_parent/rayIntersectObject1\n\tv_POLY_rayIntersectObject1_Intersection = computed(() =>\n\t\trayIntersectObject3D(this.v_POLY_rayFromCursor1_Ray.value, this.v_POLY_getObject1_Object3D.value, false)\n\t);\n\n\t// /geo1/actor_for_lines_parent/getIntersectionProperty1\n\tv_POLY_getIntersectionProperty1_point = computed(() =>\n\t\tgetIntersectionPropertyPoint(this.v_POLY_rayIntersectObject1_Intersection.value, VAR__getIntersectionProperty1_)\n\t);\n\n\t// /geo1/actor_for_lines_parent/length1\n\tv_POLY_length1_val = computed(() =>\n\t\tlengthVector(VAR__length1_v.copy(this.v_POLY_getIntersectionProperty1_point.value))\n\t);\n\n\t// /geo1/actor_for_lines_parent/compare1\n\tv_POLY_compare1_val = computed(() => this.v_POLY_length1_val.value > 0.02);\n\n\t// /geo1/actor_for_lines_parent/onTick1\n\tv_POLY_onTick1_time = computed(() => globalsTime());\n\tv_POLY_onTick1_delta = computed(() => globalsTimeDelta());\n\n\t// /geo1/actor_for_lines_parent/constant2\n\tv_POLY_constant2_val = { value: \"rayHit\" };\n\n\tconstructor(node, object3D) {\n\t\tsuper(node, object3D);\n\t\t// insert after constructor\n\t}\n\t// insert body\n\n\tonTick() {\n\t\tthis.onTick1();\n\t}\n\t// /geo1/actor_for_lines_parent/onTick1\n\tonTick1() {\n\t\tthis.triggerFilter1(0);\n\t}\n\n\t// /geo1/actor_for_lines_parent/triggerFilter1\n\ttriggerFilter1() {\n\t\tif (this.v_POLY_compare1_val.value == false) {\n\t\t\treturn;\n\t\t}\n\t\tthis.setObjectAttribute1(0);\n\t}\n\n\t// /geo1/actor_for_lines_parent/setObjectAttribute1\n\tsetObjectAttribute1() {\n\t\tsetObjectAttribute(\n\t\t\tthis.object3D,\n\t\t\tthis.v_POLY_constant2_val.value,\n\t\t\t0.18,\n\t\t\tVAR__setObjectAttribute1_val.copy(this.v_POLY_getIntersectionProperty1_point.value),\n\t\t\t\"Vector3\"\n\t\t);\n\t}\n}\nreturn CustomActorEvaluator;\n","/geo1/actor1":"// insert defines\nclass CustomActorEvaluator extends ActorEvaluator {\n\t// insert members\n\n\t// /geo1/actor1/getObject1\n\tv_POLY_getObject1_Object3D = computed(() => getObject(this.object3D, false, \" /geo1/geo1:sopGroup/linesParent\"));\n\n\t// /geo1/actor1/onTick2\n\tv_POLY_onTick2_time = computed(() => globalsTime());\n\tv_POLY_onTick2_delta = computed(() => globalsTimeDelta());\n\n\t// /geo1/actor1/getObjectAttribute1\n\tv_POLY_getObjectAttribute1_val = computed(() =>\n\t\tgetObjectAttribute(\n\t\t\tthis.v_POLY_getObject1_Object3D.value,\n\t\t\tthis.v_POLY_constant2_val.value,\n\t\t\t\"Vector3\",\n\t\t\tVAR__getObjectAttribute1_defaultVector3.set(0, 0, 0)\n\t\t)\n\t);\n\n\t// /geo1/actor1/floatToVec3_1\n\tv_POLY_floatToVec3_1_vec3 = computed(() =>\n\t\tfloatToVec3(0.0, this.v_POLY_onTick2_time.value, 0.0, VAR__floatToVec3_1_)\n\t);\n\n\t// /geo1/actor1/noiseImproved1\n\tv_POLY_noiseImproved1_noise = computed(() =>\n\t\tnoiseImprovedVector3(\n\t\t\tVAR__noiseImproved1_position.copy(this.v_POLY_floatToVec3_1_vec3.value),\n\t\t\t0.32,\n\t\t\tVAR__noiseImproved1_freq.set(4, 4, 4),\n\t\t\tVAR__noiseImproved1_offset.set(0, 0, 0),\n\t\t\t3.0,\n\t\t\t0.5,\n\t\t\t2.0\n\t\t)\n\t);\n\n\t// /geo1/actor1/floatToVec3_2\n\tv_POLY_floatToVec3_2_vec3 = computed(() =>\n\t\tfloatToVec3(\n\t\t\tthis.v_POLY_noiseImproved1_noise.value,\n\t\t\tthis.v_POLY_noiseImproved1_noise.value,\n\t\t\tthis.v_POLY_noiseImproved1_noise.value,\n\t\t\tVAR__floatToVec3_2_\n\t\t)\n\t);\n\n\t// /geo1/actor1/add1\n\tv_POLY_add1_sum = computed(() =>\n\t\taddVector(\n\t\t\tVAR__add1_add0.copy(this.v_POLY_getObjectAttribute1_val.value),\n\t\t\tVAR__add1_add1.copy(this.v_POLY_floatToVec3_2_vec3.value),\n\t\t\tVAR__add1_add2.set(0, 0, 0)\n\t\t)\n\t);\n\n\t// /geo1/actor1/onTick1\n\tv_POLY_onTick1_time = computed(() => globalsTime());\n\tv_POLY_onTick1_delta = computed(() => globalsTimeDelta());\n\n\t// /geo1/actor1/constant2\n\tv_POLY_constant2_val = { value: \"rayHit\" };\n\n\tconstructor(node, object3D) {\n\t\tsuper(node, object3D);\n\t\t// insert after constructor\n\t}\n\t// insert body\n\n\tonTick() {\n\t\tthis.onTick1();\n\t}\n\t// /geo1/actor1/onTick1\n\tonTick1() {\n\t\tthis.setObjectPosition1(0);\n\t}\n\n\t// /geo1/actor1/setObjectPosition1\n\tsetObjectPosition1() {\n\t\tsetObjectPosition(this.object3D, VAR__setObjectPosition1_position.copy(this.v_POLY_add1_sum.value), 1.0, true);\n\t}\n}\nreturn CustomActorEvaluator;\n"},"embeddedPolyNodes":{"gl/laserColor":{"metadata":{"version":{"editor":"1.5.3-1","polygonjs":"1.5.3"},"createdAt":1696608084140},"nodeContext":"gl","inputs":{"typed":{"types":[{"name":"baseColor","type":"vec3"}]}},"params":[],"nodes":{"constant1":{"type":"constant","params":{"type":4,"color":[0.7011018919268015,0.018500220124016656,0.005181516700061659],"asColor":true},"connection_points":{"in":[],"out":[{"name":"val","type":"vec3"}]}},"attribute1":{"type":"attribute","params":{"name":"id"},"connection_points":{"in":[],"out":[{"name":"val","type":"float"}]}},"round1":{"type":"round","params":{"in":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"overriden_options":{}}},"inputs":[{"index":0,"inputName":"in","node":"attribute1","output":"val"}],"connection_points":{"in":[{"name":"in","type":"float"}],"out":[{"name":"val","type":"float"}]}},"random1":{"type":"random","params":{"seed":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"seed","node":"floatToVec2_1","output":"vec2"}]},"floatToVec2_1":{"type":"floatToVec2","params":{"x":{"overriden_options":{}},"y":{"raw_input":0.54,"overriden_options":{}}},"inputs":[{"index":0,"inputName":"x","node":"round1","output":"val"}]},"multAdd5":{"type":"multAdd","params":{"value":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"float","default_value":1,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":4.4},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"random1","output":"rand"}],"connection_points":{"in":[{"name":"value","type":"float"},{"name":"preAdd","type":"float"},{"name":"mult","type":"float"},{"name":"postAdd","type":"float"}],"out":[{"name":"val","type":"float"}]}},"constant2":{"type":"constant","params":{"type":4,"color":[0.6653872982754769,0.5583403896257968,0.005181516700061659],"asColor":true},"connection_points":{"in":[],"out":[{"name":"val","type":"vec3"}]}},"rgbToOklab1":{"type":"rgbToOklab","params":{"rgb":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"rgb","node":"constant2","output":"val"}]},"rgbToOklab2":{"type":"rgbToOklab","params":{"rgb":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"rgb","node":"constant1","output":"val"}]},"oklabToRgb1":{"type":"oklabToRgb","params":{"oklab":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"oklab","node":"mix1","output":"mix"}]},"mix1":{"type":"mix","params":{"value0":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"overriden_options":{}},"value1":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"blend":{"type":"float","default_value":0.5,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value0","node":"rgbToOklab1","output":"oklab"},{"index":1,"inputName":"value1","node":"rgbToOklab2","output":"oklab"},{"index":2,"inputName":"blend","node":"pow1","output":"val"}],"connection_points":{"in":[{"name":"value0","type":"vec3"},{"name":"value1","type":"vec3"},{"name":"blend","type":"float"}],"out":[{"name":"mix","type":"vec3"}]}},"pow1":{"type":"pow","params":{"x":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"y":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.27}},"inputs":[{"index":0,"inputName":"x","node":"random1","output":"rand"}],"connection_points":{"in":[{"name":"x","type":"float"},{"name":"y","type":"float"}],"out":[{"name":"val","type":"float"}]}},"subnetOutput1":{"type":"subnetOutput","inputs":[{"index":0,"inputName":"baseColor","node":"oklabToRgb1","output":"rgb"}],"connection_points":{"in":[{"name":"baseColor","type":"vec3"}],"out":[]}}},"ui":{"constant1":{"pos":[-550,400]},"attribute1":{"pos":[-800,650]},"round1":{"pos":[-650,650]},"random1":{"pos":[-400,650]},"floatToVec2_1":{"pos":[-550,650]},"multAdd5":{"pos":[-250,650]},"constant2":{"pos":[-550,200]},"rgbToOklab1":{"pos":[-350,200]},"rgbToOklab2":{"pos":[-350,400]},"oklabToRgb1":{"pos":[150,350]},"mix1":{"pos":[0,300]},"pow1":{"pos":[-200,450]},"subnetOutput1":{"pos":[300,300]}}}}}
Code editor
{"multiple_panel":{"split_ratio":0.5,"split_panel0":{"split_ratio":0.5543217692883486,"split_panel0":{"panelTypes":["viewer"],"currentPanelIndex":0,"panel_data":{"camera":"/cameras/cameras:sopGroup/perspectiveCamera1","isViewerInitLayoutData":true,"linkIndex":1,"overlayedNetwork":{"allowed":false,"displayed":false,"initLayoutData":{"camera":{"position":{"x":0,"y":0},"zoom":1},"history":{"2":{"position":{"x":0,"y":0},"zoom":1},"36":{"position":{"x":300,"y":-425},"zoom":1},"104":{"position":{"x":0,"y":-50},"zoom":1},"299":{"position":{"x":0,"y":-200},"zoom":1},"910":{"position":{"x":0,"y":0},"zoom":1},"913":{"position":{"x":0,"y":0},"zoom":1},"1026":{"position":{"x":-250,"y":75},"zoom":1},"2100":{"position":{"x":300,"y":-425},"zoom":1},"4945":{"position":{"x":0,"y":-50},"zoom":1},"5075":{"position":{"x":-50,"y":-325},"zoom":1}},"paramsDisplayed":false,"linkIndex":1}}}},"split_panel1":{"panelTypes":["params"],"currentPanelIndex":0,"panel_data":{"active_folder":null,"linkIndex":1}},"split_mode":"vertical"},"split_panel1":{"panelTypes":["network","params","viewer"],"currentPanelIndex":0,"panel_data":{"camera":{"position":{"x":-60.65218075353923,"y":0.978260979895794},"zoom":1.0222221069335933},"history":{"2":{"position":{"x":22.43683175060204,"y":167.39745353456354},"zoom":1.0222221069335933},"36":{"position":{"x":357.3897817112609,"y":-1405.6283403273815},"zoom":0.6032221069335929},"104":{"position":{"x":-45.000005075206516,"y":-329.78264025019706},"zoom":1.0222221069335933},"299":{"position":{"x":-190.6428804219207,"y":-410.5360505529037},"zoom":0.6352221069335929},"910":{"position":{"x":0,"y":0},"zoom":1.0222221069335933},"913":{"position":{"x":130.743275046037,"y":-324.1874453255788},"zoom":0.8202221069335931},"1026":{"position":{"x":-913.1056710327676,"y":136.337274570531},"zoom":0.6032221069335929},"2100":{"position":{"x":187.45471933471558,"y":-932.3478979039483},"zoom":0.4252221069335932},"2746":{"position":{"x":-60.65218075353923,"y":0.978260979895794},"zoom":1.0222221069335933},"4945":{"position":{"x":0,"y":-50},"zoom":1.0222221069335933},"5075":{"position":{"x":-89.13043919583176,"y":-325.9782609798958},"zoom":1.0222221069335933}},"paramsDisplayed":false,"linkIndex":1}},"split_mode":"horizontal"},"currentNodes":["/cameras/cameraPostProcess1","/","/","/","/","/","/","/"],"navigationHistory":{"nodePaths":{"1":["/geo1","/","/cameras","/","/geo1","/geo1/MAT","/geo1/MAT/lineBasicBuilder_LIGHTING","/geo1/MAT","/geo1","/","/cameras","/","/geo1","/geo1/MAT","/geo1/MAT/lineBasicBuilder_LIGHTING","/geo1/MAT","/geo1","/","/cameras","/cameras/cameraPostProcess1"],"2":["/"],"3":["/"],"4":["/"],"5":["/"],"6":["/"],"7":["/"],"8":["/"]},"index":{"1":19,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0}},"fullscreenPanelId":null,"saveOptions":{"createExport":false,"checkRemoteAssetsUse":true,"minimizeFilesCount":false,"compressJs":true,"createZip":false,"runPostExportCommand":false},"paramsModal":[]}
Used nodes
cop/envMap;cop/image;cop/imageEXR;event/cameraOrbitControls;mat/lineBasicBuilder;mat/meshStandard;mat/meshStandardBuilder;mat/pointsBuilder;mat/sky;obj/copNetwork;obj/geo;post/bloom;post/null;post/toneMapping;rop/WebGLRenderer;sop/BVH;sop/BVHVisualizer;sop/actor;sop/add;sop/areaLight;sop/attribCreate;sop/attribDelete;sop/attribId;sop/box;sop/cameraControls;sop/cameraPostProcess;sop/cameraRenderer;sop/circle;sop/copy;sop/delete;sop/fileGLTF;sop/hemisphereLight;sop/hierarchy;sop/jitter;sop/line;sop/material;sop/materialsNetwork;sop/merge;sop/objectProperties;sop/perspectiveCamera;sop/pointLight;sop/polarTransform;sop/sphere;sop/spotLight;sop/transform;sop/tube
Used operations
Used modules
Used assemblers
GL_LINE;GL_MESH_STANDARD;GL_POINTS;JS_ACTOR
Used integrations
[]
Used assets
Nodes map
{"/geo1":"obj/geo","/geo1/MAT":"sop/materialsNetwork","/geo1/MAT/meshStandard_RHINO":"mat/meshStandard","/geo1/MAT/pointsBuilder1":"mat/pointsBuilder","/geo1/MAT/lineBasicBuilder_LIGHTING":"mat/lineBasicBuilder","/geo1/circle1":"sop/circle","/geo1/line1":"sop/line","/geo1/copy1":"sop/copy","/geo1/attribDelete1":"sop/attribDelete","/geo1/merge1":"sop/merge","/geo1/objectProperties2":"sop/objectProperties","/geo1/hierarchy2":"sop/hierarchy","/geo1/actor_for_each_line":"sop/actor","/geo1/actor_for_lines_parent":"sop/actor","/geo1/attribCreate1":"sop/attribCreate","/geo1/attribId1":"sop/attribId","/geo1/add1":"sop/add","/geo1/merge2":"sop/merge","/geo1/hierarchy3":"sop/hierarchy","/geo1/material2":"sop/material","/geo1/attribCreate2":"sop/attribCreate","/geo1/jitter1":"sop/jitter","/geo1/delete1":"sop/delete","/geo1/delete2":"sop/delete","/geo1/attribId2":"sop/attribId","/geo1/material3":"sop/material","/geo1/pointLight1":"sop/pointLight","/geo1/actor1":"sop/actor","/geo1/objectProperties4":"sop/objectProperties","/geo1/fileGLTF1":"sop/fileGLTF","/geo1/transform1":"sop/transform","/geo1/hierarchy1":"sop/hierarchy","/geo1/BVHVisualizer1":"sop/BVHVisualizer","/geo1/objectProperties1":"sop/objectProperties","/geo1/objectProperties3":"sop/objectProperties","/geo1/tube1":"sop/tube","/geo1/circle2":"sop/circle","/geo1/copy2":"sop/copy","/geo1/merge3":"sop/merge","/geo1/BVH1":"sop/BVH","/geo1/material1":"sop/material","/geo1/merge4":"sop/merge","/geo1/attribDelete2":"sop/attribDelete","/COP":"obj/copNetwork","/COP/envMap":"cop/envMap","/COP/imageEnv":"cop/imageEXR","/COP/image1":"cop/image","/cameras":"obj/geo","/cameras/perspectiveCamera1":"sop/perspectiveCamera","/cameras/cameraControls1":"sop/cameraControls","/cameras/cameraControls1/cameraOrbitControls1":"event/cameraOrbitControls","/cameras/cameraPostProcess1":"sop/cameraPostProcess","/cameras/cameraPostProcess1/bloom1":"post/bloom","/cameras/cameraPostProcess1/toneMapping1":"post/toneMapping","/cameras/cameraPostProcess1/OUT":"post/null","/cameras/cameraRenderer1":"sop/cameraRenderer","/cameras/cameraRenderer1/WebGLRenderer1":"rop/WebGLRenderer","/env":"obj/geo","/env/material1":"sop/material","/env/MAT":"sop/materialsNetwork","/env/MAT/meshStandardBuilder1":"mat/meshStandardBuilder","/env/MAT/sky1":"mat/sky","/env/box1":"sop/box","/env/sphere1":"sop/sphere","/env/material2":"sop/material","/env/merge1":"sop/merge","/env/transform1":"sop/transform","/lights":"obj/geo","/lights/hemisphereLight1":"sop/hemisphereLight","/lights/polarTransform1":"sop/polarTransform","/lights/merge1":"sop/merge","/lights/areaLight1":"sop/areaLight","/lights/spotLight1":"sop/spotLight","/lights/merge2":"sop/merge","/lights/polarTransform2":"sop/polarTransform"}
Js version
Editor version
Engine version
Logout
0%
There was a problem displaying your scene:
view scene source