Commit Graph

25552 Commits

Author SHA1 Message Date
Brecht Van Lommel
e0479e2fb4 Geometry Nodes: Use OpenColorIO for luminance
Color to grayscale conversions should take into account the colorspace,
and these are considered to be in scene linear colorspace.

No change with the default configuration.

Pull Request: https://projects.blender.org/blender/blender/pulls/133368
2025-01-21 18:05:56 +01:00
Aras Pranckevicius
4275d85158 Fix #133214: image vectorscope has incorrect horizontal scale
Both Image and Sequencer vectorscopes used YUV U,V coordinates
as-is, but their possible ranges are different: +-0.436 and
+-0.615 respectively.

It looks like more other software (ffmpeg, shotcut, etc.)
re-scales the vectorscope UV to fill up a square, i.e. streches
out the horizontal values, so do the same.

This fixes the "skin tone indicator" line, which at 123 degrees
(90 + 33 degrees to match positive I axis of YIQ color space) was
placed assuming the UV values fill up a square. So it was at the
wrong angle before.

The vectorscope horizontal scaling and skin tone indicator line now
matches other open source (ffmpeg, shotcut) and commercial (davinci
resolve, final cut pro) software packages.

Images in the PR.

Pull Request: https://projects.blender.org/blender/blender/pulls/133316
2025-01-21 13:55:15 +01:00
Jacques Lucke
80441190c6 Nodes: automatically gray out input values that don't affect the output
This patch automatically grays out input values which can't affect the output
currently. It works with inputs of group nodes, geometry nodes modifiers and
node tools.

To achieve this, it analyses the node tree and partially evaluates it to figure
out which group inputs are currently not linked to an output or are disabled by e.g.
some switch node.

Original proposal: https://devtalk.blender.org/t/dynamic-socket-visibility/31874
Related info in blog post:
https://code.blender.org/2023/11/geometry-nodes-workshop-november-2023/#dynamic-socket-visibility

Follow up task for designing a UI that allows hiding sockets: #132706

Limitations:
* The inferencing does not update correctly when a socket starts being
  animated/driven. I haven't found a good way to invalidate the cache in a good
  way reliably yet. It's only a very short term problem though. It fixes itself
  after the next modification of the node tree and is only noticeable when
  animating some specific sockets such as the switch node condition.
* Whether a socket is grayed out is not exposed in the Python API yet. That will
  be done separately.
* Only a partial evaluation is done to determine if an input affects an output.
  There should be no cases where a socket is found to be unused when it can actually
  affect the output. However, there can be cases where a socket is inferenced to be used
  even if it is not due to some complex condition. Depending on the exact circumstances,
  this can either be improved or the condition in the node tree should be simplified.

Pull Request: https://projects.blender.org/blender/blender/pulls/132219
2025-01-21 12:53:24 +01:00
Hans Goudey
b36eb69038 Geometry Nodes: Output proper face corner normals
Previously, when evaluated on the face corner domain, the normal input
node just returned the face normals, as if the mesh was completely flat
shaded. This ignores face and edge smoothness, and custom face corner
normals. In the past couple years the expected behavior of accessing
normals has become much clearer and this behavior is clearly a mistake
in retrospect.

This commit exposes the same face corner normals used everywhere else
in Blender when the node is evaluated on the corner domain. The old
behavior is accessible with a node property in the sidebar. There is
versioning so old files have the property set and get the same results.

This is split from !132583.

Pull Request: https://projects.blender.org/blender/blender/pulls/133340
2025-01-20 23:57:32 +01:00
Julian Eisel
92a1ba2511 Fix: Assets: Custom library with empty path breaks catalog loading
With an asset library configured in the Preferences that had an empty
path, the catalog tree of the "Current File" asset library would be
empty. That is because the path-less library would incorrectly be
considered as containing the current file's path (`BLI_path_contains()`
returned true for the empty path).
2025-01-20 17:19:39 +01:00
Nathan Vegdahl
3ed2c2346d Fix #129540: allow stashing same Action with different Slots
Before slotted actions, it was only useful to stash an action once on a
data-block: that was all that was needed to keep the action's channels
associated with the data-block, and stashing it multiple times was redundant.
Therefore Blender would simply refuse to stash an action if it was already
stashed.

