Skip to content

Commit 65a1a3d

Browse files
committed
BlackboardPlan: Allow passing different prefetch root for the base plan
(cherry picked from commit a8a0f24)
1 parent 5ac6cda commit 65a1a3d

File tree

2 files changed

+25
-27
lines changed

2 files changed

+25
-27
lines changed

blackboard/blackboard_plan.cpp

+22-25
Original file line numberDiff line numberDiff line change
@@ -387,33 +387,16 @@ void BlackboardPlan::sync_with_base_plan() {
387387
}
388388
}
389389

390-
// Add a variable duplicate to the blackboard, optionally with NodePath prefetch.
391-
inline void bb_add_var_dup_with_prefetch(const Ref<Blackboard> &p_blackboard, const StringName &p_name, const BBVariable &p_var, bool p_prefetch, Node *p_node) {
392-
if (unlikely(p_prefetch && p_var.get_type() == Variant::NODE_PATH)) {
393-
Node *n = p_node->get_node_or_null(p_var.get_value());
394-
BBVariable var = p_var.duplicate(true);
395-
if (n != nullptr) {
396-
var.set_value(n);
397-
} else {
398-
ERR_PRINT(vformat("BlackboardPlan: Prefetch failed for variable $%s with value: %s", p_name, p_var.get_value()));
399-
var.set_value(Variant());
400-
}
401-
p_blackboard->assign_var(p_name, var);
402-
} else {
403-
p_blackboard->assign_var(p_name, p_var.duplicate(true));
404-
}
405-
}
406-
407-
Ref<Blackboard> BlackboardPlan::create_blackboard(Node *p_node, const Ref<Blackboard> &p_parent_scope) {
408-
ERR_FAIL_COND_V(p_node == nullptr && prefetch_nodepath_vars, memnew(Blackboard));
390+
Ref<Blackboard> BlackboardPlan::create_blackboard(Node *p_prefetch_root, const Ref<Blackboard> &p_parent_scope, Node *p_prefetch_root_for_base_plan) {
391+
ERR_FAIL_COND_V(p_prefetch_root == nullptr && prefetch_nodepath_vars, memnew(Blackboard));
409392
Ref<Blackboard> bb = memnew(Blackboard);
410393
bb->set_parent(p_parent_scope);
411-
populate_blackboard(bb, true, p_node);
394+
populate_blackboard(bb, true, p_prefetch_root, p_prefetch_root_for_base_plan);
412395
return bb;
413396
}
414397

415-
void BlackboardPlan::populate_blackboard(const Ref<Blackboard> &p_blackboard, bool overwrite, Node *p_node) {
416-
ERR_FAIL_COND(p_node == nullptr && prefetch_nodepath_vars);
398+
void BlackboardPlan::populate_blackboard(const Ref<Blackboard> &p_blackboard, bool overwrite, Node *p_prefetch_root, Node *p_prefetch_root_for_base_plan) {
399+
ERR_FAIL_COND(p_prefetch_root == nullptr && prefetch_nodepath_vars);
417400
ERR_FAIL_COND(p_blackboard.is_null());
418401
for (const Pair<StringName, BBVariable> &p : var_list) {
419402
if (p_blackboard->has_local_var(p.first) && !overwrite) {
@@ -429,7 +412,21 @@ void BlackboardPlan::populate_blackboard(const Ref<Blackboard> &p_blackboard, bo
429412
}
430413
bool has_mapping = parent_scope_mapping.has(p.first);
431414
bool do_prefetch = !has_mapping && prefetch_nodepath_vars;
432-
bb_add_var_dup_with_prefetch(p_blackboard, p.first, p.second, do_prefetch, p_node);
415+
416+
// Add a variable duplicate to the blackboard, optionally with NodePath prefetch.
417+
BBVariable var = p.second.duplicate(true);
418+
if (unlikely(do_prefetch && p.second.get_type() == Variant::NODE_PATH)) {
419+
Node *prefetch_root = !is_derived() || is_derived_var_changed(p.first) ? p_prefetch_root : p_prefetch_root_for_base_plan;
420+
Node *n = prefetch_root->get_node_or_null(p.second.get_value());
421+
if (n != nullptr) {
422+
var.set_value(n);
423+
} else {
424+
ERR_PRINT(vformat("BlackboardPlan: Prefetch failed for variable $%s with value: %s", p.first, p.second.get_value()));
425+
var.set_value(Variant());
426+
}
427+
}
428+
p_blackboard->assign_var(p.first, var);
429+
433430
if (has_mapping) {
434431
StringName target_var = parent_scope_mapping[p.first];
435432
if (target_var != StringName()) {
@@ -450,8 +447,8 @@ void BlackboardPlan::_bind_methods() {
450447
ClassDB::bind_method(D_METHOD("sync_with_base_plan"), &BlackboardPlan::sync_with_base_plan);
451448
ClassDB::bind_method(D_METHOD("set_parent_scope_plan_provider", "callable"), &BlackboardPlan::set_parent_scope_plan_provider);
452449
ClassDB::bind_method(D_METHOD("get_parent_scope_plan_provider"), &BlackboardPlan::get_parent_scope_plan_provider);
453-
ClassDB::bind_method(D_METHOD("create_blackboard", "node", "parent_scope"), &BlackboardPlan::create_blackboard, DEFVAL(Ref<Blackboard>()));
454-
ClassDB::bind_method(D_METHOD("populate_blackboard", "blackboard", "overwrite", "node"), &BlackboardPlan::populate_blackboard);
450+
ClassDB::bind_method(D_METHOD("create_blackboard", "prefetch_root", "parent_scope", "prefetch_root_for_base_plan"), &BlackboardPlan::create_blackboard, DEFVAL(Ref<Blackboard>()), DEFVAL(Variant()));
451+
ClassDB::bind_method(D_METHOD("populate_blackboard", "blackboard", "overwrite", "prefetch_root", "prefetch_root_for_base_plan"), &BlackboardPlan::populate_blackboard, DEFVAL(Variant()));
455452

456453
// To avoid cluttering the member namespace, we do not export unnecessary properties in this class.
457454
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "prefetch_nodepath_vars", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE), "set_prefetch_nodepath_vars", "is_prefetching_nodepath_vars");

blackboard/blackboard_plan.h

+3-2
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,10 @@ class BlackboardPlan : public Resource {
8888

8989
void sync_with_base_plan();
9090
_FORCE_INLINE_ bool is_derived() const { return base.is_valid(); }
91+
_FORCE_INLINE_ bool is_derived_var_changed(const StringName &p_name) const { return base.is_valid() && var_map.has(p_name) && var_map[p_name].is_value_changed(); }
9192

92-
Ref<Blackboard> create_blackboard(Node *p_agent, const Ref<Blackboard> &p_parent_scope = Ref<Blackboard>());
93-
void populate_blackboard(const Ref<Blackboard> &p_blackboard, bool overwrite, Node *p_node);
93+
Ref<Blackboard> create_blackboard(Node *p_prefetch_root, const Ref<Blackboard> &p_parent_scope = Ref<Blackboard>(), Node *p_prefetch_root_for_base_plan = nullptr);
94+
void populate_blackboard(const Ref<Blackboard> &p_blackboard, bool overwrite, Node *p_prefetch_root, Node *p_prefetch_root_for_base_plan = nullptr);
9495

9596
BlackboardPlan();
9697
};

0 commit comments

Comments
 (0)