Commit Graph

27029 Commits

Author SHA1 Message Date
Philipp Oeser
0d4e2ea40d Fix #126434: Boid particle fight rule crash involving non-boid psys
For the boid Fight rule (and when determining friend/enemy health), we
need to check if other `ParticleTarget` psys is actually boids as well
(their health data is accessed -- which is only present on boid particle
systems), otherwise NULL data access crashes.

I know, EOL, but simple crash fixers should still get a chance to get in
I think.
Could also go into LTSes.

Pull Request: https://projects.blender.org/blender/blender/pulls/126494
2024-08-19 17:01:18 +02:00
Aras Pranckevicius
6d93bf6b44 IMB: Speedups, fixes and cleanups to various image scaling functions
API: merged IMB_scalefastImBuf, IMB_scaleImBuf, IMB_scaleImBuf_threaded
into one function IMB_scale with enum IMBScaleFilter {Nearest, Bilinear, Box}
and bool "threaded" param.

Performance:
- Box filtering (nee IMB_scaleImBuf) can be multi-threaded now.
- Nearest filtering (nee IMB_scalefastImBuf) can be multi-threaded now.
  Also fix performance regression on float images caused by fix in #126234
- Bilinear filtering (nee IMB_scaleImBuf_threaded) is several times faster now.

Correctness:
- Nearest and Box filtering: no longer loses half of edge pixels when scaling
  up.
- Box: fixed garbage results (and possible out of bounds reads) for non-4
  channel float images.
- Bilinear: no longer shifts image when scaling up.
- Bilinear: properly filters when scaling down by 2x2.

Test coverage:
- Add gtest coverage for various IMB_scale modes.
- Add a IMB_performance_test performance test, ran manually.

More details, images and performance numbers in PR.

Pull Request: https://projects.blender.org/blender/blender/pulls/126390
2024-08-19 16:50:05 +02:00
Jacques Lucke
20bc346cf0 Fix: remove unnecessary manual user count
`tree_sharing_info_` is automatically user-counted now.
2024-08-17 11:21:55 +02:00
Jacques Lucke
e0b5654655 Cleanup: improve check for whether object has geometry set instances
This speeds up the file from #126391 from 3.2fps to 3.3fps.
2024-08-17 00:58:37 +02:00
Jacques Lucke
f21a25489f Volumes: speedup extracting dense voxel values
Extract dense voxels if a very memory bandwidth limited task. I get a 10-20%
speedup be reducing the number of threads doing it at the same time.
2024-08-17 00:25:36 +02:00
Jacques Lucke
aa3549f590 Fix: correct place where simplify level is taken into account for volumes
Otherwise it did not take the current frame into account properly when
the volume is a sequence.
2024-08-16 23:40:25 +02:00
Harley Acheson
aa78d43a05 UI: Multicolor Autokeying Indicator
Show the autokeying indicator (record button) on the Timeline header in
red when enabled. With a white outline on dark theme, or with a black
outline on light theme. The red color is user changeable.

Pull Request: https://projects.blender.org/blender/blender/pulls/126344
2024-08-16 23:16:40 +02:00
Jacques Lucke
4493842fe7 Cleanup: use ImplicitSharingPtr for volume tree sharing info
This avoids manual user management.
2024-08-16 17:45:25 +02:00
Jacques Lucke
cebffdc060 Cleanup: simplify using ImplicitSharingPtr for raw ImplicitSharingInfo 2024-08-16 17:36:29 +02:00
Jacques Lucke
e40c3e5662 Geometry Nodes: add memory counting for bake state 2024-08-16 17:20:19 +02:00
Hans Goudey
4b71496f56 Fix #120145: mesh_new_from_object crash with evaluated object type change
When the preserve_all_data_layers argument was passed, the object
would be reevaluated, assuming the type of the original object data.
However, the evaluated object type can change compared to the
original, so to reevaluate the original mesh we need to check that
the original object was also a mesh object.

Pull Request: https://projects.blender.org/blender/blender/pulls/126407
2024-08-16 16:56:18 +02:00
Bastien Montagne
5d0894f06a Packedfile reading: report filepath of missing packed file.
Can be useful info for users to rebuild missing data.
2024-08-16 15:04:21 +02:00
Bastien Montagne
7597f494b9 Fix #126147: Crash on reading blendfile with missing packed data.
Over the year, changes in how image packedfiles were handled broke the
fallback case of missing packed data in a few places, this commit fixes
proper cleanup of invalid packed files in the Image's list of
packedfiles.