However, now with slotted actions the user may legitimately want to stash an
action more than one time: if the action has multiple slots, the user may want
to keep the channels of multiple slots all associated with a data-block.  Doing
that requires stashing each action+slot combination separately.

This PR addresses this use case by now allowing each action+slot *combo* to be
stashed once. Stashing a given action+slot combo more than once per data-block
is still prevented, however, since that is still redundant.

Pull Request: https://projects.blender.org/blender/blender/pulls/133307
2025-01-20 16:11:08 +01:00
Nathan Vegdahl
bbfc49be83 Fix: audit and fixes for uses of Action.idroot
Did a pass through the code base to make sure the uses of `Action.idroot`
are correct in the context of layered actions.

I found and fixed one issue in Grease Pencil v2 -> v3 conversion code
where the idroot was being set to a non-zero value without checking if
the action was layered or not first. Other than that, I also cleaned up
a couple of dodgy-looking things I found.

Pull Request: https://projects.blender.org/blender/blender/pulls/133205
2025-01-20 15:21:53 +01:00
Jonas Holzman
5472ffeae3 Fix: UBSan division by zero runtime error in intern/shrinkwrap.cc
This error would occur because the quadratic equation solving code didn't
check for `a` being non-zero. Fixed by adding the additional check. This
can be tested and reproduced using the `ShrinkwrapTargetNormalProject2`
`modifiers` test.

Pull Request: https://projects.blender.org/blender/blender/pulls/133273
2025-01-20 10:05:34 +01:00
Bastien Montagne
64bdc245b2 Fix warning in some compilers.
Compilers do not seem to agree on valid printf format for `int64_t`,
recent clang 19 on linux requires `%ld`, while older compilers like the
buildbot ones of clang 15 on OSX ask for `%lld`.

So instead, cast the value to `int32_t`. Other solution may have been to
use `PRId64`, but this is fairly bad for readability.
2025-01-17 21:07:11 +01:00
Bastien Montagne
14e788e42e BKE: PartialWriteContext: Add concept of library duplicates.
Check done by PartiaWriteContext writing code to ensure there is no
library ID written which filepath is the same as the destination
blendfile path of the context, was flacky in case there would be
multiple library IDs with that same path.

While this is not expected situation currently, it will likely change in
the future, so handle that properly, and generate a CLOG warning.
2025-01-17 15:22:54 +01:00
Bastien Montagne
063267f459 Fix #132900: Blender error after editing and saving a brush asset.
The handling of library for IDs added to a PartiaWriteContext in 'make
local' mode (i.e. to make them local in the written blendfile) was
flacky, leading to invalid removal of the ID name from the library ID
namemap in G_MAIN.

Now simply esure there is a local copy of the library too when adding an
ID to the context, even if it will be made local there.
2025-01-17 15:22:54 +01:00
Jacques Lucke
43b41984ae Fix: use MEM_delete instead of MEM_free
This was missing in 1151d82df3.
2025-01-17 14:13:14 +01:00
Jacques Lucke
e3d83806fd Fix: use delete instead of free 2025-01-17 12:52:06 +01:00
Jaime Torres
947330e529 Fix #129849: Remove redundant 'GreasePencil' references in PaintMode
As established in issue #129849 , there are references to older versions of Grease Pencil that aren't needed.
This PR is meant to remove such references or, in places where otherwise `GreasePencil` is referenced
but `GPencil` is not, it changes the reference as for it to reference the v3 implementations in PaintMode.
It also removes `GreasePencil` from the list of options when declaring `PaintMode`.

Pull Request: https://projects.blender.org/blender/blender/pulls/131065
2025-01-17 12:30:47 +01:00
Jacques Lucke
58c923c0bd Fix #133177: incorrect handling of shared layers in mesh validation 2025-01-17 12:22:41 +01:00
Jacques Lucke
987003d456 Nodes: replace some node checks with accessor method calls
This uses the following accessor methods in more places in more places:
`is_group()`, `is_group_input()`, `is_group_output()`, `is_muted()`,
`is_frame()` and `is_reroute()`.

This results in simpler code and reduces the use of `bNode.type_legacy`.

