X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FTerrain.cpp;h=d9c73b056b320ff90bfcc49f8cadd158cbbc74f3;hb=8afdcba610cded0e54b85069ba051268b29669a6;hp=a102e523f4c86cfaa235e873dff77e2ad26e521d;hpb=85c66654b25752485c9a4b4c534263df78e0ff78;p=lugaru.git diff --git a/Source/Terrain.cpp b/Source/Terrain.cpp index a102e52..d9c73b0 100644 --- a/Source/Terrain.cpp +++ b/Source/Terrain.cpp @@ -1,6 +1,27 @@ +/* +Copyright (C) 2003, 2010 - Wolfire Games + +This file is part of Lugaru. + +Lugaru is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "Game.h" #include "Terrain.h" #include "Objects.h" -#include "Game.h" extern XYZ viewer; extern float viewdistance; extern float lightambient[3],lightbrightness[3]; @@ -10,7 +31,7 @@ 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; @@ -350,17 +371,20 @@ void Terrain::UpdateVertexArray(int whichx, int whichy){ } -bool Terrain::load(char *fileName) +bool Terrain::load(const char *fileName) { static long i,j; static long x,y; 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); @@ -404,7 +428,7 @@ bool Terrain::load(char *fileName) for(i=0;isubdivision)endz=subdivision; - if(!layer) + if(!layer) { for(i=beginx;iviewdistsquared*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;iviewdistsquared*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; @@ -1129,10 +1166,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-radiuspoints[0].z&&where.z-radius0&&size>0){ + if(decals) { + if(opacity>0&&size>0) { static int patchx[4]; static int patchy[4]; @@ -1213,11 +1250,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]; @@ -1495,7 +1530,7 @@ Terrain::Terrain() memset(patchobjectnum, 0, sizeof(patchobjectnum)); memset(patchobjects, 0, sizeof(patchobjects)); - scale = 0; + scale = 1.0f; type = 0; memset(heightmap, 0, sizeof(heightmap)); memset(normals, 0, sizeof(normals));