-
-
Notifications
You must be signed in to change notification settings - Fork 3.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Should bevy-transform be two crates? #2758
Comments
You already posted this in #2187, but there wasnt realy any discussion. |
Oh, that's why I couldn't find it. I didn't think to check the discussion section. Sorry! Should this be closed, or is it useful to have it here as well? |
It sounds like you already have a fix...why not put up a PR? |
Because there's too much I don't know, and I'm afraid of doing something wrong.
In conclusion, I'm afraid to open a PR because I feel like I have no clue what I'm doing. I'd be willing to try, but I'm afraid I'll make a mistake. |
If you want to try your hands on it, there would probably be someone available to mentor you through your first PR 👍 . Don't hesitate to ask on Discord (or here if that's better for you). I'm slow to answer nowadays but you can ping me for that. Though, before starting on the PR to split transforms / hierarchy, it would probably be better to ask @cart to chime in on his point of view. |
I agree that the split could happen. I think its worth discussing what we "win" by splitting them out though. I expect compile times to be pretty much unaffected and in some ways splitting them out makes things harder (when both parents and transforms are needed we now need to pull in two crates instead of one). Given that most Bevy features will generally pull in both transform and hierarchy types, in most cases they will all be in the tree anyway (and they definitely will be when the Note that guidelines like "split it if it can be split out" and "dont split it unless you have a good reason to", taken to their extremes are both undesirable. The former results in a giant mesh of tiny crates that is difficult to navigate. The latter results in monolithic / unmodular crates. Its all a weird "art" based on taste :) |
My motivating use case is games that take place in curved space¹ ². What is Notice that this definition depends on the shape of space. So for curved space, I'm happy to reimplement the relevant But implementing my own There's also an aesthetic argument for the split. To me, the concept of a logical hierarchy of entities seems almost entirely unrelated to the concept of a symmetry of Euclidean space. Imagine the reverse scenario, where My particular use case could also be accommodated by reverting
¹ Also known as non-Euclidean space, though that term has often been misused to mean flat space with portals. |
Ok I'm sold on this. Feel free to put together a pr! |
Based on the discussion in my attempted PR, I have decided to close this issue. |
# Objective - Hierarchy tools are not just used for `Transform`: they are also used for scenes. - In the future there's interest in using them for other features, such as visiibility inheritance. - The fact that these tools are found in `bevy_transform` causes a great deal of user and developer confusion - Fixes bevyengine#2758. ## Solution - Split `bevy_transform` into two! - Make everything work again. Note that this is a very tightly scoped PR: I *know* there are code quality and docs issues that existed in bevy_transform that I've just moved around. We should fix those in a seperate PR and try to merge this ASAP to reduce the bitrot involved in splitting an entire crate. ## Frustrations The API around `GlobalTransform` is a mess: we have massive code and docs duplication, no link between the two types and no clear way to extend this to other forms of inheritance. In the medium-term, I feel pretty strongly that `GlobalTransform` should be replaced by something like `Inherited<Transform>`, which lives in `bevy_hierarchy`: - avoids code duplication - makes the inheritance pattern extensible - links the types at the type-level - allows us to remove all references to inheritance from `bevy_transform`, making it more useful as a standalone crate and cleaning up its docs ## Additional context - double-blessed by @cart in bevyengine#4141 (comment) and bevyengine#2758 (comment) - preparation for more advanced / cleaner hierarchy tools: go read bevyengine/rfcs#53 ! - originally attempted by @finegeometer in bevyengine#2789. It was a great idea, just needed more discussion! Co-authored-by: Carter Anderson <mcanders1@gmail.com>
# Objective - Hierarchy tools are not just used for `Transform`: they are also used for scenes. - In the future there's interest in using them for other features, such as visiibility inheritance. - The fact that these tools are found in `bevy_transform` causes a great deal of user and developer confusion - Fixes bevyengine#2758. ## Solution - Split `bevy_transform` into two! - Make everything work again. Note that this is a very tightly scoped PR: I *know* there are code quality and docs issues that existed in bevy_transform that I've just moved around. We should fix those in a seperate PR and try to merge this ASAP to reduce the bitrot involved in splitting an entire crate. ## Frustrations The API around `GlobalTransform` is a mess: we have massive code and docs duplication, no link between the two types and no clear way to extend this to other forms of inheritance. In the medium-term, I feel pretty strongly that `GlobalTransform` should be replaced by something like `Inherited<Transform>`, which lives in `bevy_hierarchy`: - avoids code duplication - makes the inheritance pattern extensible - links the types at the type-level - allows us to remove all references to inheritance from `bevy_transform`, making it more useful as a standalone crate and cleaning up its docs ## Additional context - double-blessed by @cart in bevyengine#4141 (comment) and bevyengine#2758 (comment) - preparation for more advanced / cleaner hierarchy tools: go read bevyengine/rfcs#53 ! - originally attempted by @finegeometer in bevyengine#2789. It was a great idea, just needed more discussion! Co-authored-by: Carter Anderson <mcanders1@gmail.com>
# Objective - Hierarchy tools are not just used for `Transform`: they are also used for scenes. - In the future there's interest in using them for other features, such as visiibility inheritance. - The fact that these tools are found in `bevy_transform` causes a great deal of user and developer confusion - Fixes #2758. ## Solution - Split `bevy_transform` into two! - Make everything work again. Note that this is a very tightly scoped PR: I *know* there are code quality and docs issues that existed in bevy_transform that I've just moved around. We should fix those in a seperate PR and try to merge this ASAP to reduce the bitrot involved in splitting an entire crate. ## Frustrations The API around `GlobalTransform` is a mess: we have massive code and docs duplication, no link between the two types and no clear way to extend this to other forms of inheritance. In the medium-term, I feel pretty strongly that `GlobalTransform` should be replaced by something like `Inherited<Transform>`, which lives in `bevy_hierarchy`: - avoids code duplication - makes the inheritance pattern extensible - links the types at the type-level - allows us to remove all references to inheritance from `bevy_transform`, making it more useful as a standalone crate and cleaning up its docs ## Additional context - double-blessed by @cart in bevyengine/bevy#4141 (comment) and bevyengine/bevy#2758 (comment) - preparation for more advanced / cleaner hierarchy tools: go read bevyengine/rfcs#53 ! - originally attempted by @finegeometer in #2789. It was a great idea, just needed more discussion! Co-authored-by: Carter Anderson <mcanders1@gmail.com>
I wrote this issue back in May, but seem to have forgotten to submit it?
Issue writeup below. I apologize if the details turn out to be somewhat out of date.
I'm sorry, none of the issue templates seemed to fit. "Feature Request" was the closest, but it didn't quite seem right.
Question
In
README.md
, you state that one of your design goals is to be modular; a user can choose to use only those features they need.Yet the crate
bevy_transform
seems to bundle two unrelated concerns:Transform
, roughly a similarity transformation of Euclidean space.Its description in
Cargo.toml
even admits this — "Provides hierarchy and transform functionality for Bevy Engine"! (Emphasis mine.)Why aren't these two separate crates, with the latter depending on the former?
Reason
I discovered this issue while exploring the possibility of using Bevy to make games that take place in curved space.
The concept of a parent-child hierarchy is still completely applicable. But
Transform
, at least as currently implemented in Bevy, is not.Details of Code Splitting
To ensure that this crate splitting would actually work, I tried it in a clone of the repository. Here are the results.
The crate
bevy_transform
was split into two:bevy_hierarchy
andbevy_transform
.bevy_hierarchy
contains these things:components::{children, parent}
.hierarchy
and its submodules, except for the test inhierarchy::hierarchy_maintenance
.It has dependencies
bevy_ecs
,bevy_reflect
,bevy_utils
, andsmallvec
.It does not need
bevy_app
orbevy_math
.bevy-transform
contains everything else:components::{transform, global_transform}
.transform_propagate_system
.hierarchy::hierarchy_maintenance
.It depends on the new
bevy-hierarchy
, as well asbevy_app
,bevy_ecs
,bevy_math
, andbevy_reflect
.It does not need
bevy_utils
orsmallvec
.A few changes were necessary to get
bevy_transform
to compile again:children.0.iter()
started failing, because the fieldchildren.0
is private, and is now defined in a different crate. This was easily fixable; just dochildren.iter()
(using theDeref
impl) instead.Finally, the dependent crates needed to be adjusted.
bevy_scene
depends onbevy_hierarchy
, but notbevy_transform
.bevy_gltf
andbevy_ui
depend on bothbevy_hierarchy
andbevy_transform
.bevy_internal
neededbevy_hierarchy
added to its reexports and prelude.bevy_pbr
,bevy_render
,bevy_sprite
, andbevy_text
, despite depending onbevy_transform
, seem to need no changes.cargo --test
passes. I have not done any performance testing.The text was updated successfully, but these errors were encountered: