Name
*
Code
{"properties":{"frame":0,"maxFrame":600,"maxFrameLocked":false,"realtimeState":true,"mainCameraPath":"/cameras/cameras:sopGroup/perspectiveCamera1","versions":{"polygonjs":"1.5.70"}},"root":{"type":"root","nodes":{"geo1":{"type":"geo","nodes":{"sphere1":{"type":"sphere","params":{"resolution":[100,100]}},"material1":{"type":"material","params":{"material":"../MAT/meshBasicBuilder1"},"inputs":["sphere1"],"flags":{"display":true}},"MAT":{"type":"materialsNetwork","nodes":{"meshBasicBuilder1":{"type":"meshBasicBuilder","nodes":{"globals1":{"type":"globals"},"output1":{"type":"output","inputs":[null,null,{"index":2,"inputName":"color","node":"add1","output":"sum"}]},"floatToVec3_4":{"type":"floatToVec3","params":{"x":{"raw_input":1,"overriden_options":{}},"y":{"overriden_options":{}},"z":{"overriden_options":{}}},"inputs":[null,{"index":1,"inputName":"y","node":"vec2ToFloat2","output":"y"},{"index":2,"inputName":"z","node":"vec2ToFloat2","output":"x"}]},"multAdd4":{"type":"multAdd","params":{"value":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"vector2","default_value":[1,1],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":[6.283185307179586,3.141592653589793]},"postAdd":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"globals1","output":"uv"}],"connection_points":{"in":[{"name":"value","type":"vec2"},{"name":"preAdd","type":"vec2"},{"name":"mult","type":"vec2"},{"name":"postAdd","type":"vec2"}],"out":[{"name":"val","type":"vec2"}]}},"polarToCartesian3":{"type":"polarToCartesian","params":{"polar":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"polar","node":"floatToVec3_4","output":"vec3"}]},"vec2ToFloat2":{"type":"vec2ToFloat","params":{"vec":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"vec","node":"multAdd4","output":"val"}]},"multAdd2":{"type":"multAdd","params":{"value":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"vector3","default_value":[1,1,1],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":[-1,-1,-1]},"postAdd":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"polarToCartesian3","output":"xyz"}],"connection_points":{"in":[{"name":"value","type":"vec3"},{"name":"preAdd","type":"vec3"},{"name":"mult","type":"vec3"},{"name":"postAdd","type":"vec3"}],"out":[{"name":"val","type":"vec3"}]}},"rotate1":{"type":"rotate","params":{"vector":{"type":"vector3","default_value":[0,0,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"axis":{"type":"vector3","default_value":[0,1,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"angle":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":1.5707963267948966}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"vector","node":"multAdd2","output":"val"}],"connection_points":{"in":[{"name":"vector","type":"vec3"},{"name":"axis","type":"vec3"},{"name":"angle","type":"float"}],"out":[{"name":"val","type":"vec3"}]}},"multAdd3":{"type":"multAdd","params":{"value":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"vector2","default_value":[1,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"postAdd":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"globals1","output":"uv"},null,{"index":2,"inputName":"mult","node":"floatToVec2_1","output":"vec2"}],"connection_points":{"in":[{"name":"value","type":"vec2"},{"name":"preAdd","type":"vec2"},{"name":"mult","type":"vec2"},{"name":"postAdd","type":"vec2"}],"out":[{"name":"val","type":"vec2"}]}},"round1":{"type":"round","params":{"in":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"in","node":"multAdd3","output":"val"}],"connection_points":{"in":[{"name":"in","type":"vec2"}],"out":[{"name":"val","type":"vec2"}]}},"floatToVec3_5":{"type":"floatToVec3","params":{"x":{"raw_input":1,"overriden_options":{}},"y":{"overriden_options":{}},"z":{"overriden_options":{}}},"inputs":[null,{"index":1,"inputName":"y","node":"vec2ToFloat3","output":"y"},{"index":2,"inputName":"z","node":"vec2ToFloat3","output":"x"}]},"multAdd5":{"type":"multAdd","params":{"value":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"vector2","default_value":[1,1],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":[6.283185307179586,3.141592653589793]},"postAdd":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"divide3","output":"divide"}],"connection_points":{"in":[{"name":"value","type":"vec2"},{"name":"preAdd","type":"vec2"},{"name":"mult","type":"vec2"},{"name":"postAdd","type":"vec2"}],"out":[{"name":"val","type":"vec2"}]}},"polarToCartesian4":{"type":"polarToCartesian","params":{"polar":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"polar","node":"floatToVec3_5","output":"vec3"}]},"vec2ToFloat3":{"type":"vec2ToFloat","params":{"vec":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"vec","node":"multAdd5","output":"val"}]},"multAdd6":{"type":"multAdd","params":{"value":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"vector3","default_value":[1,1,1],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":[-1,-1,-1]},"postAdd":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"polarToCartesian4","output":"xyz"}],"connection_points":{"in":[{"name":"value","type":"vec3"},{"name":"preAdd","type":"vec3"},{"name":"mult","type":"vec3"},{"name":"postAdd","type":"vec3"}],"out":[{"name":"val","type":"vec3"}]}},"rotate2":{"type":"rotate","params":{"vector":{"type":"vector3","default_value":[0,0,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"axis":{"type":"vector3","default_value":[0,1,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"angle":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":1.5707963267948966}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"vector","node":"multAdd6","output":"val"}],"connection_points":{"in":[{"name":"vector","type":"vec3"},{"name":"axis","type":"vec3"},{"name":"angle","type":"float"}],"out":[{"name":"val","type":"vec3"}]}},"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":"rotate1","output":"val"},{"index":1,"inputName":"sub1","node":"rotate2","output":"val"}],"connection_points":{"in":[{"name":"sub0","type":"vec3"},{"name":"sub1","type":"vec3"},{"name":"sub2","type":"vec3"}],"out":[{"name":"subtract","type":"vec3"}]}},"length1":{"type":"length","params":{"x":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"x","node":"subtract1","output":"subtract"}],"connection_points":{"in":[{"name":"x","type":"vec3"}],"out":[{"name":"val","type":"float"}]}},"smoothstep1":{"type":"smoothstep","params":{"edge0":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.05},"edge1":{"type":"float","default_value":1,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.11},"x":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"edge0","node":"constant3","output":"val"},{"index":1,"inputName":"edge1","node":"add2","output":"sum"},{"index":2,"inputName":"x","node":"multAdd7","output":"val"}],"connection_points":{"in":[{"name":"edge0","type":"float"},{"name":"edge1","type":"float"},{"name":"x","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":"null1","output":"val"},{"index":1,"inputName":"y","node":"null1","output":"val"},{"index":2,"inputName":"z","node":"null1","output":"val"}]},"null1":{"type":"null","params":{"in":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"in","node":"smoothstep1","output":"val"}],"connection_points":{"in":[{"name":"in","type":"float"}],"out":[{"name":"val","type":"float"}]}},"constant1":{"type":"constant","params":{"float":180},"connection_points":{"in":[],"out":[{"name":"val","type":"float"}]}},"constant2":{"type":"constant","params":{"float":90},"connection_points":{"in":[],"out":[{"name":"val","type":"float"}]}},"floatToVec2_1":{"type":"floatToVec2","params":{"x":{"overriden_options":{}},"y":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"x","node":"constant1","output":"val"},{"index":1,"inputName":"y","node":"constant2","output":"val"}]},"divide3":{"type":"divide","params":{"div0":{"type":"vector2","default_value":[1,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"div1":{"type":"vector2","default_value":[1,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"div2":{"type":"vector2","default_value":[1,1],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"div0","node":"round1","output":"val"},{"index":1,"inputName":"div1","node":"floatToVec2_1","output":"vec2"}],"connection_points":{"in":[{"name":"div0","type":"vec2"},{"name":"div1","type":"vec2"},{"name":"div2","type":"vec2"}],"out":[{"name":"divide","type":"vec2"}]}},"multAdd7":{"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":10},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"length1","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"}]}},"vec2ToVec3_1":{"type":"vec2ToVec3","params":{"vec2":{"overriden_options":{}},"z":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"vec2","node":"divide3","output":"divide"}]},"multAdd8":{"type":"multAdd","params":{"value":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"vector2","default_value":[1,1],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":[6.283185307179586,3.141592653589793]},"postAdd":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"globals1","output":"uv"}],"connection_points":{"in":[{"name":"value","type":"vec2"},{"name":"preAdd","type":"vec2"},{"name":"mult","type":"vec2"},{"name":"postAdd","type":"vec2"}],"out":[{"name":"val","type":"vec2"}]}},"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":"floatToVec3_1","output":"vec3"},{"index":1,"inputName":"add1","node":"rotate2","output":"val"}],"connection_points":{"in":[{"name":"add0","type":"vec3"},{"name":"add1","type":"vec3"},{"name":"add2","type":"vec3"}],"out":[{"name":"sum","type":"vec3"}]}},"constant3":{"type":"constant","params":{"float":0.05},"connection_points":{"in":[],"out":[{"name":"val","type":"float"}]}},"constant4":{"type":"constant","params":{"float":0.01},"connection_points":{"in":[],"out":[{"name":"val","type":"float"}]}},"add2":{"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":"constant3","output":"val"},{"index":1,"inputName":"add1","node":"constant4","output":"val"}],"connection_points":{"in":[{"name":"add0","type":"float"},{"name":"add1","type":"float"},{"name":"add2","type":"float"}],"out":[{"name":"sum","type":"float"}]}}},"persisted_config":{"material":{"metadata":{"version":4.6,"type":"Material","generator":"Material.toJSON"},"uuid":"/geo1/MAT/meshBasicBuilder1-main","type":"MeshBasicMaterial","color":16777215,"reflectivity":1,"refractionRatio":0.98,"blendColor":0,"fog":false},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[],"timeDependent":false,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false},"customMaterials":{"customDepthMaterial":{"material":{"metadata":{"version":4.6,"type":"Material","generator":"Material.toJSON"},"uuid":"/geo1/MAT/meshBasicBuilder1-customDepthMaterial","type":"MeshDepthMaterial","name":"customDepthMaterial","blendColor":0,"depthPacking":3201},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[],"timeDependent":false,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false}},"customDistanceMaterial":{"material":{"metadata":{"version":4.6,"type":"Material","generator":"Material.toJSON"},"uuid":"/geo1/MAT/meshBasicBuilder1-customDistanceMaterial","type":"MeshDistanceMaterial","name":"customDistanceMaterial","blendColor":0},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[],"timeDependent":false,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false}},"customDepthDOFMaterial":{"material":{"metadata":{"version":4.6,"type":"Material","generator":"Material.toJSON"},"uuid":"/geo1/MAT/meshBasicBuilder1-customDepthDOFMaterial","type":"MeshDepthMaterial","name":"customDepthDOFMaterial","blendColor":0,"depthPacking":3200},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[],"timeDependent":false,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false}}}}},"meshBasic1":{"type":"meshBasic","params":{"useMap":true,"map":"../../COP/builder1"}}}},"COP":{"type":"copNetwork","nodes":{"builder1":{"type":"builder","nodes":{"globals1":{"type":"globals"},"output1":{"type":"output","inputs":[{"index":0,"inputName":"color","node":"add1","output":"sum"}]},"floatToVec3_4":{"type":"floatToVec3","params":{"x":{"raw_input":1,"overriden_options":{}},"y":{"overriden_options":{}},"z":{"overriden_options":{}}},"inputs":[null,{"index":1,"inputName":"y","node":"vec2ToFloat2","output":"y"},{"index":2,"inputName":"z","node":"vec2ToFloat2","output":"x"}]},"multAdd4":{"type":"multAdd","params":{"value":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"vector2","default_value":[1,1],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":[6.283185307179586,3.141592653589793]},"postAdd":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"globals1","output":"uv"}],"connection_points":{"in":[{"name":"value","type":"vec2"},{"name":"preAdd","type":"vec2"},{"name":"mult","type":"vec2"},{"name":"postAdd","type":"vec2"}],"out":[{"name":"val","type":"vec2"}]}},"polarToCartesian3":{"type":"polarToCartesian","params":{"polar":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"polar","node":"floatToVec3_4","output":"vec3"}]},"vec2ToFloat2":{"type":"vec2ToFloat","params":{"vec":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"vec","node":"multAdd4","output":"val"}]},"multAdd2":{"type":"multAdd","params":{"value":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"vector3","default_value":[1,1,1],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":[-1,-1,-1]},"postAdd":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"polarToCartesian3","output":"xyz"}],"connection_points":{"in":[{"name":"value","type":"vec3"},{"name":"preAdd","type":"vec3"},{"name":"mult","type":"vec3"},{"name":"postAdd","type":"vec3"}],"out":[{"name":"val","type":"vec3"}]}},"rotate1":{"type":"rotate","params":{"vector":{"type":"vector3","default_value":[0,0,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"axis":{"type":"vector3","default_value":[0,1,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"angle":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":1.5707963267948966}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"vector","node":"multAdd2","output":"val"}],"connection_points":{"in":[{"name":"vector","type":"vec3"},{"name":"axis","type":"vec3"},{"name":"angle","type":"float"}],"out":[{"name":"val","type":"vec3"}]}},"multAdd3":{"type":"multAdd","params":{"value":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"vector2","default_value":[1,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"postAdd":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"globals1","output":"uv"},null,{"index":2,"inputName":"mult","node":"floatToVec2_1","output":"vec2"}],"connection_points":{"in":[{"name":"value","type":"vec2"},{"name":"preAdd","type":"vec2"},{"name":"mult","type":"vec2"},{"name":"postAdd","type":"vec2"}],"out":[{"name":"val","type":"vec2"}]}},"round1":{"type":"round","params":{"in":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"in","node":"multAdd3","output":"val"}],"connection_points":{"in":[{"name":"in","type":"vec2"}],"out":[{"name":"val","type":"vec2"}]}},"floatToVec3_5":{"type":"floatToVec3","params":{"x":{"raw_input":1,"overriden_options":{}},"y":{"overriden_options":{}},"z":{"overriden_options":{}}},"inputs":[null,{"index":1,"inputName":"y","node":"vec2ToFloat3","output":"y"},{"index":2,"inputName":"z","node":"vec2ToFloat3","output":"x"}]},"multAdd5":{"type":"multAdd","params":{"value":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"vector2","default_value":[1,1],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":[6.283185307179586,3.141592653589793]},"postAdd":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"divide3","output":"divide"}],"connection_points":{"in":[{"name":"value","type":"vec2"},{"name":"preAdd","type":"vec2"},{"name":"mult","type":"vec2"},{"name":"postAdd","type":"vec2"}],"out":[{"name":"val","type":"vec2"}]}},"polarToCartesian4":{"type":"polarToCartesian","params":{"polar":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"polar","node":"floatToVec3_5","output":"vec3"}]},"vec2ToFloat3":{"type":"vec2ToFloat","params":{"vec":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"vec","node":"multAdd5","output":"val"}]},"multAdd6":{"type":"multAdd","params":{"value":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"vector3","default_value":[1,1,1],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":[-1,-1,-1]},"postAdd":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"polarToCartesian4","output":"xyz"}],"connection_points":{"in":[{"name":"value","type":"vec3"},{"name":"preAdd","type":"vec3"},{"name":"mult","type":"vec3"},{"name":"postAdd","type":"vec3"}],"out":[{"name":"val","type":"vec3"}]}},"rotate2":{"type":"rotate","params":{"vector":{"type":"vector3","default_value":[0,0,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"axis":{"type":"vector3","default_value":[0,1,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"angle":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":1.5707963267948966}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"vector","node":"multAdd6","output":"val"}],"connection_points":{"in":[{"name":"vector","type":"vec3"},{"name":"axis","type":"vec3"},{"name":"angle","type":"float"}],"out":[{"name":"val","type":"vec3"}]}},"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":"rotate1","output":"val"},{"index":1,"inputName":"sub1","node":"rotate2","output":"val"}],"connection_points":{"in":[{"name":"sub0","type":"vec3"},{"name":"sub1","type":"vec3"},{"name":"sub2","type":"vec3"}],"out":[{"name":"subtract","type":"vec3"}]}},"length1":{"type":"length","params":{"x":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"x","node":"subtract1","output":"subtract"}],"connection_points":{"in":[{"name":"x","type":"vec3"}],"out":[{"name":"val","type":"float"}]}},"smoothstep1":{"type":"smoothstep","params":{"edge0":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.1},"edge1":{"type":"float","default_value":1,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.11},"x":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"edge0","node":"constant3","output":"val"},{"index":1,"inputName":"edge1","node":"add2","output":"sum"},{"index":2,"inputName":"x","node":"multAdd7","output":"val"}],"connection_points":{"in":[{"name":"edge0","type":"float"},{"name":"edge1","type":"float"},{"name":"x","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":"null1","output":"val"},{"index":1,"inputName":"y","node":"null1","output":"val"},{"index":2,"inputName":"z","node":"null1","output":"val"}]},"null1":{"type":"null","params":{"in":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"in","node":"smoothstep1","output":"val"}],"connection_points":{"in":[{"name":"in","type":"float"}],"out":[{"name":"val","type":"float"}]}},"constant1":{"type":"constant","params":{"float":180},"connection_points":{"in":[],"out":[{"name":"val","type":"float"}]}},"constant2":{"type":"constant","params":{"float":90},"connection_points":{"in":[],"out":[{"name":"val","type":"float"}]}},"floatToVec2_1":{"type":"floatToVec2","params":{"x":{"overriden_options":{}},"y":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"x","node":"constant1","output":"val"},{"index":1,"inputName":"y","node":"constant2","output":"val"}]},"divide3":{"type":"divide","params":{"div0":{"type":"vector2","default_value":[1,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"div1":{"type":"vector2","default_value":[1,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"div2":{"type":"vector2","default_value":[1,1],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"div0","node":"round1","output":"val"},{"index":1,"inputName":"div1","node":"floatToVec2_1","output":"vec2"}],"connection_points":{"in":[{"name":"div0","type":"vec2"},{"name":"div1","type":"vec2"},{"name":"div2","type":"vec2"}],"out":[{"name":"divide","type":"vec2"}]}},"multAdd7":{"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":10},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"length1","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"}]}},"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":"floatToVec3_1","output":"vec3"},{"index":1,"inputName":"add1","node":"rotate2","output":"val"}],"connection_points":{"in":[{"name":"add0","type":"vec3"},{"name":"add1","type":"vec3"},{"name":"add2","type":"vec3"}],"out":[{"name":"sum","type":"vec3"}]}},"constant3":{"type":"constant","params":{"float":0.05},"connection_points":{"in":[],"out":[{"name":"val","type":"float"}]}},"constant4":{"type":"constant","params":{"float":0.01},"connection_points":{"in":[],"out":[{"name":"val","type":"float"}]}},"add2":{"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":"constant3","output":"val"},{"index":1,"inputName":"add1","node":"constant4","output":"val"}],"connection_points":{"in":[{"name":"add0","type":"float"},{"name":"add1","type":"float"},{"name":"add2","type":"float"}],"out":[{"name":"sum","type":"float"}]}}},"params":{"resolution":[4096,4096]},"persisted_config":{"uniforms":{"resolution":{"value":{"x":4096,"y":4096}}},"param_uniform_pairs":[],"uniforms_time_dependent":false,"uniforms_resolution_dependent":false}}}},"material2":{"type":"material","params":{"material":"../MAT/meshBasic1"},"inputs":["sphere1"]}},"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}},"ground":{"type":"geo","nodes":{"planeHelper1":{"type":"planeHelper","flags":{"display":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}},"cameras":{"type":"geo","nodes":{"perspectiveCamera1":{"type":"perspectiveCamera","params":{"position":[3.3,3.3,3.3]}},"cameraControls1":{"type":"cameraControls","nodes":{"cameraOrbitControls1":{"type":"cameraOrbitControls","params":{"target":[0.019526651293194308,0.0887939817284823,0.3874356273319757]}}},"params":{"node":"cameraOrbitControls1"},"inputs":["perspectiveCamera1"]},"cameraRenderer1":{"type":"cameraRenderer","nodes":{"WebGLRenderer1":{"type":"WebGLRenderer","params":{"toneMapping":1,"outputColorSpace":"srgb-linear"}}},"params":{"node":"WebGLRenderer1"},"inputs":["cameraControls1"],"flags":{"display":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}}},"params":{"mainCameraPath":"/cameras/cameras:sopGroup/perspectiveCamera1"}},"ui":{"nodes":{"geo1":{"pos":[-50,-250],"nodes":{"sphere1":{"pos":[0,50]},"material1":{"pos":[0,250]},"MAT":{"pos":[-200,250],"nodes":{"meshBasicBuilder1":{"pos":[-50,50],"selection":["constant3","constant4","add2"],"nodes":{"globals1":{"pos":[-1300,-50]},"output1":{"pos":[1550,-100]},"floatToVec3_4":{"pos":[-300,-100]},"multAdd4":{"pos":[-550,-100]},"polarToCartesian3":{"pos":[-150,-100]},"vec2ToFloat2":{"pos":[-450,-100]},"multAdd2":{"pos":[0,-100]},"rotate1":{"pos":[150,-100]},"multAdd3":{"pos":[-800,200]},"round1":{"pos":[-650,200]},"floatToVec3_5":{"pos":[0,350]},"multAdd5":{"pos":[-250,350]},"polarToCartesian4":{"pos":[150,350]},"vec2ToFloat3":{"pos":[-150,350]},"multAdd6":{"pos":[300,350]},"rotate2":{"pos":[450,350]},"subtract1":{"pos":[550,100]},"length1":{"pos":[700,100]},"smoothstep1":{"pos":[1000,100]},"floatToVec3_1":{"pos":[1400,100]},"null1":{"pos":[1200,0]},"constant1":{"pos":[-1050,400]},"constant2":{"pos":[-1050,500]},"floatToVec2_1":{"pos":[-900,450]},"divide3":{"pos":[-400,350]},"multAdd7":{"pos":[850,150]},"vec2ToVec3_1":{"pos":[50,150]},"multAdd8":{"pos":[-350,100]},"add1":{"pos":[1500,250]},"constant3":{"pos":[650,-200]},"constant4":{"pos":[650,-100]},"add2":{"pos":[800,0]}}},"meshBasic1":{"pos":[-50,150]}}},"COP":{"pos":[-200,400],"selection":["builder1"],"nodes":{"builder1":{"pos":[-200,50],"nodes":{"globals1":{"pos":[-1350,200]},"output1":{"pos":[1350,550]},"floatToVec3_4":{"pos":[-600,200]},"multAdd4":{"pos":[-850,200]},"polarToCartesian3":{"pos":[-450,200]},"vec2ToFloat2":{"pos":[-750,200]},"multAdd2":{"pos":[-300,200]},"rotate1":{"pos":[-150,200]},"multAdd3":{"pos":[-1100,500]},"round1":{"pos":[-950,500]},"floatToVec3_5":{"pos":[-300,650]},"multAdd5":{"pos":[-550,650]},"polarToCartesian4":{"pos":[-150,650]},"vec2ToFloat3":{"pos":[-450,650]},"multAdd6":{"pos":[0,650]},"rotate2":{"pos":[150,650]},"subtract1":{"pos":[250,400]},"length1":{"pos":[400,400]},"smoothstep1":{"pos":[700,400]},"floatToVec3_1":{"pos":[1100,400]},"null1":{"pos":[900,300]},"constant1":{"pos":[-1400,700]},"constant2":{"pos":[-1400,800]},"floatToVec2_1":{"pos":[-1250,750]},"divide3":{"pos":[-700,650]},"multAdd7":{"pos":[550,450]},"add1":{"pos":[1200,550]},"constant3":{"pos":[400,50]},"constant4":{"pos":[400,150]},"add2":{"pos":[550,250]}}}}},"material2":{"pos":[200,250]}}},"ground":{"pos":[-50,-350],"nodes":{"planeHelper1":{"pos":[-150,250]}}},"cameras":{"pos":[-50,-50],"nodes":{"perspectiveCamera1":{"pos":[0,-50]},"cameraControls1":{"pos":[0,150],"nodes":{"cameraOrbitControls1":{"pos":[0,0]}}},"cameraRenderer1":{"pos":[0,300],"nodes":{"WebGLRenderer1":{"pos":[0,0]}}}}}}},"shaders":{"/geo1/MAT/meshBasicBuilder1":{"vertex":"#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n\n\n\n// /geo1/MAT/meshBasicBuilder1/globals1\nvarying vec2 v_POLY_globals1_uv;\n\n\n\n\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// /geo1/MAT/meshBasicBuilder1/globals1\n\tv_POLY_globals1_uv = vec2(uv);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/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\t#include <batching_vertex>\n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n// removed:\n//\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinbase_vertex>\n\t\t#include <skinnormal_vertex>\n\t\t#include <defaultnormal_vertex>\n\t#endif\n// removed:\n//\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}","fragment":"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n\n\n\n// /geo1/MAT/meshBasicBuilder1/polarToCartesian3\nvec3 cartesianToPolar(vec3 w){\n\tfloat wr = sqrt(dot(w,w));\n\tfloat wo = acos(w.y/wr);\n\tfloat wi = atan(w.x,w.z);\n\treturn vec3(wr,wo,wi);\n}\nvec3 polarToCartesian(vec3 p){\n\tfloat x = p.x * sin(p.y)*sin(p.z);\n\tfloat y = p.x * cos(p.y);\n\tfloat z = p.x * sin(p.y)*cos(p.z);\n\treturn vec3(x,y,z);\n}\n\n// /geo1/MAT/meshBasicBuilder1/rotate1\n\n\n// https://stackoverflow.com/questions/23793698/how-to-implement-slerp-in-glsl-hlsl\n// vec4 quatSlerp(vec4 p0, vec4 p1, float t)\n// {\n// \tfloat dotp = dot(normalize(p0), normalize(p1));\n// \tif ((dotp > 0.9999) || (dotp < -0.9999))\n// \t{\n// \t\tif (t<=0.5)\n// \t\t\treturn p0;\n// \t\treturn p1;\n// \t}\n// \tfloat theta = acos(dotp);\n// \tvec4 P = ((p0*sin((1.0-t)*theta) + p1*sin(t*theta)) / sin(theta));\n// \tP.w = 1.0;\n// \treturn P;\n// }\n\n// https://devcry.heiho.net/html/2017/20170521-slerp.html\n// float lerp(float a, float b, float t) {\n// \treturn (1.0 - t) * a + t * b;\n// }\n// vec4 quatSlerp(vec4 p0, vec4 p1, float t){\n// \tvec4 qb = p1;\n\n// \t// cos(a) = dot product\n// \tfloat cos_a = p0.x * qb.x + p0.y * qb.y + p0.z * qb.z + p0.w * qb.w;\n// \tif (cos_a < 0.0f) {\n// \t\tcos_a = -cos_a;\n// \t\tqb = -qb;\n// \t}\n\n// \t// close to zero, cos(a) ~= 1\n// \t// do linear interpolation\n// \tif (cos_a > 0.999) {\n// \t\treturn vec4(\n// \t\t\tlerp(p0.x, qb.x, t),\n// \t\t\tlerp(p0.y, qb.y, t),\n// \t\t\tlerp(p0.z, qb.z, t),\n// \t\t\tlerp(p0.w, qb.w, t)\n// \t\t);\n// \t}\n\n// \tfloat alpha = acos(cos_a);\n// \treturn (p0 * sin(1.0 - t) + p1 * sin(t * alpha)) / sin(alpha);\n// }\n\n// https://stackoverflow.com/questions/62943083/interpolate-between-two-quaternions-the-long-way\nvec4 quatSlerp(vec4 q1, vec4 q2, float t){\n\tfloat angle = acos(dot(q1, q2));\n\tfloat denom = sin(angle);\n\t//check if denom is zero\n\treturn (q1*sin((1.0-t)*angle)+q2*sin(t*angle))/denom;\n}\n// TO CHECK:\n// this page https://www.reddit.com/r/opengl/comments/704la7/glsl_quaternion_library/\n// has a link to a potentially nice pdf:\n// http://web.mit.edu/2.998/www/QuaternionReport1.pdf\n\n// https://github.com/mattatz/ShibuyaCrowd/blob/master/source/shaders/common/quaternion.glsl\nvec4 quatMult(vec4 q1, vec4 q2)\n{\n\treturn vec4(\n\tq1.w * q2.x + q1.x * q2.w + q1.z * q2.y - q1.y * q2.z,\n\tq1.w * q2.y + q1.y * q2.w + q1.x * q2.z - q1.z * q2.x,\n\tq1.w * q2.z + q1.z * q2.w + q1.y * q2.x - q1.x * q2.y,\n\tq1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z\n\t);\n}\n// http://glmatrix.net/docs/quat.js.html#line97\n// let ax = a[0], ay = a[1], az = a[2], aw = a[3];\n\n// let bx = b[0], by = b[1], bz = b[2], bw = b[3];\n\n// out[0] = ax * bw + aw * bx + ay * bz - az * by;\n\n// out[1] = ay * bw + aw * by + az * bx - ax * bz;\n\n// out[2] = az * bw + aw * bz + ax * by - ay * bx;\n\n// out[3] = aw * bw - ax * bx - ay * by - az * bz;\n\n// return out\n\n\n\n// http://www.neilmendoza.com/glsl-rotation-about-an-arbitrary-axis/\nmat4 rotationMatrix(vec3 axis, float angle)\n{\n\taxis = normalize(axis);\n\tfloat s = sin(angle);\n\tfloat c = cos(angle);\n\tfloat oc = 1.0 - c;\n\n \treturn mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0.0, oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0.0, oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0.0, 0.0, 0.0, 0.0, 1.0);\n}\n\n// https://www.geeks3d.com/20141201/how-to-rotate-a-vertex-by-a-quaternion-in-glsl/\nvec4 quatFromAxisAngle(vec3 axis, float angle)\n{\n\tvec4 qr;\n\tfloat half_angle = (angle * 0.5); // * 3.14159 / 180.0;\n\tfloat sin_half_angle = sin(half_angle);\n\tqr.x = axis.x * sin_half_angle;\n\tqr.y = axis.y * sin_half_angle;\n\tqr.z = axis.z * sin_half_angle;\n\tqr.w = cos(half_angle);\n\treturn qr;\n}\nvec3 rotateWithAxisAngle(vec3 position, vec3 axis, float angle)\n{\n\tvec4 q = quatFromAxisAngle(axis, angle);\n\tvec3 v = position.xyz;\n\treturn v + 2.0 * cross(q.xyz, cross(q.xyz, v) + q.w * v);\n}\n// vec3 applyQuaternionToVector( vec4 q, vec3 v ){\n// \treturn v + 2.0 * cross( q.xyz, cross( q.xyz, v ) + q.w * v );\n// }\nvec3 rotateWithQuat( vec3 v, vec4 q )\n{\n\t// vec4 qv = multQuat( quat, vec4(vec, 0.0) );\n\t// return multQuat( qv, vec4(-quat.x, -quat.y, -quat.z, quat.w) ).xyz;\n\treturn v + 2.0 * cross( q.xyz, cross( q.xyz, v ) + q.w * v );\n}\n// https://github.com/glslify/glsl-look-at/blob/gh-pages/index.glsl\n// mat3 rotation_matrix(vec3 origin, vec3 target, float roll) {\n// \tvec3 rr = vec3(sin(roll), cos(roll), 0.0);\n// \tvec3 ww = normalize(target - origin);\n// \tvec3 uu = normalize(cross(ww, rr));\n// \tvec3 vv = normalize(cross(uu, ww));\n\n// \treturn mat3(uu, vv, ww);\n// }\n// mat3 rotation_matrix(vec3 target, float roll) {\n// \tvec3 rr = vec3(sin(roll), cos(roll), 0.0);\n// \tvec3 ww = normalize(target);\n// \tvec3 uu = normalize(cross(ww, rr));\n// \tvec3 vv = normalize(cross(uu, ww));\n\n// \treturn mat3(uu, vv, ww);\n// }\n\nfloat vectorAngle(vec3 start, vec3 dest){\n\tstart = normalize(start);\n\tdest = normalize(dest);\n\n\tfloat cosTheta = dot(start, dest);\n\tvec3 c1 = cross(start, dest);\n\t// We use the dot product of the cross with the Y axis.\n\t// This is a little arbitrary, but can still give a good sense of direction\n\tvec3 y_axis = vec3(0.0, 1.0, 0.0);\n\tfloat d1 = dot(c1, y_axis);\n\tfloat angle = acos(cosTheta) * sign(d1);\n\treturn angle;\n}\n\n// http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/#i-need-an-equivalent-of-glulookat-how-do-i-orient-an-object-towards-a-point-\nvec4 vectorAlign(vec3 start, vec3 dest){\n\tstart = normalize(start);\n\tdest = normalize(dest);\n\n\tfloat cosTheta = dot(start, dest);\n\tvec3 axis;\n\n\t// if (cosTheta < -1 + 0.001f){\n\t// \t// special case when vectors in opposite directions:\n\t// \t// there is no ideal rotation axis\n\t// \t// So guess one; any will do as long as it's perpendicular to start\n\t// \taxis = cross(vec3(0.0f, 0.0f, 1.0f), start);\n\t// \tif (length2(axis) < 0.01 ) // bad luck, they were parallel, try again!\n\t// \t\taxis = cross(vec3(1.0f, 0.0f, 0.0f), start);\n\n\t// \taxis = normalize(axis);\n\t// \treturn gtx::quaternion::angleAxis(glm::radians(180.0f), axis);\n\t// }\n\tif(cosTheta > (1.0 - 0.0001) || cosTheta < (-1.0 + 0.0001) ){\n\t\taxis = normalize(cross(start, vec3(0.0, 1.0, 0.0)));\n\t\tif (length(axis) < 0.001 ){ // bad luck, they were parallel, try again!\n\t\t\taxis = normalize(cross(start, vec3(1.0, 0.0, 0.0)));\n\t\t}\n\t} else {\n\t\taxis = normalize(cross(start, dest));\n\t}\n\n\tfloat angle = acos(cosTheta);\n\n\treturn quatFromAxisAngle(axis, angle);\n}\nvec4 vectorAlignWithUp(vec3 start, vec3 dest, vec3 up){\n\tvec4 rot1 = vectorAlign(start, dest);\n\tup = normalize(up);\n\n\t// Recompute desiredUp so that it's perpendicular to the direction\n\t// You can skip that part if you really want to force desiredUp\n\t// vec3 right = normalize(cross(dest, up));\n\t// up = normalize(cross(right, dest));\n\n\t// Because of the 1rst rotation, the up is probably completely screwed up.\n\t// Find the rotation between the up of the rotated object, and the desired up\n\tvec3 newUp = rotateWithQuat(vec3(0.0, 1.0, 0.0), rot1);//rot1 * vec3(0.0, 1.0, 0.0);\n\tvec4 rot2 = vectorAlign(up, newUp);\n\n\t// return rot1;\n\treturn rot2;\n\t// return multQuat(rot1, rot2);\n\t// return rot2 * rot1;\n\n}\n\n// https://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\nfloat quatToAngle(vec4 q){\n\treturn 2.0 * acos(q.w);\n}\nvec3 quatToAxis(vec4 q){\n\treturn vec3(\n\t\tq.x / sqrt(1.0-q.w*q.w),\n\t\tq.y / sqrt(1.0-q.w*q.w),\n\t\tq.z / sqrt(1.0-q.w*q.w)\n\t);\n}\n\nvec4 align(vec3 dir, vec3 up){\n\tvec3 start_dir = vec3(0.0, 0.0, 1.0);\n\tvec3 start_up = vec3(0.0, 1.0, 0.0);\n\tvec4 rot1 = vectorAlign(start_dir, dir);\n\tup = normalize(up);\n\n\t// Recompute desiredUp so that it's perpendicular to the direction\n\t// You can skip that part if you really want to force desiredUp\n\tvec3 right = normalize(cross(dir, up));\n\tif(length(right)<0.001){\n\t\tright = vec3(1.0, 0.0, 0.0);\n\t}\n\tup = normalize(cross(right, dir));\n\n\t// Because of the 1rst rotation, the up is probably completely screwed up.\n\t// Find the rotation between the up of the rotated object, and the desired up\n\tvec3 newUp = rotateWithQuat(start_up, rot1);//rot1 * vec3(0.0, 1.0, 0.0);\n\tvec4 rot2 = vectorAlign(normalize(newUp), up);\n\n\t// return rot1;\n\treturn quatMult(rot1, rot2);\n\t// return rot2 * rot1;\n\n}\n\n\n\n\n\n\n\n// /geo1/MAT/meshBasicBuilder1/globals1\nvarying vec2 v_POLY_globals1_uv;\n\n\n\n\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 <alphahash_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\n\n\t// /geo1/MAT/meshBasicBuilder1/constant3\n\tfloat v_POLY_constant3_val = 0.05;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/constant4\n\tfloat v_POLY_constant4_val = 0.01;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/constant1\n\tfloat v_POLY_constant1_val = 180.0;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/constant2\n\tfloat v_POLY_constant2_val = 90.0;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/add2\n\tfloat v_POLY_add2_sum = (v_POLY_constant3_val + v_POLY_constant4_val + 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd4\n\tvec2 v_POLY_multAdd4_val = (vec2(6.283185307179586, 3.141592653589793)*(v_POLY_globals1_uv + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec2_1\n\tvec2 v_POLY_floatToVec2_1_vec2 = vec2(v_POLY_constant1_val, v_POLY_constant2_val);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/vec2ToFloat2\n\tfloat v_POLY_vec2ToFloat2_y = v_POLY_multAdd4_val.y;\n\tfloat v_POLY_vec2ToFloat2_x = v_POLY_multAdd4_val.x;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd3\n\tvec2 v_POLY_multAdd3_val = (v_POLY_floatToVec2_1_vec2*(v_POLY_globals1_uv + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec3_4\n\tvec3 v_POLY_floatToVec3_4_vec3 = vec3(1.0, v_POLY_vec2ToFloat2_y, v_POLY_vec2ToFloat2_x);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/round1\n\tvec2 v_POLY_round1_val = vec2(sign(v_POLY_multAdd3_val.x)*floor(abs(v_POLY_multAdd3_val.x)+0.5),sign(v_POLY_multAdd3_val.y)*floor(abs(v_POLY_multAdd3_val.y)+0.5));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/polarToCartesian3\n\tvec3 v_POLY_polarToCartesian3_xyz = polarToCartesian(v_POLY_floatToVec3_4_vec3);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/divide3\n\tvec2 v_POLY_divide3_divide = (v_POLY_round1_val / v_POLY_floatToVec2_1_vec2 / vec2(1.0, 1.0));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd2\n\tvec3 v_POLY_multAdd2_val = (vec3(-1.0, -1.0, -1.0)*(v_POLY_polarToCartesian3_xyz + vec3(0.0, 0.0, 0.0))) + vec3(0.0, 0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd5\n\tvec2 v_POLY_multAdd5_val = (vec2(6.283185307179586, 3.141592653589793)*(v_POLY_divide3_divide + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/rotate1\n\tvec3 v_POLY_rotate1_val = rotateWithAxisAngle(v_POLY_multAdd2_val, vec3(0.0, 1.0, 0.0), 1.5707963267948966);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/vec2ToFloat3\n\tfloat v_POLY_vec2ToFloat3_y = v_POLY_multAdd5_val.y;\n\tfloat v_POLY_vec2ToFloat3_x = v_POLY_multAdd5_val.x;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec3_5\n\tvec3 v_POLY_floatToVec3_5_vec3 = vec3(1.0, v_POLY_vec2ToFloat3_y, v_POLY_vec2ToFloat3_x);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/polarToCartesian4\n\tvec3 v_POLY_polarToCartesian4_xyz = polarToCartesian(v_POLY_floatToVec3_5_vec3);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd6\n\tvec3 v_POLY_multAdd6_val = (vec3(-1.0, -1.0, -1.0)*(v_POLY_polarToCartesian4_xyz + vec3(0.0, 0.0, 0.0))) + vec3(0.0, 0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/rotate2\n\tvec3 v_POLY_rotate2_val = rotateWithAxisAngle(v_POLY_multAdd6_val, vec3(0.0, 1.0, 0.0), 1.5707963267948966);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/subtract1\n\tvec3 v_POLY_subtract1_subtract = (v_POLY_rotate1_val - v_POLY_rotate2_val - vec3(0.0, 0.0, 0.0));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/length1\n\tfloat v_POLY_length1_val = length(v_POLY_subtract1_subtract);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd7\n\tfloat v_POLY_multAdd7_val = (10.0*(v_POLY_length1_val + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/smoothstep1\n\tfloat v_POLY_smoothstep1_val = smoothstep(v_POLY_constant3_val, v_POLY_add2_sum, v_POLY_multAdd7_val);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/null1\n\tfloat v_POLY_null1_val = v_POLY_smoothstep1_val;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec3_1\n\tvec3 v_POLY_floatToVec3_1_vec3 = vec3(v_POLY_null1_val, v_POLY_null1_val, v_POLY_null1_val);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/add1\n\tvec3 v_POLY_add1_sum = (v_POLY_floatToVec3_1_vec3 + v_POLY_rotate2_val + vec3(0.0, 0.0, 0.0));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/output1\n\tdiffuseColor.xyz = v_POLY_add1_sum;\n\n\n\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\t#include <alphahash_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <envmap_fragment>\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}","customDepthMaterial.vertex":"#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n\n\n\n// /geo1/MAT/meshBasicBuilder1/globals1\nvarying vec2 v_POLY_globals1_uv;\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 <batching_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// /geo1/MAT/meshBasicBuilder1/globals1\n\tv_POLY_globals1_uv = vec2(uv);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/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// /geo1/MAT/meshBasicBuilder1/polarToCartesian3\nvec3 cartesianToPolar(vec3 w){\n\tfloat wr = sqrt(dot(w,w));\n\tfloat wo = acos(w.y/wr);\n\tfloat wi = atan(w.x,w.z);\n\treturn vec3(wr,wo,wi);\n}\nvec3 polarToCartesian(vec3 p){\n\tfloat x = p.x * sin(p.y)*sin(p.z);\n\tfloat y = p.x * cos(p.y);\n\tfloat z = p.x * sin(p.y)*cos(p.z);\n\treturn vec3(x,y,z);\n}\n\n// /geo1/MAT/meshBasicBuilder1/rotate1\n\n\n// https://stackoverflow.com/questions/23793698/how-to-implement-slerp-in-glsl-hlsl\n// vec4 quatSlerp(vec4 p0, vec4 p1, float t)\n// {\n// \tfloat dotp = dot(normalize(p0), normalize(p1));\n// \tif ((dotp > 0.9999) || (dotp < -0.9999))\n// \t{\n// \t\tif (t<=0.5)\n// \t\t\treturn p0;\n// \t\treturn p1;\n// \t}\n// \tfloat theta = acos(dotp);\n// \tvec4 P = ((p0*sin((1.0-t)*theta) + p1*sin(t*theta)) / sin(theta));\n// \tP.w = 1.0;\n// \treturn P;\n// }\n\n// https://devcry.heiho.net/html/2017/20170521-slerp.html\n// float lerp(float a, float b, float t) {\n// \treturn (1.0 - t) * a + t * b;\n// }\n// vec4 quatSlerp(vec4 p0, vec4 p1, float t){\n// \tvec4 qb = p1;\n\n// \t// cos(a) = dot product\n// \tfloat cos_a = p0.x * qb.x + p0.y * qb.y + p0.z * qb.z + p0.w * qb.w;\n// \tif (cos_a < 0.0f) {\n// \t\tcos_a = -cos_a;\n// \t\tqb = -qb;\n// \t}\n\n// \t// close to zero, cos(a) ~= 1\n// \t// do linear interpolation\n// \tif (cos_a > 0.999) {\n// \t\treturn vec4(\n// \t\t\tlerp(p0.x, qb.x, t),\n// \t\t\tlerp(p0.y, qb.y, t),\n// \t\t\tlerp(p0.z, qb.z, t),\n// \t\t\tlerp(p0.w, qb.w, t)\n// \t\t);\n// \t}\n\n// \tfloat alpha = acos(cos_a);\n// \treturn (p0 * sin(1.0 - t) + p1 * sin(t * alpha)) / sin(alpha);\n// }\n\n// https://stackoverflow.com/questions/62943083/interpolate-between-two-quaternions-the-long-way\nvec4 quatSlerp(vec4 q1, vec4 q2, float t){\n\tfloat angle = acos(dot(q1, q2));\n\tfloat denom = sin(angle);\n\t//check if denom is zero\n\treturn (q1*sin((1.0-t)*angle)+q2*sin(t*angle))/denom;\n}\n// TO CHECK:\n// this page https://www.reddit.com/r/opengl/comments/704la7/glsl_quaternion_library/\n// has a link to a potentially nice pdf:\n// http://web.mit.edu/2.998/www/QuaternionReport1.pdf\n\n// https://github.com/mattatz/ShibuyaCrowd/blob/master/source/shaders/common/quaternion.glsl\nvec4 quatMult(vec4 q1, vec4 q2)\n{\n\treturn vec4(\n\tq1.w * q2.x + q1.x * q2.w + q1.z * q2.y - q1.y * q2.z,\n\tq1.w * q2.y + q1.y * q2.w + q1.x * q2.z - q1.z * q2.x,\n\tq1.w * q2.z + q1.z * q2.w + q1.y * q2.x - q1.x * q2.y,\n\tq1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z\n\t);\n}\n// http://glmatrix.net/docs/quat.js.html#line97\n// let ax = a[0], ay = a[1], az = a[2], aw = a[3];\n\n// let bx = b[0], by = b[1], bz = b[2], bw = b[3];\n\n// out[0] = ax * bw + aw * bx + ay * bz - az * by;\n\n// out[1] = ay * bw + aw * by + az * bx - ax * bz;\n\n// out[2] = az * bw + aw * bz + ax * by - ay * bx;\n\n// out[3] = aw * bw - ax * bx - ay * by - az * bz;\n\n// return out\n\n\n\n// http://www.neilmendoza.com/glsl-rotation-about-an-arbitrary-axis/\nmat4 rotationMatrix(vec3 axis, float angle)\n{\n\taxis = normalize(axis);\n\tfloat s = sin(angle);\n\tfloat c = cos(angle);\n\tfloat oc = 1.0 - c;\n\n \treturn mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0.0, oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0.0, oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0.0, 0.0, 0.0, 0.0, 1.0);\n}\n\n// https://www.geeks3d.com/20141201/how-to-rotate-a-vertex-by-a-quaternion-in-glsl/\nvec4 quatFromAxisAngle(vec3 axis, float angle)\n{\n\tvec4 qr;\n\tfloat half_angle = (angle * 0.5); // * 3.14159 / 180.0;\n\tfloat sin_half_angle = sin(half_angle);\n\tqr.x = axis.x * sin_half_angle;\n\tqr.y = axis.y * sin_half_angle;\n\tqr.z = axis.z * sin_half_angle;\n\tqr.w = cos(half_angle);\n\treturn qr;\n}\nvec3 rotateWithAxisAngle(vec3 position, vec3 axis, float angle)\n{\n\tvec4 q = quatFromAxisAngle(axis, angle);\n\tvec3 v = position.xyz;\n\treturn v + 2.0 * cross(q.xyz, cross(q.xyz, v) + q.w * v);\n}\n// vec3 applyQuaternionToVector( vec4 q, vec3 v ){\n// \treturn v + 2.0 * cross( q.xyz, cross( q.xyz, v ) + q.w * v );\n// }\nvec3 rotateWithQuat( vec3 v, vec4 q )\n{\n\t// vec4 qv = multQuat( quat, vec4(vec, 0.0) );\n\t// return multQuat( qv, vec4(-quat.x, -quat.y, -quat.z, quat.w) ).xyz;\n\treturn v + 2.0 * cross( q.xyz, cross( q.xyz, v ) + q.w * v );\n}\n// https://github.com/glslify/glsl-look-at/blob/gh-pages/index.glsl\n// mat3 rotation_matrix(vec3 origin, vec3 target, float roll) {\n// \tvec3 rr = vec3(sin(roll), cos(roll), 0.0);\n// \tvec3 ww = normalize(target - origin);\n// \tvec3 uu = normalize(cross(ww, rr));\n// \tvec3 vv = normalize(cross(uu, ww));\n\n// \treturn mat3(uu, vv, ww);\n// }\n// mat3 rotation_matrix(vec3 target, float roll) {\n// \tvec3 rr = vec3(sin(roll), cos(roll), 0.0);\n// \tvec3 ww = normalize(target);\n// \tvec3 uu = normalize(cross(ww, rr));\n// \tvec3 vv = normalize(cross(uu, ww));\n\n// \treturn mat3(uu, vv, ww);\n// }\n\nfloat vectorAngle(vec3 start, vec3 dest){\n\tstart = normalize(start);\n\tdest = normalize(dest);\n\n\tfloat cosTheta = dot(start, dest);\n\tvec3 c1 = cross(start, dest);\n\t// We use the dot product of the cross with the Y axis.\n\t// This is a little arbitrary, but can still give a good sense of direction\n\tvec3 y_axis = vec3(0.0, 1.0, 0.0);\n\tfloat d1 = dot(c1, y_axis);\n\tfloat angle = acos(cosTheta) * sign(d1);\n\treturn angle;\n}\n\n// http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/#i-need-an-equivalent-of-glulookat-how-do-i-orient-an-object-towards-a-point-\nvec4 vectorAlign(vec3 start, vec3 dest){\n\tstart = normalize(start);\n\tdest = normalize(dest);\n\n\tfloat cosTheta = dot(start, dest);\n\tvec3 axis;\n\n\t// if (cosTheta < -1 + 0.001f){\n\t// \t// special case when vectors in opposite directions:\n\t// \t// there is no ideal rotation axis\n\t// \t// So guess one; any will do as long as it's perpendicular to start\n\t// \taxis = cross(vec3(0.0f, 0.0f, 1.0f), start);\n\t// \tif (length2(axis) < 0.01 ) // bad luck, they were parallel, try again!\n\t// \t\taxis = cross(vec3(1.0f, 0.0f, 0.0f), start);\n\n\t// \taxis = normalize(axis);\n\t// \treturn gtx::quaternion::angleAxis(glm::radians(180.0f), axis);\n\t// }\n\tif(cosTheta > (1.0 - 0.0001) || cosTheta < (-1.0 + 0.0001) ){\n\t\taxis = normalize(cross(start, vec3(0.0, 1.0, 0.0)));\n\t\tif (length(axis) < 0.001 ){ // bad luck, they were parallel, try again!\n\t\t\taxis = normalize(cross(start, vec3(1.0, 0.0, 0.0)));\n\t\t}\n\t} else {\n\t\taxis = normalize(cross(start, dest));\n\t}\n\n\tfloat angle = acos(cosTheta);\n\n\treturn quatFromAxisAngle(axis, angle);\n}\nvec4 vectorAlignWithUp(vec3 start, vec3 dest, vec3 up){\n\tvec4 rot1 = vectorAlign(start, dest);\n\tup = normalize(up);\n\n\t// Recompute desiredUp so that it's perpendicular to the direction\n\t// You can skip that part if you really want to force desiredUp\n\t// vec3 right = normalize(cross(dest, up));\n\t// up = normalize(cross(right, dest));\n\n\t// Because of the 1rst rotation, the up is probably completely screwed up.\n\t// Find the rotation between the up of the rotated object, and the desired up\n\tvec3 newUp = rotateWithQuat(vec3(0.0, 1.0, 0.0), rot1);//rot1 * vec3(0.0, 1.0, 0.0);\n\tvec4 rot2 = vectorAlign(up, newUp);\n\n\t// return rot1;\n\treturn rot2;\n\t// return multQuat(rot1, rot2);\n\t// return rot2 * rot1;\n\n}\n\n// https://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\nfloat quatToAngle(vec4 q){\n\treturn 2.0 * acos(q.w);\n}\nvec3 quatToAxis(vec4 q){\n\treturn vec3(\n\t\tq.x / sqrt(1.0-q.w*q.w),\n\t\tq.y / sqrt(1.0-q.w*q.w),\n\t\tq.z / sqrt(1.0-q.w*q.w)\n\t);\n}\n\nvec4 align(vec3 dir, vec3 up){\n\tvec3 start_dir = vec3(0.0, 0.0, 1.0);\n\tvec3 start_up = vec3(0.0, 1.0, 0.0);\n\tvec4 rot1 = vectorAlign(start_dir, dir);\n\tup = normalize(up);\n\n\t// Recompute desiredUp so that it's perpendicular to the direction\n\t// You can skip that part if you really want to force desiredUp\n\tvec3 right = normalize(cross(dir, up));\n\tif(length(right)<0.001){\n\t\tright = vec3(1.0, 0.0, 0.0);\n\t}\n\tup = normalize(cross(right, dir));\n\n\t// Because of the 1rst rotation, the up is probably completely screwed up.\n\t// Find the rotation between the up of the rotated object, and the desired up\n\tvec3 newUp = rotateWithQuat(start_up, rot1);//rot1 * vec3(0.0, 1.0, 0.0);\n\tvec4 rot2 = vectorAlign(normalize(newUp), up);\n\n\t// return rot1;\n\treturn quatMult(rot1, rot2);\n\t// return rot2 * rot1;\n\n}\n\n\n\n\n\n\n\n// /geo1/MAT/meshBasicBuilder1/globals1\nvarying vec2 v_POLY_globals1_uv;\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\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// /geo1/MAT/meshBasicBuilder1/constant3\n\tfloat v_POLY_constant3_val = 0.05;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/constant4\n\tfloat v_POLY_constant4_val = 0.01;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/constant1\n\tfloat v_POLY_constant1_val = 180.0;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/constant2\n\tfloat v_POLY_constant2_val = 90.0;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/add2\n\tfloat v_POLY_add2_sum = (v_POLY_constant3_val + v_POLY_constant4_val + 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd4\n\tvec2 v_POLY_multAdd4_val = (vec2(6.283185307179586, 3.141592653589793)*(v_POLY_globals1_uv + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec2_1\n\tvec2 v_POLY_floatToVec2_1_vec2 = vec2(v_POLY_constant1_val, v_POLY_constant2_val);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/vec2ToFloat2\n\tfloat v_POLY_vec2ToFloat2_y = v_POLY_multAdd4_val.y;\n\tfloat v_POLY_vec2ToFloat2_x = v_POLY_multAdd4_val.x;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd3\n\tvec2 v_POLY_multAdd3_val = (v_POLY_floatToVec2_1_vec2*(v_POLY_globals1_uv + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec3_4\n\tvec3 v_POLY_floatToVec3_4_vec3 = vec3(1.0, v_POLY_vec2ToFloat2_y, v_POLY_vec2ToFloat2_x);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/round1\n\tvec2 v_POLY_round1_val = vec2(sign(v_POLY_multAdd3_val.x)*floor(abs(v_POLY_multAdd3_val.x)+0.5),sign(v_POLY_multAdd3_val.y)*floor(abs(v_POLY_multAdd3_val.y)+0.5));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/polarToCartesian3\n\tvec3 v_POLY_polarToCartesian3_xyz = polarToCartesian(v_POLY_floatToVec3_4_vec3);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/divide3\n\tvec2 v_POLY_divide3_divide = (v_POLY_round1_val / v_POLY_floatToVec2_1_vec2 / vec2(1.0, 1.0));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd2\n\tvec3 v_POLY_multAdd2_val = (vec3(-1.0, -1.0, -1.0)*(v_POLY_polarToCartesian3_xyz + vec3(0.0, 0.0, 0.0))) + vec3(0.0, 0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd5\n\tvec2 v_POLY_multAdd5_val = (vec2(6.283185307179586, 3.141592653589793)*(v_POLY_divide3_divide + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/rotate1\n\tvec3 v_POLY_rotate1_val = rotateWithAxisAngle(v_POLY_multAdd2_val, vec3(0.0, 1.0, 0.0), 1.5707963267948966);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/vec2ToFloat3\n\tfloat v_POLY_vec2ToFloat3_y = v_POLY_multAdd5_val.y;\n\tfloat v_POLY_vec2ToFloat3_x = v_POLY_multAdd5_val.x;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec3_5\n\tvec3 v_POLY_floatToVec3_5_vec3 = vec3(1.0, v_POLY_vec2ToFloat3_y, v_POLY_vec2ToFloat3_x);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/polarToCartesian4\n\tvec3 v_POLY_polarToCartesian4_xyz = polarToCartesian(v_POLY_floatToVec3_5_vec3);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd6\n\tvec3 v_POLY_multAdd6_val = (vec3(-1.0, -1.0, -1.0)*(v_POLY_polarToCartesian4_xyz + vec3(0.0, 0.0, 0.0))) + vec3(0.0, 0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/rotate2\n\tvec3 v_POLY_rotate2_val = rotateWithAxisAngle(v_POLY_multAdd6_val, vec3(0.0, 1.0, 0.0), 1.5707963267948966);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/subtract1\n\tvec3 v_POLY_subtract1_subtract = (v_POLY_rotate1_val - v_POLY_rotate2_val - vec3(0.0, 0.0, 0.0));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/length1\n\tfloat v_POLY_length1_val = length(v_POLY_subtract1_subtract);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd7\n\tfloat v_POLY_multAdd7_val = (10.0*(v_POLY_length1_val + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/smoothstep1\n\tfloat v_POLY_smoothstep1_val = smoothstep(v_POLY_constant3_val, v_POLY_add2_sum, v_POLY_multAdd7_val);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/null1\n\tfloat v_POLY_null1_val = v_POLY_smoothstep1_val;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec3_1\n\tvec3 v_POLY_floatToVec3_1_vec3 = vec3(v_POLY_null1_val, v_POLY_null1_val, v_POLY_null1_val);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/add1\n\tvec3 v_POLY_add1_sum = (v_POLY_floatToVec3_1_vec3 + v_POLY_rotate2_val + vec3(0.0, 0.0, 0.0));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/output1\n\tdiffuseColor.xyz = v_POLY_add1_sum;\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 <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n\n\n\n// /geo1/MAT/meshBasicBuilder1/globals1\nvarying vec2 v_POLY_globals1_uv;\n\n\n\n\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <batching_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// /geo1/MAT/meshBasicBuilder1/globals1\n\tv_POLY_globals1_uv = vec2(uv);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/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// /geo1/MAT/meshBasicBuilder1/polarToCartesian3\nvec3 cartesianToPolar(vec3 w){\n\tfloat wr = sqrt(dot(w,w));\n\tfloat wo = acos(w.y/wr);\n\tfloat wi = atan(w.x,w.z);\n\treturn vec3(wr,wo,wi);\n}\nvec3 polarToCartesian(vec3 p){\n\tfloat x = p.x * sin(p.y)*sin(p.z);\n\tfloat y = p.x * cos(p.y);\n\tfloat z = p.x * sin(p.y)*cos(p.z);\n\treturn vec3(x,y,z);\n}\n\n// /geo1/MAT/meshBasicBuilder1/rotate1\n\n\n// https://stackoverflow.com/questions/23793698/how-to-implement-slerp-in-glsl-hlsl\n// vec4 quatSlerp(vec4 p0, vec4 p1, float t)\n// {\n// \tfloat dotp = dot(normalize(p0), normalize(p1));\n// \tif ((dotp > 0.9999) || (dotp < -0.9999))\n// \t{\n// \t\tif (t<=0.5)\n// \t\t\treturn p0;\n// \t\treturn p1;\n// \t}\n// \tfloat theta = acos(dotp);\n// \tvec4 P = ((p0*sin((1.0-t)*theta) + p1*sin(t*theta)) / sin(theta));\n// \tP.w = 1.0;\n// \treturn P;\n// }\n\n// https://devcry.heiho.net/html/2017/20170521-slerp.html\n// float lerp(float a, float b, float t) {\n// \treturn (1.0 - t) * a + t * b;\n// }\n// vec4 quatSlerp(vec4 p0, vec4 p1, float t){\n// \tvec4 qb = p1;\n\n// \t// cos(a) = dot product\n// \tfloat cos_a = p0.x * qb.x + p0.y * qb.y + p0.z * qb.z + p0.w * qb.w;\n// \tif (cos_a < 0.0f) {\n// \t\tcos_a = -cos_a;\n// \t\tqb = -qb;\n// \t}\n\n// \t// close to zero, cos(a) ~= 1\n// \t// do linear interpolation\n// \tif (cos_a > 0.999) {\n// \t\treturn vec4(\n// \t\t\tlerp(p0.x, qb.x, t),\n// \t\t\tlerp(p0.y, qb.y, t),\n// \t\t\tlerp(p0.z, qb.z, t),\n// \t\t\tlerp(p0.w, qb.w, t)\n// \t\t);\n// \t}\n\n// \tfloat alpha = acos(cos_a);\n// \treturn (p0 * sin(1.0 - t) + p1 * sin(t * alpha)) / sin(alpha);\n// }\n\n// https://stackoverflow.com/questions/62943083/interpolate-between-two-quaternions-the-long-way\nvec4 quatSlerp(vec4 q1, vec4 q2, float t){\n\tfloat angle = acos(dot(q1, q2));\n\tfloat denom = sin(angle);\n\t//check if denom is zero\n\treturn (q1*sin((1.0-t)*angle)+q2*sin(t*angle))/denom;\n}\n// TO CHECK:\n// this page https://www.reddit.com/r/opengl/comments/704la7/glsl_quaternion_library/\n// has a link to a potentially nice pdf:\n// http://web.mit.edu/2.998/www/QuaternionReport1.pdf\n\n// https://github.com/mattatz/ShibuyaCrowd/blob/master/source/shaders/common/quaternion.glsl\nvec4 quatMult(vec4 q1, vec4 q2)\n{\n\treturn vec4(\n\tq1.w * q2.x + q1.x * q2.w + q1.z * q2.y - q1.y * q2.z,\n\tq1.w * q2.y + q1.y * q2.w + q1.x * q2.z - q1.z * q2.x,\n\tq1.w * q2.z + q1.z * q2.w + q1.y * q2.x - q1.x * q2.y,\n\tq1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z\n\t);\n}\n// http://glmatrix.net/docs/quat.js.html#line97\n// let ax = a[0], ay = a[1], az = a[2], aw = a[3];\n\n// let bx = b[0], by = b[1], bz = b[2], bw = b[3];\n\n// out[0] = ax * bw + aw * bx + ay * bz - az * by;\n\n// out[1] = ay * bw + aw * by + az * bx - ax * bz;\n\n// out[2] = az * bw + aw * bz + ax * by - ay * bx;\n\n// out[3] = aw * bw - ax * bx - ay * by - az * bz;\n\n// return out\n\n\n\n// http://www.neilmendoza.com/glsl-rotation-about-an-arbitrary-axis/\nmat4 rotationMatrix(vec3 axis, float angle)\n{\n\taxis = normalize(axis);\n\tfloat s = sin(angle);\n\tfloat c = cos(angle);\n\tfloat oc = 1.0 - c;\n\n \treturn mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0.0, oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0.0, oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0.0, 0.0, 0.0, 0.0, 1.0);\n}\n\n// https://www.geeks3d.com/20141201/how-to-rotate-a-vertex-by-a-quaternion-in-glsl/\nvec4 quatFromAxisAngle(vec3 axis, float angle)\n{\n\tvec4 qr;\n\tfloat half_angle = (angle * 0.5); // * 3.14159 / 180.0;\n\tfloat sin_half_angle = sin(half_angle);\n\tqr.x = axis.x * sin_half_angle;\n\tqr.y = axis.y * sin_half_angle;\n\tqr.z = axis.z * sin_half_angle;\n\tqr.w = cos(half_angle);\n\treturn qr;\n}\nvec3 rotateWithAxisAngle(vec3 position, vec3 axis, float angle)\n{\n\tvec4 q = quatFromAxisAngle(axis, angle);\n\tvec3 v = position.xyz;\n\treturn v + 2.0 * cross(q.xyz, cross(q.xyz, v) + q.w * v);\n}\n// vec3 applyQuaternionToVector( vec4 q, vec3 v ){\n// \treturn v + 2.0 * cross( q.xyz, cross( q.xyz, v ) + q.w * v );\n// }\nvec3 rotateWithQuat( vec3 v, vec4 q )\n{\n\t// vec4 qv = multQuat( quat, vec4(vec, 0.0) );\n\t// return multQuat( qv, vec4(-quat.x, -quat.y, -quat.z, quat.w) ).xyz;\n\treturn v + 2.0 * cross( q.xyz, cross( q.xyz, v ) + q.w * v );\n}\n// https://github.com/glslify/glsl-look-at/blob/gh-pages/index.glsl\n// mat3 rotation_matrix(vec3 origin, vec3 target, float roll) {\n// \tvec3 rr = vec3(sin(roll), cos(roll), 0.0);\n// \tvec3 ww = normalize(target - origin);\n// \tvec3 uu = normalize(cross(ww, rr));\n// \tvec3 vv = normalize(cross(uu, ww));\n\n// \treturn mat3(uu, vv, ww);\n// }\n// mat3 rotation_matrix(vec3 target, float roll) {\n// \tvec3 rr = vec3(sin(roll), cos(roll), 0.0);\n// \tvec3 ww = normalize(target);\n// \tvec3 uu = normalize(cross(ww, rr));\n// \tvec3 vv = normalize(cross(uu, ww));\n\n// \treturn mat3(uu, vv, ww);\n// }\n\nfloat vectorAngle(vec3 start, vec3 dest){\n\tstart = normalize(start);\n\tdest = normalize(dest);\n\n\tfloat cosTheta = dot(start, dest);\n\tvec3 c1 = cross(start, dest);\n\t// We use the dot product of the cross with the Y axis.\n\t// This is a little arbitrary, but can still give a good sense of direction\n\tvec3 y_axis = vec3(0.0, 1.0, 0.0);\n\tfloat d1 = dot(c1, y_axis);\n\tfloat angle = acos(cosTheta) * sign(d1);\n\treturn angle;\n}\n\n// http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/#i-need-an-equivalent-of-glulookat-how-do-i-orient-an-object-towards-a-point-\nvec4 vectorAlign(vec3 start, vec3 dest){\n\tstart = normalize(start);\n\tdest = normalize(dest);\n\n\tfloat cosTheta = dot(start, dest);\n\tvec3 axis;\n\n\t// if (cosTheta < -1 + 0.001f){\n\t// \t// special case when vectors in opposite directions:\n\t// \t// there is no ideal rotation axis\n\t// \t// So guess one; any will do as long as it's perpendicular to start\n\t// \taxis = cross(vec3(0.0f, 0.0f, 1.0f), start);\n\t// \tif (length2(axis) < 0.01 ) // bad luck, they were parallel, try again!\n\t// \t\taxis = cross(vec3(1.0f, 0.0f, 0.0f), start);\n\n\t// \taxis = normalize(axis);\n\t// \treturn gtx::quaternion::angleAxis(glm::radians(180.0f), axis);\n\t// }\n\tif(cosTheta > (1.0 - 0.0001) || cosTheta < (-1.0 + 0.0001) ){\n\t\taxis = normalize(cross(start, vec3(0.0, 1.0, 0.0)));\n\t\tif (length(axis) < 0.001 ){ // bad luck, they were parallel, try again!\n\t\t\taxis = normalize(cross(start, vec3(1.0, 0.0, 0.0)));\n\t\t}\n\t} else {\n\t\taxis = normalize(cross(start, dest));\n\t}\n\n\tfloat angle = acos(cosTheta);\n\n\treturn quatFromAxisAngle(axis, angle);\n}\nvec4 vectorAlignWithUp(vec3 start, vec3 dest, vec3 up){\n\tvec4 rot1 = vectorAlign(start, dest);\n\tup = normalize(up);\n\n\t// Recompute desiredUp so that it's perpendicular to the direction\n\t// You can skip that part if you really want to force desiredUp\n\t// vec3 right = normalize(cross(dest, up));\n\t// up = normalize(cross(right, dest));\n\n\t// Because of the 1rst rotation, the up is probably completely screwed up.\n\t// Find the rotation between the up of the rotated object, and the desired up\n\tvec3 newUp = rotateWithQuat(vec3(0.0, 1.0, 0.0), rot1);//rot1 * vec3(0.0, 1.0, 0.0);\n\tvec4 rot2 = vectorAlign(up, newUp);\n\n\t// return rot1;\n\treturn rot2;\n\t// return multQuat(rot1, rot2);\n\t// return rot2 * rot1;\n\n}\n\n// https://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\nfloat quatToAngle(vec4 q){\n\treturn 2.0 * acos(q.w);\n}\nvec3 quatToAxis(vec4 q){\n\treturn vec3(\n\t\tq.x / sqrt(1.0-q.w*q.w),\n\t\tq.y / sqrt(1.0-q.w*q.w),\n\t\tq.z / sqrt(1.0-q.w*q.w)\n\t);\n}\n\nvec4 align(vec3 dir, vec3 up){\n\tvec3 start_dir = vec3(0.0, 0.0, 1.0);\n\tvec3 start_up = vec3(0.0, 1.0, 0.0);\n\tvec4 rot1 = vectorAlign(start_dir, dir);\n\tup = normalize(up);\n\n\t// Recompute desiredUp so that it's perpendicular to the direction\n\t// You can skip that part if you really want to force desiredUp\n\tvec3 right = normalize(cross(dir, up));\n\tif(length(right)<0.001){\n\t\tright = vec3(1.0, 0.0, 0.0);\n\t}\n\tup = normalize(cross(right, dir));\n\n\t// Because of the 1rst rotation, the up is probably completely screwed up.\n\t// Find the rotation between the up of the rotated object, and the desired up\n\tvec3 newUp = rotateWithQuat(start_up, rot1);//rot1 * vec3(0.0, 1.0, 0.0);\n\tvec4 rot2 = vectorAlign(normalize(newUp), up);\n\n\t// return rot1;\n\treturn quatMult(rot1, rot2);\n\t// return rot2 * rot1;\n\n}\n\n\n\n\n\n\n\n// /geo1/MAT/meshBasicBuilder1/globals1\nvarying vec2 v_POLY_globals1_uv;\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\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// /geo1/MAT/meshBasicBuilder1/constant3\n\tfloat v_POLY_constant3_val = 0.05;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/constant4\n\tfloat v_POLY_constant4_val = 0.01;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/constant1\n\tfloat v_POLY_constant1_val = 180.0;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/constant2\n\tfloat v_POLY_constant2_val = 90.0;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/add2\n\tfloat v_POLY_add2_sum = (v_POLY_constant3_val + v_POLY_constant4_val + 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd4\n\tvec2 v_POLY_multAdd4_val = (vec2(6.283185307179586, 3.141592653589793)*(v_POLY_globals1_uv + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec2_1\n\tvec2 v_POLY_floatToVec2_1_vec2 = vec2(v_POLY_constant1_val, v_POLY_constant2_val);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/vec2ToFloat2\n\tfloat v_POLY_vec2ToFloat2_y = v_POLY_multAdd4_val.y;\n\tfloat v_POLY_vec2ToFloat2_x = v_POLY_multAdd4_val.x;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd3\n\tvec2 v_POLY_multAdd3_val = (v_POLY_floatToVec2_1_vec2*(v_POLY_globals1_uv + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec3_4\n\tvec3 v_POLY_floatToVec3_4_vec3 = vec3(1.0, v_POLY_vec2ToFloat2_y, v_POLY_vec2ToFloat2_x);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/round1\n\tvec2 v_POLY_round1_val = vec2(sign(v_POLY_multAdd3_val.x)*floor(abs(v_POLY_multAdd3_val.x)+0.5),sign(v_POLY_multAdd3_val.y)*floor(abs(v_POLY_multAdd3_val.y)+0.5));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/polarToCartesian3\n\tvec3 v_POLY_polarToCartesian3_xyz = polarToCartesian(v_POLY_floatToVec3_4_vec3);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/divide3\n\tvec2 v_POLY_divide3_divide = (v_POLY_round1_val / v_POLY_floatToVec2_1_vec2 / vec2(1.0, 1.0));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd2\n\tvec3 v_POLY_multAdd2_val = (vec3(-1.0, -1.0, -1.0)*(v_POLY_polarToCartesian3_xyz + vec3(0.0, 0.0, 0.0))) + vec3(0.0, 0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd5\n\tvec2 v_POLY_multAdd5_val = (vec2(6.283185307179586, 3.141592653589793)*(v_POLY_divide3_divide + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/rotate1\n\tvec3 v_POLY_rotate1_val = rotateWithAxisAngle(v_POLY_multAdd2_val, vec3(0.0, 1.0, 0.0), 1.5707963267948966);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/vec2ToFloat3\n\tfloat v_POLY_vec2ToFloat3_y = v_POLY_multAdd5_val.y;\n\tfloat v_POLY_vec2ToFloat3_x = v_POLY_multAdd5_val.x;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec3_5\n\tvec3 v_POLY_floatToVec3_5_vec3 = vec3(1.0, v_POLY_vec2ToFloat3_y, v_POLY_vec2ToFloat3_x);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/polarToCartesian4\n\tvec3 v_POLY_polarToCartesian4_xyz = polarToCartesian(v_POLY_floatToVec3_5_vec3);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd6\n\tvec3 v_POLY_multAdd6_val = (vec3(-1.0, -1.0, -1.0)*(v_POLY_polarToCartesian4_xyz + vec3(0.0, 0.0, 0.0))) + vec3(0.0, 0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/rotate2\n\tvec3 v_POLY_rotate2_val = rotateWithAxisAngle(v_POLY_multAdd6_val, vec3(0.0, 1.0, 0.0), 1.5707963267948966);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/subtract1\n\tvec3 v_POLY_subtract1_subtract = (v_POLY_rotate1_val - v_POLY_rotate2_val - vec3(0.0, 0.0, 0.0));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/length1\n\tfloat v_POLY_length1_val = length(v_POLY_subtract1_subtract);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd7\n\tfloat v_POLY_multAdd7_val = (10.0*(v_POLY_length1_val + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/smoothstep1\n\tfloat v_POLY_smoothstep1_val = smoothstep(v_POLY_constant3_val, v_POLY_add2_sum, v_POLY_multAdd7_val);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/null1\n\tfloat v_POLY_null1_val = v_POLY_smoothstep1_val;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec3_1\n\tvec3 v_POLY_floatToVec3_1_vec3 = vec3(v_POLY_null1_val, v_POLY_null1_val, v_POLY_null1_val);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/add1\n\tvec3 v_POLY_add1_sum = (v_POLY_floatToVec3_1_vec3 + v_POLY_rotate2_val + vec3(0.0, 0.0, 0.0));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/output1\n\tdiffuseColor.xyz = v_POLY_add1_sum;\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 <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n\n\n\n// /geo1/MAT/meshBasicBuilder1/globals1\nvarying vec2 v_POLY_globals1_uv;\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 <batching_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// /geo1/MAT/meshBasicBuilder1/globals1\n\tv_POLY_globals1_uv = vec2(uv);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/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// /geo1/MAT/meshBasicBuilder1/polarToCartesian3\nvec3 cartesianToPolar(vec3 w){\n\tfloat wr = sqrt(dot(w,w));\n\tfloat wo = acos(w.y/wr);\n\tfloat wi = atan(w.x,w.z);\n\treturn vec3(wr,wo,wi);\n}\nvec3 polarToCartesian(vec3 p){\n\tfloat x = p.x * sin(p.y)*sin(p.z);\n\tfloat y = p.x * cos(p.y);\n\tfloat z = p.x * sin(p.y)*cos(p.z);\n\treturn vec3(x,y,z);\n}\n\n// /geo1/MAT/meshBasicBuilder1/rotate1\n\n\n// https://stackoverflow.com/questions/23793698/how-to-implement-slerp-in-glsl-hlsl\n// vec4 quatSlerp(vec4 p0, vec4 p1, float t)\n// {\n// \tfloat dotp = dot(normalize(p0), normalize(p1));\n// \tif ((dotp > 0.9999) || (dotp < -0.9999))\n// \t{\n// \t\tif (t<=0.5)\n// \t\t\treturn p0;\n// \t\treturn p1;\n// \t}\n// \tfloat theta = acos(dotp);\n// \tvec4 P = ((p0*sin((1.0-t)*theta) + p1*sin(t*theta)) / sin(theta));\n// \tP.w = 1.0;\n// \treturn P;\n// }\n\n// https://devcry.heiho.net/html/2017/20170521-slerp.html\n// float lerp(float a, float b, float t) {\n// \treturn (1.0 - t) * a + t * b;\n// }\n// vec4 quatSlerp(vec4 p0, vec4 p1, float t){\n// \tvec4 qb = p1;\n\n// \t// cos(a) = dot product\n// \tfloat cos_a = p0.x * qb.x + p0.y * qb.y + p0.z * qb.z + p0.w * qb.w;\n// \tif (cos_a < 0.0f) {\n// \t\tcos_a = -cos_a;\n// \t\tqb = -qb;\n// \t}\n\n// \t// close to zero, cos(a) ~= 1\n// \t// do linear interpolation\n// \tif (cos_a > 0.999) {\n// \t\treturn vec4(\n// \t\t\tlerp(p0.x, qb.x, t),\n// \t\t\tlerp(p0.y, qb.y, t),\n// \t\t\tlerp(p0.z, qb.z, t),\n// \t\t\tlerp(p0.w, qb.w, t)\n// \t\t);\n// \t}\n\n// \tfloat alpha = acos(cos_a);\n// \treturn (p0 * sin(1.0 - t) + p1 * sin(t * alpha)) / sin(alpha);\n// }\n\n// https://stackoverflow.com/questions/62943083/interpolate-between-two-quaternions-the-long-way\nvec4 quatSlerp(vec4 q1, vec4 q2, float t){\n\tfloat angle = acos(dot(q1, q2));\n\tfloat denom = sin(angle);\n\t//check if denom is zero\n\treturn (q1*sin((1.0-t)*angle)+q2*sin(t*angle))/denom;\n}\n// TO CHECK:\n// this page https://www.reddit.com/r/opengl/comments/704la7/glsl_quaternion_library/\n// has a link to a potentially nice pdf:\n// http://web.mit.edu/2.998/www/QuaternionReport1.pdf\n\n// https://github.com/mattatz/ShibuyaCrowd/blob/master/source/shaders/common/quaternion.glsl\nvec4 quatMult(vec4 q1, vec4 q2)\n{\n\treturn vec4(\n\tq1.w * q2.x + q1.x * q2.w + q1.z * q2.y - q1.y * q2.z,\n\tq1.w * q2.y + q1.y * q2.w + q1.x * q2.z - q1.z * q2.x,\n\tq1.w * q2.z + q1.z * q2.w + q1.y * q2.x - q1.x * q2.y,\n\tq1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z\n\t);\n}\n// http://glmatrix.net/docs/quat.js.html#line97\n// let ax = a[0], ay = a[1], az = a[2], aw = a[3];\n\n// let bx = b[0], by = b[1], bz = b[2], bw = b[3];\n\n// out[0] = ax * bw + aw * bx + ay * bz - az * by;\n\n// out[1] = ay * bw + aw * by + az * bx - ax * bz;\n\n// out[2] = az * bw + aw * bz + ax * by - ay * bx;\n\n// out[3] = aw * bw - ax * bx - ay * by - az * bz;\n\n// return out\n\n\n\n// http://www.neilmendoza.com/glsl-rotation-about-an-arbitrary-axis/\nmat4 rotationMatrix(vec3 axis, float angle)\n{\n\taxis = normalize(axis);\n\tfloat s = sin(angle);\n\tfloat c = cos(angle);\n\tfloat oc = 1.0 - c;\n\n \treturn mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0.0, oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0.0, oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0.0, 0.0, 0.0, 0.0, 1.0);\n}\n\n// https://www.geeks3d.com/20141201/how-to-rotate-a-vertex-by-a-quaternion-in-glsl/\nvec4 quatFromAxisAngle(vec3 axis, float angle)\n{\n\tvec4 qr;\n\tfloat half_angle = (angle * 0.5); // * 3.14159 / 180.0;\n\tfloat sin_half_angle = sin(half_angle);\n\tqr.x = axis.x * sin_half_angle;\n\tqr.y = axis.y * sin_half_angle;\n\tqr.z = axis.z * sin_half_angle;\n\tqr.w = cos(half_angle);\n\treturn qr;\n}\nvec3 rotateWithAxisAngle(vec3 position, vec3 axis, float angle)\n{\n\tvec4 q = quatFromAxisAngle(axis, angle);\n\tvec3 v = position.xyz;\n\treturn v + 2.0 * cross(q.xyz, cross(q.xyz, v) + q.w * v);\n}\n// vec3 applyQuaternionToVector( vec4 q, vec3 v ){\n// \treturn v + 2.0 * cross( q.xyz, cross( q.xyz, v ) + q.w * v );\n// }\nvec3 rotateWithQuat( vec3 v, vec4 q )\n{\n\t// vec4 qv = multQuat( quat, vec4(vec, 0.0) );\n\t// return multQuat( qv, vec4(-quat.x, -quat.y, -quat.z, quat.w) ).xyz;\n\treturn v + 2.0 * cross( q.xyz, cross( q.xyz, v ) + q.w * v );\n}\n// https://github.com/glslify/glsl-look-at/blob/gh-pages/index.glsl\n// mat3 rotation_matrix(vec3 origin, vec3 target, float roll) {\n// \tvec3 rr = vec3(sin(roll), cos(roll), 0.0);\n// \tvec3 ww = normalize(target - origin);\n// \tvec3 uu = normalize(cross(ww, rr));\n// \tvec3 vv = normalize(cross(uu, ww));\n\n// \treturn mat3(uu, vv, ww);\n// }\n// mat3 rotation_matrix(vec3 target, float roll) {\n// \tvec3 rr = vec3(sin(roll), cos(roll), 0.0);\n// \tvec3 ww = normalize(target);\n// \tvec3 uu = normalize(cross(ww, rr));\n// \tvec3 vv = normalize(cross(uu, ww));\n\n// \treturn mat3(uu, vv, ww);\n// }\n\nfloat vectorAngle(vec3 start, vec3 dest){\n\tstart = normalize(start);\n\tdest = normalize(dest);\n\n\tfloat cosTheta = dot(start, dest);\n\tvec3 c1 = cross(start, dest);\n\t// We use the dot product of the cross with the Y axis.\n\t// This is a little arbitrary, but can still give a good sense of direction\n\tvec3 y_axis = vec3(0.0, 1.0, 0.0);\n\tfloat d1 = dot(c1, y_axis);\n\tfloat angle = acos(cosTheta) * sign(d1);\n\treturn angle;\n}\n\n// http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/#i-need-an-equivalent-of-glulookat-how-do-i-orient-an-object-towards-a-point-\nvec4 vectorAlign(vec3 start, vec3 dest){\n\tstart = normalize(start);\n\tdest = normalize(dest);\n\n\tfloat cosTheta = dot(start, dest);\n\tvec3 axis;\n\n\t// if (cosTheta < -1 + 0.001f){\n\t// \t// special case when vectors in opposite directions:\n\t// \t// there is no ideal rotation axis\n\t// \t// So guess one; any will do as long as it's perpendicular to start\n\t// \taxis = cross(vec3(0.0f, 0.0f, 1.0f), start);\n\t// \tif (length2(axis) < 0.01 ) // bad luck, they were parallel, try again!\n\t// \t\taxis = cross(vec3(1.0f, 0.0f, 0.0f), start);\n\n\t// \taxis = normalize(axis);\n\t// \treturn gtx::quaternion::angleAxis(glm::radians(180.0f), axis);\n\t// }\n\tif(cosTheta > (1.0 - 0.0001) || cosTheta < (-1.0 + 0.0001) ){\n\t\taxis = normalize(cross(start, vec3(0.0, 1.0, 0.0)));\n\t\tif (length(axis) < 0.001 ){ // bad luck, they were parallel, try again!\n\t\t\taxis = normalize(cross(start, vec3(1.0, 0.0, 0.0)));\n\t\t}\n\t} else {\n\t\taxis = normalize(cross(start, dest));\n\t}\n\n\tfloat angle = acos(cosTheta);\n\n\treturn quatFromAxisAngle(axis, angle);\n}\nvec4 vectorAlignWithUp(vec3 start, vec3 dest, vec3 up){\n\tvec4 rot1 = vectorAlign(start, dest);\n\tup = normalize(up);\n\n\t// Recompute desiredUp so that it's perpendicular to the direction\n\t// You can skip that part if you really want to force desiredUp\n\t// vec3 right = normalize(cross(dest, up));\n\t// up = normalize(cross(right, dest));\n\n\t// Because of the 1rst rotation, the up is probably completely screwed up.\n\t// Find the rotation between the up of the rotated object, and the desired up\n\tvec3 newUp = rotateWithQuat(vec3(0.0, 1.0, 0.0), rot1);//rot1 * vec3(0.0, 1.0, 0.0);\n\tvec4 rot2 = vectorAlign(up, newUp);\n\n\t// return rot1;\n\treturn rot2;\n\t// return multQuat(rot1, rot2);\n\t// return rot2 * rot1;\n\n}\n\n// https://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\nfloat quatToAngle(vec4 q){\n\treturn 2.0 * acos(q.w);\n}\nvec3 quatToAxis(vec4 q){\n\treturn vec3(\n\t\tq.x / sqrt(1.0-q.w*q.w),\n\t\tq.y / sqrt(1.0-q.w*q.w),\n\t\tq.z / sqrt(1.0-q.w*q.w)\n\t);\n}\n\nvec4 align(vec3 dir, vec3 up){\n\tvec3 start_dir = vec3(0.0, 0.0, 1.0);\n\tvec3 start_up = vec3(0.0, 1.0, 0.0);\n\tvec4 rot1 = vectorAlign(start_dir, dir);\n\tup = normalize(up);\n\n\t// Recompute desiredUp so that it's perpendicular to the direction\n\t// You can skip that part if you really want to force desiredUp\n\tvec3 right = normalize(cross(dir, up));\n\tif(length(right)<0.001){\n\t\tright = vec3(1.0, 0.0, 0.0);\n\t}\n\tup = normalize(cross(right, dir));\n\n\t// Because of the 1rst rotation, the up is probably completely screwed up.\n\t// Find the rotation between the up of the rotated object, and the desired up\n\tvec3 newUp = rotateWithQuat(start_up, rot1);//rot1 * vec3(0.0, 1.0, 0.0);\n\tvec4 rot2 = vectorAlign(normalize(newUp), up);\n\n\t// return rot1;\n\treturn quatMult(rot1, rot2);\n\t// return rot2 * rot1;\n\n}\n\n\n\n\n\n\n\n// /geo1/MAT/meshBasicBuilder1/globals1\nvarying vec2 v_POLY_globals1_uv;\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\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// /geo1/MAT/meshBasicBuilder1/constant3\n\tfloat v_POLY_constant3_val = 0.05;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/constant4\n\tfloat v_POLY_constant4_val = 0.01;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/constant1\n\tfloat v_POLY_constant1_val = 180.0;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/constant2\n\tfloat v_POLY_constant2_val = 90.0;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/add2\n\tfloat v_POLY_add2_sum = (v_POLY_constant3_val + v_POLY_constant4_val + 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd4\n\tvec2 v_POLY_multAdd4_val = (vec2(6.283185307179586, 3.141592653589793)*(v_POLY_globals1_uv + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec2_1\n\tvec2 v_POLY_floatToVec2_1_vec2 = vec2(v_POLY_constant1_val, v_POLY_constant2_val);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/vec2ToFloat2\n\tfloat v_POLY_vec2ToFloat2_y = v_POLY_multAdd4_val.y;\n\tfloat v_POLY_vec2ToFloat2_x = v_POLY_multAdd4_val.x;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd3\n\tvec2 v_POLY_multAdd3_val = (v_POLY_floatToVec2_1_vec2*(v_POLY_globals1_uv + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec3_4\n\tvec3 v_POLY_floatToVec3_4_vec3 = vec3(1.0, v_POLY_vec2ToFloat2_y, v_POLY_vec2ToFloat2_x);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/round1\n\tvec2 v_POLY_round1_val = vec2(sign(v_POLY_multAdd3_val.x)*floor(abs(v_POLY_multAdd3_val.x)+0.5),sign(v_POLY_multAdd3_val.y)*floor(abs(v_POLY_multAdd3_val.y)+0.5));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/polarToCartesian3\n\tvec3 v_POLY_polarToCartesian3_xyz = polarToCartesian(v_POLY_floatToVec3_4_vec3);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/divide3\n\tvec2 v_POLY_divide3_divide = (v_POLY_round1_val / v_POLY_floatToVec2_1_vec2 / vec2(1.0, 1.0));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd2\n\tvec3 v_POLY_multAdd2_val = (vec3(-1.0, -1.0, -1.0)*(v_POLY_polarToCartesian3_xyz + vec3(0.0, 0.0, 0.0))) + vec3(0.0, 0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd5\n\tvec2 v_POLY_multAdd5_val = (vec2(6.283185307179586, 3.141592653589793)*(v_POLY_divide3_divide + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/rotate1\n\tvec3 v_POLY_rotate1_val = rotateWithAxisAngle(v_POLY_multAdd2_val, vec3(0.0, 1.0, 0.0), 1.5707963267948966);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/vec2ToFloat3\n\tfloat v_POLY_vec2ToFloat3_y = v_POLY_multAdd5_val.y;\n\tfloat v_POLY_vec2ToFloat3_x = v_POLY_multAdd5_val.x;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec3_5\n\tvec3 v_POLY_floatToVec3_5_vec3 = vec3(1.0, v_POLY_vec2ToFloat3_y, v_POLY_vec2ToFloat3_x);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/polarToCartesian4\n\tvec3 v_POLY_polarToCartesian4_xyz = polarToCartesian(v_POLY_floatToVec3_5_vec3);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd6\n\tvec3 v_POLY_multAdd6_val = (vec3(-1.0, -1.0, -1.0)*(v_POLY_polarToCartesian4_xyz + vec3(0.0, 0.0, 0.0))) + vec3(0.0, 0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/rotate2\n\tvec3 v_POLY_rotate2_val = rotateWithAxisAngle(v_POLY_multAdd6_val, vec3(0.0, 1.0, 0.0), 1.5707963267948966);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/subtract1\n\tvec3 v_POLY_subtract1_subtract = (v_POLY_rotate1_val - v_POLY_rotate2_val - vec3(0.0, 0.0, 0.0));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/length1\n\tfloat v_POLY_length1_val = length(v_POLY_subtract1_subtract);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd7\n\tfloat v_POLY_multAdd7_val = (10.0*(v_POLY_length1_val + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/smoothstep1\n\tfloat v_POLY_smoothstep1_val = smoothstep(v_POLY_constant3_val, v_POLY_add2_sum, v_POLY_multAdd7_val);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/null1\n\tfloat v_POLY_null1_val = v_POLY_smoothstep1_val;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec3_1\n\tvec3 v_POLY_floatToVec3_1_vec3 = vec3(v_POLY_null1_val, v_POLY_null1_val, v_POLY_null1_val);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/add1\n\tvec3 v_POLY_add1_sum = (v_POLY_floatToVec3_1_vec3 + v_POLY_rotate2_val + vec3(0.0, 0.0, 0.0));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/output1\n\tdiffuseColor.xyz = v_POLY_add1_sum;\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"},"/geo1/COP/builder1":{"fragment":"#include <common>\n\nuniform vec2 resolution;\n\n// removed:\n//// INSERT DEFINE\n\n\n\n// /geo1/COP/builder1/polarToCartesian3\nvec3 cartesianToPolar(vec3 w){\n\tfloat wr = sqrt(dot(w,w));\n\tfloat wo = acos(w.y/wr);\n\tfloat wi = atan(w.x,w.z);\n\treturn vec3(wr,wo,wi);\n}\nvec3 polarToCartesian(vec3 p){\n\tfloat x = p.x * sin(p.y)*sin(p.z);\n\tfloat y = p.x * cos(p.y);\n\tfloat z = p.x * sin(p.y)*cos(p.z);\n\treturn vec3(x,y,z);\n}\n\n// /geo1/COP/builder1/rotate1\n\n\n// https://stackoverflow.com/questions/23793698/how-to-implement-slerp-in-glsl-hlsl\n// vec4 quatSlerp(vec4 p0, vec4 p1, float t)\n// {\n// \tfloat dotp = dot(normalize(p0), normalize(p1));\n// \tif ((dotp > 0.9999) || (dotp < -0.9999))\n// \t{\n// \t\tif (t<=0.5)\n// \t\t\treturn p0;\n// \t\treturn p1;\n// \t}\n// \tfloat theta = acos(dotp);\n// \tvec4 P = ((p0*sin((1.0-t)*theta) + p1*sin(t*theta)) / sin(theta));\n// \tP.w = 1.0;\n// \treturn P;\n// }\n\n// https://devcry.heiho.net/html/2017/20170521-slerp.html\n// float lerp(float a, float b, float t) {\n// \treturn (1.0 - t) * a + t * b;\n// }\n// vec4 quatSlerp(vec4 p0, vec4 p1, float t){\n// \tvec4 qb = p1;\n\n// \t// cos(a) = dot product\n// \tfloat cos_a = p0.x * qb.x + p0.y * qb.y + p0.z * qb.z + p0.w * qb.w;\n// \tif (cos_a < 0.0f) {\n// \t\tcos_a = -cos_a;\n// \t\tqb = -qb;\n// \t}\n\n// \t// close to zero, cos(a) ~= 1\n// \t// do linear interpolation\n// \tif (cos_a > 0.999) {\n// \t\treturn vec4(\n// \t\t\tlerp(p0.x, qb.x, t),\n// \t\t\tlerp(p0.y, qb.y, t),\n// \t\t\tlerp(p0.z, qb.z, t),\n// \t\t\tlerp(p0.w, qb.w, t)\n// \t\t);\n// \t}\n\n// \tfloat alpha = acos(cos_a);\n// \treturn (p0 * sin(1.0 - t) + p1 * sin(t * alpha)) / sin(alpha);\n// }\n\n// https://stackoverflow.com/questions/62943083/interpolate-between-two-quaternions-the-long-way\nvec4 quatSlerp(vec4 q1, vec4 q2, float t){\n\tfloat angle = acos(dot(q1, q2));\n\tfloat denom = sin(angle);\n\t//check if denom is zero\n\treturn (q1*sin((1.0-t)*angle)+q2*sin(t*angle))/denom;\n}\n// TO CHECK:\n// this page https://www.reddit.com/r/opengl/comments/704la7/glsl_quaternion_library/\n// has a link to a potentially nice pdf:\n// http://web.mit.edu/2.998/www/QuaternionReport1.pdf\n\n// https://github.com/mattatz/ShibuyaCrowd/blob/master/source/shaders/common/quaternion.glsl\nvec4 quatMult(vec4 q1, vec4 q2)\n{\n\treturn vec4(\n\tq1.w * q2.x + q1.x * q2.w + q1.z * q2.y - q1.y * q2.z,\n\tq1.w * q2.y + q1.y * q2.w + q1.x * q2.z - q1.z * q2.x,\n\tq1.w * q2.z + q1.z * q2.w + q1.y * q2.x - q1.x * q2.y,\n\tq1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z\n\t);\n}\n// http://glmatrix.net/docs/quat.js.html#line97\n// let ax = a[0], ay = a[1], az = a[2], aw = a[3];\n\n// let bx = b[0], by = b[1], bz = b[2], bw = b[3];\n\n// out[0] = ax * bw + aw * bx + ay * bz - az * by;\n\n// out[1] = ay * bw + aw * by + az * bx - ax * bz;\n\n// out[2] = az * bw + aw * bz + ax * by - ay * bx;\n\n// out[3] = aw * bw - ax * bx - ay * by - az * bz;\n\n// return out\n\n\n\n// http://www.neilmendoza.com/glsl-rotation-about-an-arbitrary-axis/\nmat4 rotationMatrix(vec3 axis, float angle)\n{\n\taxis = normalize(axis);\n\tfloat s = sin(angle);\n\tfloat c = cos(angle);\n\tfloat oc = 1.0 - c;\n\n \treturn mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0.0, oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0.0, oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0.0, 0.0, 0.0, 0.0, 1.0);\n}\n\n// https://www.geeks3d.com/20141201/how-to-rotate-a-vertex-by-a-quaternion-in-glsl/\nvec4 quatFromAxisAngle(vec3 axis, float angle)\n{\n\tvec4 qr;\n\tfloat half_angle = (angle * 0.5); // * 3.14159 / 180.0;\n\tfloat sin_half_angle = sin(half_angle);\n\tqr.x = axis.x * sin_half_angle;\n\tqr.y = axis.y * sin_half_angle;\n\tqr.z = axis.z * sin_half_angle;\n\tqr.w = cos(half_angle);\n\treturn qr;\n}\nvec3 rotateWithAxisAngle(vec3 position, vec3 axis, float angle)\n{\n\tvec4 q = quatFromAxisAngle(axis, angle);\n\tvec3 v = position.xyz;\n\treturn v + 2.0 * cross(q.xyz, cross(q.xyz, v) + q.w * v);\n}\n// vec3 applyQuaternionToVector( vec4 q, vec3 v ){\n// \treturn v + 2.0 * cross( q.xyz, cross( q.xyz, v ) + q.w * v );\n// }\nvec3 rotateWithQuat( vec3 v, vec4 q )\n{\n\t// vec4 qv = multQuat( quat, vec4(vec, 0.0) );\n\t// return multQuat( qv, vec4(-quat.x, -quat.y, -quat.z, quat.w) ).xyz;\n\treturn v + 2.0 * cross( q.xyz, cross( q.xyz, v ) + q.w * v );\n}\n// https://github.com/glslify/glsl-look-at/blob/gh-pages/index.glsl\n// mat3 rotation_matrix(vec3 origin, vec3 target, float roll) {\n// \tvec3 rr = vec3(sin(roll), cos(roll), 0.0);\n// \tvec3 ww = normalize(target - origin);\n// \tvec3 uu = normalize(cross(ww, rr));\n// \tvec3 vv = normalize(cross(uu, ww));\n\n// \treturn mat3(uu, vv, ww);\n// }\n// mat3 rotation_matrix(vec3 target, float roll) {\n// \tvec3 rr = vec3(sin(roll), cos(roll), 0.0);\n// \tvec3 ww = normalize(target);\n// \tvec3 uu = normalize(cross(ww, rr));\n// \tvec3 vv = normalize(cross(uu, ww));\n\n// \treturn mat3(uu, vv, ww);\n// }\n\nfloat vectorAngle(vec3 start, vec3 dest){\n\tstart = normalize(start);\n\tdest = normalize(dest);\n\n\tfloat cosTheta = dot(start, dest);\n\tvec3 c1 = cross(start, dest);\n\t// We use the dot product of the cross with the Y axis.\n\t// This is a little arbitrary, but can still give a good sense of direction\n\tvec3 y_axis = vec3(0.0, 1.0, 0.0);\n\tfloat d1 = dot(c1, y_axis);\n\tfloat angle = acos(cosTheta) * sign(d1);\n\treturn angle;\n}\n\n// http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/#i-need-an-equivalent-of-glulookat-how-do-i-orient-an-object-towards-a-point-\nvec4 vectorAlign(vec3 start, vec3 dest){\n\tstart = normalize(start);\n\tdest = normalize(dest);\n\n\tfloat cosTheta = dot(start, dest);\n\tvec3 axis;\n\n\t// if (cosTheta < -1 + 0.001f){\n\t// \t// special case when vectors in opposite directions:\n\t// \t// there is no ideal rotation axis\n\t// \t// So guess one; any will do as long as it's perpendicular to start\n\t// \taxis = cross(vec3(0.0f, 0.0f, 1.0f), start);\n\t// \tif (length2(axis) < 0.01 ) // bad luck, they were parallel, try again!\n\t// \t\taxis = cross(vec3(1.0f, 0.0f, 0.0f), start);\n\n\t// \taxis = normalize(axis);\n\t// \treturn gtx::quaternion::angleAxis(glm::radians(180.0f), axis);\n\t// }\n\tif(cosTheta > (1.0 - 0.0001) || cosTheta < (-1.0 + 0.0001) ){\n\t\taxis = normalize(cross(start, vec3(0.0, 1.0, 0.0)));\n\t\tif (length(axis) < 0.001 ){ // bad luck, they were parallel, try again!\n\t\t\taxis = normalize(cross(start, vec3(1.0, 0.0, 0.0)));\n\t\t}\n\t} else {\n\t\taxis = normalize(cross(start, dest));\n\t}\n\n\tfloat angle = acos(cosTheta);\n\n\treturn quatFromAxisAngle(axis, angle);\n}\nvec4 vectorAlignWithUp(vec3 start, vec3 dest, vec3 up){\n\tvec4 rot1 = vectorAlign(start, dest);\n\tup = normalize(up);\n\n\t// Recompute desiredUp so that it's perpendicular to the direction\n\t// You can skip that part if you really want to force desiredUp\n\t// vec3 right = normalize(cross(dest, up));\n\t// up = normalize(cross(right, dest));\n\n\t// Because of the 1rst rotation, the up is probably completely screwed up.\n\t// Find the rotation between the up of the rotated object, and the desired up\n\tvec3 newUp = rotateWithQuat(vec3(0.0, 1.0, 0.0), rot1);//rot1 * vec3(0.0, 1.0, 0.0);\n\tvec4 rot2 = vectorAlign(up, newUp);\n\n\t// return rot1;\n\treturn rot2;\n\t// return multQuat(rot1, rot2);\n\t// return rot2 * rot1;\n\n}\n\n// https://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\nfloat quatToAngle(vec4 q){\n\treturn 2.0 * acos(q.w);\n}\nvec3 quatToAxis(vec4 q){\n\treturn vec3(\n\t\tq.x / sqrt(1.0-q.w*q.w),\n\t\tq.y / sqrt(1.0-q.w*q.w),\n\t\tq.z / sqrt(1.0-q.w*q.w)\n\t);\n}\n\nvec4 align(vec3 dir, vec3 up){\n\tvec3 start_dir = vec3(0.0, 0.0, 1.0);\n\tvec3 start_up = vec3(0.0, 1.0, 0.0);\n\tvec4 rot1 = vectorAlign(start_dir, dir);\n\tup = normalize(up);\n\n\t// Recompute desiredUp so that it's perpendicular to the direction\n\t// You can skip that part if you really want to force desiredUp\n\tvec3 right = normalize(cross(dir, up));\n\tif(length(right)<0.001){\n\t\tright = vec3(1.0, 0.0, 0.0);\n\t}\n\tup = normalize(cross(right, dir));\n\n\t// Because of the 1rst rotation, the up is probably completely screwed up.\n\t// Find the rotation between the up of the rotated object, and the desired up\n\tvec3 newUp = rotateWithQuat(start_up, rot1);//rot1 * vec3(0.0, 1.0, 0.0);\n\tvec4 rot2 = vectorAlign(normalize(newUp), up);\n\n\t// return rot1;\n\treturn quatMult(rot1, rot2);\n\t// return rot2 * rot1;\n\n}\n\n\n\n\n\nvoid main() {\n\n\tvec4 diffuseColor = vec4(0.0,0.0,0.0,1.0);\n\n\n// removed:\n//\t// INSERT BODY\n\n\n\n\t// /geo1/COP/builder1/constant3\n\tfloat v_POLY_constant3_val = 0.05;\n\t\n\t// /geo1/COP/builder1/constant4\n\tfloat v_POLY_constant4_val = 0.01;\n\t\n\t// /geo1/COP/builder1/globals1\n\tvec2 v_POLY_globals1_uv = vec2(gl_FragCoord.x / (resolution.x-1.), gl_FragCoord.y / (resolution.y-1.));\n\t\n\t// /geo1/COP/builder1/constant1\n\tfloat v_POLY_constant1_val = 180.0;\n\t\n\t// /geo1/COP/builder1/constant2\n\tfloat v_POLY_constant2_val = 90.0;\n\t\n\t// /geo1/COP/builder1/add2\n\tfloat v_POLY_add2_sum = (v_POLY_constant3_val + v_POLY_constant4_val + 0.0);\n\t\n\t// /geo1/COP/builder1/multAdd4\n\tvec2 v_POLY_multAdd4_val = (vec2(6.283185307179586, 3.141592653589793)*(v_POLY_globals1_uv + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/COP/builder1/floatToVec2_1\n\tvec2 v_POLY_floatToVec2_1_vec2 = vec2(v_POLY_constant1_val, v_POLY_constant2_val);\n\t\n\t// /geo1/COP/builder1/vec2ToFloat2\n\tfloat v_POLY_vec2ToFloat2_y = v_POLY_multAdd4_val.y;\n\tfloat v_POLY_vec2ToFloat2_x = v_POLY_multAdd4_val.x;\n\t\n\t// /geo1/COP/builder1/multAdd3\n\tvec2 v_POLY_multAdd3_val = (v_POLY_floatToVec2_1_vec2*(v_POLY_globals1_uv + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/COP/builder1/floatToVec3_4\n\tvec3 v_POLY_floatToVec3_4_vec3 = vec3(1.0, v_POLY_vec2ToFloat2_y, v_POLY_vec2ToFloat2_x);\n\t\n\t// /geo1/COP/builder1/round1\n\tvec2 v_POLY_round1_val = vec2(sign(v_POLY_multAdd3_val.x)*floor(abs(v_POLY_multAdd3_val.x)+0.5),sign(v_POLY_multAdd3_val.y)*floor(abs(v_POLY_multAdd3_val.y)+0.5));\n\t\n\t// /geo1/COP/builder1/polarToCartesian3\n\tvec3 v_POLY_polarToCartesian3_xyz = polarToCartesian(v_POLY_floatToVec3_4_vec3);\n\t\n\t// /geo1/COP/builder1/divide3\n\tvec2 v_POLY_divide3_divide = (v_POLY_round1_val / v_POLY_floatToVec2_1_vec2 / vec2(1.0, 1.0));\n\t\n\t// /geo1/COP/builder1/multAdd2\n\tvec3 v_POLY_multAdd2_val = (vec3(-1.0, -1.0, -1.0)*(v_POLY_polarToCartesian3_xyz + vec3(0.0, 0.0, 0.0))) + vec3(0.0, 0.0, 0.0);\n\t\n\t// /geo1/COP/builder1/multAdd5\n\tvec2 v_POLY_multAdd5_val = (vec2(6.283185307179586, 3.141592653589793)*(v_POLY_divide3_divide + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/COP/builder1/rotate1\n\tvec3 v_POLY_rotate1_val = rotateWithAxisAngle(v_POLY_multAdd2_val, vec3(0.0, 1.0, 0.0), 1.5707963267948966);\n\t\n\t// /geo1/COP/builder1/vec2ToFloat3\n\tfloat v_POLY_vec2ToFloat3_y = v_POLY_multAdd5_val.y;\n\tfloat v_POLY_vec2ToFloat3_x = v_POLY_multAdd5_val.x;\n\t\n\t// /geo1/COP/builder1/floatToVec3_5\n\tvec3 v_POLY_floatToVec3_5_vec3 = vec3(1.0, v_POLY_vec2ToFloat3_y, v_POLY_vec2ToFloat3_x);\n\t\n\t// /geo1/COP/builder1/polarToCartesian4\n\tvec3 v_POLY_polarToCartesian4_xyz = polarToCartesian(v_POLY_floatToVec3_5_vec3);\n\t\n\t// /geo1/COP/builder1/multAdd6\n\tvec3 v_POLY_multAdd6_val = (vec3(-1.0, -1.0, -1.0)*(v_POLY_polarToCartesian4_xyz + vec3(0.0, 0.0, 0.0))) + vec3(0.0, 0.0, 0.0);\n\t\n\t// /geo1/COP/builder1/rotate2\n\tvec3 v_POLY_rotate2_val = rotateWithAxisAngle(v_POLY_multAdd6_val, vec3(0.0, 1.0, 0.0), 1.5707963267948966);\n\t\n\t// /geo1/COP/builder1/subtract1\n\tvec3 v_POLY_subtract1_subtract = (v_POLY_rotate1_val - v_POLY_rotate2_val - vec3(0.0, 0.0, 0.0));\n\t\n\t// /geo1/COP/builder1/length1\n\tfloat v_POLY_length1_val = length(v_POLY_subtract1_subtract);\n\t\n\t// /geo1/COP/builder1/multAdd7\n\tfloat v_POLY_multAdd7_val = (10.0*(v_POLY_length1_val + 0.0)) + 0.0;\n\t\n\t// /geo1/COP/builder1/smoothstep1\n\tfloat v_POLY_smoothstep1_val = smoothstep(v_POLY_constant3_val, v_POLY_add2_sum, v_POLY_multAdd7_val);\n\t\n\t// /geo1/COP/builder1/null1\n\tfloat v_POLY_null1_val = v_POLY_smoothstep1_val;\n\t\n\t// /geo1/COP/builder1/floatToVec3_1\n\tvec3 v_POLY_floatToVec3_1_vec3 = vec3(v_POLY_null1_val, v_POLY_null1_val, v_POLY_null1_val);\n\t\n\t// /geo1/COP/builder1/add1\n\tvec3 v_POLY_add1_sum = (v_POLY_floatToVec3_1_vec3 + v_POLY_rotate2_val + vec3(0.0, 0.0, 0.0));\n\t\n\t// /geo1/COP/builder1/output1\n\tdiffuseColor.xyz = v_POLY_add1_sum;\n\n\n\n\n\tgl_FragColor = vec4( diffuseColor );\n}"}},"jsFunctionBodies":{}}
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}}},"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":-78.26087839166352,"y":-251.41304645718645},"zoom":1.0222221069335933},"history":{"2":{"position":{"x":-88.10665897762269,"y":238.8105050669565},"zoom":1.0222221069335933},"36":{"position":{"x":-78.26087839166352,"y":-251.41304645718645},"zoom":1.0222221069335933},"307":{"position":{"x":70.8695506537552,"y":-8.913038844376645},"zoom":1.0222221069335933},"980":{"position":{"x":-83.15218329114249,"y":-230.86956587937476},"zoom":1.0222221069335933},"1893":{"position":{"x":68.91302869396361,"y":-19.67390962323038},"zoom":1.0222221069335933},"1896":{"position":{"x":29.36292903411787,"y":-449.031053088791},"zoom":0.523222106933593}},"paramsDisplayed":false,"linkIndex":1}},"split_mode":"horizontal"},"currentNodes":["/geo1","/","/","/","/","/","/","/"],"navigationHistory":{"nodePaths":{"1":["/","/geo1","/geo1/COP","/geo1/COP/builder1","/geo1/COP","/geo1","/geo1/COP","/geo1"],"2":["/"],"3":["/"],"4":["/"],"5":["/"],"6":["/"],"7":["/"],"8":["/"]},"index":{"1":7,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0}},"fullscreenPanelId":null,"saveOptions":{"checkRemoteAssetsUse":true,"minimizeFilesCount":false},"paramsModal":[]}
Used nodes
cop/builder;event/cameraOrbitControls;mat/meshBasic;mat/meshBasicBuilder;obj/geo;rop/WebGLRenderer;sop/cameraControls;sop/cameraRenderer;sop/copNetwork;sop/material;sop/materialsNetwork;sop/perspectiveCamera;sop/planeHelper;sop/sphere
Used operations
Used modules
Used assemblers
GL_MESH_BASIC;GL_TEXTURE
Used integrations
[]
Used assets
Nodes map
{"/geo1":"obj/geo","/geo1/sphere1":"sop/sphere","/geo1/material1":"sop/material","/geo1/MAT":"sop/materialsNetwork","/geo1/MAT/meshBasicBuilder1":"mat/meshBasicBuilder","/geo1/MAT/meshBasic1":"mat/meshBasic","/geo1/COP":"sop/copNetwork","/geo1/COP/builder1":"cop/builder","/geo1/material2":"sop/material","/ground":"obj/geo","/ground/planeHelper1":"sop/planeHelper","/cameras":"obj/geo","/cameras/perspectiveCamera1":"sop/perspectiveCamera","/cameras/cameraControls1":"sop/cameraControls","/cameras/cameraControls1/cameraOrbitControls1":"event/cameraOrbitControls","/cameras/cameraRenderer1":"sop/cameraRenderer","/cameras/cameraRenderer1/WebGLRenderer1":"rop/WebGLRenderer"}
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.70"}},"root":{"type":"root","nodes":{"geo1":{"type":"geo","nodes":{"sphere1":{"type":"sphere","params":{"resolution":[100,100]}},"material1":{"type":"material","params":{"material":"../MAT/meshBasicBuilder1"},"inputs":["sphere1"],"flags":{"display":true}},"MAT":{"type":"materialsNetwork","nodes":{"meshBasicBuilder1":{"type":"meshBasicBuilder","nodes":{"globals1":{"type":"globals"},"output1":{"type":"output","inputs":[null,null,{"index":2,"inputName":"color","node":"add1","output":"sum"}]},"floatToVec3_4":{"type":"floatToVec3","params":{"x":{"raw_input":1,"overriden_options":{}},"y":{"overriden_options":{}},"z":{"overriden_options":{}}},"inputs":[null,{"index":1,"inputName":"y","node":"vec2ToFloat2","output":"y"},{"index":2,"inputName":"z","node":"vec2ToFloat2","output":"x"}]},"multAdd4":{"type":"multAdd","params":{"value":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"vector2","default_value":[1,1],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":[6.283185307179586,3.141592653589793]},"postAdd":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"globals1","output":"uv"}],"connection_points":{"in":[{"name":"value","type":"vec2"},{"name":"preAdd","type":"vec2"},{"name":"mult","type":"vec2"},{"name":"postAdd","type":"vec2"}],"out":[{"name":"val","type":"vec2"}]}},"polarToCartesian3":{"type":"polarToCartesian","params":{"polar":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"polar","node":"floatToVec3_4","output":"vec3"}]},"vec2ToFloat2":{"type":"vec2ToFloat","params":{"vec":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"vec","node":"multAdd4","output":"val"}]},"multAdd2":{"type":"multAdd","params":{"value":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"vector3","default_value":[1,1,1],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":[-1,-1,-1]},"postAdd":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"polarToCartesian3","output":"xyz"}],"connection_points":{"in":[{"name":"value","type":"vec3"},{"name":"preAdd","type":"vec3"},{"name":"mult","type":"vec3"},{"name":"postAdd","type":"vec3"}],"out":[{"name":"val","type":"vec3"}]}},"rotate1":{"type":"rotate","params":{"vector":{"type":"vector3","default_value":[0,0,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"axis":{"type":"vector3","default_value":[0,1,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"angle":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":1.5707963267948966}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"vector","node":"multAdd2","output":"val"}],"connection_points":{"in":[{"name":"vector","type":"vec3"},{"name":"axis","type":"vec3"},{"name":"angle","type":"float"}],"out":[{"name":"val","type":"vec3"}]}},"multAdd3":{"type":"multAdd","params":{"value":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"vector2","default_value":[1,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"postAdd":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"globals1","output":"uv"},null,{"index":2,"inputName":"mult","node":"floatToVec2_1","output":"vec2"}],"connection_points":{"in":[{"name":"value","type":"vec2"},{"name":"preAdd","type":"vec2"},{"name":"mult","type":"vec2"},{"name":"postAdd","type":"vec2"}],"out":[{"name":"val","type":"vec2"}]}},"round1":{"type":"round","params":{"in":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"in","node":"multAdd3","output":"val"}],"connection_points":{"in":[{"name":"in","type":"vec2"}],"out":[{"name":"val","type":"vec2"}]}},"floatToVec3_5":{"type":"floatToVec3","params":{"x":{"raw_input":1,"overriden_options":{}},"y":{"overriden_options":{}},"z":{"overriden_options":{}}},"inputs":[null,{"index":1,"inputName":"y","node":"vec2ToFloat3","output":"y"},{"index":2,"inputName":"z","node":"vec2ToFloat3","output":"x"}]},"multAdd5":{"type":"multAdd","params":{"value":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"vector2","default_value":[1,1],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":[6.283185307179586,3.141592653589793]},"postAdd":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"divide3","output":"divide"}],"connection_points":{"in":[{"name":"value","type":"vec2"},{"name":"preAdd","type":"vec2"},{"name":"mult","type":"vec2"},{"name":"postAdd","type":"vec2"}],"out":[{"name":"val","type":"vec2"}]}},"polarToCartesian4":{"type":"polarToCartesian","params":{"polar":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"polar","node":"floatToVec3_5","output":"vec3"}]},"vec2ToFloat3":{"type":"vec2ToFloat","params":{"vec":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"vec","node":"multAdd5","output":"val"}]},"multAdd6":{"type":"multAdd","params":{"value":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"vector3","default_value":[1,1,1],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":[-1,-1,-1]},"postAdd":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"polarToCartesian4","output":"xyz"}],"connection_points":{"in":[{"name":"value","type":"vec3"},{"name":"preAdd","type":"vec3"},{"name":"mult","type":"vec3"},{"name":"postAdd","type":"vec3"}],"out":[{"name":"val","type":"vec3"}]}},"rotate2":{"type":"rotate","params":{"vector":{"type":"vector3","default_value":[0,0,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"axis":{"type":"vector3","default_value":[0,1,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"angle":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":1.5707963267948966}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"vector","node":"multAdd6","output":"val"}],"connection_points":{"in":[{"name":"vector","type":"vec3"},{"name":"axis","type":"vec3"},{"name":"angle","type":"float"}],"out":[{"name":"val","type":"vec3"}]}},"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":"rotate1","output":"val"},{"index":1,"inputName":"sub1","node":"rotate2","output":"val"}],"connection_points":{"in":[{"name":"sub0","type":"vec3"},{"name":"sub1","type":"vec3"},{"name":"sub2","type":"vec3"}],"out":[{"name":"subtract","type":"vec3"}]}},"length1":{"type":"length","params":{"x":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"x","node":"subtract1","output":"subtract"}],"connection_points":{"in":[{"name":"x","type":"vec3"}],"out":[{"name":"val","type":"float"}]}},"smoothstep1":{"type":"smoothstep","params":{"edge0":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.05},"edge1":{"type":"float","default_value":1,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.11},"x":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"edge0","node":"constant3","output":"val"},{"index":1,"inputName":"edge1","node":"add2","output":"sum"},{"index":2,"inputName":"x","node":"multAdd7","output":"val"}],"connection_points":{"in":[{"name":"edge0","type":"float"},{"name":"edge1","type":"float"},{"name":"x","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":"null1","output":"val"},{"index":1,"inputName":"y","node":"null1","output":"val"},{"index":2,"inputName":"z","node":"null1","output":"val"}]},"null1":{"type":"null","params":{"in":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"in","node":"smoothstep1","output":"val"}],"connection_points":{"in":[{"name":"in","type":"float"}],"out":[{"name":"val","type":"float"}]}},"constant1":{"type":"constant","params":{"float":180},"connection_points":{"in":[],"out":[{"name":"val","type":"float"}]}},"constant2":{"type":"constant","params":{"float":90},"connection_points":{"in":[],"out":[{"name":"val","type":"float"}]}},"floatToVec2_1":{"type":"floatToVec2","params":{"x":{"overriden_options":{}},"y":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"x","node":"constant1","output":"val"},{"index":1,"inputName":"y","node":"constant2","output":"val"}]},"divide3":{"type":"divide","params":{"div0":{"type":"vector2","default_value":[1,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"div1":{"type":"vector2","default_value":[1,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"div2":{"type":"vector2","default_value":[1,1],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"div0","node":"round1","output":"val"},{"index":1,"inputName":"div1","node":"floatToVec2_1","output":"vec2"}],"connection_points":{"in":[{"name":"div0","type":"vec2"},{"name":"div1","type":"vec2"},{"name":"div2","type":"vec2"}],"out":[{"name":"divide","type":"vec2"}]}},"multAdd7":{"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":10},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"length1","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"}]}},"vec2ToVec3_1":{"type":"vec2ToVec3","params":{"vec2":{"overriden_options":{}},"z":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"vec2","node":"divide3","output":"divide"}]},"multAdd8":{"type":"multAdd","params":{"value":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"vector2","default_value":[1,1],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":[6.283185307179586,3.141592653589793]},"postAdd":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"globals1","output":"uv"}],"connection_points":{"in":[{"name":"value","type":"vec2"},{"name":"preAdd","type":"vec2"},{"name":"mult","type":"vec2"},{"name":"postAdd","type":"vec2"}],"out":[{"name":"val","type":"vec2"}]}},"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":"floatToVec3_1","output":"vec3"},{"index":1,"inputName":"add1","node":"rotate2","output":"val"}],"connection_points":{"in":[{"name":"add0","type":"vec3"},{"name":"add1","type":"vec3"},{"name":"add2","type":"vec3"}],"out":[{"name":"sum","type":"vec3"}]}},"constant3":{"type":"constant","params":{"float":0.05},"connection_points":{"in":[],"out":[{"name":"val","type":"float"}]}},"constant4":{"type":"constant","params":{"float":0.01},"connection_points":{"in":[],"out":[{"name":"val","type":"float"}]}},"add2":{"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":"constant3","output":"val"},{"index":1,"inputName":"add1","node":"constant4","output":"val"}],"connection_points":{"in":[{"name":"add0","type":"float"},{"name":"add1","type":"float"},{"name":"add2","type":"float"}],"out":[{"name":"sum","type":"float"}]}}},"persisted_config":{"material":{"metadata":{"version":4.6,"type":"Material","generator":"Material.toJSON"},"uuid":"/geo1/MAT/meshBasicBuilder1-main","type":"MeshBasicMaterial","color":16777215,"reflectivity":1,"refractionRatio":0.98,"blendColor":0,"fog":false},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[],"timeDependent":false,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false},"customMaterials":{"customDepthMaterial":{"material":{"metadata":{"version":4.6,"type":"Material","generator":"Material.toJSON"},"uuid":"/geo1/MAT/meshBasicBuilder1-customDepthMaterial","type":"MeshDepthMaterial","name":"customDepthMaterial","blendColor":0,"depthPacking":3201},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[],"timeDependent":false,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false}},"customDistanceMaterial":{"material":{"metadata":{"version":4.6,"type":"Material","generator":"Material.toJSON"},"uuid":"/geo1/MAT/meshBasicBuilder1-customDistanceMaterial","type":"MeshDistanceMaterial","name":"customDistanceMaterial","blendColor":0},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[],"timeDependent":false,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false}},"customDepthDOFMaterial":{"material":{"metadata":{"version":4.6,"type":"Material","generator":"Material.toJSON"},"uuid":"/geo1/MAT/meshBasicBuilder1-customDepthDOFMaterial","type":"MeshDepthMaterial","name":"customDepthDOFMaterial","blendColor":0,"depthPacking":3200},"onBeforeCompileDataJSONWithoutShaders":{"paramConfigs":[],"timeDependent":false,"resolutionDependent":false,"raymarchingLightsWorldCoordsDependent":false}}}}},"meshBasic1":{"type":"meshBasic","params":{"useMap":true,"map":"../../COP/builder1"}}}},"COP":{"type":"copNetwork","nodes":{"builder1":{"type":"builder","nodes":{"globals1":{"type":"globals"},"output1":{"type":"output","inputs":[{"index":0,"inputName":"color","node":"add1","output":"sum"}]},"floatToVec3_4":{"type":"floatToVec3","params":{"x":{"raw_input":1,"overriden_options":{}},"y":{"overriden_options":{}},"z":{"overriden_options":{}}},"inputs":[null,{"index":1,"inputName":"y","node":"vec2ToFloat2","output":"y"},{"index":2,"inputName":"z","node":"vec2ToFloat2","output":"x"}]},"multAdd4":{"type":"multAdd","params":{"value":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"vector2","default_value":[1,1],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":[6.283185307179586,3.141592653589793]},"postAdd":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"globals1","output":"uv"}],"connection_points":{"in":[{"name":"value","type":"vec2"},{"name":"preAdd","type":"vec2"},{"name":"mult","type":"vec2"},{"name":"postAdd","type":"vec2"}],"out":[{"name":"val","type":"vec2"}]}},"polarToCartesian3":{"type":"polarToCartesian","params":{"polar":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"polar","node":"floatToVec3_4","output":"vec3"}]},"vec2ToFloat2":{"type":"vec2ToFloat","params":{"vec":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"vec","node":"multAdd4","output":"val"}]},"multAdd2":{"type":"multAdd","params":{"value":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"vector3","default_value":[1,1,1],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":[-1,-1,-1]},"postAdd":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"polarToCartesian3","output":"xyz"}],"connection_points":{"in":[{"name":"value","type":"vec3"},{"name":"preAdd","type":"vec3"},{"name":"mult","type":"vec3"},{"name":"postAdd","type":"vec3"}],"out":[{"name":"val","type":"vec3"}]}},"rotate1":{"type":"rotate","params":{"vector":{"type":"vector3","default_value":[0,0,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"axis":{"type":"vector3","default_value":[0,1,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"angle":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":1.5707963267948966}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"vector","node":"multAdd2","output":"val"}],"connection_points":{"in":[{"name":"vector","type":"vec3"},{"name":"axis","type":"vec3"},{"name":"angle","type":"float"}],"out":[{"name":"val","type":"vec3"}]}},"multAdd3":{"type":"multAdd","params":{"value":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"vector2","default_value":[1,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"postAdd":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"globals1","output":"uv"},null,{"index":2,"inputName":"mult","node":"floatToVec2_1","output":"vec2"}],"connection_points":{"in":[{"name":"value","type":"vec2"},{"name":"preAdd","type":"vec2"},{"name":"mult","type":"vec2"},{"name":"postAdd","type":"vec2"}],"out":[{"name":"val","type":"vec2"}]}},"round1":{"type":"round","params":{"in":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"in","node":"multAdd3","output":"val"}],"connection_points":{"in":[{"name":"in","type":"vec2"}],"out":[{"name":"val","type":"vec2"}]}},"floatToVec3_5":{"type":"floatToVec3","params":{"x":{"raw_input":1,"overriden_options":{}},"y":{"overriden_options":{}},"z":{"overriden_options":{}}},"inputs":[null,{"index":1,"inputName":"y","node":"vec2ToFloat3","output":"y"},{"index":2,"inputName":"z","node":"vec2ToFloat3","output":"x"}]},"multAdd5":{"type":"multAdd","params":{"value":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"vector2","default_value":[1,1],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":[6.283185307179586,3.141592653589793]},"postAdd":{"type":"vector2","default_value":[0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"divide3","output":"divide"}],"connection_points":{"in":[{"name":"value","type":"vec2"},{"name":"preAdd","type":"vec2"},{"name":"mult","type":"vec2"},{"name":"postAdd","type":"vec2"}],"out":[{"name":"val","type":"vec2"}]}},"polarToCartesian4":{"type":"polarToCartesian","params":{"polar":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"polar","node":"floatToVec3_5","output":"vec3"}]},"vec2ToFloat3":{"type":"vec2ToFloat","params":{"vec":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"vec","node":"multAdd5","output":"val"}]},"multAdd6":{"type":"multAdd","params":{"value":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"preAdd":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"mult":{"type":"vector3","default_value":[1,1,1],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":[-1,-1,-1]},"postAdd":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"polarToCartesian4","output":"xyz"}],"connection_points":{"in":[{"name":"value","type":"vec3"},{"name":"preAdd","type":"vec3"},{"name":"mult","type":"vec3"},{"name":"postAdd","type":"vec3"}],"out":[{"name":"val","type":"vec3"}]}},"rotate2":{"type":"rotate","params":{"vector":{"type":"vector3","default_value":[0,0,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"axis":{"type":"vector3","default_value":[0,1,0],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}},"angle":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":1.5707963267948966}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"vector","node":"multAdd6","output":"val"}],"connection_points":{"in":[{"name":"vector","type":"vec3"},{"name":"axis","type":"vec3"},{"name":"angle","type":"float"}],"out":[{"name":"val","type":"vec3"}]}},"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":"rotate1","output":"val"},{"index":1,"inputName":"sub1","node":"rotate2","output":"val"}],"connection_points":{"in":[{"name":"sub0","type":"vec3"},{"name":"sub1","type":"vec3"},{"name":"sub2","type":"vec3"}],"out":[{"name":"subtract","type":"vec3"}]}},"length1":{"type":"length","params":{"x":{"type":"vector3","default_value":[0,0,0],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"x","node":"subtract1","output":"subtract"}],"connection_points":{"in":[{"name":"x","type":"vec3"}],"out":[{"name":"val","type":"float"}]}},"smoothstep1":{"type":"smoothstep","params":{"edge0":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.1},"edge1":{"type":"float","default_value":1,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false},"raw_input":0.11},"x":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"edge0","node":"constant3","output":"val"},{"index":1,"inputName":"edge1","node":"add2","output":"sum"},{"index":2,"inputName":"x","node":"multAdd7","output":"val"}],"connection_points":{"in":[{"name":"edge0","type":"float"},{"name":"edge1","type":"float"},{"name":"x","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":"null1","output":"val"},{"index":1,"inputName":"y","node":"null1","output":"val"},{"index":2,"inputName":"z","node":"null1","output":"val"}]},"null1":{"type":"null","params":{"in":{"type":"float","default_value":0,"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"in","node":"smoothstep1","output":"val"}],"connection_points":{"in":[{"name":"in","type":"float"}],"out":[{"name":"val","type":"float"}]}},"constant1":{"type":"constant","params":{"float":180},"connection_points":{"in":[],"out":[{"name":"val","type":"float"}]}},"constant2":{"type":"constant","params":{"float":90},"connection_points":{"in":[],"out":[{"name":"val","type":"float"}]}},"floatToVec2_1":{"type":"floatToVec2","params":{"x":{"overriden_options":{}},"y":{"overriden_options":{}}},"inputs":[{"index":0,"inputName":"x","node":"constant1","output":"val"},{"index":1,"inputName":"y","node":"constant2","output":"val"}]},"divide3":{"type":"divide","params":{"div0":{"type":"vector2","default_value":[1,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"div1":{"type":"vector2","default_value":[1,1],"options":{"spare":true,"editable":false,"computeOnDirty":true,"dependentOnFoundParam":false}},"div2":{"type":"vector2","default_value":[1,1],"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"maxInputsCount":3,"inputs":[{"index":0,"inputName":"div0","node":"round1","output":"val"},{"index":1,"inputName":"div1","node":"floatToVec2_1","output":"vec2"}],"connection_points":{"in":[{"name":"div0","type":"vec2"},{"name":"div1","type":"vec2"},{"name":"div2","type":"vec2"}],"out":[{"name":"divide","type":"vec2"}]}},"multAdd7":{"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":10},"postAdd":{"type":"float","default_value":0,"options":{"spare":true,"editable":true,"computeOnDirty":true,"dependentOnFoundParam":false}}},"inputs":[{"index":0,"inputName":"value","node":"length1","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"}]}},"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":"floatToVec3_1","output":"vec3"},{"index":1,"inputName":"add1","node":"rotate2","output":"val"}],"connection_points":{"in":[{"name":"add0","type":"vec3"},{"name":"add1","type":"vec3"},{"name":"add2","type":"vec3"}],"out":[{"name":"sum","type":"vec3"}]}},"constant3":{"type":"constant","params":{"float":0.05},"connection_points":{"in":[],"out":[{"name":"val","type":"float"}]}},"constant4":{"type":"constant","params":{"float":0.01},"connection_points":{"in":[],"out":[{"name":"val","type":"float"}]}},"add2":{"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":"constant3","output":"val"},{"index":1,"inputName":"add1","node":"constant4","output":"val"}],"connection_points":{"in":[{"name":"add0","type":"float"},{"name":"add1","type":"float"},{"name":"add2","type":"float"}],"out":[{"name":"sum","type":"float"}]}}},"params":{"resolution":[4096,4096]},"persisted_config":{"uniforms":{"resolution":{"value":{"x":4096,"y":4096}}},"param_uniform_pairs":[],"uniforms_time_dependent":false,"uniforms_resolution_dependent":false}}}},"material2":{"type":"material","params":{"material":"../MAT/meshBasic1"},"inputs":["sphere1"]}},"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}},"ground":{"type":"geo","nodes":{"planeHelper1":{"type":"planeHelper","flags":{"display":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}},"cameras":{"type":"geo","nodes":{"perspectiveCamera1":{"type":"perspectiveCamera","params":{"position":[3.3,3.3,3.3]}},"cameraControls1":{"type":"cameraControls","nodes":{"cameraOrbitControls1":{"type":"cameraOrbitControls","params":{"target":[0.019526651293194308,0.0887939817284823,0.3874356273319757]}}},"params":{"node":"cameraOrbitControls1"},"inputs":["perspectiveCamera1"]},"cameraRenderer1":{"type":"cameraRenderer","nodes":{"WebGLRenderer1":{"type":"WebGLRenderer","params":{"toneMapping":1,"outputColorSpace":"srgb-linear"}}},"params":{"node":"WebGLRenderer1"},"inputs":["cameraControls1"],"flags":{"display":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}}},"params":{"mainCameraPath":"/cameras/cameras:sopGroup/perspectiveCamera1"}},"ui":{"nodes":{"geo1":{"pos":[-50,-250],"nodes":{"sphere1":{"pos":[0,50]},"material1":{"pos":[0,250]},"MAT":{"pos":[-200,250],"nodes":{"meshBasicBuilder1":{"pos":[-50,50],"selection":["constant3","constant4","add2"],"nodes":{"globals1":{"pos":[-1300,-50]},"output1":{"pos":[1550,-100]},"floatToVec3_4":{"pos":[-300,-100]},"multAdd4":{"pos":[-550,-100]},"polarToCartesian3":{"pos":[-150,-100]},"vec2ToFloat2":{"pos":[-450,-100]},"multAdd2":{"pos":[0,-100]},"rotate1":{"pos":[150,-100]},"multAdd3":{"pos":[-800,200]},"round1":{"pos":[-650,200]},"floatToVec3_5":{"pos":[0,350]},"multAdd5":{"pos":[-250,350]},"polarToCartesian4":{"pos":[150,350]},"vec2ToFloat3":{"pos":[-150,350]},"multAdd6":{"pos":[300,350]},"rotate2":{"pos":[450,350]},"subtract1":{"pos":[550,100]},"length1":{"pos":[700,100]},"smoothstep1":{"pos":[1000,100]},"floatToVec3_1":{"pos":[1400,100]},"null1":{"pos":[1200,0]},"constant1":{"pos":[-1050,400]},"constant2":{"pos":[-1050,500]},"floatToVec2_1":{"pos":[-900,450]},"divide3":{"pos":[-400,350]},"multAdd7":{"pos":[850,150]},"vec2ToVec3_1":{"pos":[50,150]},"multAdd8":{"pos":[-350,100]},"add1":{"pos":[1500,250]},"constant3":{"pos":[650,-200]},"constant4":{"pos":[650,-100]},"add2":{"pos":[800,0]}}},"meshBasic1":{"pos":[-50,150]}}},"COP":{"pos":[-200,400],"selection":["builder1"],"nodes":{"builder1":{"pos":[-200,50],"nodes":{"globals1":{"pos":[-1350,200]},"output1":{"pos":[1350,550]},"floatToVec3_4":{"pos":[-600,200]},"multAdd4":{"pos":[-850,200]},"polarToCartesian3":{"pos":[-450,200]},"vec2ToFloat2":{"pos":[-750,200]},"multAdd2":{"pos":[-300,200]},"rotate1":{"pos":[-150,200]},"multAdd3":{"pos":[-1100,500]},"round1":{"pos":[-950,500]},"floatToVec3_5":{"pos":[-300,650]},"multAdd5":{"pos":[-550,650]},"polarToCartesian4":{"pos":[-150,650]},"vec2ToFloat3":{"pos":[-450,650]},"multAdd6":{"pos":[0,650]},"rotate2":{"pos":[150,650]},"subtract1":{"pos":[250,400]},"length1":{"pos":[400,400]},"smoothstep1":{"pos":[700,400]},"floatToVec3_1":{"pos":[1100,400]},"null1":{"pos":[900,300]},"constant1":{"pos":[-1400,700]},"constant2":{"pos":[-1400,800]},"floatToVec2_1":{"pos":[-1250,750]},"divide3":{"pos":[-700,650]},"multAdd7":{"pos":[550,450]},"add1":{"pos":[1200,550]},"constant3":{"pos":[400,50]},"constant4":{"pos":[400,150]},"add2":{"pos":[550,250]}}}}},"material2":{"pos":[200,250]}}},"ground":{"pos":[-50,-350],"nodes":{"planeHelper1":{"pos":[-150,250]}}},"cameras":{"pos":[-50,-50],"nodes":{"perspectiveCamera1":{"pos":[0,-50]},"cameraControls1":{"pos":[0,150],"nodes":{"cameraOrbitControls1":{"pos":[0,0]}}},"cameraRenderer1":{"pos":[0,300],"nodes":{"WebGLRenderer1":{"pos":[0,0]}}}}}}},"shaders":{"/geo1/MAT/meshBasicBuilder1":{"vertex":"#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n\n\n\n// /geo1/MAT/meshBasicBuilder1/globals1\nvarying vec2 v_POLY_globals1_uv;\n\n\n\n\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// /geo1/MAT/meshBasicBuilder1/globals1\n\tv_POLY_globals1_uv = vec2(uv);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/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\t#include <batching_vertex>\n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n// removed:\n//\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinbase_vertex>\n\t\t#include <skinnormal_vertex>\n\t\t#include <defaultnormal_vertex>\n\t#endif\n// removed:\n//\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}","fragment":"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n\n\n\n// /geo1/MAT/meshBasicBuilder1/polarToCartesian3\nvec3 cartesianToPolar(vec3 w){\n\tfloat wr = sqrt(dot(w,w));\n\tfloat wo = acos(w.y/wr);\n\tfloat wi = atan(w.x,w.z);\n\treturn vec3(wr,wo,wi);\n}\nvec3 polarToCartesian(vec3 p){\n\tfloat x = p.x * sin(p.y)*sin(p.z);\n\tfloat y = p.x * cos(p.y);\n\tfloat z = p.x * sin(p.y)*cos(p.z);\n\treturn vec3(x,y,z);\n}\n\n// /geo1/MAT/meshBasicBuilder1/rotate1\n\n\n// https://stackoverflow.com/questions/23793698/how-to-implement-slerp-in-glsl-hlsl\n// vec4 quatSlerp(vec4 p0, vec4 p1, float t)\n// {\n// \tfloat dotp = dot(normalize(p0), normalize(p1));\n// \tif ((dotp > 0.9999) || (dotp < -0.9999))\n// \t{\n// \t\tif (t<=0.5)\n// \t\t\treturn p0;\n// \t\treturn p1;\n// \t}\n// \tfloat theta = acos(dotp);\n// \tvec4 P = ((p0*sin((1.0-t)*theta) + p1*sin(t*theta)) / sin(theta));\n// \tP.w = 1.0;\n// \treturn P;\n// }\n\n// https://devcry.heiho.net/html/2017/20170521-slerp.html\n// float lerp(float a, float b, float t) {\n// \treturn (1.0 - t) * a + t * b;\n// }\n// vec4 quatSlerp(vec4 p0, vec4 p1, float t){\n// \tvec4 qb = p1;\n\n// \t// cos(a) = dot product\n// \tfloat cos_a = p0.x * qb.x + p0.y * qb.y + p0.z * qb.z + p0.w * qb.w;\n// \tif (cos_a < 0.0f) {\n// \t\tcos_a = -cos_a;\n// \t\tqb = -qb;\n// \t}\n\n// \t// close to zero, cos(a) ~= 1\n// \t// do linear interpolation\n// \tif (cos_a > 0.999) {\n// \t\treturn vec4(\n// \t\t\tlerp(p0.x, qb.x, t),\n// \t\t\tlerp(p0.y, qb.y, t),\n// \t\t\tlerp(p0.z, qb.z, t),\n// \t\t\tlerp(p0.w, qb.w, t)\n// \t\t);\n// \t}\n\n// \tfloat alpha = acos(cos_a);\n// \treturn (p0 * sin(1.0 - t) + p1 * sin(t * alpha)) / sin(alpha);\n// }\n\n// https://stackoverflow.com/questions/62943083/interpolate-between-two-quaternions-the-long-way\nvec4 quatSlerp(vec4 q1, vec4 q2, float t){\n\tfloat angle = acos(dot(q1, q2));\n\tfloat denom = sin(angle);\n\t//check if denom is zero\n\treturn (q1*sin((1.0-t)*angle)+q2*sin(t*angle))/denom;\n}\n// TO CHECK:\n// this page https://www.reddit.com/r/opengl/comments/704la7/glsl_quaternion_library/\n// has a link to a potentially nice pdf:\n// http://web.mit.edu/2.998/www/QuaternionReport1.pdf\n\n// https://github.com/mattatz/ShibuyaCrowd/blob/master/source/shaders/common/quaternion.glsl\nvec4 quatMult(vec4 q1, vec4 q2)\n{\n\treturn vec4(\n\tq1.w * q2.x + q1.x * q2.w + q1.z * q2.y - q1.y * q2.z,\n\tq1.w * q2.y + q1.y * q2.w + q1.x * q2.z - q1.z * q2.x,\n\tq1.w * q2.z + q1.z * q2.w + q1.y * q2.x - q1.x * q2.y,\n\tq1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z\n\t);\n}\n// http://glmatrix.net/docs/quat.js.html#line97\n// let ax = a[0], ay = a[1], az = a[2], aw = a[3];\n\n// let bx = b[0], by = b[1], bz = b[2], bw = b[3];\n\n// out[0] = ax * bw + aw * bx + ay * bz - az * by;\n\n// out[1] = ay * bw + aw * by + az * bx - ax * bz;\n\n// out[2] = az * bw + aw * bz + ax * by - ay * bx;\n\n// out[3] = aw * bw - ax * bx - ay * by - az * bz;\n\n// return out\n\n\n\n// http://www.neilmendoza.com/glsl-rotation-about-an-arbitrary-axis/\nmat4 rotationMatrix(vec3 axis, float angle)\n{\n\taxis = normalize(axis);\n\tfloat s = sin(angle);\n\tfloat c = cos(angle);\n\tfloat oc = 1.0 - c;\n\n \treturn mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0.0, oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0.0, oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0.0, 0.0, 0.0, 0.0, 1.0);\n}\n\n// https://www.geeks3d.com/20141201/how-to-rotate-a-vertex-by-a-quaternion-in-glsl/\nvec4 quatFromAxisAngle(vec3 axis, float angle)\n{\n\tvec4 qr;\n\tfloat half_angle = (angle * 0.5); // * 3.14159 / 180.0;\n\tfloat sin_half_angle = sin(half_angle);\n\tqr.x = axis.x * sin_half_angle;\n\tqr.y = axis.y * sin_half_angle;\n\tqr.z = axis.z * sin_half_angle;\n\tqr.w = cos(half_angle);\n\treturn qr;\n}\nvec3 rotateWithAxisAngle(vec3 position, vec3 axis, float angle)\n{\n\tvec4 q = quatFromAxisAngle(axis, angle);\n\tvec3 v = position.xyz;\n\treturn v + 2.0 * cross(q.xyz, cross(q.xyz, v) + q.w * v);\n}\n// vec3 applyQuaternionToVector( vec4 q, vec3 v ){\n// \treturn v + 2.0 * cross( q.xyz, cross( q.xyz, v ) + q.w * v );\n// }\nvec3 rotateWithQuat( vec3 v, vec4 q )\n{\n\t// vec4 qv = multQuat( quat, vec4(vec, 0.0) );\n\t// return multQuat( qv, vec4(-quat.x, -quat.y, -quat.z, quat.w) ).xyz;\n\treturn v + 2.0 * cross( q.xyz, cross( q.xyz, v ) + q.w * v );\n}\n// https://github.com/glslify/glsl-look-at/blob/gh-pages/index.glsl\n// mat3 rotation_matrix(vec3 origin, vec3 target, float roll) {\n// \tvec3 rr = vec3(sin(roll), cos(roll), 0.0);\n// \tvec3 ww = normalize(target - origin);\n// \tvec3 uu = normalize(cross(ww, rr));\n// \tvec3 vv = normalize(cross(uu, ww));\n\n// \treturn mat3(uu, vv, ww);\n// }\n// mat3 rotation_matrix(vec3 target, float roll) {\n// \tvec3 rr = vec3(sin(roll), cos(roll), 0.0);\n// \tvec3 ww = normalize(target);\n// \tvec3 uu = normalize(cross(ww, rr));\n// \tvec3 vv = normalize(cross(uu, ww));\n\n// \treturn mat3(uu, vv, ww);\n// }\n\nfloat vectorAngle(vec3 start, vec3 dest){\n\tstart = normalize(start);\n\tdest = normalize(dest);\n\n\tfloat cosTheta = dot(start, dest);\n\tvec3 c1 = cross(start, dest);\n\t// We use the dot product of the cross with the Y axis.\n\t// This is a little arbitrary, but can still give a good sense of direction\n\tvec3 y_axis = vec3(0.0, 1.0, 0.0);\n\tfloat d1 = dot(c1, y_axis);\n\tfloat angle = acos(cosTheta) * sign(d1);\n\treturn angle;\n}\n\n// http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/#i-need-an-equivalent-of-glulookat-how-do-i-orient-an-object-towards-a-point-\nvec4 vectorAlign(vec3 start, vec3 dest){\n\tstart = normalize(start);\n\tdest = normalize(dest);\n\n\tfloat cosTheta = dot(start, dest);\n\tvec3 axis;\n\n\t// if (cosTheta < -1 + 0.001f){\n\t// \t// special case when vectors in opposite directions:\n\t// \t// there is no ideal rotation axis\n\t// \t// So guess one; any will do as long as it's perpendicular to start\n\t// \taxis = cross(vec3(0.0f, 0.0f, 1.0f), start);\n\t// \tif (length2(axis) < 0.01 ) // bad luck, they were parallel, try again!\n\t// \t\taxis = cross(vec3(1.0f, 0.0f, 0.0f), start);\n\n\t// \taxis = normalize(axis);\n\t// \treturn gtx::quaternion::angleAxis(glm::radians(180.0f), axis);\n\t// }\n\tif(cosTheta > (1.0 - 0.0001) || cosTheta < (-1.0 + 0.0001) ){\n\t\taxis = normalize(cross(start, vec3(0.0, 1.0, 0.0)));\n\t\tif (length(axis) < 0.001 ){ // bad luck, they were parallel, try again!\n\t\t\taxis = normalize(cross(start, vec3(1.0, 0.0, 0.0)));\n\t\t}\n\t} else {\n\t\taxis = normalize(cross(start, dest));\n\t}\n\n\tfloat angle = acos(cosTheta);\n\n\treturn quatFromAxisAngle(axis, angle);\n}\nvec4 vectorAlignWithUp(vec3 start, vec3 dest, vec3 up){\n\tvec4 rot1 = vectorAlign(start, dest);\n\tup = normalize(up);\n\n\t// Recompute desiredUp so that it's perpendicular to the direction\n\t// You can skip that part if you really want to force desiredUp\n\t// vec3 right = normalize(cross(dest, up));\n\t// up = normalize(cross(right, dest));\n\n\t// Because of the 1rst rotation, the up is probably completely screwed up.\n\t// Find the rotation between the up of the rotated object, and the desired up\n\tvec3 newUp = rotateWithQuat(vec3(0.0, 1.0, 0.0), rot1);//rot1 * vec3(0.0, 1.0, 0.0);\n\tvec4 rot2 = vectorAlign(up, newUp);\n\n\t// return rot1;\n\treturn rot2;\n\t// return multQuat(rot1, rot2);\n\t// return rot2 * rot1;\n\n}\n\n// https://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\nfloat quatToAngle(vec4 q){\n\treturn 2.0 * acos(q.w);\n}\nvec3 quatToAxis(vec4 q){\n\treturn vec3(\n\t\tq.x / sqrt(1.0-q.w*q.w),\n\t\tq.y / sqrt(1.0-q.w*q.w),\n\t\tq.z / sqrt(1.0-q.w*q.w)\n\t);\n}\n\nvec4 align(vec3 dir, vec3 up){\n\tvec3 start_dir = vec3(0.0, 0.0, 1.0);\n\tvec3 start_up = vec3(0.0, 1.0, 0.0);\n\tvec4 rot1 = vectorAlign(start_dir, dir);\n\tup = normalize(up);\n\n\t// Recompute desiredUp so that it's perpendicular to the direction\n\t// You can skip that part if you really want to force desiredUp\n\tvec3 right = normalize(cross(dir, up));\n\tif(length(right)<0.001){\n\t\tright = vec3(1.0, 0.0, 0.0);\n\t}\n\tup = normalize(cross(right, dir));\n\n\t// Because of the 1rst rotation, the up is probably completely screwed up.\n\t// Find the rotation between the up of the rotated object, and the desired up\n\tvec3 newUp = rotateWithQuat(start_up, rot1);//rot1 * vec3(0.0, 1.0, 0.0);\n\tvec4 rot2 = vectorAlign(normalize(newUp), up);\n\n\t// return rot1;\n\treturn quatMult(rot1, rot2);\n\t// return rot2 * rot1;\n\n}\n\n\n\n\n\n\n\n// /geo1/MAT/meshBasicBuilder1/globals1\nvarying vec2 v_POLY_globals1_uv;\n\n\n\n\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 <alphahash_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\n\n\t// /geo1/MAT/meshBasicBuilder1/constant3\n\tfloat v_POLY_constant3_val = 0.05;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/constant4\n\tfloat v_POLY_constant4_val = 0.01;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/constant1\n\tfloat v_POLY_constant1_val = 180.0;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/constant2\n\tfloat v_POLY_constant2_val = 90.0;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/add2\n\tfloat v_POLY_add2_sum = (v_POLY_constant3_val + v_POLY_constant4_val + 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd4\n\tvec2 v_POLY_multAdd4_val = (vec2(6.283185307179586, 3.141592653589793)*(v_POLY_globals1_uv + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec2_1\n\tvec2 v_POLY_floatToVec2_1_vec2 = vec2(v_POLY_constant1_val, v_POLY_constant2_val);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/vec2ToFloat2\n\tfloat v_POLY_vec2ToFloat2_y = v_POLY_multAdd4_val.y;\n\tfloat v_POLY_vec2ToFloat2_x = v_POLY_multAdd4_val.x;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd3\n\tvec2 v_POLY_multAdd3_val = (v_POLY_floatToVec2_1_vec2*(v_POLY_globals1_uv + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec3_4\n\tvec3 v_POLY_floatToVec3_4_vec3 = vec3(1.0, v_POLY_vec2ToFloat2_y, v_POLY_vec2ToFloat2_x);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/round1\n\tvec2 v_POLY_round1_val = vec2(sign(v_POLY_multAdd3_val.x)*floor(abs(v_POLY_multAdd3_val.x)+0.5),sign(v_POLY_multAdd3_val.y)*floor(abs(v_POLY_multAdd3_val.y)+0.5));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/polarToCartesian3\n\tvec3 v_POLY_polarToCartesian3_xyz = polarToCartesian(v_POLY_floatToVec3_4_vec3);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/divide3\n\tvec2 v_POLY_divide3_divide = (v_POLY_round1_val / v_POLY_floatToVec2_1_vec2 / vec2(1.0, 1.0));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd2\n\tvec3 v_POLY_multAdd2_val = (vec3(-1.0, -1.0, -1.0)*(v_POLY_polarToCartesian3_xyz + vec3(0.0, 0.0, 0.0))) + vec3(0.0, 0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd5\n\tvec2 v_POLY_multAdd5_val = (vec2(6.283185307179586, 3.141592653589793)*(v_POLY_divide3_divide + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/rotate1\n\tvec3 v_POLY_rotate1_val = rotateWithAxisAngle(v_POLY_multAdd2_val, vec3(0.0, 1.0, 0.0), 1.5707963267948966);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/vec2ToFloat3\n\tfloat v_POLY_vec2ToFloat3_y = v_POLY_multAdd5_val.y;\n\tfloat v_POLY_vec2ToFloat3_x = v_POLY_multAdd5_val.x;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec3_5\n\tvec3 v_POLY_floatToVec3_5_vec3 = vec3(1.0, v_POLY_vec2ToFloat3_y, v_POLY_vec2ToFloat3_x);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/polarToCartesian4\n\tvec3 v_POLY_polarToCartesian4_xyz = polarToCartesian(v_POLY_floatToVec3_5_vec3);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd6\n\tvec3 v_POLY_multAdd6_val = (vec3(-1.0, -1.0, -1.0)*(v_POLY_polarToCartesian4_xyz + vec3(0.0, 0.0, 0.0))) + vec3(0.0, 0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/rotate2\n\tvec3 v_POLY_rotate2_val = rotateWithAxisAngle(v_POLY_multAdd6_val, vec3(0.0, 1.0, 0.0), 1.5707963267948966);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/subtract1\n\tvec3 v_POLY_subtract1_subtract = (v_POLY_rotate1_val - v_POLY_rotate2_val - vec3(0.0, 0.0, 0.0));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/length1\n\tfloat v_POLY_length1_val = length(v_POLY_subtract1_subtract);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd7\n\tfloat v_POLY_multAdd7_val = (10.0*(v_POLY_length1_val + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/smoothstep1\n\tfloat v_POLY_smoothstep1_val = smoothstep(v_POLY_constant3_val, v_POLY_add2_sum, v_POLY_multAdd7_val);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/null1\n\tfloat v_POLY_null1_val = v_POLY_smoothstep1_val;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec3_1\n\tvec3 v_POLY_floatToVec3_1_vec3 = vec3(v_POLY_null1_val, v_POLY_null1_val, v_POLY_null1_val);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/add1\n\tvec3 v_POLY_add1_sum = (v_POLY_floatToVec3_1_vec3 + v_POLY_rotate2_val + vec3(0.0, 0.0, 0.0));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/output1\n\tdiffuseColor.xyz = v_POLY_add1_sum;\n\n\n\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\t#include <alphahash_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <envmap_fragment>\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}","customDepthMaterial.vertex":"#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n\n\n\n// /geo1/MAT/meshBasicBuilder1/globals1\nvarying vec2 v_POLY_globals1_uv;\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 <batching_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// /geo1/MAT/meshBasicBuilder1/globals1\n\tv_POLY_globals1_uv = vec2(uv);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/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// /geo1/MAT/meshBasicBuilder1/polarToCartesian3\nvec3 cartesianToPolar(vec3 w){\n\tfloat wr = sqrt(dot(w,w));\n\tfloat wo = acos(w.y/wr);\n\tfloat wi = atan(w.x,w.z);\n\treturn vec3(wr,wo,wi);\n}\nvec3 polarToCartesian(vec3 p){\n\tfloat x = p.x * sin(p.y)*sin(p.z);\n\tfloat y = p.x * cos(p.y);\n\tfloat z = p.x * sin(p.y)*cos(p.z);\n\treturn vec3(x,y,z);\n}\n\n// /geo1/MAT/meshBasicBuilder1/rotate1\n\n\n// https://stackoverflow.com/questions/23793698/how-to-implement-slerp-in-glsl-hlsl\n// vec4 quatSlerp(vec4 p0, vec4 p1, float t)\n// {\n// \tfloat dotp = dot(normalize(p0), normalize(p1));\n// \tif ((dotp > 0.9999) || (dotp < -0.9999))\n// \t{\n// \t\tif (t<=0.5)\n// \t\t\treturn p0;\n// \t\treturn p1;\n// \t}\n// \tfloat theta = acos(dotp);\n// \tvec4 P = ((p0*sin((1.0-t)*theta) + p1*sin(t*theta)) / sin(theta));\n// \tP.w = 1.0;\n// \treturn P;\n// }\n\n// https://devcry.heiho.net/html/2017/20170521-slerp.html\n// float lerp(float a, float b, float t) {\n// \treturn (1.0 - t) * a + t * b;\n// }\n// vec4 quatSlerp(vec4 p0, vec4 p1, float t){\n// \tvec4 qb = p1;\n\n// \t// cos(a) = dot product\n// \tfloat cos_a = p0.x * qb.x + p0.y * qb.y + p0.z * qb.z + p0.w * qb.w;\n// \tif (cos_a < 0.0f) {\n// \t\tcos_a = -cos_a;\n// \t\tqb = -qb;\n// \t}\n\n// \t// close to zero, cos(a) ~= 1\n// \t// do linear interpolation\n// \tif (cos_a > 0.999) {\n// \t\treturn vec4(\n// \t\t\tlerp(p0.x, qb.x, t),\n// \t\t\tlerp(p0.y, qb.y, t),\n// \t\t\tlerp(p0.z, qb.z, t),\n// \t\t\tlerp(p0.w, qb.w, t)\n// \t\t);\n// \t}\n\n// \tfloat alpha = acos(cos_a);\n// \treturn (p0 * sin(1.0 - t) + p1 * sin(t * alpha)) / sin(alpha);\n// }\n\n// https://stackoverflow.com/questions/62943083/interpolate-between-two-quaternions-the-long-way\nvec4 quatSlerp(vec4 q1, vec4 q2, float t){\n\tfloat angle = acos(dot(q1, q2));\n\tfloat denom = sin(angle);\n\t//check if denom is zero\n\treturn (q1*sin((1.0-t)*angle)+q2*sin(t*angle))/denom;\n}\n// TO CHECK:\n// this page https://www.reddit.com/r/opengl/comments/704la7/glsl_quaternion_library/\n// has a link to a potentially nice pdf:\n// http://web.mit.edu/2.998/www/QuaternionReport1.pdf\n\n// https://github.com/mattatz/ShibuyaCrowd/blob/master/source/shaders/common/quaternion.glsl\nvec4 quatMult(vec4 q1, vec4 q2)\n{\n\treturn vec4(\n\tq1.w * q2.x + q1.x * q2.w + q1.z * q2.y - q1.y * q2.z,\n\tq1.w * q2.y + q1.y * q2.w + q1.x * q2.z - q1.z * q2.x,\n\tq1.w * q2.z + q1.z * q2.w + q1.y * q2.x - q1.x * q2.y,\n\tq1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z\n\t);\n}\n// http://glmatrix.net/docs/quat.js.html#line97\n// let ax = a[0], ay = a[1], az = a[2], aw = a[3];\n\n// let bx = b[0], by = b[1], bz = b[2], bw = b[3];\n\n// out[0] = ax * bw + aw * bx + ay * bz - az * by;\n\n// out[1] = ay * bw + aw * by + az * bx - ax * bz;\n\n// out[2] = az * bw + aw * bz + ax * by - ay * bx;\n\n// out[3] = aw * bw - ax * bx - ay * by - az * bz;\n\n// return out\n\n\n\n// http://www.neilmendoza.com/glsl-rotation-about-an-arbitrary-axis/\nmat4 rotationMatrix(vec3 axis, float angle)\n{\n\taxis = normalize(axis);\n\tfloat s = sin(angle);\n\tfloat c = cos(angle);\n\tfloat oc = 1.0 - c;\n\n \treturn mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0.0, oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0.0, oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0.0, 0.0, 0.0, 0.0, 1.0);\n}\n\n// https://www.geeks3d.com/20141201/how-to-rotate-a-vertex-by-a-quaternion-in-glsl/\nvec4 quatFromAxisAngle(vec3 axis, float angle)\n{\n\tvec4 qr;\n\tfloat half_angle = (angle * 0.5); // * 3.14159 / 180.0;\n\tfloat sin_half_angle = sin(half_angle);\n\tqr.x = axis.x * sin_half_angle;\n\tqr.y = axis.y * sin_half_angle;\n\tqr.z = axis.z * sin_half_angle;\n\tqr.w = cos(half_angle);\n\treturn qr;\n}\nvec3 rotateWithAxisAngle(vec3 position, vec3 axis, float angle)\n{\n\tvec4 q = quatFromAxisAngle(axis, angle);\n\tvec3 v = position.xyz;\n\treturn v + 2.0 * cross(q.xyz, cross(q.xyz, v) + q.w * v);\n}\n// vec3 applyQuaternionToVector( vec4 q, vec3 v ){\n// \treturn v + 2.0 * cross( q.xyz, cross( q.xyz, v ) + q.w * v );\n// }\nvec3 rotateWithQuat( vec3 v, vec4 q )\n{\n\t// vec4 qv = multQuat( quat, vec4(vec, 0.0) );\n\t// return multQuat( qv, vec4(-quat.x, -quat.y, -quat.z, quat.w) ).xyz;\n\treturn v + 2.0 * cross( q.xyz, cross( q.xyz, v ) + q.w * v );\n}\n// https://github.com/glslify/glsl-look-at/blob/gh-pages/index.glsl\n// mat3 rotation_matrix(vec3 origin, vec3 target, float roll) {\n// \tvec3 rr = vec3(sin(roll), cos(roll), 0.0);\n// \tvec3 ww = normalize(target - origin);\n// \tvec3 uu = normalize(cross(ww, rr));\n// \tvec3 vv = normalize(cross(uu, ww));\n\n// \treturn mat3(uu, vv, ww);\n// }\n// mat3 rotation_matrix(vec3 target, float roll) {\n// \tvec3 rr = vec3(sin(roll), cos(roll), 0.0);\n// \tvec3 ww = normalize(target);\n// \tvec3 uu = normalize(cross(ww, rr));\n// \tvec3 vv = normalize(cross(uu, ww));\n\n// \treturn mat3(uu, vv, ww);\n// }\n\nfloat vectorAngle(vec3 start, vec3 dest){\n\tstart = normalize(start);\n\tdest = normalize(dest);\n\n\tfloat cosTheta = dot(start, dest);\n\tvec3 c1 = cross(start, dest);\n\t// We use the dot product of the cross with the Y axis.\n\t// This is a little arbitrary, but can still give a good sense of direction\n\tvec3 y_axis = vec3(0.0, 1.0, 0.0);\n\tfloat d1 = dot(c1, y_axis);\n\tfloat angle = acos(cosTheta) * sign(d1);\n\treturn angle;\n}\n\n// http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/#i-need-an-equivalent-of-glulookat-how-do-i-orient-an-object-towards-a-point-\nvec4 vectorAlign(vec3 start, vec3 dest){\n\tstart = normalize(start);\n\tdest = normalize(dest);\n\n\tfloat cosTheta = dot(start, dest);\n\tvec3 axis;\n\n\t// if (cosTheta < -1 + 0.001f){\n\t// \t// special case when vectors in opposite directions:\n\t// \t// there is no ideal rotation axis\n\t// \t// So guess one; any will do as long as it's perpendicular to start\n\t// \taxis = cross(vec3(0.0f, 0.0f, 1.0f), start);\n\t// \tif (length2(axis) < 0.01 ) // bad luck, they were parallel, try again!\n\t// \t\taxis = cross(vec3(1.0f, 0.0f, 0.0f), start);\n\n\t// \taxis = normalize(axis);\n\t// \treturn gtx::quaternion::angleAxis(glm::radians(180.0f), axis);\n\t// }\n\tif(cosTheta > (1.0 - 0.0001) || cosTheta < (-1.0 + 0.0001) ){\n\t\taxis = normalize(cross(start, vec3(0.0, 1.0, 0.0)));\n\t\tif (length(axis) < 0.001 ){ // bad luck, they were parallel, try again!\n\t\t\taxis = normalize(cross(start, vec3(1.0, 0.0, 0.0)));\n\t\t}\n\t} else {\n\t\taxis = normalize(cross(start, dest));\n\t}\n\n\tfloat angle = acos(cosTheta);\n\n\treturn quatFromAxisAngle(axis, angle);\n}\nvec4 vectorAlignWithUp(vec3 start, vec3 dest, vec3 up){\n\tvec4 rot1 = vectorAlign(start, dest);\n\tup = normalize(up);\n\n\t// Recompute desiredUp so that it's perpendicular to the direction\n\t// You can skip that part if you really want to force desiredUp\n\t// vec3 right = normalize(cross(dest, up));\n\t// up = normalize(cross(right, dest));\n\n\t// Because of the 1rst rotation, the up is probably completely screwed up.\n\t// Find the rotation between the up of the rotated object, and the desired up\n\tvec3 newUp = rotateWithQuat(vec3(0.0, 1.0, 0.0), rot1);//rot1 * vec3(0.0, 1.0, 0.0);\n\tvec4 rot2 = vectorAlign(up, newUp);\n\n\t// return rot1;\n\treturn rot2;\n\t// return multQuat(rot1, rot2);\n\t// return rot2 * rot1;\n\n}\n\n// https://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\nfloat quatToAngle(vec4 q){\n\treturn 2.0 * acos(q.w);\n}\nvec3 quatToAxis(vec4 q){\n\treturn vec3(\n\t\tq.x / sqrt(1.0-q.w*q.w),\n\t\tq.y / sqrt(1.0-q.w*q.w),\n\t\tq.z / sqrt(1.0-q.w*q.w)\n\t);\n}\n\nvec4 align(vec3 dir, vec3 up){\n\tvec3 start_dir = vec3(0.0, 0.0, 1.0);\n\tvec3 start_up = vec3(0.0, 1.0, 0.0);\n\tvec4 rot1 = vectorAlign(start_dir, dir);\n\tup = normalize(up);\n\n\t// Recompute desiredUp so that it's perpendicular to the direction\n\t// You can skip that part if you really want to force desiredUp\n\tvec3 right = normalize(cross(dir, up));\n\tif(length(right)<0.001){\n\t\tright = vec3(1.0, 0.0, 0.0);\n\t}\n\tup = normalize(cross(right, dir));\n\n\t// Because of the 1rst rotation, the up is probably completely screwed up.\n\t// Find the rotation between the up of the rotated object, and the desired up\n\tvec3 newUp = rotateWithQuat(start_up, rot1);//rot1 * vec3(0.0, 1.0, 0.0);\n\tvec4 rot2 = vectorAlign(normalize(newUp), up);\n\n\t// return rot1;\n\treturn quatMult(rot1, rot2);\n\t// return rot2 * rot1;\n\n}\n\n\n\n\n\n\n\n// /geo1/MAT/meshBasicBuilder1/globals1\nvarying vec2 v_POLY_globals1_uv;\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\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// /geo1/MAT/meshBasicBuilder1/constant3\n\tfloat v_POLY_constant3_val = 0.05;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/constant4\n\tfloat v_POLY_constant4_val = 0.01;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/constant1\n\tfloat v_POLY_constant1_val = 180.0;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/constant2\n\tfloat v_POLY_constant2_val = 90.0;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/add2\n\tfloat v_POLY_add2_sum = (v_POLY_constant3_val + v_POLY_constant4_val + 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd4\n\tvec2 v_POLY_multAdd4_val = (vec2(6.283185307179586, 3.141592653589793)*(v_POLY_globals1_uv + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec2_1\n\tvec2 v_POLY_floatToVec2_1_vec2 = vec2(v_POLY_constant1_val, v_POLY_constant2_val);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/vec2ToFloat2\n\tfloat v_POLY_vec2ToFloat2_y = v_POLY_multAdd4_val.y;\n\tfloat v_POLY_vec2ToFloat2_x = v_POLY_multAdd4_val.x;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd3\n\tvec2 v_POLY_multAdd3_val = (v_POLY_floatToVec2_1_vec2*(v_POLY_globals1_uv + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec3_4\n\tvec3 v_POLY_floatToVec3_4_vec3 = vec3(1.0, v_POLY_vec2ToFloat2_y, v_POLY_vec2ToFloat2_x);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/round1\n\tvec2 v_POLY_round1_val = vec2(sign(v_POLY_multAdd3_val.x)*floor(abs(v_POLY_multAdd3_val.x)+0.5),sign(v_POLY_multAdd3_val.y)*floor(abs(v_POLY_multAdd3_val.y)+0.5));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/polarToCartesian3\n\tvec3 v_POLY_polarToCartesian3_xyz = polarToCartesian(v_POLY_floatToVec3_4_vec3);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/divide3\n\tvec2 v_POLY_divide3_divide = (v_POLY_round1_val / v_POLY_floatToVec2_1_vec2 / vec2(1.0, 1.0));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd2\n\tvec3 v_POLY_multAdd2_val = (vec3(-1.0, -1.0, -1.0)*(v_POLY_polarToCartesian3_xyz + vec3(0.0, 0.0, 0.0))) + vec3(0.0, 0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd5\n\tvec2 v_POLY_multAdd5_val = (vec2(6.283185307179586, 3.141592653589793)*(v_POLY_divide3_divide + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/rotate1\n\tvec3 v_POLY_rotate1_val = rotateWithAxisAngle(v_POLY_multAdd2_val, vec3(0.0, 1.0, 0.0), 1.5707963267948966);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/vec2ToFloat3\n\tfloat v_POLY_vec2ToFloat3_y = v_POLY_multAdd5_val.y;\n\tfloat v_POLY_vec2ToFloat3_x = v_POLY_multAdd5_val.x;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec3_5\n\tvec3 v_POLY_floatToVec3_5_vec3 = vec3(1.0, v_POLY_vec2ToFloat3_y, v_POLY_vec2ToFloat3_x);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/polarToCartesian4\n\tvec3 v_POLY_polarToCartesian4_xyz = polarToCartesian(v_POLY_floatToVec3_5_vec3);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd6\n\tvec3 v_POLY_multAdd6_val = (vec3(-1.0, -1.0, -1.0)*(v_POLY_polarToCartesian4_xyz + vec3(0.0, 0.0, 0.0))) + vec3(0.0, 0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/rotate2\n\tvec3 v_POLY_rotate2_val = rotateWithAxisAngle(v_POLY_multAdd6_val, vec3(0.0, 1.0, 0.0), 1.5707963267948966);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/subtract1\n\tvec3 v_POLY_subtract1_subtract = (v_POLY_rotate1_val - v_POLY_rotate2_val - vec3(0.0, 0.0, 0.0));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/length1\n\tfloat v_POLY_length1_val = length(v_POLY_subtract1_subtract);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd7\n\tfloat v_POLY_multAdd7_val = (10.0*(v_POLY_length1_val + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/smoothstep1\n\tfloat v_POLY_smoothstep1_val = smoothstep(v_POLY_constant3_val, v_POLY_add2_sum, v_POLY_multAdd7_val);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/null1\n\tfloat v_POLY_null1_val = v_POLY_smoothstep1_val;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec3_1\n\tvec3 v_POLY_floatToVec3_1_vec3 = vec3(v_POLY_null1_val, v_POLY_null1_val, v_POLY_null1_val);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/add1\n\tvec3 v_POLY_add1_sum = (v_POLY_floatToVec3_1_vec3 + v_POLY_rotate2_val + vec3(0.0, 0.0, 0.0));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/output1\n\tdiffuseColor.xyz = v_POLY_add1_sum;\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 <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n\n\n\n// /geo1/MAT/meshBasicBuilder1/globals1\nvarying vec2 v_POLY_globals1_uv;\n\n\n\n\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <batching_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// /geo1/MAT/meshBasicBuilder1/globals1\n\tv_POLY_globals1_uv = vec2(uv);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/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// /geo1/MAT/meshBasicBuilder1/polarToCartesian3\nvec3 cartesianToPolar(vec3 w){\n\tfloat wr = sqrt(dot(w,w));\n\tfloat wo = acos(w.y/wr);\n\tfloat wi = atan(w.x,w.z);\n\treturn vec3(wr,wo,wi);\n}\nvec3 polarToCartesian(vec3 p){\n\tfloat x = p.x * sin(p.y)*sin(p.z);\n\tfloat y = p.x * cos(p.y);\n\tfloat z = p.x * sin(p.y)*cos(p.z);\n\treturn vec3(x,y,z);\n}\n\n// /geo1/MAT/meshBasicBuilder1/rotate1\n\n\n// https://stackoverflow.com/questions/23793698/how-to-implement-slerp-in-glsl-hlsl\n// vec4 quatSlerp(vec4 p0, vec4 p1, float t)\n// {\n// \tfloat dotp = dot(normalize(p0), normalize(p1));\n// \tif ((dotp > 0.9999) || (dotp < -0.9999))\n// \t{\n// \t\tif (t<=0.5)\n// \t\t\treturn p0;\n// \t\treturn p1;\n// \t}\n// \tfloat theta = acos(dotp);\n// \tvec4 P = ((p0*sin((1.0-t)*theta) + p1*sin(t*theta)) / sin(theta));\n// \tP.w = 1.0;\n// \treturn P;\n// }\n\n// https://devcry.heiho.net/html/2017/20170521-slerp.html\n// float lerp(float a, float b, float t) {\n// \treturn (1.0 - t) * a + t * b;\n// }\n// vec4 quatSlerp(vec4 p0, vec4 p1, float t){\n// \tvec4 qb = p1;\n\n// \t// cos(a) = dot product\n// \tfloat cos_a = p0.x * qb.x + p0.y * qb.y + p0.z * qb.z + p0.w * qb.w;\n// \tif (cos_a < 0.0f) {\n// \t\tcos_a = -cos_a;\n// \t\tqb = -qb;\n// \t}\n\n// \t// close to zero, cos(a) ~= 1\n// \t// do linear interpolation\n// \tif (cos_a > 0.999) {\n// \t\treturn vec4(\n// \t\t\tlerp(p0.x, qb.x, t),\n// \t\t\tlerp(p0.y, qb.y, t),\n// \t\t\tlerp(p0.z, qb.z, t),\n// \t\t\tlerp(p0.w, qb.w, t)\n// \t\t);\n// \t}\n\n// \tfloat alpha = acos(cos_a);\n// \treturn (p0 * sin(1.0 - t) + p1 * sin(t * alpha)) / sin(alpha);\n// }\n\n// https://stackoverflow.com/questions/62943083/interpolate-between-two-quaternions-the-long-way\nvec4 quatSlerp(vec4 q1, vec4 q2, float t){\n\tfloat angle = acos(dot(q1, q2));\n\tfloat denom = sin(angle);\n\t//check if denom is zero\n\treturn (q1*sin((1.0-t)*angle)+q2*sin(t*angle))/denom;\n}\n// TO CHECK:\n// this page https://www.reddit.com/r/opengl/comments/704la7/glsl_quaternion_library/\n// has a link to a potentially nice pdf:\n// http://web.mit.edu/2.998/www/QuaternionReport1.pdf\n\n// https://github.com/mattatz/ShibuyaCrowd/blob/master/source/shaders/common/quaternion.glsl\nvec4 quatMult(vec4 q1, vec4 q2)\n{\n\treturn vec4(\n\tq1.w * q2.x + q1.x * q2.w + q1.z * q2.y - q1.y * q2.z,\n\tq1.w * q2.y + q1.y * q2.w + q1.x * q2.z - q1.z * q2.x,\n\tq1.w * q2.z + q1.z * q2.w + q1.y * q2.x - q1.x * q2.y,\n\tq1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z\n\t);\n}\n// http://glmatrix.net/docs/quat.js.html#line97\n// let ax = a[0], ay = a[1], az = a[2], aw = a[3];\n\n// let bx = b[0], by = b[1], bz = b[2], bw = b[3];\n\n// out[0] = ax * bw + aw * bx + ay * bz - az * by;\n\n// out[1] = ay * bw + aw * by + az * bx - ax * bz;\n\n// out[2] = az * bw + aw * bz + ax * by - ay * bx;\n\n// out[3] = aw * bw - ax * bx - ay * by - az * bz;\n\n// return out\n\n\n\n// http://www.neilmendoza.com/glsl-rotation-about-an-arbitrary-axis/\nmat4 rotationMatrix(vec3 axis, float angle)\n{\n\taxis = normalize(axis);\n\tfloat s = sin(angle);\n\tfloat c = cos(angle);\n\tfloat oc = 1.0 - c;\n\n \treturn mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0.0, oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0.0, oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0.0, 0.0, 0.0, 0.0, 1.0);\n}\n\n// https://www.geeks3d.com/20141201/how-to-rotate-a-vertex-by-a-quaternion-in-glsl/\nvec4 quatFromAxisAngle(vec3 axis, float angle)\n{\n\tvec4 qr;\n\tfloat half_angle = (angle * 0.5); // * 3.14159 / 180.0;\n\tfloat sin_half_angle = sin(half_angle);\n\tqr.x = axis.x * sin_half_angle;\n\tqr.y = axis.y * sin_half_angle;\n\tqr.z = axis.z * sin_half_angle;\n\tqr.w = cos(half_angle);\n\treturn qr;\n}\nvec3 rotateWithAxisAngle(vec3 position, vec3 axis, float angle)\n{\n\tvec4 q = quatFromAxisAngle(axis, angle);\n\tvec3 v = position.xyz;\n\treturn v + 2.0 * cross(q.xyz, cross(q.xyz, v) + q.w * v);\n}\n// vec3 applyQuaternionToVector( vec4 q, vec3 v ){\n// \treturn v + 2.0 * cross( q.xyz, cross( q.xyz, v ) + q.w * v );\n// }\nvec3 rotateWithQuat( vec3 v, vec4 q )\n{\n\t// vec4 qv = multQuat( quat, vec4(vec, 0.0) );\n\t// return multQuat( qv, vec4(-quat.x, -quat.y, -quat.z, quat.w) ).xyz;\n\treturn v + 2.0 * cross( q.xyz, cross( q.xyz, v ) + q.w * v );\n}\n// https://github.com/glslify/glsl-look-at/blob/gh-pages/index.glsl\n// mat3 rotation_matrix(vec3 origin, vec3 target, float roll) {\n// \tvec3 rr = vec3(sin(roll), cos(roll), 0.0);\n// \tvec3 ww = normalize(target - origin);\n// \tvec3 uu = normalize(cross(ww, rr));\n// \tvec3 vv = normalize(cross(uu, ww));\n\n// \treturn mat3(uu, vv, ww);\n// }\n// mat3 rotation_matrix(vec3 target, float roll) {\n// \tvec3 rr = vec3(sin(roll), cos(roll), 0.0);\n// \tvec3 ww = normalize(target);\n// \tvec3 uu = normalize(cross(ww, rr));\n// \tvec3 vv = normalize(cross(uu, ww));\n\n// \treturn mat3(uu, vv, ww);\n// }\n\nfloat vectorAngle(vec3 start, vec3 dest){\n\tstart = normalize(start);\n\tdest = normalize(dest);\n\n\tfloat cosTheta = dot(start, dest);\n\tvec3 c1 = cross(start, dest);\n\t// We use the dot product of the cross with the Y axis.\n\t// This is a little arbitrary, but can still give a good sense of direction\n\tvec3 y_axis = vec3(0.0, 1.0, 0.0);\n\tfloat d1 = dot(c1, y_axis);\n\tfloat angle = acos(cosTheta) * sign(d1);\n\treturn angle;\n}\n\n// http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/#i-need-an-equivalent-of-glulookat-how-do-i-orient-an-object-towards-a-point-\nvec4 vectorAlign(vec3 start, vec3 dest){\n\tstart = normalize(start);\n\tdest = normalize(dest);\n\n\tfloat cosTheta = dot(start, dest);\n\tvec3 axis;\n\n\t// if (cosTheta < -1 + 0.001f){\n\t// \t// special case when vectors in opposite directions:\n\t// \t// there is no ideal rotation axis\n\t// \t// So guess one; any will do as long as it's perpendicular to start\n\t// \taxis = cross(vec3(0.0f, 0.0f, 1.0f), start);\n\t// \tif (length2(axis) < 0.01 ) // bad luck, they were parallel, try again!\n\t// \t\taxis = cross(vec3(1.0f, 0.0f, 0.0f), start);\n\n\t// \taxis = normalize(axis);\n\t// \treturn gtx::quaternion::angleAxis(glm::radians(180.0f), axis);\n\t// }\n\tif(cosTheta > (1.0 - 0.0001) || cosTheta < (-1.0 + 0.0001) ){\n\t\taxis = normalize(cross(start, vec3(0.0, 1.0, 0.0)));\n\t\tif (length(axis) < 0.001 ){ // bad luck, they were parallel, try again!\n\t\t\taxis = normalize(cross(start, vec3(1.0, 0.0, 0.0)));\n\t\t}\n\t} else {\n\t\taxis = normalize(cross(start, dest));\n\t}\n\n\tfloat angle = acos(cosTheta);\n\n\treturn quatFromAxisAngle(axis, angle);\n}\nvec4 vectorAlignWithUp(vec3 start, vec3 dest, vec3 up){\n\tvec4 rot1 = vectorAlign(start, dest);\n\tup = normalize(up);\n\n\t// Recompute desiredUp so that it's perpendicular to the direction\n\t// You can skip that part if you really want to force desiredUp\n\t// vec3 right = normalize(cross(dest, up));\n\t// up = normalize(cross(right, dest));\n\n\t// Because of the 1rst rotation, the up is probably completely screwed up.\n\t// Find the rotation between the up of the rotated object, and the desired up\n\tvec3 newUp = rotateWithQuat(vec3(0.0, 1.0, 0.0), rot1);//rot1 * vec3(0.0, 1.0, 0.0);\n\tvec4 rot2 = vectorAlign(up, newUp);\n\n\t// return rot1;\n\treturn rot2;\n\t// return multQuat(rot1, rot2);\n\t// return rot2 * rot1;\n\n}\n\n// https://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\nfloat quatToAngle(vec4 q){\n\treturn 2.0 * acos(q.w);\n}\nvec3 quatToAxis(vec4 q){\n\treturn vec3(\n\t\tq.x / sqrt(1.0-q.w*q.w),\n\t\tq.y / sqrt(1.0-q.w*q.w),\n\t\tq.z / sqrt(1.0-q.w*q.w)\n\t);\n}\n\nvec4 align(vec3 dir, vec3 up){\n\tvec3 start_dir = vec3(0.0, 0.0, 1.0);\n\tvec3 start_up = vec3(0.0, 1.0, 0.0);\n\tvec4 rot1 = vectorAlign(start_dir, dir);\n\tup = normalize(up);\n\n\t// Recompute desiredUp so that it's perpendicular to the direction\n\t// You can skip that part if you really want to force desiredUp\n\tvec3 right = normalize(cross(dir, up));\n\tif(length(right)<0.001){\n\t\tright = vec3(1.0, 0.0, 0.0);\n\t}\n\tup = normalize(cross(right, dir));\n\n\t// Because of the 1rst rotation, the up is probably completely screwed up.\n\t// Find the rotation between the up of the rotated object, and the desired up\n\tvec3 newUp = rotateWithQuat(start_up, rot1);//rot1 * vec3(0.0, 1.0, 0.0);\n\tvec4 rot2 = vectorAlign(normalize(newUp), up);\n\n\t// return rot1;\n\treturn quatMult(rot1, rot2);\n\t// return rot2 * rot1;\n\n}\n\n\n\n\n\n\n\n// /geo1/MAT/meshBasicBuilder1/globals1\nvarying vec2 v_POLY_globals1_uv;\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\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// /geo1/MAT/meshBasicBuilder1/constant3\n\tfloat v_POLY_constant3_val = 0.05;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/constant4\n\tfloat v_POLY_constant4_val = 0.01;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/constant1\n\tfloat v_POLY_constant1_val = 180.0;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/constant2\n\tfloat v_POLY_constant2_val = 90.0;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/add2\n\tfloat v_POLY_add2_sum = (v_POLY_constant3_val + v_POLY_constant4_val + 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd4\n\tvec2 v_POLY_multAdd4_val = (vec2(6.283185307179586, 3.141592653589793)*(v_POLY_globals1_uv + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec2_1\n\tvec2 v_POLY_floatToVec2_1_vec2 = vec2(v_POLY_constant1_val, v_POLY_constant2_val);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/vec2ToFloat2\n\tfloat v_POLY_vec2ToFloat2_y = v_POLY_multAdd4_val.y;\n\tfloat v_POLY_vec2ToFloat2_x = v_POLY_multAdd4_val.x;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd3\n\tvec2 v_POLY_multAdd3_val = (v_POLY_floatToVec2_1_vec2*(v_POLY_globals1_uv + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec3_4\n\tvec3 v_POLY_floatToVec3_4_vec3 = vec3(1.0, v_POLY_vec2ToFloat2_y, v_POLY_vec2ToFloat2_x);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/round1\n\tvec2 v_POLY_round1_val = vec2(sign(v_POLY_multAdd3_val.x)*floor(abs(v_POLY_multAdd3_val.x)+0.5),sign(v_POLY_multAdd3_val.y)*floor(abs(v_POLY_multAdd3_val.y)+0.5));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/polarToCartesian3\n\tvec3 v_POLY_polarToCartesian3_xyz = polarToCartesian(v_POLY_floatToVec3_4_vec3);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/divide3\n\tvec2 v_POLY_divide3_divide = (v_POLY_round1_val / v_POLY_floatToVec2_1_vec2 / vec2(1.0, 1.0));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd2\n\tvec3 v_POLY_multAdd2_val = (vec3(-1.0, -1.0, -1.0)*(v_POLY_polarToCartesian3_xyz + vec3(0.0, 0.0, 0.0))) + vec3(0.0, 0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd5\n\tvec2 v_POLY_multAdd5_val = (vec2(6.283185307179586, 3.141592653589793)*(v_POLY_divide3_divide + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/rotate1\n\tvec3 v_POLY_rotate1_val = rotateWithAxisAngle(v_POLY_multAdd2_val, vec3(0.0, 1.0, 0.0), 1.5707963267948966);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/vec2ToFloat3\n\tfloat v_POLY_vec2ToFloat3_y = v_POLY_multAdd5_val.y;\n\tfloat v_POLY_vec2ToFloat3_x = v_POLY_multAdd5_val.x;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec3_5\n\tvec3 v_POLY_floatToVec3_5_vec3 = vec3(1.0, v_POLY_vec2ToFloat3_y, v_POLY_vec2ToFloat3_x);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/polarToCartesian4\n\tvec3 v_POLY_polarToCartesian4_xyz = polarToCartesian(v_POLY_floatToVec3_5_vec3);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd6\n\tvec3 v_POLY_multAdd6_val = (vec3(-1.0, -1.0, -1.0)*(v_POLY_polarToCartesian4_xyz + vec3(0.0, 0.0, 0.0))) + vec3(0.0, 0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/rotate2\n\tvec3 v_POLY_rotate2_val = rotateWithAxisAngle(v_POLY_multAdd6_val, vec3(0.0, 1.0, 0.0), 1.5707963267948966);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/subtract1\n\tvec3 v_POLY_subtract1_subtract = (v_POLY_rotate1_val - v_POLY_rotate2_val - vec3(0.0, 0.0, 0.0));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/length1\n\tfloat v_POLY_length1_val = length(v_POLY_subtract1_subtract);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd7\n\tfloat v_POLY_multAdd7_val = (10.0*(v_POLY_length1_val + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/smoothstep1\n\tfloat v_POLY_smoothstep1_val = smoothstep(v_POLY_constant3_val, v_POLY_add2_sum, v_POLY_multAdd7_val);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/null1\n\tfloat v_POLY_null1_val = v_POLY_smoothstep1_val;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec3_1\n\tvec3 v_POLY_floatToVec3_1_vec3 = vec3(v_POLY_null1_val, v_POLY_null1_val, v_POLY_null1_val);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/add1\n\tvec3 v_POLY_add1_sum = (v_POLY_floatToVec3_1_vec3 + v_POLY_rotate2_val + vec3(0.0, 0.0, 0.0));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/output1\n\tdiffuseColor.xyz = v_POLY_add1_sum;\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 <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n\n\n\n// /geo1/MAT/meshBasicBuilder1/globals1\nvarying vec2 v_POLY_globals1_uv;\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 <batching_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// /geo1/MAT/meshBasicBuilder1/globals1\n\tv_POLY_globals1_uv = vec2(uv);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/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// /geo1/MAT/meshBasicBuilder1/polarToCartesian3\nvec3 cartesianToPolar(vec3 w){\n\tfloat wr = sqrt(dot(w,w));\n\tfloat wo = acos(w.y/wr);\n\tfloat wi = atan(w.x,w.z);\n\treturn vec3(wr,wo,wi);\n}\nvec3 polarToCartesian(vec3 p){\n\tfloat x = p.x * sin(p.y)*sin(p.z);\n\tfloat y = p.x * cos(p.y);\n\tfloat z = p.x * sin(p.y)*cos(p.z);\n\treturn vec3(x,y,z);\n}\n\n// /geo1/MAT/meshBasicBuilder1/rotate1\n\n\n// https://stackoverflow.com/questions/23793698/how-to-implement-slerp-in-glsl-hlsl\n// vec4 quatSlerp(vec4 p0, vec4 p1, float t)\n// {\n// \tfloat dotp = dot(normalize(p0), normalize(p1));\n// \tif ((dotp > 0.9999) || (dotp < -0.9999))\n// \t{\n// \t\tif (t<=0.5)\n// \t\t\treturn p0;\n// \t\treturn p1;\n// \t}\n// \tfloat theta = acos(dotp);\n// \tvec4 P = ((p0*sin((1.0-t)*theta) + p1*sin(t*theta)) / sin(theta));\n// \tP.w = 1.0;\n// \treturn P;\n// }\n\n// https://devcry.heiho.net/html/2017/20170521-slerp.html\n// float lerp(float a, float b, float t) {\n// \treturn (1.0 - t) * a + t * b;\n// }\n// vec4 quatSlerp(vec4 p0, vec4 p1, float t){\n// \tvec4 qb = p1;\n\n// \t// cos(a) = dot product\n// \tfloat cos_a = p0.x * qb.x + p0.y * qb.y + p0.z * qb.z + p0.w * qb.w;\n// \tif (cos_a < 0.0f) {\n// \t\tcos_a = -cos_a;\n// \t\tqb = -qb;\n// \t}\n\n// \t// close to zero, cos(a) ~= 1\n// \t// do linear interpolation\n// \tif (cos_a > 0.999) {\n// \t\treturn vec4(\n// \t\t\tlerp(p0.x, qb.x, t),\n// \t\t\tlerp(p0.y, qb.y, t),\n// \t\t\tlerp(p0.z, qb.z, t),\n// \t\t\tlerp(p0.w, qb.w, t)\n// \t\t);\n// \t}\n\n// \tfloat alpha = acos(cos_a);\n// \treturn (p0 * sin(1.0 - t) + p1 * sin(t * alpha)) / sin(alpha);\n// }\n\n// https://stackoverflow.com/questions/62943083/interpolate-between-two-quaternions-the-long-way\nvec4 quatSlerp(vec4 q1, vec4 q2, float t){\n\tfloat angle = acos(dot(q1, q2));\n\tfloat denom = sin(angle);\n\t//check if denom is zero\n\treturn (q1*sin((1.0-t)*angle)+q2*sin(t*angle))/denom;\n}\n// TO CHECK:\n// this page https://www.reddit.com/r/opengl/comments/704la7/glsl_quaternion_library/\n// has a link to a potentially nice pdf:\n// http://web.mit.edu/2.998/www/QuaternionReport1.pdf\n\n// https://github.com/mattatz/ShibuyaCrowd/blob/master/source/shaders/common/quaternion.glsl\nvec4 quatMult(vec4 q1, vec4 q2)\n{\n\treturn vec4(\n\tq1.w * q2.x + q1.x * q2.w + q1.z * q2.y - q1.y * q2.z,\n\tq1.w * q2.y + q1.y * q2.w + q1.x * q2.z - q1.z * q2.x,\n\tq1.w * q2.z + q1.z * q2.w + q1.y * q2.x - q1.x * q2.y,\n\tq1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z\n\t);\n}\n// http://glmatrix.net/docs/quat.js.html#line97\n// let ax = a[0], ay = a[1], az = a[2], aw = a[3];\n\n// let bx = b[0], by = b[1], bz = b[2], bw = b[3];\n\n// out[0] = ax * bw + aw * bx + ay * bz - az * by;\n\n// out[1] = ay * bw + aw * by + az * bx - ax * bz;\n\n// out[2] = az * bw + aw * bz + ax * by - ay * bx;\n\n// out[3] = aw * bw - ax * bx - ay * by - az * bz;\n\n// return out\n\n\n\n// http://www.neilmendoza.com/glsl-rotation-about-an-arbitrary-axis/\nmat4 rotationMatrix(vec3 axis, float angle)\n{\n\taxis = normalize(axis);\n\tfloat s = sin(angle);\n\tfloat c = cos(angle);\n\tfloat oc = 1.0 - c;\n\n \treturn mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0.0, oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0.0, oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0.0, 0.0, 0.0, 0.0, 1.0);\n}\n\n// https://www.geeks3d.com/20141201/how-to-rotate-a-vertex-by-a-quaternion-in-glsl/\nvec4 quatFromAxisAngle(vec3 axis, float angle)\n{\n\tvec4 qr;\n\tfloat half_angle = (angle * 0.5); // * 3.14159 / 180.0;\n\tfloat sin_half_angle = sin(half_angle);\n\tqr.x = axis.x * sin_half_angle;\n\tqr.y = axis.y * sin_half_angle;\n\tqr.z = axis.z * sin_half_angle;\n\tqr.w = cos(half_angle);\n\treturn qr;\n}\nvec3 rotateWithAxisAngle(vec3 position, vec3 axis, float angle)\n{\n\tvec4 q = quatFromAxisAngle(axis, angle);\n\tvec3 v = position.xyz;\n\treturn v + 2.0 * cross(q.xyz, cross(q.xyz, v) + q.w * v);\n}\n// vec3 applyQuaternionToVector( vec4 q, vec3 v ){\n// \treturn v + 2.0 * cross( q.xyz, cross( q.xyz, v ) + q.w * v );\n// }\nvec3 rotateWithQuat( vec3 v, vec4 q )\n{\n\t// vec4 qv = multQuat( quat, vec4(vec, 0.0) );\n\t// return multQuat( qv, vec4(-quat.x, -quat.y, -quat.z, quat.w) ).xyz;\n\treturn v + 2.0 * cross( q.xyz, cross( q.xyz, v ) + q.w * v );\n}\n// https://github.com/glslify/glsl-look-at/blob/gh-pages/index.glsl\n// mat3 rotation_matrix(vec3 origin, vec3 target, float roll) {\n// \tvec3 rr = vec3(sin(roll), cos(roll), 0.0);\n// \tvec3 ww = normalize(target - origin);\n// \tvec3 uu = normalize(cross(ww, rr));\n// \tvec3 vv = normalize(cross(uu, ww));\n\n// \treturn mat3(uu, vv, ww);\n// }\n// mat3 rotation_matrix(vec3 target, float roll) {\n// \tvec3 rr = vec3(sin(roll), cos(roll), 0.0);\n// \tvec3 ww = normalize(target);\n// \tvec3 uu = normalize(cross(ww, rr));\n// \tvec3 vv = normalize(cross(uu, ww));\n\n// \treturn mat3(uu, vv, ww);\n// }\n\nfloat vectorAngle(vec3 start, vec3 dest){\n\tstart = normalize(start);\n\tdest = normalize(dest);\n\n\tfloat cosTheta = dot(start, dest);\n\tvec3 c1 = cross(start, dest);\n\t// We use the dot product of the cross with the Y axis.\n\t// This is a little arbitrary, but can still give a good sense of direction\n\tvec3 y_axis = vec3(0.0, 1.0, 0.0);\n\tfloat d1 = dot(c1, y_axis);\n\tfloat angle = acos(cosTheta) * sign(d1);\n\treturn angle;\n}\n\n// http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/#i-need-an-equivalent-of-glulookat-how-do-i-orient-an-object-towards-a-point-\nvec4 vectorAlign(vec3 start, vec3 dest){\n\tstart = normalize(start);\n\tdest = normalize(dest);\n\n\tfloat cosTheta = dot(start, dest);\n\tvec3 axis;\n\n\t// if (cosTheta < -1 + 0.001f){\n\t// \t// special case when vectors in opposite directions:\n\t// \t// there is no ideal rotation axis\n\t// \t// So guess one; any will do as long as it's perpendicular to start\n\t// \taxis = cross(vec3(0.0f, 0.0f, 1.0f), start);\n\t// \tif (length2(axis) < 0.01 ) // bad luck, they were parallel, try again!\n\t// \t\taxis = cross(vec3(1.0f, 0.0f, 0.0f), start);\n\n\t// \taxis = normalize(axis);\n\t// \treturn gtx::quaternion::angleAxis(glm::radians(180.0f), axis);\n\t// }\n\tif(cosTheta > (1.0 - 0.0001) || cosTheta < (-1.0 + 0.0001) ){\n\t\taxis = normalize(cross(start, vec3(0.0, 1.0, 0.0)));\n\t\tif (length(axis) < 0.001 ){ // bad luck, they were parallel, try again!\n\t\t\taxis = normalize(cross(start, vec3(1.0, 0.0, 0.0)));\n\t\t}\n\t} else {\n\t\taxis = normalize(cross(start, dest));\n\t}\n\n\tfloat angle = acos(cosTheta);\n\n\treturn quatFromAxisAngle(axis, angle);\n}\nvec4 vectorAlignWithUp(vec3 start, vec3 dest, vec3 up){\n\tvec4 rot1 = vectorAlign(start, dest);\n\tup = normalize(up);\n\n\t// Recompute desiredUp so that it's perpendicular to the direction\n\t// You can skip that part if you really want to force desiredUp\n\t// vec3 right = normalize(cross(dest, up));\n\t// up = normalize(cross(right, dest));\n\n\t// Because of the 1rst rotation, the up is probably completely screwed up.\n\t// Find the rotation between the up of the rotated object, and the desired up\n\tvec3 newUp = rotateWithQuat(vec3(0.0, 1.0, 0.0), rot1);//rot1 * vec3(0.0, 1.0, 0.0);\n\tvec4 rot2 = vectorAlign(up, newUp);\n\n\t// return rot1;\n\treturn rot2;\n\t// return multQuat(rot1, rot2);\n\t// return rot2 * rot1;\n\n}\n\n// https://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\nfloat quatToAngle(vec4 q){\n\treturn 2.0 * acos(q.w);\n}\nvec3 quatToAxis(vec4 q){\n\treturn vec3(\n\t\tq.x / sqrt(1.0-q.w*q.w),\n\t\tq.y / sqrt(1.0-q.w*q.w),\n\t\tq.z / sqrt(1.0-q.w*q.w)\n\t);\n}\n\nvec4 align(vec3 dir, vec3 up){\n\tvec3 start_dir = vec3(0.0, 0.0, 1.0);\n\tvec3 start_up = vec3(0.0, 1.0, 0.0);\n\tvec4 rot1 = vectorAlign(start_dir, dir);\n\tup = normalize(up);\n\n\t// Recompute desiredUp so that it's perpendicular to the direction\n\t// You can skip that part if you really want to force desiredUp\n\tvec3 right = normalize(cross(dir, up));\n\tif(length(right)<0.001){\n\t\tright = vec3(1.0, 0.0, 0.0);\n\t}\n\tup = normalize(cross(right, dir));\n\n\t// Because of the 1rst rotation, the up is probably completely screwed up.\n\t// Find the rotation between the up of the rotated object, and the desired up\n\tvec3 newUp = rotateWithQuat(start_up, rot1);//rot1 * vec3(0.0, 1.0, 0.0);\n\tvec4 rot2 = vectorAlign(normalize(newUp), up);\n\n\t// return rot1;\n\treturn quatMult(rot1, rot2);\n\t// return rot2 * rot1;\n\n}\n\n\n\n\n\n\n\n// /geo1/MAT/meshBasicBuilder1/globals1\nvarying vec2 v_POLY_globals1_uv;\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\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// /geo1/MAT/meshBasicBuilder1/constant3\n\tfloat v_POLY_constant3_val = 0.05;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/constant4\n\tfloat v_POLY_constant4_val = 0.01;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/constant1\n\tfloat v_POLY_constant1_val = 180.0;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/constant2\n\tfloat v_POLY_constant2_val = 90.0;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/add2\n\tfloat v_POLY_add2_sum = (v_POLY_constant3_val + v_POLY_constant4_val + 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd4\n\tvec2 v_POLY_multAdd4_val = (vec2(6.283185307179586, 3.141592653589793)*(v_POLY_globals1_uv + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec2_1\n\tvec2 v_POLY_floatToVec2_1_vec2 = vec2(v_POLY_constant1_val, v_POLY_constant2_val);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/vec2ToFloat2\n\tfloat v_POLY_vec2ToFloat2_y = v_POLY_multAdd4_val.y;\n\tfloat v_POLY_vec2ToFloat2_x = v_POLY_multAdd4_val.x;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd3\n\tvec2 v_POLY_multAdd3_val = (v_POLY_floatToVec2_1_vec2*(v_POLY_globals1_uv + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec3_4\n\tvec3 v_POLY_floatToVec3_4_vec3 = vec3(1.0, v_POLY_vec2ToFloat2_y, v_POLY_vec2ToFloat2_x);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/round1\n\tvec2 v_POLY_round1_val = vec2(sign(v_POLY_multAdd3_val.x)*floor(abs(v_POLY_multAdd3_val.x)+0.5),sign(v_POLY_multAdd3_val.y)*floor(abs(v_POLY_multAdd3_val.y)+0.5));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/polarToCartesian3\n\tvec3 v_POLY_polarToCartesian3_xyz = polarToCartesian(v_POLY_floatToVec3_4_vec3);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/divide3\n\tvec2 v_POLY_divide3_divide = (v_POLY_round1_val / v_POLY_floatToVec2_1_vec2 / vec2(1.0, 1.0));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd2\n\tvec3 v_POLY_multAdd2_val = (vec3(-1.0, -1.0, -1.0)*(v_POLY_polarToCartesian3_xyz + vec3(0.0, 0.0, 0.0))) + vec3(0.0, 0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd5\n\tvec2 v_POLY_multAdd5_val = (vec2(6.283185307179586, 3.141592653589793)*(v_POLY_divide3_divide + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/rotate1\n\tvec3 v_POLY_rotate1_val = rotateWithAxisAngle(v_POLY_multAdd2_val, vec3(0.0, 1.0, 0.0), 1.5707963267948966);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/vec2ToFloat3\n\tfloat v_POLY_vec2ToFloat3_y = v_POLY_multAdd5_val.y;\n\tfloat v_POLY_vec2ToFloat3_x = v_POLY_multAdd5_val.x;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec3_5\n\tvec3 v_POLY_floatToVec3_5_vec3 = vec3(1.0, v_POLY_vec2ToFloat3_y, v_POLY_vec2ToFloat3_x);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/polarToCartesian4\n\tvec3 v_POLY_polarToCartesian4_xyz = polarToCartesian(v_POLY_floatToVec3_5_vec3);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd6\n\tvec3 v_POLY_multAdd6_val = (vec3(-1.0, -1.0, -1.0)*(v_POLY_polarToCartesian4_xyz + vec3(0.0, 0.0, 0.0))) + vec3(0.0, 0.0, 0.0);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/rotate2\n\tvec3 v_POLY_rotate2_val = rotateWithAxisAngle(v_POLY_multAdd6_val, vec3(0.0, 1.0, 0.0), 1.5707963267948966);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/subtract1\n\tvec3 v_POLY_subtract1_subtract = (v_POLY_rotate1_val - v_POLY_rotate2_val - vec3(0.0, 0.0, 0.0));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/length1\n\tfloat v_POLY_length1_val = length(v_POLY_subtract1_subtract);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/multAdd7\n\tfloat v_POLY_multAdd7_val = (10.0*(v_POLY_length1_val + 0.0)) + 0.0;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/smoothstep1\n\tfloat v_POLY_smoothstep1_val = smoothstep(v_POLY_constant3_val, v_POLY_add2_sum, v_POLY_multAdd7_val);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/null1\n\tfloat v_POLY_null1_val = v_POLY_smoothstep1_val;\n\t\n\t// /geo1/MAT/meshBasicBuilder1/floatToVec3_1\n\tvec3 v_POLY_floatToVec3_1_vec3 = vec3(v_POLY_null1_val, v_POLY_null1_val, v_POLY_null1_val);\n\t\n\t// /geo1/MAT/meshBasicBuilder1/add1\n\tvec3 v_POLY_add1_sum = (v_POLY_floatToVec3_1_vec3 + v_POLY_rotate2_val + vec3(0.0, 0.0, 0.0));\n\t\n\t// /geo1/MAT/meshBasicBuilder1/output1\n\tdiffuseColor.xyz = v_POLY_add1_sum;\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"},"/geo1/COP/builder1":{"fragment":"#include <common>\n\nuniform vec2 resolution;\n\n// removed:\n//// INSERT DEFINE\n\n\n\n// /geo1/COP/builder1/polarToCartesian3\nvec3 cartesianToPolar(vec3 w){\n\tfloat wr = sqrt(dot(w,w));\n\tfloat wo = acos(w.y/wr);\n\tfloat wi = atan(w.x,w.z);\n\treturn vec3(wr,wo,wi);\n}\nvec3 polarToCartesian(vec3 p){\n\tfloat x = p.x * sin(p.y)*sin(p.z);\n\tfloat y = p.x * cos(p.y);\n\tfloat z = p.x * sin(p.y)*cos(p.z);\n\treturn vec3(x,y,z);\n}\n\n// /geo1/COP/builder1/rotate1\n\n\n// https://stackoverflow.com/questions/23793698/how-to-implement-slerp-in-glsl-hlsl\n// vec4 quatSlerp(vec4 p0, vec4 p1, float t)\n// {\n// \tfloat dotp = dot(normalize(p0), normalize(p1));\n// \tif ((dotp > 0.9999) || (dotp < -0.9999))\n// \t{\n// \t\tif (t<=0.5)\n// \t\t\treturn p0;\n// \t\treturn p1;\n// \t}\n// \tfloat theta = acos(dotp);\n// \tvec4 P = ((p0*sin((1.0-t)*theta) + p1*sin(t*theta)) / sin(theta));\n// \tP.w = 1.0;\n// \treturn P;\n// }\n\n// https://devcry.heiho.net/html/2017/20170521-slerp.html\n// float lerp(float a, float b, float t) {\n// \treturn (1.0 - t) * a + t * b;\n// }\n// vec4 quatSlerp(vec4 p0, vec4 p1, float t){\n// \tvec4 qb = p1;\n\n// \t// cos(a) = dot product\n// \tfloat cos_a = p0.x * qb.x + p0.y * qb.y + p0.z * qb.z + p0.w * qb.w;\n// \tif (cos_a < 0.0f) {\n// \t\tcos_a = -cos_a;\n// \t\tqb = -qb;\n// \t}\n\n// \t// close to zero, cos(a) ~= 1\n// \t// do linear interpolation\n// \tif (cos_a > 0.999) {\n// \t\treturn vec4(\n// \t\t\tlerp(p0.x, qb.x, t),\n// \t\t\tlerp(p0.y, qb.y, t),\n// \t\t\tlerp(p0.z, qb.z, t),\n// \t\t\tlerp(p0.w, qb.w, t)\n// \t\t);\n// \t}\n\n// \tfloat alpha = acos(cos_a);\n// \treturn (p0 * sin(1.0 - t) + p1 * sin(t * alpha)) / sin(alpha);\n// }\n\n// https://stackoverflow.com/questions/62943083/interpolate-between-two-quaternions-the-long-way\nvec4 quatSlerp(vec4 q1, vec4 q2, float t){\n\tfloat angle = acos(dot(q1, q2));\n\tfloat denom = sin(angle);\n\t//check if denom is zero\n\treturn (q1*sin((1.0-t)*angle)+q2*sin(t*angle))/denom;\n}\n// TO CHECK:\n// this page https://www.reddit.com/r/opengl/comments/704la7/glsl_quaternion_library/\n// has a link to a potentially nice pdf:\n// http://web.mit.edu/2.998/www/QuaternionReport1.pdf\n\n// https://github.com/mattatz/ShibuyaCrowd/blob/master/source/shaders/common/quaternion.glsl\nvec4 quatMult(vec4 q1, vec4 q2)\n{\n\treturn vec4(\n\tq1.w * q2.x + q1.x * q2.w + q1.z * q2.y - q1.y * q2.z,\n\tq1.w * q2.y + q1.y * q2.w + q1.x * q2.z - q1.z * q2.x,\n\tq1.w * q2.z + q1.z * q2.w + q1.y * q2.x - q1.x * q2.y,\n\tq1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z\n\t);\n}\n// http://glmatrix.net/docs/quat.js.html#line97\n// let ax = a[0], ay = a[1], az = a[2], aw = a[3];\n\n// let bx = b[0], by = b[1], bz = b[2], bw = b[3];\n\n// out[0] = ax * bw + aw * bx + ay * bz - az * by;\n\n// out[1] = ay * bw + aw * by + az * bx - ax * bz;\n\n// out[2] = az * bw + aw * bz + ax * by - ay * bx;\n\n// out[3] = aw * bw - ax * bx - ay * by - az * bz;\n\n// return out\n\n\n\n// http://www.neilmendoza.com/glsl-rotation-about-an-arbitrary-axis/\nmat4 rotationMatrix(vec3 axis, float angle)\n{\n\taxis = normalize(axis);\n\tfloat s = sin(angle);\n\tfloat c = cos(angle);\n\tfloat oc = 1.0 - c;\n\n \treturn mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0.0, oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0.0, oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0.0, 0.0, 0.0, 0.0, 1.0);\n}\n\n// https://www.geeks3d.com/20141201/how-to-rotate-a-vertex-by-a-quaternion-in-glsl/\nvec4 quatFromAxisAngle(vec3 axis, float angle)\n{\n\tvec4 qr;\n\tfloat half_angle = (angle * 0.5); // * 3.14159 / 180.0;\n\tfloat sin_half_angle = sin(half_angle);\n\tqr.x = axis.x * sin_half_angle;\n\tqr.y = axis.y * sin_half_angle;\n\tqr.z = axis.z * sin_half_angle;\n\tqr.w = cos(half_angle);\n\treturn qr;\n}\nvec3 rotateWithAxisAngle(vec3 position, vec3 axis, float angle)\n{\n\tvec4 q = quatFromAxisAngle(axis, angle);\n\tvec3 v = position.xyz;\n\treturn v + 2.0 * cross(q.xyz, cross(q.xyz, v) + q.w * v);\n}\n// vec3 applyQuaternionToVector( vec4 q, vec3 v ){\n// \treturn v + 2.0 * cross( q.xyz, cross( q.xyz, v ) + q.w * v );\n// }\nvec3 rotateWithQuat( vec3 v, vec4 q )\n{\n\t// vec4 qv = multQuat( quat, vec4(vec, 0.0) );\n\t// return multQuat( qv, vec4(-quat.x, -quat.y, -quat.z, quat.w) ).xyz;\n\treturn v + 2.0 * cross( q.xyz, cross( q.xyz, v ) + q.w * v );\n}\n// https://github.com/glslify/glsl-look-at/blob/gh-pages/index.glsl\n// mat3 rotation_matrix(vec3 origin, vec3 target, float roll) {\n// \tvec3 rr = vec3(sin(roll), cos(roll), 0.0);\n// \tvec3 ww = normalize(target - origin);\n// \tvec3 uu = normalize(cross(ww, rr));\n// \tvec3 vv = normalize(cross(uu, ww));\n\n// \treturn mat3(uu, vv, ww);\n// }\n// mat3 rotation_matrix(vec3 target, float roll) {\n// \tvec3 rr = vec3(sin(roll), cos(roll), 0.0);\n// \tvec3 ww = normalize(target);\n// \tvec3 uu = normalize(cross(ww, rr));\n// \tvec3 vv = normalize(cross(uu, ww));\n\n// \treturn mat3(uu, vv, ww);\n// }\n\nfloat vectorAngle(vec3 start, vec3 dest){\n\tstart = normalize(start);\n\tdest = normalize(dest);\n\n\tfloat cosTheta = dot(start, dest);\n\tvec3 c1 = cross(start, dest);\n\t// We use the dot product of the cross with the Y axis.\n\t// This is a little arbitrary, but can still give a good sense of direction\n\tvec3 y_axis = vec3(0.0, 1.0, 0.0);\n\tfloat d1 = dot(c1, y_axis);\n\tfloat angle = acos(cosTheta) * sign(d1);\n\treturn angle;\n}\n\n// http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/#i-need-an-equivalent-of-glulookat-how-do-i-orient-an-object-towards-a-point-\nvec4 vectorAlign(vec3 start, vec3 dest){\n\tstart = normalize(start);\n\tdest = normalize(dest);\n\n\tfloat cosTheta = dot(start, dest);\n\tvec3 axis;\n\n\t// if (cosTheta < -1 + 0.001f){\n\t// \t// special case when vectors in opposite directions:\n\t// \t// there is no ideal rotation axis\n\t// \t// So guess one; any will do as long as it's perpendicular to start\n\t// \taxis = cross(vec3(0.0f, 0.0f, 1.0f), start);\n\t// \tif (length2(axis) < 0.01 ) // bad luck, they were parallel, try again!\n\t// \t\taxis = cross(vec3(1.0f, 0.0f, 0.0f), start);\n\n\t// \taxis = normalize(axis);\n\t// \treturn gtx::quaternion::angleAxis(glm::radians(180.0f), axis);\n\t// }\n\tif(cosTheta > (1.0 - 0.0001) || cosTheta < (-1.0 + 0.0001) ){\n\t\taxis = normalize(cross(start, vec3(0.0, 1.0, 0.0)));\n\t\tif (length(axis) < 0.001 ){ // bad luck, they were parallel, try again!\n\t\t\taxis = normalize(cross(start, vec3(1.0, 0.0, 0.0)));\n\t\t}\n\t} else {\n\t\taxis = normalize(cross(start, dest));\n\t}\n\n\tfloat angle = acos(cosTheta);\n\n\treturn quatFromAxisAngle(axis, angle);\n}\nvec4 vectorAlignWithUp(vec3 start, vec3 dest, vec3 up){\n\tvec4 rot1 = vectorAlign(start, dest);\n\tup = normalize(up);\n\n\t// Recompute desiredUp so that it's perpendicular to the direction\n\t// You can skip that part if you really want to force desiredUp\n\t// vec3 right = normalize(cross(dest, up));\n\t// up = normalize(cross(right, dest));\n\n\t// Because of the 1rst rotation, the up is probably completely screwed up.\n\t// Find the rotation between the up of the rotated object, and the desired up\n\tvec3 newUp = rotateWithQuat(vec3(0.0, 1.0, 0.0), rot1);//rot1 * vec3(0.0, 1.0, 0.0);\n\tvec4 rot2 = vectorAlign(up, newUp);\n\n\t// return rot1;\n\treturn rot2;\n\t// return multQuat(rot1, rot2);\n\t// return rot2 * rot1;\n\n}\n\n// https://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\nfloat quatToAngle(vec4 q){\n\treturn 2.0 * acos(q.w);\n}\nvec3 quatToAxis(vec4 q){\n\treturn vec3(\n\t\tq.x / sqrt(1.0-q.w*q.w),\n\t\tq.y / sqrt(1.0-q.w*q.w),\n\t\tq.z / sqrt(1.0-q.w*q.w)\n\t);\n}\n\nvec4 align(vec3 dir, vec3 up){\n\tvec3 start_dir = vec3(0.0, 0.0, 1.0);\n\tvec3 start_up = vec3(0.0, 1.0, 0.0);\n\tvec4 rot1 = vectorAlign(start_dir, dir);\n\tup = normalize(up);\n\n\t// Recompute desiredUp so that it's perpendicular to the direction\n\t// You can skip that part if you really want to force desiredUp\n\tvec3 right = normalize(cross(dir, up));\n\tif(length(right)<0.001){\n\t\tright = vec3(1.0, 0.0, 0.0);\n\t}\n\tup = normalize(cross(right, dir));\n\n\t// Because of the 1rst rotation, the up is probably completely screwed up.\n\t// Find the rotation between the up of the rotated object, and the desired up\n\tvec3 newUp = rotateWithQuat(start_up, rot1);//rot1 * vec3(0.0, 1.0, 0.0);\n\tvec4 rot2 = vectorAlign(normalize(newUp), up);\n\n\t// return rot1;\n\treturn quatMult(rot1, rot2);\n\t// return rot2 * rot1;\n\n}\n\n\n\n\n\nvoid main() {\n\n\tvec4 diffuseColor = vec4(0.0,0.0,0.0,1.0);\n\n\n// removed:\n//\t// INSERT BODY\n\n\n\n\t// /geo1/COP/builder1/constant3\n\tfloat v_POLY_constant3_val = 0.05;\n\t\n\t// /geo1/COP/builder1/constant4\n\tfloat v_POLY_constant4_val = 0.01;\n\t\n\t// /geo1/COP/builder1/globals1\n\tvec2 v_POLY_globals1_uv = vec2(gl_FragCoord.x / (resolution.x-1.), gl_FragCoord.y / (resolution.y-1.));\n\t\n\t// /geo1/COP/builder1/constant1\n\tfloat v_POLY_constant1_val = 180.0;\n\t\n\t// /geo1/COP/builder1/constant2\n\tfloat v_POLY_constant2_val = 90.0;\n\t\n\t// /geo1/COP/builder1/add2\n\tfloat v_POLY_add2_sum = (v_POLY_constant3_val + v_POLY_constant4_val + 0.0);\n\t\n\t// /geo1/COP/builder1/multAdd4\n\tvec2 v_POLY_multAdd4_val = (vec2(6.283185307179586, 3.141592653589793)*(v_POLY_globals1_uv + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/COP/builder1/floatToVec2_1\n\tvec2 v_POLY_floatToVec2_1_vec2 = vec2(v_POLY_constant1_val, v_POLY_constant2_val);\n\t\n\t// /geo1/COP/builder1/vec2ToFloat2\n\tfloat v_POLY_vec2ToFloat2_y = v_POLY_multAdd4_val.y;\n\tfloat v_POLY_vec2ToFloat2_x = v_POLY_multAdd4_val.x;\n\t\n\t// /geo1/COP/builder1/multAdd3\n\tvec2 v_POLY_multAdd3_val = (v_POLY_floatToVec2_1_vec2*(v_POLY_globals1_uv + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/COP/builder1/floatToVec3_4\n\tvec3 v_POLY_floatToVec3_4_vec3 = vec3(1.0, v_POLY_vec2ToFloat2_y, v_POLY_vec2ToFloat2_x);\n\t\n\t// /geo1/COP/builder1/round1\n\tvec2 v_POLY_round1_val = vec2(sign(v_POLY_multAdd3_val.x)*floor(abs(v_POLY_multAdd3_val.x)+0.5),sign(v_POLY_multAdd3_val.y)*floor(abs(v_POLY_multAdd3_val.y)+0.5));\n\t\n\t// /geo1/COP/builder1/polarToCartesian3\n\tvec3 v_POLY_polarToCartesian3_xyz = polarToCartesian(v_POLY_floatToVec3_4_vec3);\n\t\n\t// /geo1/COP/builder1/divide3\n\tvec2 v_POLY_divide3_divide = (v_POLY_round1_val / v_POLY_floatToVec2_1_vec2 / vec2(1.0, 1.0));\n\t\n\t// /geo1/COP/builder1/multAdd2\n\tvec3 v_POLY_multAdd2_val = (vec3(-1.0, -1.0, -1.0)*(v_POLY_polarToCartesian3_xyz + vec3(0.0, 0.0, 0.0))) + vec3(0.0, 0.0, 0.0);\n\t\n\t// /geo1/COP/builder1/multAdd5\n\tvec2 v_POLY_multAdd5_val = (vec2(6.283185307179586, 3.141592653589793)*(v_POLY_divide3_divide + vec2(0.0, 0.0))) + vec2(0.0, 0.0);\n\t\n\t// /geo1/COP/builder1/rotate1\n\tvec3 v_POLY_rotate1_val = rotateWithAxisAngle(v_POLY_multAdd2_val, vec3(0.0, 1.0, 0.0), 1.5707963267948966);\n\t\n\t// /geo1/COP/builder1/vec2ToFloat3\n\tfloat v_POLY_vec2ToFloat3_y = v_POLY_multAdd5_val.y;\n\tfloat v_POLY_vec2ToFloat3_x = v_POLY_multAdd5_val.x;\n\t\n\t// /geo1/COP/builder1/floatToVec3_5\n\tvec3 v_POLY_floatToVec3_5_vec3 = vec3(1.0, v_POLY_vec2ToFloat3_y, v_POLY_vec2ToFloat3_x);\n\t\n\t// /geo1/COP/builder1/polarToCartesian4\n\tvec3 v_POLY_polarToCartesian4_xyz = polarToCartesian(v_POLY_floatToVec3_5_vec3);\n\t\n\t// /geo1/COP/builder1/multAdd6\n\tvec3 v_POLY_multAdd6_val = (vec3(-1.0, -1.0, -1.0)*(v_POLY_polarToCartesian4_xyz + vec3(0.0, 0.0, 0.0))) + vec3(0.0, 0.0, 0.0);\n\t\n\t// /geo1/COP/builder1/rotate2\n\tvec3 v_POLY_rotate2_val = rotateWithAxisAngle(v_POLY_multAdd6_val, vec3(0.0, 1.0, 0.0), 1.5707963267948966);\n\t\n\t// /geo1/COP/builder1/subtract1\n\tvec3 v_POLY_subtract1_subtract = (v_POLY_rotate1_val - v_POLY_rotate2_val - vec3(0.0, 0.0, 0.0));\n\t\n\t// /geo1/COP/builder1/length1\n\tfloat v_POLY_length1_val = length(v_POLY_subtract1_subtract);\n\t\n\t// /geo1/COP/builder1/multAdd7\n\tfloat v_POLY_multAdd7_val = (10.0*(v_POLY_length1_val + 0.0)) + 0.0;\n\t\n\t// /geo1/COP/builder1/smoothstep1\n\tfloat v_POLY_smoothstep1_val = smoothstep(v_POLY_constant3_val, v_POLY_add2_sum, v_POLY_multAdd7_val);\n\t\n\t// /geo1/COP/builder1/null1\n\tfloat v_POLY_null1_val = v_POLY_smoothstep1_val;\n\t\n\t// /geo1/COP/builder1/floatToVec3_1\n\tvec3 v_POLY_floatToVec3_1_vec3 = vec3(v_POLY_null1_val, v_POLY_null1_val, v_POLY_null1_val);\n\t\n\t// /geo1/COP/builder1/add1\n\tvec3 v_POLY_add1_sum = (v_POLY_floatToVec3_1_vec3 + v_POLY_rotate2_val + vec3(0.0, 0.0, 0.0));\n\t\n\t// /geo1/COP/builder1/output1\n\tdiffuseColor.xyz = v_POLY_add1_sum;\n\n\n\n\n\tgl_FragColor = vec4( diffuseColor );\n}"}},"jsFunctionBodies":{}}
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}}},"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":-78.26087839166352,"y":-251.41304645718645},"zoom":1.0222221069335933},"history":{"2":{"position":{"x":-88.10665897762269,"y":238.8105050669565},"zoom":1.0222221069335933},"36":{"position":{"x":-78.26087839166352,"y":-251.41304645718645},"zoom":1.0222221069335933},"307":{"position":{"x":70.8695506537552,"y":-8.913038844376645},"zoom":1.0222221069335933},"980":{"position":{"x":-83.15218329114249,"y":-230.86956587937476},"zoom":1.0222221069335933},"1893":{"position":{"x":68.91302869396361,"y":-19.67390962323038},"zoom":1.0222221069335933},"1896":{"position":{"x":29.36292903411787,"y":-449.031053088791},"zoom":0.523222106933593}},"paramsDisplayed":false,"linkIndex":1}},"split_mode":"horizontal"},"currentNodes":["/geo1","/","/","/","/","/","/","/"],"navigationHistory":{"nodePaths":{"1":["/","/geo1","/geo1/COP","/geo1/COP/builder1","/geo1/COP","/geo1","/geo1/COP","/geo1"],"2":["/"],"3":["/"],"4":["/"],"5":["/"],"6":["/"],"7":["/"],"8":["/"]},"index":{"1":7,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0}},"fullscreenPanelId":null,"saveOptions":{"checkRemoteAssetsUse":true,"minimizeFilesCount":false},"paramsModal":[]}
Used nodes
cop/builder;event/cameraOrbitControls;mat/meshBasic;mat/meshBasicBuilder;obj/geo;rop/WebGLRenderer;sop/cameraControls;sop/cameraRenderer;sop/copNetwork;sop/material;sop/materialsNetwork;sop/perspectiveCamera;sop/planeHelper;sop/sphere
Used operations
Used modules
Used assemblers
GL_MESH_BASIC;GL_TEXTURE
Used integrations
[]
Used assets
Nodes map
{"/geo1":"obj/geo","/geo1/sphere1":"sop/sphere","/geo1/material1":"sop/material","/geo1/MAT":"sop/materialsNetwork","/geo1/MAT/meshBasicBuilder1":"mat/meshBasicBuilder","/geo1/MAT/meshBasic1":"mat/meshBasic","/geo1/COP":"sop/copNetwork","/geo1/COP/builder1":"cop/builder","/geo1/material2":"sop/material","/ground":"obj/geo","/ground/planeHelper1":"sop/planeHelper","/cameras":"obj/geo","/cameras/perspectiveCamera1":"sop/perspectiveCamera","/cameras/cameraControls1":"sop/cameraControls","/cameras/cameraControls1/cameraOrbitControls1":"event/cameraOrbitControls","/cameras/cameraRenderer1":"sop/cameraRenderer","/cameras/cameraRenderer1/WebGLRenderer1":"rop/WebGLRenderer"}
Js version
Editor version
Engine version
Logout
0%
There was a problem displaying your scene:
view scene source