From 7e76edc1534805b7beb937e184ad68dc7b3841b2 Mon Sep 17 00:00:00 2001 From: Marco Date: Fri, 27 Jun 2025 15:06:33 +0200 Subject: [PATCH] 3D Cameras with sweep and animation --- 3D/BlockbenchModels/Camera/Camera.bbmodel | 2 +- 3D/BlockbenchModels/Camera/Camera.gltf | 2 +- 3D/MapModels/actor_alarmbox.glb | Bin 5492 -> 5628 bytes 3D/MapModels/actor_securitycamera.glb | Bin 0 -> 22520 bytes 3D/MapScenes/TestLevel.tscn | 1204 +++++++++-------- 3D/Maps/Level1.map | 1137 +++++++++------- 3D/Scenes/Props/Alarm_Box_3D.tscn | 14 +- 3D/Scenes/Props/Camera_3D.tscn | 44 +- .../point/actors/Actor_SecurityCamera.tres | 31 + 3D/TrenchBroom/fgd_point.tres | 5 +- IsoTest/IsoMapTest2.tscn | 434 +----- Scripts/Actors/3D/AlarmSoundPlayer3D.cs | 27 + Scripts/Actors/3D/AlarmSoundPlayer3D.cs.uid | 1 + Scripts/Actors/3D/SecurityCamera3D.cs | 24 + Scripts/Actors/3D/SecurityCamera3D.cs.uid | 1 + Scripts/Actors/Destructible3D.cs | 36 - Scripts/AlarmManager.cs | 29 +- Scripts/Interactables/AlarmBox3D.cs | 28 +- addons/tattomoosa.vision_cone_3d/LICENSE.txt | 19 + addons/tattomoosa.vision_cone_3d/README.md | 126 ++ .../examples/demo.tscn | 246 ++++ .../example_src/VisionConeDemoControls.gd | 71 + .../example_src/VisionConeDemoControls.gd.uid | 1 + .../examples/example_src/blocker.tscn | 16 + .../example_src/moving_observable.tscn | 39 + .../examples/example_src/observable.tscn | 31 + .../examples/example_src/observer.tscn | 34 + .../examples/example_src/ui/ValueLabel.gd | 10 + .../examples/example_src/ui/ValueLabel.gd.uid | 1 + .../example_src/vision_cone_controls.tscn | 186 +++ .../examples/minimal.tscn | 26 + .../icons/GizmoVisionCone.svg | 33 + .../icons/GizmoVisionCone.svg.import | 38 + .../icons/VisionCone3D.svg | 11 + .../icons/VisionCone3D.svg.import | 38 + addons/tattomoosa.vision_cone_3d/plugin.cfg | 7 + addons/tattomoosa.vision_cone_3d/plugin.gd | 21 + .../tattomoosa.vision_cone_3d/plugin.gd.uid | 1 + .../src/ConeShape3D.gd | 50 + .../src/ConeShape3D.gd.uid | 1 + .../src/VisionCone3D.gd | 421 ++++++ .../src/VisionCone3D.gd.uid | 1 + .../src/debug/VisionConeDebugVisualizer3D.gd | 99 ++ .../debug/VisionConeDebugVisualizer3D.gd.uid | 1 + .../src/editor/VisionCone3DGizmoPlugin.gd | 182 +++ .../src/editor/VisionCone3DGizmoPlugin.gd.uid | 1 + project.godot | 2 +- textures/special/trigger.png | 2 +- 48 files changed, 3217 insertions(+), 1517 deletions(-) create mode 100644 3D/MapModels/actor_securitycamera.glb create mode 100644 3D/TrenchBroom/EntityDefinitions/point/actors/Actor_SecurityCamera.tres create mode 100644 Scripts/Actors/3D/AlarmSoundPlayer3D.cs create mode 100644 Scripts/Actors/3D/AlarmSoundPlayer3D.cs.uid create mode 100644 Scripts/Actors/3D/SecurityCamera3D.cs create mode 100644 Scripts/Actors/3D/SecurityCamera3D.cs.uid create mode 100644 addons/tattomoosa.vision_cone_3d/LICENSE.txt create mode 100644 addons/tattomoosa.vision_cone_3d/README.md create mode 100644 addons/tattomoosa.vision_cone_3d/examples/demo.tscn create mode 100644 addons/tattomoosa.vision_cone_3d/examples/example_src/VisionConeDemoControls.gd create mode 100644 addons/tattomoosa.vision_cone_3d/examples/example_src/VisionConeDemoControls.gd.uid create mode 100644 addons/tattomoosa.vision_cone_3d/examples/example_src/blocker.tscn create mode 100644 addons/tattomoosa.vision_cone_3d/examples/example_src/moving_observable.tscn create mode 100644 addons/tattomoosa.vision_cone_3d/examples/example_src/observable.tscn create mode 100644 addons/tattomoosa.vision_cone_3d/examples/example_src/observer.tscn create mode 100644 addons/tattomoosa.vision_cone_3d/examples/example_src/ui/ValueLabel.gd create mode 100644 addons/tattomoosa.vision_cone_3d/examples/example_src/ui/ValueLabel.gd.uid create mode 100644 addons/tattomoosa.vision_cone_3d/examples/example_src/vision_cone_controls.tscn create mode 100644 addons/tattomoosa.vision_cone_3d/examples/minimal.tscn create mode 100644 addons/tattomoosa.vision_cone_3d/icons/GizmoVisionCone.svg create mode 100644 addons/tattomoosa.vision_cone_3d/icons/GizmoVisionCone.svg.import create mode 100644 addons/tattomoosa.vision_cone_3d/icons/VisionCone3D.svg create mode 100644 addons/tattomoosa.vision_cone_3d/icons/VisionCone3D.svg.import create mode 100644 addons/tattomoosa.vision_cone_3d/plugin.cfg create mode 100644 addons/tattomoosa.vision_cone_3d/plugin.gd create mode 100644 addons/tattomoosa.vision_cone_3d/plugin.gd.uid create mode 100644 addons/tattomoosa.vision_cone_3d/src/ConeShape3D.gd create mode 100644 addons/tattomoosa.vision_cone_3d/src/ConeShape3D.gd.uid create mode 100644 addons/tattomoosa.vision_cone_3d/src/VisionCone3D.gd create mode 100644 addons/tattomoosa.vision_cone_3d/src/VisionCone3D.gd.uid create mode 100644 addons/tattomoosa.vision_cone_3d/src/debug/VisionConeDebugVisualizer3D.gd create mode 100644 addons/tattomoosa.vision_cone_3d/src/debug/VisionConeDebugVisualizer3D.gd.uid create mode 100644 addons/tattomoosa.vision_cone_3d/src/editor/VisionCone3DGizmoPlugin.gd create mode 100644 addons/tattomoosa.vision_cone_3d/src/editor/VisionCone3DGizmoPlugin.gd.uid diff --git a/3D/BlockbenchModels/Camera/Camera.bbmodel b/3D/BlockbenchModels/Camera/Camera.bbmodel index 613eabeb..e9de2e57 100644 --- a/3D/BlockbenchModels/Camera/Camera.bbmodel +++ b/3D/BlockbenchModels/Camera/Camera.bbmodel @@ -1 +1 @@ -{"meta":{"format_version":"4.10","model_format":"free","box_uv":false},"name":"Camera","model_identifier":"","visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"timeline_setups":[],"unhandled_root_fields":{},"resolution":{"width":32,"height":32},"elements":[{"name":"cuboid","color":2,"origin":[0,4,-1],"rotation":[0,0,0],"export":true,"visibility":true,"locked":false,"render_order":"default","allow_mirror_modeling":true,"vertices":{"MIEL":[2,2,0],"1QvB":[2,2,-8],"5Fcu":[2,-2,0],"4WS7":[2,-2,-8],"0OLc":[-2,2,0],"BRnO":[-2,2,-8],"6k8M":[-2,-2,0],"LEiA":[-2,-2,-8]},"faces":{"H06ocoL5":{"uv":{"4WS7":[8,14],"1QvB":[8,10],"5Fcu":[0,14],"MIEL":[0,10]},"vertices":["MIEL","5Fcu","1QvB","4WS7"],"texture":0},"cu0w1X3c":{"uv":{"LEiA":[11,4],"6k8M":[19,4],"BRnO":[11,0],"0OLc":[19,0]},"vertices":["0OLc","BRnO","6k8M","LEiA"],"texture":0},"C1IRND7L":{"uv":{"BRnO":[0,15],"0OLc":[0,23],"1QvB":[4,15],"MIEL":[4,23]},"vertices":["MIEL","1QvB","0OLc","BRnO"],"texture":0},"cJIB2BPt":{"uv":{"LEiA":[5,27],"4WS7":[9,27],"6k8M":[5,19],"5Fcu":[9,19]},"vertices":["5Fcu","6k8M","4WS7","LEiA"],"texture":0},"VRMBC2c9":{"uv":{"6k8M":[20,4],"5Fcu":[24,4],"0OLc":[20,0],"MIEL":[24,0]},"vertices":["MIEL","0OLc","5Fcu","6k8M"],"texture":0},"XWrsvaQQ":{"uv":{"LEiA":[24,12],"BRnO":[24,8],"4WS7":[20,12],"1QvB":[20,8]},"vertices":["1QvB","4WS7","BRnO","LEiA"],"texture":0}},"type":"mesh","uuid":"e086e9cf-769a-57fa-3e84-4b8bf844eeef"},{"name":"cylinder","color":2,"origin":[0,4,-1],"rotation":[-90,0,0],"export":true,"visibility":true,"locked":false,"render_order":"default","allow_mirror_modeling":true,"vertices":{"04m4":[0,8,0],"z0AZ":[0,9,0],"FIe1":[0.26795,8,1],"9Bsp":[0.26795,9,1],"VkbT":[0.73205,8,0.73205],"IaxI":[0.73205,9,0.73205],"g1im":[1,8,0.26795],"Fifk":[1,9,0.26795],"1yjE":[1,8,-0.26795],"HCW7":[1,9,-0.26795],"L6IR":[0.73205,8,-0.73205],"y0Qx":[0.73205,9,-0.73205],"HSg2":[0.26795,8,-1],"X6eN":[0.26795,9,-1],"nXXk":[-0.26795,8,-1],"UnhK":[-0.26795,9,-1],"PGeL":[-0.73205,8,-0.73205],"AGoM":[-0.73205,9,-0.73205],"Xzz3":[-1,8,-0.26795],"MG9P":[-1,9,-0.26795],"AQLL":[-1,8,0.26795],"7xoh":[-1,9,0.26795],"vIiR":[-0.73205,8,0.73205],"1c3w":[-0.73205,9,0.73205],"b3Bo":[-0.26795,8,1],"rt89":[-0.26795,9,1]},"faces":{"MeSFzxx5":{"uv":{"04m4":[6,16],"FIe1":[6.2679,15],"VkbT":[6.7321,15.2679]},"vertices":["VkbT","FIe1","04m4"],"texture":0},"b6Yxtr0U":{"uv":{"9Bsp":[17.2679,22],"IaxI":[17.8037,22],"VkbT":[17.8037,23],"FIe1":[17.2679,23]},"vertices":["FIe1","VkbT","IaxI","9Bsp"],"texture":0},"pxCB3d7o":{"uv":{"z0AZ":[22,20],"IaxI":[22.7321,20.7321],"9Bsp":[22.2679,21]},"vertices":["9Bsp","IaxI","z0AZ"],"texture":0},"UUXtJ3qg":{"uv":{"04m4":[6,16],"VkbT":[6.7321,15.2679],"g1im":[7,15.7321]},"vertices":["g1im","VkbT","04m4"],"texture":0},"729xh4BI":{"uv":{"IaxI":[10.1963,22],"Fifk":[10.7321,22],"g1im":[10.7321,23],"VkbT":[10.1963,23]},"vertices":["VkbT","g1im","Fifk","IaxI"],"texture":0},"6fVg5ejE":{"uv":{"z0AZ":[22,20],"Fifk":[23,20.2679],"IaxI":[22.7321,20.7321]},"vertices":["IaxI","Fifk","z0AZ"],"texture":0},"5a0Rriwa":{"uv":{"04m4":[6,16],"g1im":[7,15.7321],"1yjE":[7,16.2679]},"vertices":["1yjE","g1im","04m4"],"texture":0},"DR4N8J5T":{"uv":{"Fifk":[10.7321,22],"HCW7":[11.2679,22],"1yjE":[11.2679,23],"g1im":[10.7321,23]},"vertices":["g1im","1yjE","HCW7","Fifk"],"texture":0},"2YfS1mc2":{"uv":{"z0AZ":[22,20],"HCW7":[23,19.7321],"Fifk":[23,20.2679]},"vertices":["Fifk","HCW7","z0AZ"],"texture":0},"7N0U03LM":{"uv":{"04m4":[6,16],"1yjE":[7,16.2679],"L6IR":[6.7321,16.7321]},"vertices":["L6IR","1yjE","04m4"],"texture":0},"TtNfEdCV":{"uv":{"HCW7":[11.2679,22],"y0Qx":[11.8037,22],"L6IR":[11.8037,23],"1yjE":[11.2679,23]},"vertices":["1yjE","L6IR","y0Qx","HCW7"],"texture":0},"AqgZggh5":{"uv":{"z0AZ":[22,20],"y0Qx":[22.7321,19.2679],"HCW7":[23,19.7321]},"vertices":["HCW7","y0Qx","z0AZ"],"texture":0},"yWS4Wond":{"uv":{"04m4":[6,16],"L6IR":[6.7321,16.7321],"HSg2":[6.2679,17]},"vertices":["HSg2","L6IR","04m4"],"texture":0},"o5BiEYYd":{"uv":{"y0Qx":[13.1963,22],"X6eN":[13.7321,22],"HSg2":[13.7321,23],"L6IR":[13.1963,23]},"vertices":["L6IR","HSg2","X6eN","y0Qx"],"texture":0},"1tq4Qs3s":{"uv":{"z0AZ":[22,20],"X6eN":[22.2679,19],"y0Qx":[22.7321,19.2679]},"vertices":["y0Qx","X6eN","z0AZ"],"texture":0},"lVB8zbxs":{"uv":{"04m4":[6,16],"HSg2":[6.2679,17],"nXXk":[5.7321,17]},"vertices":["nXXk","HSg2","04m4"],"texture":0},"B5EjtLVS":{"uv":{"X6eN":[13.7321,22],"UnhK":[14.2679,22],"nXXk":[14.2679,23],"HSg2":[13.7321,23]},"vertices":["HSg2","nXXk","UnhK","X6eN"],"texture":0},"pn5vZLhE":{"uv":{"z0AZ":[22,20],"UnhK":[21.7321,19],"X6eN":[22.2679,19]},"vertices":["X6eN","UnhK","z0AZ"],"texture":0},"u6XCQOMU":{"uv":{"04m4":[6,16],"nXXk":[5.7321,17],"PGeL":[5.2679,16.7321]},"vertices":["PGeL","nXXk","04m4"],"texture":0},"I7dlmaqk":{"uv":{"UnhK":[14.2679,22],"AGoM":[14.8037,22],"PGeL":[14.8037,23],"nXXk":[14.2679,23]},"vertices":["nXXk","PGeL","AGoM","UnhK"],"texture":0},"70VfGCkh":{"uv":{"z0AZ":[22,20],"AGoM":[21.2679,19.2679],"UnhK":[21.7321,19]},"vertices":["UnhK","AGoM","z0AZ"],"texture":0},"HqzjOEbj":{"uv":{"04m4":[6,16],"PGeL":[5.2679,16.7321],"Xzz3":[5,16.2679]},"vertices":["Xzz3","PGeL","04m4"],"texture":0},"4wQQo6KD":{"uv":{"AGoM":[19.1963,22],"MG9P":[19.7321,22],"Xzz3":[19.7321,23],"PGeL":[19.1963,23]},"vertices":["PGeL","Xzz3","MG9P","AGoM"],"texture":0},"1UoQ18Nm":{"uv":{"z0AZ":[22,20],"MG9P":[21,19.7321],"AGoM":[21.2679,19.2679]},"vertices":["AGoM","MG9P","z0AZ"],"texture":0},"aoxuxywj":{"uv":{"04m4":[6,16],"Xzz3":[5,16.2679],"AQLL":[5,15.7321]},"vertices":["AQLL","Xzz3","04m4"],"texture":0},"6gCiY5zK":{"uv":{"MG9P":[19.7321,22],"7xoh":[20.2679,22],"AQLL":[20.2679,23],"Xzz3":[19.7321,23]},"vertices":["Xzz3","AQLL","7xoh","MG9P"],"texture":0},"FIWTSUgW":{"uv":{"z0AZ":[22,20],"7xoh":[21,20.2679],"MG9P":[21,19.7321]},"vertices":["MG9P","7xoh","z0AZ"],"texture":0},"q6sRhihc":{"uv":{"04m4":[6,16],"AQLL":[5,15.7321],"vIiR":[5.2679,15.2679]},"vertices":["vIiR","AQLL","04m4"],"texture":0},"kYPD1Dhg":{"uv":{"7xoh":[20.2679,22],"1c3w":[20.8037,22],"vIiR":[20.8037,23],"AQLL":[20.2679,23]},"vertices":["AQLL","vIiR","1c3w","7xoh"],"texture":0},"kuQKk0Xg":{"uv":{"z0AZ":[22,20],"1c3w":[21.2679,20.7321],"7xoh":[21,20.2679]},"vertices":["7xoh","1c3w","z0AZ"],"texture":0},"FQlC8Rnn":{"uv":{"04m4":[6,16],"vIiR":[5.2679,15.2679],"b3Bo":[5.7321,15]},"vertices":["b3Bo","vIiR","04m4"],"texture":0},"Kg7MtpJf":{"uv":{"1c3w":[16.1963,22],"rt89":[16.7321,22],"b3Bo":[16.7321,23],"vIiR":[16.1963,23]},"vertices":["vIiR","b3Bo","rt89","1c3w"],"texture":0},"ItohJ1TN":{"uv":{"z0AZ":[22,20],"rt89":[21.7321,21],"1c3w":[21.2679,20.7321]},"vertices":["1c3w","rt89","z0AZ"],"texture":0},"W4zJFLz7":{"uv":{"04m4":[6,16],"b3Bo":[5.7321,15],"FIe1":[6.2679,15]},"vertices":["FIe1","b3Bo","04m4"],"texture":0},"A57ayrYp":{"uv":{"rt89":[16.7321,22],"9Bsp":[17.2679,22],"FIe1":[17.2679,23],"b3Bo":[16.7321,23]},"vertices":["b3Bo","FIe1","9Bsp","rt89"],"texture":0},"NtVGTSYk":{"uv":{"z0AZ":[22,20],"9Bsp":[22.2679,21],"rt89":[21.7321,21]},"vertices":["rt89","9Bsp","z0AZ"],"texture":0}},"type":"mesh","uuid":"15c36931-5df5-bb76-a5be-0bf2ba8af15b"},{"name":"cylinder","color":2,"origin":[0,0,0],"rotation":[0,0,0],"export":true,"visibility":true,"locked":false,"render_order":"default","allow_mirror_modeling":true,"vertices":{"9EEC":[0,5,0],"HZgJ":[0,7,0],"pahg":[1.33975,5,3],"PP73":[1.33975,7,3],"zoum":[3.66025,5,2.66025],"A8ac":[3.66025,7,2.66025],"Lwei":[5,5,2.0718],"65V7":[5,7,2.0718],"cY6c":[5,5,1.3923],"oCPZ":[5,7,1.3923],"2BBZ":[4.3923,5,-4.3923],"AeTM":[4.3923,7,-4.3923],"XCBp":[1.6077,5,-6],"rRgT":[1.6077,7,-6],"wQr4":[-1.6077,5,-6],"5vmP":[-1.6077,7,-6],"46v0":[-4.3923,5,-4.3923],"2i7L":[-4.3923,7,-4.3923],"1ZC1":[-5,5,1.3923],"7E6Y":[-5,7,1.3923],"V87t":[-5,5,2.0718],"w8Re":[-5,7,2.0718],"wiCD":[-3.66025,5,2.66025],"8sQn":[-3.66025,7,2.66025],"V66a":[-1.33975,5,3],"MuP1":[-1.33975,7,3]},"faces":{"FE38SLNd":{"uv":{"9EEC":[5,3],"pahg":[6.3397,0],"zoum":[8.6603,0.3397]},"vertices":["zoum","pahg","9EEC"],"texture":0},"pLgdjub5":{"uv":{"PP73":[17.8397,5],"A8ac":[20.185,5],"zoum":[20.185,7],"pahg":[17.8397,7]},"vertices":["pahg","zoum","A8ac","PP73"],"texture":0},"i5drJXGA":{"uv":{"HZgJ":[14,15],"A8ac":[17.6603,17.6603],"PP73":[15.3397,18]},"vertices":["PP73","A8ac","HZgJ"],"texture":0},"aqc6fp7N":{"uv":{"9EEC":[5,3],"zoum":[8.6603,0.3397],"Lwei":[10,0.9282]},"vertices":["Lwei","zoum","9EEC"],"texture":0},"MHN6eZqw":{"uv":{"A8ac":[20.185,5],"65V7":[21.6483,5],"Lwei":[21.6483,7],"zoum":[20.185,7]},"vertices":["zoum","Lwei","65V7","A8ac"],"texture":0},"jzRTicMJ":{"uv":{"HZgJ":[14,15],"65V7":[19,17.0718],"A8ac":[17.6603,17.6603]},"vertices":["A8ac","65V7","HZgJ"],"texture":0},"prV1OIpI":{"uv":{"9EEC":[5,3],"2BBZ":[9.3923,7.3923],"XCBp":[6.6077,9]},"vertices":["XCBp","2BBZ","9EEC"],"texture":0},"to9T2YjQ":{"uv":{"AeTM":[10.1769,19],"rRgT":[13.3923,19],"XCBp":[13.3923,21],"2BBZ":[10.1769,21]},"vertices":["2BBZ","XCBp","rRgT","AeTM"],"texture":0},"Y594ctYr":{"uv":{"HZgJ":[14,15],"rRgT":[15.6077,9],"AeTM":[18.3923,10.6077]},"vertices":["AeTM","rRgT","HZgJ"],"texture":0},"KFzmTzP8":{"uv":{"9EEC":[5,3],"XCBp":[6.6077,9],"wQr4":[3.3923,9]},"vertices":["wQr4","XCBp","9EEC"],"texture":0},"9NVQlFZW":{"uv":{"rRgT":[13.3923,19],"5vmP":[16.6077,19],"wQr4":[16.6077,21],"XCBp":[13.3923,21]},"vertices":["XCBp","wQr4","5vmP","rRgT"],"texture":0},"hUTGwxw4":{"uv":{"HZgJ":[14,15],"5vmP":[12.3923,9],"rRgT":[15.6077,9]},"vertices":["rRgT","5vmP","HZgJ"],"texture":0},"W126lRyp":{"uv":{"9EEC":[5,3],"wQr4":[3.3923,9],"46v0":[0.6077,7.3923]},"vertices":["46v0","wQr4","9EEC"],"texture":0},"B7o0XrGB":{"uv":{"5vmP":[16.6077,19],"2i7L":[19.8231,19],"46v0":[19.8231,21],"wQr4":[16.6077,21]},"vertices":["wQr4","46v0","2i7L","5vmP"],"texture":0},"AAEBFFec":{"uv":{"HZgJ":[14,15],"2i7L":[9.6077,10.6077],"5vmP":[12.3923,9]},"vertices":["5vmP","2i7L","HZgJ"],"texture":0},"wZo3nrFH":{"uv":{"9EEC":[5,3],"46v0":[0.6077,7.3923],"1ZC1":[0,1.6077]},"vertices":["1ZC1","46v0","9EEC"],"texture":0},"GdC0hl9I":{"uv":{"2i7L":[20.252,16],"7E6Y":[26.0685,16],"1ZC1":[26.0685,18],"46v0":[20.252,18]},"vertices":["46v0","1ZC1","7E6Y","2i7L"],"texture":0},"IncekCtd":{"uv":{"HZgJ":[14,15],"7E6Y":[9,16.3923],"2i7L":[9.6077,10.6077]},"vertices":["2i7L","7E6Y","HZgJ"],"texture":0},"Nh7fizfS":{"uv":{"9EEC":[5,3],"wiCD":[1.3397,0.3397],"V66a":[3.6603,0]},"vertices":["V66a","wiCD","9EEC"],"texture":0},"6eETX4DG":{"uv":{"8sQn":[12.815,5],"MuP1":[15.1603,5],"V66a":[15.1603,7],"wiCD":[12.815,7]},"vertices":["wiCD","V66a","MuP1","8sQn"],"texture":0},"R9p8DOgn":{"uv":{"HZgJ":[14,15],"MuP1":[12.6603,18],"8sQn":[10.3397,17.6603]},"vertices":["8sQn","MuP1","HZgJ"],"texture":0},"bnM7BTSM":{"uv":{"9EEC":[5,3],"V66a":[3.6603,0],"pahg":[6.3397,0]},"vertices":["pahg","V66a","9EEC"],"texture":0},"EoF2hrs9":{"uv":{"MuP1":[15.1603,5],"PP73":[17.8397,5],"pahg":[17.8397,7],"V66a":[15.1603,7]},"vertices":["V66a","pahg","PP73","MuP1"],"texture":0},"zURwYD29":{"uv":{"HZgJ":[14,15],"PP73":[15.3397,18],"MuP1":[12.6603,18]},"vertices":["MuP1","PP73","HZgJ"],"texture":0},"cH9GAMlE":{"uv":{"9EEC":[5,3],"Lwei":[10,0.9282],"cY6c":[10,1.6077]},"vertices":["cY6c","Lwei","9EEC"],"texture":0},"UQBZR7Yn":{"uv":{"65V7":[20.252,13],"oCPZ":[20.9315,13],"cY6c":[20.9315,15],"Lwei":[20.252,15]},"vertices":["Lwei","cY6c","oCPZ","65V7"],"texture":0},"xLC3gJTf":{"uv":{"9EEC":[5,3],"cY6c":[10,1.6077],"2BBZ":[9.3923,7.3923]},"vertices":["2BBZ","cY6c","9EEC"],"texture":0},"Hgp4e55b":{"uv":{"oCPZ":[20.9315,13],"AeTM":[26.748,13],"2BBZ":[26.748,15],"cY6c":[20.9315,15]},"vertices":["cY6c","2BBZ","AeTM","oCPZ"],"texture":0},"rd5V4XAZ":{"uv":{"9EEC":[5,3],"1ZC1":[0,1.6077],"V87t":[0,0.9282]},"vertices":["V87t","1ZC1","9EEC"],"texture":0},"5N4CjuLG":{"uv":{"7E6Y":[26.0685,16],"w8Re":[26.748,16],"V87t":[26.748,18],"1ZC1":[26.0685,18]},"vertices":["1ZC1","V87t","w8Re","7E6Y"],"texture":0},"GWXPfOWZ":{"uv":{"9EEC":[5,3],"V87t":[0,0.9282],"wiCD":[1.3397,0.3397]},"vertices":["wiCD","V87t","9EEC"],"texture":0},"jlX3Kihl":{"uv":{"w8Re":[11.3517,5],"8sQn":[12.815,5],"wiCD":[12.815,7],"V87t":[11.3517,7]},"vertices":["V87t","wiCD","8sQn","w8Re"],"texture":0},"aYowS6uf":{"uv":{"HZgJ":[14,15],"oCPZ":[19,16.3923],"65V7":[19,17.0718]},"vertices":["65V7","oCPZ","HZgJ"],"texture":0},"tEEyFKVX":{"uv":{"HZgJ":[14,15],"AeTM":[18.3923,10.6077],"oCPZ":[19,16.3923]},"vertices":["oCPZ","AeTM","HZgJ"],"texture":0},"xW4KISjM":{"uv":{"HZgJ":[14,15],"w8Re":[9,17.0718],"7E6Y":[9,16.3923]},"vertices":["7E6Y","w8Re","HZgJ"],"texture":0},"n559vOLF":{"uv":{"HZgJ":[14,15],"8sQn":[10.3397,17.6603],"w8Re":[9,17.0718]},"vertices":["w8Re","8sQn","HZgJ"],"texture":0}},"type":"mesh","uuid":"475147de-59b2-fd16-2fbe-6fd576eac854"}],"outliner":[{"name":"Model","origin":[0,0,0],"color":0,"uuid":"12e023c4-2179-497f-29b7-be780199743e","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":[{"name":"Camera","origin":[0,4,-1],"rotation":[-15,0,0],"color":0,"uuid":"99a67458-c95e-b360-0373-8340a17cf81b","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":["e086e9cf-769a-57fa-3e84-4b8bf844eeef","15c36931-5df5-bb76-a5be-0bf2ba8af15b"]},{"name":"Assembly","origin":[0,0,0],"color":0,"uuid":"f9ef5425-ba1d-54b8-6ec4-d3992736ea08","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":["475147de-59b2-fd16-2fbe-6fd576eac854"]}]}],"textures":[{"path":"K:\\godot\\cirno\\3D\\BlockbenchModels\\Camera\\Camera_Texture.png","name":"Camera_Texture.png","folder":"block","namespace":"","id":"0","group":"","width":32,"height":32,"uv_width":32,"uv_height":32,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","pbr_channel":"color","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"c26341a1-38fe-0639-bfa2-371a654718b5","relative_path":"Camera_Texture.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAR5JREFUWEdjdDAO/s9ABDhwdi2jkozUfzlxS7DqRy+PM8DYMO0gNejmgcTwGY+hAZfiUQcMihAgIqmQrISkNEBsggW5glDig7l0aDmA5PAlQgM4jxIKWmKDE5tZhPTiLSSQPUCsIykuiJBLOBD73pNnFKUTgiGA7uIh7wAi0h2KEozgpXYIINuGLTqISoSEEiC+2pCgA0BVLLIiUKILTiwBi62d30NUNkV2AMVRAAomShyAL7SwRgEx+ZbuUUBqMFKiHmsTCluokBIKWxS0wGnI58E1gol86DiAkmAmqVGKq2VrLa4KDtajL28zEsMm1sFY4whb2UCsgaSqw+oAYrImqRbhUj84HTDgUUCt4CXGHIIFBTGGUKJm1AEDHgIAg5YsMPpU9S4AAAAASUVORK5CYII="}],"animations":[{"uuid":"125a5da9-3c2f-2e61-aab4-ee896882b228","name":"Idle","loop":"hold","override":false,"length":0,"snapping":24,"selected":false,"anim_time_update":"","blend_weight":"","start_delay":"","loop_delay":"","animators":{"99a67458-c95e-b360-0373-8340a17cf81b":{"name":"Camera","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"7f683b25-e9ac-a16c-3c9e-5a484de15c18","time":0,"color":-1,"interpolation":"linear"}]}}},{"uuid":"dc67ba7e-9f20-1d18-9625-69395c49edff","name":"Sweep","loop":"hold","override":false,"length":2,"snapping":24,"selected":false,"anim_time_update":"","blend_weight":"","start_delay":"","loop_delay":"","animators":{"99a67458-c95e-b360-0373-8340a17cf81b":{"name":"Camera","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"0","y":"35","z":"0"}],"uuid":"eaa31a29-b763-5f81-6820-cfee30c4ec49","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"-35","z":"0"}],"uuid":"3a4ae32d-74f4-66e8-30d4-59b8c1f09b27","time":2,"color":-1,"interpolation":"linear"}]}}},{"uuid":"a4b6cc46-7285-c16c-de56-55794be3b309","name":"SweepBack","loop":"hold","override":false,"length":2,"snapping":24,"selected":true,"anim_time_update":"","blend_weight":"","start_delay":"","loop_delay":"","animators":{"99a67458-c95e-b360-0373-8340a17cf81b":{"name":"Camera","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"0","y":"-35","z":"0"}],"uuid":"eaa31a29-b763-5f81-6820-cfee30c4ec49","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"35","z":"0"}],"uuid":"3a4ae32d-74f4-66e8-30d4-59b8c1f09b27","time":2,"color":-1,"interpolation":"linear"}]}}}]} \ No newline at end of file +{"meta":{"format_version":"4.10","model_format":"free","box_uv":false},"name":"Camera","model_identifier":"","visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"timeline_setups":[],"unhandled_root_fields":{},"reexport":{"codec":"gltf","codec_options":{"encoding":"ascii","scale":16,"embed_textures":true,"armature":false,"animations":true},"path":".\\Camera.gltf","enabled":true},"resolution":{"width":32,"height":32},"elements":[{"name":"cuboid","color":2,"origin":[0,4,-1],"rotation":[0,0,0],"export":true,"visibility":true,"locked":false,"render_order":"default","allow_mirror_modeling":true,"vertices":{"MIEL":[2,2,0],"1QvB":[2,2,-8],"5Fcu":[2,-2,0],"4WS7":[2,-2,-8],"0OLc":[-2,2,0],"BRnO":[-2,2,-8],"6k8M":[-2,-2,0],"LEiA":[-2,-2,-8]},"faces":{"H06ocoL5":{"uv":{"4WS7":[8,14],"1QvB":[8,10],"5Fcu":[0,14],"MIEL":[0,10]},"vertices":["MIEL","5Fcu","1QvB","4WS7"],"texture":0},"cu0w1X3c":{"uv":{"LEiA":[11,4],"6k8M":[19,4],"BRnO":[11,0],"0OLc":[19,0]},"vertices":["0OLc","BRnO","6k8M","LEiA"],"texture":0},"C1IRND7L":{"uv":{"BRnO":[0,15],"0OLc":[0,23],"1QvB":[4,15],"MIEL":[4,23]},"vertices":["MIEL","1QvB","0OLc","BRnO"],"texture":0},"cJIB2BPt":{"uv":{"LEiA":[5,27],"4WS7":[9,27],"6k8M":[5,19],"5Fcu":[9,19]},"vertices":["5Fcu","6k8M","4WS7","LEiA"],"texture":0},"VRMBC2c9":{"uv":{"6k8M":[20,4],"5Fcu":[24,4],"0OLc":[20,0],"MIEL":[24,0]},"vertices":["MIEL","0OLc","5Fcu","6k8M"],"texture":0},"XWrsvaQQ":{"uv":{"LEiA":[24,12],"BRnO":[24,8],"4WS7":[20,12],"1QvB":[20,8]},"vertices":["1QvB","4WS7","BRnO","LEiA"],"texture":0}},"type":"mesh","uuid":"e086e9cf-769a-57fa-3e84-4b8bf844eeef"},{"name":"cylinder","color":2,"origin":[0,4,-1],"rotation":[-90,0,0],"export":true,"visibility":true,"locked":false,"render_order":"default","allow_mirror_modeling":true,"vertices":{"04m4":[0,8,0],"z0AZ":[0,9,0],"FIe1":[0.26795,8,1],"9Bsp":[0.26795,9,1],"VkbT":[0.73205,8,0.73205],"IaxI":[0.73205,9,0.73205],"g1im":[1,8,0.26795],"Fifk":[1,9,0.26795],"1yjE":[1,8,-0.26795],"HCW7":[1,9,-0.26795],"L6IR":[0.73205,8,-0.73205],"y0Qx":[0.73205,9,-0.73205],"HSg2":[0.26795,8,-1],"X6eN":[0.26795,9,-1],"nXXk":[-0.26795,8,-1],"UnhK":[-0.26795,9,-1],"PGeL":[-0.73205,8,-0.73205],"AGoM":[-0.73205,9,-0.73205],"Xzz3":[-1,8,-0.26795],"MG9P":[-1,9,-0.26795],"AQLL":[-1,8,0.26795],"7xoh":[-1,9,0.26795],"vIiR":[-0.73205,8,0.73205],"1c3w":[-0.73205,9,0.73205],"b3Bo":[-0.26795,8,1],"rt89":[-0.26795,9,1]},"faces":{"MeSFzxx5":{"uv":{"04m4":[6,16],"FIe1":[6.2679,15],"VkbT":[6.7321,15.2679]},"vertices":["VkbT","FIe1","04m4"],"texture":0},"b6Yxtr0U":{"uv":{"9Bsp":[17.2679,22],"IaxI":[17.8037,22],"VkbT":[17.8037,23],"FIe1":[17.2679,23]},"vertices":["FIe1","VkbT","IaxI","9Bsp"],"texture":0},"pxCB3d7o":{"uv":{"z0AZ":[22,20],"IaxI":[22.7321,20.7321],"9Bsp":[22.2679,21]},"vertices":["9Bsp","IaxI","z0AZ"],"texture":0},"UUXtJ3qg":{"uv":{"04m4":[6,16],"VkbT":[6.7321,15.2679],"g1im":[7,15.7321]},"vertices":["g1im","VkbT","04m4"],"texture":0},"729xh4BI":{"uv":{"IaxI":[10.1963,22],"Fifk":[10.7321,22],"g1im":[10.7321,23],"VkbT":[10.1963,23]},"vertices":["VkbT","g1im","Fifk","IaxI"],"texture":0},"6fVg5ejE":{"uv":{"z0AZ":[22,20],"Fifk":[23,20.2679],"IaxI":[22.7321,20.7321]},"vertices":["IaxI","Fifk","z0AZ"],"texture":0},"5a0Rriwa":{"uv":{"04m4":[6,16],"g1im":[7,15.7321],"1yjE":[7,16.2679]},"vertices":["1yjE","g1im","04m4"],"texture":0},"DR4N8J5T":{"uv":{"Fifk":[10.7321,22],"HCW7":[11.2679,22],"1yjE":[11.2679,23],"g1im":[10.7321,23]},"vertices":["g1im","1yjE","HCW7","Fifk"],"texture":0},"2YfS1mc2":{"uv":{"z0AZ":[22,20],"HCW7":[23,19.7321],"Fifk":[23,20.2679]},"vertices":["Fifk","HCW7","z0AZ"],"texture":0},"7N0U03LM":{"uv":{"04m4":[6,16],"1yjE":[7,16.2679],"L6IR":[6.7321,16.7321]},"vertices":["L6IR","1yjE","04m4"],"texture":0},"TtNfEdCV":{"uv":{"HCW7":[11.2679,22],"y0Qx":[11.8037,22],"L6IR":[11.8037,23],"1yjE":[11.2679,23]},"vertices":["1yjE","L6IR","y0Qx","HCW7"],"texture":0},"AqgZggh5":{"uv":{"z0AZ":[22,20],"y0Qx":[22.7321,19.2679],"HCW7":[23,19.7321]},"vertices":["HCW7","y0Qx","z0AZ"],"texture":0},"yWS4Wond":{"uv":{"04m4":[6,16],"L6IR":[6.7321,16.7321],"HSg2":[6.2679,17]},"vertices":["HSg2","L6IR","04m4"],"texture":0},"o5BiEYYd":{"uv":{"y0Qx":[13.1963,22],"X6eN":[13.7321,22],"HSg2":[13.7321,23],"L6IR":[13.1963,23]},"vertices":["L6IR","HSg2","X6eN","y0Qx"],"texture":0},"1tq4Qs3s":{"uv":{"z0AZ":[22,20],"X6eN":[22.2679,19],"y0Qx":[22.7321,19.2679]},"vertices":["y0Qx","X6eN","z0AZ"],"texture":0},"lVB8zbxs":{"uv":{"04m4":[6,16],"HSg2":[6.2679,17],"nXXk":[5.7321,17]},"vertices":["nXXk","HSg2","04m4"],"texture":0},"B5EjtLVS":{"uv":{"X6eN":[13.7321,22],"UnhK":[14.2679,22],"nXXk":[14.2679,23],"HSg2":[13.7321,23]},"vertices":["HSg2","nXXk","UnhK","X6eN"],"texture":0},"pn5vZLhE":{"uv":{"z0AZ":[22,20],"UnhK":[21.7321,19],"X6eN":[22.2679,19]},"vertices":["X6eN","UnhK","z0AZ"],"texture":0},"u6XCQOMU":{"uv":{"04m4":[6,16],"nXXk":[5.7321,17],"PGeL":[5.2679,16.7321]},"vertices":["PGeL","nXXk","04m4"],"texture":0},"I7dlmaqk":{"uv":{"UnhK":[14.2679,22],"AGoM":[14.8037,22],"PGeL":[14.8037,23],"nXXk":[14.2679,23]},"vertices":["nXXk","PGeL","AGoM","UnhK"],"texture":0},"70VfGCkh":{"uv":{"z0AZ":[22,20],"AGoM":[21.2679,19.2679],"UnhK":[21.7321,19]},"vertices":["UnhK","AGoM","z0AZ"],"texture":0},"HqzjOEbj":{"uv":{"04m4":[6,16],"PGeL":[5.2679,16.7321],"Xzz3":[5,16.2679]},"vertices":["Xzz3","PGeL","04m4"],"texture":0},"4wQQo6KD":{"uv":{"AGoM":[19.1963,22],"MG9P":[19.7321,22],"Xzz3":[19.7321,23],"PGeL":[19.1963,23]},"vertices":["PGeL","Xzz3","MG9P","AGoM"],"texture":0},"1UoQ18Nm":{"uv":{"z0AZ":[22,20],"MG9P":[21,19.7321],"AGoM":[21.2679,19.2679]},"vertices":["AGoM","MG9P","z0AZ"],"texture":0},"aoxuxywj":{"uv":{"04m4":[6,16],"Xzz3":[5,16.2679],"AQLL":[5,15.7321]},"vertices":["AQLL","Xzz3","04m4"],"texture":0},"6gCiY5zK":{"uv":{"MG9P":[19.7321,22],"7xoh":[20.2679,22],"AQLL":[20.2679,23],"Xzz3":[19.7321,23]},"vertices":["Xzz3","AQLL","7xoh","MG9P"],"texture":0},"FIWTSUgW":{"uv":{"z0AZ":[22,20],"7xoh":[21,20.2679],"MG9P":[21,19.7321]},"vertices":["MG9P","7xoh","z0AZ"],"texture":0},"q6sRhihc":{"uv":{"04m4":[6,16],"AQLL":[5,15.7321],"vIiR":[5.2679,15.2679]},"vertices":["vIiR","AQLL","04m4"],"texture":0},"kYPD1Dhg":{"uv":{"7xoh":[20.2679,22],"1c3w":[20.8037,22],"vIiR":[20.8037,23],"AQLL":[20.2679,23]},"vertices":["AQLL","vIiR","1c3w","7xoh"],"texture":0},"kuQKk0Xg":{"uv":{"z0AZ":[22,20],"1c3w":[21.2679,20.7321],"7xoh":[21,20.2679]},"vertices":["7xoh","1c3w","z0AZ"],"texture":0},"FQlC8Rnn":{"uv":{"04m4":[6,16],"vIiR":[5.2679,15.2679],"b3Bo":[5.7321,15]},"vertices":["b3Bo","vIiR","04m4"],"texture":0},"Kg7MtpJf":{"uv":{"1c3w":[16.1963,22],"rt89":[16.7321,22],"b3Bo":[16.7321,23],"vIiR":[16.1963,23]},"vertices":["vIiR","b3Bo","rt89","1c3w"],"texture":0},"ItohJ1TN":{"uv":{"z0AZ":[22,20],"rt89":[21.7321,21],"1c3w":[21.2679,20.7321]},"vertices":["1c3w","rt89","z0AZ"],"texture":0},"W4zJFLz7":{"uv":{"04m4":[6,16],"b3Bo":[5.7321,15],"FIe1":[6.2679,15]},"vertices":["FIe1","b3Bo","04m4"],"texture":0},"A57ayrYp":{"uv":{"rt89":[16.7321,22],"9Bsp":[17.2679,22],"FIe1":[17.2679,23],"b3Bo":[16.7321,23]},"vertices":["b3Bo","FIe1","9Bsp","rt89"],"texture":0},"NtVGTSYk":{"uv":{"z0AZ":[22,20],"9Bsp":[22.2679,21],"rt89":[21.7321,21]},"vertices":["rt89","9Bsp","z0AZ"],"texture":0}},"type":"mesh","uuid":"15c36931-5df5-bb76-a5be-0bf2ba8af15b"},{"name":"cylinder","color":2,"origin":[0,0,0],"rotation":[0,0,0],"export":true,"visibility":true,"locked":false,"render_order":"default","allow_mirror_modeling":true,"vertices":{"9EEC":[0,5,0],"HZgJ":[0,7,0],"pahg":[1.33975,5,3],"PP73":[1.33975,7,3],"zoum":[3.66025,5,2.66025],"A8ac":[3.66025,7,2.66025],"Lwei":[5,5,2.0718],"65V7":[5,7,2.0718],"cY6c":[5,5,1.3923],"oCPZ":[5,7,1.3923],"2BBZ":[4.3923,5,-4.3923],"AeTM":[4.3923,7,-4.3923],"XCBp":[1.6077,5,-6],"rRgT":[1.6077,7,-6],"wQr4":[-1.6077,5,-6],"5vmP":[-1.6077,7,-6],"46v0":[-4.3923,5,-4.3923],"2i7L":[-4.3923,7,-4.3923],"1ZC1":[-5,5,1.3923],"7E6Y":[-5,7,1.3923],"V87t":[-5,5,2.0718],"w8Re":[-5,7,2.0718],"wiCD":[-3.66025,5,2.66025],"8sQn":[-3.66025,7,2.66025],"V66a":[-1.33975,5,3],"MuP1":[-1.33975,7,3]},"faces":{"FE38SLNd":{"uv":{"9EEC":[5,3],"pahg":[6.3397,0],"zoum":[8.6603,0.3397]},"vertices":["zoum","pahg","9EEC"],"texture":0},"pLgdjub5":{"uv":{"PP73":[17.8397,5],"A8ac":[20.185,5],"zoum":[20.185,7],"pahg":[17.8397,7]},"vertices":["pahg","zoum","A8ac","PP73"],"texture":0},"i5drJXGA":{"uv":{"HZgJ":[14,15],"A8ac":[17.6603,17.6603],"PP73":[15.3397,18]},"vertices":["PP73","A8ac","HZgJ"],"texture":0},"aqc6fp7N":{"uv":{"9EEC":[5,3],"zoum":[8.6603,0.3397],"Lwei":[10,0.9282]},"vertices":["Lwei","zoum","9EEC"],"texture":0},"MHN6eZqw":{"uv":{"A8ac":[20.185,5],"65V7":[21.6483,5],"Lwei":[21.6483,7],"zoum":[20.185,7]},"vertices":["zoum","Lwei","65V7","A8ac"],"texture":0},"jzRTicMJ":{"uv":{"HZgJ":[14,15],"65V7":[19,17.0718],"A8ac":[17.6603,17.6603]},"vertices":["A8ac","65V7","HZgJ"],"texture":0},"prV1OIpI":{"uv":{"9EEC":[5,3],"2BBZ":[9.3923,7.3923],"XCBp":[6.6077,9]},"vertices":["XCBp","2BBZ","9EEC"],"texture":0},"to9T2YjQ":{"uv":{"AeTM":[10.1769,19],"rRgT":[13.3923,19],"XCBp":[13.3923,21],"2BBZ":[10.1769,21]},"vertices":["2BBZ","XCBp","rRgT","AeTM"],"texture":0},"Y594ctYr":{"uv":{"HZgJ":[14,15],"rRgT":[15.6077,9],"AeTM":[18.3923,10.6077]},"vertices":["AeTM","rRgT","HZgJ"],"texture":0},"KFzmTzP8":{"uv":{"9EEC":[5,3],"XCBp":[6.6077,9],"wQr4":[3.3923,9]},"vertices":["wQr4","XCBp","9EEC"],"texture":0},"9NVQlFZW":{"uv":{"rRgT":[13.3923,19],"5vmP":[16.6077,19],"wQr4":[16.6077,21],"XCBp":[13.3923,21]},"vertices":["XCBp","wQr4","5vmP","rRgT"],"texture":0},"hUTGwxw4":{"uv":{"HZgJ":[14,15],"5vmP":[12.3923,9],"rRgT":[15.6077,9]},"vertices":["rRgT","5vmP","HZgJ"],"texture":0},"W126lRyp":{"uv":{"9EEC":[5,3],"wQr4":[3.3923,9],"46v0":[0.6077,7.3923]},"vertices":["46v0","wQr4","9EEC"],"texture":0},"B7o0XrGB":{"uv":{"5vmP":[16.6077,19],"2i7L":[19.8231,19],"46v0":[19.8231,21],"wQr4":[16.6077,21]},"vertices":["wQr4","46v0","2i7L","5vmP"],"texture":0},"AAEBFFec":{"uv":{"HZgJ":[14,15],"2i7L":[9.6077,10.6077],"5vmP":[12.3923,9]},"vertices":["5vmP","2i7L","HZgJ"],"texture":0},"wZo3nrFH":{"uv":{"9EEC":[5,3],"46v0":[0.6077,7.3923],"1ZC1":[0,1.6077]},"vertices":["1ZC1","46v0","9EEC"],"texture":0},"GdC0hl9I":{"uv":{"2i7L":[20.252,16],"7E6Y":[26.0685,16],"1ZC1":[26.0685,18],"46v0":[20.252,18]},"vertices":["46v0","1ZC1","7E6Y","2i7L"],"texture":0},"IncekCtd":{"uv":{"HZgJ":[14,15],"7E6Y":[9,16.3923],"2i7L":[9.6077,10.6077]},"vertices":["2i7L","7E6Y","HZgJ"],"texture":0},"Nh7fizfS":{"uv":{"9EEC":[5,3],"wiCD":[1.3397,0.3397],"V66a":[3.6603,0]},"vertices":["V66a","wiCD","9EEC"],"texture":0},"6eETX4DG":{"uv":{"8sQn":[12.815,5],"MuP1":[15.1603,5],"V66a":[15.1603,7],"wiCD":[12.815,7]},"vertices":["wiCD","V66a","MuP1","8sQn"],"texture":0},"R9p8DOgn":{"uv":{"HZgJ":[14,15],"MuP1":[12.6603,18],"8sQn":[10.3397,17.6603]},"vertices":["8sQn","MuP1","HZgJ"],"texture":0},"bnM7BTSM":{"uv":{"9EEC":[5,3],"V66a":[3.6603,0],"pahg":[6.3397,0]},"vertices":["pahg","V66a","9EEC"],"texture":0},"EoF2hrs9":{"uv":{"MuP1":[15.1603,5],"PP73":[17.8397,5],"pahg":[17.8397,7],"V66a":[15.1603,7]},"vertices":["V66a","pahg","PP73","MuP1"],"texture":0},"zURwYD29":{"uv":{"HZgJ":[14,15],"PP73":[15.3397,18],"MuP1":[12.6603,18]},"vertices":["MuP1","PP73","HZgJ"],"texture":0},"cH9GAMlE":{"uv":{"9EEC":[5,3],"Lwei":[10,0.9282],"cY6c":[10,1.6077]},"vertices":["cY6c","Lwei","9EEC"],"texture":0},"UQBZR7Yn":{"uv":{"65V7":[20.252,13],"oCPZ":[20.9315,13],"cY6c":[20.9315,15],"Lwei":[20.252,15]},"vertices":["Lwei","cY6c","oCPZ","65V7"],"texture":0},"xLC3gJTf":{"uv":{"9EEC":[5,3],"cY6c":[10,1.6077],"2BBZ":[9.3923,7.3923]},"vertices":["2BBZ","cY6c","9EEC"],"texture":0},"Hgp4e55b":{"uv":{"oCPZ":[20.9315,13],"AeTM":[26.748,13],"2BBZ":[26.748,15],"cY6c":[20.9315,15]},"vertices":["cY6c","2BBZ","AeTM","oCPZ"],"texture":0},"rd5V4XAZ":{"uv":{"9EEC":[5,3],"1ZC1":[0,1.6077],"V87t":[0,0.9282]},"vertices":["V87t","1ZC1","9EEC"],"texture":0},"5N4CjuLG":{"uv":{"7E6Y":[26.0685,16],"w8Re":[26.748,16],"V87t":[26.748,18],"1ZC1":[26.0685,18]},"vertices":["1ZC1","V87t","w8Re","7E6Y"],"texture":0},"GWXPfOWZ":{"uv":{"9EEC":[5,3],"V87t":[0,0.9282],"wiCD":[1.3397,0.3397]},"vertices":["wiCD","V87t","9EEC"],"texture":0},"jlX3Kihl":{"uv":{"w8Re":[11.3517,5],"8sQn":[12.815,5],"wiCD":[12.815,7],"V87t":[11.3517,7]},"vertices":["V87t","wiCD","8sQn","w8Re"],"texture":0},"aYowS6uf":{"uv":{"HZgJ":[14,15],"oCPZ":[19,16.3923],"65V7":[19,17.0718]},"vertices":["65V7","oCPZ","HZgJ"],"texture":0},"tEEyFKVX":{"uv":{"HZgJ":[14,15],"AeTM":[18.3923,10.6077],"oCPZ":[19,16.3923]},"vertices":["oCPZ","AeTM","HZgJ"],"texture":0},"xW4KISjM":{"uv":{"HZgJ":[14,15],"w8Re":[9,17.0718],"7E6Y":[9,16.3923]},"vertices":["7E6Y","w8Re","HZgJ"],"texture":0},"n559vOLF":{"uv":{"HZgJ":[14,15],"8sQn":[10.3397,17.6603],"w8Re":[9,17.0718]},"vertices":["w8Re","8sQn","HZgJ"],"texture":0}},"type":"mesh","uuid":"475147de-59b2-fd16-2fbe-6fd576eac854"}],"outliner":[{"name":"Model","origin":[0,0,0],"color":0,"uuid":"12e023c4-2179-497f-29b7-be780199743e","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":[{"name":"Camera","origin":[0,4,-1],"rotation":[-15,0,0],"color":0,"uuid":"99a67458-c95e-b360-0373-8340a17cf81b","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":true,"children":["e086e9cf-769a-57fa-3e84-4b8bf844eeef","15c36931-5df5-bb76-a5be-0bf2ba8af15b"]},{"name":"Assembly","origin":[0,0,0],"color":0,"uuid":"f9ef5425-ba1d-54b8-6ec4-d3992736ea08","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":["475147de-59b2-fd16-2fbe-6fd576eac854"]}]}],"textures":[{"path":"D:\\Maddo\\cirnogodot\\3D\\BlockbenchModels\\Camera\\Camera_Texture.png","name":"Camera_Texture.png","folder":"block","namespace":"","id":"0","group":"","width":32,"height":32,"uv_width":32,"uv_height":32,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","pbr_channel":"color","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"c26341a1-38fe-0639-bfa2-371a654718b5","relative_path":"Camera_Texture.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAR5JREFUWEdjdDAO/s9ABDhwdi2jkozUfzlxS7DqRy+PM8DYMO0gNejmgcTwGY+hAZfiUQcMihAgIqmQrISkNEBsggW5glDig7l0aDmA5PAlQgM4jxIKWmKDE5tZhPTiLSSQPUCsIykuiJBLOBD73pNnFKUTgiGA7uIh7wAi0h2KEozgpXYIINuGLTqISoSEEiC+2pCgA0BVLLIiUKILTiwBi62d30NUNkV2AMVRAAomShyAL7SwRgEx+ZbuUUBqMFKiHmsTCluokBIKWxS0wGnI58E1gol86DiAkmAmqVGKq2VrLa4KDtajL28zEsMm1sFY4whb2UCsgaSqw+oAYrImqRbhUj84HTDgUUCt4CXGHIIFBTGGUKJm1AEDHgIAg5YsMPpU9S4AAAAASUVORK5CYII="}],"animations":[{"uuid":"125a5da9-3c2f-2e61-aab4-ee896882b228","name":"Idle","loop":"hold","override":false,"length":0,"snapping":24,"selected":false,"anim_time_update":"","blend_weight":"","start_delay":"","loop_delay":"","animators":{"99a67458-c95e-b360-0373-8340a17cf81b":{"name":"Camera","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"7f683b25-e9ac-a16c-3c9e-5a484de15c18","time":0,"color":-1,"interpolation":"linear"}]}}},{"uuid":"dc67ba7e-9f20-1d18-9625-69395c49edff","name":"Sweep","loop":"hold","override":false,"length":2,"snapping":24,"selected":false,"anim_time_update":"","blend_weight":"","start_delay":"","loop_delay":"","animators":{"99a67458-c95e-b360-0373-8340a17cf81b":{"name":"Camera","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"0","y":"35","z":"0"}],"uuid":"eaa31a29-b763-5f81-6820-cfee30c4ec49","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"-35","z":"0"}],"uuid":"3a4ae32d-74f4-66e8-30d4-59b8c1f09b27","time":2,"color":-1,"interpolation":"linear"}]}}},{"uuid":"a4b6cc46-7285-c16c-de56-55794be3b309","name":"SweepBack","loop":"hold","override":false,"length":2,"snapping":24,"selected":false,"anim_time_update":"","blend_weight":"","start_delay":"","loop_delay":"","animators":{"99a67458-c95e-b360-0373-8340a17cf81b":{"name":"Camera","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"0","y":"-35","z":"0"}],"uuid":"eaa31a29-b763-5f81-6820-cfee30c4ec49","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"35","z":"0"}],"uuid":"3a4ae32d-74f4-66e8-30d4-59b8c1f09b27","time":2,"color":-1,"interpolation":"linear"}]}}},{"uuid":"e8115c3c-9ef6-e149-b5cd-997dee1146ad","name":"SweepLoop","loop":"loop","override":false,"length":4.5,"snapping":24,"selected":true,"anim_time_update":"","blend_weight":"","start_delay":"","loop_delay":"","animators":{"99a67458-c95e-b360-0373-8340a17cf81b":{"name":"Camera","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"0","y":"35\n","z":"0"}],"uuid":"058e05c5-7157-a068-b1f8-52e06ca3327a","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"-35","z":"0"}],"uuid":"22f079b2-33d7-78b0-6873-d7c70fbdb2d2","time":2,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"35","z":"0"}],"uuid":"a1ec7158-04fe-d59a-7ba2-949e739576a9","time":4.25,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"-35","z":"0"}],"uuid":"f9685aee-4342-7c97-9792-14deefdb6788","time":2.25,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"35","z":"0"}],"uuid":"519caa58-c30e-a7d2-2f1c-66bdf7978b33","time":4.5,"color":-1,"interpolation":"linear"}]}}}],"export_options":{"gltf":{"encoding":"ascii","scale":16,"embed_textures":true,"armature":false,"animations":true}}} \ No newline at end of file diff --git a/3D/BlockbenchModels/Camera/Camera.gltf b/3D/BlockbenchModels/Camera/Camera.gltf index 858c84cb..31aa8874 100644 --- a/3D/BlockbenchModels/Camera/Camera.gltf +++ b/3D/BlockbenchModels/Camera/Camera.gltf @@ -1 +1 @@ -{"asset":{"version":"2.0","generator":"Blockbench 4.12.4 glTF exporter"},"scenes":[{"nodes":[6],"name":"blockbench_export"}],"scene":0,"nodes":[{"name":"cuboid","mesh":0},{"rotation":[-0.7071067811865475,0,0,0.7071067811865476],"name":"cylinder","mesh":1},{"rotation":[-0.13052619222005268,7.384051214814593e-17,-5.608743738350061e-16,0.9914448613738103],"translation":[0,0.25,-0.0625],"name":"Camera","children":[0,1]},{"name":"cylinder","mesh":2},{"name":"Assembly","children":[3]},{"name":"Model","children":[2,4]},{"children":[5]}],"bufferViews":[{"buffer":0,"byteOffset":0,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":288,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":576,"byteLength":192,"target":34962,"byteStride":8},{"buffer":0,"byteOffset":768,"byteLength":72,"target":34963},{"buffer":0,"byteOffset":840,"byteLength":1440,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":2280,"byteLength":1440,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":3720,"byteLength":960,"target":34962,"byteStride":8},{"buffer":0,"byteOffset":4680,"byteLength":288,"target":34963},{"buffer":0,"byteOffset":4968,"byteLength":1440,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":6408,"byteLength":1440,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":7848,"byteLength":960,"target":34962,"byteStride":8},{"buffer":0,"byteOffset":8808,"byteLength":288,"target":34963},{"buffer":0,"byteOffset":9096,"byteLength":4},{"buffer":0,"byteOffset":9100,"byteLength":16},{"buffer":0,"byteOffset":9116,"byteLength":8},{"buffer":0,"byteOffset":9124,"byteLength":32},{"buffer":0,"byteOffset":9156,"byteLength":8},{"buffer":0,"byteOffset":9164,"byteLength":32}],"buffers":[{"byteLength":9196,"uri":"data:application/octet-stream;base64,AAAAPgAAAD4AAAAAAAAAPgAAAL4AAAAAAAAAPgAAAD4AAAC/AAAAPgAAAL4AAAC/AAAAvgAAAD4AAAAAAAAAvgAAAD4AAAC/AAAAvgAAAL4AAAAAAAAAvgAAAL4AAAC/AAAAPgAAAD4AAAAAAAAAPgAAAD4AAAC/AAAAvgAAAD4AAAAAAAAAvgAAAD4AAAC/AAAAPgAAAL4AAAAAAAAAvgAAAL4AAAAAAAAAPgAAAL4AAAC/AAAAvgAAAL4AAAC/AAAAPgAAAD4AAAAAAAAAvgAAAD4AAAAAAAAAPgAAAL4AAAAAAAAAvgAAAL4AAAAAAAAAPgAAAD4AAAC/AAAAPgAAAL4AAAC/AAAAvgAAAD4AAAC/AAAAvgAAAL4AAAC/AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAoD4AAAAAAADgPgAAgD4AAKA+AACAPgAA4D4AABg/AAAAAAAAsD4AAAAAAAAYPwAAAD4AALA+AAAAPgAAAD4AADg/AAAAPgAA8D4AAAAAAAA4PwAAAAAAAPA+AACQPgAAGD8AACA+AAAYPwAAkD4AAFg/AAAgPgAAWD8AAEA/AAAAAAAAID8AAAAAAABAPwAAAD4AACA/AAAAPgAAID8AAIA+AAAgPwAAwD4AAEA/AACAPgAAQD8AAMA+AgAAAAEAAgABAAMABgAEAAUABgAFAAcACgAIAAkACgAJAAsADgAMAA0ADgANAA8AEgAQABEAEgARABMAFgAUABUAFgAVABcAr2c7PQAAAD+vZzs9ozCJPAAAAD8AAIA9AAAAAAAAAD8AAAAAozCJPAAAAD8AAIA9r2c7PQAAAD+vZzs9r2c7PQAAED+vZzs9ozCJPAAAED8AAIA9ozCJPAAAED8AAIA9r2c7PQAAED+vZzs9AAAAAAAAED8AAAAAAACAPQAAAD+jMIk8r2c7PQAAAD+vZzs9AAAAAAAAAD8AAAAAr2c7PQAAAD+vZzs9AACAPQAAAD+jMIk8AACAPQAAED+jMIk8r2c7PQAAED+vZzs9r2c7PQAAED+vZzs9AACAPQAAED+jMIk8AAAAAAAAED8AAAAAAACAPQAAAD+jMIm8AACAPQAAAD+jMIk8AAAAAAAAAD8AAAAAAACAPQAAAD+jMIk8AACAPQAAAD+jMIm8AACAPQAAED+jMIm8AACAPQAAED+jMIk8AACAPQAAED+jMIk8AACAPQAAED+jMIm8AAAAAAAAED8AAAAAr2c7PQAAAD+vZzu9AACAPQAAAD+jMIm8AAAAAAAAAD8AAAAAAACAPQAAAD+jMIm8r2c7PQAAAD+vZzu9r2c7PQAAED+vZzu9AACAPQAAED+jMIm8AACAPQAAED+jMIm8r2c7PQAAED+vZzu9AAAAAAAAED8AAAAAozCJPAAAAD8AAIC9r2c7PQAAAD+vZzu9AAAAAAAAAD8AAAAAr2c7PQAAAD+vZzu9ozCJPAAAAD8AAIC9ozCJPAAAED8AAIC9r2c7PQAAED+vZzu9r2c7PQAAED+vZzu9ozCJPAAAED8AAIC9AAAAAAAAED8AAAAAozCJvAAAAD8AAIC9ozCJPAAAAD8AAIC9AAAAAAAAAD8AAAAAozCJPAAAAD8AAIC9ozCJvAAAAD8AAIC9ozCJvAAAED8AAIC9ozCJPAAAED8AAIC9ozCJPAAAED8AAIC9ozCJvAAAED8AAIC9AAAAAAAAED8AAAAAr2c7vQAAAD+vZzu9ozCJvAAAAD8AAIC9AAAAAAAAAD8AAAAAozCJvAAAAD8AAIC9r2c7vQAAAD+vZzu9r2c7vQAAED+vZzu9ozCJvAAAED8AAIC9ozCJvAAAED8AAIC9r2c7vQAAED+vZzu9AAAAAAAAED8AAAAAAACAvQAAAD+jMIm8r2c7vQAAAD+vZzu9AAAAAAAAAD8AAAAAr2c7vQAAAD+vZzu9AACAvQAAAD+jMIm8AACAvQAAED+jMIm8r2c7vQAAED+vZzu9r2c7vQAAED+vZzu9AACAvQAAED+jMIm8AAAAAAAAED8AAAAAAACAvQAAAD+jMIk8AACAvQAAAD+jMIm8AAAAAAAAAD8AAAAAAACAvQAAAD+jMIm8AACAvQAAAD+jMIk8AACAvQAAED+jMIk8AACAvQAAED+jMIm8AACAvQAAED+jMIm8AACAvQAAED+jMIk8AAAAAAAAED8AAAAAr2c7vQAAAD+vZzs9AACAvQAAAD+jMIk8AAAAAAAAAD8AAAAAAACAvQAAAD+jMIk8r2c7vQAAAD+vZzs9r2c7vQAAED+vZzs9AACAvQAAED+jMIk8AACAvQAAED+jMIk8r2c7vQAAED+vZzs9AAAAAAAAED8AAAAAozCJvAAAAD8AAIA9r2c7vQAAAD+vZzs9AAAAAAAAAD8AAAAAr2c7vQAAAD+vZzs9ozCJvAAAAD8AAIA9ozCJvAAAED8AAIA9r2c7vQAAED+vZzs9r2c7vQAAED+vZzs9ozCJvAAAED8AAIA9AAAAAAAAED8AAAAAozCJPAAAAD8AAIA9ozCJvAAAAD8AAIA9AAAAAAAAAD8AAAAAozCJvAAAAD8AAIA9ozCJPAAAAD8AAIA9ozCJPAAAED8AAIA9ozCJvAAAED8AAIA9ozCJvAAAED8AAIA9ozCJPAAAED8AAIA9AAAAAAAAED8AAAAAAAAAgAAAgL8AAAAAAAAAgAAAgL8AAAAAAAAAgAAAgL8AAAAAAAAAPwAAAADXs10/AAAAPwAAAADXs10/AAAAPwAAAADXs10/AAAAPwAAAADXs10/AAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAgAAAgL8AAAAAAAAAgAAAgL8AAAAAAAAAgAAAgL8AAAAA17NdPwAAAAAAAAA/17NdPwAAAAAAAAA/17NdPwAAAAAAAAA/17NdPwAAAAAAAAA/AAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAA17NdPwAAAAAAAAC/17NdPwAAAAAAAAC/17NdPwAAAAAAAAC/17NdPwAAAAAAAAC/AAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAPwAAAADXs12/AAAAPwAAAADXs12/AAAAPwAAAADXs12/AAAAPwAAAADXs12/AAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAvwAAAADXs12/AAAAvwAAAADXs12/AAAAvwAAAADXs12/AAAAvwAAAADXs12/AAAAAAAAgD8AAACAAAAAAAAAgD8AAACAAAAAAAAAgD8AAACAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAA17NdvwAAAAAAAAC/17NdvwAAAAAAAAC/17NdvwAAAAAAAAC/17NdvwAAAAAAAAC/AAAAAAAAgD8AAACAAAAAAAAAgD8AAACAAAAAAAAAgD8AAACAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAACAvwAAAADs2W6lAACAvwAAAADs2W6lAACAvwAAAADs2W6lAACAvwAAAADs2W6lAAAAAAAAgD8AAACAAAAAAAAAgD8AAACAAAAAAAAAgD8AAACAAAAAAAAAgL8AAACAAAAAAAAAgL8AAACAAAAAAAAAgL8AAACA17NdvwAAAAAAAAA/17NdvwAAAAAAAAA/17NdvwAAAAAAAAA/17NdvwAAAAAAAAA/AAAAgAAAgD8AAAAAAAAAgAAAgD8AAAAAAAAAgAAAgD8AAAAAAAAAAAAAgL8AAACAAAAAAAAAgL8AAACAAAAAAAAAgL8AAACAAAAAvwAAAADXs10/AAAAvwAAAADXs10/AAAAvwAAAADXs10/AAAAvwAAAADXs10/AAAAgAAAgD8AAAAAAAAAgAAAgD8AAAAAAAAAgAAAgD8AAAAA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9MjNPQAA4D4AAMC+9MjNPQAA4D4AAMC+9MjNvQAA4D4AAMC+AAAAAAAA4D4AAAAAw42MvgAAoD7DjYy+9MjNvQAAoD4AAMC+AAAAAAAAoD4AAAAA9MjNvQAAoD4AAMC+w42MvgAAoD7DjYy+w42MvgAA4D7DjYy+9MjNvQAA4D4AAMC+9MjNvQAA4D4AAMC+w42MvgAA4D7DjYy+AAAAAAAA4D4AAAAAAACgvgAAoD4MN7I9w42MvgAAoD7DjYy+AAAAAAAAoD4AAAAAw42MvgAAoD7DjYy+AACgvgAAoD4MN7I9AACgvgAA4D4MN7I9w42MvgAA4D7DjYy+w42MvgAA4D7DjYy+AACgvgAA4D4MN7I9AAAAAAAA4D4AAAAAzHyrvQAAoD4AAEA+mkFqvgAAoD6aQSo+AAAAAAAAoD4AAAAAmkFqvgAAoD6aQSo+zHyrvQAAoD4AAEA+zHyrvQAA4D4AAEA+mkFqvgAA4D6aQSo+mkFqvgAA4D6aQSo+zHyrvQAA4D4AAEA+AAAAAAAA4D4AAAAAzHyrPQAAoD4AAEA+zHyrvQAAoD4AAEA+AAAAAAAAoD4AAAAAzHyrvQAAoD4AAEA+zHyrPQAAoD4AAEA+zHyrPQAA4D4AAEA+zHyrvQAA4D4AAEA+zHyrvQAA4D4AAEA+zHyrPQAA4D4AAEA+AAAAAAAA4D4AAAAAAACgPgAAoD4MN7I9AACgPgAAoD5RmAQ+AAAAAAAAoD4AAAAAAACgPgAAoD5RmAQ+AACgPgAAoD4MN7I9AACgPgAA4D4MN7I9AACgPgAA4D5RmAQ+w42MPgAAoD7DjYy+AACgPgAAoD4MN7I9AAAAAAAAoD4AAAAAAACgPgAAoD4MN7I9w42MPgAAoD7DjYy+w42MPgAA4D7DjYy+AACgPgAA4D4MN7I9AACgvgAAoD5RmAQ+AACgvgAAoD4MN7I9AAAAAAAAoD4AAAAAAACgvgAAoD4MN7I9AACgvgAAoD5RmAQ+AACgvgAA4D5RmAQ+AACgvgAA4D4MN7I9mkFqvgAAoD6aQSo+AACgvgAAoD5RmAQ+AAAAAAAAoD4AAAAAAACgvgAAoD5RmAQ+mkFqvgAAoD6aQSo+mkFqvgAA4D6aQSo+AACgvgAA4D5RmAQ+AACgPgAA4D5RmAQ+AACgPgAA4D4MN7I9AAAAAAAA4D4AAAAA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"}],"accessors":[{"bufferView":0,"componentType":5126,"count":24,"max":[0.125,0.125,0],"min":[-0.125,-0.125,-0.5],"type":"VEC3"},{"bufferView":1,"componentType":5126,"count":24,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":2,"componentType":5126,"count":24,"max":[0.75,0.84375],"min":[0,0],"type":"VEC2"},{"bufferView":3,"componentType":5123,"count":36,"max":[23],"min":[0],"type":"SCALAR"},{"bufferView":4,"componentType":5126,"count":120,"max":[0.0625,0.5625,0.0625],"min":[-0.0625,0.5,-0.0625],"type":"VEC3"},{"bufferView":5,"componentType":5126,"count":120,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":6,"componentType":5126,"count":120,"max":[0.71875,0.71875],"min":[0.15625,0.46875],"type":"VEC2"},{"bufferView":7,"componentType":5123,"count":144,"max":[119],"min":[0],"type":"SCALAR"},{"bufferView":8,"componentType":5126,"count":120,"max":[0.3125,0.4375,0.1875],"min":[-0.3125,0.3125,-0.375],"type":"VEC3"},{"bufferView":9,"componentType":5126,"count":120,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":10,"componentType":5126,"count":120,"max":[0.8358749747276306,0.65625],"min":[0,0],"type":"VEC2"},{"bufferView":11,"componentType":5123,"count":144,"max":[119],"min":[0],"type":"SCALAR"},{"bufferView":12,"componentType":5126,"count":1,"max":[0],"min":[0],"type":"SCALAR"},{"bufferView":13,"componentType":5126,"count":1,"max":[-0.13052618503570557,7.384051407592236e-17,-5.608743539087821e-16,0.9914448857307434],"min":[-0.13052618503570557,7.384051407592236e-17,-5.608743539087821e-16,0.9914448857307434],"type":"VEC4"},{"bufferView":14,"componentType":5126,"count":2,"max":[2],"min":[0],"type":"SCALAR"},{"bufferView":15,"componentType":5126,"count":2,"max":[-0.12448504567146301,0.2981332242488861,0.03924998268485069,0.9455577731132507],"min":[-0.12448504567146301,-0.2981332242488861,-0.03924998268485069,0.9455577731132507],"type":"VEC4"},{"bufferView":16,"componentType":5126,"count":2,"max":[2],"min":[0],"type":"SCALAR"},{"bufferView":17,"componentType":5126,"count":2,"max":[-0.12448504567146301,0.2981332242488861,0.03924998268485069,0.9455577731132507],"min":[-0.12448504567146301,-0.2981332242488861,-0.03924998268485069,0.9455577731132507],"type":"VEC4"}],"materials":[{"pbrMetallicRoughness":{"metallicFactor":0,"roughnessFactor":1,"baseColorTexture":{"index":0}},"alphaMode":"MASK","alphaCutoff":0.05,"doubleSided":true}],"textures":[{"sampler":0,"source":0,"name":"Camera_Texture"}],"samplers":[{"magFilter":9728,"minFilter":9728,"wrapS":33071,"wrapT":33071}],"images":[{"mimeType":"image/png","uri":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAR5JREFUWEdjdDAO/s9ABDhwdi2jkozUfzlxS7DqRy+PM8DYMO0gNejmgcTwGY+hAZfiUQcMihAgIqmQrISkNEBsggW5glDig7l0aDmA5PAlQgM4jxIKWmKDE5tZhPTiLSSQPUCsIykuiJBLOBD73pNnFKUTgiGA7uIh7wAi0h2KEozgpXYIINuGLTqISoSEEiC+2pCgA0BVLLIiUKILTiwBi62d30NUNkV2AMVRAAomShyAL7SwRgEx+ZbuUUBqMFKiHmsTCluokBIKWxS0wGnI58E1gol86DiAkmAmqVGKq2VrLa4KDtajL28zEsMm1sFY4whb2UCsgaSqw+oAYrImqRbhUj84HTDgUUCt4CXGHIIFBTGGUKJm1AEDHgIAg5YsMPpU9S4AAAAASUVORK5CYII="}],"meshes":[{"primitives":[{"mode":4,"attributes":{"POSITION":0,"NORMAL":1,"TEXCOORD_0":2},"indices":3,"material":0}]},{"primitives":[{"mode":4,"attributes":{"POSITION":4,"NORMAL":5,"TEXCOORD_0":6},"indices":7,"material":0}]},{"primitives":[{"mode":4,"attributes":{"POSITION":8,"NORMAL":9,"TEXCOORD_0":10},"indices":11,"material":0}]}],"animations":[{"name":"Idle","samplers":[{"input":12,"output":13,"interpolation":"LINEAR"}],"channels":[{"sampler":0,"target":{"node":2,"path":"rotation"}}]},{"name":"Sweep","samplers":[{"input":14,"output":15,"interpolation":"LINEAR"}],"channels":[{"sampler":0,"target":{"node":2,"path":"rotation"}}]},{"name":"SweepBack","samplers":[{"input":16,"output":17,"interpolation":"LINEAR"}],"channels":[{"sampler":0,"target":{"node":2,"path":"rotation"}}]}]} \ No newline at end of file +{"asset":{"version":"2.0","generator":"Blockbench 4.12.5 glTF exporter"},"scenes":[{"nodes":[6],"name":"blockbench_export"}],"scene":0,"nodes":[{"name":"cuboid","mesh":0},{"rotation":[-0.7071067811865475,0,0,0.7071067811865476],"name":"cylinder","mesh":1},{"rotation":[-0.13052619222005157,0,0,0.9914448613738104],"translation":[0,0.25,-0.0625],"name":"Camera","children":[0,1]},{"name":"cylinder","mesh":2},{"name":"Assembly","children":[3]},{"name":"Model","children":[2,4]},{"children":[5]}],"bufferViews":[{"buffer":0,"byteOffset":0,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":288,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":576,"byteLength":192,"target":34962,"byteStride":8},{"buffer":0,"byteOffset":768,"byteLength":72,"target":34963},{"buffer":0,"byteOffset":840,"byteLength":1440,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":2280,"byteLength":1440,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":3720,"byteLength":960,"target":34962,"byteStride":8},{"buffer":0,"byteOffset":4680,"byteLength":288,"target":34963},{"buffer":0,"byteOffset":4968,"byteLength":1440,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":6408,"byteLength":1440,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":7848,"byteLength":960,"target":34962,"byteStride":8},{"buffer":0,"byteOffset":8808,"byteLength":288,"target":34963},{"buffer":0,"byteOffset":9096,"byteLength":4},{"buffer":0,"byteOffset":9100,"byteLength":16},{"buffer":0,"byteOffset":9116,"byteLength":8},{"buffer":0,"byteOffset":9124,"byteLength":32},{"buffer":0,"byteOffset":9156,"byteLength":8},{"buffer":0,"byteOffset":9164,"byteLength":32},{"buffer":0,"byteOffset":9196,"byteLength":20},{"buffer":0,"byteOffset":9216,"byteLength":80}],"buffers":[{"byteLength":9296,"uri":"data:application/octet-stream;base64,AAAAPgAAAD4AAAAAAAAAPgAAAL4AAAAAAAAAPgAAAD4AAAC/AAAAPgAAAL4AAAC/AAAAvgAAAD4AAAAAAAAAvgAAAD4AAAC/AAAAvgAAAL4AAAAAAAAAvgAAAL4AAAC/AAAAPgAAAD4AAAAAAAAAPgAAAD4AAAC/AAAAvgAAAD4AAAAAAAAAvgAAAD4AAAC/AAAAPgAAAL4AAAAAAAAAvgAAAL4AAAAAAAAAPgAAAL4AAAC/AAAAvgAAAL4AAAC/AAAAPgAAAD4AAAAAAAAAvgAAAD4AAAAAAAAAPgAAAL4AAAAAAAAAvgAAAL4AAAAAAAAAPgAAAD4AAAC/AAAAPgAAAL4AAAC/AAAAvgAAAD4AAAC/AAAAvgAAAL4AAAC/AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAoD4AAAAAAADgPgAAgD4AAKA+AACAPgAA4D4AABg/AAAAAAAAsD4AAAAAAAAYPwAAAD4AALA+AAAAPgAAAD4AADg/AAAAPgAA8D4AAAAAAAA4PwAAAAAAAPA+AACQPgAAGD8AACA+AAAYPwAAkD4AAFg/AAAgPgAAWD8AAEA/AAAAAAAAID8AAAAAAABAPwAAAD4AACA/AAAAPgAAID8AAIA+AAAgPwAAwD4AAEA/AACAPgAAQD8AAMA+AgAAAAEAAgABAAMABgAEAAUABgAFAAcACgAIAAkACgAJAAsADgAMAA0ADgANAA8AEgAQABEAEgARABMAFgAUABUAFgAVABcAoWc7PQAAAD+hZzs9vjCJPAAAAD8AAIA9AAAAAAAAAD8AAAAAvjCJPAAAAD8AAIA9oWc7PQAAAD+hZzs9oWc7PQAAED+hZzs9vjCJPAAAED8AAIA9vjCJPAAAED8AAIA9oWc7PQAAED+hZzs9AAAAAAAAED8AAAAAAACAPQAAAD++MIk8oWc7PQAAAD+hZzs9AAAAAAAAAD8AAAAAoWc7PQAAAD+hZzs9AACAPQAAAD++MIk8AACAPQAAED++MIk8oWc7PQAAED+hZzs9oWc7PQAAED+hZzs9AACAPQAAED++MIk8AAAAAAAAED8AAAAAAACAPQAAAD++MIm8AACAPQAAAD++MIk8AAAAAAAAAD8AAAAAAACAPQAAAD++MIk8AACAPQAAAD++MIm8AACAPQAAED++MIm8AACAPQAAED++MIk8AACAPQAAED++MIk8AACAPQAAED++MIm8AAAAAAAAED8AAAAAoWc7PQAAAD+hZzu9AACAPQAAAD++MIm8AAAAAAAAAD8AAAAAAACAPQAAAD++MIm8oWc7PQAAAD+hZzu9oWc7PQAAED+hZzu9AACAPQAAED++MIm8AACAPQAAED++MIm8oWc7PQAAED+hZzu9AAAAAAAAED8AAAAAvjCJPAAAAD8AAIC9oWc7PQAAAD+hZzu9AAAAAAAAAD8AAAAAoWc7PQAAAD+hZzu9vjCJPAAAAD8AAIC9vjCJPAAAED8AAIC9oWc7PQAAED+hZzu9oWc7PQAAED+hZzu9vjCJPAAAED8AAIC9AAAAAAAAED8AAAAAvjCJvAAAAD8AAIC9vjCJPAAAAD8AAIC9AAAAAAAAAD8AAAAAvjCJPAAAAD8AAIC9vjCJvAAAAD8AAIC9vjCJvAAAED8AAIC9vjCJPAAAED8AAIC9vjCJPAAAED8AAIC9vjCJvAAAED8AAIC9AAAAAAAAED8AAAAAoWc7vQAAAD+hZzu9vjCJvAAAAD8AAIC9AAAAAAAAAD8AAAAAvjCJvAAAAD8AAIC9oWc7vQAAAD+hZzu9oWc7vQAAED+hZzu9vjCJvAAAED8AAIC9vjCJvAAAED8AAIC9oWc7vQAAED+hZzu9AAAAAAAAED8AAAAAAACAvQAAAD++MIm8oWc7vQAAAD+hZzu9AAAAAAAAAD8AAAAAoWc7vQAAAD+hZzu9AACAvQAAAD++MIm8AACAvQAAED++MIm8oWc7vQAAED+hZzu9oWc7vQAAED+hZzu9AACAvQAAED++MIm8AAAAAAAAED8AAAAAAACAvQAAAD++MIk8AACAvQAAAD++MIm8AAAAAAAAAD8AAAAAAACAvQAAAD++MIm8AACAvQAAAD++MIk8AACAvQAAED++MIk8AACAvQAAED++MIm8AACAvQAAED++MIm8AACAvQAAED++MIk8AAAAAAAAED8AAAAAoWc7vQAAAD+hZzs9AACAvQAAAD++MIk8AAAAAAAAAD8AAAAAAACAvQAAAD++MIk8oWc7vQAAAD+hZzs9oWc7vQAAED+hZzs9AACAvQAAED++MIk8AACAvQAAED++MIk8oWc7vQAAED+hZzs9AAAAAAAAED8AAAAAvjCJvAAAAD8AAIA9oWc7vQAAAD+hZzs9AAAAAAAAAD8AAAAAoWc7vQAAAD+hZzs9vjCJvAAAAD8AAIA9vjCJvAAAED8AAIA9oWc7vQAAED+hZzs9oWc7vQAAED+hZzs9vjCJvAAAED8AAIA9AAAAAAAAED8AAAAAvjCJPAAAAD8AAIA9vjCJvAAAAD8AAIA9AAAAAAAAAD8AAAAAvjCJvAAAAD8AAIA9vjCJPAAAAD8AAIA9vjCJPAAAED8AAIA9vjCJvAAAED8AAIA9vjCJvAAAED8AAIA9vjCJPAAAED8AAIA9AAAAAAAAED8AAAAAAAAAgAAAgL8AAAAAAAAAgAAAgL8AAAAAAAAAgAAAgL8AAAAAKQAAPwAAAADAs10/KQAAPwAAAADAs10/KQAAPwAAAADAs10/KQAAPwAAAADAs10/AAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAgAAAgL8AAAAAAAAAgAAAgL8AAAAAAAAAgAAAgL8AAAAAwLNdPwAAAAApAAA/wLNdPwAAAAApAAA/wLNdPwAAAAApAAA/wLNdPwAAAAApAAA/AAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAwLNdPwAAAAApAAC/wLNdPwAAAAApAAC/wLNdPwAAAAApAAC/wLNdPwAAAAApAAC/AAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAKQAAPwAAAADAs12/KQAAPwAAAADAs12/KQAAPwAAAADAs12/KQAAPwAAAADAs12/AAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAKQAAvwAAAADAs12/KQAAvwAAAADAs12/KQAAvwAAAADAs12/KQAAvwAAAADAs12/AAAAAAAAgD8AAACAAAAAAAAAgD8AAACAAAAAAAAAgD8AAACAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAwLNdvwAAAAApAAC/wLNdvwAAAAApAAC/wLNdvwAAAAApAAC/wLNdvwAAAAApAAC/AAAAAAAAgD8AAACAAAAAAAAAgD8AAACAAAAAAAAAgD8AAACAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAACAAAAAAAAAgL8AAACAAAAAAAAAgL8AAACAwLNdvwAAAAApAAA/wLNdvwAAAAApAAA/wLNdvwAAAAApAAA/wLNdvwAAAAApAAA/AAAAgAAAgD8AAAAAAAAAgAAAgD8AAAAAAAAAgAAAgD8AAAAAAAAAAAAAgL8AAACAAAAAAAAAgL8AAACAAAAAAAAAgL8AAACAKQAAvwAAAADAs10/KQAAvwAAAADAs10/KQAAvwAAAADAs10/KQAAvwAAAADAs10/AAAAgAAAgD8AAAAAAAAAgAAAgD8AAAAAAAAAgAAAgD8AAAAA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HcnNPQAA4D4AAMC+HcnNPQAA4D4AAMC+HcnNvQAA4D4AAMC+AAAAAAAA4D4AAAAAuY2MvgAAoD65jYy+HcnNvQAAoD4AAMC+AAAAAAAAoD4AAAAAHcnNvQAAoD4AAMC+uY2MvgAAoD65jYy+uY2MvgAA4D65jYy+HcnNvQAA4D4AAMC+HcnNvQAA4D4AAMC+uY2MvgAA4D65jYy+AAAAAAAA4D4AAAAAAACgvgAAoD7jNrI9uY2MvgAAoD65jYy+AAAAAAAAoD4AAAAAuY2MvgAAoD65jYy+AACgvgAAoD7jNrI9AACgvgAA4D7jNrI9uY2MvgAA4D65jYy+uY2MvgAA4D65jYy+AACgvgAA4D7jNrI9AAAAAAAA4D4AAAAA7nyrvQAAoD4AAEA+iUFqvgAAoD6JQSo+AAAAAAAAoD4AAAAAiUFqvgAAoD6JQSo+7nyrvQAAoD4AAEA+7nyrvQAA4D4AAEA+iUFqvgAA4D6JQSo+iUFqvgAA4D6JQSo+7nyrvQAA4D4AAEA+AAAAAAAA4D4AAAAA7nyrPQAAoD4AAEA+7nyrvQAAoD4AAEA+AAAAAAAAoD4AAAAA7nyrvQAAoD4AAEA+7nyrPQAAoD4AAEA+7nyrPQAA4D4AAEA+7nyrvQAA4D4AAEA+7nyrvQAA4D4AAEA+7nyrPQAA4D4AAEA+AAAAAAAA4D4AAAAAAACgPgAAoD7jNrI9AACgPgAAoD5fmAQ+AAAAAAAAoD4AAAAAAACgPgAAoD5fmAQ+AACgPgAAoD7jNrI9AACgPgAA4D7jNrI9AACgPgAA4D5fmAQ+uY2MPgAAoD65jYy+AACgPgAAoD7jNrI9AAAAAAAAoD4AAAAAAACgPgAAoD7jNrI9uY2MPgAAoD65jYy+uY2MPgAA4D65jYy+AACgPgAA4D7jNrI9AACgvgAAoD5fmAQ+AACgvgAAoD7jNrI9AAAAAAAAoD4AAAAAAACgvgAAoD7jNrI9AACgvgAAoD5fmAQ+AACgvgAA4D5fmAQ+AACgvgAA4D7jNrI9iUFqvgAAoD6JQSo+AACgvgAAoD5fmAQ+AAAAAAAAoD4AAAAAAACgvgAAoD5fmAQ+iUFqvgAAoD6JQSo+iUFqvgAA4D6JQSo+AACgvgAA4D5fmAQ+AACgPgAA4D5fmAQ+AACgPgAA4D7jNrI9AAAAAAAA4D4AAAAA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"}],"accessors":[{"bufferView":0,"componentType":5126,"count":24,"max":[0.125,0.125,0],"min":[-0.125,-0.125,-0.5],"type":"VEC3"},{"bufferView":1,"componentType":5126,"count":24,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":2,"componentType":5126,"count":24,"max":[0.75,0.84375],"min":[0,0],"type":"VEC2"},{"bufferView":3,"componentType":5123,"count":36,"max":[23],"min":[0],"type":"SCALAR"},{"bufferView":4,"componentType":5126,"count":120,"max":[0.0625,0.5625,0.0625],"min":[-0.0625,0.5,-0.0625],"type":"VEC3"},{"bufferView":5,"componentType":5126,"count":120,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":6,"componentType":5126,"count":120,"max":[0.71875,0.71875],"min":[0.15625,0.46875],"type":"VEC2"},{"bufferView":7,"componentType":5123,"count":144,"max":[119],"min":[0],"type":"SCALAR"},{"bufferView":8,"componentType":5126,"count":120,"max":[0.3125,0.4375,0.1875],"min":[-0.3125,0.3125,-0.375],"type":"VEC3"},{"bufferView":9,"componentType":5126,"count":120,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":10,"componentType":5126,"count":120,"max":[0.8358749747276306,0.65625],"min":[0,0],"type":"VEC2"},{"bufferView":11,"componentType":5123,"count":144,"max":[119],"min":[0],"type":"SCALAR"},{"bufferView":12,"componentType":5126,"count":1,"max":[0],"min":[0],"type":"SCALAR"},{"bufferView":13,"componentType":5126,"count":1,"max":[-0.13052618503570557,0,0,0.9914448857307434],"min":[-0.13052618503570557,0,0,0.9914448857307434],"type":"VEC4"},{"bufferView":14,"componentType":5126,"count":2,"max":[2],"min":[0],"type":"SCALAR"},{"bufferView":15,"componentType":5126,"count":2,"max":[-0.12448504567146301,0.2981332242488861,0.03924998268485069,0.9455577731132507],"min":[-0.12448504567146301,-0.2981332242488861,-0.03924998268485069,0.9455577731132507],"type":"VEC4"},{"bufferView":16,"componentType":5126,"count":2,"max":[2],"min":[0],"type":"SCALAR"},{"bufferView":17,"componentType":5126,"count":2,"max":[-0.12448504567146301,0.2981332242488861,0.03924998268485069,0.9455577731132507],"min":[-0.12448504567146301,-0.2981332242488861,-0.03924998268485069,0.9455577731132507],"type":"VEC4"},{"bufferView":18,"componentType":5126,"count":5,"max":[4.5],"min":[0],"type":"SCALAR"},{"bufferView":19,"componentType":5126,"count":5,"max":[-0.12448504567146301,0.2981332242488861,0.03924998268485069,0.9455577731132507],"min":[-0.12448504567146301,-0.2981332242488861,-0.03924998268485069,0.9455577731132507],"type":"VEC4"}],"materials":[{"pbrMetallicRoughness":{"metallicFactor":0,"roughnessFactor":1,"baseColorTexture":{"index":0}},"alphaMode":"MASK","alphaCutoff":0.05,"doubleSided":true}],"textures":[{"sampler":0,"source":0,"name":"Camera_Texture.png"}],"samplers":[{"magFilter":9728,"minFilter":9728,"wrapS":33071,"wrapT":33071}],"images":[{"mimeType":"image/png","uri":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAR5JREFUWEdjdDAO/s9ABDhwdi2jkozUfzlxS7DqRy+PM8DYMO0gNejmgcTwGY+hAZfiUQcMihAgIqmQrISkNEBsggW5glDig7l0aDmA5PAlQgM4jxIKWmKDE5tZhPTiLSSQPUCsIykuiJBLOBD73pNnFKUTgiGA7uIh7wAi0h2KEozgpXYIINuGLTqISoSEEiC+2pCgA0BVLLIiUKILTiwBi62d30NUNkV2AMVRAAomShyAL7SwRgEx+ZbuUUBqMFKiHmsTCluokBIKWxS0wGnI58E1gol86DiAkmAmqVGKq2VrLa4KDtajL28zEsMm1sFY4whb2UCsgaSqw+oAYrImqRbhUj84HTDgUUCt4CXGHIIFBTGGUKJm1AEDHgIAg5YsMPpU9S4AAAAASUVORK5CYII="}],"meshes":[{"primitives":[{"mode":4,"attributes":{"POSITION":0,"NORMAL":1,"TEXCOORD_0":2},"indices":3,"material":0}]},{"primitives":[{"mode":4,"attributes":{"POSITION":4,"NORMAL":5,"TEXCOORD_0":6},"indices":7,"material":0}]},{"primitives":[{"mode":4,"attributes":{"POSITION":8,"NORMAL":9,"TEXCOORD_0":10},"indices":11,"material":0}]}],"animations":[{"name":"Idle","samplers":[{"input":12,"output":13,"interpolation":"LINEAR"}],"channels":[{"sampler":0,"target":{"node":2,"path":"rotation"}}]},{"name":"Sweep","samplers":[{"input":14,"output":15,"interpolation":"LINEAR"}],"channels":[{"sampler":0,"target":{"node":2,"path":"rotation"}}]},{"name":"SweepBack","samplers":[{"input":16,"output":17,"interpolation":"LINEAR"}],"channels":[{"sampler":0,"target":{"node":2,"path":"rotation"}}]},{"name":"SweepLoop","samplers":[{"input":18,"output":19,"interpolation":"LINEAR"}],"channels":[{"sampler":0,"target":{"node":2,"path":"rotation"}}]}]} \ No newline at end of file diff --git a/3D/MapModels/actor_alarmbox.glb b/3D/MapModels/actor_alarmbox.glb index 38ec393e67b8f49997f7a0a7e9d74b267e5a1b08..e0e4beca29b0136ae2e1ea7e59849faca7d44ea0 100644 GIT binary patch delta 203 zcmeyO^+%gGJtxGCiGhLPk0=Afl8w9qysXAL<~kOW6S!n2AK(?7?8Cd#DK9ZMRmn=p zF}WnOEU_drKQB1HG%rO-N2#PJF|RlWETm)=ZJ=kM1H!rndWM$f<`$L)=0=v51}28) zv6E%_q$YFoDNgq0?W_C_uQ7#e2T9{fGSeO|aSQ?rcn#4|? M!Z&lX0ly0y0Fpd8p#T5? delta 76 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 - // - // - // if (collider.GetParent() is IDestructible destructible) - // { - // GD.Print($"HITTING {collider.Name}"); - // destructible.Hit(ExplosionDamage); - // } - // else { - // GD.Print($"Collider {collider.Name} was not idestructible"); - // } - // } - // } - // } - private void CreateDebris() { if (DebrisScene == null) return; diff --git a/Scripts/AlarmManager.cs b/Scripts/AlarmManager.cs index 3b5abd05..10c26ca2 100644 --- a/Scripts/AlarmManager.cs +++ b/Scripts/AlarmManager.cs @@ -23,20 +23,25 @@ public partial class AlarmManager : Node [Signal] public delegate void AlarmDisabledEventHandler(); - private AudioStreamPlayer2D _player; + //private AudioStreamPlayer _player; public override void _Ready() { Instance = this; - if (AlarmSound is not null) - { - var player = new AudioStreamPlayer2D(); - player.Stream = AlarmSound; - this.CallDeferred("add_child", player); - - _player = player; - } + // if (AlarmSound is not null) + // { + // var player = GetNodeOrNull("AlarmSoundPlayer"); + // if (player is not null) + // { + // player.Stream = AlarmSound; + // _player = player; + // } + // + // //this.CallDeferred("add_child", player); + // + // + // } } public void SoundAlarm(Vector2 location) @@ -47,7 +52,7 @@ public partial class AlarmManager : Node EmitSignalAlarmEnabled(location); GD.Print($"Alarm sounded at {location}"); - _player?.Play(); + //_player?.Play(); } public void SoundAlarm(Vector3 location) @@ -58,7 +63,7 @@ public partial class AlarmManager : Node EmitSignalAlarmEnabled3D(location); GD.Print($"Alarm sounded at {location}"); - _player?.Play(); + //_player?.Play(); } public void SoundSilentAlarm(Vector2 location) @@ -71,6 +76,6 @@ public partial class AlarmManager : Node { IsAlarmOn = false; EmitSignal(nameof(AlarmDisabled)); - _player?.Stop(); + //_player?.Stop(); } } \ No newline at end of file diff --git a/Scripts/Interactables/AlarmBox3D.cs b/Scripts/Interactables/AlarmBox3D.cs index e0c71b2e..151951f6 100644 --- a/Scripts/Interactables/AlarmBox3D.cs +++ b/Scripts/Interactables/AlarmBox3D.cs @@ -5,35 +5,53 @@ namespace Cirno.Scripts.Interactables; [Tool] public partial class AlarmBox3D : Interactable3D { - private AudioStreamPlayer _activationSound; - private readonly string _activationSoundName = "ActivationSound"; + private AnimationPlayer _animationPlayer; + public StringName FlashAnimationName { get; private set; } = "Flash"; [Signal] public delegate void OnActivatedEventHandler(ActivationType activationType); + + [Signal] + public delegate void PlayActivationSoundEventHandler(); + public override void _Ready() { if (Engine.IsEditorHint()) return; - _activationSound = GetNodeOrNull(_activationSoundName); + _animationPlayer = GetNode("AnimationPlayer"); + + //CallDeferred(MethodName.InitDeferred); + InitDeferred(); + } + private void InitDeferred() + { if (AlarmManager.Instance is not null) { AlarmManager.Instance.AlarmEnabled3D += OnAlarmEnabled3D; + AlarmManager.Instance.AlarmDisabled += InstanceOnAlarmDisabled; } } + private void InstanceOnAlarmDisabled() + { + _animationPlayer.Stop(); + } + private void OnAlarmEnabled3D(Vector3 location) { // TODO: set animation, make blinky GD.Print($"Enabled alarm in box {this.Name}"); + _animationPlayer.Play(FlashAnimationName); } public override bool Activate(ActivationType activationType = ActivationType.Toggle) { EmitSignal(SignalName.OnActivated, (int)activationType); - + EmitSignalPlayActivationSound(); if (AlarmManager.Instance is not null) { - _activationSound.Play(); + //_activationSound?.Play(); + AlarmManager.Instance.DisableAlarm(); } diff --git a/addons/tattomoosa.vision_cone_3d/LICENSE.txt b/addons/tattomoosa.vision_cone_3d/LICENSE.txt new file mode 100644 index 00000000..7aa888d2 --- /dev/null +++ b/addons/tattomoosa.vision_cone_3d/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (c) 2024 Matt O'Tousa + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/addons/tattomoosa.vision_cone_3d/README.md b/addons/tattomoosa.vision_cone_3d/README.md new file mode 100644 index 00000000..368cc46c --- /dev/null +++ b/addons/tattomoosa.vision_cone_3d/README.md @@ -0,0 +1,126 @@ +
+
+
+ +
+

+ VisionCone3D +
+ + + + Simple but configurable 3D vision cone node for Godot + + + +
+
+
+

+
+
+ + + +
+
+
+ +> Compatible with Godot 4.4 - see 4.3 branch for Godot 4.3 compatible version + +Adds VisionCone3D, which tracks whether or not objects within its cone shape can be "seen". +This can be used to let objects in your game "see" multiple objects efficiently. +Default configuration should work for most use-cases out of the box. + +## Features + +* Edit range/angle of cone via 3D viewport editor gizmo +* Debug visualization to easily diagnose any issues +* Works with complex objects that have many collision shapes +* Configurable vision probe settings allow tuning effectiveness and performance to your use-case +* Ignore some physics bodies (eg the parent body) +* Separate masks for bodies that can be seen and bodies that can only occlude other objects +* Includes general-purpose ConeShape3D + +## Installation + +Install via the AssetLib tab within Godot by searching for VisionCone3D + +## Usage + +Add the VisionCone3D node to your scene. Turn on debug draw to see it working. Then you can... + +### Connect to the body visible signals + +These signals fire when a body is newly visible or newly hidden. + +```python +func _ready(): + vision_cone.body_sighted.connect(_on_body_sighted) + vision_cone.body_hidden.connect(_on_body_hidden) + +func _on_body_sighted(body: Node3D): + print("body sighted: ", body.name) + +func _on_body_hidden(body: Node3D): + print("body hidden: ", body.name) +``` + +### Poll the currently visible bodies + +```python +func _process(): # doesn't need to be during a physics frame + print("bodies visible: ", vision_cone.get_visible_bodies()) +``` + +## Performance Tuning + +### Vision Test Mode + +#### Center + +Samples only the center point (position) of the CollisionShape. Most efficient, but least effective +as if the center of a shape is obscured it won't be seen. + +```python +vision_cone.vision_test_mode = VisionCone3D.VisionTestMode.SAMPLE_CENTER +``` + +#### Sample Random Vertices + +Uses CollisionShape's `get_debug_mesh` to get a mesh representation of the CollisionShape, +then samples random vertex points from that mesh. +Effectiveness determined by the max body count and max probe per shape count + +```python +vision_cone.vision_test_mode = VisionCone3D.VisionTestMode.SAMPLE_RANDOM_VERTICES +vision_cone.vision_test_max_body_count = 50 # Bodies probed, per-frame +vision_cone.vision_test_shape_max_probe_count = 5 # Probes per hidden shape +``` + +### Collision Masks + +VisionCone3D has 2 collision masks, one used for bodies that can be seen by the cone and one for an environment, +which can occlude seen bodies but is not itself probed for visibility. + +For example, add the level collision layer to `collision_environment_mask` and the player/enemy/object collision layer to the `collision_mask`. +The player/enemy/object can then hide behind the level, but no processing/probing will occur on the level collision geometry itself. + +## The Future + +This asset is still in development. I have some ideas for further performance tuning options, and I'm open to feedback on the usability and how to improve documentation or workflows. + +### 2D Support? + +I am open to adding a 2D version of this addon if there is sufficient interest. + +See if [VisionCone2D](https://github.com/d-bucur/godot-vision-cone) meets your needs in the meantime. No relation. + +## Upgrading + +### 0.1.0 -> 0.2.0 + +v0.2.0 has significant performance improvements. Probably should have waited a few days before publishing. It probably doesn't have any users yet, but just in case... + +* Use "Change Type..." on your VisionCone3Ds and select Area3D. +* Use new ConeShape3D for all your cone-y collision needs \ No newline at end of file diff --git a/addons/tattomoosa.vision_cone_3d/examples/demo.tscn b/addons/tattomoosa.vision_cone_3d/examples/demo.tscn new file mode 100644 index 00000000..60e5152a --- /dev/null +++ b/addons/tattomoosa.vision_cone_3d/examples/demo.tscn @@ -0,0 +1,246 @@ +[gd_scene load_steps=15 format=3 uid="uid://7xeocy4p43x6"] + +[ext_resource type="PackedScene" uid="uid://brqivkckug8uc" path="res://addons/tattomoosa.vision_cone_3d/examples/example_src/observer.tscn" id="1_5m65v"] +[ext_resource type="PackedScene" uid="uid://cmgl8607thxgg" path="res://addons/tattomoosa.vision_cone_3d/examples/example_src/observable.tscn" id="2_bfp2s"] +[ext_resource type="PackedScene" uid="uid://cdbsstpvtrvhd" path="res://addons/tattomoosa.vision_cone_3d/examples/example_src/vision_cone_controls.tscn" id="2_cx0nb"] +[ext_resource type="PackedScene" uid="uid://mqvpirrmppob" path="res://addons/tattomoosa.vision_cone_3d/examples/example_src/blocker.tscn" id="3_0fs8r"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_vlnew"] +size = Vector3(3, 3, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_q7pt8"] +size = Vector3(3, 3, 1) + +[sub_resource type="Curve3D" id="Curve3D_5a4ia"] +_data = { +"points": PackedVector3Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0), +"tilts": PackedFloat32Array(0, 0) +} +point_count = 2 + +[sub_resource type="Animation" id="Animation_gthqg"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("PathFollow3D:progress_ratio") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} + +[sub_resource type="Animation" id="Animation_yavxk"] +resource_name = "back_and_forth" +length = 6.0 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("PathFollow3D:progress_ratio") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 3, 6), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 1.0, 0.0] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_gv3ui"] +_data = { +&"RESET": SubResource("Animation_gthqg"), +&"back_and_forth": SubResource("Animation_yavxk") +} + +[sub_resource type="CylinderMesh" id="CylinderMesh_vessb"] +top_radius = 0.0 + +[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_1uqbn"] +data = PackedVector3Array(0, 1, 0, 0, 1, 0, 0, 0.6, 0.1, 0, 1, 0, 0.0098, 0.6, 0.0995, 0, 0.6, 0.1, 0, 1, 0, 0, 1, 0, 0.0098, 0.6, 0.0995, 0, 1, 0, 0.0195, 0.6, 0.0981, 0.0098, 0.6, 0.0995, 0, 1, 0, 0, 1, 0, 0.0195, 0.6, 0.0981, 0, 1, 0, 0.029, 0.6, 0.0957, 0.0195, 0.6, 0.0981, 0, 1, 0, 0, 1, 0, 0.029, 0.6, 0.0957, 0, 1, 0, 0.0383, 0.6, 0.0924, 0.029, 0.6, 0.0957, 0, 1, 0, 0, 1, 0, 0.0383, 0.6, 0.0924, 0, 1, 0, 0.0471, 0.6, 0.0882, 0.0383, 0.6, 0.0924, 0, 1, 0, 0, 1, 0, 0.0471, 0.6, 0.0882, 0, 1, 0, 0.0556, 0.6, 0.0831, 0.0471, 0.6, 0.0882, 0, 1, 0, 0, 1, 0, 0.0556, 0.6, 0.0831, 0, 1, 0, 0.0634, 0.6, 0.0773, 0.0556, 0.6, 0.0831, 0, 1, 0, 0, 1, 0, 0.0634, 0.6, 0.0773, 0, 1, 0, 0.0707, 0.6, 0.0707, 0.0634, 0.6, 0.0773, 0, 1, 0, 0, 1, 0, 0.0707, 0.6, 0.0707, 0, 1, 0, 0.0773, 0.6, 0.0634, 0.0707, 0.6, 0.0707, 0, 1, 0, 0, 1, 0, 0.0773, 0.6, 0.0634, 0, 1, 0, 0.0831, 0.6, 0.0556, 0.0773, 0.6, 0.0634, 0, 1, 0, 0, 1, 0, 0.0831, 0.6, 0.0556, 0, 1, 0, 0.0882, 0.6, 0.0471, 0.0831, 0.6, 0.0556, 0, 1, 0, 0, 1, 0, 0.0882, 0.6, 0.0471, 0, 1, 0, 0.0924, 0.6, 0.0383, 0.0882, 0.6, 0.0471, 0, 1, 0, 0, 1, 0, 0.0924, 0.6, 0.0383, 0, 1, 0, 0.0957, 0.6, 0.029, 0.0924, 0.6, 0.0383, 0, 1, 0, 0, 1, 0, 0.0957, 0.6, 0.029, 0, 1, 0, 0.0981, 0.6, 0.0195, 0.0957, 0.6, 0.029, 0, 1, 0, 0, 1, 0, 0.0981, 0.6, 0.0195, 0, 1, 0, 0.0995, 0.6, 0.0098, 0.0981, 0.6, 0.0195, 0, 1, 0, 0, 1, 0, 0.0995, 0.6, 0.0098, 0, 1, 0, 0.1, 0.6, 0, 0.0995, 0.6, 0.0098, 0, 1, 0, 0, 1, 0, 0.1, 0.6, 0, 0, 1, 0, 0.0995, 0.6, -0.0098, 0.1, 0.6, 0, 0, 1, 0, 0, 1, 0, 0.0995, 0.6, -0.0098, 0, 1, 0, 0.0981, 0.6, -0.0195, 0.0995, 0.6, -0.0098, 0, 1, 0, 0, 1, 0, 0.0981, 0.6, -0.0195, 0, 1, 0, 0.0957, 0.6, -0.029, 0.0981, 0.6, -0.0195, 0, 1, 0, 0, 1, 0, 0.0957, 0.6, -0.029, 0, 1, 0, 0.0924, 0.6, -0.0383, 0.0957, 0.6, -0.029, 0, 1, 0, 0, 1, 0, 0.0924, 0.6, -0.0383, 0, 1, 0, 0.0882, 0.6, -0.0471, 0.0924, 0.6, -0.0383, 0, 1, 0, 0, 1, 0, 0.0882, 0.6, -0.0471, 0, 1, 0, 0.0831, 0.6, -0.0556, 0.0882, 0.6, -0.0471, 0, 1, 0, 0, 1, 0, 0.0831, 0.6, -0.0556, 0, 1, 0, 0.0773, 0.6, -0.0634, 0.0831, 0.6, -0.0556, 0, 1, 0, 0, 1, 0, 0.0773, 0.6, -0.0634, 0, 1, 0, 0.0707, 0.6, -0.0707, 0.0773, 0.6, -0.0634, 0, 1, 0, 0, 1, 0, 0.0707, 0.6, -0.0707, 0, 1, 0, 0.0634, 0.6, -0.0773, 0.0707, 0.6, -0.0707, 0, 1, 0, 0, 1, 0, 0.0634, 0.6, -0.0773, 0, 1, 0, 0.0556, 0.6, -0.0831, 0.0634, 0.6, -0.0773, 0, 1, 0, 0, 1, 0, 0.0556, 0.6, -0.0831, 0, 1, 0, 0.0471, 0.6, -0.0882, 0.0556, 0.6, -0.0831, 0, 1, 0, 0, 1, 0, 0.0471, 0.6, -0.0882, 0, 1, 0, 0.0383, 0.6, -0.0924, 0.0471, 0.6, -0.0882, 0, 1, 0, 0, 1, 0, 0.0383, 0.6, -0.0924, 0, 1, 0, 0.029, 0.6, -0.0957, 0.0383, 0.6, -0.0924, 0, 1, 0, 0, 1, 0, 0.029, 0.6, -0.0957, 0, 1, 0, 0.0195, 0.6, -0.0981, 0.029, 0.6, -0.0957, 0, 1, 0, 0, 1, 0, 0.0195, 0.6, -0.0981, 0, 1, 0, 0.0098, 0.6, -0.0995, 0.0195, 0.6, -0.0981, 0, 1, 0, 0, 1, 0, 0.0098, 0.6, -0.0995, 0, 1, 0, 0, 0.6, -0.1, 0.0098, 0.6, -0.0995, 0, 1, 0, 0, 1, 0, 0, 0.6, -0.1, 0, 1, 0, -0.0098, 0.6, -0.0995, 0, 0.6, -0.1, 0, 1, 0, 0, 1, 0, -0.0098, 0.6, -0.0995, 0, 1, 0, -0.0195, 0.6, -0.0981, -0.0098, 0.6, -0.0995, 0, 1, 0, 0, 1, 0, -0.0195, 0.6, -0.0981, 0, 1, 0, -0.029, 0.6, -0.0957, -0.0195, 0.6, -0.0981, 0, 1, 0, 0, 1, 0, -0.029, 0.6, -0.0957, 0, 1, 0, -0.0383, 0.6, -0.0924, -0.029, 0.6, -0.0957, 0, 1, 0, 0, 1, 0, -0.0383, 0.6, -0.0924, 0, 1, 0, -0.0471, 0.6, -0.0882, -0.0383, 0.6, -0.0924, 0, 1, 0, 0, 1, 0, -0.0471, 0.6, -0.0882, 0, 1, 0, -0.0556, 0.6, -0.0831, -0.0471, 0.6, -0.0882, 0, 1, 0, 0, 1, 0, -0.0556, 0.6, -0.0831, 0, 1, 0, -0.0634, 0.6, -0.0773, -0.0556, 0.6, -0.0831, 0, 1, 0, 0, 1, 0, -0.0634, 0.6, -0.0773, 0, 1, 0, -0.0707, 0.6, -0.0707, -0.0634, 0.6, -0.0773, 0, 1, 0, 0, 1, 0, -0.0707, 0.6, -0.0707, 0, 1, 0, -0.0773, 0.6, -0.0634, -0.0707, 0.6, -0.0707, 0, 1, 0, 0, 1, 0, -0.0773, 0.6, -0.0634, 0, 1, 0, -0.0831, 0.6, -0.0556, -0.0773, 0.6, -0.0634, 0, 1, 0, 0, 1, 0, -0.0831, 0.6, -0.0556, 0, 1, 0, -0.0882, 0.6, -0.0471, -0.0831, 0.6, -0.0556, 0, 1, 0, 0, 1, 0, -0.0882, 0.6, -0.0471, 0, 1, 0, -0.0924, 0.6, -0.0383, -0.0882, 0.6, -0.0471, 0, 1, 0, 0, 1, 0, -0.0924, 0.6, -0.0383, 0, 1, 0, -0.0957, 0.6, -0.029, -0.0924, 0.6, -0.0383, 0, 1, 0, 0, 1, 0, -0.0957, 0.6, -0.029, 0, 1, 0, -0.0981, 0.6, -0.0195, -0.0957, 0.6, -0.029, 0, 1, 0, 0, 1, 0, -0.0981, 0.6, -0.0195, 0, 1, 0, -0.0995, 0.6, -0.0098, -0.0981, 0.6, -0.0195, 0, 1, 0, 0, 1, 0, -0.0995, 0.6, -0.0098, 0, 1, 0, -0.1, 0.6, 0, -0.0995, 0.6, -0.0098, 0, 1, 0, 0, 1, 0, -0.1, 0.6, 0, 0, 1, 0, -0.0995, 0.6, 0.0098, -0.1, 0.6, 0, 0, 1, 0, 0, 1, 0, -0.0995, 0.6, 0.0098, 0, 1, 0, -0.0981, 0.6, 0.0195, -0.0995, 0.6, 0.0098, 0, 1, 0, 0, 1, 0, -0.0981, 0.6, 0.0195, 0, 1, 0, -0.0957, 0.6, 0.029, -0.0981, 0.6, 0.0195, 0, 1, 0, 0, 1, 0, -0.0957, 0.6, 0.029, 0, 1, 0, -0.0924, 0.6, 0.0383, -0.0957, 0.6, 0.029, 0, 1, 0, 0, 1, 0, -0.0924, 0.6, 0.0383, 0, 1, 0, -0.0882, 0.6, 0.0471, -0.0924, 0.6, 0.0383, 0, 1, 0, 0, 1, 0, -0.0882, 0.6, 0.0471, 0, 1, 0, -0.0831, 0.6, 0.0556, -0.0882, 0.6, 0.0471, 0, 1, 0, 0, 1, 0, -0.0831, 0.6, 0.0556, 0, 1, 0, -0.0773, 0.6, 0.0634, -0.0831, 0.6, 0.0556, 0, 1, 0, 0, 1, 0, -0.0773, 0.6, 0.0634, 0, 1, 0, -0.0707, 0.6, 0.0707, -0.0773, 0.6, 0.0634, 0, 1, 0, 0, 1, 0, -0.0707, 0.6, 0.0707, 0, 1, 0, -0.0634, 0.6, 0.0773, -0.0707, 0.6, 0.0707, 0, 1, 0, 0, 1, 0, -0.0634, 0.6, 0.0773, 0, 1, 0, -0.0556, 0.6, 0.0831, -0.0634, 0.6, 0.0773, 0, 1, 0, 0, 1, 0, -0.0556, 0.6, 0.0831, 0, 1, 0, -0.0471, 0.6, 0.0882, -0.0556, 0.6, 0.0831, 0, 1, 0, 0, 1, 0, -0.0471, 0.6, 0.0882, 0, 1, 0, -0.0383, 0.6, 0.0924, -0.0471, 0.6, 0.0882, 0, 1, 0, 0, 1, 0, -0.0383, 0.6, 0.0924, 0, 1, 0, -0.029, 0.6, 0.0957, -0.0383, 0.6, 0.0924, 0, 1, 0, 0, 1, 0, -0.029, 0.6, 0.0957, 0, 1, 0, -0.0195, 0.6, 0.0981, -0.029, 0.6, 0.0957, 0, 1, 0, 0, 1, 0, -0.0195, 0.6, 0.0981, 0, 1, 0, -0.0098, 0.6, 0.0995, -0.0195, 0.6, 0.0981, 0, 1, 0, 0, 1, 0, -0.0098, 0.6, 0.0995, 0, 1, 0, 0, 0.6, 0.1, -0.0098, 0.6, 0.0995, 0, 0.6, 0.1, 0.0098, 0.6, 0.0995, 0, 0.2, 0.2, 0.0098, 0.6, 0.0995, 0.0196, 0.2, 0.199, 0, 0.2, 0.2, 0.0098, 0.6, 0.0995, 0.0195, 0.6, 0.0981, 0.0196, 0.2, 0.199, 0.0195, 0.6, 0.0981, 0.039, 0.2, 0.1962, 0.0196, 0.2, 0.199, 0.0195, 0.6, 0.0981, 0.029, 0.6, 0.0957, 0.039, 0.2, 0.1962, 0.029, 0.6, 0.0957, 0.0581, 0.2, 0.1914, 0.039, 0.2, 0.1962, 0.029, 0.6, 0.0957, 0.0383, 0.6, 0.0924, 0.0581, 0.2, 0.1914, 0.0383, 0.6, 0.0924, 0.0765, 0.2, 0.1848, 0.0581, 0.2, 0.1914, 0.0383, 0.6, 0.0924, 0.0471, 0.6, 0.0882, 0.0765, 0.2, 0.1848, 0.0471, 0.6, 0.0882, 0.0943, 0.2, 0.1764, 0.0765, 0.2, 0.1848, 0.0471, 0.6, 0.0882, 0.0556, 0.6, 0.0831, 0.0943, 0.2, 0.1764, 0.0556, 0.6, 0.0831, 0.1111, 0.2, 0.1663, 0.0943, 0.2, 0.1764, 0.0556, 0.6, 0.0831, 0.0634, 0.6, 0.0773, 0.1111, 0.2, 0.1663, 0.0634, 0.6, 0.0773, 0.1269, 0.2, 0.1546, 0.1111, 0.2, 0.1663, 0.0634, 0.6, 0.0773, 0.0707, 0.6, 0.0707, 0.1269, 0.2, 0.1546, 0.0707, 0.6, 0.0707, 0.1414, 0.2, 0.1414, 0.1269, 0.2, 0.1546, 0.0707, 0.6, 0.0707, 0.0773, 0.6, 0.0634, 0.1414, 0.2, 0.1414, 0.0773, 0.6, 0.0634, 0.1546, 0.2, 0.1269, 0.1414, 0.2, 0.1414, 0.0773, 0.6, 0.0634, 0.0831, 0.6, 0.0556, 0.1546, 0.2, 0.1269, 0.0831, 0.6, 0.0556, 0.1663, 0.2, 0.1111, 0.1546, 0.2, 0.1269, 0.0831, 0.6, 0.0556, 0.0882, 0.6, 0.0471, 0.1663, 0.2, 0.1111, 0.0882, 0.6, 0.0471, 0.1764, 0.2, 0.0943, 0.1663, 0.2, 0.1111, 0.0882, 0.6, 0.0471, 0.0924, 0.6, 0.0383, 0.1764, 0.2, 0.0943, 0.0924, 0.6, 0.0383, 0.1848, 0.2, 0.0765, 0.1764, 0.2, 0.0943, 0.0924, 0.6, 0.0383, 0.0957, 0.6, 0.029, 0.1848, 0.2, 0.0765, 0.0957, 0.6, 0.029, 0.1914, 0.2, 0.0581, 0.1848, 0.2, 0.0765, 0.0957, 0.6, 0.029, 0.0981, 0.6, 0.0195, 0.1914, 0.2, 0.0581, 0.0981, 0.6, 0.0195, 0.1962, 0.2, 0.039, 0.1914, 0.2, 0.0581, 0.0981, 0.6, 0.0195, 0.0995, 0.6, 0.0098, 0.1962, 0.2, 0.039, 0.0995, 0.6, 0.0098, 0.199, 0.2, 0.0196, 0.1962, 0.2, 0.039, 0.0995, 0.6, 0.0098, 0.1, 0.6, 0, 0.199, 0.2, 0.0196, 0.1, 0.6, 0, 0.2, 0.2, 0, 0.199, 0.2, 0.0196, 0.1, 0.6, 0, 0.0995, 0.6, -0.0098, 0.2, 0.2, 0, 0.0995, 0.6, -0.0098, 0.199, 0.2, -0.0196, 0.2, 0.2, 0, 0.0995, 0.6, -0.0098, 0.0981, 0.6, -0.0195, 0.199, 0.2, -0.0196, 0.0981, 0.6, -0.0195, 0.1962, 0.2, -0.039, 0.199, 0.2, -0.0196, 0.0981, 0.6, -0.0195, 0.0957, 0.6, -0.029, 0.1962, 0.2, -0.039, 0.0957, 0.6, -0.029, 0.1914, 0.2, -0.0581, 0.1962, 0.2, -0.039, 0.0957, 0.6, -0.029, 0.0924, 0.6, -0.0383, 0.1914, 0.2, -0.0581, 0.0924, 0.6, -0.0383, 0.1848, 0.2, -0.0765, 0.1914, 0.2, -0.0581, 0.0924, 0.6, -0.0383, 0.0882, 0.6, -0.0471, 0.1848, 0.2, -0.0765, 0.0882, 0.6, -0.0471, 0.1764, 0.2, -0.0943, 0.1848, 0.2, -0.0765, 0.0882, 0.6, -0.0471, 0.0831, 0.6, -0.0556, 0.1764, 0.2, -0.0943, 0.0831, 0.6, -0.0556, 0.1663, 0.2, -0.1111, 0.1764, 0.2, -0.0943, 0.0831, 0.6, -0.0556, 0.0773, 0.6, -0.0634, 0.1663, 0.2, -0.1111, 0.0773, 0.6, -0.0634, 0.1546, 0.2, -0.1269, 0.1663, 0.2, -0.1111, 0.0773, 0.6, -0.0634, 0.0707, 0.6, -0.0707, 0.1546, 0.2, -0.1269, 0.0707, 0.6, -0.0707, 0.1414, 0.2, -0.1414, 0.1546, 0.2, -0.1269, 0.0707, 0.6, -0.0707, 0.0634, 0.6, -0.0773, 0.1414, 0.2, -0.1414, 0.0634, 0.6, -0.0773, 0.1269, 0.2, -0.1546, 0.1414, 0.2, -0.1414, 0.0634, 0.6, -0.0773, 0.0556, 0.6, -0.0831, 0.1269, 0.2, -0.1546, 0.0556, 0.6, -0.0831, 0.1111, 0.2, -0.1663, 0.1269, 0.2, -0.1546, 0.0556, 0.6, -0.0831, 0.0471, 0.6, -0.0882, 0.1111, 0.2, -0.1663, 0.0471, 0.6, -0.0882, 0.0943, 0.2, -0.1764, 0.1111, 0.2, -0.1663, 0.0471, 0.6, -0.0882, 0.0383, 0.6, -0.0924, 0.0943, 0.2, -0.1764, 0.0383, 0.6, -0.0924, 0.0765, 0.2, -0.1848, 0.0943, 0.2, -0.1764, 0.0383, 0.6, -0.0924, 0.029, 0.6, -0.0957, 0.0765, 0.2, -0.1848, 0.029, 0.6, -0.0957, 0.0581, 0.2, -0.1914, 0.0765, 0.2, -0.1848, 0.029, 0.6, -0.0957, 0.0195, 0.6, -0.0981, 0.0581, 0.2, -0.1914, 0.0195, 0.6, -0.0981, 0.039, 0.2, -0.1962, 0.0581, 0.2, -0.1914, 0.0195, 0.6, -0.0981, 0.0098, 0.6, -0.0995, 0.039, 0.2, -0.1962, 0.0098, 0.6, -0.0995, 0.0196, 0.2, -0.199, 0.039, 0.2, -0.1962, 0.0098, 0.6, -0.0995, 0, 0.6, -0.1, 0.0196, 0.2, -0.199, 0, 0.6, -0.1, 0, 0.2, -0.2, 0.0196, 0.2, -0.199, 0, 0.6, -0.1, -0.0098, 0.6, -0.0995, 0, 0.2, -0.2, -0.0098, 0.6, -0.0995, -0.0196, 0.2, -0.199, 0, 0.2, -0.2, -0.0098, 0.6, -0.0995, -0.0195, 0.6, -0.0981, -0.0196, 0.2, -0.199, -0.0195, 0.6, -0.0981, -0.039, 0.2, -0.1962, -0.0196, 0.2, -0.199, -0.0195, 0.6, -0.0981, -0.029, 0.6, -0.0957, -0.039, 0.2, -0.1962, -0.029, 0.6, -0.0957, -0.0581, 0.2, -0.1914, -0.039, 0.2, -0.1962, -0.029, 0.6, -0.0957, -0.0383, 0.6, -0.0924, -0.0581, 0.2, -0.1914, -0.0383, 0.6, -0.0924, -0.0765, 0.2, -0.1848, -0.0581, 0.2, -0.1914, -0.0383, 0.6, -0.0924, -0.0471, 0.6, -0.0882, -0.0765, 0.2, -0.1848, -0.0471, 0.6, -0.0882, -0.0943, 0.2, -0.1764, -0.0765, 0.2, -0.1848, -0.0471, 0.6, -0.0882, -0.0556, 0.6, -0.0831, -0.0943, 0.2, -0.1764, -0.0556, 0.6, -0.0831, -0.1111, 0.2, -0.1663, -0.0943, 0.2, -0.1764, -0.0556, 0.6, -0.0831, -0.0634, 0.6, -0.0773, -0.1111, 0.2, -0.1663, -0.0634, 0.6, -0.0773, -0.1269, 0.2, -0.1546, -0.1111, 0.2, -0.1663, -0.0634, 0.6, -0.0773, -0.0707, 0.6, -0.0707, -0.1269, 0.2, -0.1546, -0.0707, 0.6, -0.0707, -0.1414, 0.2, -0.1414, -0.1269, 0.2, -0.1546, -0.0707, 0.6, -0.0707, -0.0773, 0.6, -0.0634, -0.1414, 0.2, -0.1414, -0.0773, 0.6, -0.0634, -0.1546, 0.2, -0.1269, -0.1414, 0.2, -0.1414, -0.0773, 0.6, -0.0634, -0.0831, 0.6, -0.0556, -0.1546, 0.2, -0.1269, -0.0831, 0.6, -0.0556, -0.1663, 0.2, -0.1111, -0.1546, 0.2, -0.1269, -0.0831, 0.6, -0.0556, -0.0882, 0.6, -0.0471, -0.1663, 0.2, -0.1111, -0.0882, 0.6, -0.0471, -0.1764, 0.2, -0.0943, -0.1663, 0.2, -0.1111, -0.0882, 0.6, -0.0471, -0.0924, 0.6, -0.0383, -0.1764, 0.2, -0.0943, -0.0924, 0.6, -0.0383, -0.1848, 0.2, -0.0765, -0.1764, 0.2, -0.0943, -0.0924, 0.6, -0.0383, -0.0957, 0.6, -0.029, -0.1848, 0.2, -0.0765, -0.0957, 0.6, -0.029, -0.1914, 0.2, -0.0581, -0.1848, 0.2, -0.0765, -0.0957, 0.6, -0.029, -0.0981, 0.6, -0.0195, -0.1914, 0.2, -0.0581, -0.0981, 0.6, -0.0195, -0.1962, 0.2, -0.039, -0.1914, 0.2, -0.0581, -0.0981, 0.6, -0.0195, -0.0995, 0.6, -0.0098, -0.1962, 0.2, -0.039, -0.0995, 0.6, -0.0098, -0.199, 0.2, -0.0196, -0.1962, 0.2, -0.039, -0.0995, 0.6, -0.0098, -0.1, 0.6, 0, -0.199, 0.2, -0.0196, -0.1, 0.6, 0, -0.2, 0.2, 0, -0.199, 0.2, -0.0196, -0.1, 0.6, 0, -0.0995, 0.6, 0.0098, -0.2, 0.2, 0, -0.0995, 0.6, 0.0098, -0.199, 0.2, 0.0196, -0.2, 0.2, 0, -0.0995, 0.6, 0.0098, -0.0981, 0.6, 0.0195, -0.199, 0.2, 0.0196, -0.0981, 0.6, 0.0195, -0.1962, 0.2, 0.039, -0.199, 0.2, 0.0196, -0.0981, 0.6, 0.0195, -0.0957, 0.6, 0.029, -0.1962, 0.2, 0.039, -0.0957, 0.6, 0.029, -0.1914, 0.2, 0.0581, -0.1962, 0.2, 0.039, -0.0957, 0.6, 0.029, -0.0924, 0.6, 0.0383, -0.1914, 0.2, 0.0581, -0.0924, 0.6, 0.0383, -0.1848, 0.2, 0.0765, -0.1914, 0.2, 0.0581, -0.0924, 0.6, 0.0383, -0.0882, 0.6, 0.0471, -0.1848, 0.2, 0.0765, -0.0882, 0.6, 0.0471, -0.1764, 0.2, 0.0943, -0.1848, 0.2, 0.0765, -0.0882, 0.6, 0.0471, -0.0831, 0.6, 0.0556, -0.1764, 0.2, 0.0943, -0.0831, 0.6, 0.0556, -0.1663, 0.2, 0.1111, -0.1764, 0.2, 0.0943, -0.0831, 0.6, 0.0556, -0.0773, 0.6, 0.0634, -0.1663, 0.2, 0.1111, -0.0773, 0.6, 0.0634, -0.1546, 0.2, 0.1269, -0.1663, 0.2, 0.1111, -0.0773, 0.6, 0.0634, -0.0707, 0.6, 0.0707, -0.1546, 0.2, 0.1269, -0.0707, 0.6, 0.0707, -0.1414, 0.2, 0.1414, -0.1546, 0.2, 0.1269, -0.0707, 0.6, 0.0707, -0.0634, 0.6, 0.0773, -0.1414, 0.2, 0.1414, -0.0634, 0.6, 0.0773, -0.1269, 0.2, 0.1546, -0.1414, 0.2, 0.1414, -0.0634, 0.6, 0.0773, -0.0556, 0.6, 0.0831, -0.1269, 0.2, 0.1546, -0.0556, 0.6, 0.0831, -0.1111, 0.2, 0.1663, -0.1269, 0.2, 0.1546, -0.0556, 0.6, 0.0831, -0.0471, 0.6, 0.0882, -0.1111, 0.2, 0.1663, -0.0471, 0.6, 0.0882, -0.0943, 0.2, 0.1764, -0.1111, 0.2, 0.1663, -0.0471, 0.6, 0.0882, -0.0383, 0.6, 0.0924, -0.0943, 0.2, 0.1764, -0.0383, 0.6, 0.0924, -0.0765, 0.2, 0.1848, -0.0943, 0.2, 0.1764, -0.0383, 0.6, 0.0924, -0.029, 0.6, 0.0957, -0.0765, 0.2, 0.1848, -0.029, 0.6, 0.0957, -0.0581, 0.2, 0.1914, -0.0765, 0.2, 0.1848, -0.029, 0.6, 0.0957, -0.0195, 0.6, 0.0981, -0.0581, 0.2, 0.1914, -0.0195, 0.6, 0.0981, -0.039, 0.2, 0.1962, -0.0581, 0.2, 0.1914, -0.0195, 0.6, 0.0981, -0.0098, 0.6, 0.0995, -0.039, 0.2, 0.1962, -0.0098, 0.6, 0.0995, -0.0196, 0.2, 0.199, -0.039, 0.2, 0.1962, -0.0098, 0.6, 0.0995, 0, 0.6, 0.1, -0.0196, 0.2, 0.199, 0, 0.6, 0.1, 0, 0.2, 0.2, -0.0196, 0.2, 0.199, 0, 0.2, 0.2, 0.0196, 0.2, 0.199, 0, -0.2, 0.3, 0.0196, 0.2, 0.199, 0.0294, -0.2, 0.2986, 0, -0.2, 0.3, 0.0196, 0.2, 0.199, 0.039, 0.2, 0.1962, 0.0294, -0.2, 0.2986, 0.039, 0.2, 0.1962, 0.0585, -0.2, 0.2942, 0.0294, -0.2, 0.2986, 0.039, 0.2, 0.1962, 0.0581, 0.2, 0.1914, 0.0585, -0.2, 0.2942, 0.0581, 0.2, 0.1914, 0.0871, -0.2, 0.2871, 0.0585, -0.2, 0.2942, 0.0581, 0.2, 0.1914, 0.0765, 0.2, 0.1848, 0.0871, -0.2, 0.2871, 0.0765, 0.2, 0.1848, 0.1148, -0.2, 0.2772, 0.0871, -0.2, 0.2871, 0.0765, 0.2, 0.1848, 0.0943, 0.2, 0.1764, 0.1148, -0.2, 0.2772, 0.0943, 0.2, 0.1764, 0.1414, -0.2, 0.2646, 0.1148, -0.2, 0.2772, 0.0943, 0.2, 0.1764, 0.1111, 0.2, 0.1663, 0.1414, -0.2, 0.2646, 0.1111, 0.2, 0.1663, 0.1667, -0.2, 0.2494, 0.1414, -0.2, 0.2646, 0.1111, 0.2, 0.1663, 0.1269, 0.2, 0.1546, 0.1667, -0.2, 0.2494, 0.1269, 0.2, 0.1546, 0.1903, -0.2, 0.2319, 0.1667, -0.2, 0.2494, 0.1269, 0.2, 0.1546, 0.1414, 0.2, 0.1414, 0.1903, -0.2, 0.2319, 0.1414, 0.2, 0.1414, 0.2121, -0.2, 0.2121, 0.1903, -0.2, 0.2319, 0.1414, 0.2, 0.1414, 0.1546, 0.2, 0.1269, 0.2121, -0.2, 0.2121, 0.1546, 0.2, 0.1269, 0.2319, -0.2, 0.1903, 0.2121, -0.2, 0.2121, 0.1546, 0.2, 0.1269, 0.1663, 0.2, 0.1111, 0.2319, -0.2, 0.1903, 0.1663, 0.2, 0.1111, 0.2494, -0.2, 0.1667, 0.2319, -0.2, 0.1903, 0.1663, 0.2, 0.1111, 0.1764, 0.2, 0.0943, 0.2494, -0.2, 0.1667, 0.1764, 0.2, 0.0943, 0.2646, -0.2, 0.1414, 0.2494, -0.2, 0.1667, 0.1764, 0.2, 0.0943, 0.1848, 0.2, 0.0765, 0.2646, -0.2, 0.1414, 0.1848, 0.2, 0.0765, 0.2772, -0.2, 0.1148, 0.2646, -0.2, 0.1414, 0.1848, 0.2, 0.0765, 0.1914, 0.2, 0.0581, 0.2772, -0.2, 0.1148, 0.1914, 0.2, 0.0581, 0.2871, -0.2, 0.0871, 0.2772, -0.2, 0.1148, 0.1914, 0.2, 0.0581, 0.1962, 0.2, 0.039, 0.2871, -0.2, 0.0871, 0.1962, 0.2, 0.039, 0.2942, -0.2, 0.0585, 0.2871, -0.2, 0.0871, 0.1962, 0.2, 0.039, 0.199, 0.2, 0.0196, 0.2942, -0.2, 0.0585, 0.199, 0.2, 0.0196, 0.2986, -0.2, 0.0294, 0.2942, -0.2, 0.0585, 0.199, 0.2, 0.0196, 0.2, 0.2, 0, 0.2986, -0.2, 0.0294, 0.2, 0.2, 0, 0.3, -0.2, 0, 0.2986, -0.2, 0.0294, 0.2, 0.2, 0, 0.199, 0.2, -0.0196, 0.3, -0.2, 0, 0.199, 0.2, -0.0196, 0.2986, -0.2, -0.0294, 0.3, -0.2, 0, 0.199, 0.2, -0.0196, 0.1962, 0.2, -0.039, 0.2986, -0.2, -0.0294, 0.1962, 0.2, -0.039, 0.2942, -0.2, -0.0585, 0.2986, -0.2, -0.0294, 0.1962, 0.2, -0.039, 0.1914, 0.2, -0.0581, 0.2942, -0.2, -0.0585, 0.1914, 0.2, -0.0581, 0.2871, -0.2, -0.0871, 0.2942, -0.2, -0.0585, 0.1914, 0.2, -0.0581, 0.1848, 0.2, -0.0765, 0.2871, -0.2, -0.0871, 0.1848, 0.2, -0.0765, 0.2772, -0.2, -0.1148, 0.2871, -0.2, -0.0871, 0.1848, 0.2, -0.0765, 0.1764, 0.2, -0.0943, 0.2772, -0.2, -0.1148, 0.1764, 0.2, -0.0943, 0.2646, -0.2, -0.1414, 0.2772, -0.2, -0.1148, 0.1764, 0.2, -0.0943, 0.1663, 0.2, -0.1111, 0.2646, -0.2, -0.1414, 0.1663, 0.2, -0.1111, 0.2494, -0.2, -0.1667, 0.2646, -0.2, -0.1414, 0.1663, 0.2, -0.1111, 0.1546, 0.2, -0.1269, 0.2494, -0.2, -0.1667, 0.1546, 0.2, -0.1269, 0.2319, -0.2, -0.1903, 0.2494, -0.2, -0.1667, 0.1546, 0.2, -0.1269, 0.1414, 0.2, -0.1414, 0.2319, -0.2, -0.1903, 0.1414, 0.2, -0.1414, 0.2121, -0.2, -0.2121, 0.2319, -0.2, -0.1903, 0.1414, 0.2, -0.1414, 0.1269, 0.2, -0.1546, 0.2121, -0.2, -0.2121, 0.1269, 0.2, -0.1546, 0.1903, -0.2, -0.2319, 0.2121, -0.2, -0.2121, 0.1269, 0.2, -0.1546, 0.1111, 0.2, -0.1663, 0.1903, -0.2, -0.2319, 0.1111, 0.2, -0.1663, 0.1667, -0.2, -0.2494, 0.1903, -0.2, -0.2319, 0.1111, 0.2, -0.1663, 0.0943, 0.2, -0.1764, 0.1667, -0.2, -0.2494, 0.0943, 0.2, -0.1764, 0.1414, -0.2, -0.2646, 0.1667, -0.2, -0.2494, 0.0943, 0.2, -0.1764, 0.0765, 0.2, -0.1848, 0.1414, -0.2, -0.2646, 0.0765, 0.2, -0.1848, 0.1148, -0.2, -0.2772, 0.1414, -0.2, -0.2646, 0.0765, 0.2, -0.1848, 0.0581, 0.2, -0.1914, 0.1148, -0.2, -0.2772, 0.0581, 0.2, -0.1914, 0.0871, -0.2, -0.2871, 0.1148, -0.2, -0.2772, 0.0581, 0.2, -0.1914, 0.039, 0.2, -0.1962, 0.0871, -0.2, -0.2871, 0.039, 0.2, -0.1962, 0.0585, -0.2, -0.2942, 0.0871, -0.2, -0.2871, 0.039, 0.2, -0.1962, 0.0196, 0.2, -0.199, 0.0585, -0.2, -0.2942, 0.0196, 0.2, -0.199, 0.0294, -0.2, -0.2986, 0.0585, -0.2, -0.2942, 0.0196, 0.2, -0.199, 0, 0.2, -0.2, 0.0294, -0.2, -0.2986, 0, 0.2, -0.2, 0, -0.2, -0.3, 0.0294, -0.2, -0.2986, 0, 0.2, -0.2, -0.0196, 0.2, -0.199, 0, -0.2, -0.3, -0.0196, 0.2, -0.199, -0.0294, -0.2, -0.2986, 0, -0.2, -0.3, -0.0196, 0.2, -0.199, -0.039, 0.2, -0.1962, -0.0294, -0.2, -0.2986, -0.039, 0.2, -0.1962, -0.0585, -0.2, -0.2942, -0.0294, -0.2, -0.2986, -0.039, 0.2, -0.1962, -0.0581, 0.2, -0.1914, -0.0585, -0.2, -0.2942, -0.0581, 0.2, -0.1914, -0.0871, -0.2, -0.2871, -0.0585, -0.2, -0.2942, -0.0581, 0.2, -0.1914, -0.0765, 0.2, -0.1848, -0.0871, -0.2, -0.2871, -0.0765, 0.2, -0.1848, -0.1148, -0.2, -0.2772, -0.0871, -0.2, -0.2871, -0.0765, 0.2, -0.1848, -0.0943, 0.2, -0.1764, -0.1148, -0.2, -0.2772, -0.0943, 0.2, -0.1764, -0.1414, -0.2, -0.2646, -0.1148, -0.2, -0.2772, -0.0943, 0.2, -0.1764, -0.1111, 0.2, -0.1663, -0.1414, -0.2, -0.2646, -0.1111, 0.2, -0.1663, -0.1667, -0.2, -0.2494, -0.1414, -0.2, -0.2646, -0.1111, 0.2, -0.1663, -0.1269, 0.2, -0.1546, -0.1667, -0.2, -0.2494, -0.1269, 0.2, -0.1546, -0.1903, -0.2, -0.2319, -0.1667, -0.2, -0.2494, -0.1269, 0.2, -0.1546, -0.1414, 0.2, -0.1414, -0.1903, -0.2, -0.2319, -0.1414, 0.2, -0.1414, -0.2121, -0.2, -0.2121, -0.1903, -0.2, -0.2319, -0.1414, 0.2, -0.1414, -0.1546, 0.2, -0.1269, -0.2121, -0.2, -0.2121, -0.1546, 0.2, -0.1269, -0.2319, -0.2, -0.1903, -0.2121, -0.2, -0.2121, -0.1546, 0.2, -0.1269, -0.1663, 0.2, -0.1111, -0.2319, -0.2, -0.1903, -0.1663, 0.2, -0.1111, -0.2494, -0.2, -0.1667, -0.2319, -0.2, -0.1903, -0.1663, 0.2, -0.1111, -0.1764, 0.2, -0.0943, -0.2494, -0.2, -0.1667, -0.1764, 0.2, -0.0943, -0.2646, -0.2, -0.1414, -0.2494, -0.2, -0.1667, -0.1764, 0.2, -0.0943, -0.1848, 0.2, -0.0765, -0.2646, -0.2, -0.1414, -0.1848, 0.2, -0.0765, -0.2772, -0.2, -0.1148, -0.2646, -0.2, -0.1414, -0.1848, 0.2, -0.0765, -0.1914, 0.2, -0.0581, -0.2772, -0.2, -0.1148, -0.1914, 0.2, -0.0581, -0.2871, -0.2, -0.0871, -0.2772, -0.2, -0.1148, -0.1914, 0.2, -0.0581, -0.1962, 0.2, -0.039, -0.2871, -0.2, -0.0871, -0.1962, 0.2, -0.039, -0.2942, -0.2, -0.0585, -0.2871, -0.2, -0.0871, -0.1962, 0.2, -0.039, -0.199, 0.2, -0.0196, -0.2942, -0.2, -0.0585, -0.199, 0.2, -0.0196, -0.2986, -0.2, -0.0294, -0.2942, -0.2, -0.0585, -0.199, 0.2, -0.0196, -0.2, 0.2, 0, -0.2986, -0.2, -0.0294, -0.2, 0.2, 0, -0.3, -0.2, 0, -0.2986, -0.2, -0.0294, -0.2, 0.2, 0, -0.199, 0.2, 0.0196, -0.3, -0.2, 0, -0.199, 0.2, 0.0196, -0.2986, -0.2, 0.0294, -0.3, -0.2, 0, -0.199, 0.2, 0.0196, -0.1962, 0.2, 0.039, -0.2986, -0.2, 0.0294, -0.1962, 0.2, 0.039, -0.2942, -0.2, 0.0585, -0.2986, -0.2, 0.0294, -0.1962, 0.2, 0.039, -0.1914, 0.2, 0.0581, -0.2942, -0.2, 0.0585, -0.1914, 0.2, 0.0581, -0.2871, -0.2, 0.0871, -0.2942, -0.2, 0.0585, -0.1914, 0.2, 0.0581, -0.1848, 0.2, 0.0765, -0.2871, -0.2, 0.0871, -0.1848, 0.2, 0.0765, -0.2772, -0.2, 0.1148, -0.2871, -0.2, 0.0871, -0.1848, 0.2, 0.0765, -0.1764, 0.2, 0.0943, -0.2772, -0.2, 0.1148, -0.1764, 0.2, 0.0943, -0.2646, -0.2, 0.1414, -0.2772, -0.2, 0.1148, -0.1764, 0.2, 0.0943, -0.1663, 0.2, 0.1111, -0.2646, -0.2, 0.1414, -0.1663, 0.2, 0.1111, -0.2494, -0.2, 0.1667, -0.2646, -0.2, 0.1414, -0.1663, 0.2, 0.1111, -0.1546, 0.2, 0.1269, -0.2494, -0.2, 0.1667, -0.1546, 0.2, 0.1269, -0.2319, -0.2, 0.1903, -0.2494, -0.2, 0.1667, -0.1546, 0.2, 0.1269, -0.1414, 0.2, 0.1414, -0.2319, -0.2, 0.1903, -0.1414, 0.2, 0.1414, -0.2121, -0.2, 0.2121, -0.2319, -0.2, 0.1903, -0.1414, 0.2, 0.1414, -0.1269, 0.2, 0.1546, -0.2121, -0.2, 0.2121, -0.1269, 0.2, 0.1546, -0.1903, -0.2, 0.2319, -0.2121, -0.2, 0.2121, -0.1269, 0.2, 0.1546, -0.1111, 0.2, 0.1663, -0.1903, -0.2, 0.2319, -0.1111, 0.2, 0.1663, -0.1667, -0.2, 0.2494, -0.1903, -0.2, 0.2319, -0.1111, 0.2, 0.1663, -0.0943, 0.2, 0.1764, -0.1667, -0.2, 0.2494, -0.0943, 0.2, 0.1764, -0.1414, -0.2, 0.2646, -0.1667, -0.2, 0.2494, -0.0943, 0.2, 0.1764, -0.0765, 0.2, 0.1848, -0.1414, -0.2, 0.2646, -0.0765, 0.2, 0.1848, -0.1148, -0.2, 0.2772, -0.1414, -0.2, 0.2646, -0.0765, 0.2, 0.1848, -0.0581, 0.2, 0.1914, -0.1148, -0.2, 0.2772, -0.0581, 0.2, 0.1914, -0.0871, -0.2, 0.2871, -0.1148, -0.2, 0.2772, -0.0581, 0.2, 0.1914, -0.039, 0.2, 0.1962, -0.0871, -0.2, 0.2871, -0.039, 0.2, 0.1962, -0.0585, -0.2, 0.2942, -0.0871, -0.2, 0.2871, -0.039, 0.2, 0.1962, -0.0196, 0.2, 0.199, -0.0585, -0.2, 0.2942, -0.0196, 0.2, 0.199, -0.0294, -0.2, 0.2986, -0.0585, -0.2, 0.2942, -0.0196, 0.2, 0.199, 0, 0.2, 0.2, -0.0294, -0.2, 0.2986, 0, 0.2, 0.2, 0, -0.2, 0.3, -0.0294, -0.2, 0.2986, 0, -0.2, 0.3, 0.0294, -0.2, 0.2986, 0, -0.6, 0.4, 0.0294, -0.2, 0.2986, 0.0392, -0.6, 0.3981, 0, -0.6, 0.4, 0.0294, -0.2, 0.2986, 0.0585, -0.2, 0.2942, 0.0392, -0.6, 0.3981, 0.0585, -0.2, 0.2942, 0.078, -0.6, 0.3923, 0.0392, -0.6, 0.3981, 0.0585, -0.2, 0.2942, 0.0871, -0.2, 0.2871, 0.078, -0.6, 0.3923, 0.0871, -0.2, 0.2871, 0.1161, -0.6, 0.3828, 0.078, -0.6, 0.3923, 0.0871, -0.2, 0.2871, 0.1148, -0.2, 0.2772, 0.1161, -0.6, 0.3828, 0.1148, -0.2, 0.2772, 0.1531, -0.6, 0.3696, 0.1161, -0.6, 0.3828, 0.1148, -0.2, 0.2772, 0.1414, -0.2, 0.2646, 0.1531, -0.6, 0.3696, 0.1414, -0.2, 0.2646, 0.1886, -0.6, 0.3528, 0.1531, -0.6, 0.3696, 0.1414, -0.2, 0.2646, 0.1667, -0.2, 0.2494, 0.1886, -0.6, 0.3528, 0.1667, -0.2, 0.2494, 0.2222, -0.6, 0.3326, 0.1886, -0.6, 0.3528, 0.1667, -0.2, 0.2494, 0.1903, -0.2, 0.2319, 0.2222, -0.6, 0.3326, 0.1903, -0.2, 0.2319, 0.2538, -0.6, 0.3092, 0.2222, -0.6, 0.3326, 0.1903, -0.2, 0.2319, 0.2121, -0.2, 0.2121, 0.2538, -0.6, 0.3092, 0.2121, -0.2, 0.2121, 0.2828, -0.6, 0.2828, 0.2538, -0.6, 0.3092, 0.2121, -0.2, 0.2121, 0.2319, -0.2, 0.1903, 0.2828, -0.6, 0.2828, 0.2319, -0.2, 0.1903, 0.3092, -0.6, 0.2538, 0.2828, -0.6, 0.2828, 0.2319, -0.2, 0.1903, 0.2494, -0.2, 0.1667, 0.3092, -0.6, 0.2538, 0.2494, -0.2, 0.1667, 0.3326, -0.6, 0.2222, 0.3092, -0.6, 0.2538, 0.2494, -0.2, 0.1667, 0.2646, -0.2, 0.1414, 0.3326, -0.6, 0.2222, 0.2646, -0.2, 0.1414, 0.3528, -0.6, 0.1886, 0.3326, -0.6, 0.2222, 0.2646, -0.2, 0.1414, 0.2772, -0.2, 0.1148, 0.3528, -0.6, 0.1886, 0.2772, -0.2, 0.1148, 0.3696, -0.6, 0.1531, 0.3528, -0.6, 0.1886, 0.2772, -0.2, 0.1148, 0.2871, -0.2, 0.0871, 0.3696, -0.6, 0.1531, 0.2871, -0.2, 0.0871, 0.3828, -0.6, 0.1161, 0.3696, -0.6, 0.1531, 0.2871, -0.2, 0.0871, 0.2942, -0.2, 0.0585, 0.3828, -0.6, 0.1161, 0.2942, -0.2, 0.0585, 0.3923, -0.6, 0.078, 0.3828, -0.6, 0.1161, 0.2942, -0.2, 0.0585, 0.2986, -0.2, 0.0294, 0.3923, -0.6, 0.078, 0.2986, -0.2, 0.0294, 0.3981, -0.6, 0.0392, 0.3923, -0.6, 0.078, 0.2986, -0.2, 0.0294, 0.3, -0.2, 0, 0.3981, -0.6, 0.0392, 0.3, -0.2, 0, 0.4, -0.6, 0, 0.3981, -0.6, 0.0392, 0.3, -0.2, 0, 0.2986, -0.2, -0.0294, 0.4, -0.6, 0, 0.2986, -0.2, -0.0294, 0.3981, -0.6, -0.0392, 0.4, -0.6, 0, 0.2986, -0.2, -0.0294, 0.2942, -0.2, -0.0585, 0.3981, -0.6, -0.0392, 0.2942, -0.2, -0.0585, 0.3923, -0.6, -0.078, 0.3981, -0.6, -0.0392, 0.2942, -0.2, -0.0585, 0.2871, -0.2, -0.0871, 0.3923, -0.6, -0.078, 0.2871, -0.2, -0.0871, 0.3828, -0.6, -0.1161, 0.3923, -0.6, -0.078, 0.2871, -0.2, -0.0871, 0.2772, -0.2, -0.1148, 0.3828, -0.6, -0.1161, 0.2772, -0.2, -0.1148, 0.3696, -0.6, -0.1531, 0.3828, -0.6, -0.1161, 0.2772, -0.2, -0.1148, 0.2646, -0.2, -0.1414, 0.3696, -0.6, -0.1531, 0.2646, -0.2, -0.1414, 0.3528, -0.6, -0.1886, 0.3696, -0.6, -0.1531, 0.2646, -0.2, -0.1414, 0.2494, -0.2, -0.1667, 0.3528, -0.6, -0.1886, 0.2494, -0.2, -0.1667, 0.3326, -0.6, -0.2222, 0.3528, -0.6, -0.1886, 0.2494, -0.2, -0.1667, 0.2319, -0.2, -0.1903, 0.3326, -0.6, -0.2222, 0.2319, -0.2, -0.1903, 0.3092, -0.6, -0.2538, 0.3326, -0.6, -0.2222, 0.2319, -0.2, -0.1903, 0.2121, -0.2, -0.2121, 0.3092, -0.6, -0.2538, 0.2121, -0.2, -0.2121, 0.2828, -0.6, -0.2828, 0.3092, -0.6, -0.2538, 0.2121, -0.2, -0.2121, 0.1903, -0.2, -0.2319, 0.2828, -0.6, -0.2828, 0.1903, -0.2, -0.2319, 0.2538, -0.6, -0.3092, 0.2828, -0.6, -0.2828, 0.1903, -0.2, -0.2319, 0.1667, -0.2, -0.2494, 0.2538, -0.6, -0.3092, 0.1667, -0.2, -0.2494, 0.2222, -0.6, -0.3326, 0.2538, -0.6, -0.3092, 0.1667, -0.2, -0.2494, 0.1414, -0.2, -0.2646, 0.2222, -0.6, -0.3326, 0.1414, -0.2, -0.2646, 0.1886, -0.6, -0.3528, 0.2222, -0.6, -0.3326, 0.1414, -0.2, -0.2646, 0.1148, -0.2, -0.2772, 0.1886, -0.6, -0.3528, 0.1148, -0.2, -0.2772, 0.1531, -0.6, -0.3696, 0.1886, -0.6, -0.3528, 0.1148, -0.2, -0.2772, 0.0871, -0.2, -0.2871, 0.1531, -0.6, -0.3696, 0.0871, -0.2, -0.2871, 0.1161, -0.6, -0.3828, 0.1531, -0.6, -0.3696, 0.0871, -0.2, -0.2871, 0.0585, -0.2, -0.2942, 0.1161, -0.6, -0.3828, 0.0585, -0.2, -0.2942, 0.078, -0.6, -0.3923, 0.1161, -0.6, -0.3828, 0.0585, -0.2, -0.2942, 0.0294, -0.2, -0.2986, 0.078, -0.6, -0.3923, 0.0294, -0.2, -0.2986, 0.0392, -0.6, -0.3981, 0.078, -0.6, -0.3923, 0.0294, -0.2, -0.2986, 0, -0.2, -0.3, 0.0392, -0.6, -0.3981, 0, -0.2, -0.3, 0, -0.6, -0.4, 0.0392, -0.6, -0.3981, 0, -0.2, -0.3, -0.0294, -0.2, -0.2986, 0, -0.6, -0.4, -0.0294, -0.2, -0.2986, -0.0392, -0.6, -0.3981, 0, -0.6, -0.4, -0.0294, -0.2, -0.2986, -0.0585, -0.2, -0.2942, -0.0392, -0.6, -0.3981, -0.0585, -0.2, -0.2942, -0.078, -0.6, -0.3923, -0.0392, -0.6, -0.3981, -0.0585, -0.2, -0.2942, -0.0871, -0.2, -0.2871, -0.078, -0.6, -0.3923, -0.0871, -0.2, -0.2871, -0.1161, -0.6, -0.3828, -0.078, -0.6, -0.3923, -0.0871, -0.2, -0.2871, -0.1148, -0.2, -0.2772, -0.1161, -0.6, -0.3828, -0.1148, -0.2, -0.2772, -0.1531, -0.6, -0.3696, -0.1161, -0.6, -0.3828, -0.1148, -0.2, -0.2772, -0.1414, -0.2, -0.2646, -0.1531, -0.6, -0.3696, -0.1414, -0.2, -0.2646, -0.1886, -0.6, -0.3528, -0.1531, -0.6, -0.3696, -0.1414, -0.2, -0.2646, -0.1667, -0.2, -0.2494, -0.1886, -0.6, -0.3528, -0.1667, -0.2, -0.2494, -0.2222, -0.6, -0.3326, -0.1886, -0.6, -0.3528, -0.1667, -0.2, -0.2494, -0.1903, -0.2, -0.2319, -0.2222, -0.6, -0.3326, -0.1903, -0.2, -0.2319, -0.2538, -0.6, -0.3092, -0.2222, -0.6, -0.3326, -0.1903, -0.2, -0.2319, -0.2121, -0.2, -0.2121, -0.2538, -0.6, -0.3092, -0.2121, -0.2, -0.2121, -0.2828, -0.6, -0.2828, -0.2538, -0.6, -0.3092, -0.2121, -0.2, -0.2121, -0.2319, -0.2, -0.1903, -0.2828, -0.6, -0.2828, -0.2319, -0.2, -0.1903, -0.3092, -0.6, -0.2538, -0.2828, -0.6, -0.2828, -0.2319, -0.2, -0.1903, -0.2494, -0.2, -0.1667, -0.3092, -0.6, -0.2538, -0.2494, -0.2, -0.1667, -0.3326, -0.6, -0.2222, -0.3092, -0.6, -0.2538, -0.2494, -0.2, -0.1667, -0.2646, -0.2, -0.1414, -0.3326, -0.6, -0.2222, -0.2646, -0.2, -0.1414, -0.3528, -0.6, -0.1886, -0.3326, -0.6, -0.2222, -0.2646, -0.2, -0.1414, -0.2772, -0.2, -0.1148, -0.3528, -0.6, -0.1886, -0.2772, -0.2, -0.1148, -0.3696, -0.6, -0.1531, -0.3528, -0.6, -0.1886, -0.2772, -0.2, -0.1148, -0.2871, -0.2, -0.0871, -0.3696, -0.6, -0.1531, -0.2871, -0.2, -0.0871, -0.3828, -0.6, -0.1161, -0.3696, -0.6, -0.1531, -0.2871, -0.2, -0.0871, -0.2942, -0.2, -0.0585, -0.3828, -0.6, -0.1161, -0.2942, -0.2, -0.0585, -0.3923, -0.6, -0.078, -0.3828, -0.6, -0.1161, -0.2942, -0.2, -0.0585, -0.2986, -0.2, -0.0294, -0.3923, -0.6, -0.078, -0.2986, -0.2, -0.0294, -0.3981, -0.6, -0.0392, -0.3923, -0.6, -0.078, -0.2986, -0.2, -0.0294, -0.3, -0.2, 0, -0.3981, -0.6, -0.0392, -0.3, -0.2, 0, -0.4, -0.6, 0, -0.3981, -0.6, -0.0392, -0.3, -0.2, 0, -0.2986, -0.2, 0.0294, -0.4, -0.6, 0, -0.2986, -0.2, 0.0294, -0.3981, -0.6, 0.0392, -0.4, -0.6, 0, -0.2986, -0.2, 0.0294, -0.2942, -0.2, 0.0585, -0.3981, -0.6, 0.0392, -0.2942, -0.2, 0.0585, -0.3923, -0.6, 0.078, -0.3981, -0.6, 0.0392, -0.2942, -0.2, 0.0585, -0.2871, -0.2, 0.0871, -0.3923, -0.6, 0.078, -0.2871, -0.2, 0.0871, -0.3828, -0.6, 0.1161, -0.3923, -0.6, 0.078, -0.2871, -0.2, 0.0871, -0.2772, -0.2, 0.1148, -0.3828, -0.6, 0.1161, -0.2772, -0.2, 0.1148, -0.3696, -0.6, 0.1531, -0.3828, -0.6, 0.1161, -0.2772, -0.2, 0.1148, -0.2646, -0.2, 0.1414, -0.3696, -0.6, 0.1531, -0.2646, -0.2, 0.1414, -0.3528, -0.6, 0.1886, -0.3696, -0.6, 0.1531, -0.2646, -0.2, 0.1414, -0.2494, -0.2, 0.1667, -0.3528, -0.6, 0.1886, -0.2494, -0.2, 0.1667, -0.3326, -0.6, 0.2222, -0.3528, -0.6, 0.1886, -0.2494, -0.2, 0.1667, -0.2319, -0.2, 0.1903, -0.3326, -0.6, 0.2222, -0.2319, -0.2, 0.1903, -0.3092, -0.6, 0.2538, -0.3326, -0.6, 0.2222, -0.2319, -0.2, 0.1903, -0.2121, -0.2, 0.2121, -0.3092, -0.6, 0.2538, -0.2121, -0.2, 0.2121, -0.2828, -0.6, 0.2828, -0.3092, -0.6, 0.2538, -0.2121, -0.2, 0.2121, -0.1903, -0.2, 0.2319, -0.2828, -0.6, 0.2828, -0.1903, -0.2, 0.2319, -0.2538, -0.6, 0.3092, -0.2828, -0.6, 0.2828, -0.1903, -0.2, 0.2319, -0.1667, -0.2, 0.2494, -0.2538, -0.6, 0.3092, -0.1667, -0.2, 0.2494, -0.2222, -0.6, 0.3326, -0.2538, -0.6, 0.3092, -0.1667, -0.2, 0.2494, -0.1414, -0.2, 0.2646, -0.2222, -0.6, 0.3326, -0.1414, -0.2, 0.2646, -0.1886, -0.6, 0.3528, -0.2222, -0.6, 0.3326, -0.1414, -0.2, 0.2646, -0.1148, -0.2, 0.2772, -0.1886, -0.6, 0.3528, -0.1148, -0.2, 0.2772, -0.1531, -0.6, 0.3696, -0.1886, -0.6, 0.3528, -0.1148, -0.2, 0.2772, -0.0871, -0.2, 0.2871, -0.1531, -0.6, 0.3696, -0.0871, -0.2, 0.2871, -0.1161, -0.6, 0.3828, -0.1531, -0.6, 0.3696, -0.0871, -0.2, 0.2871, -0.0585, -0.2, 0.2942, -0.1161, -0.6, 0.3828, -0.0585, -0.2, 0.2942, -0.078, -0.6, 0.3923, -0.1161, -0.6, 0.3828, -0.0585, -0.2, 0.2942, -0.0294, -0.2, 0.2986, -0.078, -0.6, 0.3923, -0.0294, -0.2, 0.2986, -0.0392, -0.6, 0.3981, -0.078, -0.6, 0.3923, -0.0294, -0.2, 0.2986, 0, -0.2, 0.3, -0.0392, -0.6, 0.3981, 0, -0.2, 0.3, 0, -0.6, 0.4, -0.0392, -0.6, 0.3981, 0, -0.6, 0.4, 0.0392, -0.6, 0.3981, 0, -1, 0.5, 0.0392, -0.6, 0.3981, 0.049, -1, 0.4976, 0, -1, 0.5, 0.0392, -0.6, 0.3981, 0.078, -0.6, 0.3923, 0.049, -1, 0.4976, 0.078, -0.6, 0.3923, 0.0975, -1, 0.4904, 0.049, -1, 0.4976, 0.078, -0.6, 0.3923, 0.1161, -0.6, 0.3828, 0.0975, -1, 0.4904, 0.1161, -0.6, 0.3828, 0.1451, -1, 0.4785, 0.0975, -1, 0.4904, 0.1161, -0.6, 0.3828, 0.1531, -0.6, 0.3696, 0.1451, -1, 0.4785, 0.1531, -0.6, 0.3696, 0.1913, -1, 0.4619, 0.1451, -1, 0.4785, 0.1531, -0.6, 0.3696, 0.1886, -0.6, 0.3528, 0.1913, -1, 0.4619, 0.1886, -0.6, 0.3528, 0.2357, -1, 0.441, 0.1913, -1, 0.4619, 0.1886, -0.6, 0.3528, 0.2222, -0.6, 0.3326, 0.2357, -1, 0.441, 0.2222, -0.6, 0.3326, 0.2778, -1, 0.4157, 0.2357, -1, 0.441, 0.2222, -0.6, 0.3326, 0.2538, -0.6, 0.3092, 0.2778, -1, 0.4157, 0.2538, -0.6, 0.3092, 0.3172, -1, 0.3865, 0.2778, -1, 0.4157, 0.2538, -0.6, 0.3092, 0.2828, -0.6, 0.2828, 0.3172, -1, 0.3865, 0.2828, -0.6, 0.2828, 0.3536, -1, 0.3536, 0.3172, -1, 0.3865, 0.2828, -0.6, 0.2828, 0.3092, -0.6, 0.2538, 0.3536, -1, 0.3536, 0.3092, -0.6, 0.2538, 0.3865, -1, 0.3172, 0.3536, -1, 0.3536, 0.3092, -0.6, 0.2538, 0.3326, -0.6, 0.2222, 0.3865, -1, 0.3172, 0.3326, -0.6, 0.2222, 0.4157, -1, 0.2778, 0.3865, -1, 0.3172, 0.3326, -0.6, 0.2222, 0.3528, -0.6, 0.1886, 0.4157, -1, 0.2778, 0.3528, -0.6, 0.1886, 0.441, -1, 0.2357, 0.4157, -1, 0.2778, 0.3528, -0.6, 0.1886, 0.3696, -0.6, 0.1531, 0.441, -1, 0.2357, 0.3696, -0.6, 0.1531, 0.4619, -1, 0.1913, 0.441, -1, 0.2357, 0.3696, -0.6, 0.1531, 0.3828, -0.6, 0.1161, 0.4619, -1, 0.1913, 0.3828, -0.6, 0.1161, 0.4785, -1, 0.1451, 0.4619, -1, 0.1913, 0.3828, -0.6, 0.1161, 0.3923, -0.6, 0.078, 0.4785, -1, 0.1451, 0.3923, -0.6, 0.078, 0.4904, -1, 0.0975, 0.4785, -1, 0.1451, 0.3923, -0.6, 0.078, 0.3981, -0.6, 0.0392, 0.4904, -1, 0.0975, 0.3981, -0.6, 0.0392, 0.4976, -1, 0.049, 0.4904, -1, 0.0975, 0.3981, -0.6, 0.0392, 0.4, -0.6, 0, 0.4976, -1, 0.049, 0.4, -0.6, 0, 0.5, -1, 0, 0.4976, -1, 0.049, 0.4, -0.6, 0, 0.3981, -0.6, -0.0392, 0.5, -1, 0, 0.3981, -0.6, -0.0392, 0.4976, -1, -0.049, 0.5, -1, 0, 0.3981, -0.6, -0.0392, 0.3923, -0.6, -0.078, 0.4976, -1, -0.049, 0.3923, -0.6, -0.078, 0.4904, -1, -0.0975, 0.4976, -1, -0.049, 0.3923, -0.6, -0.078, 0.3828, -0.6, -0.1161, 0.4904, -1, -0.0975, 0.3828, -0.6, -0.1161, 0.4785, -1, -0.1451, 0.4904, -1, -0.0975, 0.3828, -0.6, -0.1161, 0.3696, -0.6, -0.1531, 0.4785, -1, -0.1451, 0.3696, -0.6, -0.1531, 0.4619, -1, -0.1913, 0.4785, -1, -0.1451, 0.3696, -0.6, -0.1531, 0.3528, -0.6, -0.1886, 0.4619, -1, -0.1913, 0.3528, -0.6, -0.1886, 0.441, -1, -0.2357, 0.4619, -1, -0.1913, 0.3528, -0.6, -0.1886, 0.3326, -0.6, -0.2222, 0.441, -1, -0.2357, 0.3326, -0.6, -0.2222, 0.4157, -1, -0.2778, 0.441, -1, -0.2357, 0.3326, -0.6, -0.2222, 0.3092, -0.6, -0.2538, 0.4157, -1, -0.2778, 0.3092, -0.6, -0.2538, 0.3865, -1, -0.3172, 0.4157, -1, -0.2778, 0.3092, -0.6, -0.2538, 0.2828, -0.6, -0.2828, 0.3865, -1, -0.3172, 0.2828, -0.6, -0.2828, 0.3536, -1, -0.3536, 0.3865, -1, -0.3172, 0.2828, -0.6, -0.2828, 0.2538, -0.6, -0.3092, 0.3536, -1, -0.3536, 0.2538, -0.6, -0.3092, 0.3172, -1, -0.3865, 0.3536, -1, -0.3536, 0.2538, -0.6, -0.3092, 0.2222, -0.6, -0.3326, 0.3172, -1, -0.3865, 0.2222, -0.6, -0.3326, 0.2778, -1, -0.4157, 0.3172, -1, -0.3865, 0.2222, -0.6, -0.3326, 0.1886, -0.6, -0.3528, 0.2778, -1, -0.4157, 0.1886, -0.6, -0.3528, 0.2357, -1, -0.441, 0.2778, -1, -0.4157, 0.1886, -0.6, -0.3528, 0.1531, -0.6, -0.3696, 0.2357, -1, -0.441, 0.1531, -0.6, -0.3696, 0.1913, -1, -0.4619, 0.2357, -1, -0.441, 0.1531, -0.6, -0.3696, 0.1161, -0.6, -0.3828, 0.1913, -1, -0.4619, 0.1161, -0.6, -0.3828, 0.1451, -1, -0.4785, 0.1913, -1, -0.4619, 0.1161, -0.6, -0.3828, 0.078, -0.6, -0.3923, 0.1451, -1, -0.4785, 0.078, -0.6, -0.3923, 0.0975, -1, -0.4904, 0.1451, -1, -0.4785, 0.078, -0.6, -0.3923, 0.0392, -0.6, -0.3981, 0.0975, -1, -0.4904, 0.0392, -0.6, -0.3981, 0.049, -1, -0.4976, 0.0975, -1, -0.4904, 0.0392, -0.6, -0.3981, 0, -0.6, -0.4, 0.049, -1, -0.4976, 0, -0.6, -0.4, 0, -1, -0.5, 0.049, -1, -0.4976, 0, -0.6, -0.4, -0.0392, -0.6, -0.3981, 0, -1, -0.5, -0.0392, -0.6, -0.3981, -0.049, -1, -0.4976, 0, -1, -0.5, -0.0392, -0.6, -0.3981, -0.078, -0.6, -0.3923, -0.049, -1, -0.4976, -0.078, -0.6, -0.3923, -0.0975, -1, -0.4904, -0.049, -1, -0.4976, -0.078, -0.6, -0.3923, -0.1161, -0.6, -0.3828, -0.0975, -1, -0.4904, -0.1161, -0.6, -0.3828, -0.1451, -1, -0.4785, -0.0975, -1, -0.4904, -0.1161, -0.6, -0.3828, -0.1531, -0.6, -0.3696, -0.1451, -1, -0.4785, -0.1531, -0.6, -0.3696, -0.1913, -1, -0.4619, -0.1451, -1, -0.4785, -0.1531, -0.6, -0.3696, -0.1886, -0.6, -0.3528, -0.1913, -1, -0.4619, -0.1886, -0.6, -0.3528, -0.2357, -1, -0.441, -0.1913, -1, -0.4619, -0.1886, -0.6, -0.3528, -0.2222, -0.6, -0.3326, -0.2357, -1, -0.441, -0.2222, -0.6, -0.3326, -0.2778, -1, -0.4157, -0.2357, -1, -0.441, -0.2222, -0.6, -0.3326, -0.2538, -0.6, -0.3092, -0.2778, -1, -0.4157, -0.2538, -0.6, -0.3092, -0.3172, -1, -0.3865, -0.2778, -1, -0.4157, -0.2538, -0.6, -0.3092, -0.2828, -0.6, -0.2828, -0.3172, -1, -0.3865, -0.2828, -0.6, -0.2828, -0.3536, -1, -0.3536, -0.3172, -1, -0.3865, -0.2828, -0.6, -0.2828, -0.3092, -0.6, -0.2538, -0.3536, -1, -0.3536, -0.3092, -0.6, -0.2538, -0.3865, -1, -0.3172, -0.3536, -1, -0.3536, -0.3092, -0.6, -0.2538, -0.3326, -0.6, -0.2222, -0.3865, -1, -0.3172, -0.3326, -0.6, -0.2222, -0.4157, -1, -0.2778, -0.3865, -1, -0.3172, -0.3326, -0.6, -0.2222, -0.3528, -0.6, -0.1886, -0.4157, -1, -0.2778, -0.3528, -0.6, -0.1886, -0.441, -1, -0.2357, -0.4157, -1, -0.2778, -0.3528, -0.6, -0.1886, -0.3696, -0.6, -0.1531, -0.441, -1, -0.2357, -0.3696, -0.6, -0.1531, -0.4619, -1, -0.1913, -0.441, -1, -0.2357, -0.3696, -0.6, -0.1531, -0.3828, -0.6, -0.1161, -0.4619, -1, -0.1913, -0.3828, -0.6, -0.1161, -0.4785, -1, -0.1451, -0.4619, -1, -0.1913, -0.3828, -0.6, -0.1161, -0.3923, -0.6, -0.078, -0.4785, -1, -0.1451, -0.3923, -0.6, -0.078, -0.4904, -1, -0.0975, -0.4785, -1, -0.1451, -0.3923, -0.6, -0.078, -0.3981, -0.6, -0.0392, -0.4904, -1, -0.0975, -0.3981, -0.6, -0.0392, -0.4976, -1, -0.049, -0.4904, -1, -0.0975, -0.3981, -0.6, -0.0392, -0.4, -0.6, 0, -0.4976, -1, -0.049, -0.4, -0.6, 0, -0.5, -1, 0, -0.4976, -1, -0.049, -0.4, -0.6, 0, -0.3981, -0.6, 0.0392, -0.5, -1, 0, -0.3981, -0.6, 0.0392, -0.4976, -1, 0.049, -0.5, -1, 0, -0.3981, -0.6, 0.0392, -0.3923, -0.6, 0.078, -0.4976, -1, 0.049, -0.3923, -0.6, 0.078, -0.4904, -1, 0.0975, -0.4976, -1, 0.049, -0.3923, -0.6, 0.078, -0.3828, -0.6, 0.1161, -0.4904, -1, 0.0975, -0.3828, -0.6, 0.1161, -0.4785, -1, 0.1451, -0.4904, -1, 0.0975, -0.3828, -0.6, 0.1161, -0.3696, -0.6, 0.1531, -0.4785, -1, 0.1451, -0.3696, -0.6, 0.1531, -0.4619, -1, 0.1913, -0.4785, -1, 0.1451, -0.3696, -0.6, 0.1531, -0.3528, -0.6, 0.1886, -0.4619, -1, 0.1913, -0.3528, -0.6, 0.1886, -0.441, -1, 0.2357, -0.4619, -1, 0.1913, -0.3528, -0.6, 0.1886, -0.3326, -0.6, 0.2222, -0.441, -1, 0.2357, -0.3326, -0.6, 0.2222, -0.4157, -1, 0.2778, -0.441, -1, 0.2357, -0.3326, -0.6, 0.2222, -0.3092, -0.6, 0.2538, -0.4157, -1, 0.2778, -0.3092, -0.6, 0.2538, -0.3865, -1, 0.3172, -0.4157, -1, 0.2778, -0.3092, -0.6, 0.2538, -0.2828, -0.6, 0.2828, -0.3865, -1, 0.3172, -0.2828, -0.6, 0.2828, -0.3536, -1, 0.3536, -0.3865, -1, 0.3172, -0.2828, -0.6, 0.2828, -0.2538, -0.6, 0.3092, -0.3536, -1, 0.3536, -0.2538, -0.6, 0.3092, -0.3172, -1, 0.3865, -0.3536, -1, 0.3536, -0.2538, -0.6, 0.3092, -0.2222, -0.6, 0.3326, -0.3172, -1, 0.3865, -0.2222, -0.6, 0.3326, -0.2778, -1, 0.4157, -0.3172, -1, 0.3865, -0.2222, -0.6, 0.3326, -0.1886, -0.6, 0.3528, -0.2778, -1, 0.4157, -0.1886, -0.6, 0.3528, -0.2357, -1, 0.441, -0.2778, -1, 0.4157, -0.1886, -0.6, 0.3528, -0.1531, -0.6, 0.3696, -0.2357, -1, 0.441, -0.1531, -0.6, 0.3696, -0.1913, -1, 0.4619, -0.2357, -1, 0.441, -0.1531, -0.6, 0.3696, -0.1161, -0.6, 0.3828, -0.1913, -1, 0.4619, -0.1161, -0.6, 0.3828, -0.1451, -1, 0.4785, -0.1913, -1, 0.4619, -0.1161, -0.6, 0.3828, -0.078, -0.6, 0.3923, -0.1451, -1, 0.4785, -0.078, -0.6, 0.3923, -0.0975, -1, 0.4904, -0.1451, -1, 0.4785, -0.078, -0.6, 0.3923, -0.0392, -0.6, 0.3981, -0.0975, -1, 0.4904, -0.0392, -0.6, 0.3981, -0.049, -1, 0.4976, -0.0975, -1, 0.4904, -0.0392, -0.6, 0.3981, 0, -0.6, 0.4, -0.049, -1, 0.4976, 0, -0.6, 0.4, 0, -1, 0.5, -0.049, -1, 0.4976, 0, -1, 0, 0, -1, 0.5, 0.049, -1, 0.4976, 0, -1, 0, 0.049, -1, 0.4976, 0.0975, -1, 0.4904, 0, -1, 0, 0.0975, -1, 0.4904, 0.1451, -1, 0.4785, 0, -1, 0, 0.1451, -1, 0.4785, 0.1913, -1, 0.4619, 0, -1, 0, 0.1913, -1, 0.4619, 0.2357, -1, 0.441, 0, -1, 0, 0.2357, -1, 0.441, 0.2778, -1, 0.4157, 0, -1, 0, 0.2778, -1, 0.4157, 0.3172, -1, 0.3865, 0, -1, 0, 0.3172, -1, 0.3865, 0.3536, -1, 0.3536, 0, -1, 0, 0.3536, -1, 0.3536, 0.3865, -1, 0.3172, 0, -1, 0, 0.3865, -1, 0.3172, 0.4157, -1, 0.2778, 0, -1, 0, 0.4157, -1, 0.2778, 0.441, -1, 0.2357, 0, -1, 0, 0.441, -1, 0.2357, 0.4619, -1, 0.1913, 0, -1, 0, 0.4619, -1, 0.1913, 0.4785, -1, 0.1451, 0, -1, 0, 0.4785, -1, 0.1451, 0.4904, -1, 0.0975, 0, -1, 0, 0.4904, -1, 0.0975, 0.4976, -1, 0.049, 0, -1, 0, 0.4976, -1, 0.049, 0.5, -1, 0, 0, -1, 0, 0.5, -1, 0, 0.4976, -1, -0.049, 0, -1, 0, 0.4976, -1, -0.049, 0.4904, -1, -0.0975, 0, -1, 0, 0.4904, -1, -0.0975, 0.4785, -1, -0.1451, 0, -1, 0, 0.4785, -1, -0.1451, 0.4619, -1, -0.1913, 0, -1, 0, 0.4619, -1, -0.1913, 0.441, -1, -0.2357, 0, -1, 0, 0.441, -1, -0.2357, 0.4157, -1, -0.2778, 0, -1, 0, 0.4157, -1, -0.2778, 0.3865, -1, -0.3172, 0, -1, 0, 0.3865, -1, -0.3172, 0.3536, -1, -0.3536, 0, -1, 0, 0.3536, -1, -0.3536, 0.3172, -1, -0.3865, 0, -1, 0, 0.3172, -1, -0.3865, 0.2778, -1, -0.4157, 0, -1, 0, 0.2778, -1, -0.4157, 0.2357, -1, -0.441, 0, -1, 0, 0.2357, -1, -0.441, 0.1913, -1, -0.4619, 0, -1, 0, 0.1913, -1, -0.4619, 0.1451, -1, -0.4785, 0, -1, 0, 0.1451, -1, -0.4785, 0.0975, -1, -0.4904, 0, -1, 0, 0.0975, -1, -0.4904, 0.049, -1, -0.4976, 0, -1, 0, 0.049, -1, -0.4976, 0, -1, -0.5, 0, -1, 0, 0, -1, -0.5, -0.049, -1, -0.4976, 0, -1, 0, -0.049, -1, -0.4976, -0.0975, -1, -0.4904, 0, -1, 0, -0.0975, -1, -0.4904, -0.1451, -1, -0.4785, 0, -1, 0, -0.1451, -1, -0.4785, -0.1913, -1, -0.4619, 0, -1, 0, -0.1913, -1, -0.4619, -0.2357, -1, -0.441, 0, -1, 0, -0.2357, -1, -0.441, -0.2778, -1, -0.4157, 0, -1, 0, -0.2778, -1, -0.4157, -0.3172, -1, -0.3865, 0, -1, 0, -0.3172, -1, -0.3865, -0.3536, -1, -0.3536, 0, -1, 0, -0.3536, -1, -0.3536, -0.3865, -1, -0.3172, 0, -1, 0, -0.3865, -1, -0.3172, -0.4157, -1, -0.2778, 0, -1, 0, -0.4157, -1, -0.2778, -0.441, -1, -0.2357, 0, -1, 0, -0.441, -1, -0.2357, -0.4619, -1, -0.1913, 0, -1, 0, -0.4619, -1, -0.1913, -0.4785, -1, -0.1451, 0, -1, 0, -0.4785, -1, -0.1451, -0.4904, -1, -0.0975, 0, -1, 0, -0.4904, -1, -0.0975, -0.4976, -1, -0.049, 0, -1, 0, -0.4976, -1, -0.049, -0.5, -1, 0, 0, -1, 0, -0.5, -1, 0, -0.4976, -1, 0.049, 0, -1, 0, -0.4976, -1, 0.049, -0.4904, -1, 0.0975, 0, -1, 0, -0.4904, -1, 0.0975, -0.4785, -1, 0.1451, 0, -1, 0, -0.4785, -1, 0.1451, -0.4619, -1, 0.1913, 0, -1, 0, -0.4619, -1, 0.1913, -0.441, -1, 0.2357, 0, -1, 0, -0.441, -1, 0.2357, -0.4157, -1, 0.2778, 0, -1, 0, -0.4157, -1, 0.2778, -0.3865, -1, 0.3172, 0, -1, 0, -0.3865, -1, 0.3172, -0.3536, -1, 0.3536, 0, -1, 0, -0.3536, -1, 0.3536, -0.3172, -1, 0.3865, 0, -1, 0, -0.3172, -1, 0.3865, -0.2778, -1, 0.4157, 0, -1, 0, -0.2778, -1, 0.4157, -0.2357, -1, 0.441, 0, -1, 0, -0.2357, -1, 0.441, -0.1913, -1, 0.4619, 0, -1, 0, -0.1913, -1, 0.4619, -0.1451, -1, 0.4785, 0, -1, 0, -0.1451, -1, 0.4785, -0.0975, -1, 0.4904, 0, -1, 0, -0.0975, -1, 0.4904, -0.049, -1, 0.4976, 0, -1, 0, -0.049, -1, 0.4976, 0, -1, 0.5) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_u4qjw"] +albedo_color = Color(0.174028, 0.174028, 0.174028, 1) + +[sub_resource type="PlaneMesh" id="PlaneMesh_b5cy1"] +material = SubResource("StandardMaterial3D_u4qjw") +size = Vector2(100, 100) + +[node name="VisionCone3dDemo" type="Node3D"] + +[node name="Observer" parent="." instance=ExtResource("1_5m65v")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.875939, 9.98095) + +[node name="CollisionShape3D" parent="Observer" index="2"] +disabled = true + +[node name="VisionConeControls" parent="." node_paths=PackedStringArray("vision_cone", "cameras") instance=ExtResource("2_cx0nb")] +vision_cone = NodePath("../Observer/VisionCone3D") +cameras = [NodePath("../Cameras/TopDownCamera"), NodePath("../Cameras/AngledCamera")] + +[node name="Observables" type="Node3D" parent="."] + +[node name="Observable" parent="Observables" instance=ExtResource("2_bfp2s")] +transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, 7.13397, 0.875939, 4.02523) + +[node name="Observable2" parent="Observables" instance=ExtResource("2_bfp2s")] +transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, 0.620374, 0.875939, 0.320505) + +[node name="Observable3" parent="Observables" instance=ExtResource("2_bfp2s")] +transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, -3.10471, 0.875939, 0.00297272) + +[node name="Observable4" parent="Observables" instance=ExtResource("2_bfp2s")] +transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, 4.81212, 0.875939, -3.47144) + +[node name="Observable5" parent="Observables" instance=ExtResource("2_bfp2s")] +transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, 1.3926, 0.875939, -3.65774) + +[node name="Observable6" parent="Observables" instance=ExtResource("2_bfp2s")] +transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, 0.82285, 0.875938, -5.29844) + +[node name="Observable7" parent="Observables" instance=ExtResource("2_bfp2s")] +transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, -6.82495, 8.13516, 1.97822) + +[node name="Blocker" parent="Observables" instance=ExtResource("3_0fs8r")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.462578, 0.875939, 1.96592) +metadata/_edit_group_ = true + +[node name="Blocker2" parent="Observables" instance=ExtResource("3_0fs8r")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.43444, -0.555664, 1.96592) +metadata/_edit_group_ = true + +[node name="CollisionShape3D" parent="Observables/Blocker2" index="0"] +shape = SubResource("BoxShape3D_vlnew") + +[node name="MeshInstance3D" parent="Observables/Blocker2" index="1"] +mesh = SubResource("BoxMesh_q7pt8") + +[node name="Blocker3" parent="Observables" instance=ExtResource("3_0fs8r")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.7515, 0.854559, 1.43887) +metadata/_edit_group_ = true + +[node name="Blocker4" parent="Observables" instance=ExtResource("3_0fs8r")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.00019, 0.854559, 2.56153) +metadata/_edit_group_ = true + +[node name="Blocker5" parent="Observables" instance=ExtResource("3_0fs8r")] +transform = Transform3D(-4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0, 1, -6.05265, 6.65204, 2.03565) +metadata/_edit_group_ = true + +[node name="Path3D" type="Path3D" parent="Observables"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.94763, 0.875939, -2.14264) +curve = SubResource("Curve3D_5a4ia") + +[node name="PathFollow3D" type="PathFollow3D" parent="Observables/Path3D"] +transform = Transform3D(-4.37113e-08, 0, -0.999999, 0, 1, 0, 0.999999, 0, -4.37113e-08, 0, 0, 0) + +[node name="Observable7" parent="Observables/Path3D/PathFollow3D" instance=ExtResource("2_bfp2s")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 0, 0) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="Observables/Path3D"] +libraries = { +&"": SubResource("AnimationLibrary_gv3ui") +} +autoplay = "back_and_forth" + +[node name="Path3D2" type="Path3D" parent="Observables"] +transform = Transform3D(0.998659, 0, 0.0517608, 0, 1, 0, -0.0517608, 0, 0.998659, 3.38608, 0.875939, -5.14012) +curve = SubResource("Curve3D_5a4ia") + +[node name="PathFollow3D" type="PathFollow3D" parent="Observables/Path3D2"] +transform = Transform3D(-4.37113e-08, 0, -0.999999, 0, 1, 0, 0.999999, 0, -4.37113e-08, 0, 0, 0) + +[node name="Observable7" parent="Observables/Path3D2/PathFollow3D" instance=ExtResource("2_bfp2s")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 0, 0) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="Observables/Path3D2"] +libraries = { +&"": SubResource("AnimationLibrary_gv3ui") +} +autoplay = "back_and_forth" + +[node name="Path3D3" type="Path3D" parent="Observables"] +transform = Transform3D(0.595159, 0, 0.803608, 0, 1, 0, -0.803608, 0, 0.595159, -4.2506, 0.875939, -2.27039) +curve = SubResource("Curve3D_5a4ia") + +[node name="PathFollow3D" type="PathFollow3D" parent="Observables/Path3D3"] +transform = Transform3D(-4.37113e-08, 0, -0.999999, 0, 1, 0, 0.999999, 0, -4.37113e-08, 0, 0, 0) + +[node name="Observable7" parent="Observables/Path3D3/PathFollow3D" instance=ExtResource("2_bfp2s")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 0, 0) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="Observables/Path3D3"] +libraries = { +&"": SubResource("AnimationLibrary_gv3ui") +} +autoplay = "back_and_forth" + +[node name="Path3D4" type="Path3D" parent="Observables"] +transform = Transform3D(0.650469, 0, -0.759533, 0, 1, 0, 0.759533, 0, 0.650469, 6.59825, 0.875939, -0.53365) +curve = SubResource("Curve3D_5a4ia") + +[node name="PathFollow3D" type="PathFollow3D" parent="Observables/Path3D4"] +transform = Transform3D(-4.37113e-08, 0, -0.999999, 0, 1, 0, 0.999999, 0, -4.37113e-08, 0, 0, 0) + +[node name="Observable7" parent="Observables/Path3D4/PathFollow3D" instance=ExtResource("2_bfp2s")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 0, 0) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="Observables/Path3D4"] +libraries = { +&"": SubResource("AnimationLibrary_gv3ui") +} +autoplay = "back_and_forth" + +[node name="Path3D5" type="Path3D" parent="Observables"] +transform = Transform3D(0.851855, 0, -0.523778, 0, 1, 0, 0.523778, 0, 0.851855, -0.213844, 0.87594, 6.89026) +curve = SubResource("Curve3D_5a4ia") + +[node name="PathFollow3D" type="PathFollow3D" parent="Observables/Path3D5"] +transform = Transform3D(-4.37113e-08, 0, -0.999999, 0, 1, 0, 0.999999, 0, -4.37113e-08, 0, 0, 0) + +[node name="Observable7" parent="Observables/Path3D5/PathFollow3D" instance=ExtResource("2_bfp2s")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 0, 0) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="Observables/Path3D5"] +libraries = { +&"": SubResource("AnimationLibrary_gv3ui") +} +autoplay = "back_and_forth" + +[node name="ConcavePolygonObservable" type="StaticBody3D" parent="Observables"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.96277, 1.03266, 0) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="Observables/ConcavePolygonObservable"] +mesh = SubResource("CylinderMesh_vessb") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Observables/ConcavePolygonObservable"] +shape = SubResource("ConcavePolygonShape3D_1uqbn") + +[node name="Cameras" type="Node3D" parent="."] + +[node name="TopDownCamera" type="Camera3D" parent="Cameras"] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 19.8839, 1.60451) +fov = 63.2 +size = 28.134 + +[node name="AngledCamera" type="Camera3D" parent="Cameras"] +transform = Transform3D(0.784289, -0.250219, 0.567698, 0, 0.915058, 0.403322, -0.620395, -0.316321, 0.71767, 8.96504, 7.333, 11.0727) +current = true +fov = 63.2 +size = 28.134 + +[node name="Environment" type="Node3D" parent="."] + +[node name="Floor" type="MeshInstance3D" parent="Environment"] +mesh = SubResource("PlaneMesh_b5cy1") +skeleton = NodePath("../..") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="Environment"] +transform = Transform3D(0.68428, -0.639528, 0.350378, 0, 0.480484, 0.877004, -0.729219, -0.600116, 0.328785, 0, 12.2547, 9.05158) +shadow_enabled = true + +[editable path="Observer"] +[editable path="Observables/Blocker2"] diff --git a/addons/tattomoosa.vision_cone_3d/examples/example_src/VisionConeDemoControls.gd b/addons/tattomoosa.vision_cone_3d/examples/example_src/VisionConeDemoControls.gd new file mode 100644 index 00000000..65657856 --- /dev/null +++ b/addons/tattomoosa.vision_cone_3d/examples/example_src/VisionConeDemoControls.gd @@ -0,0 +1,71 @@ +extends PanelContainer + +@export var vision_cone : VisionCone3D +@export var cameras : Array[Camera3D] = [] + +@onready var vision_test_center_checkbox : CheckBox = %VisionTestCenterCheckBox +@onready var vision_test_scatter_checkbox : CheckBox = %VisionTestScatterCheckBox +@onready var raycast_count_slider : Slider = %RaycastsPerFrameSlider +@onready var angle_slider : Slider = %AngleSlider +@onready var range_slider : Slider = %RangeSlider +@onready var rotation_slider : Slider = %ObserverRotationSlider +@onready var position_slider : Slider = %ObserverPositionSlider +@onready var max_bodies_slider : Slider = %MaxBodiesSlider +@onready var switch_camera_button : Button = %SwitchCameraButton + +func _ready(): + vision_test_center_checkbox.toggled.connect(_set_center) + vision_test_scatter_checkbox.toggled.connect(_set_scatter) + raycast_count_slider.value_changed.connect(func(value: float): vision_cone.vision_test_shape_max_probe_count = value) + angle_slider.value_changed.connect(func(value: float): vision_cone.angle = value) + range_slider.value_changed.connect(func(value: float): vision_cone.range = value) + rotation_slider.value_changed.connect(func(value: float): vision_cone.get_parent().rotation_degrees.y = -value) + position_slider.value_changed.connect(func(value: float): vision_cone.get_parent().position.x = value) + max_bodies_slider.value_changed.connect(func(value: float): vision_cone.vision_test_max_body_count = value) + if cameras.is_empty(): + switch_camera_button.hide() + else: + cameras[0].current = true + switch_camera_button.text = "Current Camera: " + cameras[0].name + switch_camera_button.pressed.connect( + func(): + for i in cameras.size(): + var cam := cameras[i] + if cam.current: + cam.current = false + var next_cam : Camera3D + if (i + 1) < cameras.size(): + next_cam = cameras[i + 1] + else: + next_cam = cameras[0] + next_cam.current = true + switch_camera_button.text = "Current Camera: " + next_cam.name + return + ) + + angle_slider.value = vision_cone.angle + range_slider.value = vision_cone.range + max_bodies_slider.value = vision_cone.vision_test_max_body_count + raycast_count_slider.value = vision_cone.vision_test_shape_max_probe_count + + if vision_cone.get_parent() is CharacterBody3D: + vision_cone.get_parent().rotation_degrees.y = -rotation_slider.value + vision_cone.get_parent().position.x = position_slider.value + else: + rotation_slider.get_parent().hide() + position_slider.get_parent().hide() + + _set_center(vision_test_center_checkbox.button_pressed) + _set_scatter(vision_test_scatter_checkbox.button_pressed) + + size.y = 0 + +func _set_center(value: bool): + if !value: + return + vision_cone.vision_test_mode = VisionCone3D.VisionTestMode.SAMPLE_CENTER + +func _set_scatter(value: bool): + if !value: + return + vision_cone.vision_test_mode = VisionCone3D.VisionTestMode.SAMPLE_RANDOM_VERTICES \ No newline at end of file diff --git a/addons/tattomoosa.vision_cone_3d/examples/example_src/VisionConeDemoControls.gd.uid b/addons/tattomoosa.vision_cone_3d/examples/example_src/VisionConeDemoControls.gd.uid new file mode 100644 index 00000000..9b65be8e --- /dev/null +++ b/addons/tattomoosa.vision_cone_3d/examples/example_src/VisionConeDemoControls.gd.uid @@ -0,0 +1 @@ +uid://dof1xi7gcbq7s diff --git a/addons/tattomoosa.vision_cone_3d/examples/example_src/blocker.tscn b/addons/tattomoosa.vision_cone_3d/examples/example_src/blocker.tscn new file mode 100644 index 00000000..6f579e44 --- /dev/null +++ b/addons/tattomoosa.vision_cone_3d/examples/example_src/blocker.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=3 format=3 uid="uid://mqvpirrmppob"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_da376"] +size = Vector3(1, 3, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_mb6rt"] +size = Vector3(1, 3, 1) + +[node name="Blocker" type="StaticBody3D"] +collision_layer = 2 + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +shape = SubResource("BoxShape3D_da376") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +mesh = SubResource("BoxMesh_mb6rt") diff --git a/addons/tattomoosa.vision_cone_3d/examples/example_src/moving_observable.tscn b/addons/tattomoosa.vision_cone_3d/examples/example_src/moving_observable.tscn new file mode 100644 index 00000000..38a2d9c2 --- /dev/null +++ b/addons/tattomoosa.vision_cone_3d/examples/example_src/moving_observable.tscn @@ -0,0 +1,39 @@ +[gd_scene load_steps=5 format=3 uid="uid://batptfh4cwpfb"] + +[ext_resource type="PackedScene" uid="uid://cmgl8607thxgg" path="res://addons/tattomoosa.vision_cone_3d/examples/example_src/observable.tscn" id="1_p0bro"] + +[sub_resource type="Animation" id="Animation_c3q4w"] +length = 0.001 +tracks/0/type = "position_3d" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = PackedFloat32Array(0, 1, -0.195181, 0, -1.77211) + +[sub_resource type="Animation" id="Animation_jctf1"] +resource_name = "back_and_forth" +length = 8.0 +loop_mode = 1 +tracks/0/type = "position_3d" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = PackedFloat32Array(0, 1, 0, 0, 0, 2.03333, 1, 4, 0, 0, 6.03333, 1, -4, 0, 0, 8, 1, 0, 0, 0) + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_al81f"] +_data = { +&"RESET": SubResource("Animation_c3q4w"), +&"back_and_forth": SubResource("Animation_jctf1") +} + +[node name="MovingObservable" instance=ExtResource("1_p0bro")] +transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, -0.195181, 0, -1.77211) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="." index="2"] +libraries = { +"": SubResource("AnimationLibrary_al81f") +} diff --git a/addons/tattomoosa.vision_cone_3d/examples/example_src/observable.tscn b/addons/tattomoosa.vision_cone_3d/examples/example_src/observable.tscn new file mode 100644 index 00000000..577e2dbe --- /dev/null +++ b/addons/tattomoosa.vision_cone_3d/examples/example_src/observable.tscn @@ -0,0 +1,31 @@ +[gd_scene load_steps=6 format=3 uid="uid://cmgl8607thxgg"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_dnr2f"] +albedo_color = Color(0, 0, 0, 1) + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_nj3xo"] +material = SubResource("StandardMaterial3D_dnr2f") + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ecabg"] +albedo_color = Color(1, 0.635294, 1, 1) + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_5i4ah"] +material = SubResource("StandardMaterial3D_ecabg") +radius = 0.25 +height = 0.75 + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_cf0b5"] + +[node name="Observable" type="CharacterBody3D"] +transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, 0, 0, 0) +metadata/_edit_group_ = true + +[node name="Body" type="MeshInstance3D" parent="."] +mesh = SubResource("CapsuleMesh_nj3xo") + +[node name="Face" type="MeshInstance3D" parent="Body"] +transform = Transform3D(-4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0, 1, 0, 0.386695, -0.364832) +mesh = SubResource("CapsuleMesh_5i4ah") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +shape = SubResource("CapsuleShape3D_cf0b5") diff --git a/addons/tattomoosa.vision_cone_3d/examples/example_src/observer.tscn b/addons/tattomoosa.vision_cone_3d/examples/example_src/observer.tscn new file mode 100644 index 00000000..e3ed65ff --- /dev/null +++ b/addons/tattomoosa.vision_cone_3d/examples/example_src/observer.tscn @@ -0,0 +1,34 @@ +[gd_scene load_steps=6 format=3 uid="uid://brqivkckug8uc"] + +[ext_resource type="Script" uid="uid://cmgcelj1qxg8o" path="res://addons/tattomoosa.vision_cone_3d/src/VisionCone3D.gd" id="1_t4wly"] + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_td2ym"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ecabg"] +albedo_color = Color(1, 0.635294, 1, 1) + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_5i4ah"] +material = SubResource("StandardMaterial3D_ecabg") +radius = 0.25 +height = 0.75 + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_cf0b5"] + +[node name="Observer" type="CharacterBody3D"] +metadata/_edit_group_ = true + +[node name="VisionCone3D" type="Area3D" parent="." node_paths=PackedStringArray("vision_test_ignore_bodies")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.41062, -0.023833) +script = ExtResource("1_t4wly") +debug_draw = true +vision_test_ignore_bodies = [NodePath("..")] + +[node name="Body" type="MeshInstance3D" parent="."] +mesh = SubResource("CapsuleMesh_td2ym") + +[node name="Face" type="MeshInstance3D" parent="Body"] +transform = Transform3D(-4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0, 1, 0, 0.386695, -0.364832) +mesh = SubResource("CapsuleMesh_5i4ah") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +shape = SubResource("CapsuleShape3D_cf0b5") diff --git a/addons/tattomoosa.vision_cone_3d/examples/example_src/ui/ValueLabel.gd b/addons/tattomoosa.vision_cone_3d/examples/example_src/ui/ValueLabel.gd new file mode 100644 index 00000000..4e99bc02 --- /dev/null +++ b/addons/tattomoosa.vision_cone_3d/examples/example_src/ui/ValueLabel.gd @@ -0,0 +1,10 @@ +extends Label + +@export var range_control : Range + +func _ready(): + range_control.value_changed.connect(_set_displayed_value) + _set_displayed_value(range_control.value) + +func _set_displayed_value(_value: float): + text = str(_value) \ No newline at end of file diff --git a/addons/tattomoosa.vision_cone_3d/examples/example_src/ui/ValueLabel.gd.uid b/addons/tattomoosa.vision_cone_3d/examples/example_src/ui/ValueLabel.gd.uid new file mode 100644 index 00000000..2d2ab54f --- /dev/null +++ b/addons/tattomoosa.vision_cone_3d/examples/example_src/ui/ValueLabel.gd.uid @@ -0,0 +1 @@ +uid://be67a8jv24c5o diff --git a/addons/tattomoosa.vision_cone_3d/examples/example_src/vision_cone_controls.tscn b/addons/tattomoosa.vision_cone_3d/examples/example_src/vision_cone_controls.tscn new file mode 100644 index 00000000..61ff6abe --- /dev/null +++ b/addons/tattomoosa.vision_cone_3d/examples/example_src/vision_cone_controls.tscn @@ -0,0 +1,186 @@ +[gd_scene load_steps=4 format=3 uid="uid://cdbsstpvtrvhd"] + +[ext_resource type="Script" uid="uid://dof1xi7gcbq7s" path="res://addons/tattomoosa.vision_cone_3d/examples/example_src/VisionConeDemoControls.gd" id="1_vf8s6"] +[ext_resource type="Script" uid="uid://be67a8jv24c5o" path="res://addons/tattomoosa.vision_cone_3d/examples/example_src/ui/ValueLabel.gd" id="2_8lgvy"] + +[sub_resource type="ButtonGroup" id="ButtonGroup_dqtte"] + +[node name="VisionConeControls" type="PanelContainer"] +offset_left = 13.0 +offset_top = 14.0 +offset_right = 308.0 +offset_bottom = 24.0 +script = ExtResource("1_vf8s6") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 2 +theme_override_constants/separation = 20 + +[node name="Range" type="VBoxContainer" parent="VBoxContainer"] +layout_mode = 2 + +[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/Range"] +layout_mode = 2 + +[node name="Label" type="Label" parent="VBoxContainer/Range/HBoxContainer2"] +layout_mode = 2 +text = "Range:" + +[node name="RangeValueLabel" type="Label" parent="VBoxContainer/Range/HBoxContainer2" node_paths=PackedStringArray("range_control")] +layout_mode = 2 +script = ExtResource("2_8lgvy") +range_control = NodePath("../../RangeSlider") + +[node name="RangeSlider" type="HSlider" parent="VBoxContainer/Range"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +min_value = 1.0 +max_value = 40.0 +step = 0.5 +value = 20.0 + +[node name="Angle" type="VBoxContainer" parent="VBoxContainer"] +layout_mode = 2 + +[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/Angle"] +layout_mode = 2 + +[node name="Label" type="Label" parent="VBoxContainer/Angle/HBoxContainer2"] +layout_mode = 2 +text = "Angle:" + +[node name="AngleValueLabel" type="Label" parent="VBoxContainer/Angle/HBoxContainer2" node_paths=PackedStringArray("range_control")] +layout_mode = 2 +script = ExtResource("2_8lgvy") +range_control = NodePath("../../AngleSlider") + +[node name="AngleSlider" type="HSlider" parent="VBoxContainer/Angle"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +min_value = 0.1 +max_value = 90.0 +step = 0.1 +value = 45.0 + +[node name="VisionTestModeControls" type="VBoxContainer" parent="VBoxContainer"] +layout_mode = 2 + +[node name="Label2" type="Label" parent="VBoxContainer/VisionTestModeControls"] +layout_mode = 2 +text = "Vision Test Mode" + +[node name="VisionTestMode" type="HBoxContainer" parent="VBoxContainer/VisionTestModeControls"] +layout_mode = 2 + +[node name="VisionTestCenterCheckBox" type="CheckBox" parent="VBoxContainer/VisionTestModeControls/VisionTestMode"] +unique_name_in_owner = true +layout_mode = 2 +button_group = SubResource("ButtonGroup_dqtte") +text = "Center" + +[node name="VisionTestScatterCheckBox" type="CheckBox" parent="VBoxContainer/VisionTestModeControls/VisionTestMode"] +unique_name_in_owner = true +layout_mode = 2 +button_pressed = true +button_group = SubResource("ButtonGroup_dqtte") +text = "Scatter" + +[node name="ProbesPerFrame" type="VBoxContainer" parent="VBoxContainer/VisionTestModeControls"] +layout_mode = 2 + +[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/VisionTestModeControls/ProbesPerFrame"] +layout_mode = 2 + +[node name="Label" type="Label" parent="VBoxContainer/VisionTestModeControls/ProbesPerFrame/HBoxContainer2"] +layout_mode = 2 +text = "Max Probes Per Shape:" + +[node name="RaycastPerFrameValueLabel" type="Label" parent="VBoxContainer/VisionTestModeControls/ProbesPerFrame/HBoxContainer2" node_paths=PackedStringArray("range_control")] +layout_mode = 2 +script = ExtResource("2_8lgvy") +range_control = NodePath("../../RaycastsPerFrameSlider") + +[node name="RaycastsPerFrameSlider" type="HSlider" parent="VBoxContainer/VisionTestModeControls/ProbesPerFrame"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +min_value = 1.0 +value = 10.0 + +[node name="MaxBodies" type="VBoxContainer" parent="VBoxContainer/VisionTestModeControls"] +layout_mode = 2 + +[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/VisionTestModeControls/MaxBodies"] +layout_mode = 2 + +[node name="Label" type="Label" parent="VBoxContainer/VisionTestModeControls/MaxBodies/HBoxContainer2"] +layout_mode = 2 +text = "Max Bodies Per Frame:" + +[node name="MaxBodiesFrameValueLabel" type="Label" parent="VBoxContainer/VisionTestModeControls/MaxBodies/HBoxContainer2" node_paths=PackedStringArray("range_control")] +layout_mode = 2 +script = ExtResource("2_8lgvy") +range_control = NodePath("../../MaxBodiesSlider") + +[node name="MaxBodiesSlider" type="HSlider" parent="VBoxContainer/VisionTestModeControls/MaxBodies"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +min_value = 1.0 +max_value = 500.0 +value = 11.0 + +[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer"] +layout_mode = 2 + +[node name="SwitchCameraButton" type="Button" parent="VBoxContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +text = "Switch Camera" + +[node name="ObserverRotation" type="VBoxContainer" parent="VBoxContainer/VBoxContainer"] +layout_mode = 2 + +[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/VBoxContainer/ObserverRotation"] +layout_mode = 2 + +[node name="Label" type="Label" parent="VBoxContainer/VBoxContainer/ObserverRotation/HBoxContainer2"] +layout_mode = 2 +text = "Observer Rotation:" + +[node name="ObserverRotationValueLabel" type="Label" parent="VBoxContainer/VBoxContainer/ObserverRotation/HBoxContainer2" node_paths=PackedStringArray("range_control")] +layout_mode = 2 +script = ExtResource("2_8lgvy") +range_control = NodePath("../../ObserverRotationSlider") + +[node name="ObserverRotationSlider" type="HSlider" parent="VBoxContainer/VBoxContainer/ObserverRotation"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +min_value = -90.0 +max_value = 90.0 + +[node name="ObserverPosition" type="VBoxContainer" parent="VBoxContainer/VBoxContainer"] +layout_mode = 2 + +[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/VBoxContainer/ObserverPosition"] +layout_mode = 2 + +[node name="Label" type="Label" parent="VBoxContainer/VBoxContainer/ObserverPosition/HBoxContainer2"] +layout_mode = 2 +text = "Observer Position:" + +[node name="ObserverPositionValueLabel" type="Label" parent="VBoxContainer/VBoxContainer/ObserverPosition/HBoxContainer2" node_paths=PackedStringArray("range_control")] +layout_mode = 2 +script = ExtResource("2_8lgvy") +range_control = NodePath("../../ObserverPositionSlider") + +[node name="ObserverPositionSlider" type="HSlider" parent="VBoxContainer/VBoxContainer/ObserverPosition"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +min_value = -8.0 +max_value = 8.0 +step = 0.1 diff --git a/addons/tattomoosa.vision_cone_3d/examples/minimal.tscn b/addons/tattomoosa.vision_cone_3d/examples/minimal.tscn new file mode 100644 index 00000000..d5dadfca --- /dev/null +++ b/addons/tattomoosa.vision_cone_3d/examples/minimal.tscn @@ -0,0 +1,26 @@ +[gd_scene load_steps=4 format=3 uid="uid://doqrupj5l86sr"] + +[ext_resource type="Script" uid="uid://cmgcelj1qxg8o" path="res://addons/tattomoosa.vision_cone_3d/src/VisionCone3D.gd" id="1_78jke"] + +[sub_resource type="BoxMesh" id="BoxMesh_si8ep"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_bebrf"] + +[node name="Node3D" type="Node3D"] + +[node name="VisionCone3D" type="Area3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 3.00271) +script = ExtResource("1_78jke") +debug_draw = true + +[node name="StaticBody3D" type="StaticBody3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -2.66644) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="StaticBody3D"] +mesh = SubResource("BoxMesh_si8ep") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="StaticBody3D"] +shape = SubResource("BoxShape3D_bebrf") + +[node name="Camera3D" type="Camera3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 8.38814, 0) diff --git a/addons/tattomoosa.vision_cone_3d/icons/GizmoVisionCone.svg b/addons/tattomoosa.vision_cone_3d/icons/GizmoVisionCone.svg new file mode 100644 index 00000000..c7bb138a --- /dev/null +++ b/addons/tattomoosa.vision_cone_3d/icons/GizmoVisionCone.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + diff --git a/addons/tattomoosa.vision_cone_3d/icons/GizmoVisionCone.svg.import b/addons/tattomoosa.vision_cone_3d/icons/GizmoVisionCone.svg.import new file mode 100644 index 00000000..7d226b48 --- /dev/null +++ b/addons/tattomoosa.vision_cone_3d/icons/GizmoVisionCone.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://o1pkx5p4gmem" +path.s3tc="res://.godot/imported/GizmoVisionCone.svg-ea8f76460bf35030690548bcee239273.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/tattomoosa.vision_cone_3d/icons/GizmoVisionCone.svg" +dest_files=["res://.godot/imported/GizmoVisionCone.svg-ea8f76460bf35030690548bcee239273.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/tattomoosa.vision_cone_3d/icons/VisionCone3D.svg b/addons/tattomoosa.vision_cone_3d/icons/VisionCone3D.svg new file mode 100644 index 00000000..3b2ccacd --- /dev/null +++ b/addons/tattomoosa.vision_cone_3d/icons/VisionCone3D.svg @@ -0,0 +1,11 @@ + + + + + + + diff --git a/addons/tattomoosa.vision_cone_3d/icons/VisionCone3D.svg.import b/addons/tattomoosa.vision_cone_3d/icons/VisionCone3D.svg.import new file mode 100644 index 00000000..00cc762f --- /dev/null +++ b/addons/tattomoosa.vision_cone_3d/icons/VisionCone3D.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://pgp4cqq8ov3o" +path="res://.godot/imported/VisionCone3D.svg-2598d1ee3dd911c502082c26b2e835ec.ctex" +metadata={ +"has_editor_variant": true, +"vram_texture": false +} + +[deps] + +source_file="res://addons/tattomoosa.vision_cone_3d/icons/VisionCone3D.svg" +dest_files=["res://.godot/imported/VisionCone3D.svg-2598d1ee3dd911c502082c26b2e835ec.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=true +editor/convert_colors_with_editor_theme=true diff --git a/addons/tattomoosa.vision_cone_3d/plugin.cfg b/addons/tattomoosa.vision_cone_3d/plugin.cfg new file mode 100644 index 00000000..cb2e8a5c --- /dev/null +++ b/addons/tattomoosa.vision_cone_3d/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="VisionCone3D" +description="" +author="Tattomoosa" +version="0.2.0" +script="plugin.gd" diff --git a/addons/tattomoosa.vision_cone_3d/plugin.gd b/addons/tattomoosa.vision_cone_3d/plugin.gd new file mode 100644 index 00000000..be4ec6a1 --- /dev/null +++ b/addons/tattomoosa.vision_cone_3d/plugin.gd @@ -0,0 +1,21 @@ +@tool +extends EditorPlugin + +const DEBUG_DRAW_TOOL := "Set Vision Cone Debug Draw Visibility" +const VisionCone3DGizmoPlugin := preload ("./src/editor/VisionCone3DGizmoPlugin.gd") +var gizmo : VisionCone3DGizmoPlugin = VisionCone3DGizmoPlugin.new() + +func _enter_tree() -> void: + gizmo.undo_redo = get_undo_redo() + add_node_3d_gizmo_plugin(gizmo) + + # add_tool_menu_item( + # DEBUG_DRAW_TOOL, + # func(): + # VisionCone3D.debug_draw_all = !VisionCone3D.debug_draw_all + # ) + + +func _exit_tree() -> void: + remove_node_3d_gizmo_plugin(gizmo) + # remove_tool_menu_item(DEBUG_DRAW_TOOL) diff --git a/addons/tattomoosa.vision_cone_3d/plugin.gd.uid b/addons/tattomoosa.vision_cone_3d/plugin.gd.uid new file mode 100644 index 00000000..88a7d4b6 --- /dev/null +++ b/addons/tattomoosa.vision_cone_3d/plugin.gd.uid @@ -0,0 +1 @@ +uid://yxw0yuks1mme diff --git a/addons/tattomoosa.vision_cone_3d/src/ConeShape3D.gd b/addons/tattomoosa.vision_cone_3d/src/ConeShape3D.gd new file mode 100644 index 00000000..b789e5b9 --- /dev/null +++ b/addons/tattomoosa.vision_cone_3d/src/ConeShape3D.gd @@ -0,0 +1,50 @@ +@tool +class_name ConeShape3D +extends ConvexPolygonShape3D + +## The height of the cone +@export var height : float = 2.0: + set(value): + height = value + _request_resize() +## The radius of the bottom of the cone +@export var radius : float = 0.5: + set(value): + radius = value + _request_resize() +## The number of radial segments of the cone +@export var resolution : int = 8: + set(value): + resolution = value + _request_resize() + +# Resize requested +var pending_resize := false + +# Update size to initial state +func _init() -> void: + _request_resize() + +# Will only resize once per frame, during idle time +func _request_resize() -> void: + if !pending_resize: + _update_size.call_deferred() + pending_resize = true + +# Updates shape size +func _update_size() -> void: + points = _make_cone_polygon_points() + pending_resize = false + +# Makes a cone polygon +@warning_ignore("return_value_discarded") +func _make_cone_polygon_points() -> PackedVector3Array: + var pts : PackedVector3Array = [] + var top : Vector3 = Vector3(0, height / 2, 0) + for i in resolution: + var angle := float(i) * TAU / resolution + var x := cos(angle) * radius + var y := sin(angle) * radius + pts.push_back(Vector3(x, -height/2, y)) + pts.push_back(top) + return pts \ No newline at end of file diff --git a/addons/tattomoosa.vision_cone_3d/src/ConeShape3D.gd.uid b/addons/tattomoosa.vision_cone_3d/src/ConeShape3D.gd.uid new file mode 100644 index 00000000..d9d07cf7 --- /dev/null +++ b/addons/tattomoosa.vision_cone_3d/src/ConeShape3D.gd.uid @@ -0,0 +1 @@ +uid://bc32kei4pauw1 diff --git a/addons/tattomoosa.vision_cone_3d/src/VisionCone3D.gd b/addons/tattomoosa.vision_cone_3d/src/VisionCone3D.gd new file mode 100644 index 00000000..119d018f --- /dev/null +++ b/addons/tattomoosa.vision_cone_3d/src/VisionCone3D.gd @@ -0,0 +1,421 @@ +@tool +@icon("../icons/VisionCone3D.svg") +class_name VisionCone3D +extends Area3D +## Provides a "Vision Cone", a cone-shaped area where objects are then +## probed for visibility via ray casts + +## Emitted when a body is newly visible +signal body_sighted(body: Node3D) + +## Emitted when a body is newly not visible +signal body_hidden(body: Node3D) + +## Emitted when the cone shape changes +signal shape_changed + +#region VisionCone3D + +#region members +## Determines how visibility is probed for bodies within the cone area +## +enum VisionTestMode{ + ## Samples the center of each CollisionShape. Maximum performance, least reliability + SAMPLE_CENTER, + ## Samples random vertices of each CollisionShape, up to `vision_test_shape_max_probe_count` + ## for hidden objects + ## If shape was visible at last frame, tests last successful probe position first + SAMPLE_RANDOM_VERTICES, + ## Gets a list of points where shapes collide from the physics engine + # SAMPLE_COLLIDE_SHAPE, +} + +const VisionConeDebugVisualizer3D := preload("./debug/VisionConeDebugVisualizer3D.gd") + + +## Distance that can be seen (the height of the vision cone) +@warning_ignore("shadowed_global_identifier") +@export var range := 20.0: + set(v): range = v; _update_shape() + +## Angle of the vision cone +@export_range(0, 150) var angle := 45.0: + set(v): angle = v; _update_shape() + +## Whether or not to draw debug information +@export var debug_draw := false: + set(v): + debug_draw = v + if debug_draw and !_debug_visualizer: + _debug_visualizer = VisionConeDebugVisualizer3D.new() + add_child(_debug_visualizer) + elif !debug_draw and _debug_visualizer: + _debug_visualizer.queue_free() + +@export_group("Vision Test", "vision_test_") + +## Which VisionTestMode to use to determine if a shape is visible +@export var vision_test_mode : VisionTestMode = VisionTestMode.SAMPLE_RANDOM_VERTICES +## List of bodies to ignore in vision probing +## +## Useful for eg the VisionCone3D's parent body +@export var vision_test_ignore_bodies : Array[PhysicsBody3D] + +@export_subgroup("Per-frame probe settings") +## Maximum amount of shape probes (per shape, per frame) +@export var vision_test_shape_max_probe_count : int = 5 +## Maximum number of bodies to check, per-frame +## +## All bodies will still be evaluated as it will cycle through them +## frame by frame, but `body_sighted` or `body_hidden` may lag behind +## by some frames. +@export var vision_test_max_body_count : int = 10 + +@export_group("Collision", "collision_") +## Collision layer "hoisted" up from Area3D for convenience +@export_flags_3d_physics var collision_layer_ : int = 1: + get: + return collision_layer + set(value): + collision_layer = value + +## Collision mask "hoisted" up from Area3D for convenience +## +## This represents what can be "seen" and notified against. Generally useful for characters +@export_flags_3d_physics var collision_mask_ : int = 1: + get: + return collision_mask + set(value): + collision_mask = value + +## Collision mask of what objects can obscure visible objects (but don't need to +## be tracked and probed to determine visibility) +## +## Generally useful for the environment but any node where you don't care +## if its seen or not can be on this layer. +## This layer only affects raycasts, which can collide with any layer +## in either `collision_mask` or `collision_environment_mask` +@export_flags_3d_physics var collision_environment_mask : int = 1 + +## Radius at the wide end of the vision cone +var end_radius: float: + get: return _get_end_radius() + +# { Node3D "body" : Node3D "shape" } +var _body_probe_data : Dictionary = { + # Node3D "body" : [ + # "prober": VisionTestProber + # ] +} + +var _last_probed_index : int = -1 +var _debug_visualizer : VisionConeDebugVisualizer3D +var _collision_shape := CollisionShape3D.new() +var _cone_shape := ConeShape3D.new() + +#endregion members + +## Returns a list of intersecting PhysicsBody3Ds. The overlapping body's +## CollisionObject3D.collision_layer must be part of this area's CollisionObject3D.collision_mask +## in order to be detected. +func get_visible_bodies() -> Array[PhysicsBody3D]: + var bodies : Array[PhysicsBody3D] = [] + for prober: VisionTestProber in _body_probe_data.values(): + bodies.push_back(prober.body) + return bodies + +## Whether or not a given point in global space is within the cone's +## angle. +func point_within_angle(global_point: Vector3) -> bool: + var body_pos := -global_basis.z + var pos := global_point - global_position + var angle_to := pos.angle_to(body_pos) + var angle_deg := rad_to_deg(angle_to) + return angle_deg <= (angle / 2) + +## Whether or not a given point in global space is within the cone +func point_within_cone(global_point: Vector3) -> bool: + var local_point := to_local(global_point) + var z_distance : float = abs(local_point.z) + if z_distance < 0 or z_distance > range: + return false + return point_within_angle(global_point) + +func _init() -> void: + add_child(_collision_shape) + _collision_shape.shape = _cone_shape + _collision_shape.rotation_degrees.x = 90 + _update_shape() + # only true when copied + if _debug_visualizer: + _debug_visualizer.vision_cone = self + + var err := body_shape_entered.connect(_on_body_shape_entered) + if err != OK: + push_warning("VisionCone3D body_shape_entered: ", error_string(err)) + err = body_shape_exited.connect(_on_body_shape_exited) + if err != OK: + push_warning("VisionCone3D body_shape_exited: ", error_string(err)) + +@warning_ignore("return_value_discarded") +func _physics_process(_delta: float) -> void: + if Engine.is_editor_hint(): + return + if !monitoring: + return + + var bodies_to_probe := _get_bodies_to_probe_this_frame() + for body: CollisionObject3D in bodies_to_probe: + if !is_instance_valid(body): + push_warning("erasing invalid body") + _body_probe_data.erase(body) + continue + _probe_body(body) + +func _get_bodies_to_probe_this_frame() -> Array: # Array[CollisionObject3D]: + var all_bodies := _body_probe_data.keys() + if all_bodies.is_empty(): + return [] + if all_bodies.size() < vision_test_max_body_count: + _last_probed_index = -1 + return all_bodies + + var start_index := _last_probed_index + 1 + var to_end := all_bodies.slice(start_index, start_index + vision_test_max_body_count) + var counted := to_end.size() + var end_index : int = min(vision_test_max_body_count - counted, start_index) + var from_start := all_bodies.slice(0, end_index) + _last_probed_index = from_start.size() - 1 if from_start.size() > 0 else start_index + counted - 1 + return (to_end + from_start) + +func _probe_body(body: CollisionObject3D) -> void: + var body_was_visible_last_frame := false + var body_is_visible := false + var body_probes : Array[VisionTestProber] + body_probes.assign(_body_probe_data[body]) + + for prober in body_probes: + if prober.visible: + body_was_visible_last_frame = true + prober.probe() + if prober.visible: + body_is_visible = true + + var body_visibility_changed := body_is_visible != body_was_visible_last_frame + + if body_visibility_changed: + if body_is_visible: + body_sighted.emit(body) + else: + body_hidden.emit(body) + +func _update_shape() -> void: + _cone_shape.height = range + _cone_shape.radius = end_radius + _collision_shape.position.z = -range / 2 + update_gizmos() + shape_changed.emit() + +func _get_collision_shape_node_in_body(body: PhysicsBody3D, body_shape_index: int) -> Node3D: + if !body: + return null + var body_shape_owner : int = body.shape_find_owner(body_shape_index) + return body.shape_owner_get_owner(body_shape_owner) + +func _get_end_radius() -> float: + var angle_rad := deg_to_rad(angle / 2) + return range * tan(angle_rad) + +func _get_prober_for_shape(shape: CollisionShape3D, body: CollisionObject3D) -> VisionTestProber: + for prober: VisionTestProber in _body_probe_data[body]: + if prober.collision_shape == shape: + return prober + return null + +@warning_ignore("return_value_discarded") +func _on_body_shape_entered( + _body_rid: RID, + body: Node3D, + body_shape_index: int, + _local_shape_index: int, +) -> void: + # # weird! + if !is_instance_valid(body): + if _body_probe_data.has(body): + _body_probe_data.erase(body) + return + var shape := _get_collision_shape_node_in_body(body, body_shape_index) + var body_probes : Array[VisionTestProber] = _body_probe_data.get_or_add( + body, [] as Array[VisionTestProber] + ) + + var has_prober := _get_prober_for_shape(shape, body) + if !has_prober: + body_probes.push_back(VisionTestProber.new(self, shape, body)) + else: + push_warning("Already has prober") + +@warning_ignore("return_value_discarded") +func _on_body_shape_exited( + _body_rid: RID, + body: Node3D, + body_shape_index: int, + _local_shape_index: int, +) -> void: + if !body: + return + var shape := _get_collision_shape_node_in_body(body, body_shape_index) + var prober := _get_prober_for_shape(shape, body) + var body_probers : Array[VisionTestProber]= _body_probe_data[body] + body_probers.erase(prober) + if body_probers.is_empty(): + _body_probe_data.erase(body) + + +#endregion VisionCone3D + +class VisionTestProber: + ## Useful for debugging probes + const CONTINUE_PROBING_ON_SUCCESS := false + + ## Vision cone to probe for + var vision_cone : VisionCone3D + ## Collision shape to probe + var collision_shape: CollisionShape3D + ## Collision shape mesh representation + var shape_probe_mesh: ArrayMesh + ## Collision shape's owning body + var body : PhysicsBody3D + + ## Whether the probe found the shape to be visible + var visible: bool = false + ## All probe results, for debugging + var probe_results: Array[ProbeResult] + + static var _rng := RandomNumberGenerator.new() + + func _init( + p_vision_cone: VisionCone3D, + p_collision_shape: CollisionShape3D, + p_body: PhysicsBody3D + ) -> void: + vision_cone = p_vision_cone + collision_shape = p_collision_shape + body = p_body + + func _probe_position(to: Vector3, shape_local_target: Vector3) -> ProbeResult: + # Collide with bodies OR the environment + var raycast_collision_mask := vision_cone.collision_mask | vision_cone.collision_environment_mask + # can store reference to this? + var space_state := vision_cone.get_world_3d().direct_space_state + var from := vision_cone.global_position + var exclude_bodies := vision_cone.vision_test_ignore_bodies\ + .filter(func(x: PhysicsBody3D) -> bool: return is_instance_valid(x))\ + .map(func(x: PhysicsBody3D) -> RID: return x.get_rid()) + var query := PhysicsRayQueryParameters3D.create( + from, + to, + raycast_collision_mask, + exclude_bodies + ) + var result := space_state.intersect_ray(query) + return ProbeResult.new( + from, + to, + shape_local_target, + result.collider if result.has("collider") else null + ) + + func _get_last_visible_point_on_shape() -> Vector3: + if probe_results.is_empty(): + push_warning("Shape was not determined to be visible during last _probe_position") + + return Vector3.ZERO + return probe_results[-1].shape_local_target + + func _random_points_on_probe_mesh(count: int) -> PackedVector3Array: + if !shape_probe_mesh: + shape_probe_mesh = collision_shape.shape.get_debug_mesh() + var vertices : PackedVector3Array = shape_probe_mesh.surface_get_arrays(0)[Mesh.ARRAY_VERTEX] + var points : PackedVector3Array = [] + for point in count: + points.push_back(vertices[_rng.randi_range(0, vertices.size() - 1)]) + return points + + func _get_scatter_points(count: int) -> PackedVector3Array: + var sample_points : PackedVector3Array = [] + # var random_point_count := vision_cone.vision_test_shape_max_probe_count + sample_points.append_array(_random_points_on_probe_mesh(count)) + return sample_points + + func _get_collide_points(count: int) -> PackedVector3Array: + var sample_points : PackedVector3Array = [] + # var cone_shape := vision_cone._collision_shape.shape + var observable_shape := collision_shape.shape + var query := PhysicsShapeQueryParameters3D.new() + query.collide_with_areas = true + query.collide_with_bodies = false + query.collision_mask = vision_cone.collision_layer + query.shape_rid = observable_shape.get_rid() + + var world_space := vision_cone.get_world_3d().direct_space_state + var result := world_space.collide_shape(query) + for i in result.size(): + if i % 2 == 1: + continue + sample_points.push_back(result[i]) + if sample_points.size() >= count: + break + return sample_points + + func probe() -> void: + var sample_points : PackedVector3Array = [] + var max_count := vision_cone.vision_test_shape_max_probe_count + if visible: + sample_points.append(_get_last_visible_point_on_shape()) + max_count -= 1 + match vision_cone.vision_test_mode: + VisionTestMode.SAMPLE_CENTER: + if !visible: + sample_points.push_back(Vector3.ZERO) + VisionTestMode.SAMPLE_RANDOM_VERTICES: + sample_points.append_array(_get_scatter_points(max_count)) + + probe_results = [] + visible = false + for shape_local_point in sample_points: + var global_point := collision_shape.global_position +\ + (collision_shape.global_basis * shape_local_point) + + if !vision_cone.point_within_cone(global_point): + continue + + var probe_result := _probe_position(global_point, shape_local_point) + probe_results.push_back(probe_result) + + # found body we were looking for + if probe_result.collider == body: + probe_result.visible = true + visible = true + if CONTINUE_PROBING_ON_SUCCESS: + print_debug("visible - continuing to _probe_position") + continue + return + + class ProbeResult: + var start : Vector3 + var end : Vector3 + var shape_local_target : Vector3 + var collider : Node3D + var visible : bool = false + + func _init( + p_start: Vector3, + p_end: Vector3, + p_shape_local_target: Vector3, + p_collider: Node3D + ) -> void: + start = p_start + end = p_end + shape_local_target = p_shape_local_target + collider = p_collider diff --git a/addons/tattomoosa.vision_cone_3d/src/VisionCone3D.gd.uid b/addons/tattomoosa.vision_cone_3d/src/VisionCone3D.gd.uid new file mode 100644 index 00000000..47104d18 --- /dev/null +++ b/addons/tattomoosa.vision_cone_3d/src/VisionCone3D.gd.uid @@ -0,0 +1 @@ +uid://cmgcelj1qxg8o diff --git a/addons/tattomoosa.vision_cone_3d/src/debug/VisionConeDebugVisualizer3D.gd b/addons/tattomoosa.vision_cone_3d/src/debug/VisionConeDebugVisualizer3D.gd new file mode 100644 index 00000000..a467aabf --- /dev/null +++ b/addons/tattomoosa.vision_cone_3d/src/debug/VisionConeDebugVisualizer3D.gd @@ -0,0 +1,99 @@ +extends Node3D + +const ProbeResult := VisionCone3D.VisionTestProber.ProbeResult + +# TODO should be modifiable via EditorSettings +const DEBUG_VISION_CONE_COLOR := Color(1, 1, 0, 0.02) +# TODO should be modifiable via EditorSettings +const DEBUG_RAY_COLOR_IS_VISIBLE := Color(Color.GREEN, 0.8) +# TODO should be modifiable via EditorSettings +const DEBUG_RAY_COLOR_IS_OBSTRUCTED := Color(Color.RED, 0.4) + +@export var vision_cone : VisionCone3D + +var debug_vision_cone_color := DEBUG_VISION_CONE_COLOR +var debug_ray_color_is_visible := DEBUG_RAY_COLOR_IS_VISIBLE +var debug_ray_color_in_cone := DEBUG_RAY_COLOR_IS_OBSTRUCTED + + +var _bounds_renderer : MeshInstance3D +var _probe_renderer : DebugProbeLineRenderer + +func _init() -> void: + # create cone renderer + _bounds_renderer = MeshInstance3D.new() + var mesh := CylinderMesh.new() + mesh.material = make_visualizer_material() + _bounds_renderer.mesh = mesh + add_child(_bounds_renderer, false, INTERNAL_MODE_BACK) + + _probe_renderer = DebugProbeLineRenderer.new() + _probe_renderer.probe_success_material = make_visualizer_material(debug_ray_color_is_visible) + _probe_renderer.probe_failure_material = make_visualizer_material(debug_ray_color_in_cone) + add_child(_probe_renderer) + +@warning_ignore("return_value_discarded") +func _ready() -> void: + vision_cone = get_parent() + _probe_renderer.body_probe_data = vision_cone._body_probe_data + vision_cone.shape_changed.connect(update_cone_shape) + update_cone_shape() + +func make_visualizer_material(albedo_color: Color = debug_vision_cone_color) -> StandardMaterial3D: + var mat := StandardMaterial3D.new() + mat.albedo_color = albedo_color + mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA + mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + mat.cull_mode = BaseMaterial3D.CULL_DISABLED + return mat + +func update_cone_shape() -> void: + var m : CylinderMesh = _bounds_renderer.mesh + m.top_radius = 0 + m.bottom_radius = vision_cone.end_radius + m.height = vision_cone.range + _bounds_renderer.rotation_degrees = Vector3(90, 0, 0) + _bounds_renderer.position.z = -vision_cone.range / 2 + +class DebugProbeLineRenderer extends MeshInstance3D: + var body_probe_data: Dictionary + var probe_success_material : StandardMaterial3D + var probe_failure_material : StandardMaterial3D + + func _init() -> void: + mesh = ImmediateMesh.new() + + func _process(_delta: float) -> void: + if Engine.is_editor_hint(): + return + (mesh as ImmediateMesh).clear_surfaces() + if body_probe_data.is_empty(): + return + var successful : Array[ProbeResult] = [] + var failed : Array[ProbeResult] = [] + + for prober_list : Array[VisionCone3D.VisionTestProber] in body_probe_data.values(): + for prober in prober_list: + for probe in prober.probe_results: + if probe.visible: + successful.push_back(probe) + else: + failed.push_back(probe) + + var material_index := 0 + if !successful.is_empty(): + _add_probe_lines_surface(successful) + mesh.surface_set_material(material_index, probe_success_material) + material_index += 1 + if !failed.is_empty(): + _add_probe_lines_surface(failed) + mesh.surface_set_material(material_index, probe_failure_material) + material_index += 1 + + func _add_probe_lines_surface(probes: Array[ProbeResult]) -> void: + var imesh := mesh as ImmediateMesh + imesh.surface_begin(Mesh.PRIMITIVE_LINES) + for probe in probes: + imesh.surface_add_vertex(to_local(probe.start)) + imesh.surface_add_vertex(to_local(probe.end)) + imesh.surface_end() diff --git a/addons/tattomoosa.vision_cone_3d/src/debug/VisionConeDebugVisualizer3D.gd.uid b/addons/tattomoosa.vision_cone_3d/src/debug/VisionConeDebugVisualizer3D.gd.uid new file mode 100644 index 00000000..f20cfcff --- /dev/null +++ b/addons/tattomoosa.vision_cone_3d/src/debug/VisionConeDebugVisualizer3D.gd.uid @@ -0,0 +1 @@ +uid://8mi2so0m8lyx diff --git a/addons/tattomoosa.vision_cone_3d/src/editor/VisionCone3DGizmoPlugin.gd b/addons/tattomoosa.vision_cone_3d/src/editor/VisionCone3DGizmoPlugin.gd new file mode 100644 index 00000000..ec5af4bb --- /dev/null +++ b/addons/tattomoosa.vision_cone_3d/src/editor/VisionCone3DGizmoPlugin.gd @@ -0,0 +1,182 @@ +extends EditorNode3DGizmoPlugin + +var texture : Texture2D = preload("../../icons/GizmoVisionCone.svg") +var undo_redo: EditorUndoRedoManager + +var _start_drag_mouse_world_position : Vector3 +var _start_drag_range: float +var _start_drag_angle : float + +func _init() -> void: + create_material("cone_preview", Color(1, 1, 0), false) + create_handle_material("handles") + create_icon_material( + "icon", + texture, + ) + +func _get_gizmo_name() -> String: + return "VisionCone3D" + +func _get_handle_name( + _gizmo: EditorNode3DGizmo, + handle_id: int, + _secondary: bool +) -> String: + match handle_id: + 0: return "Range" + 1: return "Angle" + _: return "" + +func _get_handle_value( + gizmo: EditorNode3DGizmo, + handle_id: int, + _secondary: bool +) -> Variant: + var vc : VisionCone3D = gizmo.get_node_3d() + match handle_id: + 0: return vc.range + 1: return vc.angle + _: return null + +func _begin_handle_action( + gizmo: EditorNode3DGizmo, + handle_id: int, + _secondary: bool +) -> void: + var vc : VisionCone3D = gizmo.get_node_3d() + _start_drag_mouse_world_position = vc.global_position + (-vc.global_basis.z * vc.range) + match handle_id: + 0: # range + _start_drag_range = vc.range + 1: # angle + _start_drag_angle = vc.angle + +func _commit_handle( + gizmo: EditorNode3DGizmo, + handle_id: int, + _secondary: bool, + _restore: Variant, + # TODO use cancel + _cancel: bool +) -> void: + var vc : VisionCone3D = gizmo.get_node_3d() + match handle_id: + 0: # range + undo_redo.create_action("Set range") + undo_redo.add_do_property(vc, "range", vc.range) + undo_redo.add_undo_property(vc, "range", _start_drag_range) + 1: # angle + undo_redo.create_action("Set angle") + undo_redo.add_do_property(vc, "angle", vc.angle) + undo_redo.add_undo_property(vc, "angle", _start_drag_angle) + undo_redo.commit_action() + +func _set_handle( + gizmo: EditorNode3DGizmo, + handle_id: int, + _secondary: bool, + camera: Camera3D, + _screen_pos: Vector2, +) -> void: + var vc : VisionCone3D = gizmo.get_node_3d() + match handle_id: + 0: # range + # TODO this mostly works but not if camera.y is near vc.y + var world_pos := _calculate_mouse_world_position( + camera, + vc.global_position.y, + Vector3.UP + ) + var local_pos := vc.to_local(world_pos) + var new_range := -local_pos.z + if new_range > 0: + vc.range = new_range + + 1: # angle + # var local_end_range_pos := Vector3(0, 0, -vc.range) + + # TODO this mostly works but not if camera.y is near vc.y + var world_pos := _calculate_mouse_world_position( + camera, + vc.global_position.y, + Vector3.UP + ) + var local_pos := vc.to_local(world_pos) + var radius := local_pos.x + vc.angle = abs(rad_to_deg(atan(radius / vc.range))) * 2 + gizmo.get_node_3d().update_gizmos() + +func _has_gizmo(node: Node3D) -> bool: + return node is VisionCone3D + +func _redraw(gizmo: EditorNode3DGizmo) -> void: + gizmo.clear() + var vc : VisionCone3D = gizmo.get_node_3d() + + gizmo.add_unscaled_billboard(get_material("icon", gizmo), 0.04) + + var lines := _make_cone_lines(360, 6, vc.end_radius, vc.range) + # var cylinder_mesh := CylinderMesh.new() + + var handles := PackedVector3Array([ + Vector3(0, 0, -vc.range), + Vector3(vc.end_radius, 0, -vc.range) + ]) + + var cone_alpha := 1.0 + + if EditorInterface.get_selection().get_selected_nodes().has(vc): + gizmo.add_lines(lines, get_material("cone_preview", gizmo), false, Color(1, 1, 1, cone_alpha)) + gizmo.add_handles(handles, get_material("handles", gizmo), []) + +@warning_ignore("shadowed_global_identifier") +@warning_ignore("return_value_discarded") +@warning_ignore("integer_division") +func _make_cone_lines( + resolution: int, + support_resolution: int, + end_radius: float, + range: float +) -> PackedVector3Array: + var points: PackedVector3Array = [] + var support_every := resolution / support_resolution + var start : Vector3 + for i in resolution: + # circle logic + var angle := float(i) * TAU / resolution + var x := cos(angle) * end_radius + var y := sin(angle) * end_radius + var point := Vector3(x, y, -range) + points.append(point) + + if i % support_every == 0: + points.append(Vector3.ZERO) + points.append(point) + + if i == 0: + start = point + else: + points.append(point) + points.append(start) + points.append(Vector3.ZERO) + points.append(Vector3(0, 0, -range)) + return points + +static func _calculate_mouse_world_position( + camera: Camera3D, + # world position along plane normal, could use a better name + intersection_point: float, + plane_normal: Vector3 = Vector3.UP +) -> Vector3: + var position := camera.get_viewport().get_mouse_position() + var camera_from := camera.project_ray_origin(position) + var camera_to := camera.project_ray_normal(position) + + var n := plane_normal # plane normal + var p := camera_from # ray origin + var v := camera_to # ray direction + var d := intersection_point # distance of the plane from origin + var t := -(n.dot(p) - d) / n.dot(v) # solving for plain/ray intersection + + return p + t * v \ No newline at end of file diff --git a/addons/tattomoosa.vision_cone_3d/src/editor/VisionCone3DGizmoPlugin.gd.uid b/addons/tattomoosa.vision_cone_3d/src/editor/VisionCone3DGizmoPlugin.gd.uid new file mode 100644 index 00000000..24063223 --- /dev/null +++ b/addons/tattomoosa.vision_cone_3d/src/editor/VisionCone3DGizmoPlugin.gd.uid @@ -0,0 +1 @@ +uid://b3snj0jopsyp1 diff --git a/project.godot b/project.godot index 0152311f..90d2e53b 100644 --- a/project.godot +++ b/project.godot @@ -164,7 +164,7 @@ movie_writer/movie_file="D:/Maddo/Recordings/Capture.avi" [editor_plugins] -enabled=PackedStringArray("res://addons/cyclops_level_builder/plugin.cfg", "res://addons/dialogic/plugin.cfg", "res://addons/func_godot/plugin.cfg", "res://addons/godot_test_scene/plugin.cfg", "res://addons/resources_spreadsheet_view/plugin.cfg", "res://addons/scene_palette/plugin.cfg", "res://addons/smoothing/plugin.cfg") +enabled=PackedStringArray("res://addons/cyclops_level_builder/plugin.cfg", "res://addons/dialogic/plugin.cfg", "res://addons/func_godot/plugin.cfg", "res://addons/godot_test_scene/plugin.cfg", "res://addons/resources_spreadsheet_view/plugin.cfg", "res://addons/scene_palette/plugin.cfg", "res://addons/smoothing/plugin.cfg", "res://addons/tattomoosa.vision_cone_3d/plugin.cfg") [global_group] diff --git a/textures/special/trigger.png b/textures/special/trigger.png index ba3d4a9a..16b8f65c 100644 --- a/textures/special/trigger.png +++ b/textures/special/trigger.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:304673a56451aa4a39423053382520a3d4dc9e463714d703bbde5c1d5cd3c00e +oid sha256:1b7bd9b4b1bf27ebc7104baead7c9165978091039dd657aee5dcea38c040bb31 size 306