In addition, also do not create inplicit sharing info when the read data
is `nullptr`.
2024-08-16 15:04:21 +02:00
Sean Kim
a2d6808a7a Revert "Fix: Sculpt: Correct asserts in previous commit"
This reverts commit 1602f82f28.

Original commit was correct, the affected functions are working on the
evaluated object, so we should assert that it is *not* the original
object.

Pull Request: https://projects.blender.org/blender/blender/pulls/126388
2024-08-16 06:50:16 +02:00
Campbell Barton
d71d325692 Cleanup: spelling in comments, strings 2024-08-16 09:33:20 +10:00
Hans Goudey
1602f82f28 Fix: Sculpt: Correct asserts in previous commit 2024-08-15 16:02:13 -04:00
Hans Goudey
f04fd1fad7 Refactor: Sculpt: Require depsgraph to access mesh positions
Part of #118145.
Similar to cfe69e32bc.
The dependency graph is required to access the evaluated object.
2024-08-15 15:43:17 -04:00
Hans Goudey
220cf67172 Cleanup: Improve object argument name
These functions expect an evaluated object which wasn't clear.
2024-08-15 13:09:28 -04:00
Hans Goudey
cfe69e32bc Refactor: Sculpt: Require object for position access
Part of #118145.
In preparation for removing the duplicated position arrays from the
pbvh::Tree structure, change the API functions that access the arrays
to require object arguments. This will allow retrieving data from the
original mesh or the evaluated deform mesh as necessary.

The pbvh code isn't really the right place for this, but neither is the
sculpt or paint code in my opinion, since this concept is not specific
to sculpting or painting. For now keep the API in the same place. It
probably makes sense to move a bunch of these functions at some point.

Pull Request: https://projects.blender.org/blender/blender/pulls/126370
2024-08-15 17:07:36 +02:00
Campbell Barton
b5e0b59736 Cleanup: remove space around identifiers in C-style comments 2024-08-15 20:46:00 +10:00
Jacques Lucke
a8667aa03f Core: introduce MemoryCounter API
We often have the situation where it would be good if we could easily estimate
the memory usage of some value (e.g. a mesh, or volume). Examples of where we
ran into this in the past:
* Undo step size.
* Caching of volume grids.
* Caching of loaded geometries for import geometry nodes.

Generally, most caching systems would benefit from the ability to know how much
memory they currently use to make better decisions about which data to free and
when. The goal of this patch is to introduce a simple general API to count the
memory usage that is independent of any specific caching system. I'm doing this
to "fix" the chicken and egg problem that caches need to know the memory usage,
but we don't really need to count the memory usage without using it for caches.
Implementing caching and memory counting at the same time make both harder than
implementing them one after another.

The main difficulty with counting memory usage is that some memory may be shared
using implicit sharing. We want to avoid double counting such memory. How
exactly shared memory is treated depends a bit on the use case, so no specific
assumptions are made about that in the API. The gathered memory usage is not
expected to be exact. It's expected to be a decent approximation. It's neither a
lower nor an upper bound unless specified by some specific type. Cache systems
generally build on top of heuristics to decide when to free what anyway.

There are two sides to this API:
1. Get the amount of memory used by one or more values. This side is used by
   caching systems and/or systems that want to present the used memory to the
   user.
2. Tell the caller how much memory is used. This side is used by all kinds of
   types that can report their memory usage such as meshes.

```cpp
/* Get how much memory is used by two meshes together. */
MemoryCounter memory;
mesh_a->count_memory(memory);
mesh_b->count_memory(memory);
int64_t bytes_used = memory.counted_bytes();

/* Tell the caller how much memory is used. */
void Mesh::count_memory(blender::MemoryCounter &memory) const
{
  memory.add_shared(this->runtime->face_offsets_sharing_info,
                    this->face_offsets().size_in_bytes());

  /* Forward memory counting to lower level types. This should be fairly common. */
  CustomData_count_memory(this->vert_data, this->verts_num, memory);
}

void CustomData_count_memory(const CustomData &data,
                             const int totelem,
                             blender::MemoryCounter &memory)
{
  for (const CustomDataLayer &layer : Span{data.layers, data.totlayer}) {
    memory.add_shared(layer.sharing_info, [&](blender::MemoryCounter &shared_memory) {
      /* Not quite correct for all types, but this is only a rough approximation anyway. */
      const int64_t elem_size = CustomData_get_elem_size(&layer);
      shared_memory.add(totelem * elem_size);
    });
  }
}
```

Pull Request: https://projects.blender.org/blender/blender/pulls/126295
2024-08-15 10:54:21 +02:00
Hans Goudey
6ca352a7b6 Refactor: Sculpt: Remove mesh pointer from BVH tree, pass to drawing code
Part of #118145.
Similar in concept to recent commits removing the usage of
this mesh pointer in favor of fetching the data as necessary.
Also see recent discussion in a recent fix for this area:
https://projects.blender.org/blender/blender/pulls/122850.

And also note the comment for `Tree::mesh_` was incorrect.
The mesh was the original mesh, not the evaluated mesh.
2024-08-15 00:24:12 -04:00
Hans Goudey
ae8ecd6e4e Cleanup: Remove unused variables 2024-08-15 00:00:44 -04:00
Hans Goudey
0c0a9d7714 Cleanup: Remove unused variables 2024-08-14 23:58:07 -04:00
Hans Goudey
9a776830a6 Refactor: Sculpt: Reduce usage of BVH tree positions array
In preparation for removing the positions array from the BVH tree
and just retrieving the evaluated or original positions as necessary.
2024-08-14 23:27:20 -04:00
Hans Goudey
bd19212fb8 Refactor: Sculpt: Avoid BVH tree geometry pointers in normals update
Part of #118145.
There is some complexity in this area because the normals need to be
updated on the original geometry only when there is no deformation
or multires modifier. The simplest way to encapsulate that usage of
the original geometry for now was adding a separate function that
contains the lookup with a comment justifying it.
2024-08-14 23:19:39 -04:00
Hans Goudey
561d035da4 Cleanup: Follow class layout style guide for SculptSession 2024-08-14 23:19:39 -04:00
Hans Goudey
6703927a05 Refactor: Sculpt: Retrieve positions instead of using BVH tree reference
Part of #118145.
2024-08-14 21:10:04 -04:00
Hans Goudey
70a24258c6 Sculpt: Remove unused positions array copy with some deform modifiers
Last usage was removed in 0250596f5b.
2024-08-14 14:10:32 -04:00
Hans Goudey
658b32093a Refactor: Sculpt: Replace sculpt attribute system for dynamic topology data
Part of #118145.
Use the BMesh functions instead of the sculpt attribute API which we
intend to remove.
2024-08-14 10:25:52 -04:00
Hans Goudey
e612260f5c Refactor: Sculpt: Replace sculpt attribute system for persistent base data
Part of #118145.
Use the mesh attribute API instead of the sculpt attribute API which we
intend to remove.
2024-08-14 10:13:37 -04:00
Aras Pranckevicius
df00c30fcd Fix #126201: Video artifacts when rendering into ffmpeg with PNG codec
Started happening with 422dd9404f that introduced multi-threaded
conversions of src->dst (usually RGBA->YUV) format before encoding
the frame with ffmpeg. But the issue itself is not related to
multi-threading, but rather with the fact that AVFrame objects
started to be backed by an AVBuffer object (as that is needed for
threaded swscale to work).

Turns out, if a frame is backed by AVBuffer object, said buffer
might become "non writable" because it got shared (non-1 refcount).
And that happens with some ffmpeg video codecs, particularly PNG one.

Make sure to make the AVFrame objects writable inside
generate_video_frame. This follows official ffmpeg example
(doc/examples/encode_video.c) that explains why that is needed:

"the codec may have kept a reference to the frame in its internal
structures, that makes the frame unwritable. av_frame_make_writable()
checks that and allocates a new buffer for the frame only if necessary"

Pull Request: https://projects.blender.org/blender/blender/pulls/126317
2024-08-14 16:07:11 +02:00
Hans Goudey
2af62ba0f6 Refactor: Sculpt: Reduce usage of BVH tree geometry back pointers
Similar to 9eb7e8bfd1
Pass the object instead of retrieving geometry data from the BVH tree.
2024-08-13 19:01:15 -04:00
Hans Goudey
1661f0728f Cleanup: Remove usage of BKE_pbvh_get_mesh
Part of #118145.
This acts as a back pointer, allowing code that looks like it just deals with
the sculpt BVH tree to do basically anything.
2024-08-13 19:01:15 -04:00
Jacques Lucke
4f491aca80 Fix #126286: crash when opening blend file with point cache 2024-08-13 19:53:46 +02:00
Jacques Lucke
e1422530d6 Fix: crash when attempting to unload volume tree twice 2024-08-13 17:47:52 +02:00
Hans Goudey
9eb7e8bfd1 Refactor: Sculpt: Reduce reliance on BVH tree geometry back pointers
Retrieve the relevant data directly from the original object's mesh
(or the evaluated SubdivCCG in that case) rather than using the
BVH tree's geometry points which we'd like to remove.

