Commit Graph

24014 Commits

Author SHA1 Message Date
Omar Emara
3f6912ece2 Realtime Compositor: Implement Mask node
This patch implements the Mask node for the realtime compositor. The
evaluation of the mask is not GPU accelerated, but is cached as a form
of temporary implementation until we implement a GPU evaluator for
masks.

One limitation currently is that we do not redraw the viewport while the
mask is getting edited by the user, because always doing that will be
redundant in most situations, and conditioning the redraw requires a lot
of work that should be handled outside of this patch.

This is similar to the Texture node implementation in 151a53110c.

Pull Request: https://projects.blender.org/blender/blender/pulls/107464
2023-05-01 11:29:06 +02:00
Campbell Barton
cfe25e6efb Use native path separators for run-time generated paths 2023-04-30 15:08:26 +10:00
Campbell Barton
d145dfdae0 Fix #107443 movie clip fails to load
Regression with incorrect sizeof argument to BLI_path_sequence_encode.

[0]: 6701d24084
2023-04-29 11:31:16 +10:00
Harley Acheson
a20bb83c21 Fix 3D text selection & cursor mismatch when not on curve
Commit 5c184525ed improved text cursor
placement when text is on a curve, but when not on a curve it is now
on the baseline. This corrects for that, placing 25% below baseline.
2023-04-28 14:12:56 -07:00
Damien Picard
44103f5529 I18n: improve geometry nodes field tooltips
Node socket tooltips suffered from several issues.

- Some could not be translated because they were not properly
  extracted, so extraction macros were added.

- Some were extracted but included newlines at the end which did not
  get translated, such as `ss << TIP_("Geometry:\n")`, changed to
  `ss << TIP_("Geometry:") << "\n"`.

- Some translations were not functional, such as:
  `TIP_(attributes_num == 1 ? " Named Attribute" : " Named Attributes");`
  because `TIP_()` needs to be around a single string.

- Some extraction macros had no effect and were removed, such as:
  `.description(N_(leading_out_description));`
  This is a no-op macro which can be used only around a string literal.

Pull Request: https://projects.blender.org/blender/blender/pulls/107257
2023-04-28 21:37:33 +02:00
Hans Goudey
96fd14a65f Cleanup: Fix typo in mesh sample function name 2023-04-28 14:45:22 -04:00
Hans Goudey
bec033e057 Cleanup: Simplify and deduplicate mesh sampling code
It arguably reads easier if simple operations like reading from indices
of an array don't each get their own line. Also the same corner
attribute sampling was repeated in a few places. And add a new
function to sample normals from the corner domain, and use
lower level arguments to the lower level functions (i.e. not just
a mesh pointer, but the necessary data arrays).
2023-04-28 14:45:22 -04:00
Hans Goudey
696b56c1da Cleanup: Add note about adding attributes while iterating 2023-04-28 14:45:22 -04:00
Hans Goudey
82769653f8 Cleanup: Use short2 for custom normals, simplify access
Use a span instead of a pointer, which allows using `fill_indices`
to set values and using the assign operator in the future.
2023-04-28 14:00:10 -04:00
Hans Goudey
098e58ea24 Attributes: Allow attribute API to create non-deleteable attributes
This can be useful to allow creating these core attributes with shared
arrays. Otherwise CustomData has to be used directly, which is nice
to avoid. This was done in e45ed69349, but not everywhere.
2023-04-28 10:24:32 -04:00
Hans Goudey
67700ced54 BLI: Add "take front" and "take back" methods to bit spans
This is consistent with `Span`, and also allows returning a bounded
bit span when taking the front of an existing bounded span, which
can simplify using optimized bit processing.

Pull Request: https://projects.blender.org/blender/blender/pulls/107441
2023-04-28 16:14:03 +02:00
Hans Goudey
5a1013f6a8 Fix #106289: Copy optimal display edges in mirror, array modifiers
These aren't propagated as attributes since interpolating them with the
generic rules often gives strange results, and they're intended to as
an optimization. Though theoretically it would be nice if this
copying became more generic in the future.
2023-04-28 10:05:57 -04:00
Campbell Barton
ff0cf45bc2 Fix potential buffer overflows from invalid string size arguments
- FILENAME_MAX was used when the output was later limited by FILE_MAX.
- Some were passing in incorrect/dummy sizes in a couple of places.
2023-04-28 21:49:05 +10:00
Campbell Barton
ba978e1b68 Fix potential buffer overflow in internal pointcache logic
Buffer lengths in internal point-cache logic offent didn't match
the actual buffer size.
2023-04-28 21:45:19 +10:00
Campbell Barton
e462e20e21 Fix buffer overflow in BKE_image_ensure_tile_token use
BKE_image_ensure_tile_token took only the file name component but used
FILE_MAX to limit the input buffer.

