{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":497570733,"defaultBranch":"main","name":"avian","ownerLogin":"Jondolf","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2022-05-29T11:28:38.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/57632562?v=4","public":true,"private":false,"isOrgOwned":false},"refInfo":{"name":"","listCacheKey":"v0:1725734731.0","currentOid":""},"activityList":{"items":[{"before":"43f328649d3a68bcc6ceb5cf40ddfb4a708cbf3a","after":"edb26f85896de232ec4c0cc4791f7a14ff77cf21","ref":"refs/heads/spatial-query-config","pushedAt":"2024-09-07T21:58:14.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"},"commit":{"message":"Make methods const","shortMessageHtmlLink":"Make methods const"}},{"before":"fb62066faf484b524149b15dd2d35b459ede8ec5","after":"43f328649d3a68bcc6ceb5cf40ddfb4a708cbf3a","ref":"refs/heads/spatial-query-config","pushedAt":"2024-09-07T20:43:59.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"},"commit":{"message":"Add constructors and helpers","shortMessageHtmlLink":"Add constructors and helpers"}},{"before":"36e441b7061dd14ed1888881892e3b59d5eb9a04","after":"fb62066faf484b524149b15dd2d35b459ede8ec5","ref":"refs/heads/spatial-query-config","pushedAt":"2024-09-07T19:08:53.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"},"commit":{"message":"Fix missing argument in docs","shortMessageHtmlLink":"Fix missing argument in docs"}},{"before":"855dd4ab9a364d734a77d74f3910d2e9f3cd4835","after":"36e441b7061dd14ed1888881892e3b59d5eb9a04","ref":"refs/heads/spatial-query-config","pushedAt":"2024-09-07T18:53:56.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"},"commit":{"message":"Rename `max_toi` variables to `max_distance`","shortMessageHtmlLink":"Rename max_toi variables to max_distance"}},{"before":null,"after":"855dd4ab9a364d734a77d74f3910d2e9f3cd4835","ref":"refs/heads/spatial-query-config","pushedAt":"2024-09-07T18:45:31.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"},"commit":{"message":"Change most \"time of impact\" to \"distance\", add missing config, improve docs","shortMessageHtmlLink":"Change most \"time of impact\" to \"distance\", add missing config, impro…"}},{"before":"2f83cc15bd804ad82ecd7e080e337d052d1c3472","after":"a5616dd194aecfef294d70ad9294d20ac68a49d4","ref":"refs/heads/main","pushedAt":"2024-09-07T11:12:38.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"},"commit":{"message":"Optimize `wake_on_collision_ended` when large number of collisions are occurring (#508)\n\n# Objective\r\n\r\n- With a large number of colliding bodies, I was seeing `wake_on_collision_ended` use almost as much time as `run_substep_schedule` in some cases\r\n- I narrowed the slowness down to evaluation of [this if condition](https://github.com/Jondolf/avian/blob/2f83cc15bd804ad82ecd7e080e337d052d1c3472/src/dynamics/sleeping/mod.rs#L280-L285)\r\n - Evaluating this once takes around 3μs on my laptop which isn't a huge deal on its own, but when there's 2500 colliders it started to add up to multiple milliseconds\r\n\r\n## Solution\r\n\r\n- In `wake_on_collision_ended`, skip the body of the first for loop (over `sleeping`) if the following both hold true:\r\n - The body does not already have a `Sleeping` component\r\n - TimeSleeping is 0.0\r\n\r\nI believe this is ok because the side-effects of that loop is to remove the `Sleeping` component and to reset `TimeSleeping` to zero, which is exactly the condition it now tests for. Therefore, if the entity is already in that state, there's no point in executing the [relatively costly if statement here](https://github.com/Jondolf/avian/blob/2f83cc15bd804ad82ecd7e080e337d052d1c3472/src/dynamics/sleeping/mod.rs#L280-L285) (as mentioned above).\r\n\r\n- Since it now also already knows if the `Sleeping` component is present, I gated the `commands.entity(entity).remove::();` calls so that it only adds that command if the component is present\r\n - This should save a few lookups on Bevy's end, but isn't strictly necessary for this PR\r\n\r\n- It may also be worth gating the `sleeping` query on `Without` but I wasn't sure how correct that was\r\n - If we think it's worth it, we could add that too so that bodies with sleeping disabled aren't even considered here\r\n\r\n## Results\r\n\r\nLarge numbers of colliders (here, 2500) showed a near 1000x improvement in execution time of `wake_on_collision_ended`, going from multiple milliseconds to a few microseconds when none of the bodies are sleeping:\r\n\"2500\"\r\n\r\n~~Performance regressed for small numbers of colliders (here, 100), however this is regression at the microseconds level (3.5μs to 15.5μs median), so I posit that this is a worthy tradeoff:~~\r\n(removed; I had the traces backwards)\r\n\r\n\r\n---\r\n\r\n## Changelog\r\n\r\n- SleepingPlugin's `wake_on_collision_ended` system\r\n - `sleeping` query now includes `Has`\r\n - first loop in system body skips anything that isn't already sleeping or about to sleep\r\n - don't remove `Sleeping` component if `Has`resolved to false","shortMessageHtmlLink":"Optimize wake_on_collision_ended when large number of collisions ar…"}},{"before":null,"after":"c79b54ab374e06b5c180433e1f01870f97ebc415","ref":"refs/heads/spatial-query-update-improvements","pushedAt":"2024-09-06T18:48:23.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"},"commit":{"message":"Add back incremental updates","shortMessageHtmlLink":"Add back incremental updates"}},{"before":"f1a98d96d240220d1345a785c563b3d84ad653a6","after":"2f83cc15bd804ad82ecd7e080e337d052d1c3472","ref":"refs/heads/main","pushedAt":"2024-09-04T09:29:09.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"},"commit":{"message":"add some #[must_use] to LockedAxes builder fns (#506)\n\n# Objective\r\n\r\n- Helps avoid my mistake of grabbing `LockedAxes` from a query and calling `unlock_rotation()` without reassigning to the component, failing to notice it returns self\r\n\r\n## Solution\r\n\r\n- Adds `#[must_use]` to builder-style fns that return Self, yielding this compiler warning:\r\n\r\n```\r\nwarning: unused return value of `avian2d::prelude::LockedAxes::unlock_rotation` that must be used\r\n --> crates/avian2d/examples/uncommitted_example_fixed_joint_2d.rs:89:17\r\n |\r\n89 | locked_axes.unlock_rotation();\r\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n |\r\n = note: `#[warn(unused_must_use)]` on by default\r\nhelp: use `let _ = ...` to ignore the resulting value\r\n |\r\n89 | let _ = locked_axes.unlock_rotation();\r\n | +++++++\r\n\r\n```","shortMessageHtmlLink":"add some #[must_use] to LockedAxes builder fns (#506)"}},{"before":"63580d38a50322a1f80ba55925094db47749d68e","after":"f1a98d96d240220d1345a785c563b3d84ad653a6","ref":"refs/heads/main","pushedAt":"2024-08-28T09:13:01.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"},"commit":{"message":"Fix missing feature flag (#502)\n\n# Objective\r\n\r\nWhile depending on Avian's `main` branch, running `cargo doc --all-features` fails on my crate when including a serialize feature\r\n\r\n## Solution\r\n\r\nFix bitflags not being serializable when serializing. Ideally, the CI should catch this.","shortMessageHtmlLink":"Fix missing feature flag (#502)"}},{"before":"470010f70ce2599306311421c00aa099858fd367","after":"56e28725e644c84f2cc07829581481372ed29a5f","ref":"refs/heads/rework-mass-properties","pushedAt":"2024-08-24T20:48:13.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"},"commit":{"message":"Fix tests","shortMessageHtmlLink":"Fix tests"}},{"before":"2cc4adc486668794e6b3806506fa10e69bea0dbd","after":"470010f70ce2599306311421c00aa099858fd367","ref":"refs/heads/rework-mass-properties","pushedAt":"2024-08-24T19:45:44.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"},"commit":{"message":"Defer mass invertion","shortMessageHtmlLink":"Defer mass invertion"}},{"before":"a5f5245c502ee2183033d12f308f38350f19c90e","after":"2cc4adc486668794e6b3806506fa10e69bea0dbd","ref":"refs/heads/rework-mass-properties","pushedAt":"2024-08-24T17:52:18.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"},"commit":{"message":"Add more helpers, debug assertions, and docs","shortMessageHtmlLink":"Add more helpers, debug assertions, and docs"}},{"before":"7dc9d7544f99afd3440a1d5a2f545e1bf1fa4cfc","after":"a5f5245c502ee2183033d12f308f38350f19c90e","ref":"refs/heads/rework-mass-properties","pushedAt":"2024-08-24T13:43:02.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"},"commit":{"message":"Make `inverse` field for `Mass` and `AngularInertia` private","shortMessageHtmlLink":"Make inverse field for Mass and AngularInertia private"}},{"before":"e4eca170b6ea57040dbb1d46bd7ba9062ef0e690","after":"7dc9d7544f99afd3440a1d5a2f545e1bf1fa4cfc","ref":"refs/heads/rework-mass-properties","pushedAt":"2024-08-24T09:54:33.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"},"commit":{"message":"Fix 3D angular inertia invertion","shortMessageHtmlLink":"Fix 3D angular inertia invertion"}},{"before":null,"after":"e4eca170b6ea57040dbb1d46bd7ba9062ef0e690","ref":"refs/heads/rework-mass-properties","pushedAt":"2024-08-23T19:56:14.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"},"commit":{"message":"Store inverses in `Mass` and `AngularInertia`","shortMessageHtmlLink":"Store inverses in Mass and AngularInertia"}},{"before":"1e4d7a7cff1dfaf2ba17f5d14629c72df5089515","after":"63580d38a50322a1f80ba55925094db47749d68e","ref":"refs/heads/main","pushedAt":"2024-08-23T16:08:57.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"},"commit":{"message":"Make contacts deterministic across Worlds (#480)\n\n# Objective\r\n\r\n- Fixes https://github.com/Jondolf/avian/issues/406\r\n\r\nWe noticed an issue where the Collisions were using the order of `Entity` directly to sort the pair of entities in a contact.\r\nThe issue is that for networking, there is no guarantee that the pair of Entities that are replicated between a Client and a Server world are in the same direction.\r\n\r\n\r\n## Solution\r\n\r\n- A solution is to keep using the `aabb.min.x` to order the two entities.\r\n- There are a couple concerns:\r\n - we want to make sure that when we match with previous entity pairs, this is not an issue.\r\n - it's not a problem for `previous_contacts` here: https://github.com/cBournhonesque/avian/blob/ac1fd0269e04f19f6892c62019cbb9ad9c19444e/src/collision/narrow_phase.rs#L549 because we check both directions\r\n - it is a problem for `match_manifolds` here: https://github.com/cBournhonesque/avian/blob/ac1fd0269e04f19f6892c62019cbb9ad9c19444e/src/collision/narrow_phase.rs#L571 which is why we modify the function\r\n - we want to make sure that this doesn't change how `CollisionStarted` and `CollisionEnded` events are sent, even if the entities change their order during a contact. **we should probably add a test for this**\r\n - it should be fined because those events are based on the `Contacts` struct that is generated during the narrow phase, and we made sure that contact matching still works independently of past entity order\r\n\r\n\r\n## Test\r\n\r\n- tested in lightyear that the simulations are now completely deterministic\r\n- probably need to test that contact matching works correctly, even if the `aabb.min.x` of the two entities gets swapped during the contact","shortMessageHtmlLink":"Make contacts deterministic across Worlds (#480)"}},{"before":"56d7c59d4f63945e27db7e6d024ad1d73c371b29","after":"1e4d7a7cff1dfaf2ba17f5d14629c72df5089515","ref":"refs/heads/main","pushedAt":"2024-08-23T14:40:46.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"},"commit":{"message":"Fix default schedule in `IntegratorPlugin::new` docs (#495)\n\n# Objective\r\n\r\nThe docs for `IntegratorPlugin::new` mention the wrong default schedule.\r\n\r\n## Solution\r\n\r\nFix the docs.","shortMessageHtmlLink":"Fix default schedule in IntegratorPlugin::new docs (#495)"}},{"before":null,"after":"33366e43cc3c0daf0aad5166a78034f2bf948f21","ref":"refs/heads/fix-integration-scheduling-docs","pushedAt":"2024-08-23T14:11:15.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"},"commit":{"message":"Fix default schedule in `IntegratorPlugin::new` docs","shortMessageHtmlLink":"Fix default schedule in IntegratorPlugin::new docs"}},{"before":"89b733e00c9ef50aaaade5b86f44d840dc80d21c","after":"56d7c59d4f63945e27db7e6d024ad1d73c371b29","ref":"refs/heads/main","pushedAt":"2024-08-23T12:06:04.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"},"commit":{"message":"Fix real part of quaternion derivatives (#488)\n\n* Fix real part of quaternion derivatives\r\n\r\nIn the Taylor expansion of a quaternion rotation, the first-order term should be purely imaginary. Seems like something got translated incorrectly in the change from xpbd to the current integrator\r\n\r\n* Update snapshot\r\n\r\n* Replace the first-order expansion of rotation with true rotation\r\n\r\nThis should improve the accuracy of rotations, in particular for faster rotation rates (> approx 0.5 radians per substep for a previous error of 5% in rotation rate)\r\n\r\n* Add a .renormalize() method on 3D Rotations\r\n\r\nWasn't sure of the best way to handle this:\r\n* `(self) -> Self` vs `(&mut self) -> ()`\r\n* impl on Rotation vs Quaternion (would be harder because it doesn't belong to Avian)\r\n\r\n* Simplify quaternion scalar multiply\r\n\r\nReplace the weird thing I was doing with something that should also work in f64\r\n\r\n* Update cube simulation snapshot","shortMessageHtmlLink":"Fix real part of quaternion derivatives (#488)"}},{"before":"d34bbc295e3c82d6f1a56da22503eccf117298a4","after":null,"ref":"refs/heads/explicit-default-layer","pushedAt":"2024-08-23T08:39:34.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"}},{"before":"e4437209ddcb30d50357a01d6dbbd31ccde9bf5e","after":"89b733e00c9ef50aaaade5b86f44d840dc80d21c","ref":"refs/heads/main","pushedAt":"2024-08-23T08:39:31.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"},"commit":{"message":"Make `PhysicsLayer` require a `#[default]` variant (#494)\n\n# Objective\r\n\r\n#476 changed collision layers to reserve the first bit for a default layer. However, for enums implementing `PhysicsLayer`, the default layer is rather implicit and potentially footgunny.\r\n\r\nThe default layer should ideally be more explicit.\r\n\r\n## Solution\r\n\r\nChange `PhysicsLayer` to require `Default` to be implemented. The proc macro orders the variants such that the layer set as the default is always the first bit.\r\n\r\nNote that `Default` *must* currently be derived instead of implemented manually, as the macro can only access the default variant if the `#[default]` attribute exists. An error is emitted if `#[default]` does not exist. If someone knows a way to make it work with the manual impl, let me know or consider opening a PR!\r\n\r\nI also added documentation for the `PhysicsLayer` macro, and improved error handling.\r\n\r\n---\r\n\r\n## Migration Guide\r\n\r\nEnums that derive `PhysicsLayer` must now also derive `Default` and specify a default layer using the `#[default]` attribute.\r\n\r\nBefore:\r\n\r\n```rust\r\n#[derive(PhysicsLayer)]\r\nenum GameLayer {\r\n Player,\r\n Enemy,\r\n Ground,\r\n}\r\n```\r\n\r\nAfter:\r\n\r\n```rust\r\n#[derive(PhysicsLayer, Default)]\r\nenum GameLayer {\r\n #[default]\r\n Default, // The name doesn't matter, but Default is used here for clarity\r\n Player,\r\n Enemy,\r\n Ground,\r\n}\r\n```\r\n\r\nThe default layer always has the bit value `0b0001` regardless of its order relative to the other variants.\r\n\r\n---------\r\n\r\nCo-authored-by: Jan Hohenheim ","shortMessageHtmlLink":"Make PhysicsLayer require a #[default] variant (#494)"}},{"before":"c5ae006c528073ab40fa15b8c1a7966c7f59f4f5","after":"d34bbc295e3c82d6f1a56da22503eccf117298a4","ref":"refs/heads/explicit-default-layer","pushedAt":"2024-08-22T23:36:25.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"},"commit":{"message":"Fix derives in test\n\nCo-authored-by: Jan Hohenheim ","shortMessageHtmlLink":"Fix derives in test"}},{"before":"6712f38f108261a770c1b3dbe4219b9de04d7799","after":"c5ae006c528073ab40fa15b8c1a7966c7f59f4f5","ref":"refs/heads/explicit-default-layer","pushedAt":"2024-08-22T23:16:37.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"},"commit":{"message":"Fix tests","shortMessageHtmlLink":"Fix tests"}},{"before":"adb6e278490967bac6415f459cefdc01b35d3354","after":"6712f38f108261a770c1b3dbe4219b9de04d7799","ref":"refs/heads/explicit-default-layer","pushedAt":"2024-08-22T21:32:24.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"},"commit":{"message":"Add comment","shortMessageHtmlLink":"Add comment"}},{"before":null,"after":"adb6e278490967bac6415f459cefdc01b35d3354","ref":"refs/heads/explicit-default-layer","pushedAt":"2024-08-22T21:03:33.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"},"commit":{"message":"Use `proc-macro-error`","shortMessageHtmlLink":"Use proc-macro-error"}},{"before":"571dcc668a5fa27537a33c0d1810f42d41a39894","after":"e4437209ddcb30d50357a01d6dbbd31ccde9bf5e","ref":"refs/heads/main","pushedAt":"2024-08-22T20:15:48.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"},"commit":{"message":"Use a single layer as the default membership instead of all. (#476)\n\n# Objective\r\nUsing `ALL` memberships requires a lot more effort to correctly use the layer system in gameplay, since interactions you wanted exclusive to one object now trigger on all defaulted objects as well.\r\n\r\nThis system is similar to those used in Box2d (one memberships, all filters) and Godot (one memberships, one filters), ~however the current system is the same as Rapier and Unity (all memberships, all filters).~ Unity is actually *exclusively* one membership, all filters with configurable filters in your project.\r\n\r\n## Solution\r\n- Reserve layer `1 << 0` for a default layer.\r\n~- Adjust `PhysicsLayer` derive to start at `1 << 1`.~ keep it the same, just document the change, this shouldn't actually change any behavior aside from other special interactions relying on the default being all membership (which should be few and might indicate a bug)\r\n\r\n## Additional Questions\r\n\r\n~- Should we use the default layer for filters as well?~\r\nNo, this doesn't make sense unless we swap to using || for the calculation and/or allow default configuration as it forbids some valid usecases like a default member not interacting with default.\r\n\r\n## Changelog\r\n- Reserved `1 << 0` as a default `LayerMask`, default `CollisionLayers` now only includes a single bit for membership, while including all bits for filters.\r\n\r\n## Migration Guide\r\n- Make sure your `1 << 0`/`1` collision layer is fine with being a default membership, you may need to add a `CollisionLayers` component to entities that have did not have one before to allow interactions to happen again. However this may also indicate a bug in logic.\r\n\r\n---------\r\n\r\nCo-authored-by: Joona Aalto ","shortMessageHtmlLink":"Use a single layer as the default membership instead of all. (#476)"}},{"before":"950fd61564be9e8f18343cc91d566ebdc6b205cc","after":"571dcc668a5fa27537a33c0d1810f42d41a39894","ref":"refs/heads/main","pushedAt":"2024-08-22T15:24:33.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"},"commit":{"message":"Only warn about 'overlapping at spawn' for dynamic bodies (#491)\n\n# Objective\r\n\r\nWhen spawning lots of overlapping static colliders (eg: walls) i see a lot of \"X and Y are overlapping at spawn, which can result in explosive behavior\".\r\n\r\nExplosive behaviour is only a concern for dynamic bodies.\r\n\r\n## Solution\r\n\r\nOnly show the warning if at least one of the bodies is dynamic.\r\n\r\n---\r\n\r\n## Changelog\r\n\r\n- \"Overlapping at spawn\" warning now only applies if at least one of rigid bodies is dynamic","shortMessageHtmlLink":"Only warn about 'overlapping at spawn' for dynamic bodies (#491)"}},{"before":"f2dec36955719a080918b935be026f8a6d7af3fc","after":"950fd61564be9e8f18343cc91d566ebdc6b205cc","ref":"refs/heads/main","pushedAt":"2024-08-21T16:45:33.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"},"commit":{"message":"Add predicate variants to all casts (#493)\n\n# Objective\r\n\r\n- `cast_ray` already has a sister function called `cast_ray_predicate` that returns the first hit that satisfies a predicate. The other casts do not.\r\n\r\n## Solution\r\n\r\n- Implement them. Note that I set the internal implementations of the non-predicate versions to use the predicate to reduce code duplication. The predicate does not introduce an extra branch since we already have an `if` for the filter in place, so this should be equivalent in performance.\r\n\r\n---\r\n\r\n## Changelog\r\n\r\n> This section is optional. If this was a trivial fix, or has no externally-visible impact, you can delete this section.\r\n\r\n- Added\r\n - `cast_ray` already has a sister function called `cast_ray_predicate` that returns the first hit that satisfies a predicate. Now, the other cast function have a similar analogue:\r\n\t - Added `cast_shape_predicate` for `cast_shape`\r\n\t - Added `project_point_predicate` for `project_point`","shortMessageHtmlLink":"Add predicate variants to all casts (#493)"}},{"before":"4d082a79fd30078e5b536ae23656f690091ae285","after":"f2dec36955719a080918b935be026f8a6d7af3fc","ref":"refs/heads/main","pushedAt":"2024-08-19T21:03:03.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"},"commit":{"message":"Fix locked axes in gyro torque (#486)\n\n# Objective\r\n\r\nI think that #485 wasn't quite the right fix for #474 - applying locked axes to an inertia tensor zeros out one or more of its rows, making the matrix singular - taking the inverse then results in a matrix that's all NaNs, making the delta_ang_vel also all NaNs, which causes the angular momentum to be unaffected by anything that timestep (including applied torques!).\r\n\r\nThe problem with the status quo ante seems to be that a similar thing happened - rather than trying to invert the (singular) locked inverse inertia, the calculated Jacobian was (near-)singular in a lot of cases when axes were locked, and depending on round-off errors you'd either get NaNs or just an outright cancellation of the angular velocity\r\n\r\n## Solution\r\n\r\nCalculating the delta-ω from gyroscopic effects with an unconstrained inertia matrix and *then* applying the locked axes to that angular velocity increment should be more reliable, and should avoid undesirable NaN values showing up","shortMessageHtmlLink":"Fix locked axes in gyro torque (#486)"}},{"before":null,"after":"df65fc5720b628619a335b84688e0c8cc908b7a5","ref":"refs/heads/collide-and-slide-wip","pushedAt":"2024-08-12T01:06:03.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"Jondolf","name":"Joona Aalto","path":"/Jondolf","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57632562?s=80&v=4"},"commit":{"message":"Remove unnecessary condition","shortMessageHtmlLink":"Remove unnecessary condition"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAEr9PAvgA","startCursor":null,"endCursor":null}},"title":"Activity · Jondolf/avian"}