Pull Request: https://projects.blender.org/blender/blender/pulls/126284
2024-08-13 17:38:09 +02:00
Christoph Lendenfeld
9741750497 Refactor: move BKE_action_get_item_transform_flags out of the kernel
No functional changes expected.

The function `BKE_action_get_item_transform_flags` was only ever used in a single place.
As such it could be a static function within the given file.
This reduction in scope will help with future refactors.

This is in service of fixing #126125 since the function in its current form
does not support layered actions.

Pull Request: https://projects.blender.org/blender/blender/pulls/126287
2024-08-13 17:04:01 +02:00
Anthony Roberts
9df75725be Switch to using blender::BitVector in tile changesets
This avoids an issue in clang-cl on Windows ARM64 where an invalid pointer would be (re)used.

See #124182 for more details, but basically without this, when the vector of tiles inside changeset is resized, a reference to an invalid pointer (ie, the location in the old vector) is kept somewhere, which makes the test fail.

Pull Request: https://projects.blender.org/blender/blender/pulls/126083
2024-08-13 16:52:52 +02:00
Jacques Lucke
05925b404d Fix #125419: crash when loading baked data with empty instances
The problem was the automatic instance deduplication. There were two
instance references before baking, both of which were referenced by instances.
When loading the bake, they were deduplicated, so there was only one geometry,
but the instances still referenced two.

The fix is to not do deduplication when loading instances from a bake.
2024-08-13 14:10:25 +02:00
Sean Kim
45d9bfa734 Refactor: Sculpt: Add active_vert_index() and active_vert_position()
* Adds two helper methods, the first replacing direct access to the
  PBVHVertRef i value, the second replacing the previously removed
  SCULPT_active_vertex_co_get
* Removes most trivial usage of active_vert_ref(), the remaining cases
  are a bit more complex and need separate PRs

Pull Request: https://projects.blender.org/blender/blender/pulls/126186
2024-08-12 18:57:24 +02:00
Jacques Lucke
e842966c5e Nodes: add group node default width
This adds the ability to customize the default width of a group node that's
created for a node group. This feature works towards the goal of unifying the
features available to built-in nodes and node groups. We often customize the
width of built-in nodes from them to looks slightly better (e.g. to avoid
cut-off labels).

Pull Request: https://projects.blender.org/blender/blender/pulls/126054
2024-08-11 19:25:53 +02:00
Campbell Barton
b1be5b15c4 Cleanup: various non functional changes
Remove struct, use string copy macros.
2024-08-10 11:32:43 +10:00
Hans Goudey
12aa569f6e Cleanup: Remove now unused PBVH vertex iteration macro
Part of #118145.
2024-08-09 17:33:04 -04:00
Jesse Yurkovich
67eef274ee Build: C++20: Replace the removed std::shared_ptr::unique API
C++20 removes the `std::shared_ptr::unique()` API with the suggestion to
use the `use_count()` method instead.

Note that we are using the unique/use_count APIs in a way that is
generally cautioned against though our usage patterns may be fine.

See: https://en.cppreference.com/w/cpp/memory/shared_ptr/unique
Example errors: https://godbolt.org/z/1j3zzd1hP

Ref #125881

Pull Request: https://projects.blender.org/blender/blender/pulls/126120
2024-08-09 19:47:29 +02:00
Hans Goudey
72b5fd677b Cleanup: Sculpt: Use C++ Array for fake neighbor indices 2024-08-08 15:56:38 -04:00
Jacques Lucke
d74d8ceb23 Cleanup: move BKE_packedFile.h to C++
Part of #103343.
2024-08-08 15:13:20 +02:00
Hans Goudey
2582858e08 Refactor: Sculpt: Specialize grab active vertex preview
The preview is only supported with deform modifiers which are
only supported for Mesh sculpting, so just write that implementation.
Also remove SculptSession::vert_positions which is now unnecessary.
2024-08-07 22:13:18 -04:00
Hans Goudey
5946af3556 Cleanup: Sculpt: Reduce usage of sculpt session positions array
Part of #118145.
Remove some uses of the `SculptSession` array in favor of retrieving
positions as necessary. Because of implicit sharing, avoiding unnecessary
mutable references to data can avoid copies and increased memory usage.
There are still more places to change before sculpt mode recieves that
benefit though.
2024-08-07 21:18:37 -04:00
Sean Kim
e16e07b2da Refactor: Introduce typed version of SculptSession#active_vertex
Part of #118145.

Uses std::variant (and std::monostate to represent no value) to hold the
current active vertex type among the three different concrete types.

Pull Request: https://projects.blender.org/blender/blender/pulls/126000
2024-08-07 21:17:42 +02:00