When using a python expression, its execution is disabled by
default unless specified differently in the user preferences.
Previously this only produced the error
"Error: Invalid Python expression". However that isn't really the correct error.
Now the error reads "Python restricted for security".
I've added a new flag to the driver `DRIVER_FLAG_PYTHON_BLOCKED` that is set
if the driver can't run because python is blocked
Co-authored by Phillip Oeser
Pull Request: https://projects.blender.org/blender/blender/pulls/124587
When quickly running the "frame step" and "insert key" operators it was possible to
run the key insertion when the depsgraph hasn't yet been updated.
Because the key insertion code took the frame from the scene, but the channel values
from the depsgraph, the inserted keys were appearing to be duplicated from a different frame.
The fix is to ensure an evaluated depsgraph is used, so the correct values are placed
at the correct time.
Pull Request: https://projects.blender.org/blender/blender/pulls/124583
Add the concept of 'active slot' within an Action. This allows
clicking on a slot in the Action editor, to select it and mark it as
'active'.
Note that this does _not_ add support for action slots in
`ANIM_set_active_channel()`, as that function doesn't get enough info
to do that, and refactoring it is not on my wishlist.
RNA property `action.slots.active` can be used to access and set the
active slot in Python. `slot.active` can be used to query the slot's
active state, and is read-only (so that there is one way to set the
active slot).
A panel in the Action editor shows info about the active slot. This
panel is just a minimal UI that shows the name and an icon
representing the idtype of the active slot.
Pull Request: https://projects.blender.org/blender/blender/pulls/124422
This implements the _automerge_ feature which finds nearby end points
during stroke draw and merges the new curve with existing strokes.
New utility functions are added in `geometry` for slightly generalized
functionality. The `curves_merge_endpoints` takes an index map that
describes how to connect curves by index. It performs a topological sort
and reorders connected curves into contiguous ranges. This can be used
with an arbitrary number of connected curves. The tool feature itself
only uses a single curve, based on 2D end point positions.
Unit tests have been added for the curve merge utility function.
Pull Request: https://projects.blender.org/blender/blender/pulls/124459
The (GPv2) fill tool has an "extension" mode to assist with filling
small gaps where strokes don't fully meet.
- Overlay: Draws various helpers during modal fill tool operation, using
the same functions as the render-to-image used for applying the fill
tool.
- Extension lines: Scrolling or page up/down extends the tips of strokes
and draws extra boundary lines to limit filling.
- Extension circles: Press S to toggle the mode. This draws circles
around stroke tips.
- Stroke overlay: This can be enabled in the brush settings
(_Advanced > Visual Aids_) to draw strokes in a simple color on top of
the viewport.
- Extension line collision: Tests for intersections of extension lines
with other lines and with strokes, and cuts them short. Enable in
brush settings (_Advanced > Strokes Collision_).
- Better defaults for extension increments: The values are in Blender
units, and quite arbitrary. Using lower values makes it feel more like
GPv2 in the 2D animation template.
- Draw functions in the `ed::greasepencil::image_render` namespace now
consistently expect coordinates in view space (avoids confusion and
works better for 2D elements).
- Some internal renaming and cleanup (many variable names come from GPv2
and were not very clear).
Pull Request: https://projects.blender.org/blender/blender/pulls/122771
Both the Follow Curve constraint and parenting with the follow curve option
require a property on the Curve ID to be animated if the user wants the
follower object to animate along the curve. However, the fcurve for this
was always getting created as a legacy action fcurve, regardless of whether
the action was actually legacy or not. If the action was layered, this
resulted in the follower object not animating along the path.
The underlying issue was that the code that created the fcurve was using
`action_fcurve_ensure()`, which hadn't yet been updated to work correctly with
layered actions, and thus the fcurve was created as if the action was legacy.
This commit fixes that by updating `action_fcurve_ensure()` to work with
Baklava phase-1 layered actions in limited circumstances, and also
ensuring that the follow curve code passes an appropriate ID RNA pointer
(required to find/create an appropriate Slot).
Pull Request: https://projects.blender.org/blender/blender/pulls/124353
Shortcut and quick favorite operators wouldn't show up in the regular asset
shelf. In the popup the shortcut operators would but they crashed with use
after frees.
Basic issue is that activating view-items by applying the button didn't work
well. That messes with button storage, but also the operator data (like
`uiBut.optype`) is unset after applying, in this case before the context menu
was built.
Instead, activate the view-item directly, and call the activate operator in its
`on_activate()` callback. The button shouldn't call this operator again, so
added a way to attach operators to buttons without calling them.
Seems generally useful to be able to attach an operator to buttons for
tooltips, "Assign Shortcut" and the like, without it being called on button
apply.
Pull Request: https://projects.blender.org/blender/blender/pulls/124466
This change simplifies access to this state by prefetching code.
Previously it had to iterate over screens from `bMain` in code local to
prefetching. Now this state is available to other code in VSE.
In preparation for the topology relax brush which shares much of this
code, this commit renames the file and distinguishes between methods
that will and will not be shared between the topology relax and face set
relax brushes.
Pull Request: https://projects.blender.org/blender/blender/pulls/124563
Centralized method to obtain ScrArea icons. Areas can add an optional
space_icon_get callback to provide an icon that differs by subtype. If
not defined then ED_area_icon will return RNA UI icon, which is correct
in cases without area subtypes.
Pull Request: https://projects.blender.org/blender/blender/pulls/124556
Part of #118145.
For each of the PBVH types, the refactored Relax Face Set brush
performs the following steps:
* Calculate all relevant element factors like other refactored brushes
* Calculate the displacement by performing the following steps, using a
displacement of 0 if certain conditions are unfulfilled (e.g. factor
will have no effect, no relevant neighbor vertices, etc)
* Find all neighbors for each element
* Filter the neighbors based on if the current vert is or is not a
boundary vert, looking at the face sets of each neighbor
* From the relevant neighbors, calculate a smoothed average position.
* For boundary verts, calculate the normal based on the summed
direction towards each neighbor vertex
* For non-boundary verts, retrieve the current vertex normal.
* Use the current position and the retrieved normal to create a
plane.
* Find the closest point on the plane to the smoothed position, use
this as the final displacement
* Apply all of these displacements to the relevant elements
Q: Why do we perform three different parallel loops for each method
instead of a single one like other brushes?
Because much of the processing time for these functions is spent in the
neighbor calculation, we opt to process factors in an earlier loop to
short-circuit neighbor calculation if we know it cannot possibly have
an effect (i.e `factor[i] == 0.0f`)
Q: Why are lambdas used in `filtered_neighbors` ?
Simply put, reducing the overall amount of code duplication,
otherwise this function would require 6 different methods to do the
necessary filtering (boundary vs non boundary vertices for each of the
three pbvh types)
### Potential Areas of Improvement
* Unique face set calculation requires iterating over the
`vert_to_face` map and happens multiple times per brush stroke (each
stroke performs the vertex tasks 4 times in succession). Some form of
cache or precomputed map similar to the `boundary_verts` `BitSpan`
may improve performance.
Pull Request: https://projects.blender.org/blender/blender/pulls/124135
Centralized method to obtain ScrArea names. Areas can add an optional
space_name_get callback to provide a name that differs by subtype. If
not defined then ED_area_name will return RNA UI name, which is correct
in cases without area subtypes. This eliminates the current use of
RNA_property_enum_name_gettexted using a temporary context, which
results in the reported (hard to duplicate) error.
Pull Request: https://projects.blender.org/blender/blender/pulls/124488
VSE icon drawing is larger than previous after #123700, and has an
incorrect check if there is enough space to show them. This PR restores
uses of MISSING_ICON_SIZE and fixes the minimum size check.
Pull Request: https://projects.blender.org/blender/blender/pulls/124378
This mostly reverts d6e9438e60 and applies a different fix. Consuming
events here would break firing operators on these events, which is what
the pose library does. Added a comment to note this, because this is not
the first time that I want to change this return value to consume
events.
Collection Export and File->Export were inadvertently sharing the
"last used" operator properties.
This would cause settings that were used during File->Export to
interfere, silently, when exporting the collections. Or vice versa.
Pull Request: https://projects.blender.org/blender/blender/pulls/124481
Issue was that the left mouse press event was handled to activate the
dragging state, but not "consumed". So general view item handling would
attempt to force-activate it again, exiting the dragging state
immediately again.
Consume the event now, plus handle properly any similar unexpected cases
(with failing assert), where modal state would be exited because of an
unconsumed event.
Alternative solution to #124529, thanks to Pratik Borhade for finding
the root of the issue.
The swapping code incorrectly expected the link to have a start and end.
However, this was not necessarily the case when attempting to create
a link from a node to itself. This case has special handling in
`node_link_find_socket`.
Since 4a9e8087a7, preview-tile buttons are non-interactive by default,
so tooltip handling is not triggered. Instead, attach the tooltip to the
underlying view-item button.
This commit creates an operator to convert a `legacy Action` into a `layered Action`.
No data is destroyed, the operator creates a new datablock.
The conversion to the `layered Action` is lossless.
Pull Request: https://projects.blender.org/blender/blender/pulls/122043
Function `strip_data_outline_params_set()` was simplified, so setting
color and outline parameters are not mixed and overwriting as code flows
and so the function is better readable.
Shader code is changed, so that when strip overlaps other strip, it gets
2 px red outline regardless of whether it is active or selected. This
makes it more consistent when strip is not active or selected.
Pull Request: https://projects.blender.org/blender/blender/pulls/124442
Retiming was drawn for all strips in one draw call. During strip
transformation, if strips overlap, one strip should cover the other.
But all keys were drawn on top.
Retiming drawing API was changed to draw 1 strip, so overlapped strips
can be drawn first, followed by overlapping strips.
Since retiming drawing is also layered, single draw call was split into
drawing continuity line, keys and speed text.
Our icon sources currently include two versions of the Blender logo,
the official one and one that is modified to align better to our
smallest pixel grid. But with our recent change to SVG icons, and
alignment tweaks to the official version this can be used in all
cases. This PR does so, removes BLENDER_LARGE, and also slightly
tweaks FILE_BACKUP and FILE_BLEND to use the official form.
Pull Request: https://projects.blender.org/blender/blender/pulls/124179
The BLI_spin APIs use a `SpinLock` typedef whose underlying type is
contingent on the precense of `WITH_TBB`. Since our projects did not
consistently define the `WITH_TBB` definition, multiple `SpinLock` types
would end up in our final binary creating ODR violations.
Pull Request: https://projects.blender.org/blender/blender/pulls/124285
The `WITH_TBB` define needs to be set in order for code using the
various parallel threading helpers [1][2] to actually be multi-threaded.
The affected projects did not have `WITH_TBB` defined and were using the
single-thread variant of all affected APIs.
Additionally, in the case of `EnumerableThreadSpecific`, this results in
an ODR violation where there are 2 versions of the same class linked
into our final binary. One with TBB members and one without.
--------
[1] Namely code using the `BLI_task.hh`, `BLI_sort.hh`, and `BLI_enumerable_thread_specific.hh` headers
[2] `EnumerableThreadSpecific`, `parallel_for_each`, `parallel_reduce`, `parallel_invoke`, `isolate_task`, `parallel_sort`
Pull Request: https://projects.blender.org/blender/blender/pulls/124283