📄 initsence.cpp
字号:
/**********************************************************
模块名称:
InitSence.cpp
目的:
这里的函数提供了场景的初始化;
作者:
潘李亮 2003 - 4
**********************************************************/
#include "configure.h"
#include "initsence.h"
#include "viewfrustum.h"
#include "camera.h"
#include "viewercamera.h"
#include "Texturemgr.h"
#include "BillBoardmgr.h"
#include "LOD.h"
#include "Data.h"
#include "map.h"
#include "Terrain.h"
#include "image.h"
#include "Console.h"
#include "Texturemgr.h"
#include <gl\glext.h>
CConfigure MapCfg;
void TerminateApp()
{
Console.Printf("程序将在 2 秒钟后自动关闭");
Console.Printf("请检查Log文件");
Console.SaveToLogFile();
Sleep(2000);
exit(0);
}
void InitFog()
{
GLfloat color[]={Configure.GetFloat("Fog","r"),
Configure.GetFloat("Fog","g"),
Configure.GetFloat("Fog","b"),
Configure.GetFloat("Fog","a")};
glFogi(GL_FOG_MODE,GL_EXP2);
glFogfv(GL_FOG_COLOR,color);
glFogf(GL_FOG_DENSITY,Configure.GetFloat("Fog","density"));
glHint(GL_FOG_HINT,GL_NICEST);
glFogf(GL_FOG_START,Configure.GetFloat("Fog","near"));
glFogf(GL_FOG_END,Configure.GetFloat("Fog","far"));
if(g_isFog)
glEnable(GL_FOG);
}
BOOL InitSky()
{
GLuint leftTex;
GLuint rightTex;
GLuint topTex;
GLuint frontTex;
GLuint backTex;
GLuint bottomTex;
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
//Load front Texture;
frontTex = g_tex_mgr.LoadTexture(MapCfg.GetString("SkyBox","front"));
if(frontTex == -1)
{
Console.Printf("纹理文件加载错误: %s",MapCfg.GetString("SkyBox","front"));
goto exit_error;
}
//Load back texture;
backTex = g_tex_mgr.LoadTexture(MapCfg.GetString("SkyBox","back"));
if(backTex == -1)
{
Console.Printf("纹理文件加载错误: %s",MapCfg.GetString("SkyBox","back"));
goto exit_error;
}
//Load top texture;
topTex = g_tex_mgr.LoadTexture(MapCfg.GetString("SkyBox","top"));
if(topTex == -1)
{
Console.Printf("纹理文件加载错误: %s",MapCfg.GetString("SkyBox","top"));
goto exit_error;
}
//Load left texture;
leftTex = g_tex_mgr.LoadTexture(MapCfg.GetString("SkyBox","left"));
if(leftTex == -1)
{
Console.Printf("纹理文件加载错误: %s",MapCfg.GetString("SkyBox","left"));
goto exit_error;
}
//Load right texture;
rightTex = g_tex_mgr.LoadTexture(MapCfg.GetString("SkyBox","right"));
if(rightTex == -1)
{
Console.Printf("纹理文件加载错误: %s",MapCfg.GetString("SkyBox","right"));
goto exit_error;
}
//Load bottom texture;
bottomTex = g_tex_mgr.LoadTexture(MapCfg.GetString("SkyBox","bottom"));
if(bottomTex == -1)
{
Console.Printf("纹理文件加载错误: %s",MapCfg.GetString("SkyBox","bottom"));
goto exit_error;
}
g_sky.InitSkyBox(terrain.GetX() ,terrain.GetY() ,g_sb_h,frontTex,backTex,leftTex,rightTex,topTex,bottomTex);
g_sky.Adjust(MapCfg.GetInteger("SkyBox","start_x"),
MapCfg.GetInteger("SkyBox","start_y"),
MapCfg.GetInteger("SkyBox","start_h"));
g_sky.SetCamera(g_pcm);
return TRUE;
exit_error:
Console.Printf("加载天空体纹理失败!");
::TerminateApp();
return FALSE;
}
BOOL InitTerrain()
{
GLuint terrTex[16];
Console.Printf("地图文件:%s",MapCfg.GetString("Map","mapfile"));
Console.Printf("开始加载地图...Please Waiting ~_*");
int rt = terrain.LoadMap(MapCfg.GetString("Map","mapfile") ,1.0,g_streth,0.);
if(TE_OK != rt)
{
Console.Printf("地图加载失败: %s",MapCfg.GetString("Map","mapfile"));
if(TE_INVALIDATE_SIZE == rt)
{
Console.Printf("地图尺寸不符合要求");
}
if(TE_FILE_ERROR == rt)
{
Console.Printf("地图文件错误");
}
TerminateApp();
return FALSE;
}
Console.Printf("地图加载完毕,地图尺寸: %d X %d ",terrain.GetX(),terrain.GetY());
float lx = MapCfg.GetFloat("LensFlar","pos_x");
float ly = MapCfg.GetFloat("LensFlar","pos_y");
float lz = MapCfg.GetFloat("LensFlar","pos_h");
Console.Printf("地图纹理文件:%s",MapCfg.GetString("Map","maintex"));
Console.Printf("开始加载地图纹理...Please waiting *_^");
//加载纹理数据,计算地图的亮度图,并且把他们混合在一起
if(MapCfg.GetBool("Map","lighttex") == false)
{
Console.Printf("计算亮度图,混合纹理...Please waiting *_^");
terrTex[0] = terrain.BuilMainTexture(MapCfg.GetString("Map","maintex"),lx,ly,lz,g_streth);
if( terrTex[0] == -1)
{
Console.Printf("地图纹理加载失败: %s",MapCfg.GetString("Map","maintex"));
TerminateApp();
}
g_tex_mgr.AddTexture(terrTex[0]);
}
else
{
terrTex[0] = g_tex_mgr.LoadTexture(MapCfg.GetString("Map","maintex"));
}
terrTex[1] = g_tex_mgr.LoadTexture(MapCfg.GetString("Map","detail1"));
if(terrTex[1] == -1)
{
Console.Printf("地图纹理加载失败: %s",MapCfg.GetString("Map","detail1"));
TerminateApp();
}
terrTex[2] = g_tex_mgr.LoadTexture(MapCfg.GetString("Map","detail2"));
if(terrTex[2] == -1)
{
Console.Printf("地图纹理加载失败: %s",MapCfg.GetString("Map","detail2"));
TerminateApp();
}
terrTex[3] = g_tex_mgr.LoadTexture(MapCfg.GetString("Map","detail3"));
if(terrTex[3] == -1)
{
Console.Printf("地图纹理加载失败: %s",MapCfg.GetString("Map","detail3"));
TerminateApp();
}
terrTex[4] = g_tex_mgr.LoadTexture(MapCfg.GetString("Map","detail4"));
if(terrTex[4] == -1)
{
Console.Printf("地图纹理加载失败: %s",MapCfg.GetString("Map","detail4"));
TerminateApp();
}
terrain.SetTexture(terrTex,5);
Console.Printf("地图纹理加载完毕");
Console.Printf("正在平滑地图数据( %d次)!...Please waiting *_^",MapCfg.GetInteger("Map","smoothpass"));
terrain.Smooth(MapCfg.GetInteger("Map","smoothpass"));
Console.Printf("创建LOD控制器.....");
pLOD = terrain.CreateLODCntrl();
Console.Printf("正在计算地形 Varaint数据...Please waiting *_^");
pLOD->BuildVarMap();
Console.Printf("地形Varaint 数据计算完毕");
Console.Printf("Space---Error: %g",g_space_error);
pLOD->SetObjectError(g_object_error);
Console.Printf("Object---Error: %g",g_object_error);
pLOD->SetSpaceError(g_space_error);
Console.Printf("给地形LOD控制器分配裁剪器");
pLOD->SetCuller(&Culler);
float texd =MapCfg.GetFloat("Map","texdetail");
Console.Printf("地图细节纹理的细节值: %f",texd);
pLOD->SetTexDetail(texd);
Console.Printf("多遍纹理映射功能 Enabled!");
pLOD->EnableDetailTex(g_is_detail_tex);
pLOD->ChangeDetailTex(1);
Console.Printf("视距 :%f",g_view_dist);
Culler.SetViewerDist(g_view_dist);
Console.Printf("LOD 控制器参数设置完毕");
return TRUE;
}
void InitCamera()
{
int x = terrain.GetX()/2;//rand()%terrain.GetX();
int y = terrain.GetX()/2;//rand()%terrain.GetY();
float ch=terrain.GetHeight(x,y);
g_pcm = new CViewerCamera;
g_pcm->SetCameraPos(x, y , ch + g_eye_h);
g_pcm->SetUpDir(0,0,1);
g_pcm->SetTarget( x, y+10 , ch + g_eye_h);
g_pcm->SetViewerDir(0 , 1 , 0);
g_pcm->SetViewerUpDir( 0 , 0 , 1);
g_pcm->SetViewDist(g_view_dist);
g_pcm->SetViewerAngle(g_GL.m_eye_angle);
g_pcm->SetZoomAngle (g_GL.m_eye_angle/5);
g_pcm->Zoomed(false);
Culler.SetTerrain(&terrain);
}
void InitBillBoard()
{
int ci;
for(int loop = 0;;loop++)
{
GLubyte color[4] = {255,255,255,0};
char buf[15];
sprintf(buf,"tree%d",loop+1);
char* filename = MapCfg.GetString("BillBoard",buf);
if(filename == NULL)
break;
DIBTEXDATA dib = LoadTexData(filename);
if(dib.pdata == NULL)
break ;
GetTexPixel(0,0,color,dib);
FreeDibTexData(dib);
GLuint treeTex = BuildTransparencyTexture(filename,color,0,4);
if(treeTex == -1)
{
Console.Printf("树木纹理加载失败: %s", filename);
TerminateApp();
}
else
{
g_tex_mgr.AddTexture(treeTex);
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);
ci = g_bbm.CreateContainer(treeTex);
}
}
/*
GLubyte color2[4] = {255,0,255,0};
treeTex = BuildTransparencyTexture(MapCfg.GetString("BillBoard","tree2"),color2,0,120);
if(treeTex == -1)
{
Console.Printf("树木纹理加载失败: %s", MapCfg.GetString("BillBoard","tree2"));
TerminateApp();
}
else
{
g_tex_mgr.AddTexture(treeTex);
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);
ci = g_bbm.CreateContainer(treeTex);
}
*/
int typecount = g_bbm.GetTypeCount();
if(typecount ==0)
return;
CAMERA_INFO* cinfo= g_pcm->GetCameraInfo();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -