⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 initsence.cpp

📁 涉及windows游戏编程中的一些源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/**********************************************************
   模块名称:
       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 + -