Replace per UV map selection with a single UV selection for all UV's.
This uses the same data as UV sync select, meaning that it's no longer
possible to keep a different selection when sync-select is disabled.
There is a minor improvement to functionality - previously not possible
to de-select a single face surrounding by selected faces.
Now this is possible because true face selection is supported.
The selection from the active UV-map is converted to use the shared
selection data.
Ref !147523
Co-authored-by: Hans Goudey <hans@blender.org>
Move the selection flag for pose bones, from the (edit)bone to the
pose bone.
Previously having multiple instances of armatures in pose mode at the
same time caused issues because selecting a pose bone on one armature
would automatically select it on all instances of it.
This is now fixed since the selection state is stored on the pose bone
(Object level) Doing so breaks API compatibility with 4.5 since the
RNA property on the Bone no longer affects the pose bone. Instead,
there is a new property on the pose bone for that.
Due to this change, some runtime flags for the transform system also
had to be moved to the pose bone. This is due to the fact that these
flags are used by the transform system to pass information between
functions. If we keep the flag at the bone level, this wouldn't work
with armature instances. See `bPoseChannelRuntimeFlag`
Fixes#117892
Pull Request: https://projects.blender.org/blender/blender/pulls/146102
Similar to 9b5f23c7a3
This commit updates the remaining three non-trivial preset curve types:
* CURVE_PRESET_ROUND - approximating `sqrtf(2x - x^2)`
* CURVE_PRESET_ROOT - approximating `sqrtf(x)`
* CURVE_PRESET_SHARP - approximating x^2
Like in the above commit, this change only affects the defined presets,
but does not change any existing curves in any files.
Related to #145208
Pull Request: https://projects.blender.org/blender/blender/pulls/147012
Adding support for packed IDs in the PartialWriteContext was completely
missed in initial work...
This somewhat complexifies the handling of libraries in
PartialWriteContext, as packed IDs need to be handled in specific ways.
It also exposes `bke::library::ensure_archive_library` as a public function,
to avoid duplicating this complex logic of finding or creating a new
archive library for a given ID.
Finally, prevent attempts to copy a packed ID for now, as pasting them
is not supported (linking/appending these directly is not supported).
Pull Request: https://projects.blender.org/blender/blender/pulls/147468
Add a new constraint called "Geometry Attribute", which directly
samples vector, quaternion, or 4x4 matrix attributes from geometry and
applies these to an object's or bone's transform.
This can be used to transfer data generated by geometry nodes to the
object or bone level. By default the constraint will sample a vector
on the vertex domain. The default attribute is `position` for
simplicity, but the attribute value does not have to have anything to
do with neither the transform of the geometry object nor the geometry
itself.
Pull Request: https://projects.blender.org/blender/blender/pulls/136477
Support propagation of attributes from the original mesh edges when
generating mesh edges. This implies both deduplication of original edges
and creation of new edges needed for faces. While original edges are not
propagated, attributes are still propagated if an edge was part of any
face. To make original edges distinct we simply choose the first one to
be a value source.
One important part of this patch is definition of invariant of the
mesh on input:
1. All edges must be valid (their vertices must be correct). The
algorithm only deal with duplicate and implicit edges.
2. There is no way to provide info about corner edges attribute (whether
it'svalid or not). If all input edges are valid and there are no new
edges then we could skip re-generation of already valid corner edge
indices. But for now we always do.
The new implementation depends on input mesh invariant so this drops an
old patch to fix hard crash related with duplicate edge vertices. New
code will crash independently to such patch. Hopefully there must be
no problems after #138633.
The changes don't affect performance much. If anything, in some cases
the edge calculation can become a few percent faster. See the PR for
more performance testing details.
Pull Request: https://projects.blender.org/blender/blender/pulls/132492
Fixed the two most obvious entry points (actually making a linked ID
local, and making a local copy of linked data), there may be more
unusual ways to do that still hidden in the code though.
Also added a couple of 'sanity asserts' to the writefile code regarding
cases where IDs are expected to have a null deep_hash data.
This showed an error while it actually worked as expected. The issue was that it
attempted to pack the entires named `.` and `..`, which have special meaning.
Filtering those out quiets the error message.
Pull Request: https://projects.blender.org/blender/blender/pulls/147455
The function name `for_each_callback` is ambigous (what are we iterating?)
and also doesn't align with the naming of other "for each" functions in Blender
which usually are named `foreach_<thing>` like `IndexMask::foreach_index`
or `animrig::foreach_fcurve_in_action` etc.
Pull Request: https://projects.blender.org/blender/blender/pulls/147440
Any keyframes for properties inside the compositor node
trees that were used by strips did not show up in the dopesheet.
This was because the compositor tree is its own ID and needs to
be manually added by the dopesheet code.
This fix adds the node trees to the filtering code in
`animdata_filter_dopesheet_scene`.
Note that the dopesheet still uses the active scene as its context.
So this means that if the sequencer scene differes from the active
scene, the animation data from the sequencer scene will not
be shown. This is currently expected behavior.
Pull Request: https://projects.blender.org/blender/blender/pulls/147301
When there was no other data written in the CustomData for edges
or faces, the layers pointer would be null, and even though the layer
array we write isn't empty, the writing would be skipped. The fix
is just to make sure the layer pointer isn't null.
Pull Request: https://projects.blender.org/blender/blender/pulls/147411
Seems to have been introduced by 1104c69a0e.
In `BKE_paint_copy` the `src->runtime` can be `nullptr` in some cases.
This adds a check to make sure to only copy the settings
when `src->runtime` exists.
Pull Request: https://projects.blender.org/blender/blender/pulls/147304
This was copying the toolsettings from `scene_dst` which, confusingly,
will work because the ID got shallow copied before running
`scene_copy_data` so the pointer to `scene_dst->toolsettings` is the
same as `scene_src->toolsettings`.
This changes that line to copy from `scene_src->toolsettings` to
`scene_dst->toolsettings` to avoid any future confusion.
Note that this commit keeps the same behavior as before this commit,
except for the newly introduced vector of archived libraries, which is
reset to empty. This behavior may have to be further tweaked still.
Root of the issue was from original commit enabling Library ID copying
(87a4c0d3a8), but the later move to an allocated runtime pointer
using a copy constructor in 87a4c0d3a8 made this behavior even
more confusing/hidden.
In general, what is re-used/copied in runtime data should be explicit,
such that by default new data can be assumed reset to their default
value there in the copy ID.
This node gives access to the integer coordinates of the the voxel that is
currently being evaluated by a field. It can be used together with e.g. the
Integer Math and Sample Grid Index node to sample neighboring voxel values.
Previously, one could only get the position of the voxel in object space.
Since sometimes field are evaluated on tiles of many voxels, just having the
voxel coordinates can be misleading. Therefore, this same node also outputs
whether it is a tile and the extent of the tile (which is 1 for normal voxels).
Pull Request: https://projects.blender.org/blender/blender/pulls/147268
Fixes link drawing for grids and single values connected through a Simulation
Zone. They are currently drawn as dashed field links and this PR adds
Simulation Zone to special link inference that is currently used for
Repeat Zone.
Pull Request: https://projects.blender.org/blender/blender/pulls/147035
Add sound pitch correction functionality, so that retimed sound strips
can preserve their original pitch.
This has been implemented as a GSoC 2025 project. Actual pitch
correction is done with Rubberband library, which has been already
included into Blender 5.0 library builds; and then most of the other
code has been in Audaspace, which was already updated within Blender
tree earlier.
So this PR just flips on Rubberband build option, and adds the
checkbox to VSE sound strips for pitch correction (on by default for
newly created sound strips). Pitch correction works with both
simple whole-strip retiming, as well as more complex retiming setups
where different parts of the strip use different speeds.
Co-authored-by: Aras Pranckevicius <aras@nesnausk.org>
Pull Request: https://projects.blender.org/blender/blender/pulls/143347
Use the same rules as the realize instances node to make sure that
free and tangent-space custom normals aren't joined together with
implicit conversions and that there is as little data loss as possible
when joining combinations of no custom normals, free normals, etc.
Pull Request: https://projects.blender.org/blender/blender/pulls/147241
Instead of modifying the active mesh in place, which means we can't
use the size of its data arrays when copying its data, and its caches
are immediately invalidated, copy data to a separate out-of-main
result mesh first. The only downside is that for a moment during
the operator the shape key array sizes will be out of sync with the
mesh size.
Also the custom data for multires layers wasn't copied properly
after the recent refactor that rewrote this code. Take the opportunity
to fix that too.
The motivation for this change is an improvement to copy different
kinds of custom normals properly to the joined mesh, which never
worked since free custom normals were introduced.
This contains a few changes to the expected results in the tests.
Those are edge cases, and the new results make more sense.
Add two common building blocks for volume-grid workflows.
- **Voxelize** turns all active tiles into fully dense voxels. For fog
volumes, this will mean the "inside" sparse tiles will become
individually adjustable voxel values.
- **Prune** is the opposite action as voxelize. It can be important for
certain workflows when large regions of constant values are created.
The node can collapsed those regions into more efficient tiles or
inner nodes. There are a few modes which are each useful for
different use cases.
Pull Request: https://projects.blender.org/blender/blender/pulls/147148
Currently, the 'Reset Curve' button, corresponding to the
`BKE_curvemap_reset` function, converts a predefined negative slope
curve to a positive slope by inverting the order of y axis points. This
has the implicit dependency on these points being at inverse x
positions. For most preset curves, this works well, but for the round
curve, which has points at 0, 0.5, 0.86, and 1, this condition does not
hold true.
To fix this, take the inverted x value for a given control point
instead of the raw value. For the above example this means that the
round curve now has x values at 0, 0.14, 0.5, and 1.
Pull Request: https://projects.blender.org/blender/blender/pulls/147008
Code would early-return on failure, forgetting to free the xxhash state.
Use the `BLI_SCOPED_DEFER` util to ensure the state is always properly freed
when it gets out of scope.
Pull Request: https://projects.blender.org/blender/blender/pulls/147189
This adds support for showing various stats of volume grids in the spreadsheet:
* Extent: Number of voxels in each direction of the bounding box of the grid.
* Voxels: Total number of active voxels in the grid. This includes all voxels
which are stored in tiles (e.g. one leaf tile contains 512 voxels).
* Leaf Voxels: Number of active voxels stored in leaf nodes. This does not
contain any voxels that are part of tiles.
* Tiles: Number of active tiles in the grid.
* Size: Estimated size of the volume grid in memory.
All these stats are cached on the volume grid now. A new `tag_tree_changed`
method has been added to invalidate the cache. Computing these stats is not
cheap (but not more than a few ms even for large grids). That mainly means that
we can't do it for socket inspection because that would cause too much overhead.
However, doing it just for the grids that are currently visible in the
spreadsheet seems fine and useful.
This also adds some general improvements to the spreadsheet:
* Support `int64_t` and `int3` columns.
* Draw ints with thousand separators.
* Support showing ints as number of bytes such as `23 MB`.
Pull Request: https://projects.blender.org/blender/blender/pulls/147191
`append and reuse` is chosen as default in DNA but this enumpropertyitem
isn't added to the array when `Non data block packing` is disabled in
Developer tools (see `rna_preference_asset_libray_import_method_itemf`).
To fix this, change default in DNA to `ASSET_IMPORT_PACK`. In case of
"non packing", change import_method inside `asset_library_add()`
function. Also introduce `rna_preference_asset_libray_import_method_default`
so that "reset to default value" operator works correctly.
Pull Request: https://projects.blender.org/blender/blender/pulls/147104
The purpose of this node is to create a grid with new voxel values on
the same grid topology as an existing grid. The new values are the
result of field evaluation. Multiple grids can be created at the same
time, so that intermediate results used for multiple grids can be
efficiently reused during evaluation. This is more efficient than the
"Volume Cube" node, for instance, because the output grid shares the
sparseness of the input topology grid.
Pull Request: https://projects.blender.org/blender/blender/pulls/147074
The zone add operator necessarily has to add the input and output nodes
separately one at a time. After the first node is added a tree update is
executed, but the zone is incomplete and the runtime update will temporarily
remove all zones until the second node is added. Using zone lookup without
checking the pointer will crash in this state.
Pull Request: https://projects.blender.org/blender/blender/pulls/147131
The motivation is to keep backward compatibility after deprecating
`material.use_nodes()` and `world.use_nodes`. For example the
following script would behave the same way in 4.5 and 5.0:
```python
mat = bpy.data.materials.new("My new mat")
mat.use_nodes = True
```
Pull Request: https://projects.blender.org/blender/blender/pulls/147052
Similar to 327a1925cf
* Renames `strength_curve` to `curve_distance_falloff`
* Renames `curve_preset` to `curve_distance_falloff_preset`
These changes are done for consistency with the other concepts in the
other paint modes.
Pull Request: https://projects.blender.org/blender/blender/pulls/147071
The Node Wrangler addon has a _Reset Nodes_ operator that can remove the input
node of a node zone. This crashes in reference set updates because the code
expects valid input/output node pairs in each zone.
The fix is two-fold:
1. Finding zones for the runtime now returns an empty result to ensure no
invalid node pointers are being accessed. This should not happen in practice,
all operators should make sure zone relationships are not broken.
2. The node wrangler addon is updated to ignore all zone types, including the
newer repeat, closure, and for-each-element zones. The type filtering was
outdated and now uses the `bl_idname` consistently.
Pull Request: https://projects.blender.org/blender/blender/pulls/147028
Fix: correctly update Actions when renaming/re-typing a custom property
When renaming a custom property on a data-block, only update the
animation in a slot for that data-block. Previously all F-Curves were
updated, even when they were meant for other data-blocks.
This also handles the cases where the type of a custom property is
changed, and not just its name.
This is part of #146586
Pull Request: https://projects.blender.org/blender/blender/pulls/146979
The "id" attribute was built-in on curves (point domain), mesh (point domain)
and instances, but not on e.g. point clouds. This mismatch causes issues because
of the special rules regarding built-in attribute propagation. Furthermore, an
implication of this was that the id attribute had to be an integer attribute on
a specific domain, which is not always ideal.
This patch turns the id attribute into a normal generic attribute, except that
some nodes internally modify this attribute in special ways. This may cause some
compatibility breakage in rare cases, but that can generally be easily fixed by
either removing the id attribute or setting it explicitly on the right domain. I
can't think if a feasible way to avoid this unfortunately.
The internal special cases for the id attributes are generally skipped unless
the attribute is an integer attribute on the point/instance domain.
Pull Request: https://projects.blender.org/blender/blender/pulls/146941
Built-in nodes already used the functionality to hide the input labels in a few
situations. However, this functionality was not exposed for node groups before.
It required some refactoring to get the semantics of the flag right. The tricky
aspect is that "Hide Label" would be an incorrect name, because the label is
still shown under various circumstances. Instead, the flag merely indicates that
drawing code may skip drawing the label.
This adds a new "Optional Label" input for node group inputs. Other names are
possible like "Requires Label" which would be the inverse.
Overall the implementation is pretty straight forward after
1f489ea31a,
469a70dba9 and
f79896f5b9.
Pull Request: https://projects.blender.org/blender/blender/pulls/146939
This implements the Menu Switch node in shader nodes. It's the same node that is
used in Geometry Nodes and the Compositor.
The Menu Switch node is purely handled during preprocessing and thus builds on
top of #141936. Hence, it's input has to be a single value, just like the
iteration count for repeat zones. This limitation can be lifted in the future,
but currently there is no way to produce a non-single menu value in shader
nodes. This will become possible if other Switch nodes are added though.
Pull Request: https://projects.blender.org/blender/blender/pulls/146896
Current approach for computing the curve tangent approximations using
the average of the sum of the normalized segment direction vectors
suffers from catastrophic cancellation as the angle between the segments
approach 0°, with increasingly large error in resulting tangent.
Improving current behavior by conditionally computing the tangent using
the cross product to rotate the difference around the orthogonal axis
show a significant improvement for small angles. For segments in an axis
aligned plane, additional errors from computing the cross product is
avoided as terms cancel out. When the rotation axis is not axis aligned,
the method still shows a constant improvement for angles smaller
than ~45°.
Changes improves behavior for cases such as #145558.
For more information see https://projects.blender.org/blender/blender/pulls/146332.
Pull Request: https://projects.blender.org/blender/blender/pulls/146332
Attribute writer creation can fail in cases where a built-in attribute exists
and prevents arbitrary name/type/domain combinations. In those cases the
attribute should just be skipped.
Pull Request: https://projects.blender.org/blender/blender/pulls/146976
Deletion of NTree IDs through custom code path using
`blender::bke::node_tree_free_tree` is fully by-passing standard ID
management code, and was missed when ID::runtime was made an allocated
pointer.
We should really spend some time at some point to get these custom temp
node IDs handling code under control, there should be little to no need
for all this custom allocation and deletion code anymore nowadays.