From d826940b4c636f038241b3629af65fc0bd69fa82 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Tue, 8 Jul 2025 20:21:59 +0300 Subject: [PATCH] Make bt nodes execute subnodes immediately (and not across several updates) whenever possible --- libs/bt/include/psemek/bt/conditional.hpp | 22 +++++++++------------- libs/bt/include/psemek/bt/selector.hpp | 5 +++-- libs/bt/include/psemek/bt/sequence.hpp | 5 +++-- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/libs/bt/include/psemek/bt/conditional.hpp b/libs/bt/include/psemek/bt/conditional.hpp index 3e4c5b23..d8a94f4d 100644 --- a/libs/bt/include/psemek/bt/conditional.hpp +++ b/libs/bt/include/psemek/bt/conditional.hpp @@ -39,10 +39,7 @@ namespace psemek::bt { if (condition_result_) { - if (*condition_result_) - return true_branch_->update(dt, args...); - else - return false_branch_->update(dt, args...); + return current_node()->update(dt, args...); } else { @@ -51,11 +48,8 @@ namespace psemek::bt if (auto finished = std::get_if(&result)) { condition_result_ = finished->result; - if (*condition_result_) - true_branch_->start(args...); - else - false_branch_->start(args...); - return running{}; + current_node()->start(args...); + return current_node()->update(Time{}, args...); } return result; @@ -71,10 +65,7 @@ namespace psemek::bt { if (condition_result_) { - if (*condition_result_) - return true_branch_->event(event, args...); - else - return false_branch_->event(event, args...); + return current_node()->event(event, args...); } else return condition_->event(event, args...); @@ -85,6 +76,11 @@ namespace psemek::bt node_ptr true_branch_; node_ptr false_branch_; std::optional condition_result_; + + node * current_node() + { + return *condition_result_ ? true_branch_.get() : false_branch_.get(); + } }; template diff --git a/libs/bt/include/psemek/bt/selector.hpp b/libs/bt/include/psemek/bt/selector.hpp index 9acdb188..9a46c4eb 100644 --- a/libs/bt/include/psemek/bt/selector.hpp +++ b/libs/bt/include/psemek/bt/selector.hpp @@ -32,7 +32,7 @@ namespace psemek::bt status update(Time dt, Args ... args) override { - if (current_index_ < children_.size()) + while (current_index_ < children_.size()) { if (!current_started_) { @@ -41,13 +41,14 @@ namespace psemek::bt } auto result = children_[current_index_]->update(dt, args...); + dt = Time{}; if (auto f = std::get_if(&result)) { if (f->result) return finished{true}; ++current_index_; current_started_ = false; - return running{}; + continue; } else return result; diff --git a/libs/bt/include/psemek/bt/sequence.hpp b/libs/bt/include/psemek/bt/sequence.hpp index 49395087..a207a441 100644 --- a/libs/bt/include/psemek/bt/sequence.hpp +++ b/libs/bt/include/psemek/bt/sequence.hpp @@ -32,7 +32,7 @@ namespace psemek::bt status update(Time dt, Args ... args) override { - if (current_index_ < children_.size()) + while (current_index_ < children_.size()) { if (!current_started_) { @@ -41,13 +41,14 @@ namespace psemek::bt } auto result = children_[current_index_]->update(dt, args...); + dt = Time{}; if (auto f = std::get_if(&result)) { if (!f->result) return finished{false}; ++current_index_; current_started_ = false; - return running{}; + continue; } else return result;