Geometry Nodes: clear data block references before baking

The references are automatically recreated during the bake. Clearing them
first ensures that no old references stay around unnecessarily.
This commit is contained in:
Jacques Lucke
2024-05-27 19:11:07 +02:00
parent 2fbf206491
commit 41472dc659

View File

@@ -358,7 +358,17 @@ static void bake_geometry_nodes_endjob(void *customdata)
WM_main_add_notifier(NC_SPACE | ND_SPACE_VIEW3D | NS_VIEW3D_SHADING, nullptr);
}
static void reset_old_bake(NodeBakeRequest &request)
static void clear_data_block_references(NodesModifierBake &bake)
{
dna::array::clear<NodesModifierDataBlock>(&bake.data_blocks,
&bake.data_blocks_num,
&bake.active_data_block,
[](NodesModifierDataBlock *data_block) {
nodes_modifier_data_block_destruct(data_block, true);
});
}
static void reset_old_bake_cache(NodeBakeRequest &request)
{
switch (request.node_type) {
case GEO_NODE_SIMULATION_OUTPUT: {
@@ -397,7 +407,10 @@ static int start_bake_job(bContext *C,
const BakeRequestsMode mode)
{
for (NodeBakeRequest &request : requests) {
reset_old_bake(request);
reset_old_bake_cache(request);
if (NodesModifierBake *bake = request.nmd->find_bake(request.bake_id)) {
clear_data_block_references(*bake);
}
}
BakeGeometryNodesJob *job = MEM_new<BakeGeometryNodesJob>(__func__);
@@ -704,12 +717,7 @@ static void try_delete_bake(
if (!bake) {
return;
}
dna::array::clear<NodesModifierDataBlock>(&bake->data_blocks,
&bake->data_blocks_num,
&bake->active_data_block,
[](NodesModifierDataBlock *data_block) {
nodes_modifier_data_block_destruct(data_block, true);
});
clear_data_block_references(*bake);
const std::optional<bake::BakePath> bake_path = bake::get_node_bake_path(
*bmain, object, nmd, bake_id);