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:
parent
dfb3ce0d74
commit
025754b315
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -156,7 +156,7 @@ public:
|
||||
/**
|
||||
* AI nodes (todo: replace vector with spatial hash).
|
||||
*/
|
||||
std::vector<GTAAINode> ainodes;
|
||||
std::vector<GTAAINode*> ainodes;
|
||||
|
||||
/**
|
||||
* Randomness Engine
|
||||
|
Loading…
Reference in New Issue
Block a user