Prefer UVec2 when working with texture dimensions#11698
Prefer UVec2 when working with texture dimensions#11698alice-i-cecile merged 2 commits intobevyengine:mainfrom
UVec2 when working with texture dimensions#11698Conversation
|
Is it worth keeping bevy/crates/bevy_render/src/texture/image.rs Lines 556 to 560 in 36804dc
|
e225a8b to
80e61f8
Compare
alice-i-cecile
left a comment
There was a problem hiding this comment.
This makes far more sense to me: if we're just converting them to integers at the end anyways we should store and accept these values as ints.
| pub size: Vec2, | ||
| pub size: UVec2, | ||
| /// The specific areas of the atlas where each texture can be found | ||
| pub textures: Vec<Rect>, |
There was a problem hiding this comment.
Might make sense to turn this into an URect?
There was a problem hiding this comment.
Good point, I'll give it a try and see if this causes conflicts anywhere.
As a side question: Is it a valid use case to specify fractional portions for the textures in a texture atlas? With URect I don't think it would be possible anymore. TextureAtlasLayout::from_grid is a similar story, now that I look at it.
There was a problem hiding this comment.
I don't think sub-pixel indexing is a use case needed in the texture atlas code from a quick skimming of it, and if a user need for some reason to do some fractional indexing, they can still convert from UVec2 to Vec2. To be consistent some similar changes would also be needed in TextureAtlasBuilder, but that can be done in another PR 🙂
There was a problem hiding this comment.
I adjusted the types in TextureAtlasLayout and TextureAtlasBuilder to use "u32" types (URect, etc.) as you suggested. Though, because of these changes I also had to update a bit more code than I would have like.
Interactions with guillotiere are also a bit odd because these types use i32 instead of u32. So theres a few as i32 here and there.
|
Going to wait on the URect changes; ping me (or add the Ready-For-Final-Review label) if that's done and it's been a while. |
b838d2e to
a81a2d1
Compare
|
I think I'm mostly done with my changes. Will rebase soon and probably finish it up this weekend (still have to test that I didn't break things). Also, I left |
|
CI failures are real: looks like you need to fix up some examples. |
|
Yup, I also think #11783 will cause additional conflicts (even though they're trivial to solve). I'd wait for that PR, since I think it's a less controversial change and could be merged relatively quickly. |
Head branch was pushed to by a user without write access
ca47717 to
ac0e492
Compare
ac0e492 to
ba5f0fe
Compare
|
Sorry for the longer than expected delay. I rebased onto main and verified that the 2D sprite examples have identical output compared to main. CI should also be good now. |
# Objective The physical width and height (pixels) of an image is always integers, but for `GpuImage` bevy currently stores them as `Vec2` (`f32`). Switching to `UVec2` makes this more consistent with the [underlying texture data](https://docs.rs/wgpu/latest/wgpu/struct.Extent3d.html). I'm not sure if this is worth the change in the surface level API. If not, feel free to close this PR. ## Solution - Replace uses of `Vec2` with `UVec2` when referring to texture dimensions. - Use integer types for the texture atlas dimensions and sections. [`Sprite::rect`](https://github.com/bevyengine/bevy/blob/a81a2d1da31cc2eebcd9d431ed2b73a678ce61e3/crates/bevy_sprite/src/sprite.rs#L29) remains unchanged, so manually specifying a sub-pixel region of an image is still possible. --- ## Changelog - `GpuImage` now stores its size as `UVec2` instead of `Vec2`. - Texture atlases store their size and sections as `UVec2` and `URect` respectively. - `UiImageSize` stores its size as `UVec2`. ## Migration Guide - Change floating point types (`Vec2`, `Rect`) to their respective unsigned integer versions (`UVec2`, `URect`) when using `GpuImage`, `TextureAtlasLayout`, `TextureAtlasBuilder`, `DynamicAtlasTextureBuilder` or `FontAtlas`.
# Objective The physical width and height (pixels) of an image is always integers, but for `GpuImage` bevy currently stores them as `Vec2` (`f32`). Switching to `UVec2` makes this more consistent with the [underlying texture data](https://docs.rs/wgpu/latest/wgpu/struct.Extent3d.html). I'm not sure if this is worth the change in the surface level API. If not, feel free to close this PR. ## Solution - Replace uses of `Vec2` with `UVec2` when referring to texture dimensions. - Use integer types for the texture atlas dimensions and sections. [`Sprite::rect`](https://github.com/bevyengine/bevy/blob/a81a2d1da31cc2eebcd9d431ed2b73a678ce61e3/crates/bevy_sprite/src/sprite.rs#L29) remains unchanged, so manually specifying a sub-pixel region of an image is still possible. --- ## Changelog - `GpuImage` now stores its size as `UVec2` instead of `Vec2`. - Texture atlases store their size and sections as `UVec2` and `URect` respectively. - `UiImageSize` stores its size as `UVec2`. ## Migration Guide - Change floating point types (`Vec2`, `Rect`) to their respective unsigned integer versions (`UVec2`, `URect`) when using `GpuImage`, `TextureAtlasLayout`, `TextureAtlasBuilder`, `DynamicAtlasTextureBuilder` or `FontAtlas`.
[11698](bevyengine/bevy#11698) changed `GpuImage::size` to `UVec2`. Right above this, `Extent3d` does the same thing, so I'm taking a small leap and assuming can `as`.
* Update to 0.14.0-rc.2 * [12997](bevyengine/bevy#12997): rename `multi-threaded` to `multi_threaded` * RenderAssets<Image> is now RenderAssets<GpuImage> Implemented in [12827](bevyengine/bevy#12827) * FloatOrd is now in bevy_math implemented in [12732](bevyengine/bevy#12732) * convert Transparent2d::dynamic_offset to extra_index [12889](bevyengine/bevy#12889) Gpu Frustum Culling removed the dynamic_offset of Transparent2d and it became `extra_index` with the special value `PhaseItemExtraIndex::NONE`, which indicates the `None` that was here previously * RenderPhase<Transparent2d> -> ViewSortedRenderPhases<Transparent2d> [12453](https://github.com/StarArawn/bevy_ecs_tilemap/pull/bevyengine/bevy#12453): Render phases are now binned or sorted. Following the changes in the `mesh2d_manual` [example](https://github.com/bevyengine/bevy/blob/ecdd1624f302c5f71aaed95b0984cbbecf8880b7/examples/2d/mesh2d_manual.rs#L357-L358): use the `ViewSortedRenderPhases` resource. * get_sub_app_mut is now an Option in [9202](https://github.com/StarArawn/bevy_ecs_tilemap/pull/bevyengine/bevy/pull/9202) SubApp access has changed * GpuImage::size f32 -> u32 via UVec2 [11698](bevyengine/bevy#11698) changed `GpuImage::size` to `UVec2`. Right above this, `Extent3d` does the same thing, so I'm taking a small leap and assuming can `as`. * GpuMesh::primitive_topology -> key_bits/BaseMeshPipeline [12791](bevyengine/bevy#12791) the `primitive_topology` field on `GpuMesh` was removed in favor of `key_bits` which can be constructed using `BaseMeshPipeline::from_primitive_topology` * RenderChunk2d::prepare requires &mut MeshVertexBufferLayouts now [12216](bevyengine/bevy#12216) introduced an argument `&mut MeshVertexBufferLayouts` to `get_mesh_vertex_buffer_layout`, which bevy_ecs_tilemap calls in `RenderChunk2d::prepare` * into_linear_f32 -> color.0.linear().to_f32_array(), [12163](bevyengine/bevy#12163) bevy_color was created and Color handling has changed. Specifically Color::as_linear_rgba_f32 has been removed. LinearRgba is now its own type that can be accessed via [`linear()`](https://docs.rs/bevy/0.14.0-rc.2/bevy/color/enum.Color.html#method.linear) and then converted. * Must specify type of VisibleEntities when accessing [12582](bevyengine/bevy#12582) divided `VisibleEntities` into separate lists. So now we have to specify which kind of entity we want. I think we want the Mesh here, and I think we can get rid of the `.index` calls on Entity since Entity [already compares bits](https://docs.rs/bevy_ecs/0.14.0-rc.2/src/bevy_ecs/entity/mod.rs.html#173) for optimized codegen purposes. Waiting to do that until the other changes are in though so as to not change functionality until post-upgrade. * app.world access is functions now - [9202](bevyengine/bevy#9202) changed world access to functions. [relevent line](https://github.com/bevyengine/bevy/pull/9202/files#diff-b2fba3a0c86e496085ce7f0e3f1de5960cb754c7d215ed0f087aa556e529f97fR640) - This also surfaced [12655](bevyengine/bevy#12655) which removed `Into<AssetId<T>>` for `Handle<T>`. using a reference or .id() is the solution here. * We don't need `World::cell`, and it doesn't exist anymore In [12551](bevyengine/bevy#12551) `WorldCell` was removed. ...but it turns out we don't need it or its replacement anyway. * examples error out unless this bevy bug is addressed with these features being added bevyengine/bevy#13728 * check_visibility is required for the entity that is renderable As a result of [12582](bevyengine/bevy#12582) `check_visibility` must be implemented for the "renderable" tilemap entities. Doing this is trivial by taking advantage of the existing `check_visibility` type arguments, which accept a [`QF: QueryFilter + 'static`](https://docs.rs/bevy/0.14.0-rc.2/bevy/render/view/fn.check_visibility.html). The same `QueryFilter`` is used when checking `VisibleEntities`. I've chosen `With<TilemapRenderSettings` because presumably if the entity doesn't have a `TilemapRenderSettings` then it will not be rendering, but this could be as sophisticated or simple as we want. For example `WithLight` is currently implemented as ```rust pub type WithLight = Or<(With<PointLight>, With<SpotLight>, With<DirectionalLight>)>; ``` * view.view_proj -> view.clip_from_world [13289](bevyengine/bevy#13489) introduced matrix naming changes, including `view_proj` which becomes `clip_from_world` * color changes to make tests runnable * clippy fix * Update Cargo.toml Co-authored-by: Rob Parrett <robparrett@gmail.com> * Update Cargo.toml Co-authored-by: Rob Parrett <robparrett@gmail.com> * final clippy fixes * Update Cargo.toml Co-authored-by: Rob Parrett <robparrett@gmail.com> * Simplify async loading in ldtk/tiled helpers See Bevy #12550 * remove second allow lint * rc.3 bump * bump version for major release * remove unused features --------- Co-authored-by: Rob Parrett <robparrett@gmail.com>
Objective
The physical width and height (pixels) of an image is always integers, but for
GpuImagebevy currently stores them asVec2(f32). Switching toUVec2makes this more consistent with the underlying texture data.I'm not sure if this is worth the change in the surface level API. If not, feel free to close this PR.
Solution
Vec2withUVec2when referring to texture dimensions.Sprite::rectremains unchanged, so manually specifying a sub-pixel region of an image is still possible.Changelog
GpuImagenow stores its size asUVec2instead ofVec2.UVec2andURectrespectively.UiImageSizestores its size asUVec2.Migration Guide
Vec2,Rect) to their respective unsigned integer versions (UVec2,URect) when usingGpuImage,TextureAtlasLayout,TextureAtlasBuilder,DynamicAtlasTextureBuilderorFontAtlas.