scene.cpp

来自「3D游戏展示程序」· C++ 代码 · 共 388 行

CPP
388
字号
//--------------------------------------------------
//  Desc: Static Scene
//  Author: artsylee/2007.6.9
//--------------------------------------------------

#include "Scene.h"
#include "Common.h"
#include "Heightmap.h"
#include "GameCommon.h"

extern CHeightmap g_Hmap;
extern D3DXVECTOR3 g_CameraPos;

CScene::CScene()
{
	m_LastUpdate = 0;
}

CScene::~CScene()
{
}

void CScene::LoadScene()
{
	Load(m_Tree, 0, 10, OT_TREE_1);
	Load(m_Tree, 10, 10, OT_TREE_2);
	Load(m_Tree, 20, 10, OT_TREE_3);
	Load(m_Rock, 0, 5, OT_ROCK_1);
	Load(m_Rock, 5, 5, OT_ROCK_2);
	Load(m_Bush, 0, 40, OT_BUSH_1);
	Load(m_Bush, 40, 40, OT_BUSH_2);
	Load(m_Bush, 80, 40, OT_BUSH_3);
	Load(m_Bush, 120, 40, OT_BUSH_4);
	Load(m_Bush, 160, 40, OT_BUSH_5);
	Load(m_House, 0, 3, OT_HOUSE);
}

void CScene::SaveScene()
{
	Save(m_Tree, 0, 10, OT_TREE_1);
	Save(m_Tree, 10, 10, OT_TREE_2);
	Save(m_Tree, 20, 10, OT_TREE_3);
	Save(m_Rock, 0, 5, OT_ROCK_1);
	Save(m_Rock, 5, 5, OT_ROCK_2);
	Save(m_Bush, 0, 40, OT_BUSH_1);
	Save(m_Bush, 40, 40, OT_BUSH_2);
	Save(m_Bush, 80, 40, OT_BUSH_3);
	Save(m_Bush, 120, 40, OT_BUSH_4);
	Save(m_Bush, 160, 40, OT_BUSH_5);
	Save(m_House, 0, 3, OT_HOUSE);
}

void CScene::Load(CMS3DModel *pModel, int offset, int num, OBJECT_TYPE etype)
{
	CIniFile scene("Config\\Scene.ini");
	for(int i=0; i<num; i++)
	{
		char szName[32];
		sprintf(szName, "Noname");
		if(etype == OT_TREE_1)
		{
			sprintf(szName, "Tree_1_%d", i);
			pModel[i+offset].Load("Model\\Scene\\Tree_1.ms3d");
		}
		if(etype == OT_TREE_2)
		{
			sprintf(szName, "Tree_2_%d", i);
			pModel[i+offset].Load("Model\\Scene\\Tree_2.ms3d");
		}
		if(etype == OT_TREE_3)
		{
			sprintf(szName, "Tree_3_%d", i);
			pModel[i+offset].Load("Model\\Scene\\Tree_3.ms3d");
		}
		if(etype == OT_ROCK_1)
		{
			sprintf(szName, "Rock_1_%d", i);
			pModel[i+offset].Load("Model\\Scene\\Rock_1.ms3d");
		}
		if(etype == OT_ROCK_2)
		{
			sprintf(szName, "Rock_2_%d", i);
			pModel[i+offset].Load("Model\\Scene\\Rock_2.ms3d");
		}
		if(etype == OT_BUSH_1)
		{
			sprintf(szName, "Bush_1_%d", i);
			pModel[i+offset].Load("Model\\Scene\\Bush_1.ms3d");
		}
		if(etype == OT_BUSH_2)
		{
			sprintf(szName, "Bush_2_%d", i);
			pModel[i+offset].Load("Model\\Scene\\Bush_2.ms3d");
		}
		if(etype == OT_BUSH_3)
		{
			sprintf(szName, "Bush_3_%d", i);
			pModel[i+offset].Load("Model\\Scene\\Bush_3.ms3d");
		}
		if(etype == OT_BUSH_4)
		{
			sprintf(szName, "Bush_4_%d", i);
			pModel[i+offset].Load("Model\\Scene\\Bush_4.ms3d");
		}
		if(etype == OT_BUSH_5)
		{
			sprintf(szName, "Bush_5_%d", i);
			pModel[i+offset].Load("Model\\Scene\\Bush_5.ms3d");
		}
		if(etype == OT_HOUSE)
		{
			sprintf(szName, "House_%d", i);
			pModel[i+offset].Load("Model\\Scene\\House.ms3d");
		}
		CoolListBox *pBox = (CoolListBox*)GetGUI(EDIT_LIST);
		if(pBox)
		{
			pBox->AddItem(szName, NULL);
		}

		pModel[i+offset].SetName(szName);
		float rot = RandomFloat(0.0f, (float)M_PI*2.0f);
		float rotateX = scene.ReadFloat(szName, "RotateX", 0.0f);
		float rotateY = scene.ReadFloat(szName, "RotateY", rot);
		float rotateZ = scene.ReadFloat(szName, "RotateZ", 0.0f);
		pModel[i+offset].SetRotate(D3DXVECTOR3(rotateX, rotateY, rotateZ));
		float scale = RandomFloat(1.5f, 2.5f);
		float scaleX = scene.ReadFloat(szName, "ScaleX", scale);
		float scaleY = scene.ReadFloat(szName, "ScaleY", scale);
		float scaleZ = scene.ReadFloat(szName, "ScaleZ", scale);
		pModel[i+offset].SetScale(D3DXVECTOR3(1.0f*scaleX, 1.0f*scaleY, 1.0f*scaleZ));
		float posX = scene.ReadFloat(szName, "PosX", 1402+RandomFloat(-100.0f, 100.0f));
		float posY = scene.ReadFloat(szName, "PosY", 61);
		float posZ = scene.ReadFloat(szName, "PosZ", 3670+RandomFloat(-100.0f, 100.0f));
		pModel[i+offset].SetPosition(D3DXVECTOR3(posX, posY, posZ));
	}
}

