]> git.jsancho.org Git - lugaru.git/blobdiff - Source/Terrain.cpp
rename for readability
[lugaru.git] / Source / Terrain.cpp
index 6ee96a5e49772837204655ab0c08126910dd1150..1af30585241816c182360a913e813c112270bcfc 100644 (file)
@@ -24,21 +24,19 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include "Objects.h"
 extern XYZ viewer;
 extern float viewdistance;
-extern float lightambient[3],lightbrightness[3];
 extern float fadestart;
 extern int environment;
 extern float texscale;
 extern Light light;
 extern float multiplier;
 extern FRUSTUM frustum;
-extern float texdetail,terraindetail;
+extern float texdetail;
 extern int detail;
 extern bool decals;
 extern float blurness;
 extern float targetblurness;
 extern Objects objects;
 extern TGAImageRec texture;
-extern Game * pgame;
 extern bool visibleloading;
 extern bool skyboxtexture;
 extern int tutoriallevel;
@@ -105,7 +103,7 @@ int Terrain::lineTerrain(XYZ p1,XYZ p2, XYZ *p)
                                triangles[2].z=j;
 
                                intersecting=LineFacet(p1,p2,triangles[0],triangles[1],triangles[2],&point);
-                               distance=findDistancefast(&p1,&point);
+                               distance=distsq(&p1,&point);
                                if((distance<olddistance||firstintersecting==-1)&&intersecting==1){olddistance=distance; firstintersecting=1; *p=point;}
 
                                triangles[0].x=i+1;
@@ -121,7 +119,7 @@ int Terrain::lineTerrain(XYZ p1,XYZ p2, XYZ *p)
                                triangles[2].z=j+1;
 
                                intersecting=LineFacet(p1,p2,triangles[0],triangles[1],triangles[2],&point);
-                               distance=findDistancefast(&p1,&point);
+                               distance=distsq(&p1,&point);
                                if((distance<olddistance||firstintersecting==-1)&&intersecting==1){olddistance=distance; firstintersecting=1; *p=point;}
                        }
                }
@@ -148,7 +146,7 @@ void Terrain::UpdateTransparency(int whichx, int whichy){
                                vertex.x=i*scale;
                                vertex.z=j*scale;
                                vertex.y=heightmap[i][j]*scale;
-                               distance=findDistancefast(&viewer,&vertex);
+                               distance=distsq(&viewer,&vertex);
                                if(distance>viewdistsquared)distance=viewdistsquared;
                                colors[i][j][3]=(viewdistsquared-(distance-(viewdistsquared*fadestart))*(1/(1-fadestart)))/viewdistsquared;
                        }
@@ -224,7 +222,7 @@ void Terrain::UpdateTransparencyotherother(int whichx, int whichy){
                                vertex.x=i*scale;
                                vertex.z=j*scale;
                                vertex.y=heightmap[i][j]*scale;
-                               distance=findDistancefast(&viewer,&vertex);
+                               distance=distsq(&viewer,&vertex);
                                if(distance>viewdistsquared)distance=viewdistsquared;
                                colors[i][j][3]=(viewdistsquared-(distance-(viewdistsquared*fadestart))*(1/(1-fadestart)))/viewdistsquared;
                        }
@@ -378,10 +376,13 @@ bool Terrain::load(const char *fileName)
        static float patch_size;
 
        float temptexdetail=texdetail;
-       texdetail=terraindetail;
        //LoadTGA( fileName );
+
+       // Fixing filename so that it works with its own os
+       char * FixedFN = ConvertFileName(fileName);
+
        unsigned char fileNamep[256];
-       CopyCStringToPascal(fileName,fileNamep);
+       CopyCStringToPascal(FixedFN, fileNamep);
        //Load Image
        upload_image( fileNamep ,0); 
 
@@ -398,7 +399,7 @@ bool Terrain::load(const char *fileName)
                }
        }
        texture.bpp=24;