Pull Request: https://projects.blender.org/blender/blender/pulls/132899
2025-01-17 12:17:49 +01:00
Jacques Lucke
7408d0d8b1 Nodes: improve getting owner id during tree update
Using the `BKE_id_owner_get` during the node tree update can avoid having to
iterate over lots of data-blocks in common cases. Previously, the code had to
iterate over all potential owners of node group to find the correct one.

Pull Request: https://projects.blender.org/blender/blender/pulls/132903
2025-01-17 12:17:17 +01:00
Bastien Montagne
318bc5af77 BKE: ID namemap: always report warning when checking integrity of the namemap.
Using `CLOG_INFO` and then reporting critical error is not very coherent,
nor practical, since INFO messages are not even displayed by default in
the console.
2025-01-17 10:48:33 +01:00
Campbell Barton
dd32c10b5d Refactor: minor changes to get_path_environment_multiple
- Support a null "subfolder_name" argument
  in keeping with the rest of BLI_appdir functions.
- Use "test_path" utility to de-duplicate path joinging & checks,
  this also means the paths will be logged.
- De-duplicate loop body for the last item.
2025-01-17 12:29:16 +11:00
Christoph Lendenfeld
f105366d73 Anim: Support multi object editing when applying poses
This patch adds support to apply a pose asset to multiple armatures in pose mode at once.
In case there is a suitable slot for the armature, it will be used to read from, otherwise
the system falls back to slot 0.

Part of #131840

Pull Request: https://projects.blender.org/blender/blender/pulls/132601
2025-01-16 13:17:20 +01:00
Campbell Barton
81c26130dc Fix #43998: toggling edit-mode can destroy mesh shape-key
Regression in [0] that clamped the shape-key index when exiting
edit-mode but not when entering, causing the "Basis" shape not to
be treated as active when entering edit-mode, then treated as active
when exiting - overwriting it's values from the mesh.

Resolve by clamping on edit-mode enter & exit.

[0]: 225e3460d0
2025-01-16 16:36:50 +11:00
Philipp Oeser
e700e1f71c Fix #115843: Expose curves sculpt collision distance
The hardcoded value doesn't work well with real scale human heads for
example (was already adjusted once in a76b5d3a07).
The result for too high values is a complete "freeze" of the whole curve
(since  the solution from e7606139ba has the problem that it keeps
running into max iterations of the collision solver).

As long as no better solver is implemented, it is better to have an
adjustable value (to work on differently sizes objects) to not run into
the above issue (same as the old particle hair system had) and show it
in sculptmode next to the button which enables collision.

This is done per `Curves` (same as the flag
`CV_SCULPT_COLLISION_ENABLED`), similar to symmetry settings
[alternatively, it could be part of `BrushCurvesSculptSettings` but I
think it makes more sense in Curves] and then passed on to the
`CurvesConstraintSolver`.

Includes versioning code (to set the default for old files).

Pull Request: https://projects.blender.org/blender/blender/pulls/132997
2025-01-15 15:54:43 +01:00
Sean Kim
5659be7a7d Fix: Update DEG_debug_graph_relations_validate commented line
Changed in d325e6f0e8

Pull Request: https://projects.blender.org/blender/blender/pulls/133071
2025-01-15 00:53:22 +01:00
jlalleve
2feadc623b Core: Environment variables for deployment
* BLENDER_SYSTEM_SCRIPTS support for multiple script paths, separated by
  ; on Windows and : on other platforms.
* New BLENDER_CUSTOM_SPLASH to replace the splash screen image.
* New BLENDER_CUSTOM_SPLASH_BANNER to overlay an image on the splash.

Contributed by Sony Interactive Entertainment: https://github.com/PlayStation-OpenSource
2025-01-14 20:57:31 +01:00
Hans Goudey
9dd3c64c36 Cleanup: Remove unused includes in some blenkernel files
Pull Request: https://projects.blender.org/blender/blender/pulls/133067
2025-01-14 19:55:11 +01:00
Jacques Lucke
684fd4643a Nodes: use BKE_main_ensure_invariants directly instead of ED_node_tree_propagate_change
`BKE_main_ensure_invariants` was added in 1fae5fd8f6. The older
`ED_node_tree_propagate_change` was already implemented as a thin wrapper around
`BKE_main_ensure_invariants`. This patch removes the wrapper and calls the more
general function directly.

A new overload of `BKE_main_ensure_invariants` is added for the common case when
only a single data-block has been modified.