void CScene::Save(CMS3DModel *pModel, int offset, int num, OBJECT_TYPE etype)
{
	for(int i=0; i<num; i++)
	{
		CIniFile scene;
		scene.Open("Config\\Scene.ini");
		char szName[32];
		if(etype == OT_TREE_1)
		{
			sprintf(szName, "Tree_1_%d", i);
		}
		if(etype == OT_TREE_2)
		{
			sprintf(szName, "Tree_2_%d", i);
		}
		if(etype == OT_TREE_3)
		{
			sprintf(szName, "Tree_3_%d", i);
		}
		if(etype == OT_ROCK_1)
		{
			sprintf(szName, "Rock_1_%d", i);
		}
		if(etype == OT_ROCK_2)
		{
			sprintf(szName, "Rock_2_%d", i);
		}
		if(etype == OT_BUSH_1)
		{
			sprintf(szName, "Bush_1_%d", i);
		}
		if(etype == OT_BUSH_2)
		{
			sprintf(szName, "Bush_2_%d", i);
		}
		if(etype == OT_BUSH_3)
		{
			sprintf(szName, "Bush_3_%d", i);
		}
		if(etype == OT_BUSH_4)
		{
			sprintf(szName, "Bush_4_%d", i);
		}
		if(etype == OT_BUSH_5)
		{
			sprintf(szName, "Bush_5_%d", i);
		}
		if(etype == OT_HOUSE)
		{
			sprintf(szName, "House_%d", i);
		}
		D3DXVECTOR3 pos;
		pModel[i+offset].GetPosition(&pos);
		scene.WriteFloat(szName, "PosX", pos.x);
		scene.WriteFloat(szName, "PosY", pos.y);
		scene.WriteFloat(szName, "PosZ", pos.z);
		pModel[i+offset].GetScale(&pos);
		scene.WriteFloat(szName, "ScaleX", pos.x);
		scene.WriteFloat(szName, "ScaleY", pos.y);
		scene.WriteFloat(szName, "ScaleZ", pos.z);
		pModel[i+offset].GetRotate(&pos);
		scene.WriteFloat(szName, "RotateX", pos.x);
		scene.WriteFloat(szName, "RotateY", pos.y);
		scene.WriteFloat(szName, "RotateZ", pos.z);
		scene.Save(NULL);
	}
}

