- disabled will's visible quad code as i cannot get it to work when rotating around with the camera. Bugfix for normal camera visible quad so we don't get black spots when moving camera around. Bugfix for menu keyboard entry if we get a bad utf8 conversion character

This commit is contained in:
Mark Vejvoda 2011-08-30 18:28:30 +00:00
parent d99a8236ae
commit c4cbdd86e3
6 changed files with 200 additions and 83 deletions

View File

@ -84,7 +84,7 @@ public:
AiRuleRefreshHarvester(Ai *ai); AiRuleRefreshHarvester(Ai *ai);
virtual int getTestInterval() const {return 20000;} virtual int getTestInterval() const {return 20000;}
virtual string getName() const {return "Worker reasigned to needed resource";} virtual string getName() const {return "Worker reassigned to needed resource";}
virtual bool test(); virtual bool test();
virtual void execute(); virtual void execute();

View File

@ -2055,13 +2055,27 @@ void Game::render2d(){
//visible quad //visible quad
Quad2i visibleQuad= renderer.getVisibleQuad(); Quad2i visibleQuad= renderer.getVisibleQuad();
Quad2i visibleQuadCamera= renderer.getVisibleQuadFromCamera();
str+= "Visible quad: "; str+= "Visible quad: ";
for(int i= 0; i<4; ++i){ for(int i= 0; i<4; ++i){
str+= "(" + intToStr(visibleQuad.p[i].x) + "," +intToStr(visibleQuad.p[i].y) + ") "; str+= "(" + intToStr(visibleQuad.p[i].x) + "," +intToStr(visibleQuad.p[i].y) + ") ";
} }
str+= "\n"; str+= "\n";
str+= "Visible quad area: " + floatToStr(visibleQuad.area()) +"\n"; str+= "Visible quad camera: ";
for(int i= 0; i<4; ++i){
str+= "(" + intToStr(visibleQuadCamera.p[i].x) + "," +intToStr(visibleQuadCamera.p[i].y) + ") ";
}
str+= "\n";
str+= "Visible quad area: " + floatToStr(visibleQuad.area()) +"\n";
str+= "Visible quad camera area: " + floatToStr(visibleQuadCamera.area()) +"\n";
// Rect2i boundingRect= visibleQuad.computeBoundingRect();
// Rect2i scaledRect= boundingRect/Map::cellScale;
// scaledRect.clamp(0, 0, world.getMap()->getSurfaceW()-1, world.getMap()->getSurfaceH()-1);
// renderer.renderText3D("#1", coreData.getMenuFontNormal3D(), Vec3f(1.0f), scaledRect.p[0].x, scaledRect.p[0].y, false);
// renderer.renderText3D("#2", coreData.getMenuFontNormal3D(), Vec3f(1.0f), scaledRect.p[1].x, scaledRect.p[1].y, false);
int totalUnitcount = 0; int totalUnitcount = 0;
for(int i = 0; i < world.getFactionCount(); ++i) { for(int i = 0; i < world.getFactionCount(); ++i) {
@ -2151,12 +2165,6 @@ void Game::render2d(){
renderer.renderUnitTitles(coreData.getMenuFontNormal(),Vec3f(1.0f)); renderer.renderUnitTitles(coreData.getMenuFontNormal(),Vec3f(1.0f));
} }
} }
// renderer.renderText3D("#1", coreData.getMenuFontNormal3D(), Vec3f(1.0f), renderer.getVisibleQuad().p[0].x, renderer.getVisibleQuad().p[0].y, false);
// renderer.renderText3D("#2", coreData.getMenuFontNormal3D(), Vec3f(1.0f), renderer.getVisibleQuad().p[1].x, renderer.getVisibleQuad().p[1].y, false);
// renderer.renderText3D("#3", coreData.getMenuFontNormal3D(), Vec3f(1.0f), renderer.getVisibleQuad().p[2].x, renderer.getVisibleQuad().p[2].y, false);
// renderer.renderText3D("#4", coreData.getMenuFontNormal3D(), Vec3f(1.0f), renderer.getVisibleQuad().p[3].x, renderer.getVisibleQuad().p[3].y, false);
} }
//network status //network status