-       if(visibleloading)pgame->LoadingScreen();
+       if(visibleloading) Game::LoadingScreen();
 
        texdetail=temptexdetail;
 
@@ -425,12 +426,12 @@ bool Terrain::load(const char *fileName)
 
                for(i=0;i<size;i++){
                        for(j=0;j<size;j++){
-                               heightmap[size-1-i][j]=(float)((texture.data[(i+(j*size))*texture.bpp/8]))/5/terraindetail;
+                               heightmap[size-1-i][j]=(float)((texture.data[(i+(j*size))*texture.bpp/8]))/5;
                        }
                }
 
        }
-       if(visibleloading)pgame->LoadingScreen();
+       if(visibleloading) Game::LoadingScreen();
 
        float slopeness;
 
@@ -439,7 +440,7 @@ bool Terrain::load(const char *fileName)
                        textureness[i][j]=-1;
                }
        }
-       if(visibleloading)pgame->LoadingScreen();
+       if(visibleloading) Game::LoadingScreen();
 
 
        for(i=0;i<size;i++){
@@ -473,7 +474,7 @@ bool Terrain::load(const char *fileName)
                        }
                }
        }
-       if(visibleloading)pgame->LoadingScreen();
+       if(visibleloading) Game::LoadingScreen();
 
        for(i=0;i<size;i++){
                for(j=0;j<size;j++){
@@ -485,7 +486,7 @@ bool Terrain::load(const char *fileName)
                        }
                }
        }