void CScene::Update()
{
	D3DXVECTOR3 objectPos;
	float x;
//	float y;
	float z;

	if(g_GlobalTime-m_LastUpdate>=100)
	{
		// Trees
		for(int i=0; i<MAX_TREE; i++)
		{
			objectPos = m_Tree[i].GetDerivedPos();
			x = g_CameraPos.x-objectPos.x;
			//	y = g_CameraPos.y-objectPos.y;
			z = g_CameraPos.z-objectPos.z;
			if(abs(x)>500)
			{
				m_Tree[i].SetVisual(false);
				continue;
			}
			if(abs(z)>500)
			{
				m_Tree[i].SetVisual(false);
				continue;
			}
			if(x*x + z*z<250000.0f)
			{
				if(g_Hmap.IsInFrustum(objectPos.x, objectPos.z))
				{
					m_Tree[i].SetVisual(true);
					continue;
				}
				else
					m_Tree[i].SetVisual(false);
			}
			m_Tree[i].SetVisual(false);
		}
		// Rocks
		for(int i=0; i<MAX_ROCK; i++)
		{
			objectPos = m_Rock[i].GetDerivedPos();
			x = g_CameraPos.x-objectPos.x;
			//	y = g_CameraPos.y-objectPos.y;
			z = g_CameraPos.z-objectPos.z;
			if(abs(x)>500)
			{
				m_Rock[i].SetVisual(false);
				continue;
			}
			if(abs(z)>500)
			{
				m_Rock[i].SetVisual(false);
				continue;
			}
			if(x*x + z*z<250000.0f)
			{
				if(g_Hmap.IsInFrustum(objectPos.x, objectPos.z))
				{
					m_Rock[i].SetVisual(true);
					continue;
				}
				else
					m_Rock[i].SetVisual(false);
			}
			m_Rock[i].SetVisual(false);
		}
		// Bushes
		for(int i=0; i<MAX_BUSH; i++)
		{
			objectPos = m_Bush[i].GetDerivedPos();
			x = g_CameraPos.x-objectPos.x;
			z = g_CameraPos.z-objectPos.z;
			if(abs(x)>500)
			{
				m_Bush[i].SetVisual(false);
				continue;
			}
			if(abs(z)>500)
			{
				m_Bush[i].SetVisual(false);
				continue;
			}
			if(x*x + z*z<250000.0f)
			{
				if(g_Hmap.IsInFrustum(objectPos.x, objectPos.z))
				{
					m_Bush[i].SetVisual(true);
					continue;
				}
				else
					m_Bush[i].SetVisual(false);
			}
			m_Bush[i].SetVisual(false);
		}
		// House
		for(int i=0; i<MAX_HOUSE; i++)
		{
			objectPos = m_House[i].GetDerivedPos();
			x = g_CameraPos.x-objectPos.x;
			z = g_CameraPos.z-objectPos.z;
			if(abs(x)>500)
			{
				m_House[i].SetVisual(false);
				continue;
			}
			if(abs(z)>500)
			{
				m_House[i].SetVisual(false);
				continue;
			}
			if(x*x + z*z<250000.0f)
			{
				if(g_Hmap.IsInFrustum(objectPos.x, objectPos.z))
				{
					m_House[i].SetVisual(true);
					continue;
				}
				else
					m_House[i].SetVisual(false);
			}
			m_House[i].SetVisual(false);
		}
		m_LastUpdate = g_GlobalTime;
	}
	
	for(int i=0; i<MAX_TREE; i++)
	{
		m_Tree[i].Update();
	}
	for(int i=0; i<MAX_ROCK; i++)
	{
		m_Rock[i].Update();
	}
	for(int i=0; i<MAX_BUSH; i++)
	{
		m_Bush[i].Update();
	}
	for(int i=0; i<MAX_HOUSE; i++)
	{
		m_House[i].Update();
	}
}

void CScene::Render()
{
	g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
	g_pD3DDevice->SetRenderState(D3DRS_FOGENABLE, TRUE);
	g_pD3DDevice->LightEnable(0, TRUE);
	g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
	g_pD3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
	g_pD3DDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
	g_pD3DDevice->SetRenderState(D3DRS_ALPHAREF, 0x7F);
	for(int i=0; i<MAX_TREE; i++)
	{
		m_Tree[i].Render();
	}
	// Bushes
	for(int i=0; i<MAX_BUSH; i++)
	{
		m_Bush[i].Render();
	}
	g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
	g_pD3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
	// Rocks
	for(int i=0; i<MAX_ROCK; i++)
	{
		m_Rock[i].Render();
	}
	g_pD3DDevice->LightEnable(0, FALSE);
	g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);

	// House
	// 设置碰撞后使用CCW
	g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
	for(int i=0; i<MAX_HOUSE; i++)
	{
		m_House[i].Render();
	}
	g_pD3DDevice->SetRenderState(D3DRS_FOGENABLE, FALSE);
	g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?