- adjust camera angle for more properly unit visibility calc
- more accurate unit titles when debugging
This commit is contained in:
parent
1b68053397
commit
016771ed81
|
@ -472,11 +472,12 @@ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout
|
||||||
if(i < pathFindRefresh) {
|
if(i < pathFindRefresh) {
|
||||||
path->add(nodePos);
|
path->add(nodePos);
|
||||||
}
|
}
|
||||||
else if(tryLastPathCache == false) {
|
//else if(tryLastPathCache == false) {
|
||||||
break;
|
// break;
|
||||||
}
|
//}
|
||||||
|
|
||||||
if(tryLastPathCache == true && basicPathFinder) {
|
//if(tryLastPathCache == true && basicPathFinder) {
|
||||||
|
if(basicPathFinder) {
|
||||||
basicPathFinder->addToLastPathCache(nodePos);
|
basicPathFinder->addToLastPathCache(nodePos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -923,11 +924,12 @@ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout
|
||||||
if(i < pathFindRefresh) {
|
if(i < pathFindRefresh) {
|
||||||
path->add(nodePos);
|
path->add(nodePos);
|
||||||
}
|
}
|
||||||
else if(tryLastPathCache == false) {
|
//else if(tryLastPathCache == false) {
|
||||||
break;
|
// break;
|
||||||
}
|
//}
|
||||||
|
|
||||||
if(tryLastPathCache == true && basicPathFinder) {
|
//if(tryLastPathCache == true && basicPathFinder) {
|
||||||
|
if(basicPathFinder) {
|
||||||
basicPathFinder->addToLastPathCache(nodePos);
|
basicPathFinder->addToLastPathCache(nodePos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,6 +80,12 @@ GameCamera::~GameCamera() {
|
||||||
cacheVisibleQuad.clear();
|
cacheVisibleQuad.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string GameCamera::getCameraMovementKey() const {
|
||||||
|
char szBuf[1024]="";
|
||||||
|
sprintf(szBuf,"%s_%f_%f_%f_%s,%f",pos.getString().c_str(),hAng,vAng,rotate,move.getString().c_str(),fov);
|
||||||
|
return szBuf;
|
||||||
|
}
|
||||||
|
|
||||||
void GameCamera::setMaxHeight(float value) {
|
void GameCamera::setMaxHeight(float value) {
|
||||||
if(value < 0) {
|
if(value < 0) {
|
||||||
maxHeight = Config::getInstance().getFloat("CameraMaxDistance","20");
|
maxHeight = Config::getInstance().getFloat("CameraMaxDistance","20");
|
||||||
|
@ -177,6 +183,8 @@ void GameCamera::update(){
|
||||||
}
|
}
|
||||||
|
|
||||||
Quad2i GameCamera::computeVisibleQuad() const {
|
Quad2i GameCamera::computeVisibleQuad() const {
|
||||||
|
//printf("\n@@@ hAng [%f] vAng [%f] fov [%f]\n",hAng,vAng,fov);
|
||||||
|
|
||||||
if(MaxVisibleQuadItemCache != 0) {
|
if(MaxVisibleQuadItemCache != 0) {
|
||||||
std::map<float, std::map<float, std::map<Vec3f, Quad2i> > >::const_iterator iterFind = cacheVisibleQuad.find(fov);
|
std::map<float, std::map<float, std::map<Vec3f, Quad2i> > >::const_iterator iterFind = cacheVisibleQuad.find(fov);
|
||||||
if(iterFind != cacheVisibleQuad.end()) {
|
if(iterFind != cacheVisibleQuad.end()) {
|
||||||
|
@ -189,6 +197,11 @@ Quad2i GameCamera::computeVisibleQuad() const {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//const float nearDist= 20.f;
|
||||||
|
//const float farDist= 90.f;
|
||||||
|
//const float dist= 20.f;
|
||||||
|
|
||||||
float nearDist = 20.f;
|
float nearDist = 20.f;
|
||||||
float dist = pos.y > 20.f ? pos.y * 1.2f : 20.f;
|
float dist = pos.y > 20.f ? pos.y * 1.2f : 20.f;
|
||||||
float farDist = 90.f * (pos.y > 20.f ? pos.y / 15.f : 1.f);
|
float farDist = 90.f * (pos.y > 20.f ? pos.y / 15.f : 1.f);
|
||||||
|
@ -213,8 +226,19 @@ Quad2i GameCamera::computeVisibleQuad() const {
|
||||||
Vec2i p3(static_cast<int>(p.x + v2.x * nearDist), static_cast<int>(p.y + v2.y * nearDist));
|
Vec2i p3(static_cast<int>(p.x + v2.x * nearDist), static_cast<int>(p.y + v2.y * nearDist));
|
||||||
Vec2i p4(static_cast<int>(p.x + v2.x * farDist), static_cast<int>(p.y + v2.y * farDist));
|
Vec2i p4(static_cast<int>(p.x + v2.x * farDist), static_cast<int>(p.y + v2.y * farDist));
|
||||||
|
|
||||||
|
const int adjustPerfectSquareX = 15;
|
||||||
|
const bool adjustQuadToPerfectSquare = true;
|
||||||
Quad2i result;
|
Quad2i result;
|
||||||
if (hAng >= 135 && hAng <= 225) {
|
if (hAng >= 135 && hAng <= 225) {
|
||||||
|
if(adjustQuadToPerfectSquare) {
|
||||||
|
//p1.y -= 10;
|
||||||
|
//p3.y -= 10;
|
||||||
|
//p2.y += 10;
|
||||||
|
//p4.y += 10;
|
||||||
|
|
||||||
|
//p3.x = p4.x + adjustPerfectSquareX;
|
||||||
|
//p3.x -= adjustPerfectSquareX;
|
||||||
|
}
|
||||||
result = Quad2i(p1, p2, p3, p4);
|
result = Quad2i(p1, p2, p3, p4);
|
||||||
if(MaxVisibleQuadItemCache != 0 &&
|
if(MaxVisibleQuadItemCache != 0 &&
|
||||||
(MaxVisibleQuadItemCache < 0 || cacheVisibleQuad[fov][hAng].size() <= MaxVisibleQuadItemCache)) {
|
(MaxVisibleQuadItemCache < 0 || cacheVisibleQuad[fov][hAng].size() <= MaxVisibleQuadItemCache)) {
|
||||||
|
@ -222,6 +246,16 @@ Quad2i GameCamera::computeVisibleQuad() const {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (hAng >= 45 && hAng <= 135) {
|
else if (hAng >= 45 && hAng <= 135) {
|
||||||
|
if(adjustQuadToPerfectSquare) {
|
||||||
|
//p3.y -= 10;
|
||||||
|
//p4.y -= 10;
|
||||||
|
//p1.y += 10;
|
||||||
|
//p2.y += 10;
|
||||||
|
|
||||||
|
//p4.x = p2.x + adjustPerfectSquareX;
|
||||||
|
//p4.x -= adjustPerfectSquareX;
|
||||||
|
}
|
||||||
|
|
||||||
result = Quad2i(p3, p1, p4, p2);
|
result = Quad2i(p3, p1, p4, p2);
|
||||||
|
|
||||||
if(MaxVisibleQuadItemCache != 0 &&
|
if(MaxVisibleQuadItemCache != 0 &&
|
||||||
|
@ -230,6 +264,16 @@ Quad2i GameCamera::computeVisibleQuad() const {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (hAng >= 225 && hAng <= 315) {
|
else if (hAng >= 225 && hAng <= 315) {
|
||||||
|
if(adjustQuadToPerfectSquare) {
|
||||||
|
//p2.y -= 10;
|
||||||
|
//p1.y -= 10;
|
||||||
|
//p4.y += 10;
|
||||||
|
//p3.y += 10;
|
||||||
|
|
||||||
|
//p1.x = p3.x + adjustPerfectSquareX;
|
||||||
|
//p1.x -= adjustPerfectSquareX;
|
||||||
|
}
|
||||||
|
|
||||||
result = Quad2i(p2, p4, p1, p3);
|
result = Quad2i(p2, p4, p1, p3);
|
||||||
|
|
||||||
if(MaxVisibleQuadItemCache != 0 &&
|
if(MaxVisibleQuadItemCache != 0 &&
|
||||||
|
@ -238,6 +282,16 @@ Quad2i GameCamera::computeVisibleQuad() const {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
if(adjustQuadToPerfectSquare && hAng == 0) {
|
||||||
|
//p4.y -= 10;
|
||||||
|
//p2.y -= 10;
|
||||||
|
//p1.y += 10;
|
||||||
|
//p3.y += 10;
|
||||||
|
|
||||||
|
//p2.x = p1.x + adjustPerfectSquareX;
|
||||||
|
p2.x -= adjustPerfectSquareX;
|
||||||
|
}
|
||||||
|
|
||||||
result = Quad2i(p4, p3, p2, p1);
|
result = Quad2i(p4, p3, p2, p1);
|
||||||
if(MaxVisibleQuadItemCache != 0 &&
|
if(MaxVisibleQuadItemCache != 0 &&
|
||||||
(MaxVisibleQuadItemCache < 0 || cacheVisibleQuad[fov][hAng].size() <= MaxVisibleQuadItemCache)) {
|
(MaxVisibleQuadItemCache < 0 || cacheVisibleQuad[fov][hAng].size() <= MaxVisibleQuadItemCache)) {
|
||||||
|
@ -245,9 +299,6 @@ Quad2i GameCamera::computeVisibleQuad() const {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(result.p[0].x < -1000) {
|
|
||||||
int ii = 0;
|
|
||||||
}
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -113,6 +113,8 @@ public:
|
||||||
destAng.y = hAng;
|
destAng.y = hAng;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string getCameraMovementKey() const;
|
||||||
|
|
||||||
//other
|
//other
|
||||||
void update();
|
void update();
|
||||||
Quad2i computeVisibleQuad() const;
|
Quad2i computeVisibleQuad() const;
|
||||||
|
|
|
@ -162,6 +162,8 @@ Renderer::Renderer() {
|
||||||
particleRenderer = NULL;
|
particleRenderer = NULL;
|
||||||
saveScreenShotThread = NULL;
|
saveScreenShotThread = NULL;
|
||||||
mapSurfaceData.clear();
|
mapSurfaceData.clear();
|
||||||
|
visibleFrameUnitList.clear();
|
||||||
|
visibleFrameUnitListCameraKey = "";
|
||||||
|
|
||||||
lastRenderFps=MIN_FPS_NORMAL_RENDERING;
|
lastRenderFps=MIN_FPS_NORMAL_RENDERING;
|
||||||
shadowsOffDueToMinRender=false;
|
shadowsOffDueToMinRender=false;
|
||||||
|
@ -337,7 +339,7 @@ void Renderer::initGame(const Game *game){
|
||||||
SurfaceData::nextUniqueId = 1;
|
SurfaceData::nextUniqueId = 1;
|
||||||
mapSurfaceData.clear();
|
mapSurfaceData.clear();
|
||||||
this->game= game;
|
this->game= game;
|
||||||
worldToScreenPosCache.clear();
|
//worldToScreenPosCache.clear();
|
||||||
|
|
||||||
//check gl caps
|
//check gl caps
|
||||||
checkGlOptionalCaps();
|
checkGlOptionalCaps();
|
||||||
|
@ -494,7 +496,7 @@ void Renderer::endGame() {
|
||||||
|
|
||||||
glDeleteLists(list3d, 1);
|
glDeleteLists(list3d, 1);
|
||||||
|
|
||||||
worldToScreenPosCache.clear();
|
//worldToScreenPosCache.clear();
|
||||||
ReleaseSurfaceVBOs();
|
ReleaseSurfaceVBOs();
|
||||||
mapSurfaceData.clear();
|
mapSurfaceData.clear();
|
||||||
}
|
}
|
||||||
|
@ -2553,7 +2555,13 @@ void Renderer::renderUnits(const int renderFps) {
|
||||||
//assert
|
//assert
|
||||||
assertGl();
|
assertGl();
|
||||||
|
|
||||||
visibleFrameUnitList.clear();
|
if(visibleFrameUnitList.empty() == false) {
|
||||||
|
visibleFrameUnitList.clear();
|
||||||
|
//visibleFrameUnitListCameraKey = "";
|
||||||
|
//if(visibleFrameUnitListCameraKey != game->getGameCamera()->getCameraMovementKey()) {
|
||||||
|
// worldToScreenPosCache.clear();
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
|
||||||
bool modelRenderStarted = false;
|
bool modelRenderStarted = false;
|
||||||
|
|
||||||
|
@ -2621,8 +2629,13 @@ void Renderer::renderUnits(const int renderFps) {
|
||||||
|
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
unit->setVisible(true);
|
unit->setVisible(true);
|
||||||
unit->setScreenPos(computeScreenPosition(unit->getCurrVectorFlat()));
|
if( showDebugUI == true &&
|
||||||
visibleFrameUnitList.push_back(unit);
|
(showDebugUILevel & debugui_unit_titles) == debugui_unit_titles) {
|
||||||
|
//unit->setScreenPos(computeScreenPosition(unit->getCurrVectorFlat()));
|
||||||
|
unit->setScreenPos(computeScreenPosition(unit->getCurrVector()));
|
||||||
|
visibleFrameUnitList.push_back(unit);
|
||||||
|
visibleFrameUnitListCameraKey = game->getGameCamera()->getCameraMovementKey();
|
||||||
|
}
|
||||||
|
|
||||||
//if(allowRenderUnitTitles == true) {
|
//if(allowRenderUnitTitles == true) {
|
||||||
// Add to the pending render unit title list
|
// Add to the pending render unit title list
|
||||||
|
@ -3571,9 +3584,9 @@ bool Renderer::computePosition(const Vec2i &screenPos, Vec2i &worldPos){
|
||||||
|
|
||||||
// This method takes world co-ordinates and translates them to screen co-ords
|
// This method takes world co-ordinates and translates them to screen co-ords
|
||||||
Vec3f Renderer::computeScreenPosition(const Vec3f &worldPos) {
|
Vec3f Renderer::computeScreenPosition(const Vec3f &worldPos) {
|
||||||
if(worldToScreenPosCache.find(worldPos) != worldToScreenPosCache.end()) {
|
//if(worldToScreenPosCache.find(worldPos) != worldToScreenPosCache.end()) {
|
||||||
return worldToScreenPosCache[worldPos];
|
// return worldToScreenPosCache[worldPos];
|
||||||
}
|
//}
|
||||||
assertGl();
|
assertGl();
|
||||||
|
|
||||||
const Metrics &metrics= Metrics::getInstance();
|
const Metrics &metrics= Metrics::getInstance();
|
||||||
|
@ -3601,7 +3614,7 @@ Vec3f Renderer::computeScreenPosition(const Vec3f &worldPos) {
|
||||||
&screenX, &screenY, &screenZ);
|
&screenX, &screenY, &screenZ);
|
||||||
|
|
||||||
Vec3f screenPos(screenX,screenY,screenZ);
|
Vec3f screenPos(screenX,screenY,screenZ);
|
||||||
worldToScreenPosCache[worldPos]=screenPos;
|
//worldToScreenPosCache[worldPos]=screenPos;
|
||||||
|
|
||||||
return screenPos;
|
return screenPos;
|
||||||
}
|
}
|
||||||
|
@ -4801,7 +4814,7 @@ void Renderer::renderUnitTitles(Font2D *font, Vec3f color) {
|
||||||
unitRenderedList[unit->getId()] = true;
|
unitRenderedList[unit->getId()] = true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
string str = unit->getFullName() + " - " + intToStr(unit->getId());
|
string str = unit->getFullName() + " - " + intToStr(unit->getId()) + " [" + unit->getPos().getString() + "]";
|
||||||
Vec3f screenPos = unit->getScreenPos();
|
Vec3f screenPos = unit->getScreenPos();
|
||||||
#ifdef USE_STREFLOP
|
#ifdef USE_STREFLOP
|
||||||
renderText(str, font, color, streflop::fabs(screenPos.x) + 5, streflop::fabs(screenPos.y) + 5, false);
|
renderText(str, font, color, streflop::fabs(screenPos.x) + 5, streflop::fabs(screenPos.y) + 5, false);
|
||||||
|
|
|
@ -245,6 +245,7 @@ private:
|
||||||
bool allowRenderUnitTitles;
|
bool allowRenderUnitTitles;
|
||||||
//std::vector<std::pair<Unit *,Vec3f> > renderUnitTitleList;
|
//std::vector<std::pair<Unit *,Vec3f> > renderUnitTitleList;
|
||||||
std::vector<Unit *> visibleFrameUnitList;
|
std::vector<Unit *> visibleFrameUnitList;
|
||||||
|
string visibleFrameUnitListCameraKey;
|
||||||
|
|
||||||
bool no2DMouseRendering;
|
bool no2DMouseRendering;
|
||||||
bool showDebugUI;
|
bool showDebugUI;
|
||||||
|
@ -258,7 +259,7 @@ private:
|
||||||
Mutex saveScreenShotThreadAccessor;
|
Mutex saveScreenShotThreadAccessor;
|
||||||
std::list<std::pair<string,Pixmap2D *> > saveScreenQueue;
|
std::list<std::pair<string,Pixmap2D *> > saveScreenQueue;
|
||||||
|
|
||||||
std::map<Vec3f,Vec3f> worldToScreenPosCache;
|
//std::map<Vec3f,Vec3f> worldToScreenPosCache;
|
||||||
|
|
||||||
std::map<uint32,VisibleQuadContainerVBOCache > mapSurfaceVBOCache;
|
std::map<uint32,VisibleQuadContainerVBOCache > mapSurfaceVBOCache;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user