Pull Request: https://projects.blender.org/blender/blender/pulls/133048
2025-01-14 16:26:54 +01:00
Jacques Lucke
476b7ded9e Nodes: make explicit legacy type optional
This makes specifying a legacy type for new node types optional (e.g.
`GEO_NODE_MESH_TO_CURVE`). Instead, only the `idname` is used as a stable
identifier for node types. So there is less redundancy for now.

This change helps with the decentralized definition of nodes and reduces the
number minimum number of files that need to be changed for a new node from 5 to
4. It especially helps when multiple nodes are worked on at the same time,
because the legacy type definition was very prone to have merge conflicts.

For compatibility reasons and because it's still used by existing code, the
`legacy_type` is not removed. All existing nodes keep their current
`legacy_type`. New nodes will receive an auto-incremented legacy type. It's
still necessary to give nodes unique legacy types, because some code checks if
two nodes have the same type by comparing their `legacy_type`. These types only
have to be unique at run-time though. Some randomness is used to avoid depending
on stable generated legacy types accidentally.

Pull Request: https://projects.blender.org/blender/blender/pulls/133044
2025-01-14 14:39:36 +01:00
Falk David
16e89b7366 Fix #132568: Grease Pencil: runtime error: null pointer as argument
The passed `StringRef` can be empty, so we shouldn't pass it to
`BLI_strdupn` in this case.

If an empty string is passed to either `set` function
makes sure the previous `char *` is freed and set to `nullptr`.

Pull Request: https://projects.blender.org/blender/blender/pulls/133042
2025-01-14 12:46:54 +01:00
Jacques Lucke
b32a5882c1 Cleanup: Nodes: move node class parameter out of node_type_base
The node class is hardly important enough (especially compared to the other parameters)
that it is justified to have to pass it to `node_type_base`.

Pull Request: https://projects.blender.org/blender/blender/pulls/133021
2025-01-14 11:03:28 +01:00
Campbell Barton
8460dffcbd Fix file-name sanitizing for image "Save As"
ID names of images that included slashes would attempt to write
save the image in a sub-directory based on those slashes.

Also add notes to clarify the intended use of "safe" path functions.
2025-01-14 13:49:25 +11:00
Jonas Holzman
0ee4ae89e4 UI: Capitalize default filenames from "untitled" to "Untitled"
Capitalize the default filename used for .blend files and other savable
and exportable file formats (like images, 3D formats, etc.) from
"untitled" to "Untitled".

Pull Request: https://projects.blender.org/blender/blender/pulls/132424
2025-01-13 20:06:27 +01:00
Jacques Lucke
11f20683f9 Core: support localizing data-block without owner ID
Previously, the owner-id on localized node trees, like the one created in
`GPU_material_from_nodetree` would have `bNodeTree::owner_id` set, even though
they were independent. The leads to asserts when using `BKE_id_owner_get` on the
localized node tree.

The `node_tree_localize` already took a `ID *new_owner_id` parameter. However,
if it was `nullptr` it was ignored instead actually clearing the `owner_id`.
This patch changes the parameter to `std::optional<ID *> new_owner_id`. Now,
`std::nullopt` means that the value is ignored and when `nullptr` is passed in,
the `owner_id` will be cleared on the localized tree.

Since `node_tree_localize` indirectly uses other functions, the same function
signature change is done in `BKE_libblock_copy_in_lib` and `BKE_id_copy_in_lib`.
The callers have been updated to pass in `nullopt` instead of `nullptr`.

Pull Request: https://projects.blender.org/blender/blender/pulls/133002
2025-01-13 16:46:36 +01:00
Jacques Lucke
01be014b3d Fix: add missing node tree topology cache 2025-01-13 15:06:50 +01:00
Jacques Lucke
1fae5fd8f6 Core: add concept of invariants in original DNA data
This patch adds a new `BKE_main_ensure_invariants` function. For now it only
ensures node-tree related invariants, but more may be added over time.

The already existing `ED_node_tree_propagate_change` now internally calls
`BKE_main_ensure_invariants`. We can probably remove this indirection at some
point and call the new function directly, but for now it is kept to keep this
patch small.

This is based on a recent discussion in the Core module meeting:
https://devtalk.blender.org/t/2024-12-12-core-meeting/38074