View File

@ -205,7 +205,7 @@ Quad2i GameCamera::computeVisibleQuad() const {
// 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);
float nearDist = 20.f; float nearDist = 15.f;
float dist = pos.y > nearDist ? pos.y * 1.2f : nearDist; float dist = pos.y > nearDist ? pos.y * 1.2f : nearDist;
float farDist = 90.f * (pos.y > nearDist ? pos.y / 15.f : 1.f); float farDist = 90.f * (pos.y > nearDist ? pos.y / 15.f : 1.f);
const float viewDegree = 180.f; const float viewDegree = 180.f;
@ -230,8 +230,12 @@ 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 bool debug = false;
Quad2i result; Quad2i result;
if (hAng >= 135 && hAng <= 225) { if (hAng >= 135 && hAng <= 225) {
if(debug) printf("Line %d hAng [%f] fov [%f]\n",__LINE__,hAng,fov);
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)) {
@ -239,6 +243,8 @@ Quad2i GameCamera::computeVisibleQuad() const {
} }
} }
else if (hAng >= 45 && hAng <= 135) { else if (hAng >= 45 && hAng <= 135) {
if(debug) printf("Line %d hAng [%f] fov [%f]\n",__LINE__,hAng,fov);
result = Quad2i(p3, p1, p4, p2); result = Quad2i(p3, p1, p4, p2);
if(MaxVisibleQuadItemCache != 0 && if(MaxVisibleQuadItemCache != 0 &&
(MaxVisibleQuadItemCache < 0 || cacheVisibleQuad[fov][hAng].size() <= MaxVisibleQuadItemCache)) { (MaxVisibleQuadItemCache < 0 || cacheVisibleQuad[fov][hAng].size() <= MaxVisibleQuadItemCache)) {
@ -246,6 +252,8 @@ Quad2i GameCamera::computeVisibleQuad() const {
} }
} }
else if (hAng >= 225 && hAng <= 315) { else if (hAng >= 225 && hAng <= 315) {
if(debug) printf("Line %d hAng [%f] fov [%f]\n",__LINE__,hAng,fov);
result = Quad2i(p2, p4, p1, p3); result = Quad2i(p2, p4, p1, p3);
if(MaxVisibleQuadItemCache != 0 && if(MaxVisibleQuadItemCache != 0 &&
(MaxVisibleQuadItemCache < 0 || cacheVisibleQuad[fov][hAng].size() <= MaxVisibleQuadItemCache)) { (MaxVisibleQuadItemCache < 0 || cacheVisibleQuad[fov][hAng].size() <= MaxVisibleQuadItemCache)) {
@ -253,6 +261,8 @@ Quad2i GameCamera::computeVisibleQuad() const {
} }
} }
else { else {
if(debug) printf("Line %d hAng [%f] fov [%f]\n",__LINE__,hAng,fov);
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)) {

View File

@ -714,48 +714,57 @@ void Renderer::loadCameraMatrix(const Camera *camera) {
glTranslatef(-position.x, -position.y, -position.z); glTranslatef(-position.x, -position.y, -position.z);
} }
static Vec2i _unprojectMap(const Vec2i& pt,const GLdouble* model,const GLdouble* projection,const GLint* viewport,const bool roundDown, const char* label=NULL) { enum PROJECTION_TO_INFINITY { D_IS_ZERO, N_OVER_D_IS_OUTSIDE };
Vec3d nearClipWorld,farClipWorld;
gluUnProject(pt.x,viewport[3]-pt.y,0,model,projection,viewport,&nearClipWorld.x,&nearClipWorld.y,&nearClipWorld.z); static Vec2i _unprojectMap(const Vec2i& pt,const GLdouble* model,const GLdouble* projection,const GLint* viewport,const char* label=NULL) {
gluUnProject(pt.x,viewport[3]-pt.y,1,model,projection,viewport,&farClipWorld.x,&farClipWorld.y,&farClipWorld.z); Vec3d a,b;
gluUnProject(pt.x,viewport[3]-pt.y,0,model,projection,viewport,&a.x,&a.y,&a.z);
gluUnProject(pt.x,viewport[3]-pt.y,1,model,projection,viewport,&b.x,&b.y,&b.z);
// junk values if you were looking parallel to the XZ plane; this shouldn't happen as the camera can't do this? // junk values if you were looking parallel to the XZ plane; this shouldn't happen as the camera can't do this?
const Vec3f start(nearClipWorld.x,nearClipWorld.y,nearClipWorld.z), const Vec3f
stop(farClipWorld.x,farClipWorld.y,farClipWorld.z), start(a.x,a.y,a.z),
plane(0,0,0), stop(b.x,b.y,b.z),
norm(0,1,0), plane(0,0,0),
u = stop-start, norm(0,1,0),
w = start-plane; u = stop-start,
w = start-plane;
const float d = norm.x*u.x + norm.y*u.y + norm.z*u.z;
#ifdef USE_STREFLOP
if(streflop::fabs(d) < 0.00001)
#else
if(fabs(d) < 0.00001)
#endif
throw D_IS_ZERO;
const float d = norm.x * u.x + norm.y * u.y + norm.z * u.z, const float nd = -(norm.x*w.x + norm.y*w.y + norm.z*w.z) / d;
n = -(norm.x * w.x + norm.y * w.y + norm.z * w.z); if(nd < 0.0 || nd >= 1.0)
const Vec3f i = start + u * (n / d); throw N_OVER_D_IS_OUTSIDE;
//printf("Will stuff: d = %f n = %f\n",d,n); const Vec3f i = start + u*nd;
//const Vec2i pos(i.x,i.z);
Vec2i pos;
if(strcmp(label,"tl") == 0) {
pos = Vec2i(streflop::floor(i.x),streflop::floor(i.z));
}
else if(strcmp(label,"tr") == 0) {
pos = Vec2i(streflop::ceil(i.x),streflop::floor(i.z));
}
else if(strcmp(label,"bl") == 0) {
pos = Vec2i(streflop::floor(i.x),streflop::ceil(i.z));
}
else if(strcmp(label,"br") == 0) {
pos = Vec2i(streflop::ceil(i.x),streflop::ceil(i.z));
}
Vec2i pos(i.x,i.z);
//#ifdef USE_STREFLOP
// if(roundDown == true) {
// pos = Vec2i(streflop::floor(i.x),streflop::floor(i.z));
// }
// else {
// pos = Vec2i(streflop::ceil(i.x),streflop::ceil(i.z));
// }
//#else
// if(roundDown == true) {
// pos = Vec2i(floor(i.x),streflop::floor(i.z));
// }
// else {
// pos = Vec2i(ceil(i.x),streflop::ceil(i.z));
// }
//#endif
if(false) { // print debug info if(false) { // print debug info
if(label) printf("%s ",label); if(label) printf("%s ",label);
printf("%d,%d -> %f,%f,%f -> %f,%f,%f -> %f,%f,%f -> %d,%d\n", printf("%d,%d -> %f,%f,%f -> %f,%f,%f -> %f,%f,%f -> %d,%d\n",
pt.x,pt.y, pt.x,pt.y,
start.x,start.y,start.z, start.x,start.y,start.z,
stop.x,stop.y,stop.z, stop.x,stop.y,stop.z,
i.x,i.y,i.z, i.x,i.y,i.z,
pos.x,pos.y); pos.x,pos.y);
} }
return pos; return pos;
} }
@ -764,39 +773,125 @@ void Renderer::computeVisibleQuad() {
const GameCamera *gameCamera = game->getGameCamera(); const GameCamera *gameCamera = game->getGameCamera();
visibleQuad = gameCamera->computeVisibleQuad(); visibleQuad = gameCamera->computeVisibleQuad();
// const bool debug = false; const bool newVisibleQuadCalc = false;
// if(debug) { if(newVisibleQuadCalc) {
// visibleQuad = gameCamera->computeVisibleQuad(); const bool debug = false;
// printf("Camera: %d,%d %d,%d %d,%d %d,%d hAng [%f] fov [%f]\n", try {
// visibleQuad.p[0].x,visibleQuad.p[0].y, if(debug) {
// visibleQuad.p[1].x,visibleQuad.p[1].y, visibleQuad = gameCamera->computeVisibleQuad();
// visibleQuad.p[2].x,visibleQuad.p[2].y, printf("Camera: %d,%d %d,%d %d,%d %d,%d\n",
// visibleQuad.p[3].x,visibleQuad.p[3].y, visibleQuad.p[0].x,visibleQuad.p[0].y,
// gameCamera->getHAng(), visibleQuad.p[1].x,visibleQuad.p[1].y,
// gameCamera->getFov()); visibleQuad.p[2].x,visibleQuad.p[2].y,
// } visibleQuad.p[3].x,visibleQuad.p[3].y);
// // compute the four corners using OpenGL }
// GLdouble model[16], projection[16]; // compute the four corners using OpenGL
// GLint viewport[4]; GLdouble model[16], projection[16];
// glGetDoublev(GL_MODELVIEW_MATRIX,model); GLint viewport[4];
// glGetDoublev(GL_PROJECTION_MATRIX,projection); glGetDoublev(GL_MODELVIEW_MATRIX,model);
// glGetIntegerv(GL_VIEWPORT,viewport); glGetDoublev(GL_PROJECTION_MATRIX,projection);
// const Vec2i glGetIntegerv(GL_VIEWPORT,viewport);
// tl = _unprojectMap(Vec2i(0,0),model,projection,viewport,true, "tl"), Vec2i
// tr = _unprojectMap(Vec2i(viewport[2],0),model,projection,viewport,false, "tr"), tl = _unprojectMap(Vec2i(0,0),model,projection,viewport,"tl"),
// br = _unprojectMap(Vec2i(viewport[2],viewport[3]),model,projection,viewport,false, "br"), tr = _unprojectMap(Vec2i(viewport[2],0),model,projection,viewport,"tr"),
// bl = _unprojectMap(Vec2i(0,viewport[3]),model,projection,viewport,true, "bl"); br = _unprojectMap(Vec2i(viewport[2],viewport[3]),model,projection,viewport,"br"),
// // set it as the frustum bl = _unprojectMap(Vec2i(0,viewport[3]),model,projection,viewport,"bl");
// visibleQuad = Quad2i(tl,bl,tr,br); // strange order // orientate it for map iterator
// if(debug) { bool swapRequiredX = false;
// printf("Will: %d,%d %d,%d %d,%d %d,%d\n", bool swapRequiredY = false;
// visibleQuad.p[0].x,visibleQuad.p[0].y, int const cellBuffer = 4;
// visibleQuad.p[1].x,visibleQuad.p[1].y, if((tl.x > tr.x) || (bl.x > br.x)) {
// visibleQuad.p[2].x,visibleQuad.p[2].y, if(debug) printf("Swap X???\n");
// visibleQuad.p[3].x,visibleQuad.p[3].y);
// }
//visibleQuad = gameCamera->computeVisibleQuad(); //std::swap(tl,bl);
//std::swap(tr,br);
if(tl.x > tr.x) {
if(debug) printf("Swap X1???\n");
tr.x += cellBuffer;
tl.x -= cellBuffer;
std::swap(tl.x,tr.x);
swapRequiredX = true;
}
else {
tl.x += cellBuffer;
tr.x -= cellBuffer;
}
if(bl.x > br.x) {
if(debug) printf("Swap X2???\n");
bl.x += cellBuffer;
br.x -= cellBuffer;
std::swap(bl.x,br.x);
swapRequiredX = true;
}
else {
br.x += cellBuffer;
bl.x -= cellBuffer;
}
}
if((tl.y > bl.y) || (tr.y > br.y)) {
visibleQuad = game->getGameCamera()->computeVisibleQuad();
if(debug) printf("Swap Y???\n");
if(tl.y > bl.y) {
if(debug) printf("Swap Y1???\n");
tl.y += cellBuffer;
bl.y -= cellBuffer;
std::swap(tl.y,bl.y);
swapRequiredY = true;
}
else {
bl.y += cellBuffer;
tl.y -= cellBuffer;
}
if(tr.y > br.y) {
if(debug) printf("Swap Y2???\n");
tr.y += cellBuffer;
br.y -= cellBuffer;
std::swap(tr.y,br.y);
swapRequiredY = true;
}
else {
br.y += cellBuffer;
tr.y -= cellBuffer;
}
//std::swap(tl,tr);
//std::swap(bl,br);
}
if(swapRequiredY == false) {
tl.y -= cellBuffer;
tr.y -= cellBuffer;
bl.y += cellBuffer;
br.y += cellBuffer;
}
// set it as the frustum
visibleQuad = Quad2i(tl,bl,tr,br); // strange order
if(debug) {
printf("Will: %d,%d %d,%d %d,%d %d,%d\n",
visibleQuad.p[0].x,visibleQuad.p[0].y,
visibleQuad.p[1].x,visibleQuad.p[1].y,
visibleQuad.p[2].x,visibleQuad.p[2].y,
visibleQuad.p[3].x,visibleQuad.p[3].y);
}
}
catch(PROJECTION_TO_INFINITY e) {
if(debug) printf("hmm staring at the horizon %d\n",(int)e);
// use historic code solution
visibleQuad = game->getGameCamera()->computeVisibleQuad();
}
}
} }
// ======================================= // =======================================

