The extra depsgraph relations that were added to prevent threading issues during evaluation (rB4c30dc343165) caused a considerable slowdown on complex scenes with many drivers (T77277, T78615). This commit improves this as follows. Only the following drivers are considered for execution serialisation: - Drivers on Array elements, and - Drivers on Boolean or Enum properties. Relations between drivers of the same arrays are added blindly, i.e. without checking for transitive or cyclic relations. This is possible as other relations will just target the `PROPERTIES_ENTRY` or `PROPERTIES_EXIT` nodes. Checking whether a driver is on an array is first done by checking `array_index > 0`, and then falling back to resolving the RNA path to an RNA property and inspecting that. The code also avoids circular dependencies when there are multiple drivers on the same property. This not something that is expected to happen (both the UI and the Python API prevent duplicate drivers), it did happen in a file (F8669945, example file of T78615) and it is easy to deal with here. Reviewers: sergey Subscribers: mont29 Comment update
77 lines
2.3 KiB
C++
77 lines
2.3 KiB
C++
/*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
* The Original Code is Copyright (C) 2013 Blender Foundation.
|
|
* All rights reserved.
|
|
*/
|
|
|
|
/** \file
|
|
* \ingroup depsgraph
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "BLI_string_ref.hh"
|
|
|
|
#include "RNA_types.h"
|
|
|
|
#include "intern/builder/deg_builder_relations.h"
|
|
|
|
struct FCurve;
|
|
|
|
namespace blender {
|
|
namespace deg {
|
|
|
|
/* Helper class for determining which relations are needed between driver evaluation nodes. */
|
|
class DriverDescriptor {
|
|
public:
|
|
/* Drivers are grouped by their RNA prefix. The prefix is the part of the RNA
|
|
* path up to the last dot, the suffix is the remainder of the RNA path:
|
|
*
|
|
* fcu->rna_path rna_prefix rna_suffix
|
|
* ------------------------------- ---------------------- ----------
|
|
* 'color' '' 'color'
|
|
* 'rigidbody_world.time_scale' 'rigidbody_world' 'time_scale'
|
|
* 'pose.bones["master"].location' 'pose.bones["master"]' 'location'
|
|
*/
|
|
StringRef rna_prefix;
|
|
StringRef rna_suffix;
|
|
|
|
public:
|
|
DriverDescriptor(PointerRNA *id_ptr, FCurve *fcu);
|
|
|
|
bool driver_relations_needed() const;
|
|
bool is_array() const;
|
|
/* Assumes that 'other' comes from the same RNA group, that is, has the same RNA path prefix. */
|
|
bool is_same_array_as(const DriverDescriptor &other) const;
|
|
OperationKey depsgraph_key() const;
|
|
|
|
private:
|
|
PointerRNA *id_ptr_;
|
|
FCurve *fcu_;
|
|
bool driver_relations_needed_;
|
|
|
|
PointerRNA pointer_rna_;
|
|
PropertyRNA *property_rna_;
|
|
bool is_array_;
|
|
|
|
bool determine_relations_needed();
|
|
void split_rna_path();
|
|
bool resolve_rna();
|
|
};
|
|
|
|
} // namespace deg
|
|
} // namespace blender
|