Refactor behaviour_tree (more consistent naming), fix BT visualization
This commit is contained in:
@@ -61,9 +61,9 @@ const char *bzBTNodeTypeToStr(BzBTNodeType type) {
|
||||
return "SELECTOR";
|
||||
case BZ_BT_COMP_SEQUENCE:
|
||||
return "SEQUENCE";
|
||||
case BZ_BT_COMP_PARALLEL_SELECTOR:
|
||||
case BZ_BT_COMP_P_SELECTOR:
|
||||
return "P_SELECTOR";
|
||||
case BZ_BT_COMP_PARALLEL_SEQUENCE:
|
||||
case BZ_BT_COMP_P_SEQUENCE:
|
||||
return "P_SEQUENCE";
|
||||
case BZ_BT_DECOR_DUMMY:
|
||||
return "DUMMY";
|
||||
@@ -126,13 +126,13 @@ void bzBTDestroyRoot(BzObjectPool *nodePool, BzBTNode *node) {
|
||||
|
||||
BzBTNode *bzBTCompSelector(BzObjectPool *nodePool, BzBTNode *parent, bool parallel) {
|
||||
BzBTNodeType type = parallel ?
|
||||
BZ_BT_COMP_PARALLEL_SELECTOR :
|
||||
BZ_BT_COMP_P_SELECTOR :
|
||||
BZ_BT_COMP_SELECTOR;
|
||||
return bzBTNodeMake(nodePool, parent, type);
|
||||
}
|
||||
BzBTNode *bzBTCompSequence(BzObjectPool *nodePool, BzBTNode *parent, bool parallel) {
|
||||
BzBTNodeType type = parallel ?
|
||||
BZ_BT_COMP_PARALLEL_SEQUENCE :
|
||||
BZ_BT_COMP_P_SEQUENCE :
|
||||
BZ_BT_COMP_SEQUENCE;
|
||||
return bzBTNodeMake(nodePool, parent, type);
|
||||
}
|
||||
@@ -215,9 +215,9 @@ BzBTNode *bzBTCompStateGetRunningChild(const BzBTNodeState *state) {
|
||||
BZ_ASSERT(state->node);
|
||||
BzBTNodeType type = state->node->type;
|
||||
bool isComposite = type == BZ_BT_COMP_SELECTOR ||
|
||||
type == BZ_BT_COMP_PARALLEL_SELECTOR ||
|
||||
type == BZ_BT_COMP_P_SELECTOR ||
|
||||
type == BZ_BT_COMP_SEQUENCE ||
|
||||
type == BZ_BT_COMP_PARALLEL_SEQUENCE;
|
||||
type == BZ_BT_COMP_P_SEQUENCE;
|
||||
BZ_ASSERT(isComposite);
|
||||
return state->as.composite.running;
|
||||
}
|
||||
@@ -366,8 +366,8 @@ static inline BzBTExecReturn bzBTExecuteComposite(const BzBTNode *node, f32 dt,
|
||||
BzBTExecState *state, BzObjectPool *statePool) {
|
||||
BzBTNodeState *nodeState = getNodeState(node, state);
|
||||
|
||||
bool isParallel = node->type == BZ_BT_COMP_PARALLEL_SEQUENCE ||
|
||||
node->type == BZ_BT_COMP_PARALLEL_SELECTOR;
|
||||
bool isParallel = node->type == BZ_BT_COMP_P_SEQUENCE ||
|
||||
node->type == BZ_BT_COMP_P_SELECTOR;
|
||||
|
||||
BzBTNode *start = node->first;
|
||||
if (!isParallel && nodeState)
|
||||
@@ -384,7 +384,7 @@ static inline BzBTExecReturn bzBTExecuteComposite(const BzBTNode *node, f32 dt,
|
||||
if (childReturn.status == BZ_BT_RUNNING) {
|
||||
execStateMerge(&execReturn.state, &childReturn.state);
|
||||
}
|
||||
BZ_ASSERT(childReturn.state.first == NULL);
|
||||
BZ_ASSERT(childReturn.state.first == NULL && childReturn.state.last == NULL);
|
||||
numChildren++;
|
||||
switch (childReturn.status) {
|
||||
case BZ_BT_RUNNING:
|
||||
@@ -401,12 +401,12 @@ static inline BzBTExecReturn bzBTExecuteComposite(const BzBTNode *node, f32 dt,
|
||||
}
|
||||
switch (node->type) {
|
||||
case BZ_BT_COMP_SELECTOR:
|
||||
case BZ_BT_COMP_PARALLEL_SELECTOR:
|
||||
case BZ_BT_COMP_P_SELECTOR:
|
||||
if (childReturn.status == BZ_BT_SUCCESS)
|
||||
execReturn.status = BZ_BT_SUCCESS;
|
||||
break;
|
||||
case BZ_BT_COMP_SEQUENCE:
|
||||
case BZ_BT_COMP_PARALLEL_SEQUENCE:
|
||||
case BZ_BT_COMP_P_SEQUENCE:
|
||||
if (childReturn.status == BZ_BT_FAIL)
|
||||
execReturn.status = BZ_BT_FAIL;
|
||||
break;
|
||||
@@ -415,19 +415,20 @@ static inline BzBTExecReturn bzBTExecuteComposite(const BzBTNode *node, f32 dt,
|
||||
}
|
||||
if (execReturn.status == BZ_BT_FAIL || execReturn.status == BZ_BT_SUCCESS)
|
||||
break;
|
||||
if (numRunning > 0 && !isParallel) {
|
||||
if (numRunning > 0) {
|
||||
execReturn.status = BZ_BT_RUNNING;
|
||||
break;
|
||||
if (!isParallel)
|
||||
break;
|
||||
}
|
||||
}
|
||||
switch (node->type) {
|
||||
case BZ_BT_COMP_SELECTOR:
|
||||
case BZ_BT_COMP_PARALLEL_SELECTOR:
|
||||
case BZ_BT_COMP_P_SELECTOR:
|
||||
if (numFailed == numChildren)
|
||||
execReturn.status = BZ_BT_FAIL;
|
||||
break;
|
||||
case BZ_BT_COMP_SEQUENCE:
|
||||
case BZ_BT_COMP_PARALLEL_SEQUENCE:
|
||||
case BZ_BT_COMP_P_SEQUENCE:
|
||||
if (numSuccessful == numChildren)
|
||||
execReturn.status = BZ_BT_SUCCESS;
|
||||
break;
|
||||
@@ -450,6 +451,7 @@ static inline BzBTExecReturn bzBTExecuteComposite(const BzBTNode *node, f32 dt,
|
||||
return execReturn;
|
||||
}
|
||||
BZ_ASSERT(execReturn.status == BZ_BT_RUNNING);
|
||||
// Parallels don't utilize state but still require it for correct tree traversal.
|
||||
nodeState = ensureValidNodeState(node, statePool, nodeState);
|
||||
nodeState->as.composite.running = child;
|
||||
execStatePushFront(&execReturn.state, nodeState);
|
||||
@@ -557,8 +559,8 @@ static inline BzBTExecReturn bzBTExecuteNode(const BzBTNode *node, f32 dt,
|
||||
switch (node->type) {
|
||||
case BZ_BT_COMP_SELECTOR:
|
||||
case BZ_BT_COMP_SEQUENCE:
|
||||
case BZ_BT_COMP_PARALLEL_SELECTOR:
|
||||
case BZ_BT_COMP_PARALLEL_SEQUENCE:
|
||||
case BZ_BT_COMP_P_SELECTOR:
|
||||
case BZ_BT_COMP_P_SEQUENCE:
|
||||
execReturn = bzBTExecuteComposite(node, dt, nodeState, statePool);
|
||||
break;
|
||||
case BZ_BT_DECOR_DUMMY:
|
||||
|
||||
@@ -18,8 +18,8 @@ typedef enum BzBTNodeType {
|
||||
// Composite
|
||||
BZ_BT_COMP_SELECTOR,
|
||||
BZ_BT_COMP_SEQUENCE,
|
||||
BZ_BT_COMP_PARALLEL_SELECTOR,
|
||||
BZ_BT_COMP_PARALLEL_SEQUENCE,
|
||||
BZ_BT_COMP_P_SELECTOR,
|
||||
BZ_BT_COMP_P_SEQUENCE,
|
||||
// Decorator
|
||||
BZ_BT_DECOR_DUMMY,
|
||||
BZ_BT_DECOR_SUCCESS,
|
||||
|
||||
Reference in New Issue
Block a user