more render improvements

This commit is contained in:
Mark Vejvoda 2013-06-12 01:07:53 +00:00
parent 929381e3ee
commit a516b0eb0d
1 changed files with 90 additions and 249 deletions

View File

@ -1178,50 +1178,6 @@ static Vec2i _unprojectMap(const Vec2i& pt,const GLdouble* model,const GLdouble*
gluUnProject(pt.x,realy,0,model,projection,viewport,&a.x,&a.y,&a.z);
gluUnProject(pt.x,realy,1,model,projection,viewport,&b.x,&b.y,&b.z);
/*
//We could use some vector3d class, but this will do fine for now
//ray
b.x -= a.x;
b.y -= a.y;
b.z -= a.z;
float rayLength = streflop::sqrtf(a.x*a.x + a.y*a.y + a.z*a.z);
//normalize
b.x /= rayLength;
b.y /= rayLength;
b.z /= rayLength;
//T = [planeNormal.(pointOnPlane - rayOrigin)]/planeNormal.rayDirection;
//pointInPlane = rayOrigin + (rayDirection * T);
float dot1, dot2;
float pointInPlaneX = 0;
float pointInPlaneY = 0;
float pointInPlaneZ = 0;
float planeNormalX = 0;
float planeNormalY = 0;
float planeNormalZ = -1;
pointInPlaneX -= a.x;
pointInPlaneY -= a.y;
pointInPlaneZ -= a.z;
dot1 = (planeNormalX * pointInPlaneX) + (planeNormalY * pointInPlaneY) + (planeNormalZ * pointInPlaneZ);
dot2 = (planeNormalX * b.x) + (planeNormalY * b.y) + (planeNormalZ * b.z);
float t = dot1/dot2;
b.x *= t;
b.y *= t;
//b.z *= t;
//we don't need the z coordinate in my case
//return Vec2i(b.x + a.x, b.z + a.z);
return Vec2i(b.x + a.x, b.z + a.z);
*/
// 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(a.x,a.y,a.z),
@ -1231,11 +1187,12 @@ static Vec2i _unprojectMap(const Vec2i& pt,const GLdouble* model,const GLdouble*
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(static_cast<streflop::Simple>(d)) < 0.00001)
#else
if(fabs(d) < 0.00001)
#endif
//#ifdef USE_STREFLOP
// if(streflop::fabs(static_cast<streflop::Simple>(d)) < 0.00001)
//#else
// if(fabs(d) < 0.00001)
//#endif
if(std::fabs(d) < 0.00001)
throw pti_D_IS_ZERO;
const float nd = -(norm.x*w.x + norm.y*w.y + norm.z*w.z) / d;
@ -1247,32 +1204,36 @@ static Vec2i _unprojectMap(const Vec2i& pt,const GLdouble* model,const GLdouble*
Vec2i pos;
if(strcmp(label,"tl") == 0) {
#ifdef USE_STREFLOP
pos = Vec2i(streflop::floor(static_cast<streflop::Simple>(i.x)),streflop::floor(static_cast<streflop::Simple>(i.z)));
#else
pos = Vec2i(floor(i.x),floor(i.z));
#endif
//#ifdef USE_STREFLOP
// pos = Vec2i(streflop::floor(static_cast<streflop::Simple>(i.x)),streflop::floor(static_cast<streflop::Simple>(i.z)));
//#else
// pos = Vec2i(floor(i.x),floor(i.z));
//#endif
pos = Vec2i(std::floor(i.x),std::floor(i.z));
}
else if(strcmp(label,"tr") == 0) {
#ifdef USE_STREFLOP
pos = Vec2i(streflop::ceil(static_cast<streflop::Simple>(i.x)),streflop::floor(static_cast<streflop::Simple>(i.z)));
#else
pos = Vec2i(ceil(i.x),floor(i.z));
#endif
//#ifdef USE_STREFLOP
// pos = Vec2i(streflop::ceil(static_cast<streflop::Simple>(i.x)),streflop::floor(static_cast<streflop::Simple>(i.z)));
//#else
// pos = Vec2i(ceil(i.x),floor(i.z));
//#endif
pos = Vec2i(std::ceil(i.x),std::floor(i.z));
}
else if(strcmp(label,"bl") == 0) {
#ifdef USE_STREFLOP
pos = Vec2i(streflop::floor(static_cast<streflop::Simple>(i.x)),streflop::ceil(static_cast<streflop::Simple>(i.z)));
#else
pos = Vec2i(floor(i.x),ceil(i.z));
#endif
//#ifdef USE_STREFLOP
// pos = Vec2i(streflop::floor(static_cast<streflop::Simple>(i.x)),streflop::ceil(static_cast<streflop::Simple>(i.z)));
//#else
// pos = Vec2i(floor(i.x),ceil(i.z));
//#endif
pos = Vec2i(std::floor(i.x),std::ceil(i.z));
}
else if(strcmp(label,"br") == 0) {
#ifdef USE_STREFLOP
pos = Vec2i(streflop::ceil(static_cast<streflop::Simple>(i.x)),streflop::ceil(static_cast<streflop::Simple>(i.z)));
#else
pos = Vec2i(ceil(i.x),ceil(i.z));
#endif
//#ifdef USE_STREFLOP
// pos = Vec2i(streflop::ceil(static_cast<streflop::Simple>(i.x)),streflop::ceil(static_cast<streflop::Simple>(i.z)));
//#else
// pos = Vec2i(ceil(i.x),ceil(i.z));
//#endif
pos = Vec2i(std::ceil(i.x),std::ceil(i.z));
}
if(false) { // print debug info
@ -1288,32 +1249,6 @@ static Vec2i _unprojectMap(const Vec2i& pt,const GLdouble* model,const GLdouble*
}
//Matrix4 LookAt( Vector3 eye, Vector3 target, Vector3 up ) {
// Vector3 zaxis = normal(target - eye); // The "look-at" vector.
// Vector3 xaxis = normal(cross(up, zaxis));// The "right" vector.
// Vector3 yaxis = cross(zaxis, xaxis); // The "up" vector.
//
// // Create a 4x4 orientation matrix from the right, up, and at vectors
// Matrix4 orientation = {
// xaxis.x, yaxis.x, zaxis.x, 0,
// xaxis.y, yaxis.y, zaxis.y, 0,
// xaxis.z, yaxis.z, zaxis.z, 0,
// 0, 0, 0, 1
// };
//
// // Create a 4x4 translation matrix by negating the eye position.
// Matrix4 translation = {
// 1, 0, 0, 0,
// 0, 1, 0, 0,
// 0, 0, 1, 0,
// -eye.x, -eye.y, -eye.z, 1
// };
//
// // Combine the orientation and translation to compute the view matrix
// return ( translation * orientation );
//}
bool Renderer::ExtractFrustum(VisibleQuadContainerCache &quadCacheItem) {
bool frustumChanged = false;
vector<float> proj(16,0);
@ -1601,19 +1536,6 @@ bool Renderer::CubeInFrustum(vector<vector<float> > &frustum, float x, float y,
void Renderer::computeVisibleQuad() {
visibleQuad = this->gameCamera->computeVisibleQuad();
//Matrix4 LookAt( gameCamera->getPos(), gameCamera->getPos(), Vector3 up );
//gluLookAt
//const Metrics &metrics= Metrics::getInstance();
//float Hnear = 2.0 * streflop::tanf(gameCamera->getFov() / 2.0) * perspNearPlane;
//float Hnear = 2.0 * streflop::tanf(perspFov / 2.0) * perspNearPlane;
//float Wnear = Hnear * metrics.getAspectRatio();
//The same reasoning can be applied to the far plane:
//float Hfar = 2.0 * streflop::tanf(perspFov / 2.0) * perspFarPlane;
//float Hfar = 2.0 * streflop::tanf(gameCamera->getFov() / 2.0) * perspFarPlane;
//float Wfar = Hfar * metrics.getAspectRatio();
//printf("Hnear = %f, Wnear = %f, Hfar = %f, Wfar = %f\n",Hnear,Wnear,Hfar,Wfar);
bool frustumChanged = false;
if(VisibleQuadContainerCache::enableFrustumCalcs == true) {
frustumChanged = ExtractFrustum(quadCache);
@ -2788,11 +2710,12 @@ Vec2f Renderer::getCentered3DPos(const string &text, Font3D *font, Vec2f &pos, i
else if(lineHeight > h) {
//printf("line %d, lineHeight [%f] h [%d] text [%s]\n",__LINE__,lineHeight,h,text.c_str());
#ifdef USE_STREFLOP
pos.y += (float)(streflop::ceil( static_cast<streflop::Simple>( ((float)lineHeight - (float)h)) ));
#else
pos.y += (ceil(lineHeight - h));
#endif
//#ifdef USE_STREFLOP
// pos.y += (float)(streflop::ceil( static_cast<streflop::Simple>( ((float)lineHeight - (float)h)) ));
//#else
// pos.y += (ceil(lineHeight - h));
//#endif
pos.y += (std::ceil(lineHeight - h));
}
}
return pos;
@ -5688,29 +5611,6 @@ void Renderer::renderMinimap(){
assertGl();
// CoreData &coreData= CoreData::getInstance();
// Texture2D *backTexture =coreData.getButtonBigTexture();
// glEnable(GL_TEXTURE_2D);
// glEnable(GL_BLEND);
// glBindTexture(GL_TEXTURE_2D, static_cast<Texture2DGl*>(backTexture)->getHandle());
//
// glBegin(GL_TRIANGLE_STRIP);
// glTexCoord2f(0.f, 0.f);
// glVertex2f(mx-8, my-8);
//
// glTexCoord2f(0.f, 1.f);
// glVertex2f(mx-8, my+mh+8);
//
// glTexCoord2f(1.f, 0.f);
// glVertex2f(mx+mw+8, my-8);
//
// glTexCoord2f(1.f, 1.f);
// glVertex2f(mx+mw+8, my+mh+8);
// glEnd();
//
// glDisable(GL_TEXTURE_2D);
// render minimap border
Vec4f col= game->getGui()->getDisplay()->getColor();
glColor4f(col.x*0.5f,col.y*0.5f,col.z*0.5f,1.0 );
@ -5744,18 +5644,6 @@ void Renderer::renderMinimap(){
glVertex2i(mx+mw+borderWidth, my);
glEnd();
// Vec4f col= game->getGui()->getDisplay()->getColor();
// glBegin(GL_QUADS);
// glColor4f(col.x*0.5f,col.y*0.5f,col.z*0.5f,1.0 );
// glVertex2i(mx-4, my-4);
// glVertex2i(mx-4, my+mh+4);
// glVertex2i(mx+mw+4, my+mh+4);
// glVertex2i(mx+mw+4, my-4);
//
// glEnd();
assertGl();
glPushAttrib(GL_CURRENT_BIT | GL_ENABLE_BIT | GL_LINE_BIT | GL_TEXTURE_BIT);
@ -5781,50 +5669,6 @@ void Renderer::renderMinimap(){
glActiveTexture(baseTexUnit);
glBindTexture(GL_TEXTURE_2D, static_cast<const Texture2DGl*>(minimap->getTexture())->getHandle());
/*
Vec2f texCoords[4];
Vec2f texCoords2[4];
Vec2i vertices[4];
texCoords[0] = Vec2f(0.0f, 1.0f);
texCoords2[0] = Vec2f(0.0f, 1.0f);
vertices[0] = Vec2i(mx, my);
texCoords[1] = Vec2f(0.0f, 0.0f);
texCoords2[1] = Vec2f(0.0f, 0.0f);
vertices[1] = Vec2i(mx, my+mh);
texCoords[2] = Vec2f(1.0f, 1.0f);
texCoords2[2] = Vec2f(1.0f, 1.0f);
vertices[2] = Vec2i(mx+mw, my);
texCoords[3] = Vec2f(1.0f, 0.0f);
texCoords2[3] = Vec2f(1.0f, 0.0f);
vertices[3] = Vec2i(mx+mw, my+mh);
glClientActiveTexture(baseTexUnit);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0,&texCoords[0]);
glClientActiveTexture(fowTexUnit);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0,&texCoords2[0]);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_INT, 0, &vertices[0]);
glColor4f(0.5f, 0.5f, 0.5f, 0.1f);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisableClientState(GL_VERTEX_ARRAY);
glClientActiveTexture(baseTexUnit);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glClientActiveTexture(fowTexUnit);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
*/
//glColor4f(0.3f, 0.3f, 0.3f, 0.90f);
glColor4f(0.5f, 0.5f, 0.5f, 0.2f);
glBegin(GL_TRIANGLE_STRIP);
@ -6017,19 +5861,6 @@ void Renderer::renderMinimap(){
unit_colors[unitIdx] = color;
unit_vertices[unitIdx] = Vec2f(mx + pos.x*zoom.x, my + mh - ((pos.y+size)*zoom.y));
unitIdx++;
/*
glColor3fv(color.ptr());
glBegin(GL_QUADS);
glVertex2f(mx + pos.x*zoom.x, my + mh - (pos.y*zoom.y));
glVertex2f(mx + (pos.x+1)*zoom.x+size, my + mh - (pos.y*zoom.y));
glVertex2f(mx + (pos.x+1)*zoom.x+size, my + mh - ((pos.y+size)*zoom.y));
glVertex2f(mx + pos.x*zoom.x, my + mh - ((pos.y+size)*zoom.y));
glEnd();
*/
}
if(unitIdx > 0) {
@ -6059,23 +5890,27 @@ void Renderer::renderMinimap(){
int x1;
int y1;
#ifdef USE_STREFLOP
x1 = mx + x + static_cast<int>(20*streflop::sin(static_cast<streflop::Simple>(ang-pi/5)));
y1 = my + mh - (y-static_cast<int>(20*streflop::cos(static_cast<streflop::Simple>(ang-pi/5))));
#else
x1 = mx + x + static_cast<int>(20*sin(ang-pi/5));
y1 = my + mh - (y-static_cast<int>(20*cos(ang-pi/5)));
#endif
//#ifdef USE_STREFLOP
// x1 = mx + x + static_cast<int>(20*streflop::sin(static_cast<streflop::Simple>(ang-pi/5)));
// y1 = my + mh - (y-static_cast<int>(20*streflop::cos(static_cast<streflop::Simple>(ang-pi/5))));
//#else
// x1 = mx + x + static_cast<int>(20*sin(ang-pi/5));
// y1 = my + mh - (y-static_cast<int>(20*cos(ang-pi/5)));
//#endif
x1 = mx + x + static_cast<int>(20*std::sin(ang-pi/5));
y1 = my + mh - (y-static_cast<int>(20*std::cos(ang-pi/5)));
int x2;
int y2;
#ifdef USE_STREFLOP
x2 = mx + x + static_cast<int>(20*streflop::sin(static_cast<streflop::Simple>(ang+pi/5)));
y2 = my + mh - (y-static_cast<int>(20*streflop::cos(static_cast<streflop::Simple>(ang+pi/5))));
#else
x2 = mx + x + static_cast<int>(20*sin(ang+pi/5));
y2 = my + mh - (y-static_cast<int>(20*cos(ang+pi/5)));
#endif
//#ifdef USE_STREFLOP
// x2 = mx + x + static_cast<int>(20*streflop::sin(static_cast<streflop::Simple>(ang+pi/5)));
// y2 = my + mh - (y-static_cast<int>(20*streflop::cos(static_cast<streflop::Simple>(ang+pi/5))));
//#else
// x2 = mx + x + static_cast<int>(20*sin(ang+pi/5));
// y2 = my + mh - (y-static_cast<int>(20*cos(ang+pi/5)));
//#endif
x2 = mx + x + static_cast<int>(20*std::sin(ang+pi/5));
y2 = my + mh - (y-static_cast<int>(20*std::cos(ang+pi/5)));
glColor4f(1.f, 1.f, 1.f, 1.f);
glBegin(GL_TRIANGLES);
@ -7525,20 +7360,22 @@ float Renderer::computeMoonAngle(float time) {
Vec4f Renderer::computeSunPos(float time) {
float ang= computeSunAngle(time);
#ifdef USE_STREFLOP
return Vec4f(-streflop::cos(static_cast<streflop::Simple>(ang))*sunDist, streflop::sin(static_cast<streflop::Simple>(ang))*sunDist, 0.f, 0.f);
#else
return Vec4f(-cos(ang)*sunDist, sin(ang)*sunDist, 0.f, 0.f);
#endif
//#ifdef USE_STREFLOP
// return Vec4f(-streflop::cos(static_cast<streflop::Simple>(ang))*sunDist, streflop::sin(static_cast<streflop::Simple>(ang))*sunDist, 0.f, 0.f);
//#else
// return Vec4f(-cos(ang)*sunDist, sin(ang)*sunDist, 0.f, 0.f);
//#endif
return Vec4f(-std::cos(ang)*sunDist, std::sin(ang)*sunDist, 0.f, 0.f);
}
Vec4f Renderer::computeMoonPos(float time) {
float ang= computeMoonAngle(time);
#ifdef USE_STREFLOP
return Vec4f(-streflop::cos(static_cast<streflop::Simple>(ang))*moonDist, streflop::sin(static_cast<streflop::Simple>(ang))*moonDist, 0.f, 0.f);
#else
return Vec4f(-cos(ang)*moonDist, sin(ang)*moonDist, 0.f, 0.f);
#endif
//#ifdef USE_STREFLOP
// return Vec4f(-streflop::cos(static_cast<streflop::Simple>(ang))*moonDist, streflop::sin(static_cast<streflop::Simple>(ang))*moonDist, 0.f, 0.f);
//#else
// return Vec4f(-cos(ang)*moonDist, sin(ang)*moonDist, 0.f, 0.f);
//#endif
return Vec4f(-std::cos(ang)*moonDist, std::sin(ang)*moonDist, 0.f, 0.f);
}
// ==================== fast render ====================
@ -8630,22 +8467,24 @@ void Renderer::renderUnitTitles3D(Font3D *font, Vec3f color) {
if(unit->getCurrentUnitTitle() != "") {
//get the screen coordinates
Vec3f screenPos = unit->getScreenPos();
#ifdef USE_STREFLOP
renderText3D(unit->getCurrentUnitTitle(), font, color, streflop::fabs(static_cast<streflop::Simple>(screenPos.x)) + 5, streflop::fabs(static_cast<streflop::Simple>(screenPos.y)) + 5, false);
#else
renderText3D(unit->getCurrentUnitTitle(), font, color, fabs(screenPos.x) + 5, fabs(screenPos.y) + 5, false);
#endif
// #ifdef USE_STREFLOP
// renderText3D(unit->getCurrentUnitTitle(), font, color, streflop::fabs(static_cast<streflop::Simple>(screenPos.x)) + 5, streflop::fabs(static_cast<streflop::Simple>(screenPos.y)) + 5, false);
// #else
// renderText3D(unit->getCurrentUnitTitle(), font, color, fabs(screenPos.x) + 5, fabs(screenPos.y) + 5, false);
// #endif
renderText3D(unit->getCurrentUnitTitle(), font, color, std::fabs(screenPos.x) + 5, std::fabs(screenPos.y) + 5, false);
//unitRenderedList[unit->getId()] = true;
}
else {
string str = unit->getFullName() + " - " + intToStr(unit->getId()) + " [" + unit->getPosNotThreadSafe().getString() + "]";
Vec3f screenPos = unit->getScreenPos();
#ifdef USE_STREFLOP
renderText3D(str, font, color, streflop::fabs(static_cast<streflop::Simple>(screenPos.x)) + 5, streflop::fabs(static_cast<streflop::Simple>(screenPos.y)) + 5, false);
#else
renderText3D(str, font, color, fabs(screenPos.x) + 5, fabs(screenPos.y) + 5, false);
#endif
// #ifdef USE_STREFLOP
// renderText3D(str, font, color, streflop::fabs(static_cast<streflop::Simple>(screenPos.x)) + 5, streflop::fabs(static_cast<streflop::Simple>(screenPos.y)) + 5, false);
// #else
// renderText3D(str, font, color, fabs(screenPos.x) + 5, fabs(screenPos.y) + 5, false);
// #endif
renderText3D(str, font, color, std::fabs(screenPos.x) + 5, std::fabs(screenPos.y) + 5, false);
}
}
}
@ -8692,22 +8531,24 @@ void Renderer::renderUnitTitles(Font2D *font, Vec3f color) {
if(unit->getCurrentUnitTitle() != "") {
//get the screen coordinates
Vec3f screenPos = unit->getScreenPos();
#ifdef USE_STREFLOP
renderText(unit->getCurrentUnitTitle(), font, color, streflop::fabs(static_cast<streflop::Simple>(screenPos.x)) + 5, streflop::fabs(static_cast<streflop::Simple>(screenPos.y)) + 5, false);
#else
renderText(unit->getCurrentUnitTitle(), font, color, fabs(screenPos.x) + 5, fabs(screenPos.y) + 5, false);
#endif
//#ifdef USE_STREFLOP
// renderText(unit->getCurrentUnitTitle(), font, color, streflop::fabs(static_cast<streflop::Simple>(screenPos.x)) + 5, streflop::fabs(static_cast<streflop::Simple>(screenPos.y)) + 5, false);
//#else
// renderText(unit->getCurrentUnitTitle(), font, color, fabs(screenPos.x) + 5, fabs(screenPos.y) + 5, false);
//#endif
renderText(unit->getCurrentUnitTitle(), font, color, std::fabs(screenPos.x) + 5, std::fabs(screenPos.y) + 5, false);
//unitRenderedList[unit->getId()] = true;
}
else {
string str = unit->getFullName() + " - " + intToStr(unit->getId()) + " [" + unit->getPosNotThreadSafe().getString() + "]";
Vec3f screenPos = unit->getScreenPos();
#ifdef USE_STREFLOP
renderText(str, font, color, streflop::fabs(static_cast<streflop::Simple>(screenPos.x)) + 5, streflop::fabs(static_cast<streflop::Simple>(screenPos.y)) + 5, false);
#else
renderText(str, font, color, fabs(screenPos.x) + 5, fabs(screenPos.y) + 5, false);
#endif
//#ifdef USE_STREFLOP
// renderText(str, font, color, streflop::fabs(static_cast<streflop::Simple>(screenPos.x)) + 5, streflop::fabs(static_cast<streflop::Simple>(screenPos.y)) + 5, false);
//#else
// renderText(str, font, color, fabs(screenPos.x) + 5, fabs(screenPos.y) + 5, false);
//#endif
renderText(str, font, color, std::fabs(screenPos.x) + 5, std::fabs(screenPos.y) + 5, false);
}
}
}