Commit Graph

27711 Commits

Author SHA1 Message Date
Hans Goudey
4bf34d9591 Nodes: Simplify location storage, remove hidden offfsets
Currently each node's position is stored in the coordinate space of
its parent. To find the location of a node on the canvas, we have to
apply the translation of each of its parents. Also, nodes have hidden
"offset" values used while transforming frame nodes. Together,
those made the system much more complicated than necessary,
and they made the Python API ineffective.

This commit removes usage of the offset values and moves nodes
to be stored in the "global" space of the node canvas. It also resolves
some weird behavior when resizing frame nodes, and fixes a few bugs.

The change is forward compatible, so we still write files with nodes in
the old parent-space format. In 5.0 the conversion when writing can be
removed. The existing Python API also stays the same. A new
"location_absolute" property gives node locations in global space,
and changing the old property also moves the child nodes of frames.

Resolves #92458, #72904.

Pull Request: https://projects.blender.org/blender/blender/pulls/131335
2024-12-11 21:06:41 +01:00
Hans Goudey
de8f882817 Cleanup: Use "this" keyword to access class members 2024-12-11 11:47:20 -05:00
Julian Eisel
2ce383b2f1 Fix: UI: Asset shelf popup not available
Mistake in f6a4d01703. This refactored the lookup for a named string context
member to avoid code duplication.

Intention was to construct a StringRef referencing the string stored in
context. But the refactored lookup returned an unintentional string copy, so
the reference would be constructed from a temporary string object that would
get destructed immediately.
2024-12-11 17:04:52 +01:00
Hans Goudey
cf6f6d515d Fix #112445: Possible to create invalid attribute with rename
Renaming attributes in the property editor didn't take into account
the required domains and types for builtin attributes. It might be
possible to trigger crashes by using a builtin name with the wrong
metadata. At the very least it would be confusing.

This commit extends the attribute provider check for builtin
attributes to give the required domain and type. We check that in
the attribute rename function to make sure the new name is valid.

Pull Request: https://projects.blender.org/blender/blender/pulls/131702
2024-12-11 16:52:33 +01:00
Julian Eisel
f6a4d01703 UI: Allow passing named integers via context
Similar to 2fbf206491, but for integers (not strings). Essentially this
allows passing named integer values through UI abstractions in a clean
way.

I used 64 bit integers here, since space isn't an issue here, and it
fits common integer types (so we don't have to add APIs for multiple
integer types).

Planned to be used to fix #111463 (following commit).
2024-12-11 13:39:24 +01:00
Campbell Barton
918398f0fa Cleanup: rename vfont_get_data -> vfont_data_ensure
Use the term "ensure" when data is created on demand.
2024-12-11 17:34:01 +11:00
Campbell Barton
139498738a Cleanup: improve comments & typo in ui_tooltip_from_vfont 2024-12-11 17:32:54 +11:00
Hans Goudey
2fd3a633db Cleanup: Remove unnecessary name copy when removing attribute
BKE_defgroup_listbase_name_find has a StringRef argument nowadays.
2024-12-10 14:34:03 -05:00
Hans Goudey
d3fdfe013d Cleanup: Remove unnecessary anonymous attribute checks
These come from the time when anonymous attributes weren't
just names with a different prefix.
2024-12-10 14:34:03 -05:00
Jacques Lucke
53ea147a51 Fix #131598: avoid relying on node tree update code being run before dependency graph is build
This avoids assuming that `BKE_ntree_update_main` has run on a node tree before
the depsgraph is build. The update code already finds the dependencies to
determine if a relations update is necessary or not. To avoid detecting these
dependencies again (which requires iterating over all the nested nodes), they
were cached on the node group so that they can be used when the depsgraph is
build.

