Commit Graph

103705 Commits

Author SHA1 Message Date
Jacques Lucke
152f5dc897 Fix #111633: crash with cyclic node tree zones
The problem was that there was a cyclic nesting dependency that was not detected
correctly, which led to problems further down the line. See the PR for details.

Right now, the zones just disappear when there is an error. This has to be improved
at some point, but it outside of the scope of this patch.

A regression test that covers this case is added as well.

Pull Request: https://projects.blender.org/blender/blender/pulls/111689
2023-08-30 14:50:53 +02:00
Hans Goudey
f41dc90925 Mesh: Rewrite split edges algorithm
The new split edges code from e83f46ea76 started the use of
Mesh rather than BMesh as a performance improvement. However, the code
contained a complex loop used for de-duplicating edges that gave invalid
indices in some circumstances. That was fixed by b226c115e2,
but in turn that commit caused loose edges to be skipped. That was
fixed by 111e378366, however that caused another crash.

Long story short, the code is quite complex and the existing algorithm,
while an improvement from the original, is fiddly. For example, instead
of working with just the input and output states, it adjusted topology
data for an intermediate state halfway through the change.

Fixes #109236

**Goals**
- Only use topology maps from the input mesh. This should work better
  with future topology caching improvements (See !107816).
- Run de-duplication in a per-edge context to allow parallelization.
- Optimize for real world use cases when there is merging of new edges.
- Improve readability by making each step's inputs clear, improving naming,
  and separating functions.
- Improve handling of loose edges.
- Reuse existing edges for the first new split edges, simplifying
  edge attribute propagation.

**Timing**
I tested performance with a Ryzen 7950x and a grid with 4 million faces
with different random portions of the mesh selected.

| Selection | Before (ms) | After (ms) | Change |
| --------- | ----------- | ---------- | ------ |
| 100%      | 1869.4      | 351.8      | 5.3x  |
| 50%       | 1636.0      | 356.0      | 4.6x  |
| 10%       | 1148.8      | 238.2      | 4.8x  |

| 4 Million Face Grid             | 10%  | 50%  | 100% |
| ------------------------------- | ---- | ---- | ---- |
| `vert_selection_from_edge`      | 2.7  | 4.1  | 4.3  |
| `selection_to_bit_vector`       | 0.7  | 3.9  | 0.2  |
| `vert_to_corner_map`            | 22.3 | 22.5 | 22.4 |
| `edge_to_corner_map`            | 47.7 | 47.6 | 47.6 |
| `corner_to_face_map`            | 3.3  | 3.3  | 3.3  |
| `calc_all_corner_groups`        | 21.0 | 44.1 | 38.3 |
| `calc_vert_ranges_per_old_vert` | 3.0  | 7.4  | 7.9  |
| `update_corner_verts`           | 2.8  | 12.7 | 15.5 |
| `calc_new_edges`                | 28.8 | 44.1 | 35.5 |
| `update_unselected_edges`       | 9.8  | 9.3  | 0.0  |
| `propagate_edge_attributes`     | 35.7 | 51.3 | 61.7 |
| `propagate_vert_attributes`     | 24.0 | 27.0 | 31.7 |
| `propagate_vert_attributes`     | 24.2 | 29.7 | 36.9 |

**Tests**
New regression tests have been committed separately. Existing
tests were updated since the new code gives different indices.
2023-08-30 14:23:42 +02:00
Campbell Barton
cbc14782ff Fix mistaken revert of EEVEE fix in recent commit
[0] unintentionally reverted [1], correcting.

[0]: 3d607be572
[1]: 068e117a8b
2023-08-30 21:23:36 +10:00
Lukas Tönne
e071288ab2 Nodes: Panels integration with blend files and UI
Part 3/3 of #109135, #110272

Switch to new node group interfaces and deprecate old DNA and API.
This completes support for panels in node drawing and in node group
interface declarations in particular.

