* Brush editor tab now defaults to old
interface, with two options:
- Advanced, which shows more options
- Edit Mode, which shows workspace visibility buttons
* Hard edge mode (which forcibly sets face set slide to 0
and enables preserve faceset boundarys) now works again.
* Smooth_strength_factor is now a brush channel with
inheritance set to true.
* Alt-smooth now restores the hard edge mode and
smooth_strength_factor from the active brush context.
While both are default inherited from toolsetting defaults,
it can be quite confusing if either have inheritance unset
by the user in the Smooth brush.
* Fixed a particularly nasty memory leak
where the entire process of entering sculpt
mode was being done twice.
* Discovered that range tree is extremely slow.
Got the alternative freelist version up and running,
and replace a usage of GSet with a bitmap. However
the new code is disabled pending further testing.
Literally an order of magnutude improvement.
* Cleaned up the SculptCustomLayer API that is
used for custom data.
* Various SculptCustomLayer references are now maintained
in ss->custom_layers and are updated automatically when
the CD layout changes.
* PBVH_GRIDS now forcibly allocate custom layers in simple_array
mode (i.e. they don't allocated real customdata layers at all).
* SculptCustomLayers can optionally be preserved in the final mesh.
* Fixed handling of CD_TEMPORARY which was broken.
* The layer brush can now split the pbvh during use.
* Persistent base data is now saved as permanent CD layers (except
for PBVH_GRIDS). This is necessary for undo, if we want we can
add special code to remove them on exising sculpt mode.
* The layer brush now uses the SculptCustomLayer API instead of
having seperate bmesh and faces/grids implementations.
* In unrelated changes, fixed curve presets for clay brushes.
- Still need to implement stabilized input mappings, which the
clay thumb brush needs.
Seperate enabling PBVH_BMESH from enabling DynTopo:
* Created a new option to globally disabled
DynTopo.
* The DynTopo panel header now reads "Dynamic Mode",
to hopefully signal that turning on PBVH_BMESH is
a seperate step from enabling or disabling DynTopo
itself.
* The first checkbox in the panel is "DynTopo" so it
should be clear enough (it's on by default, with multiple
layers of file versioning checks).
PBVH_BMesh's undo system:
* CD_MESH_ID layers are now permanently saved once
they are created (by default they are not). This
fixed a *lot* of bugs:
Before this the undo system had to save maps between
mesh indices and mesh IDs on transitioning
between sculpt and global undo steps. This was
extremely error prone, and it simply wasn't possible
to cover all of the corner cases
* Note that there is still an odd bug where the first
global undo push after a sculpt step gets ignored,
I dunno what's up with this.
* Dyntopo undo should be nearly (hopefully completely)
bug-free after this commit.
C++20
* Made a few small changes to get blender to compile
with c++20. std::result_of was removed, had to
replace a couple of usages of it with std::invoke_result.
* I'm planning to do some design studies on rewriting
sculpt into C++.
* I strongly suspect we are going to need C++20'a new
concepts feature if we move sculpt into C++.
I'm planning to do some design studies on how
that might work.
* Fixed noise on using autosmooth with tools that use original
coorinates. While this was most prominent with DynTopo,
it did happen with other tools.
* The solution is to smooth the original coordinates as well
as the explicit coordinates if the active tool requires
original data.
* I decided to replace the original coordinates system for
PBVH_FACES and PBVH_GRIDS with the same MDynTopoVert structure
DynTopo uses. The alternative would have been extremely messy
code.
* Todo: Rename MDynTopoVert to. . .SculptInfoVert?
* Todo: Cache boundary flag and corner info in MDynTopoVert->flag
for PBVH_FACES/GRIDS similar to PBVH_BMESH.
This implements the initial core framework for fields and anonymous
attributes (also see T91274).
The new functionality is hidden behind the "Geometry Nodes Fields"
feature flag. When enabled in the user preferences, the following
new nodes become available: `Position`, `Index`, `Normal`,
`Set Position` and `Attribute Capture`.
Socket inspection has not been updated to work with fields yet.
Besides these changes at the user level, this patch contains the
ground work for:
* building and evaluating fields at run-time (`FN_fields.hh`) and
* creating and accessing anonymous attributes on geometry
(`BKE_anonymous_attribute.h`).
For evaluating fields we use a new so called multi-function procedure
(`FN_multi_function_procedure.hh`). It allows composing multi-functions
in arbitrary ways and supports efficient evaluation as is required by
fields. See `FN_multi_function_procedure.hh` for more details on how
this evaluation mechanism can be used.
A new `AttributeIDRef` has been added which allows handling named
and anonymous attributes in the same way in many places.
Hans and I worked on this patch together.
Differential Revision: https://developer.blender.org/D12414
instead of leaving that to the client.
Also semi-fixed uninitialized memory bug in bmesh unit test (dunno
how best to memset a C struct in C++ won't won't run afoul of some
random compiler somewhere).
The crash was caused by a mistake in 5f9677fe0c
where the pointers to the custom data layers would be overwritten with the one
for the first layer, as CustomData_duplicate_referenced_layer is only about the
first layer. customData_duplicate_referenced_layer_index should be used instead
to duplicate the right layer.
A few notes:
* MESH_ID layers are not saved on conversion to Mesh unless
you ask for it in BM_mesh_bm_to_me's params.
* Still need to test the box/lasso trim tools.
* Need to find some way to test loop/edge ids, which aren't
used by dyntopo.
bmesh
* System is per element type. So you can have unique ids for verts and
faces, but not edges and loops.
* Supports an optional id to element lookup table.
* Uses single id space for all elements
* Added a new CD_FLAG_ELEM_NOCOPY flag to tell
customdata_bmesh_copy_data to ignore that layer.
* IDs are stored as a temporary customdata layer with
CD_FLAG_ELEM_NOCOPY set.
When baking some data, we create a new Mesh with edits and modifiers applied.
However, in some cases (e.g. when there is no modifier), the returned Mesh is
actually referencing the original one and its data layers. When autosmooth is
enabled we also split the Mesh. However, since the new Mesh is referencing the
original one, although `BKE_mesh_split_faces` is creating new vertices and edges,
the reallocation of the custom data layers is preempted because of the
reference, so adding the new vertices and edges overwrites valid data
To fix this we duplicate referenced layers before splitting the faces.
Reviewed By: brecht
Differential Revision: https://developer.blender.org/D11703
* Wrote a new API for wrangling temporary customdata layers across pbvh types:
- SCULPT_temp_customlayer_ensure: makes sure a (named) customdata
layer exists. Works for multires; since these are temporary
layers we can safely allocate them in a temporary CustomData
structure (in ss->temp_vdata).
- SCULPT_temp_customlayer_get: initializes a special structure,
SculptCustomLayer, that is used to get per elem customdata.
- SCULPT_temp_cdata_get: Uses a SculptCustomLayer ref along with
a SculptVertexRef to look up the data.
* Sculpt code seems to be memory bandwidth bound.
* Some key topology loops will have to be written manually
instead of using BM_ITER.
I wrote a function to re-allocate a bmesh with elements ordered by
PBVH leaf nodes, SCULPT_reorder_bmesh. It's currently disabled.
This is going to take more profiling, but my original proxy refactor
idea might be worth revisiting. Might be more cache efficient.
The good news is that the worst case is the smooth code, which I can speed
up significantly by keeping a bit of state around.
- This required implementing SCULPT_UNDO_GEOMETRY for dyntopo.
That turned out to be more work then I expected. Basically
it writes an entire Mesh to BMLogEntry, which can be swapped
with current bmesh. Tricky part was patching bm log ids.
It stores:
- Original coordiates, colors and mask (which were previously four
seperate layers).
- A bitmask with (currently) one bitflag, whether or not a vertex is
on a boundary.
I needed to cache calculating vertex boundary state (which involves
iterating over the edges surrounding a vertex) and got fed up with
having so many CD layers for dyntopo. This struct consolidates them
and saves having yet another layer just to store a flag.
The Exact modifier code had been written to avoid using BMesh but
in the initial release the modifier still converted all Meshes to
BMeshes, and then after running the boolean code on the BMeshes,
converted the result back to a Mesh.
This change skips that. Most of the work here is in getting the
Custom Data layers right. The approach taken is to merge default
layers from all operand meshes into the final result, and then
use the original verts, edges, polys, and loops to copy or interpolate
the appropriate custom data layers from all operands into the result.
Having a vertex group in a mesh slowed down unrelated operations
such as selection.
De-duplicating custom-data arrays for layers that contain pointers
can become slow without any benefit as the content never matches.
Use full copies when storing custom-data for edit-mesh undo.
This improves the fix introduced in rBdc8b31af578bfcf9f77dbce6d7b7da1006a3c8c1.
While it did not result in other bugs afaik, I thought it would be
good to make the fix more specific, in case some other code did
expect `layer->data` to be null. This updated fix checks for the
very specific case the fix was intended for.
The issue was that boolean custom data layers were not written to files,
because the dna struct name `bool` does not exist. Adding a struct that
just contains a `bool/uint8_t` does not seem to be possible, it looks like
the minimum dna struct size is 4 bytes.
The proposed solution has two parts:
1. Write the custom data layer using `BLO_write_raw` instead of
`BLO_write_struct_array_by_name`.
2. When loading a file, reinitialize any custom data layer that was
not saved correctly (this is just a fix for existing files).
Differential Revision: https://developer.blender.org/D10194
This adds a boolean attribute and custom data type, to be used in the
point separate node. It also adds it as supported data types in the
random attribute and attribute fill nodes.
There are more clever ways of storing a boolean attribute that make
more sense in certain situations-- sets, bitfields, and others, this
commit keeps it simple, saving those changes for when there is a proper
use case for them. In any case, we will still probably always want the
idea of a boolean attribute.
Differential Revision: https://developer.blender.org/D9818