├── CablePhysicsTutorial ├── .godot │ ├── .gdignore │ ├── global_script_class_cache.cfg │ ├── editor │ │ ├── filesystem_update4 │ │ ├── quick_open_dialog_cache.cfg │ │ ├── editor_script_doc_cache.res-folding-a7de57390d6e786984ca20c70a831128.cfg │ │ ├── editor_script_doc_cache.res │ │ ├── project_metadata.cfg │ │ ├── script_editor_cache.cfg │ │ ├── editor_layout.cfg │ │ ├── main.tscn-folding-3ad5c15c4f3250da0cc7c1af1770d85f.cfg │ │ ├── filesystem_cache10 │ │ └── main.tscn-editstate-3ad5c15c4f3250da0cc7c1af1770d85f.cfg │ ├── uid_cache.bin │ ├── imported │ │ ├── icon.svg-3540dd99eafb6c4e602e8c59cee418fa.md5 │ │ ├── hand_closed.svg-b443212299cc09705615c8c84b79f97e.md5 │ │ ├── hand_open.svg-b0c3e93fa5a501fe2519cd46ca19d071.md5 │ │ ├── hand_point.svg-9cc1b761233b51f614517792de61b8da.md5 │ │ ├── pointer_c.svg-c3a00d0261e486ee6698ee6d3f3d79e1.md5 │ │ ├── target_b.svg-6c63ebf492078ba2b0d203cac0cde9c0.md5 │ │ ├── DarkPrototypeTexture.png-cfae9e2fe2d97c5bc0288ceed8871186.md5 │ │ ├── icon.svg-3540dd99eafb6c4e602e8c59cee418fa.ctex │ │ ├── hand_open.svg-b0c3e93fa5a501fe2519cd46ca19d071.ctex │ │ ├── pointer_c.svg-c3a00d0261e486ee6698ee6d3f3d79e1.ctex │ │ ├── target_b.svg-6c63ebf492078ba2b0d203cac0cde9c0.ctex │ │ ├── hand_closed.svg-b443212299cc09705615c8c84b79f97e.ctex │ │ ├── hand_point.svg-9cc1b761233b51f614517792de61b8da.ctex │ │ └── DarkPrototypeTexture.png-cfae9e2fe2d97c5bc0288ceed8871186.s3tc.ctex │ ├── shader_cache │ │ ├── GiShaderRD │ │ │ ├── 6df91197bce0a55add8f8cf655ee71ac97f5c7510e3d8fe9649405dab2882f24 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ │ └── 9e9b4b5d4c15f202f7ffb443fd0971df128a5f50e14bf72f2821620133146f3d │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── BlitShaderRD │ │ │ └── d5a779b2dd0cc1b4f4a707e99930a8eb1b36861da830a175fa21c9c74159eeb9 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── CopyShaderRD │ │ │ └── ab28315412a3dede7744b14fc38c5af7ecfa8d2f45b3a59d3f112ac9db88865d │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── SkyShaderRD │ │ │ └── a9f86a6778595096e980fe5217e4465487a0a679fa9526d4a2e81f745d154beb │ │ │ │ ├── 03e3b11c69e24394b2d955a8c0ba85587bb70839.vulkan.cache │ │ │ │ ├── de678811d1bad3cad4892a8db7b6ea0be197d51d.vulkan.cache │ │ │ │ └── e105b1e014f9523daf8d734c2f2dc115ba341902.vulkan.cache │ │ ├── SortShaderRD │ │ │ └── e3569cb510d4d20f66ac5642590debf369eabd97ac79005a0f2bc585a8fef8b6 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── SsaoShaderRD │ │ │ └── 03c523b5744efe67362a3cbb7e05745d549de8f377764940b148580a9415ca5c │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── SsilShaderRD │ │ │ └── 46469c3c6dcab29a50a70756a6af386446a21ad5664a14d1a51f6c51dcb19e68 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── VrsShaderRD │ │ │ └── 120fc066caf56440b52425f59c57b1c43d32031edc764e0b728094ad0b8b22f6 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── CanvasShaderRD │ │ │ └── e7b17ec4355ae6960cd5e830867fe5ab9d4e79978916b0314010e86dd56ba262 │ │ │ │ ├── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ │ │ ├── 45fb1ddc6499e56682916a355ce2839e61f42dfe.vulkan.cache │ │ │ │ ├── 8a7277c8d3ac029b087c3fa9c55de85560be5119.vulkan.cache │ │ │ │ ├── c0a681ae42aa3e0b5abba232ccae0b036be455e4.vulkan.cache │ │ │ │ └── f3e258e8f7ec2e7e740b62f3bc48ecf5c99fb0db.vulkan.cache │ │ ├── ResolveShaderRD │ │ │ └── e3c8c53e2940e1f5a91520a0afce45c4d5ad81899bdb2a00c92d0bf7a5a1d598 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── TonemapShaderRD │ │ │ └── 141ca482ad62836b23d95815a70eddc80284764b1ca43d7ff2ede5ab6fbe59c8 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── VoxelGiShaderRD │ │ │ └── 1dfeca066a930bff2756e23c4984263c32cec09a78f945dcdf7f93d6dfae2465 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── BokehDofShaderRD │ │ │ └── b1c4cc674cd4635c32b4468ed1d2433197c6e8f8bf2bd56d8550f6cf61915142 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── CanvasSdfShaderRD │ │ │ └── 4ae1c8f9d33cbc7968cd8c803da5f7e62b213192c33781ba7538d1843007db50 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── CopyToFbShaderRD │ │ │ └── 8daff24fe2afaa4cbf26897d5238ddce01373e4680b12619ccf95c8d95609d66 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── CubeToDpShaderRD │ │ │ └── 74fa7b2e6030d8ff4983cced87bc68e8774c8437bbdbe7d89d30a6c8ea2bebe0 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── FsrUpscaleShaderRD │ │ │ └── b2553a80fa5432b72a1520a94979da2f3c92b79d9a0ceb64d93b45d3e77d1840 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── ParticlesShaderRD │ │ │ └── e25e4cd9f8bef4433fcd488eebdbabe4ea7c3854b31f92f95cf594683ca733b7 │ │ │ │ └── f128cab0b22fb7e0d9f023d6cdb81309be392d95.vulkan.cache │ │ ├── SdfgiDebugShaderRD │ │ │ └── 32fe59dd71320510d4bca50ec1d9c0f2c1336d61cc8dae4a926ccba3f27e69ba │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── SkeletonShaderRD │ │ │ └── 003ea4725382f051a99deb167035ceb67e941109bf97b44b6fc0c0f077f5c565 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── SsaoBlurShaderRD │ │ │ └── f20b8fd74ba7d9c6eb01d99d6e64d94626b6d09cf183a058fbf6d3ca4bf5e32d │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── SsilBlurShaderRD │ │ │ └── 5ea6ec5d7fbe59a8377212eab5a85c43ba7ddbde0ccdec337e29d5f39555f504 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── TaaResolveShaderRD │ │ │ └── 8cb1203e5082170b6b51e723094162080c212d7f1911c0a9edb0ebeaa7e86a0e │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── ClusterDebugShaderRD │ │ │ └── 8b7af19e792fd5df1d77e4d5345a0b3ae0802a2c829205f6b17f983261f54d54 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── ClusterStoreShaderRD │ │ │ └── c5e670c1291c276fbf57282d72cfae9b0d94649bc8f8f119b8bf226d0c847c81 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── IntegrateDfgShaderRD │ │ │ └── 2c56495726420af1acc8425fec8751aac2ed742a2c8f199bf7fe2a08f28dfdba │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── SmaaBlendingShaderRD │ │ │ └── 1e58c4bc987660974f0db013d8fa75885430693d61e7fa24404bb15fa40c8c18 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── VoxelGiDebugShaderRD │ │ │ └── 0eb7f9f258ebf21cdd385051c3b1f30074f2a639446e3bcdb8622cc1b5d1b9fc │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── BestFitNormalShaderRD │ │ │ └── 7b41920ab18ac1bb3fea961d1983a05665b32c756fe87aec7de272742a40f156 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── CanvasOcclusionShaderRD │ │ │ └── 1a96e185127c69dd7854dc31c275b848df6164172b41caef221afab6680d9591 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── ClusterRenderShaderRD │ │ │ └── 9502a0390ee6965ffb56ef8a758070e729ac89971a740ca387540e1a685acf9a │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── CubemapFilterShaderRD │ │ │ └── 248a89bbba6199237a05d6bdfb6c084870ee1a2b4608e04393d253b0f811ef90 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── LuminanceReduceShaderRD │ │ │ └── 9bc49c21388ea0f6632f9208dddfac35bb44f0400b742ef9bd380cd73b918ee9 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── MotionVectorsShaderRD │ │ │ └── 9701f92c2b3f16a896b0694e4e5042258bb5838755e75b5fc439fb935a4c9df2 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── ParticlesCopyShaderRD │ │ │ └── 853acf68cd95d40a337ae8e82171280453b17e3962789cc0fa66e23098b4c851 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── SdfgiIntegrateShaderRD │ │ │ └── 15c2766c68477b4e78df7a6fe0417baa497e7ec6f88bcaf5646095744fb2fa9c │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── SdfgiPreprocessShaderRD │ │ │ └── 806816078967870f19f38dc86962915a56e336f7001d22093d3c6c08980a4905 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── ShadowFrustumShaderRD │ │ │ └── 2ff92cb124320cba29de6156dbc2a23bfbafde9437e75d4aa075da501dbeb1c7 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── SpecularMergeShaderRD │ │ │ └── 936c8e2d6f46d594cf4546fc8ebaec5391010250bcec983f880e7a5b117bb96b │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── SsaoInterleaveShaderRD │ │ │ └── 6149f988122e57a5ff5055d684b7b4928b1809e4973328f97cd8bfc488acc78d │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── SsilInterleaveShaderRD │ │ │ └── 51fbb4500de19d012e93876e4341b103a11687e210f89f06fa75e999f47e1351 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── VolumetricFogShaderRD │ │ │ └── 344344f4b7915ff3364dcbdc20dc8594fb6f75c080b1117a4174cbaa3efafefa │ │ │ │ └── 9a227745af2d65830f930370a9fbba551fbd6f60.vulkan.cache │ │ ├── CubemapRoughnessShaderRD │ │ │ └── 6b9463386124b15b3f67e3fbf396dd5c01075145020ce716a70a95876fb8a03e │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── SdfgiDebugProbesShaderRD │ │ │ └── 97da1595879bfde5276d42636c8d91122b5ef75ab1fb8903e553fc3bda3a5734 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── SdfgiDirectLightShaderRD │ │ │ └── 283e3eabc5cfee6eef5bf7b5666a65acb4566422fa62101943cbbb0457a0c84a │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── SmaaEdgeDetectionShaderRD │ │ │ └── 9f859e28f279c2023b067a396cc676913a9312de1139c6e92df21c3d8394e048 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── SsaoImportanceMapShaderRD │ │ │ └── 1503559631352e2698230af3486d78af71583e0da34ac98926a1b97df530d3df │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── SsilImportanceMapShaderRD │ │ │ └── 25142e13a4c413a05320535e62074da3d3c62d4797e2ea09d4f231f285b381ec │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── CubemapDownsamplerShaderRD │ │ │ └── 79e3fd57fbe018511a512a7b8fc7c1689b86bf86e0421097c9c1aa0cc27926ac │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── SsEffectsDownsampleShaderRD │ │ │ └── a44a503b31412deb8f509269a41acb36b667a79160663403f6a4bc8a5b95dc10 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── SubsurfaceScatteringShaderRD │ │ │ └── 0e3d9156c48d315eb365b1fae7200cea5aa173c839909adfe05d82e9fa8b0b1a │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── VolumetricFogProcessShaderRD │ │ │ └── c26b9ba64050436f14df13f3acd93e026fd02fcd49185294630fb730cdcb20a2 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── SceneForwardClusteredShaderRD │ │ │ └── d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd │ │ │ │ ├── 111f8cfd3c260d918df85827eb251dc36a43cb13.vulkan.cache │ │ │ │ ├── 321e42e1280eb440cb08d0ceb1689cb32a542119.vulkan.cache │ │ │ │ ├── 35a078cb7dc07df55e460ed1a913486a68ab6bb0.vulkan.cache │ │ │ │ ├── 3d6fc53bad5e871b1b878eb1a4ed0a0fcec449cb.vulkan.cache │ │ │ │ ├── 63d04239c18a327f2a3fa2e0b9f5e8340bcc45ff.vulkan.cache │ │ │ │ ├── 715f7f95b6842bf66262e2a58fb864970126ecf4.vulkan.cache │ │ │ │ ├── 7412c254abd0f944fb53942228920fe187f1d723.vulkan.cache │ │ │ │ ├── 7a57964a6a80c226a1011fb78edbda41d2219632.vulkan.cache │ │ │ │ ├── 7a6b05ba6ca90f8a542e0d1fcc3360f7d52c6e09.vulkan.cache │ │ │ │ ├── 7b5acd3f66bd89336d7260db8454507d0153401b.vulkan.cache │ │ │ │ ├── 7d4c2429f20db9b651852713d31971380f209eec.vulkan.cache │ │ │ │ ├── 89044bace37a3ce54cf2cc5190e11bed6d14f97a.vulkan.cache │ │ │ │ ├── a38af1e47720abf30ca44f3d3c099c07b046df81.vulkan.cache │ │ │ │ ├── ab0b960474f1491b42ef9f2ca13dbd4ccaf64911.vulkan.cache │ │ │ │ ├── c140eb3296a16c89668476f1ae511f0623e00914.vulkan.cache │ │ │ │ ├── f88424e725a3bb50f358e9b042552af7b1c2f921.vulkan.cache │ │ │ │ └── f89c365b12d7e2d46fb2e1f6ace46a76b6cd5e89.vulkan.cache │ │ ├── ScreenSpaceReflectionShaderRD │ │ │ └── e36e5c5230134ac5b1e9c43e65471dd06e96620e1fb03e0ce1bd7524745d7bfc │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── SmaaWeightCalculationShaderRD │ │ │ └── 38c403b349941a90fcef48bf6d9d5f7180097305974993a157771f5840e53d48 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ ├── ScreenSpaceReflectionFilterShaderRD │ │ │ └── 1725e4091c2ee64f62be73b97e4f528354ab22d39d0abae24d173f28c9beaca3 │ │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ │ └── ScreenSpaceReflectionScaleShaderRD │ │ │ └── 77ccdf4032989ccf62ada33bf63873d2e3bae533e78362a6b7987eb9a0eacea0 │ │ │ └── 087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache │ └── scene_groups_cache.cfg ├── scripts │ ├── player.gd.uid │ ├── cross_hair.gd.uid │ ├── cable_terminal.gd.uid │ ├── psuedo_physics_cable.gd.uid │ ├── cross_hair.gd │ ├── cable_terminal.gd │ ├── psuedo_physics_cable.gd │ └── player.gd ├── materials │ ├── unlit_black_material.tres │ ├── medium_metallic.tres │ └── interactive_unlit_material.tres ├── textures │ ├── placeholders │ │ ├── DarkPrototypeTexture.png │ │ ├── DarkPrototypeTexture.png.import │ │ ├── target_b.svg.import │ │ ├── hand_open.svg.import │ │ ├── hand_point.svg.import │ │ ├── pointer_c.svg.import │ │ ├── hand_closed.svg.import │ │ ├── pointer_c.svg │ │ ├── hand_point.svg │ │ ├── hand_closed.svg │ │ ├── target_b.svg │ │ └── hand_open.svg │ ├── icon.svg │ └── icon.svg.import ├── scenes │ ├── psuedo_physics_cable.tscn │ ├── mesh_instance_3d.tscn │ ├── cable_terminal.tscn │ ├── ball.tscn │ ├── psuedo_physics_cable_double.tscn │ ├── player.tscn │ ├── flexible_cable.tscn │ └── main.tscn └── project.godot ├── LICENSE └── README.md /CablePhysicsTutorial/.godot/.gdignore: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/scripts/player.gd.uid: -------------------------------------------------------------------------------- 1 | uid://cao3osmslb5bd 2 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/global_script_class_cache.cfg: -------------------------------------------------------------------------------- 1 | list=[] 2 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/scripts/cross_hair.gd.uid: -------------------------------------------------------------------------------- 1 | uid://f74y5giohtwd 2 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/scripts/cable_terminal.gd.uid: -------------------------------------------------------------------------------- 1 | uid://djj0v8u4gc05s 2 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/editor/filesystem_update4: -------------------------------------------------------------------------------- 1 | res://scenes/main.tscn 2 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/scripts/psuedo_physics_cable.gd.uid: -------------------------------------------------------------------------------- 1 | uid://dxbcfhaesyqhy 2 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/editor/quick_open_dialog_cache.cfg: -------------------------------------------------------------------------------- 1 | [selected_history] 2 | 3 | PackedScene=PackedStringArray("uid://7fbmk1lqs0gp") 4 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/uid_cache.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/uid_cache.bin -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/editor/editor_script_doc_cache.res-folding-a7de57390d6e786984ca20c70a831128.cfg: -------------------------------------------------------------------------------- 1 | [folding] 2 | 3 | sections_unfolded=PackedStringArray() 4 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/imported/icon.svg-3540dd99eafb6c4e602e8c59cee418fa.md5: -------------------------------------------------------------------------------- 1 | source_md5="0eed98577cbbf02f0bdc0f5c9f70465b" 2 | dest_md5="b48bef1f2eefdd190e0a3e60a6188d75" 3 | 4 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/imported/hand_closed.svg-b443212299cc09705615c8c84b79f97e.md5: -------------------------------------------------------------------------------- 1 | source_md5="590bb2f73b95481b556c67604dc56350" 2 | dest_md5="610b87f9041e7a31f3a248337d51d7ec" 3 | 4 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/imported/hand_open.svg-b0c3e93fa5a501fe2519cd46ca19d071.md5: -------------------------------------------------------------------------------- 1 | source_md5="2da6632e795a7f4318cb9b3225a49491" 2 | dest_md5="fb1a6181738191a66f434b332589299f" 3 | 4 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/imported/hand_point.svg-9cc1b761233b51f614517792de61b8da.md5: -------------------------------------------------------------------------------- 1 | source_md5="091a1b0f81aa4e87a836b1c861b921df" 2 | dest_md5="5f3fd69906fcbbfe5d5e4866d99a22ac" 3 | 4 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/imported/pointer_c.svg-c3a00d0261e486ee6698ee6d3f3d79e1.md5: -------------------------------------------------------------------------------- 1 | source_md5="34f3e6937d881c3a1436250629eeec0c" 2 | dest_md5="62e43571481889afde198ef57166bbec" 3 | 4 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/imported/target_b.svg-6c63ebf492078ba2b0d203cac0cde9c0.md5: -------------------------------------------------------------------------------- 1 | source_md5="ae59660a758dcddad68555e59885cbed" 2 | dest_md5="3dd770466ba28787f1690bf018e47cf9" 3 | 4 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/editor/editor_script_doc_cache.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/editor/editor_script_doc_cache.res -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/imported/DarkPrototypeTexture.png-cfae9e2fe2d97c5bc0288ceed8871186.md5: -------------------------------------------------------------------------------- 1 | source_md5="74fa57c27c0f30d9d109a02bd52631d1" 2 | dest_md5="4ee5860210e448671490f6548ea65872" 3 | 4 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/materials/unlit_black_material.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StandardMaterial3D" format=3 uid="uid://d033ni84nkooj"] 2 | 3 | [resource] 4 | shading_mode = 0 5 | albedo_color = Color(0, 0, 0, 1) 6 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/textures/placeholders/DarkPrototypeTexture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/textures/placeholders/DarkPrototypeTexture.png -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/imported/icon.svg-3540dd99eafb6c4e602e8c59cee418fa.ctex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/imported/icon.svg-3540dd99eafb6c4e602e8c59cee418fa.ctex -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/imported/hand_open.svg-b0c3e93fa5a501fe2519cd46ca19d071.ctex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/imported/hand_open.svg-b0c3e93fa5a501fe2519cd46ca19d071.ctex -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/imported/pointer_c.svg-c3a00d0261e486ee6698ee6d3f3d79e1.ctex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/imported/pointer_c.svg-c3a00d0261e486ee6698ee6d3f3d79e1.ctex -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/imported/target_b.svg-6c63ebf492078ba2b0d203cac0cde9c0.ctex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/imported/target_b.svg-6c63ebf492078ba2b0d203cac0cde9c0.ctex -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/imported/hand_closed.svg-b443212299cc09705615c8c84b79f97e.ctex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/imported/hand_closed.svg-b443212299cc09705615c8c84b79f97e.ctex -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/imported/hand_point.svg-9cc1b761233b51f614517792de61b8da.ctex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/imported/hand_point.svg-9cc1b761233b51f614517792de61b8da.ctex -------------------------------------------------------------------------------- /CablePhysicsTutorial/materials/medium_metallic.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StandardMaterial3D" format=3 uid="uid://cj7poskscx4wr"] 2 | 3 | [resource] 4 | resource_local_to_scene = true 5 | albedo_color = Color(0.393086, 0.393086, 0.393085, 1) 6 | metallic = 1.0 7 | roughness = 0.5 8 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/imported/DarkPrototypeTexture.png-cfae9e2fe2d97c5bc0288ceed8871186.s3tc.ctex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/imported/DarkPrototypeTexture.png-cfae9e2fe2d97c5bc0288ceed8871186.s3tc.ctex -------------------------------------------------------------------------------- /CablePhysicsTutorial/materials/interactive_unlit_material.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StandardMaterial3D" format=3 uid="uid://1nbtlextq1fp"] 2 | 3 | [resource] 4 | albedo_color = Color(0.517184, 0.517184, 0.517184, 1) 5 | emission_enabled = true 6 | emission = Color(0.452479, 0.452479, 0.452479, 1) 7 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/scenes/psuedo_physics_cable.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=3 uid="uid://dpnia7pnlgqet"] 2 | 3 | [ext_resource type="Script" path="res://scripts/psuedo_physics_cable.gd" id="1_rrucy"] 4 | 5 | [node name="PsuedoPhysicsCable" type="Node3D"] 6 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4, 0) 7 | script = ExtResource("1_rrucy") 8 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/editor/project_metadata.cfg: -------------------------------------------------------------------------------- 1 | [game_view] 2 | 3 | select_mode=0 4 | 5 | [editor_metadata] 6 | 7 | executable_path="C:/Users/glixt/AppData/Roaming/itch/apps/godot/Godot_v4.5-stable_win64.exe" 8 | 9 | [recent_files] 10 | 11 | scenes=["res://scenes/main.tscn"] 12 | scripts=["res://scripts/psuedo_physics_cable.gd"] 13 | 14 | [quick_open_dialog] 15 | 16 | last_mode=1 17 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/GiShaderRD/6df91197bce0a55add8f8cf655ee71ac97f5c7510e3d8fe9649405dab2882f24/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/GiShaderRD/6df91197bce0a55add8f8cf655ee71ac97f5c7510e3d8fe9649405dab2882f24/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/GiShaderRD/9e9b4b5d4c15f202f7ffb443fd0971df128a5f50e14bf72f2821620133146f3d/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/GiShaderRD/9e9b4b5d4c15f202f7ffb443fd0971df128a5f50e14bf72f2821620133146f3d/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/BlitShaderRD/d5a779b2dd0cc1b4f4a707e99930a8eb1b36861da830a175fa21c9c74159eeb9/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/BlitShaderRD/d5a779b2dd0cc1b4f4a707e99930a8eb1b36861da830a175fa21c9c74159eeb9/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/CopyShaderRD/ab28315412a3dede7744b14fc38c5af7ecfa8d2f45b3a59d3f112ac9db88865d/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/CopyShaderRD/ab28315412a3dede7744b14fc38c5af7ecfa8d2f45b3a59d3f112ac9db88865d/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SkyShaderRD/a9f86a6778595096e980fe5217e4465487a0a679fa9526d4a2e81f745d154beb/03e3b11c69e24394b2d955a8c0ba85587bb70839.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SkyShaderRD/a9f86a6778595096e980fe5217e4465487a0a679fa9526d4a2e81f745d154beb/03e3b11c69e24394b2d955a8c0ba85587bb70839.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SkyShaderRD/a9f86a6778595096e980fe5217e4465487a0a679fa9526d4a2e81f745d154beb/de678811d1bad3cad4892a8db7b6ea0be197d51d.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SkyShaderRD/a9f86a6778595096e980fe5217e4465487a0a679fa9526d4a2e81f745d154beb/de678811d1bad3cad4892a8db7b6ea0be197d51d.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SkyShaderRD/a9f86a6778595096e980fe5217e4465487a0a679fa9526d4a2e81f745d154beb/e105b1e014f9523daf8d734c2f2dc115ba341902.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SkyShaderRD/a9f86a6778595096e980fe5217e4465487a0a679fa9526d4a2e81f745d154beb/e105b1e014f9523daf8d734c2f2dc115ba341902.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SortShaderRD/e3569cb510d4d20f66ac5642590debf369eabd97ac79005a0f2bc585a8fef8b6/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SortShaderRD/e3569cb510d4d20f66ac5642590debf369eabd97ac79005a0f2bc585a8fef8b6/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SsaoShaderRD/03c523b5744efe67362a3cbb7e05745d549de8f377764940b148580a9415ca5c/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SsaoShaderRD/03c523b5744efe67362a3cbb7e05745d549de8f377764940b148580a9415ca5c/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SsilShaderRD/46469c3c6dcab29a50a70756a6af386446a21ad5664a14d1a51f6c51dcb19e68/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SsilShaderRD/46469c3c6dcab29a50a70756a6af386446a21ad5664a14d1a51f6c51dcb19e68/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/VrsShaderRD/120fc066caf56440b52425f59c57b1c43d32031edc764e0b728094ad0b8b22f6/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/VrsShaderRD/120fc066caf56440b52425f59c57b1c43d32031edc764e0b728094ad0b8b22f6/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/CanvasShaderRD/e7b17ec4355ae6960cd5e830867fe5ab9d4e79978916b0314010e86dd56ba262/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/CanvasShaderRD/e7b17ec4355ae6960cd5e830867fe5ab9d4e79978916b0314010e86dd56ba262/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/CanvasShaderRD/e7b17ec4355ae6960cd5e830867fe5ab9d4e79978916b0314010e86dd56ba262/45fb1ddc6499e56682916a355ce2839e61f42dfe.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/CanvasShaderRD/e7b17ec4355ae6960cd5e830867fe5ab9d4e79978916b0314010e86dd56ba262/45fb1ddc6499e56682916a355ce2839e61f42dfe.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/CanvasShaderRD/e7b17ec4355ae6960cd5e830867fe5ab9d4e79978916b0314010e86dd56ba262/8a7277c8d3ac029b087c3fa9c55de85560be5119.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/CanvasShaderRD/e7b17ec4355ae6960cd5e830867fe5ab9d4e79978916b0314010e86dd56ba262/8a7277c8d3ac029b087c3fa9c55de85560be5119.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/CanvasShaderRD/e7b17ec4355ae6960cd5e830867fe5ab9d4e79978916b0314010e86dd56ba262/c0a681ae42aa3e0b5abba232ccae0b036be455e4.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/CanvasShaderRD/e7b17ec4355ae6960cd5e830867fe5ab9d4e79978916b0314010e86dd56ba262/c0a681ae42aa3e0b5abba232ccae0b036be455e4.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/CanvasShaderRD/e7b17ec4355ae6960cd5e830867fe5ab9d4e79978916b0314010e86dd56ba262/f3e258e8f7ec2e7e740b62f3bc48ecf5c99fb0db.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/CanvasShaderRD/e7b17ec4355ae6960cd5e830867fe5ab9d4e79978916b0314010e86dd56ba262/f3e258e8f7ec2e7e740b62f3bc48ecf5c99fb0db.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/ResolveShaderRD/e3c8c53e2940e1f5a91520a0afce45c4d5ad81899bdb2a00c92d0bf7a5a1d598/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/ResolveShaderRD/e3c8c53e2940e1f5a91520a0afce45c4d5ad81899bdb2a00c92d0bf7a5a1d598/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/TonemapShaderRD/141ca482ad62836b23d95815a70eddc80284764b1ca43d7ff2ede5ab6fbe59c8/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/TonemapShaderRD/141ca482ad62836b23d95815a70eddc80284764b1ca43d7ff2ede5ab6fbe59c8/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/VoxelGiShaderRD/1dfeca066a930bff2756e23c4984263c32cec09a78f945dcdf7f93d6dfae2465/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/VoxelGiShaderRD/1dfeca066a930bff2756e23c4984263c32cec09a78f945dcdf7f93d6dfae2465/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/BokehDofShaderRD/b1c4cc674cd4635c32b4468ed1d2433197c6e8f8bf2bd56d8550f6cf61915142/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/BokehDofShaderRD/b1c4cc674cd4635c32b4468ed1d2433197c6e8f8bf2bd56d8550f6cf61915142/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/CanvasSdfShaderRD/4ae1c8f9d33cbc7968cd8c803da5f7e62b213192c33781ba7538d1843007db50/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/CanvasSdfShaderRD/4ae1c8f9d33cbc7968cd8c803da5f7e62b213192c33781ba7538d1843007db50/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/CopyToFbShaderRD/8daff24fe2afaa4cbf26897d5238ddce01373e4680b12619ccf95c8d95609d66/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/CopyToFbShaderRD/8daff24fe2afaa4cbf26897d5238ddce01373e4680b12619ccf95c8d95609d66/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/CubeToDpShaderRD/74fa7b2e6030d8ff4983cced87bc68e8774c8437bbdbe7d89d30a6c8ea2bebe0/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/CubeToDpShaderRD/74fa7b2e6030d8ff4983cced87bc68e8774c8437bbdbe7d89d30a6c8ea2bebe0/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/FsrUpscaleShaderRD/b2553a80fa5432b72a1520a94979da2f3c92b79d9a0ceb64d93b45d3e77d1840/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/FsrUpscaleShaderRD/b2553a80fa5432b72a1520a94979da2f3c92b79d9a0ceb64d93b45d3e77d1840/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/ParticlesShaderRD/e25e4cd9f8bef4433fcd488eebdbabe4ea7c3854b31f92f95cf594683ca733b7/f128cab0b22fb7e0d9f023d6cdb81309be392d95.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/ParticlesShaderRD/e25e4cd9f8bef4433fcd488eebdbabe4ea7c3854b31f92f95cf594683ca733b7/f128cab0b22fb7e0d9f023d6cdb81309be392d95.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SdfgiDebugShaderRD/32fe59dd71320510d4bca50ec1d9c0f2c1336d61cc8dae4a926ccba3f27e69ba/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SdfgiDebugShaderRD/32fe59dd71320510d4bca50ec1d9c0f2c1336d61cc8dae4a926ccba3f27e69ba/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SkeletonShaderRD/003ea4725382f051a99deb167035ceb67e941109bf97b44b6fc0c0f077f5c565/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SkeletonShaderRD/003ea4725382f051a99deb167035ceb67e941109bf97b44b6fc0c0f077f5c565/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SsaoBlurShaderRD/f20b8fd74ba7d9c6eb01d99d6e64d94626b6d09cf183a058fbf6d3ca4bf5e32d/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SsaoBlurShaderRD/f20b8fd74ba7d9c6eb01d99d6e64d94626b6d09cf183a058fbf6d3ca4bf5e32d/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SsilBlurShaderRD/5ea6ec5d7fbe59a8377212eab5a85c43ba7ddbde0ccdec337e29d5f39555f504/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SsilBlurShaderRD/5ea6ec5d7fbe59a8377212eab5a85c43ba7ddbde0ccdec337e29d5f39555f504/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/TaaResolveShaderRD/8cb1203e5082170b6b51e723094162080c212d7f1911c0a9edb0ebeaa7e86a0e/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/TaaResolveShaderRD/8cb1203e5082170b6b51e723094162080c212d7f1911c0a9edb0ebeaa7e86a0e/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/ClusterDebugShaderRD/8b7af19e792fd5df1d77e4d5345a0b3ae0802a2c829205f6b17f983261f54d54/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/ClusterDebugShaderRD/8b7af19e792fd5df1d77e4d5345a0b3ae0802a2c829205f6b17f983261f54d54/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/ClusterStoreShaderRD/c5e670c1291c276fbf57282d72cfae9b0d94649bc8f8f119b8bf226d0c847c81/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/ClusterStoreShaderRD/c5e670c1291c276fbf57282d72cfae9b0d94649bc8f8f119b8bf226d0c847c81/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/IntegrateDfgShaderRD/2c56495726420af1acc8425fec8751aac2ed742a2c8f199bf7fe2a08f28dfdba/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/IntegrateDfgShaderRD/2c56495726420af1acc8425fec8751aac2ed742a2c8f199bf7fe2a08f28dfdba/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SmaaBlendingShaderRD/1e58c4bc987660974f0db013d8fa75885430693d61e7fa24404bb15fa40c8c18/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SmaaBlendingShaderRD/1e58c4bc987660974f0db013d8fa75885430693d61e7fa24404bb15fa40c8c18/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/VoxelGiDebugShaderRD/0eb7f9f258ebf21cdd385051c3b1f30074f2a639446e3bcdb8622cc1b5d1b9fc/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/VoxelGiDebugShaderRD/0eb7f9f258ebf21cdd385051c3b1f30074f2a639446e3bcdb8622cc1b5d1b9fc/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/BestFitNormalShaderRD/7b41920ab18ac1bb3fea961d1983a05665b32c756fe87aec7de272742a40f156/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/BestFitNormalShaderRD/7b41920ab18ac1bb3fea961d1983a05665b32c756fe87aec7de272742a40f156/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/CanvasOcclusionShaderRD/1a96e185127c69dd7854dc31c275b848df6164172b41caef221afab6680d9591/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/CanvasOcclusionShaderRD/1a96e185127c69dd7854dc31c275b848df6164172b41caef221afab6680d9591/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/ClusterRenderShaderRD/9502a0390ee6965ffb56ef8a758070e729ac89971a740ca387540e1a685acf9a/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/ClusterRenderShaderRD/9502a0390ee6965ffb56ef8a758070e729ac89971a740ca387540e1a685acf9a/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/CubemapFilterShaderRD/248a89bbba6199237a05d6bdfb6c084870ee1a2b4608e04393d253b0f811ef90/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/CubemapFilterShaderRD/248a89bbba6199237a05d6bdfb6c084870ee1a2b4608e04393d253b0f811ef90/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/LuminanceReduceShaderRD/9bc49c21388ea0f6632f9208dddfac35bb44f0400b742ef9bd380cd73b918ee9/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/LuminanceReduceShaderRD/9bc49c21388ea0f6632f9208dddfac35bb44f0400b742ef9bd380cd73b918ee9/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/MotionVectorsShaderRD/9701f92c2b3f16a896b0694e4e5042258bb5838755e75b5fc439fb935a4c9df2/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/MotionVectorsShaderRD/9701f92c2b3f16a896b0694e4e5042258bb5838755e75b5fc439fb935a4c9df2/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/ParticlesCopyShaderRD/853acf68cd95d40a337ae8e82171280453b17e3962789cc0fa66e23098b4c851/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/ParticlesCopyShaderRD/853acf68cd95d40a337ae8e82171280453b17e3962789cc0fa66e23098b4c851/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SdfgiIntegrateShaderRD/15c2766c68477b4e78df7a6fe0417baa497e7ec6f88bcaf5646095744fb2fa9c/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SdfgiIntegrateShaderRD/15c2766c68477b4e78df7a6fe0417baa497e7ec6f88bcaf5646095744fb2fa9c/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SdfgiPreprocessShaderRD/806816078967870f19f38dc86962915a56e336f7001d22093d3c6c08980a4905/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SdfgiPreprocessShaderRD/806816078967870f19f38dc86962915a56e336f7001d22093d3c6c08980a4905/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/ShadowFrustumShaderRD/2ff92cb124320cba29de6156dbc2a23bfbafde9437e75d4aa075da501dbeb1c7/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/ShadowFrustumShaderRD/2ff92cb124320cba29de6156dbc2a23bfbafde9437e75d4aa075da501dbeb1c7/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SpecularMergeShaderRD/936c8e2d6f46d594cf4546fc8ebaec5391010250bcec983f880e7a5b117bb96b/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SpecularMergeShaderRD/936c8e2d6f46d594cf4546fc8ebaec5391010250bcec983f880e7a5b117bb96b/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SsaoInterleaveShaderRD/6149f988122e57a5ff5055d684b7b4928b1809e4973328f97cd8bfc488acc78d/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SsaoInterleaveShaderRD/6149f988122e57a5ff5055d684b7b4928b1809e4973328f97cd8bfc488acc78d/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SsilInterleaveShaderRD/51fbb4500de19d012e93876e4341b103a11687e210f89f06fa75e999f47e1351/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SsilInterleaveShaderRD/51fbb4500de19d012e93876e4341b103a11687e210f89f06fa75e999f47e1351/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/VolumetricFogShaderRD/344344f4b7915ff3364dcbdc20dc8594fb6f75c080b1117a4174cbaa3efafefa/9a227745af2d65830f930370a9fbba551fbd6f60.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/VolumetricFogShaderRD/344344f4b7915ff3364dcbdc20dc8594fb6f75c080b1117a4174cbaa3efafefa/9a227745af2d65830f930370a9fbba551fbd6f60.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/CubemapRoughnessShaderRD/6b9463386124b15b3f67e3fbf396dd5c01075145020ce716a70a95876fb8a03e/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/CubemapRoughnessShaderRD/6b9463386124b15b3f67e3fbf396dd5c01075145020ce716a70a95876fb8a03e/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SdfgiDebugProbesShaderRD/97da1595879bfde5276d42636c8d91122b5ef75ab1fb8903e553fc3bda3a5734/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SdfgiDebugProbesShaderRD/97da1595879bfde5276d42636c8d91122b5ef75ab1fb8903e553fc3bda3a5734/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SdfgiDirectLightShaderRD/283e3eabc5cfee6eef5bf7b5666a65acb4566422fa62101943cbbb0457a0c84a/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SdfgiDirectLightShaderRD/283e3eabc5cfee6eef5bf7b5666a65acb4566422fa62101943cbbb0457a0c84a/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SmaaEdgeDetectionShaderRD/9f859e28f279c2023b067a396cc676913a9312de1139c6e92df21c3d8394e048/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SmaaEdgeDetectionShaderRD/9f859e28f279c2023b067a396cc676913a9312de1139c6e92df21c3d8394e048/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SsaoImportanceMapShaderRD/1503559631352e2698230af3486d78af71583e0da34ac98926a1b97df530d3df/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SsaoImportanceMapShaderRD/1503559631352e2698230af3486d78af71583e0da34ac98926a1b97df530d3df/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SsilImportanceMapShaderRD/25142e13a4c413a05320535e62074da3d3c62d4797e2ea09d4f231f285b381ec/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SsilImportanceMapShaderRD/25142e13a4c413a05320535e62074da3d3c62d4797e2ea09d4f231f285b381ec/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/scene_groups_cache.cfg: -------------------------------------------------------------------------------- 1 | [res://scenes/ball.tscn] 2 | 3 | groups=[&"Cable", &"Grabbable"] 4 | 5 | [res://scenes/flexible_cable.tscn] 6 | 7 | groups=[&"Cable", &"Grabbable"] 8 | 9 | [res://scenes/player.tscn] 10 | 11 | groups=[&"Player"] 12 | 13 | [res://scenes/psuedo_physics_cable_double.tscn] 14 | 15 | groups=[&"Grabbable"] 16 | 17 | [res://scenes/main.tscn] 18 | 19 | groups=[&"Grabbable", &"Cable"] 20 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/CubemapDownsamplerShaderRD/79e3fd57fbe018511a512a7b8fc7c1689b86bf86e0421097c9c1aa0cc27926ac/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/CubemapDownsamplerShaderRD/79e3fd57fbe018511a512a7b8fc7c1689b86bf86e0421097c9c1aa0cc27926ac/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SsEffectsDownsampleShaderRD/a44a503b31412deb8f509269a41acb36b667a79160663403f6a4bc8a5b95dc10/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SsEffectsDownsampleShaderRD/a44a503b31412deb8f509269a41acb36b667a79160663403f6a4bc8a5b95dc10/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SubsurfaceScatteringShaderRD/0e3d9156c48d315eb365b1fae7200cea5aa173c839909adfe05d82e9fa8b0b1a/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SubsurfaceScatteringShaderRD/0e3d9156c48d315eb365b1fae7200cea5aa173c839909adfe05d82e9fa8b0b1a/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/VolumetricFogProcessShaderRD/c26b9ba64050436f14df13f3acd93e026fd02fcd49185294630fb730cdcb20a2/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/VolumetricFogProcessShaderRD/c26b9ba64050436f14df13f3acd93e026fd02fcd49185294630fb730cdcb20a2/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/111f8cfd3c260d918df85827eb251dc36a43cb13.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/111f8cfd3c260d918df85827eb251dc36a43cb13.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/321e42e1280eb440cb08d0ceb1689cb32a542119.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/321e42e1280eb440cb08d0ceb1689cb32a542119.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/35a078cb7dc07df55e460ed1a913486a68ab6bb0.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/35a078cb7dc07df55e460ed1a913486a68ab6bb0.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/3d6fc53bad5e871b1b878eb1a4ed0a0fcec449cb.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/3d6fc53bad5e871b1b878eb1a4ed0a0fcec449cb.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/63d04239c18a327f2a3fa2e0b9f5e8340bcc45ff.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/63d04239c18a327f2a3fa2e0b9f5e8340bcc45ff.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/715f7f95b6842bf66262e2a58fb864970126ecf4.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/715f7f95b6842bf66262e2a58fb864970126ecf4.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/7412c254abd0f944fb53942228920fe187f1d723.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/7412c254abd0f944fb53942228920fe187f1d723.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/7a57964a6a80c226a1011fb78edbda41d2219632.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/7a57964a6a80c226a1011fb78edbda41d2219632.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/7a6b05ba6ca90f8a542e0d1fcc3360f7d52c6e09.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/7a6b05ba6ca90f8a542e0d1fcc3360f7d52c6e09.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/7b5acd3f66bd89336d7260db8454507d0153401b.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/7b5acd3f66bd89336d7260db8454507d0153401b.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/7d4c2429f20db9b651852713d31971380f209eec.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/7d4c2429f20db9b651852713d31971380f209eec.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/89044bace37a3ce54cf2cc5190e11bed6d14f97a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/89044bace37a3ce54cf2cc5190e11bed6d14f97a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/a38af1e47720abf30ca44f3d3c099c07b046df81.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/a38af1e47720abf30ca44f3d3c099c07b046df81.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/ab0b960474f1491b42ef9f2ca13dbd4ccaf64911.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/ab0b960474f1491b42ef9f2ca13dbd4ccaf64911.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/c140eb3296a16c89668476f1ae511f0623e00914.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/c140eb3296a16c89668476f1ae511f0623e00914.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/f88424e725a3bb50f358e9b042552af7b1c2f921.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/f88424e725a3bb50f358e9b042552af7b1c2f921.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/f89c365b12d7e2d46fb2e1f6ace46a76b6cd5e89.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SceneForwardClusteredShaderRD/d80c10b7bc0719bca4bd88fe927c7c6f3bcb42f5c79117523d47e0854b12d4dd/f89c365b12d7e2d46fb2e1f6ace46a76b6cd5e89.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/ScreenSpaceReflectionShaderRD/e36e5c5230134ac5b1e9c43e65471dd06e96620e1fb03e0ce1bd7524745d7bfc/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/ScreenSpaceReflectionShaderRD/e36e5c5230134ac5b1e9c43e65471dd06e96620e1fb03e0ce1bd7524745d7bfc/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/SmaaWeightCalculationShaderRD/38c403b349941a90fcef48bf6d9d5f7180097305974993a157771f5840e53d48/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/SmaaWeightCalculationShaderRD/38c403b349941a90fcef48bf6d9d5f7180097305974993a157771f5840e53d48/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/ScreenSpaceReflectionFilterShaderRD/1725e4091c2ee64f62be73b97e4f528354ab22d39d0abae24d173f28c9beaca3/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/ScreenSpaceReflectionFilterShaderRD/1725e4091c2ee64f62be73b97e4f528354ab22d39d0abae24d173f28c9beaca3/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/shader_cache/ScreenSpaceReflectionScaleShaderRD/77ccdf4032989ccf62ada33bf63873d2e3bae533e78362a6b7987eb9a0eacea0/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Elij4hMartin/PseudoCablePhysics-For-Godot/HEAD/CablePhysicsTutorial/.godot/shader_cache/ScreenSpaceReflectionScaleShaderRD/77ccdf4032989ccf62ada33bf63873d2e3bae533e78362a6b7987eb9a0eacea0/087916079fba7c625e62b0c2cca570e0fb87c99a.vulkan.cache -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/editor/script_editor_cache.cfg: -------------------------------------------------------------------------------- 1 | [res://scripts/psuedo_physics_cable.gd] 2 | 3 | state={ 4 | "bookmarks": PackedInt32Array(), 5 | "breakpoints": PackedInt32Array(), 6 | "column": 65, 7 | "folded_lines": Array[int]([]), 8 | "h_scroll_position": 0, 9 | "row": 22, 10 | "scroll_position": 0.0, 11 | "selection": true, 12 | "selection_from_column": 64, 13 | "selection_from_line": 19, 14 | "selection_to_column": 65, 15 | "selection_to_line": 22, 16 | "syntax_highlighter": "GDScript" 17 | } 18 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/scenes/mesh_instance_3d.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=3 uid="uid://7fbmk1lqs0gp"] 2 | 3 | [sub_resource type="CylinderMesh" id="CylinderMesh_d0k1p"] 4 | resource_local_to_scene = true 5 | top_radius = 0.05 6 | bottom_radius = 0.05 7 | height = 1.0 8 | radial_segments = 8 9 | rings = 1 10 | 11 | [node name="Segment" type="Node3D"] 12 | 13 | [node name="Mesh" type="MeshInstance3D" parent="."] 14 | transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0) 15 | mesh = SubResource("CylinderMesh_d0k1p") 16 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/scripts/cross_hair.gd: -------------------------------------------------------------------------------- 1 | extends TextureRect 2 | # Used to change crosshair depending on what the player is doing 3 | # HUD textures 4 | @onready var hand_closed = preload("res://textures/placeholders/hand_closed.svg") 5 | @onready var hand_open = preload("res://textures/placeholders/hand_open.svg") 6 | @onready var hand_point = preload("res://textures/placeholders/hand_point.svg") 7 | @onready var crosshair = preload("res://textures/placeholders/target_b.svg") 8 | 9 | func _update_crosshair(state): 10 | match state: 11 | "closed": 12 | texture = hand_closed 13 | "open": 14 | texture = hand_open 15 | "point": 16 | texture = hand_point 17 | "crosshair": 18 | texture = crosshair 19 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2024 Elijah Martin 2 | 3 | This software is provided "as-is", without any express or implied warranty. In no event 4 | will the authors be held liable for any damages arising from the use of this software. 5 | 6 | Permission is granted to anyone to use this software for any purpose, including commercial 7 | applications, and to alter it and redistribute it freely, subject to the following restrictions: 8 | 9 | 1. The origin of this software must not be misrepresented; you must not claim that you 10 | wrote the original software. If you use this software in a product, an acknowledgment 11 | in the product documentation would be appreciated but is not required. 12 | 13 | 2. Altered source versions must be plainly marked as such, and must not be misrepresented 14 | as being the original software. 15 | 16 | 3. This notice may not be removed or altered from any source distribution. 17 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/textures/icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/scripts/cable_terminal.gd: -------------------------------------------------------------------------------- 1 | extends Area3D 2 | 3 | var current_node 4 | # only true when terminal ID = key item ID 5 | @export var terminal_ID = 1 6 | var state = false 7 | @onready var player = get_tree().get_first_node_in_group("Player") 8 | var prev_node = null 9 | 10 | func _on_body_entered(body: Node3D) -> void: 11 | if body.is_in_group("Cable") and current_node == null: 12 | player._drop_or_throw_item(false) 13 | current_node = body 14 | lock_body() 15 | 16 | func lock_body(): 17 | var tween = get_tree().create_tween() 18 | tween.set_parallel(true) 19 | tween.tween_property(current_node, "global_position", $Node3D.global_position, 0.2) 20 | tween.tween_property(current_node, "global_rotation", $Node3D.global_rotation, 0.2) 21 | current_node.sleeping = true 22 | current_node.freeze = true 23 | 24 | # check if key item ID matches terminal ID 25 | #if current_node.get_parent().key_ID == terminal_ID: 26 | #print("cable match!") 27 | #state = true 28 | #else: 29 | #print("cable doesn't match!") 30 | #state = false 31 | 32 | func _on_body_exited(body: Node3D) -> void: 33 | if body == current_node and player.holding_object: 34 | current_node = null 35 | state = false 36 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/textures/icon.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://boohs4o1pw0ks" 6 | path="res://.godot/imported/icon.svg-3540dd99eafb6c4e602e8c59cee418fa.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://textures/icon.svg" 14 | dest_files=["res://.godot/imported/icon.svg-3540dd99eafb6c4e602e8c59cee418fa.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/uastc_level=0 22 | compress/rdo_quality_loss=0.0 23 | compress/hdr_compression=1 24 | compress/normal_map=0 25 | compress/channel_pack=0 26 | mipmaps/generate=false 27 | mipmaps/limit=-1 28 | roughness/mode=0 29 | roughness/src_normal="" 30 | process/channel_remap/red=0 31 | process/channel_remap/green=1 32 | process/channel_remap/blue=2 33 | process/channel_remap/alpha=3 34 | process/fix_alpha_border=true 35 | process/premult_alpha=false 36 | process/normal_map_invert_y=false 37 | process/hdr_as_srgb=false 38 | process/hdr_clamp_exposure=false 39 | process/size_limit=0 40 | detect_3d/compress_to=1 41 | svg/scale=1.0 42 | editor/scale_with_editor_scale=false 43 | editor/convert_colors_with_editor_theme=false 44 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/textures/placeholders/DarkPrototypeTexture.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dbl4a0tvdw7pl" 6 | path.s3tc="res://.godot/imported/DarkPrototypeTexture.png-cfae9e2fe2d97c5bc0288ceed8871186.s3tc.ctex" 7 | metadata={ 8 | "imported_formats": ["s3tc_bptc"], 9 | "vram_texture": true 10 | } 11 | 12 | [deps] 13 | 14 | source_file="res://textures/placeholders/DarkPrototypeTexture.png" 15 | dest_files=["res://.godot/imported/DarkPrototypeTexture.png-cfae9e2fe2d97c5bc0288ceed8871186.s3tc.ctex"] 16 | 17 | [params] 18 | 19 | compress/mode=2 20 | compress/high_quality=false 21 | compress/lossy_quality=0.7 22 | compress/uastc_level=0 23 | compress/rdo_quality_loss=0.0 24 | compress/hdr_compression=1 25 | compress/normal_map=0 26 | compress/channel_pack=0 27 | mipmaps/generate=true 28 | mipmaps/limit=-1 29 | roughness/mode=0 30 | roughness/src_normal="" 31 | process/channel_remap/red=0 32 | process/channel_remap/green=1 33 | process/channel_remap/blue=2 34 | process/channel_remap/alpha=3 35 | process/fix_alpha_border=true 36 | process/premult_alpha=false 37 | process/normal_map_invert_y=false 38 | process/hdr_as_srgb=false 39 | process/hdr_clamp_exposure=false 40 | process/size_limit=0 41 | detect_3d/compress_to=0 42 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/textures/placeholders/target_b.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://c3idfaesjfyjk" 6 | path="res://.godot/imported/target_b.svg-6c63ebf492078ba2b0d203cac0cde9c0.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://textures/placeholders/target_b.svg" 14 | dest_files=["res://.godot/imported/target_b.svg-6c63ebf492078ba2b0d203cac0cde9c0.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/uastc_level=0 22 | compress/rdo_quality_loss=0.0 23 | compress/hdr_compression=1 24 | compress/normal_map=0 25 | compress/channel_pack=0 26 | mipmaps/generate=false 27 | mipmaps/limit=-1 28 | roughness/mode=0 29 | roughness/src_normal="" 30 | process/channel_remap/red=0 31 | process/channel_remap/green=1 32 | process/channel_remap/blue=2 33 | process/channel_remap/alpha=3 34 | process/fix_alpha_border=true 35 | process/premult_alpha=false 36 | process/normal_map_invert_y=false 37 | process/hdr_as_srgb=false 38 | process/hdr_clamp_exposure=false 39 | process/size_limit=0 40 | detect_3d/compress_to=1 41 | svg/scale=2.0 42 | editor/scale_with_editor_scale=false 43 | editor/convert_colors_with_editor_theme=false 44 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/scenes/cable_terminal.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=5 format=3 uid="uid://mdsdgeynk147"] 2 | 3 | [ext_resource type="Script" path="res://scripts/cable_terminal.gd" id="1_tino8"] 4 | 5 | [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_chw1h"] 6 | albedo_color = Color(0.485703, 0.485704, 0.485703, 1) 7 | 8 | [sub_resource type="BoxMesh" id="BoxMesh_pfedf"] 9 | material = SubResource("StandardMaterial3D_chw1h") 10 | size = Vector3(0.2, 0.1, 0.2) 11 | 12 | [sub_resource type="SphereShape3D" id="SphereShape3D_c1yd2"] 13 | radius = 0.1 14 | 15 | [node name="CableTerminal" type="Area3D"] 16 | collision_layer = 12 17 | collision_mask = 12 18 | script = ExtResource("1_tino8") 19 | 20 | [node name="MeshInstance3D" type="MeshInstance3D" parent="."] 21 | mesh = SubResource("BoxMesh_pfedf") 22 | 23 | [node name="CollisionShape3D" type="CollisionShape3D" parent="."] 24 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.049669, 0) 25 | shape = SubResource("SphereShape3D_c1yd2") 26 | 27 | [node name="Node3D" type="Node3D" parent="."] 28 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.05, 0) 29 | 30 | [connection signal="body_entered" from="." to="." method="_on_body_entered"] 31 | [connection signal="body_exited" from="." to="." method="_on_body_exited"] 32 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/textures/placeholders/hand_open.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://c7fw5cfp7a2tk" 6 | path="res://.godot/imported/hand_open.svg-b0c3e93fa5a501fe2519cd46ca19d071.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://textures/placeholders/hand_open.svg" 14 | dest_files=["res://.godot/imported/hand_open.svg-b0c3e93fa5a501fe2519cd46ca19d071.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/uastc_level=0 22 | compress/rdo_quality_loss=0.0 23 | compress/hdr_compression=1 24 | compress/normal_map=0 25 | compress/channel_pack=0 26 | mipmaps/generate=false 27 | mipmaps/limit=-1 28 | roughness/mode=0 29 | roughness/src_normal="" 30 | process/channel_remap/red=0 31 | process/channel_remap/green=1 32 | process/channel_remap/blue=2 33 | process/channel_remap/alpha=3 34 | process/fix_alpha_border=true 35 | process/premult_alpha=false 36 | process/normal_map_invert_y=false 37 | process/hdr_as_srgb=false 38 | process/hdr_clamp_exposure=false 39 | process/size_limit=0 40 | detect_3d/compress_to=1 41 | svg/scale=2.0 42 | editor/scale_with_editor_scale=false 43 | editor/convert_colors_with_editor_theme=false 44 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/textures/placeholders/hand_point.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dveu7no5orvc8" 6 | path="res://.godot/imported/hand_point.svg-9cc1b761233b51f614517792de61b8da.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://textures/placeholders/hand_point.svg" 14 | dest_files=["res://.godot/imported/hand_point.svg-9cc1b761233b51f614517792de61b8da.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/uastc_level=0 22 | compress/rdo_quality_loss=0.0 23 | compress/hdr_compression=1 24 | compress/normal_map=0 25 | compress/channel_pack=0 26 | mipmaps/generate=false 27 | mipmaps/limit=-1 28 | roughness/mode=0 29 | roughness/src_normal="" 30 | process/channel_remap/red=0 31 | process/channel_remap/green=1 32 | process/channel_remap/blue=2 33 | process/channel_remap/alpha=3 34 | process/fix_alpha_border=true 35 | process/premult_alpha=false 36 | process/normal_map_invert_y=false 37 | process/hdr_as_srgb=false 38 | process/hdr_clamp_exposure=false 39 | process/size_limit=0 40 | detect_3d/compress_to=1 41 | svg/scale=2.0 42 | editor/scale_with_editor_scale=false 43 | editor/convert_colors_with_editor_theme=false 44 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/textures/placeholders/pointer_c.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://d0sp18aud6g2p" 6 | path="res://.godot/imported/pointer_c.svg-c3a00d0261e486ee6698ee6d3f3d79e1.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://textures/placeholders/pointer_c.svg" 14 | dest_files=["res://.godot/imported/pointer_c.svg-c3a00d0261e486ee6698ee6d3f3d79e1.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/uastc_level=0 22 | compress/rdo_quality_loss=0.0 23 | compress/hdr_compression=1 24 | compress/normal_map=0 25 | compress/channel_pack=0 26 | mipmaps/generate=false 27 | mipmaps/limit=-1 28 | roughness/mode=0 29 | roughness/src_normal="" 30 | process/channel_remap/red=0 31 | process/channel_remap/green=1 32 | process/channel_remap/blue=2 33 | process/channel_remap/alpha=3 34 | process/fix_alpha_border=true 35 | process/premult_alpha=false 36 | process/normal_map_invert_y=false 37 | process/hdr_as_srgb=false 38 | process/hdr_clamp_exposure=false 39 | process/size_limit=0 40 | detect_3d/compress_to=1 41 | svg/scale=1.0 42 | editor/scale_with_editor_scale=false 43 | editor/convert_colors_with_editor_theme=false 44 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/textures/placeholders/hand_closed.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bi331rhl2qt83" 6 | path="res://.godot/imported/hand_closed.svg-b443212299cc09705615c8c84b79f97e.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://textures/placeholders/hand_closed.svg" 14 | dest_files=["res://.godot/imported/hand_closed.svg-b443212299cc09705615c8c84b79f97e.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/uastc_level=0 22 | compress/rdo_quality_loss=0.0 23 | compress/hdr_compression=1 24 | compress/normal_map=0 25 | compress/channel_pack=0 26 | mipmaps/generate=false 27 | mipmaps/limit=-1 28 | roughness/mode=0 29 | roughness/src_normal="" 30 | process/channel_remap/red=0 31 | process/channel_remap/green=1 32 | process/channel_remap/blue=2 33 | process/channel_remap/alpha=3 34 | process/fix_alpha_border=true 35 | process/premult_alpha=false 36 | process/normal_map_invert_y=false 37 | process/hdr_as_srgb=false 38 | process/hdr_clamp_exposure=false 39 | process/size_limit=0 40 | detect_3d/compress_to=1 41 | svg/scale=2.0 42 | editor/scale_with_editor_scale=false 43 | editor/convert_colors_with_editor_theme=false 44 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/scenes/ball.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=5 format=3 uid="uid://bq8djblr754dd"] 2 | 3 | [sub_resource type="PhysicsMaterial" id="PhysicsMaterial_amoaq"] 4 | friction = 0.5 5 | rough = true 6 | 7 | [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_cgrjr"] 8 | resource_local_to_scene = true 9 | albedo_color = Color(0, 0.356847, 1, 1) 10 | 11 | [sub_resource type="SphereMesh" id="SphereMesh_8x00w"] 12 | resource_local_to_scene = true 13 | material = SubResource("StandardMaterial3D_cgrjr") 14 | radius = 0.1 15 | height = 0.2 16 | radial_segments = 6 17 | rings = 4 18 | 19 | [sub_resource type="SphereShape3D" id="SphereShape3D_tlldu"] 20 | radius = 0.1 21 | 22 | [node name="Ball" type="RigidBody3D" groups=["Cable", "Grabbable"]] 23 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.1, 0, 0) 24 | collision_layer = 4 25 | axis_lock_angular_x = true 26 | axis_lock_angular_y = true 27 | axis_lock_angular_z = true 28 | physics_material_override = SubResource("PhysicsMaterial_amoaq") 29 | lock_rotation = true 30 | linear_damp = 1.0 31 | 32 | [node name="MeshInstance3D" type="MeshInstance3D" parent="."] 33 | mesh = SubResource("SphereMesh_8x00w") 34 | skeleton = NodePath("") 35 | 36 | [node name="CollisionShape3D" type="CollisionShape3D" parent="."] 37 | shape = SubResource("SphereShape3D_tlldu") 38 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/textures/placeholders/pointer_c.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/textures/placeholders/hand_point.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/editor/editor_layout.cfg: -------------------------------------------------------------------------------- 1 | [docks] 2 | 3 | dock_3_selected_tab_idx=0 4 | dock_4_selected_tab_idx=0 5 | dock_5_selected_tab_idx=0 6 | dock_floating={} 7 | dock_filesystem_h_split_offset=240 8 | dock_filesystem_v_split_offset=0 9 | dock_filesystem_display_mode=0 10 | dock_filesystem_file_sort=0 11 | dock_filesystem_file_list_display_mode=1 12 | dock_filesystem_selected_paths=PackedStringArray("res://") 13 | dock_filesystem_uncollapsed_paths=PackedStringArray("Favorites", "res://") 14 | dock_node_current_tab=0 15 | dock_history_include_scene=true 16 | dock_history_include_global=true 17 | dock_bottom=[] 18 | dock_closed=[] 19 | dock_split_2=0 20 | dock_split_3=0 21 | dock_hsplit_1=0 22 | dock_hsplit_2=270 23 | dock_hsplit_3=-270 24 | dock_hsplit_4=0 25 | dock_3="Scene,Import" 26 | dock_4="FileSystem" 27 | dock_5="Inspector,Node,History" 28 | 29 | [EditorNode] 30 | 31 | open_scenes=PackedStringArray("res://scenes/main.tscn") 32 | current_scene="res://scenes/main.tscn" 33 | center_split_offset=0 34 | selected_default_debugger_tab_idx=1 35 | selected_main_editor_idx=2 36 | selected_bottom_panel_item=0 37 | 38 | [EditorWindow] 39 | 40 | screen=0 41 | mode="maximized" 42 | position=Vector2i(0, 29) 43 | 44 | [ScriptEditor] 45 | 46 | open_scripts=["res://scripts/psuedo_physics_cable.gd"] 47 | selected_script="res://scripts/psuedo_physics_cable.gd" 48 | open_help=[] 49 | script_split_offset=200 50 | list_split_offset=0 51 | zoom_factor=1.0 52 | 53 | [GameView] 54 | 55 | floating_window_rect=Rect2i(698, 325, 1164, 695) 56 | floating_window_screen=0 57 | 58 | [ShaderEditor] 59 | 60 | open_shaders=[] 61 | split_offset=200 62 | selected_shader="" 63 | text_shader_zoom_factor=1.0 64 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/textures/placeholders/hand_closed.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/editor/main.tscn-folding-3ad5c15c4f3250da0cc7c1af1770d85f.cfg: -------------------------------------------------------------------------------- 1 | [folding] 2 | 3 | node_unfolds=[NodePath("DirectionalLight3D"), PackedStringArray("Transform", "Shadow"), NodePath("Player"), PackedStringArray("Transform"), NodePath("DraggableCable"), PackedStringArray("Transform"), NodePath("StationaryCable"), PackedStringArray("Transform"), NodePath("StationaryCable/Pillar"), PackedStringArray("Transform"), NodePath("StationaryCable/Pillar/Pillar3"), PackedStringArray("Transform"), NodePath("StationaryCable/Pillar/Pillar2"), PackedStringArray("Transform"), NodePath("StationaryCable/Pillar/Pillar2/Pillar4"), PackedStringArray("Transform"), NodePath("HangingCable"), PackedStringArray("Transform"), NodePath("HangingCable/HangingCable"), PackedStringArray("Transform"), NodePath("HangingCable/HangingCable/Pillar3"), PackedStringArray("Transform"), NodePath("HangingCable/HangingCable/RigidBody3D"), PackedStringArray("Transform", "Collision", "Axis Lock", "Linear"), NodePath("Pillar"), PackedStringArray("Transform"), NodePath("Pillar/Pillar3"), PackedStringArray("Transform"), NodePath("Pillar/Pillar2"), PackedStringArray("Transform"), NodePath("Pillar/Pillar2/Pillar4"), PackedStringArray("Transform"), NodePath("Pillar/Pillar2/Pillar4/CableTerminal"), PackedStringArray("Transform"), NodePath("RigidBody3D"), PackedStringArray("Transform", "Collision", "Axis Lock", "Linear"), NodePath("PluggableCable"), PackedStringArray("Visibility")] 4 | resource_unfolds=["res://scenes/main.tscn::Environment_anmqf", PackedStringArray("Resource", "Background", "Sky", "Tonemap", "Glow"), "res://scenes/main.tscn::StandardMaterial3D_jhjag", PackedStringArray("Resource", "Albedo", "UV1"), "res://scenes/main.tscn::SphereMesh_kwb86", PackedStringArray("Resource"), "res://scenes/main.tscn::SphereShape3D_7kvo4", PackedStringArray("Resource")] 5 | nodes_folded=[] 6 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/textures/placeholders/target_b.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/textures/placeholders/hand_open.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/scenes/psuedo_physics_cable_double.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=6 format=3 uid="uid://dtci3471vxmbj"] 2 | 3 | [ext_resource type="Script" path="res://scripts/psuedo_physics_cable.gd" id="1_5v5ad"] 4 | 5 | [sub_resource type="PhysicsMaterial" id="PhysicsMaterial_amoaq"] 6 | friction = 0.1 7 | rough = true 8 | 9 | [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_cgrjr"] 10 | resource_local_to_scene = true 11 | albedo_color = Color(0, 0.356847, 1, 1) 12 | 13 | [sub_resource type="SphereMesh" id="SphereMesh_8x00w"] 14 | resource_local_to_scene = true 15 | material = SubResource("StandardMaterial3D_cgrjr") 16 | radius = 0.1 17 | height = 0.2 18 | radial_segments = 6 19 | rings = 2 20 | 21 | [sub_resource type="SphereShape3D" id="SphereShape3D_tlldu"] 22 | radius = 0.1 23 | 24 | [node name="PsuedoPhysicsCable" type="Node3D" node_paths=PackedStringArray("start_point", "end_point")] 25 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4, 0) 26 | script = ExtResource("1_5v5ad") 27 | start_point = NodePath("Start") 28 | start_is_rigidbody = true 29 | end_point = NodePath("End") 30 | number_of_segments = 5 31 | cable_length = 0.5 32 | cable_gravity_amp = 0.2 33 | cable_springiness = 20.0 34 | 35 | [node name="End" type="RigidBody3D" parent="." groups=["Grabbable"]] 36 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5, 0, 0) 37 | collision_layer = 4 38 | collision_mask = 5 39 | axis_lock_angular_x = true 40 | axis_lock_angular_y = true 41 | axis_lock_angular_z = true 42 | physics_material_override = SubResource("PhysicsMaterial_amoaq") 43 | lock_rotation = true 44 | linear_damp = 1.0 45 | 46 | [node name="MeshInstance3D" type="MeshInstance3D" parent="End"] 47 | mesh = SubResource("SphereMesh_8x00w") 48 | skeleton = NodePath("") 49 | 50 | [node name="CollisionShape3D" type="CollisionShape3D" parent="End"] 51 | shape = SubResource("SphereShape3D_tlldu") 52 | 53 | [node name="Start" type="RigidBody3D" parent="." groups=["Grabbable"]] 54 | collision_layer = 4 55 | collision_mask = 5 56 | axis_lock_angular_x = true 57 | axis_lock_angular_y = true 58 | axis_lock_angular_z = true 59 | physics_material_override = SubResource("PhysicsMaterial_amoaq") 60 | linear_damp = 1.0 61 | 62 | [node name="CollisionShape3D" type="CollisionShape3D" parent="Start"] 63 | shape = SubResource("SphereShape3D_tlldu") 64 | 65 | [node name="MeshInstance3D2" type="MeshInstance3D" parent="Start"] 66 | mesh = SubResource("SphereMesh_8x00w") 67 | skeleton = NodePath("") 68 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/editor/filesystem_cache10: -------------------------------------------------------------------------------- 1 | 63f7b34db8d8cdea90c76aacccf841ec 2 | ::res://::1760112990 3 | ::res://materials/::1760112951 4 | interactive_unlit_material.tres::StandardMaterial3D::1851842077475712049::1760112951::0::1::::<><><>0<>0<><>:: 5 | medium_metallic.tres::StandardMaterial3D::5471537765954367241::1760112951::0::1::::<><><>0<>0<><>:: 6 | unlit_black_material.tres::StandardMaterial3D::8973509482762767389::1760112951::0::1::::<><><>0<>0<><>:: 7 | ::res://scenes/::1760112951 8 | ball.tscn::PackedScene::3577764941241611693::1760112951::0::1::::<><><>0<>0<><>:: 9 | cable_terminal.tscn::PackedScene::849557842597644162::1760112951::0::1::::<><><>0<>0<><>::res://scripts/cable_terminal.gd 10 | flexible_cable.tscn::PackedScene::8128588582090931850::1760112951::0::1::::<><><>0<>0<><>::uid://cj7poskscx4wr::::res://materials/medium_metallic.tres<>uid://1nbtlextq1fp::::res://materials/interactive_unlit_material.tres 11 | main.tscn::PackedScene::7403756798774370889::1760112951::0::1::::<><><>0<>0<><>::uid://dbl4a0tvdw7pl::::res://textures/placeholders/DarkPrototypeTexture.png<>uid://cssglj6choju3::::res://scenes/player.tscn<>uid://dpnia7pnlgqet::::res://scenes/psuedo_physics_cable.tscn<>uid://mdsdgeynk147::::res://scenes/cable_terminal.tscn<>uid://dtci3471vxmbj::::res://scenes/psuedo_physics_cable_double.tscn<>res://scripts/psuedo_physics_cable.gd 12 | mesh_instance_3d.tscn::PackedScene::2256447597627284271::1760112951::0::1::::<><><>0<>0<><>:: 13 | player.tscn::PackedScene::6073783818833288392::1760112951::0::1::::<><><>0<>0<><>::res://scripts/player.gd<>res://scripts/cross_hair.gd 14 | psuedo_physics_cable.tscn::PackedScene::8239419056919583259::1760112951::0::1::::<><><>0<>0<><>::res://scripts/psuedo_physics_cable.gd 15 | psuedo_physics_cable_double.tscn::PackedScene::8497516147702704291::1760112951::0::1::::<><><>0<>0<><>::res://scripts/psuedo_physics_cable.gd 16 | ::res://scripts/::1760112951 17 | cable_terminal.gd::GDScript::7811098235591693954::1760112951::0::1::::<>Area3D<><>0<>0<><>:: 18 | cross_hair.gd::GDScript::418809543515840467::1760112951::0::1::::<>TextureRect<><>0<>0<><>:: 19 | player.gd::GDScript::4803468697645735445::1760112951::0::1::::<>CharacterBody3D<><>0<>0<><>:: 20 | psuedo_physics_cable.gd::GDScript::8775800563333373990::1760112951::0::1::::<>Node3D<><>0<>0<><>:: 21 | ::res://textures/::1760112951 22 | icon.svg::CompressedTexture2D::3398424492428720682::1760112951::1760112990::1::::<><><>0<>0<>a564a18247c07296022c15261f0eed81<>res://.godot/imported/icon.svg-3540dd99eafb6c4e602e8c59cee418fa.ctex:: 23 | ::res://textures/placeholders/::1760112951 24 | DarkPrototypeTexture.png::CompressedTexture2D::7253921186196313161::1760112951::1760112990::1::::<><><>0<>0<>1d7fb3e3bc620cd91538f606ea980757<>res://.godot/imported/DarkPrototypeTexture.png-cfae9e2fe2d97c5bc0288ceed8871186.s3tc.ctex:: 25 | hand_closed.svg::CompressedTexture2D::3007481420597128218::1760112951::1760112990::1::::<><><>0<>0<>f728aad23bf5d2a60daf5913e97a0225<>res://.godot/imported/hand_closed.svg-b443212299cc09705615c8c84b79f97e.ctex:: 26 | hand_open.svg::CompressedTexture2D::7030595713726594716::1760112951::1760112990::1::::<><><>0<>0<>cf944deff47059ad6fd6fe6df5fc950a<>res://.godot/imported/hand_open.svg-b0c3e93fa5a501fe2519cd46ca19d071.ctex:: 27 | hand_point.svg::CompressedTexture2D::8642757469567785953::1760112951::1760112990::1::::<><><>0<>0<>8a1f4d514316465f943a84a0f71dd3e0<>res://.godot/imported/hand_point.svg-9cc1b761233b51f614517792de61b8da.ctex:: 28 | pointer_c.svg::CompressedTexture2D::8952100861320711525::1760112951::1760112990::1::::<><><>0<>0<>0265d7f981761f178ac1573826518ffb<>res://.godot/imported/pointer_c.svg-c3a00d0261e486ee6698ee6d3f3d79e1.ctex:: 29 | target_b.svg::CompressedTexture2D::6754835098240717844::1760112951::1760112990::1::::<><><>0<>0<>e7989fe0baf13f586c4882a84a5cf698<>res://.godot/imported/target_b.svg-6c63ebf492078ba2b0d203cac0cde9c0.ctex:: 30 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/project.godot: -------------------------------------------------------------------------------- 1 | ; Engine configuration file. 2 | ; It's best edited using the editor UI and not directly, 3 | ; since the parameters that go here are not all obvious. 4 | ; 5 | ; Format: 6 | ; [section] ; section goes between [] 7 | ; param=value ; assign values to parameters 8 | 9 | config_version=5 10 | 11 | [application] 12 | 13 | config/name="CablePhysicsTutorial" 14 | run/main_scene="res://scenes/main.tscn" 15 | config/features=PackedStringArray("4.5", "Forward Plus") 16 | config/icon="res://textures/icon.svg" 17 | 18 | [global_group] 19 | 20 | Grabbable="" 21 | Cable="" 22 | 23 | [input] 24 | 25 | primary_action={ 26 | "deadzone": 0.5, 27 | "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":1,"position":Vector2(255, 11),"global_position":Vector2(264, 57),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null) 28 | ] 29 | } 30 | secondary_action={ 31 | "deadzone": 0.5, 32 | "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":2,"position":Vector2(165, 11),"global_position":Vector2(174, 57),"factor":1.0,"button_index":2,"canceled":false,"pressed":true,"double_click":false,"script":null) 33 | ] 34 | } 35 | move_left={ 36 | "deadzone": 0.5, 37 | "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null) 38 | ] 39 | } 40 | move_right={ 41 | "deadzone": 0.5, 42 | "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null) 43 | ] 44 | } 45 | move_up={ 46 | "deadzone": 0.5, 47 | "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null) 48 | ] 49 | } 50 | move_down={ 51 | "deadzone": 0.5, 52 | "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null) 53 | ] 54 | } 55 | sprint={ 56 | "deadzone": 0.5, 57 | "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194325,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) 58 | , null] 59 | } 60 | escape={ 61 | "deadzone": 0.5, 62 | "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194305,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) 63 | ] 64 | } 65 | throw={ 66 | "deadzone": 0.5, 67 | "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"key_label":0,"unicode":101,"location":0,"echo":false,"script":null) 68 | ] 69 | } 70 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/scenes/player.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=5 format=3 uid="uid://cssglj6choju3"] 2 | 3 | [ext_resource type="Script" path="res://scripts/player.gd" id="1_aafa8"] 4 | [ext_resource type="Script" path="res://scripts/cross_hair.gd" id="5_hvj71"] 5 | 6 | [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_6ovi3"] 7 | radius = 0.25 8 | height = 1.8 9 | 10 | [sub_resource type="CapsuleMesh" id="CapsuleMesh_q6p8l"] 11 | radius = 0.35 12 | height = 1.8 13 | 14 | [node name="Player" type="CharacterBody3D" node_paths=PackedStringArray("HUD", "crosshair", "note_HUD", "note_text") groups=["Player"]] 15 | process_mode = 1 16 | collision_layer = 2 17 | collision_mask = 3 18 | script = ExtResource("1_aafa8") 19 | HUD = NodePath("Head/Camera3D/PlayerHUD") 20 | crosshair = NodePath("Head/Camera3D/PlayerHUD/CrossHair") 21 | note_HUD = NodePath("Head/Camera3D/NoteHUD") 22 | note_text = NodePath("Head/Camera3D/NoteHUD/Panel/RichTextLabel") 23 | walk_speed = 3.0 24 | bob_freq = 2.5 25 | 26 | [node name="PlayerCollider" type="CollisionShape3D" parent="."] 27 | shape = SubResource("CapsuleShape3D_6ovi3") 28 | 29 | [node name="PlayerMesh" type="MeshInstance3D" parent="."] 30 | mesh = SubResource("CapsuleMesh_q6p8l") 31 | 32 | [node name="Head" type="Node3D" parent="."] 33 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.656, 0) 34 | 35 | [node name="Camera3D" type="Camera3D" parent="Head"] 36 | 37 | [node name="Hand" type="Node3D" parent="Head/Camera3D"] 38 | 39 | [node name="HoldPosition" type="Node3D" parent="Head/Camera3D/Hand"] 40 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -1) 41 | 42 | [node name="RayCast3D" type="RayCast3D" parent="Head/Camera3D"] 43 | target_position = Vector3(0, 0, -2) 44 | collision_mask = 5 45 | collide_with_areas = true 46 | 47 | [node name="PlayerHUD" type="Control" parent="Head/Camera3D"] 48 | visible = false 49 | layout_mode = 3 50 | anchors_preset = 15 51 | anchor_right = 1.0 52 | anchor_bottom = 1.0 53 | grow_horizontal = 2 54 | grow_vertical = 2 55 | mouse_filter = 2 56 | 57 | [node name="CrossHair" type="TextureRect" parent="Head/Camera3D/PlayerHUD"] 58 | layout_mode = 1 59 | anchors_preset = 8 60 | anchor_left = 0.5 61 | anchor_top = 0.5 62 | anchor_right = 0.5 63 | anchor_bottom = 0.5 64 | offset_left = -20.0 65 | offset_top = -20.0 66 | offset_right = 20.0 67 | offset_bottom = 20.0 68 | grow_horizontal = 2 69 | grow_vertical = 2 70 | mouse_filter = 2 71 | expand_mode = 1 72 | script = ExtResource("5_hvj71") 73 | 74 | [node name="NoteHUD" type="Control" parent="Head/Camera3D"] 75 | visible = false 76 | layout_mode = 3 77 | anchors_preset = 15 78 | anchor_right = 1.0 79 | anchor_bottom = 1.0 80 | grow_horizontal = 2 81 | grow_vertical = 2 82 | 83 | [node name="Panel" type="Panel" parent="Head/Camera3D/NoteHUD"] 84 | layout_mode = 1 85 | anchors_preset = -1 86 | anchor_left = 0.3 87 | anchor_top = 0.1 88 | anchor_right = 0.7 89 | anchor_bottom = 0.9 90 | grow_horizontal = 2 91 | grow_vertical = 2 92 | 93 | [node name="RichTextLabel" type="RichTextLabel" parent="Head/Camera3D/NoteHUD/Panel"] 94 | layout_mode = 1 95 | anchors_preset = 15 96 | anchor_right = 1.0 97 | anchor_bottom = 1.0 98 | grow_horizontal = 2 99 | grow_vertical = 2 100 | theme_override_font_sizes/normal_font_size = 20 101 | theme_override_font_sizes/bold_font_size = 22 102 | bbcode_enabled = true 103 | text = "[b]L[/b]orem [b]ipsum[/b] dolor sit amet, consectetur adipiscing elit. Quisque tempus enim a gravida pretium. Pellentesque ac interdum felis. Suspendisse euismod imperdiet mi, euismod gravida dolor luctus vel. Cras venenatis justo interdum aliquet aliquet. Ut aliquet hendrerit mauris eu euismod. Curabitur id neque lectus. Quisque a enim faucibus, ullamcorper risus at, scelerisque odio. Aliquam erat volutpat. 104 | 105 | Curabitur vel massa ut enim ornare posuere. Phasellus at finibus velit. Aenean sit amet nisl fringilla, congue libero elementum, tempus felis. Curabitur congue nisi ante, in ultrices velit finibus in. Nulla ullamcorper urna ac pellentesque posuere. Maecenas ultrices tristique gravida. Aliquam orci purus, semper et pellentesque vitae, maximus sed purus. 106 | 107 | Cras a odio a nisi vestibulum suscipit. Quisque tincidunt eleifend est, eget rhoncus mi mollis id. Fusce rhoncus urna sed metus auctor aliquam. Ut imperdiet sem tortor, ac lobortis risus porta ac. Donec vel rhoncus elit, eu malesuada est. In tortor mauris, molestie id ipsum ut, hendrerit consequat dui. Quisque id feugiat tortor." 108 | 109 | [node name="Hint" type="RichTextLabel" parent="Head/Camera3D/NoteHUD"] 110 | layout_mode = 1 111 | anchors_preset = -1 112 | anchor_left = 0.5 113 | anchor_top = 0.05 114 | anchor_right = 0.5 115 | anchor_bottom = 0.05 116 | offset_left = -77.5 117 | offset_right = 77.5 118 | offset_bottom = 23.0 119 | grow_horizontal = 2 120 | theme_override_font_sizes/normal_font_size = 30 121 | text = "[Right Click] to close" 122 | fit_content = true 123 | autowrap_mode = 0 124 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/.godot/editor/main.tscn-editstate-3ad5c15c4f3250da0cc7c1af1770d85f.cfg: -------------------------------------------------------------------------------- 1 | [editor_states] 2 | 3 | Anim={ 4 | "visible": false 5 | } 6 | 2D={ 7 | "grid_offset": Vector2(0, 0), 8 | "grid_snap_active": false, 9 | "grid_step": Vector2(8, 8), 10 | "grid_visibility": 1, 11 | "ofs": Vector2(-166, -111), 12 | "primary_grid_step": Vector2i(8, 8), 13 | "show_group_gizmos": true, 14 | "show_guides": true, 15 | "show_helpers": false, 16 | "show_lock_gizmos": true, 17 | "show_origin": true, 18 | "show_position_gizmos": true, 19 | "show_rulers": true, 20 | "show_transformation_gizmos": true, 21 | "show_viewport": true, 22 | "show_zoom_control": true, 23 | "smart_snap_active": false, 24 | "snap_guides": true, 25 | "snap_node_anchors": true, 26 | "snap_node_center": true, 27 | "snap_node_parent": true, 28 | "snap_node_sides": true, 29 | "snap_other_nodes": true, 30 | "snap_pixel": true, 31 | "snap_relative": false, 32 | "snap_rotation": false, 33 | "snap_rotation_offset": 0.0, 34 | "snap_rotation_step": 0.2617994, 35 | "snap_scale": false, 36 | "snap_scale_step": 0.1, 37 | "zoom": 1.0 38 | } 39 | 3D={ 40 | "fov": 70.01, 41 | "gizmos_status": { 42 | "AudioListener3D": 0, 43 | "AudioStreamPlayer3D": 0, 44 | "CPUParticles3D": 0, 45 | "CSGShape3D": 0, 46 | "Camera3D": 0, 47 | "CollisionObject3D": 0, 48 | "CollisionPolygon3D": 0, 49 | "CollisionShape3D": 0, 50 | "Decal": 0, 51 | "FogVolume": 0, 52 | "GPUParticles3D": 0, 53 | "GPUParticlesCollision3D": 0, 54 | "Joint3D": 0, 55 | "Light3D": 0, 56 | "LightmapGI": 0, 57 | "LightmapProbe": 0, 58 | "Marker3D": 0, 59 | "MeshInstance3DCustomAABB": 0, 60 | "NavigationLink3D": 0, 61 | "NavigationObstacle3D": 0, 62 | "NavigationRegion3D": 0, 63 | "OccluderInstance3D": 0, 64 | "Particles3DEmissionShape": 0, 65 | "Path3D": 0, 66 | "PhysicalBone3D": 0, 67 | "RayCast3D": 0, 68 | "ReflectionProbe": 0, 69 | "ShapeCast3D": 0, 70 | "Skeleton3D": 0, 71 | "SoftBody3D": 0, 72 | "SpringArm3D": 0, 73 | "SpringBoneCollision3D": 0, 74 | "SpringBoneSimulator3D": 0, 75 | "VehicleWheel3D": 0, 76 | "VisibleOnScreenNotifier3D": 0, 77 | "VoxelGI": 0 78 | }, 79 | "local_coords": false, 80 | "preview_sun_env": { 81 | "environ_ao_enabled": false, 82 | "environ_enabled": true, 83 | "environ_energy": 1.0, 84 | "environ_gi_enabled": false, 85 | "environ_glow_enabled": true, 86 | "environ_ground_color": Color(0.2, 0.169, 0.133, 1), 87 | "environ_sky_color": Color(0.385, 0.454, 0.55, 1), 88 | "environ_tonemap_enabled": true, 89 | "sun_color": Color(1, 1, 1, 1), 90 | "sun_enabled": true, 91 | "sun_energy": 1.0, 92 | "sun_rotation": Vector2(-1.0471976, 2.6179938), 93 | "sun_shadow_max_distance": 100.0 94 | }, 95 | "rotate_snap": 15.0, 96 | "scale_snap": 10.0, 97 | "show_grid": true, 98 | "show_origin": true, 99 | "snap_enabled": false, 100 | "translate_snap": 1.0, 101 | "viewport_mode": 1, 102 | "viewports": [{ 103 | "auto_orthogonal": false, 104 | "auto_orthogonal_enabled": true, 105 | "cinematic_preview": false, 106 | "display_mode": 22, 107 | "distance": 4.0, 108 | "doppler": false, 109 | "frame_time": false, 110 | "gizmos": true, 111 | "grid": true, 112 | "half_res": false, 113 | "information": false, 114 | "listener": true, 115 | "lock_rotation": false, 116 | "orthogonal": false, 117 | "position": Vector3(0, 0, 0), 118 | "transform_gizmo": true, 119 | "use_environment": false, 120 | "view_type": 0, 121 | "x_rotation": 0.5, 122 | "y_rotation": -0.5 123 | }, { 124 | "auto_orthogonal": false, 125 | "auto_orthogonal_enabled": true, 126 | "cinematic_preview": false, 127 | "display_mode": 22, 128 | "distance": 4.0, 129 | "doppler": false, 130 | "frame_time": false, 131 | "gizmos": true, 132 | "grid": true, 133 | "half_res": false, 134 | "information": false, 135 | "listener": false, 136 | "lock_rotation": false, 137 | "orthogonal": false, 138 | "position": Vector3(0, 0, 0), 139 | "transform_gizmo": true, 140 | "use_environment": false, 141 | "view_type": 0, 142 | "x_rotation": 0.5, 143 | "y_rotation": -0.5 144 | }, { 145 | "auto_orthogonal": false, 146 | "auto_orthogonal_enabled": true, 147 | "cinematic_preview": false, 148 | "display_mode": 22, 149 | "distance": 4.0, 150 | "doppler": false, 151 | "frame_time": false, 152 | "gizmos": true, 153 | "grid": true, 154 | "half_res": false, 155 | "information": false, 156 | "listener": false, 157 | "lock_rotation": false, 158 | "orthogonal": false, 159 | "position": Vector3(0, 0, 0), 160 | "transform_gizmo": true, 161 | "use_environment": false, 162 | "view_type": 0, 163 | "x_rotation": 0.5, 164 | "y_rotation": -0.5 165 | }, { 166 | "auto_orthogonal": false, 167 | "auto_orthogonal_enabled": true, 168 | "cinematic_preview": false, 169 | "display_mode": 22, 170 | "distance": 4.0, 171 | "doppler": false, 172 | "frame_time": false, 173 | "gizmos": true, 174 | "grid": true, 175 | "half_res": false, 176 | "information": false, 177 | "listener": false, 178 | "lock_rotation": false, 179 | "orthogonal": false, 180 | "position": Vector3(0, 0, 0), 181 | "transform_gizmo": true, 182 | "use_environment": false, 183 | "view_type": 0, 184 | "x_rotation": 0.5, 185 | "y_rotation": -0.5 186 | }], 187 | "zfar": 4000.01, 188 | "znear": 0.05 189 | } 190 | selected_nodes=Array[NodePath]([NodePath("/root/@EditorNode@20438/@Panel@14/@VBoxContainer@15/DockHSplitLeftL/DockHSplitLeftR/DockHSplitMain/@VBoxContainer@26/DockVSplitCenter/@VSplitContainer@62/@VBoxContainer@63/@EditorMainScreen@103/MainScreen/@CanvasItemEditor@10871/@VSplitContainer@10516/@HSplitContainer@10518/@HSplitContainer@10520/@Control@10521/@SubViewportContainer@10522/@SubViewport@10523/Main/PluggableCable")]) 191 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/scripts/psuedo_physics_cable.gd: -------------------------------------------------------------------------------- 1 | extends Node3D 2 | 3 | enum GRAVITY_DIRECTION {X_AXIS, X_AXIS_INVERSE, Y_AXIS, Y_AXIS_INVERSE, Z_AXIS, Z_AXIS_INVERSE} 4 | 5 | @export var start_point: Node3D 6 | @export var end_point: Node3D 7 | @export_range(1,50,1) var number_of_segments: int = 10 8 | @export_range(0, 100.0, 0.1) var cable_length: float = 5.0 9 | 10 | @export var cable_gravity_amp: float = 0.245 11 | @export var cable_gravity_direction: GRAVITY_DIRECTION = GRAVITY_DIRECTION.Y_AXIS 12 | @export var cable_thickness: float = 0.1 13 | @export var cable_springiness: float = 19.62 14 | @export var cable_mesh: PackedScene 15 | @onready var segment_stretch: float = float(cable_length / number_of_segments) 16 | # instances 17 | var segments: Array[Node3D] = [] 18 | var joints: Array[Node3D] = [] 19 | 20 | # Called when the node enters the scene tree for the first time. 21 | func _ready() -> void: 22 | var distance: float = (end_point.global_position - start_point.global_position).length() 23 | var direction: Vector3 = (end_point.global_position - start_point.global_position).normalized() 24 | # start at start point 25 | joints.append(start_point) 26 | # create joints 27 | for j: int in (number_of_segments - 1): 28 | joints.append(Node3D.new()) 29 | self.add_child(joints[j+1]) 30 | # position nodes evenly between the two points 31 | joints[j+1].global_position = start_point.global_position + direction * (j + 1) * distance / (number_of_segments - 1) 32 | # end at end point 33 | joints.append(end_point) 34 | # create cable segments 35 | for s: int in number_of_segments: 36 | segments.append(cable_mesh.instantiate()) 37 | self.add_child(segments[s]) 38 | # position segments between the joints 39 | segments[s].global_position = joints[s].global_position + (joints[s+1].global_position - joints[s].global_position)/2 40 | segments[s].get_child(0).mesh.top_radius = cable_thickness/2.0 41 | segments[s].get_child(0).mesh.bottom_radius = cable_thickness/2.0 42 | 43 | func _process(_delta: float) -> void: 44 | # Make segments point at their target and stretch/squash to their desired length 45 | for i: int in number_of_segments: 46 | # set position between joints 47 | segments[i].global_position = joints[i].global_position + (joints[i+1].global_position - joints[i].global_position)/2 48 | # look at next joint 49 | safe_look_at(segments[i], joints[i+1].global_position + Vector3(0.0001, 0, -0.0001)) 50 | # set length to the distance between the joints 51 | segments[i].get_child(0).mesh.height = (joints[i+1].global_position - joints[i].global_position).length() 52 | 53 | func _physics_process(delta: float) -> void: 54 | # fake physics 55 | for i: int in number_of_segments: 56 | if i != 0: 57 | # collision 58 | var query: PhysicsRayQueryParameters3D = PhysicsRayQueryParameters3D.create(joints[i].global_position, joints[i].global_position - Vector3(0,cable_thickness, 0)) 59 | var raycast: Dictionary = get_world_3d().direct_space_state.intersect_ray(query) 60 | # Gravity 61 | if raycast.get("collider") == null: 62 | var inverse: int = 1 if [GRAVITY_DIRECTION.X_AXIS, GRAVITY_DIRECTION.Y_AXIS, GRAVITY_DIRECTION.Z_AXIS].has(cable_gravity_direction) else -1 63 | match cable_gravity_direction: 64 | GRAVITY_DIRECTION.X_AXIS, GRAVITY_DIRECTION.X_AXIS_INVERSE: 65 | joints[i].global_position.x = lerp(joints[i].global_position.x, joints[i].global_position.x - 1, cable_gravity_amp * delta * inverse/2.0) 66 | GRAVITY_DIRECTION.Y_AXIS, GRAVITY_DIRECTION.Y_AXIS_INVERSE: 67 | joints[i].global_position.y = lerp(joints[i].global_position.y, joints[i].global_position.y - 1, cable_gravity_amp * delta * inverse/2.0) 68 | GRAVITY_DIRECTION.Z_AXIS, GRAVITY_DIRECTION.Z_AXIS_INVERSE: 69 | joints[i].global_position.z = lerp(joints[i].global_position.z, joints[i].global_position.z - 1, cable_gravity_amp * delta * inverse/2.0) 70 | # stretch 71 | joints[i].global_position = lerp(joints[i].global_position, joints[i-1].global_position + (joints[i+1].global_position - joints[i-1].global_position)/2.0, cable_springiness * delta) 72 | # Retract 73 | if end_point is RigidBody3D: 74 | if (end_point.global_position - joints[0].global_position).length() >= segment_stretch * number_of_segments: 75 | var modifier: float = (end_point.global_position - joints[0].global_position).length() - segment_stretch * number_of_segments 76 | modifier = clamp(modifier, 0.0, cable_springiness) 77 | end_point.linear_velocity -= (end_point.global_position - joints[-2].global_position)*modifier 78 | if start_point is RigidBody3D: 79 | if (end_point.global_position - joints[0].global_position).length() >= segment_stretch * number_of_segments: 80 | var modifier: float = (end_point.global_position - joints[0].global_position).length() - segment_stretch * number_of_segments 81 | modifier = clamp(modifier, 0.0, cable_springiness) 82 | joints[0].linear_velocity -= (joints[0].global_position - joints[1].global_position)*modifier 83 | 84 | func safe_look_at(node: Node3D, target: Vector3) -> void: 85 | var origin: Vector3 = node.global_transform.origin 86 | var v_z: Vector3 = (origin - target).normalized() 87 | 88 | # Just return if at same position 89 | if origin == target: 90 | return 91 | 92 | # Find an up vector that we can rotate around 93 | var up: Vector3 = Vector3.ZERO 94 | for entry: Vector3 in [Vector3.UP, Vector3.RIGHT, Vector3.BACK]: 95 | var v_x: Vector3 = entry.cross(v_z).normalized() 96 | if v_x.length() != 0: 97 | up = entry 98 | break 99 | 100 | # Look at the target 101 | if up != Vector3.ZERO: 102 | node.look_at(target, up) 103 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PsuedoCablePhysics-For-Godot 2 | This is a simple approximation of rope/cable physics for Godot 4.3 that I made for a Screamjam submission, because I couldn't find a Verlet simulation that worked with the version of Godot I was using. 3 | Download this project and open it in Godot 4.5 (4.3+) to test out the project! 4 | ### CC0 Assets used: Kenney UI Pack, Kenney Prototype Textures 5 | ### Video DEMO 6 | [![VIDEO DEMO](https://img.youtube.com/vi/K8SLWUsPFNY/0.jpg)](https://www.youtube.com/watch?v=K8SLWUsPFNY) 7 | ## Script usage instructions: 8 | - Attach the pseudo_physics_cable.gd script to a Node3D 9 | - Make sure you have the mesh_instance_3d.tscn scene in a "scenes" folder or change the script path to the file for the cable_mesh variable 10 | - Add a start point as either a static node or a rigidbody 11 | - Add a end point that is either a static node or a rigidbody 12 | - If an end/start point is a rigidbody enable the exported variable for each end 13 | - Lastly adjust the values of the cable length, gravity and springiness to your desired values 14 | ## Here is the script that is responsible for the basic simulation: 15 | ```GDscript 16 | extends Node3D 17 | 18 | enum GRAVITY_DIRECTION {X_AXIS, X_AXIS_INVERSE, Y_AXIS, Y_AXIS_INVERSE, Z_AXIS, Z_AXIS_INVERSE} 19 | 20 | @export var start_point: Node3D 21 | @export var end_point: Node3D 22 | @export_range(1,50,1) var number_of_segments: int = 10 23 | @export_range(0, 100.0, 0.1) var cable_length: float = 5.0 24 | 25 | @export var cable_gravity_amp: float = 0.245 26 | @export var cable_gravity_direction: GRAVITY_DIRECTION = GRAVITY_DIRECTION.Y_AXIS 27 | @export var cable_thickness: float = 0.1 28 | @export var cable_springiness: float = 19.62 29 | @export var cable_mesh: PackedScene 30 | @onready var segment_stretch: float = float(cable_length / number_of_segments) 31 | # instances 32 | var segments: Array[Node3D] = [] 33 | var joints: Array[Node3D] = [] 34 | 35 | # Called when the node enters the scene tree for the first time. 36 | func _ready() -> void: 37 | var distance: float = (end_point.global_position - start_point.global_position).length() 38 | var direction: Vector3 = (end_point.global_position - start_point.global_position).normalized() 39 | # start at start point 40 | joints.append(start_point) 41 | # create joints 42 | for j: int in (number_of_segments - 1): 43 | joints.append(Node3D.new()) 44 | self.add_child(joints[j+1]) 45 | # position nodes evenly between the two points 46 | joints[j+1].global_position = start_point.global_position + direction * (j + 1) * distance / (number_of_segments - 1) 47 | # end at end point 48 | joints.append(end_point) 49 | # create cable segments 50 | for s: int in number_of_segments: 51 | segments.append(cable_mesh.instantiate()) 52 | self.add_child(segments[s]) 53 | # position segments between the joints 54 | segments[s].global_position = joints[s].global_position + (joints[s+1].global_position - joints[s].global_position)/2 55 | segments[s].get_child(0).mesh.top_radius = cable_thickness/2.0 56 | segments[s].get_child(0).mesh.bottom_radius = cable_thickness/2.0 57 | 58 | func _process(_delta: float) -> void: 59 | # Make segments point at their target and stretch/squash to their desired length 60 | for i: int in number_of_segments: 61 | # set position between joints 62 | segments[i].global_position = joints[i].global_position + (joints[i+1].global_position - joints[i].global_position)/2 63 | # look at next joint 64 | safe_look_at(segments[i], joints[i+1].global_position + Vector3(0.0001, 0, -0.0001)) 65 | # set length to the distance between the joints 66 | segments[i].get_child(0).mesh.height = (joints[i+1].global_position - joints[i].global_position).length() 67 | 68 | func _physics_process(delta: float) -> void: 69 | # fake physics 70 | for i: int in number_of_segments: 71 | if i != 0: 72 | # collision 73 | var query: PhysicsRayQueryParameters3D = PhysicsRayQueryParameters3D.create(joints[i].global_position, joints[i].global_position - Vector3(0,cable_thickness, 0)) 74 | var raycast: Dictionary = get_world_3d().direct_space_state.intersect_ray(query) 75 | # Gravity 76 | if raycast.get("collider") == null: 77 | var inverse: int = 1 if [GRAVITY_DIRECTION.X_AXIS, GRAVITY_DIRECTION.Y_AXIS, GRAVITY_DIRECTION.Z_AXIS].has(cable_gravity_direction) else -1 78 | match cable_gravity_direction: 79 | GRAVITY_DIRECTION.X_AXIS, GRAVITY_DIRECTION.X_AXIS_INVERSE: 80 | joints[i].global_position.x = lerp(joints[i].global_position.x, joints[i].global_position.x - 1, cable_gravity_amp * delta * inverse/2.0) 81 | GRAVITY_DIRECTION.Y_AXIS, GRAVITY_DIRECTION.Y_AXIS_INVERSE: 82 | joints[i].global_position.y = lerp(joints[i].global_position.y, joints[i].global_position.y - 1, cable_gravity_amp * delta * inverse/2.0) 83 | GRAVITY_DIRECTION.Z_AXIS, GRAVITY_DIRECTION.Z_AXIS_INVERSE: 84 | joints[i].global_position.z = lerp(joints[i].global_position.z, joints[i].global_position.z - 1, cable_gravity_amp * delta * inverse/2.0) 85 | # stretch 86 | joints[i].global_position = lerp(joints[i].global_position, joints[i-1].global_position + (joints[i+1].global_position - joints[i-1].global_position)/2.0, cable_springiness * delta) 87 | # Retract 88 | if end_point is RigidBody3D: 89 | if (end_point.global_position - joints[0].global_position).length() >= segment_stretch * number_of_segments: 90 | var modifier: float = (end_point.global_position - joints[0].global_position).length() - segment_stretch * number_of_segments 91 | modifier = clamp(modifier, 0.0, cable_springiness) 92 | end_point.linear_velocity -= (end_point.global_position - joints[-2].global_position)*modifier 93 | if start_point is RigidBody3D: 94 | if (end_point.global_position - joints[0].global_position).length() >= segment_stretch * number_of_segments: 95 | var modifier: float = (end_point.global_position - joints[0].global_position).length() - segment_stretch * number_of_segments 96 | modifier = clamp(modifier, 0.0, cable_springiness) 97 | joints[0].linear_velocity -= (joints[0].global_position - joints[1].global_position)*modifier 98 | 99 | func safe_look_at(node: Node3D, target: Vector3) -> void: 100 | var origin: Vector3 = node.global_transform.origin 101 | var v_z: Vector3 = (origin - target).normalized() 102 | 103 | # Just return if at same position 104 | if origin == target: 105 | return 106 | 107 | # Find an up vector that we can rotate around 108 | var up: Vector3 = Vector3.ZERO 109 | for entry: Vector3 in [Vector3.UP, Vector3.RIGHT, Vector3.BACK]: 110 | var v_x: Vector3 = entry.cross(v_z).normalized() 111 | if v_x.length() != 0: 112 | up = entry 113 | break 114 | 115 | # Look at the target 116 | if up != Vector3.ZERO: 117 | node.look_at(target, up) 118 | ``` 119 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/scenes/flexible_cable.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=11 format=3 uid="uid://dn2swwkblagis"] 2 | 3 | [ext_resource type="Material" uid="uid://cj7poskscx4wr" path="res://materials/medium_metallic.tres" id="2_c6s4n"] 4 | [ext_resource type="Material" uid="uid://1nbtlextq1fp" path="res://materials/interactive_unlit_material.tres" id="2_ffeg3"] 5 | 6 | [sub_resource type="GDScript" id="GDScript_0vctq"] 7 | script/source = "extends Node3D 8 | @onready var startpoint := $StartPoint 9 | @onready var joint1 := $Joint1 10 | @onready var joint2 := $Joint2 11 | @onready var joint3 := $Joint3 12 | @onready var endpoint := $EndPoint 13 | @onready var segment1 := $Segment1 14 | @onready var segment2 := $Segment2 15 | @onready var segment3 := $Segment3 16 | @onready var segment4 := $Segment4 17 | @export var key_ID = 1 18 | @export var cable_color : Color 19 | @export var cable_gravity_amp = 1.0 20 | @export var cable_springiness = 2.0 21 | @export var cable_max_stretch = 2.5 22 | #get player 23 | @onready var player = get_tree().get_first_node_in_group(\"Player\") 24 | 25 | func _ready() -> void: 26 | segment1.material_override.albedo_color = cable_color 27 | segment2.material_override.albedo_color = cable_color 28 | segment3.material_override.albedo_color = cable_color 29 | segment4.material_override.albedo_color = cable_color 30 | 31 | # Called every frame. 'delta' is the elapsed time since the previous frame. 32 | func _process(delta: float) -> void: 33 | #joint 1 34 | segment1.position = joint1.position/2 35 | segment1.look_at(joint1.global_position) 36 | segment1.rotation_degrees += Vector3(-90, 0, 180) 37 | segment1.mesh.section_length = joint1.position.length()/2 38 | # joint 2 39 | segment2.position = joint1.position + (joint2.position - joint1.position)/2 40 | segment2.look_at(joint2.global_position) 41 | segment2.rotation_degrees += Vector3(-90, 0, 180) 42 | segment2.mesh.section_length = (joint2.position - joint1.position).length()/2 43 | # joint 3 44 | segment3.position = joint2.position + (joint3.position - joint2.position)/2 45 | segment3.look_at(joint3.global_position) 46 | segment3.rotation_degrees += Vector3(-90, 0, 180) 47 | segment3.mesh.section_length = (joint3.position - joint2.position).length()/2 48 | # rigidbody 49 | segment4.position = joint3.position + (endpoint.position - joint3.position)/2 50 | segment4.look_at(endpoint.global_position) 51 | segment4.rotation_degrees += Vector3(-90, 0, 180) 52 | segment4.mesh.section_length = (endpoint.position - joint3.position).length()/2 53 | 54 | func _physics_process(delta: float) -> void: 55 | # collide with floor 56 | if $Joint1/RayCast3D.is_colliding() == false: 57 | joint1.global_position.y = lerp(joint1.global_position.y, joint1.global_position.y - 1, cable_gravity_amp * delta/2) 58 | if $Joint2/RayCast3D2.is_colliding() == false: 59 | joint2.global_position.y = lerp(joint2.global_position.y, joint2.global_position.y - 1, cable_gravity_amp * delta/2) 60 | if $Joint3/RayCast3D3.is_colliding() == false: 61 | joint3.global_position.y = lerp(joint3.global_position.y, joint3.global_position.y - 1, cable_gravity_amp * delta/2) 62 | 63 | joint1.position = lerp(joint1.position, joint2.position/2, cable_springiness * delta) 64 | joint2.position = lerp(joint2.position, joint1.position + (joint3.position - joint1.position)/2, cable_springiness * delta) 65 | joint3.position = lerp(joint3.position, joint2.position + (endpoint.position - joint2.position)/2, cable_springiness * delta) 66 | if (endpoint.global_position - joint3.global_position).length() >= cable_max_stretch: 67 | endpoint.linear_velocity -= (endpoint.global_position - joint3.global_position)*0.1 68 | if player.held_object == endpoint: 69 | player._drop_or_throw_item(false) 70 | " 71 | 72 | [sub_resource type="SphereMesh" id="SphereMesh_hsdvb"] 73 | material = ExtResource("2_ffeg3") 74 | radius = 0.1 75 | height = 0.2 76 | radial_segments = 8 77 | rings = 2 78 | 79 | [sub_resource type="TubeTrailMesh" id="TubeTrailMesh_4uv8a"] 80 | resource_local_to_scene = true 81 | radius = 0.05 82 | radial_steps = 4 83 | sections = 2 84 | section_length = 0.5 85 | 86 | [sub_resource type="TubeTrailMesh" id="TubeTrailMesh_j4adu"] 87 | resource_local_to_scene = true 88 | radius = 0.05 89 | radial_steps = 4 90 | sections = 2 91 | section_length = 0.5 92 | 93 | [sub_resource type="TubeTrailMesh" id="TubeTrailMesh_yigdg"] 94 | resource_local_to_scene = true 95 | radius = 0.05 96 | radial_steps = 4 97 | sections = 2 98 | section_length = 0.5 99 | 100 | [sub_resource type="TubeTrailMesh" id="TubeTrailMesh_khcb3"] 101 | resource_local_to_scene = true 102 | radius = 0.05 103 | radial_steps = 4 104 | sections = 2 105 | section_length = 0.5 106 | 107 | [sub_resource type="PhysicsMaterial" id="PhysicsMaterial_x81kp"] 108 | friction = 0.2 109 | 110 | [sub_resource type="SphereShape3D" id="SphereShape3D_sfbv0"] 111 | radius = 0.25 112 | 113 | [node name="FlexibleCable" type="Node3D"] 114 | script = SubResource("GDScript_0vctq") 115 | 116 | [node name="StartPoint" type="Node3D" parent="."] 117 | 118 | [node name="MeshInstance3D" type="MeshInstance3D" parent="StartPoint"] 119 | mesh = SubResource("SphereMesh_hsdvb") 120 | skeleton = NodePath("../../EndPoint") 121 | 122 | [node name="Segment1" type="MeshInstance3D" parent="."] 123 | transform = Transform3D(-4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0, 1, 0.5, -6.55671e-08, 0) 124 | material_override = ExtResource("2_c6s4n") 125 | mesh = SubResource("TubeTrailMesh_4uv8a") 126 | 127 | [node name="Segment2" type="MeshInstance3D" parent="."] 128 | transform = Transform3D(-4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0, 1, 1.5, 0, 0) 129 | material_override = ExtResource("2_c6s4n") 130 | mesh = SubResource("TubeTrailMesh_j4adu") 131 | 132 | [node name="Segment3" type="MeshInstance3D" parent="."] 133 | transform = Transform3D(-4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0, 1, 2.5, 0, 0) 134 | material_override = ExtResource("2_c6s4n") 135 | mesh = SubResource("TubeTrailMesh_yigdg") 136 | 137 | [node name="Segment4" type="MeshInstance3D" parent="."] 138 | transform = Transform3D(-4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0, 1, 3.5, 0, 0) 139 | material_override = ExtResource("2_c6s4n") 140 | mesh = SubResource("TubeTrailMesh_khcb3") 141 | 142 | [node name="Joint1" type="Node3D" parent="."] 143 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0) 144 | 145 | [node name="RayCast3D" type="RayCast3D" parent="Joint1"] 146 | target_position = Vector3(0, -0.05, 0) 147 | collision_mask = 5 148 | 149 | [node name="Joint2" type="Node3D" parent="."] 150 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 0, 0) 151 | 152 | [node name="RayCast3D2" type="RayCast3D" parent="Joint2"] 153 | target_position = Vector3(0, -0.05, 0) 154 | collision_mask = 5 155 | 156 | [node name="Joint3" type="Node3D" parent="."] 157 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, 0, 0) 158 | 159 | [node name="RayCast3D3" type="RayCast3D" parent="Joint3"] 160 | target_position = Vector3(0, -0.05, 0) 161 | collision_mask = 5 162 | 163 | [node name="EndPoint" type="RigidBody3D" parent="." groups=["Cable", "Grabbable"]] 164 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 0, 0) 165 | collision_layer = 12 166 | collision_mask = 13 167 | axis_lock_angular_x = true 168 | axis_lock_angular_y = true 169 | axis_lock_angular_z = true 170 | physics_material_override = SubResource("PhysicsMaterial_x81kp") 171 | lock_rotation = true 172 | max_contacts_reported = 1 173 | 174 | [node name="CollisionShape3D" type="CollisionShape3D" parent="EndPoint"] 175 | shape = SubResource("SphereShape3D_sfbv0") 176 | 177 | [node name="MeshInstance3D" type="MeshInstance3D" parent="EndPoint"] 178 | mesh = SubResource("SphereMesh_hsdvb") 179 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/scenes/main.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=14 format=3 uid="uid://ddqo17pfv6xjt"] 2 | 3 | [ext_resource type="Texture2D" uid="uid://dbl4a0tvdw7pl" path="res://textures/placeholders/DarkPrototypeTexture.png" id="1_edrna"] 4 | [ext_resource type="PackedScene" uid="uid://cssglj6choju3" path="res://scenes/player.tscn" id="2_n8x4n"] 5 | [ext_resource type="PackedScene" uid="uid://dpnia7pnlgqet" path="res://scenes/psuedo_physics_cable.tscn" id="2_nc41p"] 6 | [ext_resource type="PackedScene" uid="uid://mdsdgeynk147" path="res://scenes/cable_terminal.tscn" id="3_p56pu"] 7 | [ext_resource type="PackedScene" uid="uid://7fbmk1lqs0gp" path="res://scenes/mesh_instance_3d.tscn" id="4_o6xl0"] 8 | [ext_resource type="PackedScene" uid="uid://dtci3471vxmbj" path="res://scenes/psuedo_physics_cable_double.tscn" id="5_1lv8e"] 9 | [ext_resource type="Script" uid="uid://dxbcfhaesyqhy" path="res://scripts/psuedo_physics_cable.gd" id="6_7t30t"] 10 | 11 | [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_yg1ph"] 12 | sky_horizon_color = Color(0.64625, 0.65575, 0.67075, 1) 13 | ground_horizon_color = Color(0.64625, 0.65575, 0.67075, 1) 14 | 15 | [sub_resource type="Sky" id="Sky_q2qms"] 16 | sky_material = SubResource("ProceduralSkyMaterial_yg1ph") 17 | 18 | [sub_resource type="Environment" id="Environment_anmqf"] 19 | background_mode = 2 20 | sky = SubResource("Sky_q2qms") 21 | tonemap_mode = 2 22 | glow_enabled = true 23 | 24 | [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_jhjag"] 25 | albedo_texture = ExtResource("1_edrna") 26 | uv1_triplanar = true 27 | 28 | [sub_resource type="SphereMesh" id="SphereMesh_kwb86"] 29 | radius = 0.1 30 | height = 0.2 31 | radial_segments = 6 32 | rings = 5 33 | 34 | [sub_resource type="SphereShape3D" id="SphereShape3D_7kvo4"] 35 | radius = 0.1 36 | 37 | [node name="Main" type="Node3D"] 38 | 39 | [node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] 40 | transform = Transform3D(-0.866023, -0.433016, 0.250001, 0, 0.499998, 0.866027, -0.500003, 0.749999, -0.43301, 0, 0, 0) 41 | shadow_enabled = true 42 | 43 | [node name="WorldEnvironment" type="WorldEnvironment" parent="."] 44 | environment = SubResource("Environment_anmqf") 45 | 46 | [node name="Ground" type="CSGBox3D" parent="."] 47 | use_collision = true 48 | size = Vector3(100, 1, 100) 49 | material = SubResource("StandardMaterial3D_jhjag") 50 | 51 | [node name="Player" parent="." instance=ExtResource("2_n8x4n")] 52 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.3, 0) 53 | 54 | [node name="DraggableCable" parent="." instance=ExtResource("5_1lv8e")] 55 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3, 1, -18) 56 | cable_length = 5.0 57 | cable_gravity_amp = 1.0 58 | cable_mesh = ExtResource("4_o6xl0") 59 | 60 | [node name="StationaryCable" parent="." node_paths=PackedStringArray("start_point", "end_point") instance=ExtResource("2_nc41p")] 61 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) 62 | start_point = NodePath("Pillar/Pillar3") 63 | end_point = NodePath("Pillar/Pillar2/Pillar4") 64 | cable_length = 8.0 65 | cable_gravity_amp = 3.0 66 | cable_mesh = ExtResource("4_o6xl0") 67 | 68 | [node name="Pillar" type="CSGBox3D" parent="StationaryCable"] 69 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6, 2, -27) 70 | use_collision = true 71 | size = Vector3(2, 3, 2) 72 | material = SubResource("StandardMaterial3D_jhjag") 73 | 74 | [node name="Pillar3" type="CSGBox3D" parent="StationaryCable/Pillar"] 75 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0.5, 0) 76 | use_collision = true 77 | size = Vector3(0.2, 1, 1) 78 | material = SubResource("StandardMaterial3D_jhjag") 79 | 80 | [node name="Pillar2" type="CSGBox3D" parent="StationaryCable/Pillar"] 81 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12, 0, 0) 82 | use_collision = true 83 | size = Vector3(2, 3, 2) 84 | material = SubResource("StandardMaterial3D_jhjag") 85 | 86 | [node name="Pillar4" type="CSGBox3D" parent="StationaryCable/Pillar/Pillar2"] 87 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.95, 0.5, 0) 88 | use_collision = true 89 | size = Vector3(0.3, 1, 1) 90 | material = SubResource("StandardMaterial3D_jhjag") 91 | 92 | [node name="HangingCable" parent="." node_paths=PackedStringArray("start_point", "end_point") groups=["Grabbable"] instance=ExtResource("2_nc41p")] 93 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) 94 | start_point = NodePath("HangingCable/Pillar3") 95 | end_point = NodePath("HangingCable/RigidBody3D") 96 | cable_length = 8.0 97 | cable_gravity_amp = 1.0 98 | cable_springiness = 40.0 99 | cable_mesh = ExtResource("4_o6xl0") 100 | 101 | [node name="HangingCable" type="CSGBox3D" parent="HangingCable"] 102 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 12, -17) 103 | use_collision = true 104 | size = Vector3(2, 3, 2) 105 | material = SubResource("StandardMaterial3D_jhjag") 106 | 107 | [node name="Pillar3" type="CSGBox3D" parent="HangingCable/HangingCable"] 108 | transform = Transform3D(-4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0, 1, 0, -1.5, 0) 109 | use_collision = true 110 | size = Vector3(0.2, 1, 1) 111 | material = SubResource("StandardMaterial3D_jhjag") 112 | 113 | [node name="RigidBody3D" type="RigidBody3D" parent="HangingCable/HangingCable" groups=["Grabbable"]] 114 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -5, 0) 115 | collision_layer = 4 116 | axis_lock_angular_x = true 117 | axis_lock_angular_y = true 118 | axis_lock_angular_z = true 119 | linear_damp = 1.0 120 | 121 | [node name="MeshInstance3D" type="MeshInstance3D" parent="HangingCable/HangingCable/RigidBody3D"] 122 | mesh = SubResource("SphereMesh_kwb86") 123 | 124 | [node name="CollisionShape3D" type="CollisionShape3D" parent="HangingCable/HangingCable/RigidBody3D"] 125 | shape = SubResource("SphereShape3D_7kvo4") 126 | 127 | [node name="Pillar" type="CSGBox3D" parent="."] 128 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6, 2, -8) 129 | use_collision = true 130 | size = Vector3(2, 3, 2) 131 | material = SubResource("StandardMaterial3D_jhjag") 132 | 133 | [node name="Pillar3" type="CSGBox3D" parent="Pillar"] 134 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0.5, 0) 135 | use_collision = true 136 | size = Vector3(0.2, 1, 1) 137 | material = SubResource("StandardMaterial3D_jhjag") 138 | 139 | [node name="Pillar2" type="CSGBox3D" parent="Pillar"] 140 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12, 0, 0) 141 | use_collision = true 142 | size = Vector3(2, 3, 2) 143 | material = SubResource("StandardMaterial3D_jhjag") 144 | 145 | [node name="Pillar4" type="CSGBox3D" parent="Pillar/Pillar2"] 146 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.95, -0.5, 0) 147 | use_collision = true 148 | size = Vector3(0.3, 1, 1) 149 | material = SubResource("StandardMaterial3D_jhjag") 150 | 151 | [node name="CableTerminal" parent="Pillar/Pillar2/Pillar4" instance=ExtResource("3_p56pu")] 152 | transform = Transform3D(-4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0, 1, -0.2, 0, 0) 153 | 154 | [node name="RigidBody3D" type="RigidBody3D" parent="." groups=["Cable", "Grabbable"]] 155 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.7, 2.4, -8) 156 | collision_layer = 12 157 | collision_mask = 13 158 | axis_lock_angular_x = true 159 | axis_lock_angular_y = true 160 | axis_lock_angular_z = true 161 | linear_damp = 1.0 162 | 163 | [node name="MeshInstance3D" type="MeshInstance3D" parent="RigidBody3D"] 164 | mesh = SubResource("SphereMesh_kwb86") 165 | 166 | [node name="CollisionShape3D" type="CollisionShape3D" parent="RigidBody3D"] 167 | shape = SubResource("SphereShape3D_7kvo4") 168 | 169 | [node name="PluggableCable" type="Node3D" parent="." node_paths=PackedStringArray("start_point", "end_point")] 170 | script = ExtResource("6_7t30t") 171 | start_point = NodePath("../Pillar/Pillar3") 172 | end_point = NodePath("../RigidBody3D") 173 | number_of_segments = 7 174 | cable_length = 10.0 175 | cable_gravity_amp = 1.0 176 | cable_mesh = ExtResource("4_o6xl0") 177 | -------------------------------------------------------------------------------- /CablePhysicsTutorial/scripts/player.gd: -------------------------------------------------------------------------------- 1 | extends CharacterBody3D 2 | # Child nodes 3 | @onready var head := $Head 4 | @onready var camera := $Head/Camera3D 5 | @onready var hand := $Head/Camera3D/Hand 6 | @onready var raycast := $Head/Camera3D/RayCast3D 7 | # this is the position grabbable objects are held at 8 | @onready var hold_point := $Head/Camera3D/Hand/HoldPosition 9 | # Player HUD 10 | @export var active = true 11 | @export_group("Player HUD") 12 | @export var HUD : Control 13 | @export var crosshair : Control 14 | @export var note_HUD : Control 15 | @export var note_text : Control 16 | # Editable values 17 | @export_group("Player Controller Settings") 18 | @export var walk_speed = 5.0 # m/s 19 | @export var hold_walk_amp = 0.5 # multiplier 20 | @export var sprint_walk_amp = 1.5 # multiplier 21 | @export var gravity_scale = 1.0 # multiplier 22 | var speed_modifier = 1.0 23 | @export_subgroup("Camera Settings") 24 | @export var mouse_sensitivity = 0.005 # radians/pixel 25 | @export var camera_min_angle = -80 # degrees 26 | @export var camera_max_angle = 80 # degrees 27 | # Fov variables 28 | @export var base_fov = 85.0 # degrees 29 | @export var fov_change = 1.5 # multiplier 30 | # Head bob variables 31 | @export var bob_freq = 2.0 # frequency 32 | @export var bob_amp = 0.08 # multiplier 33 | @export var bob_amp_hand = 0.03 # multiplier 34 | 35 | # Realtime variables 36 | var t_bob = 0.0 # headbob delta_t 37 | var a_bob = 0.0 # headbob current amplitude 38 | var speed = 0.0 # current m/s 39 | # Get the gravity from the project settings to be synced with RigidBody nodes. 40 | var gravity = ProjectSettings.get_setting("physics/3d/default_gravity") * gravity_scale 41 | var prev_velocity = 0.0 42 | var ray_col : Object 43 | var held_object : Object 44 | var holding_object = false 45 | @onready var defualt_hold_position = hold_point.position 46 | # Gamemode variables 47 | var displaying_note = false 48 | 49 | # FPS mouse camera control 50 | func _unhandled_input(event): 51 | # Mouse mode 2 = MOUSE_MODE_CAPTURED 52 | if event is InputEventMouseMotion and active: 53 | rotate_y(-event.relative.x * mouse_sensitivity) 54 | camera.rotate_x(-event.relative.y * mouse_sensitivity) 55 | camera.rotation.x = clamp(camera.rotation.x, deg_to_rad(camera_min_angle), deg_to_rad(camera_max_angle)) 56 | 57 | # need to move the held object every frame (not physics) or it looks jittery 58 | func _process(delta: float) -> void: 59 | # special logic for grabbing that needs to be here or it causes stutter 60 | if holding_object and held_object != null: 61 | crosshair._update_crosshair("closed") 62 | # if moving quickly don't tween! 63 | if velocity.length() < 1.0: 64 | held_object.global_transform.origin = lerp(held_object.global_transform.origin, hold_point.global_transform.origin, 12.0 * delta) 65 | else: 66 | held_object.global_transform.origin = hold_point.global_transform.origin 67 | # rotate object towards where camera is facing 68 | if Input.is_action_pressed("secondary_action"): 69 | held_object.global_rotation = lerp(held_object.global_rotation, hold_point.global_rotation, 15.0 * delta) 70 | 71 | # core logic for player controller 72 | func _physics_process(delta): 73 | # Update these HUD elements even when not active (sleeping) 74 | if displaying_note: 75 | # hide note 76 | if Input.is_action_just_pressed("secondary_action"): 77 | active = true 78 | displaying_note = false 79 | note_HUD.visible = false 80 | 81 | if active: 82 | if Input.is_action_just_pressed("primary_action"): 83 | Input.mouse_mode = Input.MOUSE_MODE_CAPTURED 84 | if Input.is_action_just_pressed("escape"): 85 | Input.mouse_mode = Input.MOUSE_MODE_VISIBLE 86 | HUD.visible = true 87 | # input movement direction, speed, and delta time 88 | _walk(_get_player_movement_input(), _sprint(speed), delta) 89 | _gravity(delta) 90 | # animate game feel 91 | _game_feel(delta) 92 | # grab items and interact with environment 93 | _handle_grabbing_and_interacting() 94 | # move character body 95 | move_and_slide() 96 | else: 97 | HUD.visible = false 98 | 99 | func _get_player_movement_input() -> Vector3: 100 | # Get the input direction and handle the movement/deceleration. 101 | # Turn inputs into a Vector3 102 | var input_dir = Input.get_vector("move_left", "move_right", "move_up", "move_down") 103 | # Use camera rotation combined with movement vector3 and convert it into a directional unit Vector3 104 | var direction = (head.global_transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized() 105 | return direction 106 | 107 | func _walk(direction: Vector3, current_speed: float, delta: float): 108 | if is_on_floor(): 109 | if direction: 110 | # if movement/inputs detected 111 | velocity.x = direction.x * current_speed 112 | velocity.z = direction.z * current_speed 113 | else: 114 | # no movement/inputs 115 | velocity.x = lerp(velocity.x, direction.x * current_speed, delta * 7.0) 116 | velocity.z = lerp(velocity.z, direction.z * current_speed, delta * 7.0) 117 | else: 118 | # when in air 119 | velocity.x = lerp(velocity.x, direction.x * current_speed, delta * 3.0) 120 | velocity.z = lerp(velocity.z, direction.z * current_speed, delta * 3.0) 121 | 122 | func _sprint(current_speed: float): 123 | if Input.is_action_pressed("sprint"): 124 | if holding_object: 125 | current_speed = walk_speed * sprint_walk_amp * hold_walk_amp * speed_modifier 126 | else: 127 | # sprint by taking the walk speed and multiplying it by the sprint amplitude 128 | current_speed = walk_speed * sprint_walk_amp * speed_modifier 129 | else: 130 | if holding_object: 131 | current_speed = walk_speed * hold_walk_amp * speed_modifier 132 | else: 133 | current_speed = walk_speed * speed_modifier 134 | return current_speed 135 | 136 | func _gravity(delta: float): 137 | # Add the gravity. 138 | if not is_on_floor(): 139 | velocity.y -= gravity * delta 140 | 141 | func _game_feel(delta: float): 142 | prev_velocity = velocity.y 143 | 144 | # Head bob amplitude 145 | a_bob = lerp(a_bob, Vector2(velocity.x, velocity.z).length() * float(is_on_floor()), delta * 6.0) 146 | # head bob delta time 147 | t_bob += delta * a_bob 148 | camera.transform.origin = _headbob(t_bob, bob_amp * a_bob/4) 149 | hand.transform.origin = _headbob(t_bob, bob_amp_hand * a_bob/4) 150 | 151 | # Adjust FOV proportionally by speed 152 | var velocity_clamped = clamp(velocity.length(), 0.5, walk_speed * sprint_walk_amp * 2) 153 | var target_fov = base_fov + fov_change * velocity_clamped 154 | # Smoothly change camera FOV 155 | camera.fov = lerp(camera.fov, target_fov, delta * 8.0) 156 | 157 | func _headbob(time, magnitude) -> Vector3: 158 | var pos = Vector3.ZERO 159 | # offset from local coordinates 160 | pos.y = sin(time * bob_freq) * magnitude 161 | pos.x = sin(time * bob_freq / 2) * magnitude 162 | return pos 163 | 164 | func _handle_grabbing_and_interacting(): 165 | if held_object == null: 166 | holding_object = false 167 | # Grab/Interact logic may clean this up later 168 | if raycast.is_colliding(): 169 | if head.global_position.distance_to(raycast.get_collision_point()) <= 1.0: 170 | hold_point.position.z = -head.global_position.distance_to(raycast.get_collision_point()) * 0.75 171 | clamp(hold_point.position.z, -1, -0.2) 172 | else : 173 | hold_point.position = defualt_hold_position 174 | if holding_object and (Input.is_action_just_pressed("primary_action") or Input.is_action_just_pressed("throw")) and held_object != null: 175 | _drop_or_throw_item(Input.is_action_just_pressed("throw")) 176 | 177 | ray_col = raycast.get_collider() 178 | if ray_col != null: 179 | if ray_col.is_in_group("Grabbable"): 180 | #update crosshair 181 | crosshair._update_crosshair("open") 182 | elif ray_col.is_in_group("Interactable"): 183 | #update crosshair 184 | crosshair._update_crosshair("point") 185 | elif holding_object == false: 186 | #update crosshair 187 | crosshair._update_crosshair("crosshair") 188 | if Input.is_action_just_pressed("primary_action"): 189 | if ray_col.is_in_group("Grabbable") and holding_object == false: 190 | # grab object 191 | holding_object = true 192 | held_object = raycast.get_collider() 193 | #update crosshair 194 | crosshair._update_crosshair("closed") 195 | #held_object.disable_mode = RigidBody3D.DISABLE_MODE_MAKE_STATIC 196 | held_object.set_collision_layer_value(3, false) 197 | held_object.freeze = false 198 | if ray_col.is_in_group("Interactable"): 199 | #press object 200 | ray_col._interact() 201 | #update crosshair 202 | crosshair._update_crosshair("closed") 203 | else: 204 | crosshair._update_crosshair("crosshair") 205 | 206 | func _drop_or_throw_item(throwing): 207 | if holding_object: 208 | # throw object towards the direction the camera is facing, throw proportionally to how fast the player is moving 209 | if throwing: 210 | # throw 211 | held_object.linear_velocity = (hold_point.global_position - global_position).normalized() * 5.0 212 | else: 213 | # drop 214 | held_object.linear_velocity = Vector3(0, 0, 0) 215 | held_object.set_angular_velocity(Vector3(0, 0, 0)) 216 | held_object.set_collision_layer_value(3, true) 217 | held_object.freeze = false 218 | # drop object 219 | holding_object = false 220 | # set held object to null 221 | held_object = null 222 | 223 | func _display_note(message_text): 224 | active = false 225 | displaying_note = true 226 | note_HUD.visible = true 227 | note_text.text = message_text 228 | 229 | func _display_popup(message_text): 230 | $Head/Camera3D/PlayerHUD/PopUpMessage._display_message(message_text) 231 | --------------------------------------------------------------------------------