View File

@ -218,6 +218,7 @@ private:
int triangleCount; int triangleCount;
int pointCount; int pointCount;
Quad2i visibleQuad; Quad2i visibleQuad;
Quad2i visibleQuadFromCamera;
Vec4f nearestLightPos; Vec4f nearestLightPos;
VisibleQuadContainerCache quadCache; VisibleQuadContainerCache quadCache;
@ -466,6 +467,7 @@ public:
void loadConfig(); void loadConfig();
void saveScreen(const string &path); void saveScreen(const string &path);
Quad2i getVisibleQuad() const {return visibleQuad;} Quad2i getVisibleQuad() const {return visibleQuad;}
Quad2i getVisibleQuadFromCamera() const {return visibleQuadFromCamera;}
void renderTeamColorPlane(); void renderTeamColorPlane();
void renderTeamColorCircle(); void renderTeamColorCircle();

View File

@ -2153,14 +2153,16 @@ void MenuStateConnectedGame::keyPress(SDL_KeyboardEvent c) {
char szCharText[20]=""; char szCharText[20]="";
sprintf(szCharText,"%c",key); sprintf(szCharText,"%c",key);
char *utfStr = String::ConvertToUTF8(&szCharText[0]); char *utfStr = String::ConvertToUTF8(&szCharText[0]);
text.insert(text.end() -1, utfStr[0]); if(utfStr != NULL) {
delete [] utfStr; text.insert(text.end() -1, utfStr[0]);
delete [] utfStr;
activeInputLabel->setText(text); activeInputLabel->setText(text);
switchSetupRequestFlagType |= ssrft_NetworkPlayerName; switchSetupRequestFlagType |= ssrft_NetworkPlayerName;
needToSetChangedGameSettings = true; needToSetChangedGameSettings = true;
lastSetChangedGameSettings = time(NULL); lastSetChangedGameSettings = time(NULL);
}
} }
} }
} }