Split this function in two, one that takes the full path as this is the
most common usage and another which takes only the filename.
Both now take a string size argument.
2023-04-28 21:40:04 +10:00
Campbell Barton
6701d24084 BLI_path: add string size arguments to sequence encode/decode functions 2023-04-28 21:33:38 +10:00
Campbell Barton
5c184525ed Fix 3D text selection & cursor mismatch with text-on-curve enabled
The cursor & selection were shifted down in local (object) space,
ignoring character rotation.
2023-04-28 21:15:38 +10:00
Campbell Barton
6586c4c73f Fix negative index in text cursor drawing
Recent changes to cursor drawing read an index of -1 when there was no
text.
2023-04-28 21:14:07 +10:00
Jacques Lucke
b4d914b676 BLI: support weak users and version in implicit sharing info
The main goal of these changes is to support checking if some data has
been changed over time. This is used by the WIP simulation nodes during
baking to detect which attributes have to be stored in every frame because
they have changed.

By using a combination of a weak user count and a version counter, it is
possible to detect that an attribute (or any data controlled by implicit
sharing) has not been changed with O(1) memory and time. It's still
possible that the data has been changed multiple times and is the same
in the end and beginning of course. That wouldn't be detected using this
mechanism.

The `ImplicitSharingInfo` struct has a new weak user count. A weak
reference is one that does not keep the referenced data alive, but makes sure
that the `ImplicitSharingInfo` itself is not deleted. If some piece of
data has one strong and multiple weak users, it is still mutable. If the
strong user count goes down to zero, the referenced data is freed.
Remaining weak users can check for this condition using `is_expired`.

This is a bit similar to `std::weak_ptr` but there is an important difference:
a weak user can not become a strong user while one can create a `shared_ptr`
from a `weak_ptr`. This restriction is necessary, because some code might
be changing the referenced data assuming that it is the only owner. If
another thread suddenly adds a new owner, the data would be shared again
and the first thread would not have been allowed to modify the data in
the first place.

There is also a new integer version counter in `ImplicitSharingInfo`.
It is incremented whenever some code wants to modify the referenced data.
Obviously, this can only be done when the data is not shared because then
it would be immutable. By comparing an old and new version number of the
same sharing info, one can check if the data has been modified. One has
to keep a weak reference to the sharing info together with the old version
number to ensure that the new sharing info is still the same as the old one.
Without this, it can happen that the sharing info was freed and a new
one was allocated at the same pointer address. Using a strong reference
for this purpose does not work, because then the data would never be
modified because it's shared.
2023-04-28 12:05:00 +02:00
Philipp Oeser
19aaf980d5 Cleanup: format 2023-04-28 11:46:25 +02:00
Hans Goudey
1777f40c27 Cleanup: Remove global mesh threading size macro
The grain size depends on the algorithm, it doesn't make sense to use
the same value for multiple areas just because they relate to `Mesh`.
The comment mentions OpenMP which isn't used anymore.

Also remove an unused forward declaration.
2023-04-27 22:46:07 -04:00
Campbell Barton
a1e472615f BKE_unit: assert index access is in range 2023-04-28 12:23:29 +10:00
Harley Acheson
1d2eab9ab3 VFont: Corrections to Cursor When on Curve
Corrections to transformation and placement of the text cursor when the
text is being deformed by a curve.

Pull Request: https://projects.blender.org/blender/blender/pulls/107307
2023-04-27 22:07:03 +02:00
Hans Goudey
9292e094e7 Mesh: Reduce memory usage calculating custom normals
Reduces the size of the struct storing normal space from 72 to 64.
2023-04-27 10:31:34 -04:00
Jacques Lucke
18f4fd6b85 Attributes: Add function to rename attribute
This is implemented by removing the attribute and adding it again with
a different name. In the expected case though, implicit sharing is used
to avoid copying the array.