```cpp
/**
 * Makes sure that invariants in original DNA data are maintained after changes.
 *
 * This function has to be idempotent, i.e. after calling it once, additional calls should not
 * modify DNA data further. If it would, it would imply that this function does more than
 * maintaining invariants.
 *
 * This has to be called after any kind of change to original DNA data that may be involved in some
 * of the maintained invariants. It's possible to do multiple changes in a row and then fixing all
 * invariants with a single call in the end. Obviously, the invariants are not maintained in the
 * meantime then and functions relying on them might not work.
 *
 * If nothing is changed, this function does nothing and it should not be slower than checking a
 * flag on every data-block in the given bmain.
 *
 * Sometimes, it is known that only a single or very few data-blocks have been changed (e.g. when a
 * node has been inserted in a node tree). Passing in #modified_ids can speed up the function
 * because it may avoid the need to iterate over all data-blocks to find modified data-blocks.
 *
 * Examples of maintained invariants:
 * - Group nodes need to have the correct sockets based on the referenced node group.
 * - The geometry nodes modifier needs to have the correct inputs based on the referenced group.
 */
void BKE_main_ensure_invariants(Main &bmain,
                                std::optional<blender::Span<ID *>> modified_ids = std::nullopt);
```

This also adds `windowmanager` as a dependency of `blenkernel` to be able to
send notifiers.

Pull Request: https://projects.blender.org/blender/blender/pulls/132023
2025-01-13 15:03:24 +01:00
Lukas Tönne
3bdc1bfd0a Fix #131573: Ensure vertex group attributes when subdividing Grease Pencil strokes
In order to copy vertex group weights when subdividing strokes the
groups (`bDeformGroup`) must be created in advance, so that the attribute
wrappers correctly write to `CD_MDEFORMVERT` layer instead of creating simple
`CD_PROP_FLOAT` layers.

In addition the subdivision function must take care to fully write the
destination arrays, since initial values must be considered uninitialized (this
is obfuscated for simple CustomData arrays but breaks with more complex
attributes that use a buffer). In order to ensure fully defined destination
buffers without additional copies, the `finish` call to attribute writers is
postponed until the unselected attribute values have also been copied from input
buffers and all the values are properly defined.

Pull Request: https://projects.blender.org/blender/blender/pulls/132854
2025-01-13 09:45:11 +01:00
Campbell Barton
5ceaff9aa6 Fix #132976: Crash animating along a 1-segment path
The binary lookup assumed there was at least two elements in the array.
2025-01-13 16:25:52 +11:00
Sean Kim
440e87ce55 Cleanup: Reorganize hsv sort paint functions
Pull Request: https://projects.blender.org/blender/blender/pulls/132959
2025-01-13 00:04:36 +01:00
Hans Goudey
eb7df01ef3 Cleanup: Reduce unnecessary includes in curves headers
Pull Request: https://projects.blender.org/blender/blender/pulls/132925
2025-01-10 23:31:49 +01:00
Hans Goudey
d381379b47 Cleanup: Nodes: Use StringRef in a few more places
Pull Request: https://projects.blender.org/blender/blender/pulls/132923
2025-01-10 22:27:45 +01:00
Hans Goudey
be887bd37d Cleanup: Move NOD_common.h to C++ 2025-01-10 22:27:44 +01:00
Julian Eisel
4b2a4341a7 Fix #130611: Grease Pencil: Airbrush affects material of other brushes
Don't change the object's active material when adding a material slot. This
active material will be used by brushes with no pinned material, while the
added slot is meant for the pinned material.

The if-statement in `BKE_grease_pencil_object_material_ensure_from_brush()`
would change the active unpinned material, even though it was only meant to
handle the pinned material. This was not a new issue, it was just unlikely to
run into it.

Before brush assets were introduced this if-statement would not be
executed when activating any of the default brushes. Afterwards it would
be, because the material was newly linked (because the brush asset was
linked) and so there was no material slot created for it yet.

Pull Request: https://projects.blender.org/blender/blender/pulls/132865
2025-01-10 18:09:30 +01:00
Pratik Borhade
06a2617107 Fix #100786: Collection hide viewport in properties tab
Similar to other visibility properties, include "hide_viewport" in
collection properties tab. One issue is that, when collection is
disabled, automatically parent collection is selected or tab is gone
when parent collection does not exist. The check was added in
0a903e7ab1, it doesn't seem very useful so
removed that.