The new node group interface DNA and RNA code has been added in parts
1 and 2 (#110885, #110952) but has not be enabled yet. This commit
completes the integration by
* enabling the new RNA API
* using the new API in UI
* read/write new interfaces from blend files
* add versioning for backward compatibility
* add forward-compatible writing code to reconstruct old interfaces

All places accessing node group interface declarations should now be
using the new API. A runtime cache has been added that allows simple
linear access to socket inputs and outputs even when a panel hierarchy
is used.

Old DNA has been deprecated and should only be accessed for versioning
(inputs/outputs renamed to inputs_legacy/outputs_legacy to catch
errors). Versioning code ensures both backward and forward
compatibility of existing files.

The API for old interfaces is removed. The new API is very similar but
is defined on the `ntree.interface` instead of the `ntree` directly.
Breaking change notifications and detailed instructions for migrating
will be added.

A python test has been added for the node group API functions. This
includes new functionality such as creating panels and moving items
between different levels.

This patch does not yet contain panel representations in the modifier
UI. This has been tested in a separate branch and will be added with a
later PR (#108565).

Pull Request: https://projects.blender.org/blender/blender/pulls/111348
2023-08-30 12:37:21 +02:00
Philipp Oeser
f77fdbff8a Fix #111642: VSE glow code can overflow with small proxies
With such small proxy sizes (combined with a small blur radius), the
kernels `halfWidth` can get zero, which leads to a memory allocation of
same zero size and writing to that memory leads to overflow/crashes/can
only go downhill from there.

Now early out in such cases [which leads to
slightly different output -- well if the "buggy" output survives and
does not crash that is].

(alternatively we could just prevent the overflow and still let do
`RVBlurBitmap2_float` do stuff that it really shouldnt imo, see first version of the PR)

Pull Request: https://projects.blender.org/blender/blender/pulls/111660
2023-08-30 10:24:45 +02:00
Petar Dosev
5894ab2e07 Fix #104022: Expand Mask inverted fill
A small new feature that clears the mask completely on the current mesh island.
Closes #104022

When hovering outside the object the Expand operator is running on, it will get floodfilled with the mask/face set.

Previously, when the Invert option was used, it wouldn't also clear the mask/face set when hovering outside the object.

Pull Request: https://projects.blender.org/blender/blender/pulls/111665
2023-08-30 09:28:46 +02:00
Campbell Barton
a6837ac517 PyAPI: support building with the up-coming Python 3.12
- Account for new member in _PyArg_Parser.

- Many Python op-codes have been removed.
  For the moment these are disabled in is_opcode_secure.
  Some should be added back as intrinsics, noted in code-comments.
2023-08-30 14:08:56 +10:00
Campbell Barton
0db1664ba4 Cleanup: reduce right shift in wm_window_timers_process 2023-08-30 12:17:30 +10:00
Campbell Barton
d7b9467f19 Cleanup: simplify wm_jobs_timer_end, wm_jobs_timer
The logic in wm_jobs_timer made it seem as if timers might be shared
between wmJob's however this is never the case.

Replace a loop on wmJob's with a lookup & NULL check.
2023-08-30 12:17:29 +10:00
Campbell Barton
09471c8636 Cleanup: simplify WM_event_timer_sleep
Use remove the inline loop as it was only used to check if the timer
is in wm->timers.
2023-08-30 11:11:20 +10:00
Campbell Barton
745f78f9f0 WM: improve timer precision for more precise playback
When a timer needs to execute during the idle time (currently 5ms), use
microsecond precision to ensure the timer isn't delayed by the idle
time.

This improves the precision of animation playback on systems that
support it
(WIN32, see note below).

In my tests FPS playback varied:

- 59.94 FPS would jitter between 58.13 & 63.11 FPS. 23.98 FPS would
- jitter between 23.68 & 24.31 FPS.

Using higher precision timers mostly resolves this issue although there
is still some jitter although it's now limited to ~0.01 FPS.

These values were measured with the FPS-Samples set to 1 to show the
real times between frames (without the values being smoothed out).

This is a continuation of a fix for #111579 which avoided the worst of
the jittering issues at higher frame rates.

It appears WIN32 doesn't support sleeping shorter than 1 millisecond via
`std::this_thread::sleep_for`, making this change have no benefit on
WIN32, from tests it also doesn't have any down sides, so avoid platform
specific logic. The WIN32 limitation is noted in code-comments. If a
method of higher precision method is available this can be investigated.
2023-08-30 10:57:20 +10:00
Campbell Barton
0026d20c8c Cleanup: quiet compiler warnings, correct doxy section 2023-08-30 10:57:17 +10:00
Campbell Barton
2eceb48ea7 Cleanup: simplify NewGeometryNodeGroupTool poll function
Move inline comment into the space_data doc-string.
2023-08-30 10:57:15 +10:00
Campbell Barton
3d607be572 Cleanup: spelling in comments 2023-08-30 10:57:12 +10:00
Campbell Barton
4ea5feb7d2 Cleanup: use _itemf suffix for enum callback, remove leading separator
Also check for obpose being NULL even when the context exists.
2023-08-30 10:57:11 +10:00
Campbell Barton
87379a1c86 Cleanup: license header 2023-08-30 10:57:09 +10:00
Nathan Vegdahl
6d2c7c509c Fix: failing keymap test for ARMATURE_OT_assign_to_collection
Breakage introduced by 998136f7a7

Pull Request: https://projects.blender.org/blender/blender/pulls/111667
2023-08-29 20:14:33 +02:00
Hans Goudey
7563b96945 Geometry Nodes: Avoid attribute copy in simple case of points to curves
When the final curve point indices are in the same order as the input
points, and there are many curves, avoid copying point domain
attributes, by generalizing the existing check from the mesh
to curve conversion node.

Pull Request: https://projects.blender.org/blender/blender/pulls/111662
2023-08-29 20:12:47 +02:00
Philipp Oeser
a3c045d49d Fix: Customdata merging does not check layer limit on destination
`LayerTypeInfo` can define a `layers_max()` function which determines the
maximum allowed number of layers.

Upon merging, this limit was respected from the source, but not on the
destination, so it was possible to exceed the max (if there were layers
on the destination already).

NOTE: `layers_max()` is currently only defined for legacy CD_MTFACE, but
we might want to enforce this for UVs / CD_PROP_FLOAT2 again.

This came up in #111608.

Pull Request: https://projects.blender.org/blender/blender/pulls/111609
2023-08-29 18:02:36 +02:00
Hans Goudey
3f0eba32d4 Cleanup: Fix unused variable warning 2023-08-29 12:00:18 -04:00
Hans Goudey
69c498084a Cleanup: Remove unnecessary Mesh C API functions 2023-08-29 11:47:29 -04:00
Hans Goudey
b339e3937d Fix: Crash in sculpt mode with shared normals caches
Since the normals are stored in a shared cache, tagging them dirty
recreated the cache from scratch when it was shared. Instead,
add a function that updates the cache in the same call as tagging
it dirty. This keeps the old state of the cache around even if it was
shared, and reflects the way that it's really the PBVH and sculpt
mode managing the dirty status of normals while sculpt mode
is active.

One consequence is that the BVH cache and the triangulation
cache need to be tagged dirty manually. I'd like to avoid abstracting
this more than necessary, because I'm hoping in the long term
different caching abstractions like a more global cache that takes
implicit sharing versions into account will make this complexity
unnecessary.

Fixes #111628, #111563

Pull Request: https://projects.blender.org/blender/blender/pulls/111641
2023-08-29 17:07:42 +02:00
Hans Goudey
425b871607 Mesh: Replace EdgeHash and EdgeSet with C++ classes
The `EdgeHash` and `EdgeSet` data structures are designed specifically
as a hash of an order agnostic pair of integers. This specialization can
be achieved much more easily with the templated C++ data structures,
which gives improved performance, readability, and type safety.

This PR removes the older data structures and replaces their use with
`Map`, `Set`, or `VectorSet` depending on the situation. The changes
are mostly straightforward, but there are a few places where the old
API made the goals of the code confusing.

The last time these removed data structures were significantly changed,
they were already moving closer to the implementation of the newer
C++ data structures (aa63a87d37).

Pull Request: https://projects.blender.org/blender/blender/pulls/111391
2023-08-29 17:00:33 +02:00
Iliya Katueshenock
48b08199d5 Geometry Nodes: Points to Curves node
New node to converts groups of points to curves. Groups
of points defined as `Curve Group ID` attribute. `Weight` in curve
is used for sort points in each group. Points of result curves
propagate attributes from original points. Implicit conversion
of other geometry types is not supported currently.

Pull Request: https://projects.blender.org/blender/blender/pulls/109610
2023-08-29 16:52:20 +02:00
Nathan Vegdahl
ab67d410a9 Fix: set bone collection membership properly for new bones
- Extrude and subdivide operators now duplicate the membership from
  the source bone.
- Adding a bone through the edit_bones.new() Python API now leaves
  membership empty.  But adding a new bone through the operator still
  adds it to the active collection.
2023-08-29 16:40:40 +02:00
Miguel Pozo
639a74d236 Fix: EEVEE-Next: Subsurface Scattering regression
Regression caused by 17db856686
Subsurface Scattering uses an additive pass over the radiance output,
so it's always needed even if the deferred pass is not the last one.

Pull Request: https://projects.blender.org/blender/blender/pulls/111534
2023-08-29 15:55:02 +02:00
Daybreak
aa83fb0337 Geometry Nodes: Support drag & drop for Materials
Allows for materials to be dragged and dropped into the
geometry nodes editor, similar to collections or objects.

Pull Request: https://projects.blender.org/blender/blender/pulls/111368
2023-08-29 15:51:18 +02:00
Alexander Gavrilov
830572a1bb Anim: add python API for reordering bone collections 2023-08-29 15:50:00 +02:00
Miguel Pozo
b9cf854a99 Fix #111466: GPU: Don't add Textures twice to the same FrameBuffer
Avoid Textures running out of fb_ attachments and/or removing
previously added FrameBuffer GPUAttachments during the FrameBuffer
configuration process.

Pull Request: https://projects.blender.org/blender/blender/pulls/111531
2023-08-29 15:49:32 +02:00
Jeroen Bakker
f0385d7a9e Cleanup: Make format 2023-08-29 15:30:13 +02:00
Weizhen Huang
9fba9f418d Fix: EEVEE: runtime-generated BSDF LUT does not match the precomputed LUT
* `RUNTIME_LUT_CREATION` is disabled by default, but if set to `true`,
the new `bxdf_lut_frag.glsl` should generate the LUT that is submitted
in this commit. This new LUT is very close to the previously stored one.
* Generate the LUT by Monte-Carlo sampling with \(I = 1/N\sum\frac{f}{p}\),
except that the samples are not random, but mapped from a regular grid,
following previous approach to avoid interpolation artefacts caused by
noise.
* Added comments to make the computed quantities and the LUT usage more
clear.
* Glass with `IOR < 1` is now slightly darker due to single-scattering.
The lost energy will be recovered in a future commit.
* The special cases of `IOR == 0`, `roughness == 0` and `roughness == 1`
are handled well during microfacet sampling and evaluation, no need to
clamp.
* When `IOR == 1`, in theory BRDF is zero and BTDF is one, but we do not
make it a special case to allow smooth transition.

Pull Request: https://projects.blender.org/blender/blender/pulls/111632
2023-08-29 15:22:37 +02:00
Jeroen Bakker
bee3f645d8 Vulkan: Rewrite GHOST_ContextVK
This is a rewrite of GHOST_ContextVK to align with Metal backend as described
in #111389 - solution 3 with the adaptation that GHOST is still responsible
for presenting the swap chain image and a post callback is still needed in
case the swapchain is recreated.

This PR also includes some smaller improvements in stability.

Technical documentation: https://developer.blender.org/docs/eevee_and_viewport/gpu/vulkan/swap_chain/

* Renderpasses and framebuffers are not owned anymore by GHOST_ContextVK
* VKFramebuffer doesn't contain a swap chain image.
* Swapchain images can only be used as a blit destination or present source.
  Not as an attachment.
* GHOST_ContextVK::swapBuffers would call a callback with the image the
  GPU module needs to blit the results to.
* Clearing of depth/stencil attachments when no depth write state is set.
* Enable VK_KHR_maintenance4 to relax the stage interface mapping.
* Removes most vulkan validation warnings/errors.
* Detection of frame buffer changes that needs to be applied before
  performing a command requiring render pass (draw/clear attachment)

**Benefits**

* Late retrieval of a swap chain image results in better overall performance as
  Blender doesn't need to wait until the image is presented on the screen.
* Easier API and clearer state (transitions)
* More control over Image layouts and command buffer states. (Better alignment with
  Vulkan API)

Pull Request: https://projects.blender.org/blender/blender/pulls/111473
2023-08-29 15:05:08 +02:00
Weizhen Huang
068e117a8b Fix shader compile error due to saturate() not available
use `clamp()` instead
2023-08-29 15:02:42 +02:00
Damien Picard
ea974b6681 UI: fix and improve a few messages
- Multiple issues in the Data Transfer modifier error messages:
  - "None" -> "none", this word in the middle of a sentence, no need
    for upper case.
  - "amount of <element>" -> "number", more appropriate for discrete
    counts.
  - "doesn't" -> "does not", to respect Blender's style guide.
- "The grease pencil object need an Armature modifier" -> "needs",
  grammar.
- "Armature modifier is not valid or wrong defined" -> "is invalid".
  Unclear what "wrong defined" means.
- The "Recent Reports" text block has not been used since 2.81.
- "Not valid subdivisions found to rebuild lower levels" -> "No
  valid...", typo.
- "extensions repository" -> "extension repository": typo.
- "... , but loose correct blending..." -> "lose": typo.
- "True when multiple enums ": trailing whitespace.
- "Number of ray per pixel" -> "rays": typo.
- "Curve Parameter node" -> "Spline ...": this is the actual name of
  the node after its rename in 1cd9fcd98d.

Pull Request: https://projects.blender.org/blender/blender/pulls/111145
2023-08-29 14:49:02 +02:00
Alexander Gavrilov
fc8c8da885 Fix: handle bone collections in the object join operator
Pull Request: https://projects.blender.org/blender/blender/pulls/109976
2023-08-29 14:31:24 +02:00
Nathan Vegdahl
a1f081c212 Fix: uninitialized memory in bone collection unit tests
This caused the tests to fail in debug with address sanitizer.
2023-08-29 14:31:18 +02:00
Nathan Vegdahl
172a6d65a6 Fix: update BKE bone layer visibility checks to use bone collections 2023-08-29 14:31:18 +02:00
Alexander Gavrilov
f1111808b8 Fix: rename animation curves associated with bone collection properties 2023-08-29 14:31:18 +02:00
Nathan Vegdahl
9eee076a29 Anim: add custom property support for Bone Collections
Pull request: https://projects.blender.org/blender/blender/pulls/109976
2023-08-29 14:31:18 +02:00
Sybren A. Stüvel
998136f7a7 Anim: replace Bone Groups & Armature Layers with Bone Collections
Armature layers (the 32 little dots) and bone groups are replaced with
Bone Collections:

- Bone collections are stored on the armature, and have a name that is
  unique within that armature.
- An armature can have an arbitrary number of bone collections (instead
  of the fixed 32 layers).
- Bones can be assigned to zero or more bone collections.
- Bone collections have a visibility setting, just like objects in scene
  collections.
- When a bone is in at least one collection, and all its collections in
  are hidden, the bone is hidden. In other cases (in any visible
  collection, or in no collection at all), the bone visibility is
  determined by its own 'hidden' flag.
- For now, bone collections cannot be nested; they are a flat list just
  like bone groups were. Nestability of bone collections is intended to
  be implemented in a later 4.x release.
- Since bone collections are defined on the armature, they can be used
  from both pose mode and edit mode.

Versioning converts bone groups and armature layers to new bone
collections. Layers that do not contain any bones are skipped. The old
data structures remain in DNA and are unaltered, for limited forward
compatibility. That way at least a save with Blender 4.0 will not
immediately erase the bone group and armature layers and their bone
assignments.

Shortcuts:

- M/Shift+M in pose/edit mode: move to collection (M) and add to
  collection (shift+M). This works similar to the M/Shift+M menus for
  objects & scene collections.
- Ctrl+G in pose mode shows a port of the old 'bone groups' menu. This
  is likely to be removed in the near future, as the functionality
  overlaps with the M/Shift+M menus.

This is the first commit of a series; the bone collections feature will
be improved before the Blender 4.0 release. See #108941 for more info.

Pull request: https://projects.blender.org/blender/blender/pulls/109976
2023-08-29 14:31:18 +02:00
Sybren A. Stüvel
042c5347f4 Anim: move bone colors from bone groups to individual bones
Move control over the color of bones from bone groups to the bones
themselves. Instead of using bone groups (which are defined on the pose,
and thus owned by the object), the color is stored on:

- the bone (`struct Bone`, or RNA `armature.bones['bone_name'].color`)
- a possible override on the pose bone (`struct bPoseChannel`, or RNA
  `ob.pose.bones['bone_name'].color`).

When the pose bone is set to its default color, the color is determined
by the armature bone. In armature edit mode, the armature bone colors
are always used, as then the pose data is unavailable.

Versioning code converts bone group colors to bone colors. If the
Armature has a single user, the group color is stored on the bones
directly. If it has multiple users, the group colors will be stored on
the pose bones instead.

The bone group color is not removed from DNA for forward compatibility,
that is, to avoid immediate dataloss when saving a 3.6 file with 4.0.

This is part of the replacement of bone groups & armature layers with
bone collections. See the design task at #108941.

Pull request: https://projects.blender.org/blender/blender/pulls/109976
2023-08-29 14:31:18 +02:00
Hans Goudey
c9621a002d Cleanup: Sculpt: Remove duplicate visibility update function
`node_update_visibility_redraw` and `BKE_pbvh_update_visibility`
do the same thing, and the latter is better specialized for the three
PBVH types, so remove the first.

The two update methods were added in:
- f4411b58ad
- 38d6533f21

Pull Request: https://projects.blender.org/blender/blender/pulls/110709
2023-08-29 14:23:04 +02:00
Pratik Borhade
1eea5ac82a Fix #111545: Regression: Crash when drawing all view layers in outliner
Caused by d5c7608b39

view_layer is passed in outliner_add_element to fix the view layer
expansion (c2fdbcca3c). This result in crash after the recent refactor.
Use new struct to fix the crash and to maintain the fix of view
layer expansion.

Pull Request: https://projects.blender.org/blender/blender/pulls/111646
2023-08-29 14:11:23 +02:00
Julian Eisel
7fb58a33f0 Fix #111332: 4.0 files cannot be opened in 3.6, invalid region types
4.0 files now include asset shelf regions in 3D views. This region type is not
known to older Blender versions. So far, in such cases we would just change
the region type to be the first known region type and keep the region storage
otherwise. This was arbitrary, and in fact unsafe: the reused settings may
violate invariants/assumptions for a region type and worse, the
`ARegion.regiondata` can only be interpreted and correctly written to files
if the region type is known.

Make sure all invalid regions (regions where the type cannot be restored) are
removed on file read.

Committed to 3.6 release branch as e2d4403497.

Pull Request: https://projects.blender.org/blender/blender/pulls/111483
2023-08-29 14:10:43 +02:00
Weizhen Huang
dc9589d3e4 Cleanup: use utility function for LUTs parametrized by cos_theta and roughness
Pull Request: https://projects.blender.org/blender/blender/pulls/111651
2023-08-29 14:08:38 +02:00
Weizhen Huang
3876133ef5 Fix wrong factor in EEVEE multi-GGX average color
The original paper is assuming `f90 == 1`. However, it is just an
estimation, and the difference is really subtle.
2023-08-29 14:06:37 +02:00
Julian Eisel
567e3b9b19 Assets: Always use guarded allocator for weak references
Although I don't like the idea of using owning raw pointers in new APIs
like this (violates fundamental C++ good practises), this type is mostly
meant for writing to files via DNA. So we have to use Blender's memory
management via the guarded allocator here.

Considered making this an alternative function, but then we'd have to
duplicate logif or duplicate memory or so. Not worth it to me.
2023-08-29 13:49:58 +02:00
Philipp Oeser
cc01bb83f6 Fix #111490: paint radius set to 1 (shift-smoothing but brush missing)
This affected sculpt, vertex- and weightpaint.

So attempting to (temporarily) switching to the smooth/blur tools from
another tool using the "Shift" shortcut can fail if the corresponding
smooth/blur brush is not found/missing [which was the case in the report
because the brush was deleted].

In this case, brushes dont really get switched, but blender would still
try to cache the size (because the smooth/blur brush temporarily uses
the same size as the previous brush) of the smooth brush in
`StrokeCache` (see `smooth_brush_toggle_on`). Then in
`smooth_brush_toggle_off` it was assumed brushes were actually switched
and the (non-existing) size of the (missing) smooth brush was applied to
the **actual** brush.

Now restructure code a bit so in the case of a missing brush we can
early out (without affecting the **actual** brush then).

Pull Request: https://projects.blender.org/blender/blender/pulls/111516
2023-08-29 13:44:35 +02:00
Weizhen Huang
a69352824e Cleanup: simplify terms in EEVEE multiscatter GGX
Also update some comments

Pull Request: https://projects.blender.org/blender/blender/pulls/111634
2023-08-29 12:50:53 +02:00
Jacques Lucke
f518e86128 Cleanup: remove unused function
This exists now in `node_geo_switch.cc`.
2023-08-29 12:43:02 +02:00