For now this doesn't rename UV sublayers or replace active/default color
attribute names. It's not clear where that should happen, but for now
things are clearer if those stay at a higher level.
2023-04-27 10:31:34 -04:00
Hans Goudey
3c43632651 Mesh: Allocate custom normal spaces in array
Avoid many small allocations and just allocate all the structs in one
array, which is 4 times faster. In a test with an armature modifier and
custom normals, corner normal calculation went from 2.7 to 2.3 ms.
2023-04-27 08:50:41 -04:00
Hans Goudey
f8eebd3b25 Cleanup: Use simpler C++ types in mesh corner normals code
The various stacks are just filled and then emptied. We also expect
them to be fairly small. A vector can handle these cases fairly well.
Also store indices rather than pointers. I didn't notice any performance
changes from these changes.
2023-04-27 08:50:41 -04:00
Hans Goudey
a6baf7beae BLI: Allow different integer types when filling span indices 2023-04-27 08:50:41 -04:00
Hans Goudey
9fcfba4aae Mesh: Reduce memory corner normals memory usage and simplify threading
Instead of storing a 24 byte struct for every face corner we must do
calculations for, just gather the face corner index in the first single
threaded loop. And don't fill them in chunks and use the task pool API.
Instead just fill vectors and use standard "parallel_for" threading.
The check that avoided threading for tiny meshes becomes redundant this
way too, which simplifies the code more. Overall this removes over
100 lines of code.

On a Ryzen 7950x, face corner ("split"/"loop") normal calculation in a
small armature modifier setup with custom normals went from 4.1 ms to
2.8 ms. Calculation for a 12 million face mesh generated with curve to
mesh with end caps went from 776 ms to 568 ms.

Similar commits:
- 9e9ebcdd72
- 9338ab1d62
2023-04-27 08:50:41 -04:00
Hans Goudey
032e69527d Cleanup: Fix spelling in subdiv function name 2023-04-26 12:42:48 -04:00
Hans Goudey
bdaf8e3715 Cleanup: Avoid storing redundant information in corner normals task data
Though alignment means the size of the struct doesn't change
if the data is split up a bit more it could give further improvement.
2023-04-26 08:50:31 -04:00
Hans Goudey
803f03ae32 Cleanup: Remove redundant namespaces in mesh normals code
Also use int instead of uint.
2023-04-26 08:46:11 -04:00
Hans Goudey
93f99859bc Cleanup: Standardize mesh corner normals code
Use consistent variable names: for example "vert" instead of "mv" and
"edge" instead of "me", etc. Also use helper functions like "edge other
vert" to make the code easier to read.
2023-04-26 08:46:11 -04:00
Hans Goudey
b54398c16c Geometry Nodes: Use implicit sharing in store/capture attribute nodes
Some fields reference attributes directly. When the referenced attribute
has the requested type and domain, the captured/stored attribute can
share its array, avoiding the cost of duplication and reducing memory
usage, at least temporarily until either attribute is modified.

This only works when the attribute doesn't need validation and when
the selection input isn't used, since those potentially need to change
values in the arrays.

I saw this save 200MB and 11 ms of copying for a simple grid with
16 million points (creating the grid takes about 60ms).

Pull Request: https://projects.blender.org/blender/blender/pulls/107357
2023-04-26 14:38:56 +02:00
Campbell Barton
db1af0e325 Cleanup: spelling in comments 2023-04-26 16:14:07 +10:00
Hans Goudey
5727851d65 Cleanup: Declare field context variables const 2023-04-25 22:23:38 -04:00
Hans Goudey
ae57d86d42 Fix #107095: Spikes during multires reshape propagation
Linear subdivision or interpolating from a lower multires level gave
spikes at some vertices. Caused by incorrect corner edge indexing.
This was simple to solve by building the old MLoop array on demand
and reverting parts of 16fbadde36.
2023-04-25 15:59:05 -04:00
Dalai Felinto
5d0595fded Suport relative path option per-asset library
This option is true by default, but it can be changed for
any asset library (that may be using Link as import method).

This also fix "Reset to Default Value" for the Import Method
since this was originally not using the defaults.

Pull Request: https://projects.blender.org/blender/blender/pulls/107345
2023-04-25 20:56:57 +02:00
Brecht Van Lommel
ca52f0fae3 Cleanup: make format 2023-04-25 20:19:43 +02:00
Bastien Montagne
cbcf9058cd Fix (unreported) potential missing deletion of some linked liboverrides during resync.
The code checking whether old liboverrides which have been resynced into
new ones should be deleted was still assuming it was only working on
local liboverrides.

However, since recursive resync was implemented, this is not true
anymore, it can also handle resynced linked liboverrides.

This could have lead to missing deletion of some old linked liboverrides
after resyncing them.
2023-04-25 15:51:03 +02:00
Bastien Montagne
5f67b25c28 LibOverride: Do not attempt to resync a hierarchy when the root goes missing.
This addresses an issue here at the Blender studio, where a root
collection of a set was removed by mistake from the set library .blend file.

Since all the other linked data (sub collections, actual objects etc.)
of the set were still available, the liboverride resync code went crazy
trying to resync all these scattered pieces of a set, finding new valid
root IDs for the hierarchies, and so on.

So from now on, do not attempt to resync anything that is part of a
liboverride hierarchy which root ID linked reference has gone missing.
2023-04-25 15:51:03 +02:00
Bastien Montagne
b666d2d1bd Fix further (unreported) issues in object collection cache cleanup code.
`BKE_collection_object_cache_free` can be called from some points in
code (e.g. during ID remapping) where proper parenting relationships
between collections cannot be ensured.

Would be good to check if recursive cache cleanup is actually needed
from these points, it would almost certainly be better and safer to
instead tag parent collections as dirty too, but this will be for
another time.

For now, just add a NULL-check on the parent collection pointer.
2023-04-25 15:51:03 +02:00
Bastien Montagne
250d35928e Fix (unreported) broken code in BKE_collection_object_cache_free.
This call should be recursive, only freeing cache of immediate parents
of the collection is not enough, the whole parenting chain needs to be
processed.
2023-04-25 15:51:03 +02:00
illua1
70504a35dd Cleanup: Type conversions in node.cc
Make sure that function style, reinterpret_cast, and static_cast are
used for all type conversions, without of casting to void *. Some other
related minor changes: add temporal variables, lost space, asserts for
case to avoid type conversions by using `->id` way.

Pull Request: https://projects.blender.org/blender/blender/pulls/107097
2023-04-25 14:38:24 +02:00
Jacques Lucke
a57584e40d BLI: extract MapItem type to simplify iterating over map items 2023-04-25 12:15:02 +02:00
Omar Emara
151a53110c Realtime Compositor: Implement Texture node
This patch implements the Texture node for the realtime compositor. The
evaluation of the texture is not GPU accelerated, but is cached as a
form of temporary implementation since the Texture node is deprecated
and will be removed in the future. Furthermore, texture node evaluation
is not supported for now.

This patch also introduces the concept of an ID static cache, which
uses the DrawDataList mechanism to invalidate the cache as needed,
consequently, a DrawDataList was added to the Tex ID structure.

An improvement that should be implemented outside of this patch is to
implement support for proxy textures in results to avoid redundant
copies in the execute method of the texture node. This should be
straightforward bit will be implemented in a separate patch.

Pull Request: https://projects.blender.org/blender/blender/pulls/107291
2023-04-25 09:04:35 +02:00
Hans Goudey
2cbf536605 Cleanup: Use consistent enum type in header
Fixes a warning on GCC 13 about `uint` being used in the declaration and
the proper enum type `eDupli_ID_Flags` being used in the definition for
`BKE_id_copy_for_duplicate`.
2023-04-24 21:45:12 -04:00
Hans Goudey
30f8e688c3 Fix: Wrong crease accessed for multires reshape
Also fix one more case of incorrect conversions from char to float.
2023-04-24 21:42:12 -04:00
Hans Goudey
9f78530d80 Multires: Use cached loose edge information
Avoids iterating over poly and corner edge index arrays.
2023-04-24 21:39:50 -04:00
Hans Goudey
3507431c30 Subdiv: Optimize coarse position extraction with cache
The coarse positions given to the evaluator are skipped if there are
vertices not attached to faces. Use the cache from 8e967cfeaf
to skip that topology query, or even to tell if there are no such vertices,
so we can skip a copy completely. I observed a 12x improvement for this
step, from 7.5 ms to 0.6 ms on a 1 million vertex grid.
2023-04-24 17:01:12 -04:00