1
0
mirror of https://github.com/rwengine/openrw.git synced 2024-09-18 16:32:32 +02:00

AI Nodes now form graph

This commit is contained in:
Daniel Evans 2013-08-16 00:59:32 +00:00
parent dfb3ce0d74
commit 025754b315
5 changed files with 58 additions and 40 deletions

View File

@ -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<int> dist(0, targetNode->connections.size()-1);
targetNode = character->engine->ainodes[dist(character->engine->randomEngine)];
}
else {
targetNode = nullptr;

View File

@ -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);
}
}
}

View File

@ -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;

View File

@ -3,6 +3,7 @@
#define _GTAAINODE_HPP_
#include <glm/glm.hpp>
#include <cstdint>
#include <vector>
struct GTAAINode
{
@ -22,6 +23,8 @@ struct GTAAINode
uint32_t flags;
int32_t nextIndex;
std::vector<GTAAINode*> connections;
};
#endif

View File

@ -156,7 +156,7 @@ public:
/**
* AI nodes (todo: replace vector with spatial hash).
*/
std::vector<GTAAINode> ainodes;
std::vector<GTAAINode*> ainodes;
/**
* Randomness Engine