Pull Request: https://projects.blender.org/blender/blender/pulls/132107
2025-01-10 14:49:43 +01:00
Hans Goudey
f2c9fccee0 Cleanup: Move legacy node integer types defines to separate header
Moving these defines to a separate header makes their "legacy" status
more obvious. This commit just adds the include wherever necessary.

Followup to 971c96a92c.

Pull Request: https://projects.blender.org/blender/blender/pulls/132875
2025-01-09 20:03:08 +01:00
Falk David
d413b0064f Cleanup: Move BKE_material.h to C++
The `BKE_material.h` is only renamed to `.hh` to preserve
the history of the file. Changes to the file are done in
the following commit.
2025-01-09 18:11:46 +01:00
Jacques Lucke
038159e96b Refactor: Nodes: improve node tree update API
Main goals of this refactor:
* Make it more obvious which update function should be used.
* Make it more obvious which parameters are required by using references instead
  of pointers.
* Support passing in multiple modified trees instead of just a single one.

No functional changes are expected.

Pull Request: https://projects.blender.org/blender/blender/pulls/132862
2025-01-09 17:00:05 +01:00
Jacques Lucke
259c98fa72 Nodes: add utility method to check node type
The `bNode.type_legacy` is still used in many places to check if a node is a
specific type. However, going forward it's better to rely more on the idname
than on this legacy integer type. Some more information is available in #132858.

The added utility method can be used like so:
`node->is_type("GeometryNodeMenuSwitch")`. Previously one would have written
`node->type_legacy == GEO_NODE_MENU_SWITCH`. The `is_type` method internally
checks that the passed in string is a valid node identifier to make it more
likely that we catch typos early.

Pull Request: https://projects.blender.org/blender/blender/pulls/132863
2025-01-09 16:59:47 +01:00
Jacques Lucke
971c96a92c Nodes: rename integer type of nodes to type_legacy
The new description for `bNode.type_legacy`:
```
  /**
   * Legacy integer type for nodes. It does not uniquely identify a node type, only the `idname`
   * does that. For example, all custom nodes use #NODE_CUSTOM but do have different idnames.
   * This is mainly kept for compatibility reasons.
   *
   * Currently, this type is also used in many parts of Blender, but that should slowly be phased
   * out by either relying on idnames, accessor methods like `node.is_reroute()`.
   *
   * A main benefit of this integer type over using idnames currently is that integer comparison is
   * much cheaper than string comparison, especially if many idnames have the same prefix (e.g.
   * "GeometryNode"). Eventually, we could introduce cheap-to-compare runtime identifier for node
   * types. That could mean e.g. using `ustring` for idnames (where string comparison is just
   * pointer comparison), or using a run-time generated integer that is automatically assigned when
   * node types are registered.
   */
```

Pull Request: https://projects.blender.org/blender/blender/pulls/132858
2025-01-09 15:28:57 +01:00
Jacques Lucke
0fa4c6da18 Refactor: Nodes: avoid using NOD_static_types.hh when creating node types
This removes the second to last usage of `NOD_static_types.hh` which we intend
to remove. A nice benefit is that the idname is now finally more explicit when a
node is registered. Previously it was difficult to search for the definition of
a node in the code when one had only the idname, which is the main identifier
for nodes.

The main change is in `node_type_base`.

Pull Request: https://projects.blender.org/blender/blender/pulls/132815
2025-01-09 12:19:57 +01:00
Campbell Barton
69cc4c708d Cleanup: clarify naming & simplify "+" drawing for UV grid
- Prefer term "size" over "width" as this was used for the height.
- Simplify calculation for drawing the "+".
- Add note that the "+" is slightly off-center (ref #112653).
2025-01-09 10:06:43 +11:00
Hans Goudey
2afd946ba6 Refactor: Nodes: Move UI name out of NOD_static_types.h header
As part of an effort to remove this header, reducing the need for macro/
include magic and making node definitions more independent, move
the node UI name and description definitions to each node's file.
The UI name, description, and idname are also moved to std::string
instead of char arrays.

Similar to b43e2168e3.

Pull Request: https://projects.blender.org/blender/blender/pulls/132708
2025-01-08 18:07:11 +01:00