bevy/release-content/migration-guides
Waridley 9e1e8bc1bc
Add angle-weighted smooth normals implementation (#18383) (#18552)
# Objective

Closes #18383 

## Solution

Given the 2 votes (me and @komadori ) for making angle-weighted normals
the default, I went ahead and did so, moving the face-weighted
implementation to the new `Mesh::compute_face_weighted_normals` method.
I factored out the common code between both into
`Mesh::compute_custom_smooth_normals`, which I went ahead and made
public to make it easier for users to add any other weighting methods
they might come up with.

If any of these decisions are undesirable for any reason, please let me
know and I will gladly make modifications.

## Testing & Showcase

I made a demo that exaggerates the difference at
[Waridley/bevy_smooth_normals_comparison](https://github.com/Waridley/bevy_smooth_normals_comparison).
Screenshots included in the readme.

Another way it could be demonstrated is via scaling a mesh along its
normals, like for generating outline meshes with inverted faces. I'd be
willing to make a demo for that as well.

I also edited and renamed the `compute_smooth_normals` tests to use
face-weighted normals, and added a new test for angle-weighted ones
which validates that all normals of a unit cube have each component
equal to `(±1 / √3) ± f32::EPSILON`.

## Migration Guide

#16050 already did not mention a migration guide, and it is not even in
a stable release yet. If this lands in a 0.16 RC, updating from RC1
would probably not require any changes in the vast majority of cases,
anyway. If someone really needs face-weighted normals, they can switch
to `.compute_face_weighted_normals()` or
`.with_computed_face_weighted_normals()`. And if for some reason they
really liked the old count-weighted implementation from 0.15, there is
an example in the docs for `compute_custom_smooth_normals`.
2025-07-17 19:23:30 +00:00
..
.gitkeep
anchor_is_removed_from_sprite.md Fix Anchor component inconsistancies (#18393) 2025-05-21 15:32:04 +00:00
animation_graph_no_more_asset_ids.md Prevent AnimationGraph from serializing AssetIds. (#19615) 2025-06-30 22:26:05 +00:00
bevy_render_reorganization.md Split bevy_camera out of bevy_render (#19949) 2025-07-04 23:31:16 +00:00
bevy_ui_render_crate.md bevy_ui_render crate (#18703) 2025-07-03 23:36:35 +00:00
camera_restructure.md Split Camera.hdr out into a new component (#18873) 2025-05-26 19:24:45 +00:00
check_change_ticks.md System::check_change_tick and similar methods take CheckChangeTicks (#19600) 2025-06-13 19:24:27 +00:00
chromatic_aberration_option.md Clean up several miscellaneous uses of weak_handle. (#19408) 2025-07-08 06:45:40 +00:00
component_entry.md Rename bevy_ecs::world::Entry to ComponentEntry (#19517) 2025-06-10 01:12:40 +00:00
component-lifecycle-module.md Rename Trigger to On (#19596) 2025-06-12 18:22:33 +00:00
composable_specialization.md Composable Pipeline Specialization (#17373) 2025-07-01 01:32:44 +00:00
compressed-image-saver.md add forgotten migration guide (#19800) 2025-06-24 11:19:20 +00:00
convert-coordinates.md Nudge users into migrating to new default glTF coordinate conversion (#19816) 2025-06-28 18:35:41 +00:00
dragenter_includes_dragged_entity.md don't filter dragged entity out of DragEnter events (#19179) 2025-05-26 17:56:54 +00:00
entities_apis.md Remove invalid entity locations (#19433) 2025-05-31 16:34:33 +00:00
entity_cloner_builder_split.md Unify filtering by id in EntityClonerBuilder (#19977) 2025-07-07 20:00:37 +00:00
entity_representation.md Fix new typos (#19562) 2025-06-09 22:55:14 +00:00
event_split.md Event Split: Event, EntityEvent, and BufferedEvent (#19647) 2025-06-15 16:46:34 +00:00
extract_fn_is_mut.md Run RenderStartup in/before extract instead of after it. (#19926) 2025-07-07 01:31:40 +00:00
extract-picking-plugin-members.md Extract members of PickingPlugin and PointerInputPlugin into new types (#19078) 2025-07-07 19:40:25 +00:00
extract-pointer-input-plugin-members.md Extract members of PickingPlugin and PointerInputPlugin into new types (#19078) 2025-07-07 19:40:25 +00:00
fullscreen_shader_resource.md Replace FULLSCREEN_SHADER_HANDLE with a FullscreenShader resource. (#19426) 2025-06-24 00:02:23 +00:00
generic-option-parameter.md Generic SystemParam impls for Option and Result (#18766) 2025-05-07 18:20:08 +00:00
handle_weak_replaced_with_handle_uuid.md Replace Handle::Weak with Handle::Uuid. (#19896) 2025-07-02 14:40:35 +00:00
interned-labels-cleanup.md Remove upcasting methods + Cleanup interned label code (#18984) 2025-05-26 15:38:12 +00:00
labeled_asset_scope_errors.md Allow returning an error from labeled_asset_scope. (#19449) 2025-06-04 00:00:32 +00:00
LightVisibilityClass_rename.md Rename light visibility class (#19986) 2025-07-06 19:04:30 +00:00
log-diagnostics-hash-set.md Expose LogDiagnosticsState (#19323) 2025-05-23 20:56:36 +00:00
map_set_apply.md Fix PartialReflect::apply for maps, remove get_at/_mut from Map trait (#19802) 2025-06-25 15:42:01 +00:00
merge_observerState_observer_single_component.md Merge ObserverState and Observer into single component (#18728) 2025-05-06 00:12:27 +00:00
mesh_compute_smooth_normals.md Add angle-weighted smooth normals implementation (#18383) (#18552) 2025-07-17 19:23:30 +00:00
Newtype_ScrollPosition.md Newtyped ScrollPosition (#19881) 2025-07-01 17:41:48 +00:00
observer_triggers.md Rename Trigger to On (#19596) 2025-06-12 18:22:33 +00:00
observers_may_not_be_exclusive.md Prevent exclusive systems from being used as observers (#19033) 2025-05-05 17:46:25 +00:00
overflowclipbox_default_is_now_paddingbox.md
per-world-error-handler.md Per world error handler (#18810) 2025-05-19 01:35:07 +00:00
picking_location_not_component.md fix(picking): Location is not a Component anymore. (#19306) 2025-05-22 01:33:01 +00:00
pointer_target.md Split BufferedEvent from Event (#20101) 2025-07-14 21:31:48 +00:00
query_items_borrow_from_query_state.md Remove 's lifetime from WorldQuery::Fetch (#19720) 2025-06-19 00:58:21 +00:00
reflect_asset_asset_ids.md Replace UntypedHandle from ReflectAsset with impl Into<UntypedAssetId>. (#19606) 2025-06-15 16:42:54 +00:00
relationship_set_risky.md EntityWorldMut methods do not automatically overwrite Relationship components (#19601) 2025-06-22 00:22:05 +00:00
relative_cursor_position_is_object_centered.md Fix some typos (#19788) 2025-06-23 22:32:46 +00:00
remove_archetype_component_id.md Remove ArchetypeComponentId and archetype_component_access (#19143) 2025-05-27 19:04:32 +00:00
remove_archetypecomponentid.md Stop using ArchetypeComponentId in the executor (#16885) 2025-05-05 22:52:44 +00:00
remove_bundle_register_required_components.md Remove Bundle::register_required_components (#19967) 2025-07-06 18:15:28 +00:00
remove_cosmic_text_reexports.md Remove re-exports of cosmic_text types (#19516) 2025-06-06 21:49:02 +00:00
remove_deprecated_batch_spawning.md Fix new typos (#19562) 2025-06-09 22:55:14 +00:00
remove_the_add_sub_impls_on_volume.md fix: Ensure linear volume subtraction does not go below zero (#19423) 2025-06-05 03:59:20 +00:00
rename_condition.md Rename Condition to SystemCondition` (#19328) 2025-05-22 15:50:19 +00:00
rename_pointer_events.md Rename some pointer events and components (#19574) 2025-06-10 21:57:28 +00:00
rename_spawn_gltf_material_name.md Add GltfMeshName component and Deref implementations (#19331) 2025-05-23 20:56:48 +00:00
rename_state_scoped.md Refactor state scoped events to match entities. (#19435) 2025-05-31 20:14:14 +00:00
rename_timer_paused_and_finished.md Rename Timer::finished and Timer::paused to is_finished and is_paused (#19386) 2025-05-27 22:24:18 +00:00
rename_transform_compute_matrix.md rename Transform::compute_matrix to to_matrix (#19646) 2025-06-18 05:37:25 +00:00
rename-justifytext.md Rename JustifyText to Justify (#19522) 2025-06-09 19:59:48 +00:00
render_graph_app_to_ext.md Allow calling add_render_graph_node on World. (#19912) 2025-07-02 14:56:18 +00:00
render_startup.md Use RenderStartup for all basic cases in bevy_core_pipeline. (#20002) 2025-07-15 07:10:43 +00:00
replace_non_send_resources.md Make GILRS and WINIT_WINDOWS public (#19575) 2025-06-12 20:05:00 +00:00
rework_merge_mesh_error.md Expand MergeMeshError to include IncompatiblePrimitiveTopology variant (#18561) 2025-07-16 20:37:58 +00:00
scalar-field-on-vector-space.md Improve Bevy's double-precision story for third-party crates (#19194) 2025-06-08 02:02:47 +00:00
schedule_cleanup.md Improve node encapsulation in ScheduleGraph (#20119) 2025-07-15 06:29:52 +00:00
send_event_rename.md Rename send_event and similar methods to write_event (#20017) 2025-07-07 22:05:16 +00:00
separate-border-colors.md separate border colors (#18682) 2025-05-26 16:57:13 +00:00
simple_executor_going_away.md deprecate SimpleExecutor (#18753) 2025-05-06 00:21:57 +00:00
specialized_ui_transform.md Specialized UI transform (#16615) 2025-06-09 19:05:49 +00:00
split-window.md Split CursorOptions off of Window (#19668) 2025-06-17 20:20:13 +00:00
stack_z_offsets_changes.md UI z-ordering fix (#19691) 2025-07-01 19:20:07 +00:00
state_scoped_entities_by_default.md Enable state scoped entities by default (#19354) 2025-05-26 20:26:41 +00:00
stop_storing_system_access.md Stop storing access for all systems (#19477) 2025-06-13 17:56:09 +00:00
sync_cell_utils.md refactor(utils): move SyncCell and SyncUnsafeCell to bevy_platform (#19305) 2025-05-27 04:57:26 +00:00
system_run_returns_result.md Have System::run_unsafe return Result. (#19145) 2025-07-03 21:48:09 +00:00
system_set_naming_convention.md Adopt consistent FooSystems naming convention for system sets (#18900) 2025-05-06 15:18:03 +00:00
taa_non_experimental.md Make TAA non-experimental, fixes (#18349) 2025-06-02 16:04:08 +00:00
textshadow_is_moved_to_widget_text_module.md Move TextShadow to text widget module (#19579) 2025-06-29 17:37:04 +00:00
UI_scroll_position_is_now_logical.md Improved UI scrolling support and bug fixes (#20093) 2025-07-15 17:33:04 +00:00
unified_system_state_flag.md Unify system state (#19506) 2025-06-08 18:18:43 +00:00
wgpu_25.md Ugrade to wgpu version 25.0 (#19563) 2025-06-26 19:41:47 +00:00
zstd.md add native zstd support (#19793) 2025-06-26 20:53:54 +00:00