-       if(visibleloading)pgame->LoadingScreen();
+       if(visibleloading) Game::LoadingScreen();
 
        /*float total;
        int todivide;
@@ -595,7 +596,7 @@ bool Terrain::load(const char *fileName)
                        }
                }
        }
-       if(visibleloading)pgame->LoadingScreen();
+       if(visibleloading) Game::LoadingScreen();
 
        patch_size=size/subdivision;
        patch_elements=(patch_size)*(patch_size)*54;
@@ -975,44 +976,57 @@ void Terrain::draw(int layer)
        endz=(viewer.z+viewdistance)/(patch_size)+1;
        if(endz>subdivision)endz=subdivision;
 
-       if(!layer)
+       if(!layer) {
                for(i=beginx;i<endx;i++){       
                        for(j=beginz;j<endz;j++){       
                                terrainpoint.x=i*patch_size+(patch_size)/2;
                                terrainpoint.y=viewer.y;//heightmap[i][j]*scale;
                                terrainpoint.z=j*patch_size+(patch_size)/2;
-                               distance[i][j]=findDistancefast(&viewer,&terrainpoint);
+                               distance[i][j]=distsq(&viewer,&terrainpoint);
                        }
                }
-
-               for(i=beginx;i<endx;i++){       
-                       for(j=beginz;j<endz;j++){       
-                               if(distance[i][j]<(viewdistance+patch_size)*(viewdistance+patch_size)){
-                                       opacity=1;
-                                       if(distance[i][j]>viewdistsquared*fadestart-viewdistsquared)opacity=0;
-                                       if(opacity==1&&i!=subdivision)if(distance[i+1][j]>viewdistsquared*fadestart-viewdistsquared)opacity=0;
-                                       if(opacity==1&&j!=subdivision)if(distance[i][j+1]>viewdistsquared*fadestart-viewdistsquared)opacity=0;
-                                       if(opacity==1&&j!=subdivision&&i!=subdivision)if(distance[i+1][j+1]>viewdistsquared*fadestart-viewdistsquared)opacity=0;
-                                       glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-                                       glPushMatrix();
-                                               if(frustum.CubeInFrustum(i*patch_size+patch_size*.5,avgypatch[i][j],j*patch_size+patch_size*.5,heightypatch[i][j]/2))
-                                               {   
-                                                       if(environment==desertenvironment&&distance[i][j]>viewdistsquared/4)glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, blurness);
-                                                       else if(environment==desertenvironment)glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0 );
-                                                       if(!layer&&textureness[i][j]!=allsecond)drawpatch(i,j,opacity);
-                                                       if(layer==1&&textureness[i][j]!=allfirst)drawpatchother(i,j,opacity);
-                                                       if(layer==2&&textureness[i][j]!=allfirst)drawpatchotherother(i,j,opacity);
-                                               }
-                                       glPopMatrix();
-                               }
+       }
+       for(i=beginx;i<endx;i++){
+               for(j=beginz;j<endz;j++){       
+                       if(distance[i][j]<(viewdistance+patch_size)*(viewdistance+patch_size)){
+                               opacity=1;
+                               if(distance[i][j]>viewdistsquared*fadestart-viewdistsquared)
+                                       opacity=0;
+                               if(opacity==1&&i!=subdivision)
+                                       if(distance[i+1][j]>viewdistsquared*fadestart-viewdistsquared)
+                                               opacity=0;
+                               if(opacity==1&&j!=subdivision)
+                                       if(distance[i][j+1]>viewdistsquared*fadestart-viewdistsquared)
+                                               opacity=0;
+                               if(opacity==1&&j!=subdivision&&i!=subdivision)
+                                       if(distance[i+1][j+1]>viewdistsquared*fadestart-viewdistsquared)
+                                               opacity=0;
+                               glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
+                               glPushMatrix();
+                                       if(frustum.CubeInFrustum(i*patch_size+patch_size*.5,avgypatch[i][j],j*patch_size+patch_size*.5,heightypatch[i][j]/2))
+                                       {   
+                                               if(environment==desertenvironment&&distance[i][j]>viewdistsquared/4)
+                                                       glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, blurness);
+                                               else if(environment==desertenvironment)
+                                                       glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0 );
+                                               if(!layer&&textureness[i][j]!=allsecond)
+                                                       drawpatch(i,j,opacity);
+                                               if(layer==1&&textureness[i][j]!=allfirst)
+                                                       drawpatchother(i,j,opacity);
+                                               if(layer==2&&textureness[i][j]!=allfirst)
+                                                       drawpatchotherother(i,j,opacity);
+                                       }
+                               glPopMatrix();
                        }
                }
-               if(environment==desertenvironment)glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0 );
+       }
+       if(environment==desertenvironment)
+               glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0 );
 }
 
 void Terrain::drawdecals()
 {
-       if(decals){
+       if(decals) {
                static int i,j;
                static float distancemult;
                static int lasttype;
@@ -1033,7 +1047,7 @@ void Terrain::drawdecals()
                for(i=0;i<numdecals;i++){
                        if(decaltype[i]==blooddecalfast&&decalalivetime[i]<2)decalalivetime[i]=2;
                        if((decaltype[i]==shadowdecal||decaltype[i]==shadowdecalpermanent)&&decaltype[i]!=lasttype){
-                               glBindTexture( GL_TEXTURE_2D, shadowtexture);
+                               shadowtexture.bind();
                                if(!blend){
                                        blend=1;
                                        glAlphaFunc(GL_GREATER, 0.0001);
@@ -1041,7 +1055,7 @@ void Terrain::drawdecals()
                                }
                        }
                        if(decaltype[i]==footprintdecal&&decaltype[i]!=lasttype){
-                               glBindTexture( GL_TEXTURE_2D, footprinttexture);
+                               footprinttexture.bind();
                                if(!blend){
                                        blend=1;
                                        glAlphaFunc(GL_GREATER, 0.0001);
@@ -1049,7 +1063,7 @@ void Terrain::drawdecals()
                                }
                        }
                        if(decaltype[i]==bodyprintdecal&&decaltype[i]!=lasttype){
-                               glBindTexture( GL_TEXTURE_2D, bodyprinttexture);
+                               bodyprinttexture.bind();
                                if(!blend){
                                        blend=1;
                                        glAlphaFunc(GL_GREATER, 0.0001);
@@ -1057,7 +1071,7 @@ void Terrain::drawdecals()
                                }
                        }
                        if((decaltype[i]==blooddecal||decaltype[i]==blooddecalslow)&&decaltype[i]!=lasttype){
-                               glBindTexture( GL_TEXTURE_2D, bloodtexture);
+                               bloodtexture.bind();
                                if(blend){
                                        blend=0;
                                        glAlphaFunc(GL_GREATER, 0.15);
@@ -1065,7 +1079,7 @@ void Terrain::drawdecals()
                                }
                        }
                        if((decaltype[i]==blooddecalfast)&&decaltype[i]!=lasttype){
-                               glBindTexture( GL_TEXTURE_2D, bloodtexture2);
+                               bloodtexture2.bind();
                                if(blend){
                                        blend=0;
                                        glAlphaFunc(GL_GREATER, 0.15);
@@ -1073,12 +1087,12 @@ void Terrain::drawdecals()
                                }
                        }
                        if(decaltype[i]==shadowdecal||decaltype[i]==shadowdecalpermanent){
-                               distancemult=(viewdistsquared-(findDistancefast(&viewer,&decalposition[i])-(viewdistsquared*fadestart))*(1/(1-fadestart)))/viewdistsquared;
+                               distancemult=(viewdistsquared-(distsq(&viewer,&decalposition[i])-(viewdistsquared*fadestart))*(1/(1-fadestart)))/viewdistsquared;
                                if(distancemult>=1)glColor4f(1,1,1,decalopacity[i]);
                                if(distancemult<1)glColor4f(1,1,1,decalopacity[i]*distancemult);
                        }
                        if(decaltype[i]==footprintdecal||decaltype[i]==bodyprintdecal){
-                               distancemult=(viewdistsquared-(findDistancefast(&viewer,&decalposition[i])-(viewdistsquared*fadestart))*(1/(1-fadestart)))/viewdistsquared;
+                               distancemult=(viewdistsquared-(distsq(&viewer,&decalposition[i])-(viewdistsquared*fadestart))*(1/(1-fadestart)))/viewdistsquared;
                                if(distancemult>=1){
                                        glColor4f(1,1,1,decalopacity[i]);
                                        if(decalalivetime[i]>3)glColor4f(1,1,1,decalopacity[i]*(5-decalalivetime[i])/2);
@@ -1089,7 +1103,7 @@ void Terrain::drawdecals()
                                }
                        }
                        if((decaltype[i]==blooddecal||decaltype[i]==blooddecalfast||decaltype[i]==blooddecalslow)){
-                               distancemult=(viewdistsquared-(findDistancefast(&viewer,&decalposition[i])-(viewdistsquared*fadestart))*(1/(1-fadestart)))/viewdistsquared;
+                               distancemult=(viewdistsquared-(distsq(&viewer,&decalposition[i])-(viewdistsquared*fadestart))*(1/(1-fadestart)))/viewdistsquared;
                                if(distancemult>=1){
                                        glColor4f(decalbrightness[i],decalbrightness[i],decalbrightness[i],decalopacity[i]);
                                        if(decalalivetime[i]<4)glColor4f(decalbrightness[i],decalbrightness[i],decalbrightness[i],decalopacity[i]*decalalivetime[i]*.25);
@@ -1150,10 +1164,10 @@ void Terrain::AddObject(XYZ where, float radius, int id)
                                        points[3].x=(size/subdivision)*i;
                                        points[3].z=(size/subdivision)*(j+1);
                                        points[3].y=heightmap[(int)points[3].x][(int)points[3].z];
-                                       points[0]*=scale*terraindetail;
-                                       points[1]*=scale*terraindetail;
-                                       points[2]*=scale*terraindetail;
-                                       points[3]*=scale*terraindetail;
+                                       points[0]*=scale;
+                                       points[1]*=scale;
+                                       points[2]*=scale;
+                                       points[3]*=scale;
                                        if(!done&&where.x+radius>points[0].x&&where.x-radius<points[2].x&&where.z+radius>points[0].z&&where.z-radius<points[2].z){
                                                patchobjects[i][j][patchobjectnum[i][j]]=id;
                                                patchobjectnum[i][j]++;
@@ -1183,8 +1197,8 @@ void Terrain::DeleteDecal(int which)
 }
 
 void Terrain::MakeDecal(int type, XYZ where, float size, float opacity, float rotation){
-       if(decals){
-               if(opacity>0&&size>0){
+       if(decals) {
+               if(opacity>0&&size>0) {
                        static int patchx[4];
                        static int patchy[4];
 
@@ -1234,11 +1248,9 @@ void Terrain::MakeDecalLock(int type, XYZ where,int whichx, int whichy, float si
                decalbrightness[numdecals]=(rot.x+rot.y+rot.z)/3;
                if(decalbrightness[numdecals]<.4)decalbrightness[numdecals]=.4;
 
-               //if(type==blooddecal||type==blooddecalfast||type==blooddecalslow){
                if(environment==grassyenvironment){
                        decalbrightness[numdecals]*=.6;
                }
-               //}
 
                if(decalbrightness[numdecals]>1)decalbrightness[numdecals]=1;
                decalbright=decalbrightness[numdecals];
@@ -1446,12 +1458,12 @@ void Terrain::DoShadows()
                                        if(objects.type[l]!=treetrunktype){
                                                testpoint=terrainpoint;
                                                testpoint2=terrainpoint+lightloc*50*(1-shadowed);
-                                               if(objects.model[l].LineCheck(&testpoint,&testpoint2,&col,&objects.position[l],&objects.rotation[l])!=-1){
+                                               if(objects.model[l].LineCheck(&testpoint,&testpoint2,&col,&objects.position[l],&objects.yaw[l])!=-1){
                                                        shadowed=1-(findDistance(&terrainpoint,&col)/50);       
                                                }
                                        }
                                }
-                               if(visibleloading)pgame->LoadingScreen();
+                               if(visibleloading) Game::LoadingScreen();
                        }
                        brightness=dotproduct(&lightloc,&normals[i][j]);
                        if(shadowed)brightness*=1-shadowed;
@@ -1472,7 +1484,7 @@ void Terrain::DoShadows()
                }
        }
 
-       if(visibleloading)pgame->LoadingScreen();
+       if(visibleloading) Game::LoadingScreen();
 
        //Smooth shadows
        for(i=0;i<size;i++){
@@ -1504,13 +1516,6 @@ void Terrain::DoShadows()
 
 Terrain::Terrain()
 {
-       bloodtexture = 0;
-       bloodtexture2 = 0;
-       shadowtexture = 0;
-       footprinttexture = 0;
-       bodyprinttexture = 0;
-       breaktexture = 0;
-       terraintexture = 0;
        size = 0;
 
        memset(patchobjectnum, 0, sizeof(patchobjectnum));
@@ -1551,12 +1556,12 @@ Terrain::Terrain()
 }
 Terrain::~Terrain()
 {
-       if(terraintexture)glDeleteTextures( 1, &terraintexture );
-       if(shadowtexture) glDeleteTextures( 1, &shadowtexture );
-       if(bodyprinttexture) glDeleteTextures( 1, &bodyprinttexture );
-       if(footprinttexture) glDeleteTextures( 1, &footprinttexture );
-       if(bloodtexture) glDeleteTextures( 1, &bloodtexture );
-       if(bloodtexture2) glDeleteTextures( 1, &bloodtexture2 );
-       if(breaktexture) glDeleteTextures( 1, &breaktexture );
+       terraintexture.destroy();
+       shadowtexture.destroy();
+       bodyprinttexture.destroy();
+       footprinttexture.destroy();
+       bloodtexture.destroy();
+       bloodtexture2.destroy();
+       breaktexture.destroy();
 }