- attempt to add more randomness to pathfinding and faster AI decsions
This commit is contained in:
parent
ab9d2f1bf2
commit
6ec92f2127
|
@ -244,6 +244,10 @@ const ResourceType *Ai::getNeededResource(int unitIndex) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Ai::beingAttacked(Vec2i &pos, Field &field, int radius){
|
bool Ai::beingAttacked(Vec2i &pos, Field &field, int radius){
|
||||||
|
|
||||||
|
const Unit *enemy = aiInterface->getFirstOnSightEnemyUnit(pos, field, radius);
|
||||||
|
return (enemy != NULL);
|
||||||
|
/*
|
||||||
int count= aiInterface->onSightUnitCount();
|
int count= aiInterface->onSightUnitCount();
|
||||||
const Unit *unit;
|
const Unit *unit;
|
||||||
|
|
||||||
|
@ -259,6 +263,7 @@ bool Ai::beingAttacked(Vec2i &pos, Field &field, int radius){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Ai::isStableBase(){
|
bool Ai::isStableBase(){
|
||||||
|
|
|
@ -587,4 +587,31 @@ bool AiInterface::isFreeCells(const Vec2i &pos, int size, Field field){
|
||||||
return world->getMap()->isFreeCells(pos, size, field);
|
return world->getMap()->isFreeCells(pos, size, field);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const Unit *AiInterface::getFirstOnSightEnemyUnit(Vec2i &pos, Field &field, int radius) {
|
||||||
|
Map *map= world->getMap();
|
||||||
|
|
||||||
|
for(int i = 0; i < world->getFactionCount(); ++i) {
|
||||||
|
for(int j = 0; j < world->getFaction(i)->getUnitCount(); ++j) {
|
||||||
|
Unit * unit= world->getFaction(i)->getUnit(j);
|
||||||
|
SurfaceCell *sc= map->getSurfaceCell(Map::toSurfCoords(unit->getPos()));
|
||||||
|
bool cannotSeeUnit = (unit->getType()->hasCellMap() == true &&
|
||||||
|
unit->getType()->getAllowEmptyCellMap() == true &&
|
||||||
|
unit->getType()->hasEmptyCellMap() == true);
|
||||||
|
|
||||||
|
if(sc->isVisible(teamIndex) && cannotSeeUnit == false &&
|
||||||
|
isAlly(unit) == false && unit->isAlive() == true) {
|
||||||
|
pos= unit->getPos();
|
||||||
|
field= unit->getCurrField();
|
||||||
|
if(pos.dist(getHomeLocation()) < radius) {
|
||||||
|
printLog(2, "Being attacked at pos "+intToStr(pos.x)+","+intToStr(pos.y)+"\n");
|
||||||
|
|
||||||
|
return unit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}}//end namespace
|
}}//end namespace
|
||||||
|
|
|
@ -93,6 +93,7 @@ public:
|
||||||
bool reqsOk(const CommandType *ct);
|
bool reqsOk(const CommandType *ct);
|
||||||
bool checkCosts(const ProducibleType *pt);
|
bool checkCosts(const ProducibleType *pt);
|
||||||
bool isFreeCells(const Vec2i &pos, int size, Field field);
|
bool isFreeCells(const Vec2i &pos, int size, Field field);
|
||||||
|
const Unit *getFirstOnSightEnemyUnit(Vec2i &pos, Field &field, int radius);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
string getLogFilename() const {return "ai"+intToStr(factionIndex)+".log";}
|
string getLogFilename() const {return "ai"+intToStr(factionIndex)+".log";}
|
||||||
|
|
|
@ -46,16 +46,11 @@ const int PathFinder::pathFindBailoutRadius = 20;
|
||||||
|
|
||||||
PathFinder::PathFinder() {
|
PathFinder::PathFinder() {
|
||||||
nodePool.clear();
|
nodePool.clear();
|
||||||
//lookupCacheCanMove.clear();
|
|
||||||
//moveLookupCacheApproxCanMove.clear();
|
|
||||||
|
|
||||||
map=NULL;
|
map=NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
PathFinder::PathFinder(const Map *map) {
|
PathFinder::PathFinder(const Map *map) {
|
||||||
nodePool.clear();
|
nodePool.clear();
|
||||||
//lookupCacheCanMove.clear();
|
|
||||||
//moveLookupCacheApproxCanMove.clear();
|
|
||||||
|
|
||||||
map=NULL;
|
map=NULL;
|
||||||
init(map);
|
init(map);
|
||||||
|
@ -63,30 +58,19 @@ PathFinder::PathFinder(const Map *map) {
|
||||||
|
|
||||||
void PathFinder::init(const Map *map) {
|
void PathFinder::init(const Map *map) {
|
||||||
nodePool.resize(pathFindNodesMax);
|
nodePool.resize(pathFindNodesMax);
|
||||||
//lookupCacheCanMove.clear();
|
|
||||||
//moveLookupCacheApproxCanMove.clear();
|
|
||||||
|
|
||||||
this->map= map;
|
this->map= map;
|
||||||
}
|
}
|
||||||
|
|
||||||
PathFinder::~PathFinder(){
|
PathFinder::~PathFinder(){
|
||||||
nodePool.clear();
|
nodePool.clear();
|
||||||
//lookupCacheCanMove.clear();
|
|
||||||
//moveLookupCacheApproxCanMove.clear();
|
|
||||||
|
|
||||||
map=NULL;
|
map=NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
TravelState PathFinder::findPath(Unit *unit, const Vec2i &finalPos, bool *wasStuck,bool clearLookupCache) {
|
TravelState PathFinder::findPath(Unit *unit, const Vec2i &finalPos, bool *wasStuck) {
|
||||||
if(map == NULL) {
|
if(map == NULL) {
|
||||||
throw runtime_error("map == NULL");
|
throw runtime_error("map == NULL");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(clearLookupCache == true) {
|
|
||||||
//lookupCacheCanMove.clear();
|
|
||||||
//moveLookupCacheApproxCanMove.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
if(SystemFlags::getSystemSettingType(SystemFlags::debugWorldSynch).enabled == true) {
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugWorldSynch).enabled == true) {
|
||||||
char szBuf[4096]="";
|
char szBuf[4096]="";
|
||||||
sprintf(szBuf,"[findPath] unit->getPos() [%s] finalPos [%s]",
|
sprintf(szBuf,"[findPath] unit->getPos() [%s] finalPos [%s]",
|
||||||
|
@ -326,6 +310,29 @@ TravelState PathFinder::findPath(Unit *unit, const Vec2i &finalPos, bool *wasStu
|
||||||
|
|
||||||
// ==================== PRIVATE ====================
|
// ==================== PRIVATE ====================
|
||||||
|
|
||||||
|
|
||||||
|
void PathFinder::processNode(Unit *unit, Node *node,const Vec2i finalPos, int i, int j, bool &nodeLimitReached) {
|
||||||
|
Vec2i sucPos= node->pos + Vec2i(i, j);
|
||||||
|
|
||||||
|
bool canUnitMoveToCell = map->aproxCanMove(unit, node->pos, sucPos);
|
||||||
|
if(openPos(sucPos) == false && canUnitMoveToCell == true) {
|
||||||
|
//if node is not open and canMove then generate another node
|
||||||
|
Node *sucNode= newNode();
|
||||||
|
if(sucNode != NULL) {
|
||||||
|
sucNode->pos= sucPos;
|
||||||
|
sucNode->heuristic= heuristic(sucNode->pos, finalPos);
|
||||||
|
sucNode->prev= node;
|
||||||
|
sucNode->next= NULL;
|
||||||
|
sucNode->exploredCell= map->getSurfaceCell(Map::toSurfCoords(sucPos))->isExplored(unit->getTeam());
|
||||||
|
openNodesList[sucNode->heuristic].push_back(sucNode);
|
||||||
|
openPosList[sucNode->pos] = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
nodeLimitReached= true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//route a unit using A* algorithm
|
//route a unit using A* algorithm
|
||||||
TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout) {
|
TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout) {
|
||||||
Chrono chrono;
|
Chrono chrono;
|
||||||
|
@ -342,7 +349,7 @@ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout
|
||||||
|
|
||||||
const Vec2i finalPos= computeNearestFreePos(unit, targetPos);
|
const Vec2i finalPos= computeNearestFreePos(unit, targetPos);
|
||||||
|
|
||||||
if(chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis());
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis());
|
||||||
|
|
||||||
//path find algorithm
|
//path find algorithm
|
||||||
|
|
||||||
|
@ -366,9 +373,8 @@ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout
|
||||||
bool pathFound = true;
|
bool pathFound = true;
|
||||||
bool nodeLimitReached = false;
|
bool nodeLimitReached = false;
|
||||||
Node *node = NULL;
|
Node *node = NULL;
|
||||||
int64 lastPerfTick = 0;
|
|
||||||
|
|
||||||
if(chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis());
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis());
|
||||||
|
|
||||||
int whileLoopCount = 0;
|
int whileLoopCount = 0;
|
||||||
while(nodeLimitReached == false) {
|
while(nodeLimitReached == false) {
|
||||||
|
@ -395,64 +401,38 @@ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout
|
||||||
closedNodesList[node->heuristic].push_back(node);
|
closedNodesList[node->heuristic].push_back(node);
|
||||||
openPosList[node->pos] = true;
|
openPosList[node->pos] = true;
|
||||||
|
|
||||||
int tryDirection = random.randRange(0,1);
|
int tryDirection = random.randRange(0,3);
|
||||||
if(tryDirection > 0) {
|
if(tryDirection == 3) {
|
||||||
|
for(int i = 1; i >= -1 && nodeLimitReached == false; --i) {
|
||||||
|
for(int j = -1; j <= 1 && nodeLimitReached == false; ++j) {
|
||||||
|
processNode(unit, node, finalPos, i, j, nodeLimitReached);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(tryDirection == 2) {
|
||||||
|
for(int i = -1; i <= 1 && nodeLimitReached == false; ++i) {
|
||||||
|
for(int j = 1; j >= -1 && nodeLimitReached == false; --j) {
|
||||||
|
processNode(unit, node, finalPos, i, j, nodeLimitReached);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(tryDirection == 1) {
|
||||||
for(int i = -1; i <= 1 && nodeLimitReached == false; ++i) {
|
for(int i = -1; i <= 1 && nodeLimitReached == false; ++i) {
|
||||||
for(int j = -1; j <= 1 && nodeLimitReached == false; ++j) {
|
for(int j = -1; j <= 1 && nodeLimitReached == false; ++j) {
|
||||||
Vec2i sucPos= node->pos + Vec2i(i, j);
|
processNode(unit, node, finalPos, i, j, nodeLimitReached);
|
||||||
|
|
||||||
//bool canUnitMoveToCell = map->aproxCanMove(unit, node->pos, sucPos, &moveLookupCacheApproxCanMove);
|
|
||||||
bool canUnitMoveToCell = map->aproxCanMove(unit, node->pos, sucPos);
|
|
||||||
|
|
||||||
if(openPos(sucPos) == false && canUnitMoveToCell == true) {
|
|
||||||
//if node is not open and canMove then generate another node
|
|
||||||
Node *sucNode= newNode();
|
|
||||||
if(sucNode != NULL) {
|
|
||||||
sucNode->pos= sucPos;
|
|
||||||
sucNode->heuristic= heuristic(sucNode->pos, finalPos);
|
|
||||||
sucNode->prev= node;
|
|
||||||
sucNode->next= NULL;
|
|
||||||
sucNode->exploredCell= map->getSurfaceCell(Map::toSurfCoords(sucPos))->isExplored(unit->getTeam());
|
|
||||||
openNodesList[sucNode->heuristic].push_back(sucNode);
|
|
||||||
openPosList[sucNode->pos] = true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
nodeLimitReached= true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for(int i = 1; i >= -1 && nodeLimitReached == false; --i) {
|
for(int i = 1; i >= -1 && nodeLimitReached == false; --i) {
|
||||||
for(int j = 1; j >= -1 && nodeLimitReached == false; --j) {
|
for(int j = 1; j >= -1 && nodeLimitReached == false; --j) {
|
||||||
Vec2i sucPos= node->pos + Vec2i(i, j);
|
processNode(unit, node, finalPos, i, j, nodeLimitReached);
|
||||||
|
|
||||||
//bool canUnitMoveToCell = map->aproxCanMove(unit, node->pos, sucPos, &moveLookupCacheApproxCanMove);
|
|
||||||
bool canUnitMoveToCell = map->aproxCanMove(unit, node->pos, sucPos);
|
|
||||||
|
|
||||||
if(openPos(sucPos) == false && canUnitMoveToCell == true) {
|
|
||||||
//if node is not open and canMove then generate another node
|
|
||||||
Node *sucNode= newNode();
|
|
||||||
if(sucNode != NULL) {
|
|
||||||
sucNode->pos= sucPos;
|
|
||||||
sucNode->heuristic= heuristic(sucNode->pos, finalPos);
|
|
||||||
sucNode->prev= node;
|
|
||||||
sucNode->next= NULL;
|
|
||||||
sucNode->exploredCell= map->getSurfaceCell(Map::toSurfCoords(sucPos))->isExplored(unit->getTeam());
|
|
||||||
openNodesList[sucNode->heuristic].push_back(sucNode);
|
|
||||||
openPosList[sucNode->pos] = true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
nodeLimitReached= true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} //while
|
} //while
|
||||||
|
|
||||||
if(chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis());
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis());
|
||||||
|
|
||||||
Node *lastNode= node;
|
Node *lastNode= node;
|
||||||
|
|
||||||
|
@ -466,7 +446,7 @@ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis());
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis());
|
||||||
|
|
||||||
//check results of path finding
|
//check results of path finding
|
||||||
TravelState ts = tsImpossible;
|
TravelState ts = tsImpossible;
|
||||||
|
@ -497,7 +477,7 @@ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout
|
||||||
unit->logSynchData(__FILE__,__LINE__,szBuf);
|
unit->logSynchData(__FILE__,__LINE__,szBuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis());
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
//on the way
|
//on the way
|
||||||
|
@ -510,7 +490,7 @@ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout
|
||||||
currNode= currNode->prev;
|
currNode= currNode->prev;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis());
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis());
|
||||||
|
|
||||||
//store path
|
//store path
|
||||||
path->clear();
|
path->clear();
|
||||||
|
@ -520,7 +500,7 @@ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout
|
||||||
path->add(currNode->next->pos);
|
path->add(currNode->next->pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis());
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis());
|
||||||
|
|
||||||
if(SystemFlags::getSystemSettingType(SystemFlags::debugWorldSynch).enabled == true) {
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugWorldSynch).enabled == true) {
|
||||||
char szBuf[4096]="";
|
char szBuf[4096]="";
|
||||||
|
@ -541,14 +521,14 @@ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout
|
||||||
unit->setCurrentUnitTitle(szBuf);
|
unit->setCurrentUnitTitle(szBuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis());
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis());
|
||||||
}
|
}
|
||||||
|
|
||||||
openNodesList.clear();
|
openNodesList.clear();
|
||||||
openPosList.clear();
|
openPosList.clear();
|
||||||
closedNodesList.clear();
|
closedNodesList.clear();
|
||||||
|
|
||||||
if(chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s] Line: %d took msecs: %lld --------------------------- [END OF METHOD] ---------------------------\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis());
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s] Line: %d took msecs: %lld --------------------------- [END OF METHOD] ---------------------------\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis());
|
||||||
|
|
||||||
return ts;
|
return ts;
|
||||||
}
|
}
|
||||||
|
@ -562,6 +542,25 @@ PathFinder::Node *PathFinder::newNode() {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PathFinder::processNearestFreePos(const Vec2i &finalPos, int i, int j, int size, Field field, int teamIndex,Vec2i unitPos, Vec2i &nearestPos, float &nearestDist) {
|
||||||
|
Vec2i currPos= finalPos + Vec2i(i, j);
|
||||||
|
if(map->isAproxFreeCells(currPos, size, field, teamIndex)) {
|
||||||
|
float dist= currPos.dist(finalPos);
|
||||||
|
|
||||||
|
//if nearer from finalPos
|
||||||
|
if(dist < nearestDist){
|
||||||
|
nearestPos= currPos;
|
||||||
|
nearestDist= dist;
|
||||||
|
}
|
||||||
|
//if the distance is the same compare distance to unit
|
||||||
|
else if(dist == nearestDist){
|
||||||
|
if(currPos.dist(unitPos) < nearestPos.dist(unitPos)) {
|
||||||
|
nearestPos= currPos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Vec2i PathFinder::computeNearestFreePos(const Unit *unit, const Vec2i &finalPos) {
|
Vec2i PathFinder::computeNearestFreePos(const Unit *unit, const Vec2i &finalPos) {
|
||||||
if(map == NULL) {
|
if(map == NULL) {
|
||||||
throw runtime_error("map == NULL");
|
throw runtime_error("map == NULL");
|
||||||
|
@ -581,24 +580,10 @@ Vec2i PathFinder::computeNearestFreePos(const Unit *unit, const Vec2i &finalPos)
|
||||||
Vec2i unitPos= unit->getPos();
|
Vec2i unitPos= unit->getPos();
|
||||||
Vec2i nearestPos= unitPos;
|
Vec2i nearestPos= unitPos;
|
||||||
float nearestDist= unitPos.dist(finalPos);
|
float nearestDist= unitPos.dist(finalPos);
|
||||||
|
|
||||||
for(int i= -maxFreeSearchRadius; i <= maxFreeSearchRadius; ++i) {
|
for(int i= -maxFreeSearchRadius; i <= maxFreeSearchRadius; ++i) {
|
||||||
for(int j= -maxFreeSearchRadius; j <= maxFreeSearchRadius; ++j) {
|
for(int j= -maxFreeSearchRadius; j <= maxFreeSearchRadius; ++j) {
|
||||||
Vec2i currPos= finalPos + Vec2i(i, j);
|
processNearestFreePos(finalPos, i, j, size, field, teamIndex, unitPos, nearestPos, nearestDist);
|
||||||
if(map->isAproxFreeCells(currPos, size, field, teamIndex)) {
|
|
||||||
float dist= currPos.dist(finalPos);
|
|
||||||
|
|
||||||
//if nearer from finalPos
|
|
||||||
if(dist < nearestDist){
|
|
||||||
nearestPos= currPos;
|
|
||||||
nearestDist= dist;
|
|
||||||
}
|
|
||||||
//if the distance is the same compare distance to unit
|
|
||||||
else if(dist == nearestDist){
|
|
||||||
if(currPos.dist(unitPos) < nearestPos.dist(unitPos)) {
|
|
||||||
nearestPos= currPos;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nearestPos;
|
return nearestPos;
|
||||||
|
|
|
@ -68,15 +68,12 @@ private:
|
||||||
const Map *map;
|
const Map *map;
|
||||||
RandomGen random;
|
RandomGen random;
|
||||||
|
|
||||||
//std::map<Vec2i, std::map<Vec2i, std::map<int, std::map<Field,bool> > > > lookupCacheCanMove;
|
|
||||||
std::map<Vec2i, std::map<Vec2i, std::map<int, std::map<int, std::map<Field,bool> > > > > moveLookupCacheApproxCanMove;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PathFinder();
|
PathFinder();
|
||||||
PathFinder(const Map *map);
|
PathFinder(const Map *map);
|
||||||
~PathFinder();
|
~PathFinder();
|
||||||
void init(const Map *map);
|
void init(const Map *map);
|
||||||
TravelState findPath(Unit *unit, const Vec2i &finalPos, bool *wasStuck=NULL,bool clearLookupCache=true);
|
TravelState findPath(Unit *unit, const Vec2i &finalPos, bool *wasStuck=NULL);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TravelState aStar(Unit *unit, const Vec2i &finalPos, bool inBailout);
|
TravelState aStar(Unit *unit, const Vec2i &finalPos, bool inBailout);
|
||||||
|
@ -86,6 +83,9 @@ private:
|
||||||
bool openPos(const Vec2i &sucPos);
|
bool openPos(const Vec2i &sucPos);
|
||||||
|
|
||||||
Node * minHeuristicFastLookup();
|
Node * minHeuristicFastLookup();
|
||||||
|
|
||||||
|
void processNode(Unit *unit, Node *node,const Vec2i finalPos, int i, int j, bool &nodeLimitReached);
|
||||||
|
void processNearestFreePos(const Vec2i &finalPos, int i, int j, int size, Field field, int teamIndex,Vec2i unitPos, Vec2i &nearestPos, float &nearestDist);
|
||||||
};
|
};
|
||||||
|
|
||||||
}}//end namespace
|
}}//end namespace
|
||||||
|
|
|
@ -34,6 +34,8 @@ using namespace Shared::Graphics::Gl;
|
||||||
using namespace Shared::Util;
|
using namespace Shared::Util;
|
||||||
using namespace Shared::Graphics;
|
using namespace Shared::Graphics;
|
||||||
|
|
||||||
|
//#define ENABLE_VBO_CODE 1
|
||||||
|
|
||||||
namespace Glest { namespace Game{
|
namespace Glest { namespace Game{
|
||||||
|
|
||||||
// =====================================================
|
// =====================================================
|
||||||
|
@ -1799,17 +1801,6 @@ void Renderer::ReleaseSurfaceVBOs() {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
class SurfaceData {
|
|
||||||
public:
|
|
||||||
SurfaceData(){};
|
|
||||||
int textureHandle;
|
|
||||||
vector<Vec2f> texCoords;
|
|
||||||
vector<Vec2f> texCoordsSurface;
|
|
||||||
vector<Vec3f> vertices;
|
|
||||||
vector<Vec3f> normals;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
void Renderer::renderSurface(const int renderFps) {
|
void Renderer::renderSurface(const int renderFps) {
|
||||||
IF_DEBUG_EDITION(
|
IF_DEBUG_EDITION(
|
||||||
if (getDebugRenderer().willRenderSurface()) {
|
if (getDebugRenderer().willRenderSurface()) {
|
||||||
|
@ -1865,90 +1856,95 @@ void Renderer::renderSurface(const int renderFps) {
|
||||||
#if defined(ENABLE_VBO_CODE)
|
#if defined(ENABLE_VBO_CODE)
|
||||||
|
|
||||||
int lastSurfaceDataIndex = -1;
|
int lastSurfaceDataIndex = -1;
|
||||||
std::vector<SurfaceData> surface;
|
if(mapSurfaceData.find(visibleQuad) == mapSurfaceData.end()) {
|
||||||
//surface.reserve(qCache.visibleScaledCellList.size());
|
//std::vector<SurfaceData> surface;
|
||||||
|
std::vector<SurfaceData> &surface = mapSurfaceData[visibleQuad];
|
||||||
|
|
||||||
for(int visibleIndex = 0;
|
for(int visibleIndex = 0;
|
||||||
visibleIndex < qCache.visibleScaledCellList.size(); ++visibleIndex) {
|
visibleIndex < qCache.visibleScaledCellList.size(); ++visibleIndex) {
|
||||||
Vec2i &pos = qCache.visibleScaledCellList[visibleIndex];
|
Vec2i &pos = qCache.visibleScaledCellList[visibleIndex];
|
||||||
|
|
||||||
SurfaceCell *tc00= map->getSurfaceCell(pos.x, pos.y);
|
SurfaceCell *tc00= map->getSurfaceCell(pos.x, pos.y);
|
||||||
SurfaceCell *tc10= map->getSurfaceCell(pos.x+1, pos.y);
|
SurfaceCell *tc10= map->getSurfaceCell(pos.x+1, pos.y);
|
||||||
SurfaceCell *tc01= map->getSurfaceCell(pos.x, pos.y+1);
|
SurfaceCell *tc01= map->getSurfaceCell(pos.x, pos.y+1);
|
||||||
SurfaceCell *tc11= map->getSurfaceCell(pos.x+1, pos.y+1);
|
SurfaceCell *tc11= map->getSurfaceCell(pos.x+1, pos.y+1);
|
||||||
|
|
||||||
if(tc00 == NULL) {
|
if(tc00 == NULL) {
|
||||||
throw runtime_error("tc00 == NULL");
|
throw runtime_error("tc00 == NULL");
|
||||||
}
|
}
|
||||||
if(tc10 == NULL) {
|
if(tc10 == NULL) {
|
||||||
throw runtime_error("tc10 == NULL");
|
throw runtime_error("tc10 == NULL");
|
||||||
}
|
}
|
||||||
if(tc01 == NULL) {
|
if(tc01 == NULL) {
|
||||||
throw runtime_error("tc01 == NULL");
|
throw runtime_error("tc01 == NULL");
|
||||||
}
|
}
|
||||||
if(tc11 == NULL) {
|
if(tc11 == NULL) {
|
||||||
throw runtime_error("tc11 == NULL");
|
throw runtime_error("tc11 == NULL");
|
||||||
|
}
|
||||||
|
|
||||||
|
triangleCount+= 2;
|
||||||
|
pointCount+= 4;
|
||||||
|
|
||||||
|
//set texture
|
||||||
|
if(tc00->getSurfaceTexture() == NULL) {
|
||||||
|
throw runtime_error("tc00->getSurfaceTexture() == NULL");
|
||||||
|
}
|
||||||
|
vector<VisibleQuadContainerVBOCache> &vboCache = GetSurfaceVBOs(pos);
|
||||||
|
|
||||||
|
int surfaceDataIndex = -1;
|
||||||
|
currTex= static_cast<const Texture2DGl*>(tc00->getSurfaceTexture())->getHandle();
|
||||||
|
if(currTex != lastTex) {
|
||||||
|
lastTex = currTex;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
surfaceDataIndex = lastSurfaceDataIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(surfaceDataIndex < 0) {
|
||||||
|
SurfaceData newData;
|
||||||
|
newData.textureHandle = currTex;
|
||||||
|
surface.push_back(newData);
|
||||||
|
|
||||||
|
surfaceDataIndex = surface.size()-1;
|
||||||
|
|
||||||
|
//surface[surfaceDataIndex].texCoords.reserve(100);
|
||||||
|
//surface[surfaceDataIndex].texCoordsSurface.reserve(100);
|
||||||
|
//surface[surfaceDataIndex].vertices.reserve(100);
|
||||||
|
//surface[surfaceDataIndex].normals.reserve(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
lastSurfaceDataIndex = surfaceDataIndex;
|
||||||
|
|
||||||
|
const Vec2f &surfCoord= tc00->getSurfTexCoord();
|
||||||
|
|
||||||
|
//int dataIndex = surface[surfaceDataIndex].texCoords.size();
|
||||||
|
surface[surfaceDataIndex].texCoords.push_back(tc01->getFowTexCoord());
|
||||||
|
surface[surfaceDataIndex].texCoordsSurface.push_back(Vec2f(surfCoord.x, surfCoord.y + coordStep));
|
||||||
|
surface[surfaceDataIndex].vertices.push_back(tc01->getVertex());
|
||||||
|
surface[surfaceDataIndex].normals.push_back(tc01->getNormal());
|
||||||
|
|
||||||
|
surface[surfaceDataIndex].texCoords.push_back(tc00->getFowTexCoord());
|
||||||
|
surface[surfaceDataIndex].texCoordsSurface.push_back(Vec2f(surfCoord.x, surfCoord.y));
|
||||||
|
surface[surfaceDataIndex].vertices.push_back(tc00->getVertex());
|
||||||
|
surface[surfaceDataIndex].normals.push_back(tc00->getNormal());
|
||||||
|
|
||||||
|
surface[surfaceDataIndex].texCoords.push_back(tc11->getFowTexCoord());
|
||||||
|
surface[surfaceDataIndex].texCoordsSurface.push_back(Vec2f(surfCoord.x+coordStep, surfCoord.y+coordStep));
|
||||||
|
surface[surfaceDataIndex].vertices.push_back(tc11->getVertex());
|
||||||
|
surface[surfaceDataIndex].normals.push_back(tc11->getNormal());
|
||||||
|
|
||||||
|
surface[surfaceDataIndex].texCoords.push_back(tc10->getFowTexCoord());
|
||||||
|
surface[surfaceDataIndex].texCoordsSurface.push_back(Vec2f(surfCoord.x+coordStep, surfCoord.y));
|
||||||
|
surface[surfaceDataIndex].vertices.push_back(tc10->getVertex());
|
||||||
|
surface[surfaceDataIndex].normals.push_back(tc10->getNormal());
|
||||||
}
|
}
|
||||||
|
|
||||||
triangleCount+= 2;
|
//mapSurfaceData[visibleQuad] = surface;
|
||||||
pointCount+= 4;
|
|
||||||
|
|
||||||
//set texture
|
|
||||||
if(tc00->getSurfaceTexture() == NULL) {
|
|
||||||
throw runtime_error("tc00->getSurfaceTexture() == NULL");
|
|
||||||
}
|
|
||||||
vector<VisibleQuadContainerVBOCache> &vboCache = GetSurfaceVBOs(pos);
|
|
||||||
|
|
||||||
int surfaceDataIndex = -1;
|
|
||||||
currTex= static_cast<const Texture2DGl*>(tc00->getSurfaceTexture())->getHandle();
|
|
||||||
if(currTex != lastTex) {
|
|
||||||
lastTex = currTex;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
surfaceDataIndex = lastSurfaceDataIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(surfaceDataIndex < 0) {
|
|
||||||
SurfaceData newData;
|
|
||||||
newData.textureHandle = currTex;
|
|
||||||
surface.push_back(newData);
|
|
||||||
|
|
||||||
surfaceDataIndex = surface.size()-1;
|
|
||||||
|
|
||||||
//surface[surfaceDataIndex].texCoords.reserve(100);
|
|
||||||
//surface[surfaceDataIndex].texCoordsSurface.reserve(100);
|
|
||||||
//surface[surfaceDataIndex].vertices.reserve(100);
|
|
||||||
//surface[surfaceDataIndex].normals.reserve(100);
|
|
||||||
}
|
|
||||||
|
|
||||||
lastSurfaceDataIndex = surfaceDataIndex;
|
|
||||||
|
|
||||||
const Vec2f &surfCoord= tc00->getSurfTexCoord();
|
|
||||||
|
|
||||||
//int dataIndex = surface[surfaceDataIndex].texCoords.size();
|
|
||||||
surface[surfaceDataIndex].texCoords.push_back(tc01->getFowTexCoord());
|
|
||||||
surface[surfaceDataIndex].texCoordsSurface.push_back(Vec2f(surfCoord.x, surfCoord.y + coordStep));
|
|
||||||
surface[surfaceDataIndex].vertices.push_back(tc01->getVertex());
|
|
||||||
surface[surfaceDataIndex].normals.push_back(tc01->getNormal());
|
|
||||||
|
|
||||||
surface[surfaceDataIndex].texCoords.push_back(tc00->getFowTexCoord());
|
|
||||||
surface[surfaceDataIndex].texCoordsSurface.push_back(Vec2f(surfCoord.x, surfCoord.y));
|
|
||||||
surface[surfaceDataIndex].vertices.push_back(tc00->getVertex());
|
|
||||||
surface[surfaceDataIndex].normals.push_back(tc00->getNormal());
|
|
||||||
|
|
||||||
surface[surfaceDataIndex].texCoords.push_back(tc11->getFowTexCoord());
|
|
||||||
surface[surfaceDataIndex].texCoordsSurface.push_back(Vec2f(surfCoord.x+coordStep, surfCoord.y+coordStep));
|
|
||||||
surface[surfaceDataIndex].vertices.push_back(tc11->getVertex());
|
|
||||||
surface[surfaceDataIndex].normals.push_back(tc11->getNormal());
|
|
||||||
|
|
||||||
surface[surfaceDataIndex].texCoords.push_back(tc10->getFowTexCoord());
|
|
||||||
surface[surfaceDataIndex].texCoordsSurface.push_back(Vec2f(surfCoord.x+coordStep, surfCoord.y));
|
|
||||||
surface[surfaceDataIndex].vertices.push_back(tc10->getVertex());
|
|
||||||
surface[surfaceDataIndex].normals.push_back(tc10->getNormal());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//printf("\nsurface.size() = %d vs qCache.visibleScaledCellList.size() = %d \n",surface.size(),qCache.visibleScaledCellList.size());
|
//printf("\nsurface.size() = %d vs qCache.visibleScaledCellList.size() = %d \n",surface.size(),qCache.visibleScaledCellList.size());
|
||||||
|
|
||||||
|
std::vector<SurfaceData> &surface = mapSurfaceData[visibleQuad];
|
||||||
|
|
||||||
for(int i = 0; i < surface.size(); ++i) {
|
for(int i = 0; i < surface.size(); ++i) {
|
||||||
SurfaceData &data = surface[i];
|
SurfaceData &data = surface[i];
|
||||||
|
|
||||||
|
|
|
@ -42,8 +42,6 @@
|
||||||
|
|
||||||
#include "leak_dumper.h"
|
#include "leak_dumper.h"
|
||||||
|
|
||||||
//#define ENABLE_VBO_CODE 1
|
|
||||||
|
|
||||||
namespace Glest{ namespace Game{
|
namespace Glest{ namespace Game{
|
||||||
|
|
||||||
using namespace Shared::Graphics;
|
using namespace Shared::Graphics;
|
||||||
|
@ -136,7 +134,7 @@ public:
|
||||||
std::vector<Vec2i> visibleScaledCellList;
|
std::vector<Vec2i> visibleScaledCellList;
|
||||||
};
|
};
|
||||||
|
|
||||||
#if defined(ENABLE_VBO_CODE)
|
//#if defined(ENABLE_VBO_CODE)
|
||||||
class VisibleQuadContainerVBOCache {
|
class VisibleQuadContainerVBOCache {
|
||||||
public:
|
public:
|
||||||
// Vertex Buffer Object Names
|
// Vertex Buffer Object Names
|
||||||
|
@ -147,7 +145,7 @@ public:
|
||||||
uint32 m_nVBONormals; // Normal VBO Name
|
uint32 m_nVBONormals; // Normal VBO Name
|
||||||
//uint32 m_nVBOIndexes; // Indexes VBO Name
|
//uint32 m_nVBOIndexes; // Indexes VBO Name
|
||||||
};
|
};
|
||||||
#endif
|
//#endif
|
||||||
|
|
||||||
|
|
||||||
class Renderer : public RendererInterface, public BaseRenderer, public SimpleTaskCallbackInterface {
|
class Renderer : public RendererInterface, public BaseRenderer, public SimpleTaskCallbackInterface {
|
||||||
|
@ -265,13 +263,25 @@ private:
|
||||||
|
|
||||||
std::map<Vec3f,Vec3f> worldToScreenPosCache;
|
std::map<Vec3f,Vec3f> worldToScreenPosCache;
|
||||||
|
|
||||||
#if defined(ENABLE_VBO_CODE)
|
//#if defined(ENABLE_VBO_CODE)
|
||||||
std::map<Vec2i,std::vector<VisibleQuadContainerVBOCache> > mapSurfaceVBOCache;
|
std::map<Vec2i,std::vector<VisibleQuadContainerVBOCache> > mapSurfaceVBOCache;
|
||||||
|
|
||||||
VisibleQuadContainerVBOCache SetupSurfaceVBO(Vec2i &pos, SurfaceCell *cell, Vec2f surfCoord);
|
VisibleQuadContainerVBOCache SetupSurfaceVBO(Vec2i &pos, SurfaceCell *cell, Vec2f surfCoord);
|
||||||
vector<VisibleQuadContainerVBOCache> & GetSurfaceVBOs(Vec2i &pos);
|
vector<VisibleQuadContainerVBOCache> & GetSurfaceVBOs(Vec2i &pos);
|
||||||
void ReleaseSurfaceVBOs();
|
void ReleaseSurfaceVBOs();
|
||||||
#endif
|
//#endif
|
||||||
|
|
||||||
|
class SurfaceData {
|
||||||
|
public:
|
||||||
|
SurfaceData(){};
|
||||||
|
int textureHandle;
|
||||||
|
vector<Vec2f> texCoords;
|
||||||
|
vector<Vec2f> texCoordsSurface;
|
||||||
|
vector<Vec3f> vertices;
|
||||||
|
vector<Vec3f> normals;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::map<Quad2i,std::vector<SurfaceData> > mapSurfaceData;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Renderer();
|
Renderer();
|
||||||
|
|
|
@ -86,6 +86,16 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string getString() const {
|
||||||
|
std::ostringstream streamOut;
|
||||||
|
streamOut << "#1: " << this->p[0].getString();
|
||||||
|
streamOut << "#2: " << this->p[1].getString();
|
||||||
|
std::string result = streamOut.str();
|
||||||
|
streamOut.str(std::string());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef Rect2<int> Rect2i;
|
typedef Rect2<int> Rect2i;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user