From 025754b315895960d361d40134a998fdf5cfac47 Mon Sep 17 00:00:00 2001 From: Daniel Evans Date: Fri, 16 Aug 2013 00:59:32 +0000 Subject: [PATCH] AI Nodes now form graph --- framework2/GTADefaultAIController.cpp | 11 ++--- framework2/GTAEngine.cpp | 41 +++++++++++-------- framework2/GTARenderer.cpp | 41 +++++++++++-------- .../include/renderwure/ai/GTAAINode.hpp | 3 ++ .../include/renderwure/engine/GTAEngine.hpp | 2 +- 5 files changed, 58 insertions(+), 40 deletions(-) diff --git a/framework2/GTADefaultAIController.cpp b/framework2/GTADefaultAIController.cpp index 740894b8..889ce39b 100644 --- a/framework2/GTADefaultAIController.cpp +++ b/framework2/GTADefaultAIController.cpp @@ -11,11 +11,11 @@ void GTADefaultAIController::update(float dt) for( auto n = character->engine->ainodes.begin(); n != character->engine->ainodes.end(); ++n ) { - if( n->type != GTAAINode::Pedestrian ) continue; - float ld = glm::length( n->position - character->position ); + if( (*n)->type != GTAAINode::Pedestrian ) continue; + float ld = glm::length( (*n)->position - character->position ); if( ld > 2.5f && ld < d ) { d = ld; - targetNode = &(*n); + targetNode = (*n); } } @@ -30,8 +30,9 @@ void GTADefaultAIController::update(float dt) } } else if( glm::length(targetNode->position - character->position) < nodeMargin ) { - if( targetNode->nextIndex >= 0 && targetNode->nextIndex < character->engine->ainodes.size() ) { - targetNode = &character->engine->ainodes[targetNode->nextIndex]; + if( targetNode->connections.size() > 0 ) { + std::uniform_int_distribution dist(0, targetNode->connections.size()-1); + targetNode = character->engine->ainodes[dist(character->engine->randomEngine)]; } else { targetNode = nullptr; diff --git a/framework2/GTAEngine.cpp b/framework2/GTAEngine.cpp index 166e9d90..fa4c7815 100644 --- a/framework2/GTAEngine.cpp +++ b/framework2/GTAEngine.cpp @@ -217,31 +217,40 @@ bool GTAEngine::placeItems(const std::string& name) size_t startIndex = ainodes.size(); for( size_t n = 0; n < path.nodes.size(); ++n ) { auto& node = path.nodes[n]; + GTAAINode* ainode = new GTAAINode; - GTAAINode::NodeType type = (path.type == LoaderIDE::PATH_PED ? GTAAINode::Pedestrian : GTAAINode::Vehicle); - int32_t next = node.next >= 0 ? startIndex + node.next : -1; - uint32_t flags = GTAAINode::None; - glm::vec3 position = instancePos + (instanceRot * node.position); + ainode->type = (path.type == LoaderIDE::PATH_PED ? GTAAINode::Pedestrian : GTAAINode::Vehicle); + ainode->nextIndex = node.next >= 0 ? startIndex + node.next : -1; + ainode->flags = GTAAINode::None; + ainode->position = instancePos + (instanceRot * node.position); if( node.type == LoaderIDE::EXTERNAL ) { - flags |= GTAAINode::External; + ainode->flags |= GTAAINode::External; for( size_t rn = 0; rn < ainodes.size(); ++rn ) { - if( (ainodes[rn].flags & GTAAINode::External) == GTAAINode::External ) { - auto d = glm::length(ainodes[rn].position - position); + if( (ainodes[rn]->flags & GTAAINode::External) == GTAAINode::External ) { + auto d = glm::length(ainodes[rn]->position - ainode->position); if( d < 1.f ) { - next = rn; - break; + ainode->connections.push_back(ainodes[rn]); + ainodes[rn]->connections.push_back(ainode); } } } } - - ainodes.push_back({ - type, - position, - flags, - next - }); + + if( ainode->nextIndex < ainodes.size() ) { + ainode->connections.push_back(ainodes[ainode->nextIndex]); + ainodes[ainode->nextIndex]->connections.push_back(ainode); + } + + for( size_t on = startIndex; on < ainodes.size(); ++on ) { + if( ainodes[on]->nextIndex == startIndex+n ) { + ainodes[on]->connections.push_back(ainode); + ainode->connections.push_back(ainodes[on]); + } + } + + ainodes.push_back(ainode); + } } } diff --git a/framework2/GTARenderer.cpp b/framework2/GTARenderer.cpp index b9f3bfba..04f671cd 100644 --- a/framework2/GTARenderer.cpp +++ b/framework2/GTARenderer.cpp @@ -556,24 +556,29 @@ void GTARenderer::renderPaths() glBindVertexArray( vao ); for( size_t n = 0; n < engine->ainodes.size(); ++n ) { - auto& start = engine->ainodes[n]; - if( start.nextIndex < 0 || start.nextIndex > engine->ainodes.size() ) { - continue; - } - auto& end = engine->ainodes[start.nextIndex]; - - if( start.type == GTAAINode::Pedestrian ) { - pedlines.push_back(start.position); - pedlines.push_back(start.position+glm::vec3(0.f, 0.f, 1.f)); - pedlines.push_back(start.position); - pedlines.push_back(end.position); - } - else { - carlines.push_back(start.position); - carlines.push_back(start.position+glm::vec3(0.f, 0.f, 1.f)); - carlines.push_back(start.position); - carlines.push_back(end.position); - } + auto start = engine->ainodes[n]; + + if( start->type == GTAAINode::Pedestrian ) { + pedlines.push_back(start->position); + pedlines.push_back(start->position+glm::vec3(0.f, 0.f, 1.f)); + } + else { + carlines.push_back(start->position); + carlines.push_back(start->position+glm::vec3(0.f, 0.f, 1.f)); + } + + for( size_t c = 0; c < start->connections.size(); ++c ) { + auto end = start->connections[c]; + + if( start->type == GTAAINode::Pedestrian ) { + pedlines.push_back(start->position); + pedlines.push_back(end->position); + } + else { + carlines.push_back(start->position); + carlines.push_back(end->position); + } + } } glm::mat4 model; diff --git a/framework2/include/renderwure/ai/GTAAINode.hpp b/framework2/include/renderwure/ai/GTAAINode.hpp index 1238c431..c1e070ce 100644 --- a/framework2/include/renderwure/ai/GTAAINode.hpp +++ b/framework2/include/renderwure/ai/GTAAINode.hpp @@ -3,6 +3,7 @@ #define _GTAAINODE_HPP_ #include #include +#include struct GTAAINode { @@ -22,6 +23,8 @@ struct GTAAINode uint32_t flags; int32_t nextIndex; + + std::vector connections; }; #endif diff --git a/framework2/include/renderwure/engine/GTAEngine.hpp b/framework2/include/renderwure/engine/GTAEngine.hpp index 6eb7d82f..1ffd84fe 100644 --- a/framework2/include/renderwure/engine/GTAEngine.hpp +++ b/framework2/include/renderwure/engine/GTAEngine.hpp @@ -156,7 +156,7 @@ public: /** * AI nodes (todo: replace vector with spatial hash). */ - std::vector ainodes; + std::vector ainodes; /** * Randomness Engine