├── 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 |
--------------------------------------------------------------------------------
/CablePhysicsTutorial/textures/placeholders/hand_point.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/CablePhysicsTutorial/textures/placeholders/hand_open.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 | [](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 |
--------------------------------------------------------------------------------