However, since the update code does not run in all necessary cases yet
(#131598), this does not work currently. This patch fixes the situation by
removing the optimization of not having to find all dependencies again when the
depsgraph is build.

This optimization can be introduced again after we can be more sure that the
node tree update code runs whenever the node tree changes (which is what #131665
tries, but requires more discussion).

Pull Request: https://projects.blender.org/blender/blender/pulls/131685
2024-12-10 17:52:44 +01:00
Lukas Tönne
d6e78d05c9 Transform: Crazyspace support in edit mode for Curves and Grease Pencil
Edit mode for curves and Grease Pencil was using the plain object transform for
all points without support for individual crazyspace transforms. This patch adds
support for the local rotation matrices, so editing curves on top of modifiers
converts offsets into original geometry space.

For Curves objects these matrices are currently only computed by the surface
deformation node, so editing on top of a surface deformation is the only case
that works currently.
For Grease Pencil the armature modifier is supported and more should be added
in future (see overview task #131599).

Pull Request: https://projects.blender.org/blender/blender/pulls/131619
2024-12-10 10:16:56 +01:00
Sean Kim
bdb9b11a53 Cleanup: Add warning for CTX_data_ensure_evaluated_depsgraph
Part of #131010

Pull Request: https://projects.blender.org/blender/blender/pulls/131557
2024-12-10 00:01:12 +01:00
Pratik Borhade
03b2fc744e Grease Pencil: Add layer channel color property
This adds a `channel_color` property to layers.
The color is stored in the tree nodes.
It's currently used by the dopesheet for the channel colors.

Resolves #130370.

Pull Request: https://projects.blender.org/blender/blender/pulls/130512
2024-12-09 14:11:29 +01:00
Lukas Tönne
0d8f040c8b Fix #130945: Grease Pencil: Crazyspace support in sculpt mode
Grease Pencil v3 did not have crazyspace support yet. Without this sculpting on
deformed geometry (e.g. on top of an armature modifier) will yield incorrect
offsets because the tool writes to original data based on deformed positions.

This patch adds computation of local deformation matrices which are stored in
the `GeometryComponentEditData`. Those matrices are then used to convert local
deformation of the evaluated geometry back to a deformation of the original
geometry. All the relevant sculpt tools support the crazyspace correction now,
using the `compute_orig_delta` helper function.

Computing the deformation matrices should happen alongside modifier evaluation
for any deforming modifier. This has been implemented for the armature modifier,
others can be added.

A fallback implementation for curves could also be added for modifiers that
don't have an easy way to calculate local transformation. A "natural"
orientation for both the original and deformed positions is calculated, then the
difference yields deform matrices. For meshes the approach is to use the surface
normal and a stable tangent space. For curves the common local coordinate frame
based on parallel transport might be used.

Currently crazyspace correction for the _Clone_ tool does not work because of
#131496.

Pull Request: https://projects.blender.org/blender/blender/pulls/131499
2024-12-09 12:33:44 +01:00
Campbell Barton
5dd67c6e1c Cleanup: sort CMake path lists 2024-12-09 09:18:50 +11:00
Campbell Barton
083b690fb5 Cleanup: spelling in comments 2024-12-09 09:14:44 +11:00
Jesse Yurkovich
aef11435b9 Cleanup: Move MAX_DUPLI_RECUR define from DNA to BKE
Moving MAX_DUPLI_RECUR from `DNA_object_types` to `BKE_duplilist` is
more correct organizationally and it allows some downstream consumers to
remove the inclusion of a large and unnecessary DNA header.

Archaeology reference: https://archive.blender.org/developer/D8222

Pull Request: https://projects.blender.org/blender/blender/pulls/131274
2024-12-07 03:14:49 +01:00
Sean Kim
c36212bf11 Fix #131210: Crash on selecting brush in non-updated file
Missed in 9945d511a9

The previous commit fixed files that had not yet been saved in 4.3,
however, the versioning code was not bumped which means that a user who
had a file in a version prior to 4.2 that then saved with the full
release of 4.3 would not have the corrected versioning applied for their
texture paint workspaces.

This commit re-applies similar versioning code and bumps the version
to ensure files are up to date.

Pull Request: https://projects.blender.org/blender/blender/pulls/131337
2024-12-07 00:18:14 +01:00
Sean Kim
569003f70b Fix: Apply correct versioning for prior FCurve change
Missed in 2536ddac0d

Pull Request: https://projects.blender.org/blender/blender/pulls/131520
2024-12-06 23:30:00 +01:00
Philipp Oeser
566a38ffee Fix: Crash rendering of rigid body setup without baking dynamics first
When rendering animation without baking dynamics first, rigid body
objects/shapes might be set up for the fist time (see
`rigidbody_update_simulation`).

Here is my take on what happens when we run into the reported crash:

In `rigidbody_validate_sim_object`, `rigidbody_validate_sim_shape` can
be called (which -- amongst other things -- can call `RB_shape_delete`).
It does not set `RBO_FLAG_NEEDS_RESHAPE` nor calls
`RB_body_set_collision_shape`. It only sets `rbo->shared->physics_shape`
(which only seems to to update the "blender side of things", but not the
"bullet side of things").

Then later (still in `rigidbody_validate_sim_object`),
`RB_dworld_add_body`/ `btDiscreteDynamicsWorld::addRigidBody`>
`btCollisionWorld::addCollisionObject` > collisionObject->getCollisionShape()
 is called, but confused because we called `RB_shape_delete` before.

Also see the TODO(Sybren) comment from 98a0bcd425 (which might even be
removed with this PR, but not I havent verified "collision shape being
created twice" is now not happening anymore).

One might think that flagging `RBO_FLAG_NEEDS_RESHAPE` might be enough,
but reacting on that only happens later in `rigidbody_update_simulation`
(so not early enough to not run into the issues of `RB_dworld_add_body`
above).

So to resolve, call `RB_body_set_collision_shape` in
`rigidbody_validate_sim_shape` if we actually made a new one.

Fixes #130991

Pull Request: https://projects.blender.org/blender/blender/pulls/131039
2024-12-06 17:14:49 +01:00
Hans Goudey
4de00c1544 Cleanup: Move more ARegion runtime data out of DNA 2024-12-06 09:44:31 -05:00
Hans Goudey
d9c7c90e45 Fix #131494: Editor merging can crash Blender
Missing copied runtime data in 129a2aa0f4.
2024-12-06 09:23:35 -05:00
Hans Goudey
21aef81714 Cleanup: Use StringRef and std::optional for UI string arguments
- Gives O(1) access to string length in more cases
- Convenient string manipulation functions
- Clarify difference between "no string" and "empty string"
- Avoid the need for raw pointers in the API
- Shows which API string arguments are optional

Pull Request: https://projects.blender.org/blender/blender/pulls/131473
2024-12-06 14:08:10 +01:00
Jacques Lucke
b36bf15e28 Geometry Nodes: improve detecting data-block dependencies
Previously, the data-block dependencies were always detected in
`update_depsgraph` in `MOD_nodes.cc`. This would only be called when something
called `DEG_relations_tag_update` before. We don't want to trigger a depsgraph
rebuild after each operation in the node editor, as that would be expensive.
However, that also meant that we often had to add data-block dependencies that
are not actually used, but might be used if the user changed e.g. a link. A
typical example for that is a object socket that has a default value, but the
socket is also linked.

Now, the dependencies referenced by the node tree are collected by the node tree
update code which runs after all changes. This way we can detect whether the
dependencies have changed. Only if they have changed, a depsgraph rebuild is
triggered. This now allows also taking into account the mute status of nodes and
whether an input is linked.

There are still more things that could be taken into account. Most obviously
whether a node is connected to an output. This can be done later. The most
tricky aspect here is probably that we also have to consider all viewer nodes as
output, because at the time the node runs, it's not known which viewer will
actually be used (which depends on other editors).

This also cleans up some special cases we had for e.g. the scene time node where
we always had to trigger a depsgraph rebuild when it was added/removed because
of its time dependence. This is now part of a more general system.

This fixes #109219.

Pull Request: https://projects.blender.org/blender/blender/pulls/131446
2024-12-05 18:02:14 +01:00
Jonas Holzman
6cd33510c3 Nodes: Expose Node Color Tag to the Python API
This commit adds a new `color_tag` read-only enum property to nodes,
expanding on the existing node group `color_tag` property. The existing
node group color tag enum (`NodeGroupColorTag`) was renamed to the more
generic `NodeColorTag` and expanded to support all possible color tags.
This new property also works on node group nodes with custom color tags
set by the user.

Pull Request: https://projects.blender.org/blender/blender/pulls/131101
2024-12-05 17:14:34 +01:00
Jacques Lucke
4fd49ae9f3 Fix #119341: improve propagating node tree interface settings
Copy the interface socket directly which makes sure that all relevant data is passed on.
The default is still adapted from the current socket value.

There are still places that could be improved that are not covered by this patch yet.
For example creating a group from a Set Position node changes the default Position input.
That could be fixed separately.

I removed one `assert` that did not seem important. It was making sure that an interface
item is only copied within a group, but I don't see a reason for why it should not be possible
to copy an item to a different group.

Pull Request: https://projects.blender.org/blender/blender/pulls/131394
2024-12-05 13:15:51 +01:00
Christoph Lendenfeld
2536ddac0d Fix #123875: FCurve noise modifier producing values out of range
This patch adds an option to use the new perlin noise as a noise function for the FCurve modifier.
That fixes the issue of the old noise function which could produce values outside the -0.5/0.5 range (For a strength of 1).

The old way is still preserved and will be automatically used for old files.
Because of the different noise function, I've added two more parameters to the noise modifier.
The default values for those parameters are chosen to be as close to the original noise modifier as possible.
However the match is not 1:1

## Depth
With the new noise, the parameters for "Lacunarity" and "Roughness" are available to the user.
By default they are set in such a way that changing the "Depth" results in a similar noise pattern.

## Offset and Scale
The offset and scale parameters now behave differently. Before they would also shift the phase in some way, now all they do is shift or scale the noise.

## Amplitude

The biggest difference is in the amplitude of the noise.

Overall the amplitude is a lot smaller in general than with the legacy noise, but it does fix the issue of the amplitude reaching outside the -0.5/0.5 range.
By shifting the phase I was able to find points where the amplitude reaches 0.5 but never above that.

Pull Request: https://projects.blender.org/blender/blender/pulls/129535
2024-12-05 10:48:27 +01:00
Hans Goudey
2303f0cfee Fix #115104: Geometry nodes bake loses vertex groups
Vertex groups are written as generic attributes in bakes currently.
In order to restore them as vertex groups properly when reading bakes,
keep track of the vertex group names in the bake metadata.

Pull Request: https://projects.blender.org/blender/blender/pulls/131393
2024-12-04 20:00:00 +01:00
Bastien Montagne
3bfa46175c Fix #108067: Liboverride: miss tagging constraints as 'from linked data' on creation. 2024-12-04 17:13:08 +01:00
Hans Goudey
f9b627d29c Mesh: Move custom normals to a generic attribute
Move `CD_CUSTOMLOOPNORMAL` to the newly added
`CD_PROP_INT16_2D` generic attribute type. This is similar to
previous commits moving specific custom data types.

The attribute name is `custom_normal`. When the attribute with
that name is on the face corner domain, the code will interpret it
as stored in the existing deformation-invariant spherical coordinate
space.

The API remains the same, with the additional opportunity to edit
custom normal data as an attribute directly (which admittedly is fairly
unintuitive currently).

See #130484.

Pull Request: https://projects.blender.org/blender/blender/pulls/130689
2024-12-04 16:06:36 +01:00
quackarooni
65b1ab43bf Geometry Nodes: Add "Collection" and "Object" input nodes
Pull Request: https://projects.blender.org/blender/blender/pulls/131075
2024-12-04 15:01:44 +01:00
Campbell Barton
de3eda3c8e Fix 3D text styling buttons in edit-mode
Resolve regression in 4.1 where the 3D text styling buttons
would only read the style from the first character.
2024-12-04 22:26:20 +11:00
Hans Goudey
024d7d12e2 Mesh: Move BVH storage to shared cache system
Avoid rebuilding BVH trees when meshes are copied.
Similar to the other uses of the shared cache system,
this can arbitrarily improve performance when meshes
are copied but not deformed and BVH building is the
main bottleneck. In a simple test file I got a 6x speedup.

The amount of code is also reduced and the system is
much simpler overall-- built out of common threading
patterns like `SharedCache` with its double-checked lock.
RAII is used in a few places to simplify memory management
too.

The downside is storing more `SharedCache` items in the
mesh runtime struct. That has a slight cost when copying
a small mesh many times, but we have ideas to improve that
in the future anyway (#104327).

Pull Request: https://projects.blender.org/blender/blender/pulls/130865
2024-12-04 00:17:17 +01:00
Jacques Lucke
ee9ddbeea3 Fix: interpolating matrix attributes does not always work
The issue is that the conversion to quaternions seems to need normalized matrices
and even then is not always safe. It's simplest to use the existing `*_safe` method here for now.

Related to reports #129445 and #129485.
Related to PR #131296.

Pull Request: https://projects.blender.org/blender/blender/pulls/131297
2024-12-03 23:08:08 +01:00
Hans Goudey
e1e47b6d05 Cleanup: Adjust comment for attribute creation update tag
Avoid confusing initialization with default initialization.
2024-12-03 17:01:47 -05:00
Falk David
c86ead28a3 Cleanup: Grease Pencil: unique_node_name function
Some non-functional changes:
* Use the C++ variant of `BLI_uniquename_cb`.
* Use `StringRef` when passing strings as parameters.
* Don't pass default name as parameter. Expect name in
  `unique_node_name` to not be empty.
2024-12-03 17:01:56 +01:00
Falk David
083a10148c Cleanup: Grease Pencil: Use StringRef for function parameters
Generally, `StringRef` should be used for parameters and `StringRefNull`
for the return type. This cleans up the code to use this pattern.

Part of #130518.

Pull Request: https://projects.blender.org/blender/blender/pulls/131246
2024-12-03 16:33:15 +01:00
Sebastian Parborg
33af6d9c5b Fix: Make sure that sound scrubbing doesn't interfere with regular playback
When "sound scrubbing" was turned on, it would stop audio playback if
you managed to start the timeline before the "sound scrubbing" audio
preview had finished.
2024-12-03 16:25:59 +01:00
Sebastian Parborg
d7140a599d Fix: Make sure Blender doesn't seek an extra time after starting to playback 2024-12-03 16:25:59 +01:00
Hans Goudey
e5a1a61524 Cleanup: Remove unused sculpt drawing code
Unused after 62897317bd.
2024-12-03 10:21:45 -05:00
Sybren A. Stüvel
be921b8ddb Anim: start slot handles at a high number
The `Action::last_slot_handle` field is set to a high-ish value, to
disambiguate slot handles from array indices.

Slot handles are opaque integers, and are just used to find a slot
with that particular handle. Its exact value is irrelevant; Blender
only ensures that slot handles are never reused within the same
Action.

This particular value was obtained by taking the 31 most significant
bits of the TentHash value (Nathan's hash function) for the string
"Quercus&Laksa" (Sybren's cats).

Pull Request: https://projects.blender.org/blender/blender/pulls/131310
2024-12-03 16:15:25 +01:00
Falk David
f6c30bfe45 Curves: Add python function to compare curve geometries
This adds a `unit_test_compare` function to `Curves`.

Compares the curves. Curves are the same if:
* The number of points matches.
* The number of curves matches.
* The attribute names are the same and have the same type.
* The point attribute values are within the `threshold`.
* The curve topology matches (e.g. the curve sizes are the same).
* The curve attribute values are within the `threshold`.
* The indices of the points and curves are the same (can be ignored if this should be treated as the same).

The implementation reuses the same functions as the existing
comparison function for meshes.

Pull Request: https://projects.blender.org/blender/blender/pulls/131164
2024-12-03 11:11:27 +01:00
Sean Kim
ed5bcf06b5 Fix: Apply correct version bump for previous change
66bbdeba77 applied the versioning change
in the past to the wrong number as part of testing for the 4.3 branch.
This commit updates it and the version in main to be the correct value.

Pull Request: https://projects.blender.org/blender/blender/pulls/131259
2024-12-02 21:04:49 +01:00
Hans Goudey
56be16b21e Fix: Compile error after recent StringRefNull cleanup 2024-12-02 13:58:28 -05:00
Iliya Katueshenock
7348e670b3 Cleanup: BKE: Use StringRefNull instead of char *
Use StringRefNull for all function arguments and return types.
Not a StringRef but StringRefNull since there is still large
interaction with C api so null-termination usually necessary.

If string is expected to be not only empty but also a null then
optional is used. This change depends on #130935.

Pull Request: https://projects.blender.org/blender/blender/pulls/131204
2024-12-02 19:24:07 +01:00
Hans Goudey
d04ac76ed8 Fix #131214: Geometry Nodes: Crash due to Free curve normals 2024-12-02 13:11:52 -05:00
Nathan Vegdahl
089c3cd85c Refactor: rename ChannelBag and channel_bag
We've had a bunch of inconsistency between `channel_bag` and `channelbag` in the
code base.  After discussion with @dr.sybren, we decided to standardize on
`channelbag` and also rename the camelcase `ChannelBag` to `Channelbag` to be
consistent with that.

This PR implements those changes.

Note that the reason we standardized on `channelbag` rather than `channel_bag`
is because it makes things clearer when stringing multiple terms together in
type and function names.  For example, in `channelbag_fcurves_move()` it makes
it clear that `channelbag` describes one thing, rather than `channel` and `bag`
being two separate things.

No functional changes intended.

Pull Request: https://projects.blender.org/blender/blender/pulls/130988
2024-12-02 17:55:59 +01:00
Omar Emara
eaa0ae23a9 Fix: Lighten blend mode is wrong for factors less than 1
The Lighten blend mode is wrong for factors less than 1, as it is
computed as a weighted maximum using the factor as the weight, while it
should be a simple component-wise maximum.

This is correctly implemented for Compositor, EEVEE, and Cycles. But the
render/material implementation is wrong. So we adjust the implementation
to match the correct one.

The Darken counterpart was already fixed in 1dcf956849. While the
lighten was fixed in 8b7b165ad9 among other patches. This just completes
the fix.

Pull Request: https://projects.blender.org/blender/blender/pulls/131242
2024-12-02 17:12:08 +01:00
Iliya Katueshenock
26b13504d4 Cleanup: BKE: unnecessary namespace usage
Since 75d17b1db5 everything in the file are already in such a namespace.

Pull Request: https://projects.blender.org/blender/blender/pulls/131205
2024-12-02 15:38:28 +01:00
Falk David
e5bdfd533b Grease Pencil: Save Layer Group expanded state
Grease Pencil layer groups are drawn in the layer tree using
`AbstractTreeViewItem`. The problem is that the items can't
store their expand/collapse state. This meant that switching
e.g. the tabs in the properties editor would reset the collapsed
state of layer group items.

This PR uses the `GP_LAYER_TREE_NODE_EXPANDED` flag to store
the expand/collapse state. The tree view then reads from the flag to
expand/collapse the items.

This also adds an RNA property to layer groups `is_expanded`.
Allows to check from python if a group is expanded in the UI.

Pull Request: https://projects.blender.org/blender/blender/pulls/131159
2024-12-02 11:48:42 +01:00