|  | 
 
| 使用简单脚本配置下的天空盒和地形测试 当然是使用盖莫游戏引擎乐
 
 代码如下:
 
 #include <GEngine/Gaimo.hpp>
 #include <iostream>
 using namespace std;
 
 int main(int argc, char **argv)
 {
 //! 初始化引擎设备并得到设备指针
 core:
  evice* device = core::InitDevice("盖莫引擎室外场景测试1"); //! 得到引擎场景指针
 core::RefPtr<core::SceneManager> scenemanager = device->GetSceneManager();
 //! 得到引擎资源指针
 core::ResourceManager* resourcemanager = device->GetResourceManager();
 
 //! 获取lua指针
 LuaPlus:
  uaStateOwner *lua = device->GetLuaStateOwner(); //! 载入lua脚本
 (*lua)->DoFile("..\\script//skybox.lua");
 //! 获取天空盒表对象
 LuaPlus::LuaObject skyboxtable = (*lua)->GetGlobal("skybox");
 
 //! 得到天空盒图形和其纹理
 core::RefPtr<core::Image>   skyimage0 = resourcemanager->GetImage("sky1",skyboxtable["front"].GetString());
 core::RefPtr<core::Image>   skyimage1 = resourcemanager->GetImage("sky2",skyboxtable["back"].GetString());
 core::RefPtr<core::Image>   skyimage2 = resourcemanager->GetImage("sky3",skyboxtable["left"].GetString());
 core::RefPtr<core::Image>   skyimage3 = resourcemanager->GetImage("sky4",skyboxtable["right"].GetString());
 core::RefPtr<core::Image>   skyimage4 = resourcemanager->GetImage("sky5",skyboxtable["top"].GetString());
 core::RefPtr<core::Texture> sky0 = resourcemanager->GetTexture("front",skyimage0);
 core::RefPtr<core::Texture> sky1 = resourcemanager->GetTexture("back",skyimage1);
 core::RefPtr<core::Texture> sky2 = resourcemanager->GetTexture("left",skyimage2);
 core::RefPtr<core::Texture> sky3 = resourcemanager->GetTexture("right",skyimage3);
 core::RefPtr<core::Texture> sky4 = resourcemanager->GetTexture("top",skyimage4);
 
 //! 得到天空盒指针
 core::RefPtr<core::Renderable> skybox = scenemanager->GetSkyBox(sky0,sky1,sky2,sky3,sky4,
 skyboxtable["width"].GetFloat(),
 skyboxtable["length"].GetFloat(),
 skyboxtable["heigth"].GetFloat()
 ,skyboxtable["rotstep"].GetFloat());
 //! 载入lua脚本
 (*lua)->DoFile("..\\script//terrain.lua");
 //! 获取地形表对象
 LuaPlus::LuaObject terraintable = (*lua)->GetGlobal("terrain");
 
 //! 得到地形图形和其纹理
 core::RefPtr<core::Image>   terrainimage0 = resourcemanager->GetImage("terrain0",terraintable["image1"].GetString());
 core::RefPtr<core::Image>   terrainimage1 = resourcemanager->GetImage("terrain1",terraintable["image2"].GetString());
 core::RefPtr<core::Texture> terraintexture0 = resourcemanager->GetTexture("terraim0",terrainimage0);
 core::RefPtr<core::Texture> terraintexture1 = resourcemanager->GetTexture("terraim1",terrainimage1);
 
 //! 创建地形描述符
 core::TerrainDesc desc;
 desc.main_texture = terraintexture0;
 desc.detail_texture = terraintexture1;
 desc.use_detail = terraintable["usedetail"].GetInteger();
 
 //! 获取地形指针
 core::RefPtr<core::Terrain> terrain = scenemanager->GetTerrain(desc);
 terrain->LoadHeigthMap(terraintable["rawfile"].GetString(),terraintable["mapsize"].GetInteger(),terraintable["cell"].GetInteger());
 
 //! 获取全局摄像机
 core::RefPtr<core::Camera> camera = scenemanager->GetGlobalCamera(Vector3f(250,terrain->GetHeight(250,215)+10,215),
 Vector3f(251,terrain->GetHeight(251,216)+10,216),
 Vector3f(0,1,0));
 camera->SetViewport(0,0,640,480);
 camera->SetPerspective(50.0f,640.0f/480.0f,0.1f,1000.0f);
 glClearDepth(1.0f);
 glDepthFunc(GL_LEQUAL);
 glEnable(GL_DEPTH_TEST);
 glEnable(GL_CULL_FACE);
 glShadeModel(GL_SMOOTH);
 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
 BEGIN_LOOP(device)
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 glLoadIdentity();
 camera->SetPerspective(45.0f,640.0f/480.0f,0.1f,1000.0f);
 camera->Render();
 skybox->Render();
 terrain->Render();
 END_LOOP(device)
 
 device->Close();
 device->Drop();
 
 return 0;
 }
 
 2个lua配置文件
 1.
 -- 这是盖莫引擎中使用lua脚本配置天空盒的脚本
 
 -- 定义天空盒数据
 skybox =
 {
 front  = "..\\image//sky//front.jpg";
 back   = "..\\image//sky//back.jpg";
 left   = "..\\image//sky//left.jpg";
 right  = "..\\image//sky//right.jpg";
 top    = "..\\image//sky//top.jpg";
 width  = 600;
 length = 600;
 heigth = 600;
 rotstep= 0.003;
 }
 2.
 -- 这是盖莫引擎中使用lua脚本配置地形的脚本
 
 -- 定义地形数据
 terrain =
 {
 rawfile   = "..\\terrain//terrain.raw";
 image1    = "..\\terrain//terrain.bmp";
 image2    = "..\\terrain//detail.bmp";
 usedetail = 1;
 mapsize   = 1024;
 cell      = 16
 }
 这里使用了简单的lua表数据结构
 
 这是加上雾后的代码
 #include <GEngine/Gaimo.hpp>
 #include <iostream>
 using namespace std;
 
 int main(int argc, char **argv)
 {
 //! 初始化引擎设备并得到设备指针
 core::Device* device = core::InitDevice("盖莫引擎室外场景测试1");
 //! 得到引擎场景指针
 core::RefPtr<core::SceneManager> scenemanager = device->GetSceneManager();
 //! 得到引擎资源指针
 core::ResourceManager* resourcemanager = device->GetResourceManager();
 
 //! 获取lua指针
 LuaPlus::LuaStateOwner *lua = device->GetLuaStateOwner();
 //! 载入lua脚本
 (*lua)->DoFile("..\\script//skybox.lua");
 //! 获取天空盒表对象
 LuaPlus::LuaObject skyboxtable = (*lua)->GetGlobal("skybox");
 
 //! 得到天空盒图形和其纹理
 core::RefPtr<core::Image>   skyimage0 = resourcemanager->GetImage("sky1",skyboxtable["front"].GetString());
 core::RefPtr<core::Image>   skyimage1 = resourcemanager->GetImage("sky2",skyboxtable["back"].GetString());
 core::RefPtr<core::Image>   skyimage2 = resourcemanager->GetImage("sky3",skyboxtable["left"].GetString());
 core::RefPtr<core::Image>   skyimage3 = resourcemanager->GetImage("sky4",skyboxtable["right"].GetString());
 core::RefPtr<core::Image>   skyimage4 = resourcemanager->GetImage("sky5",skyboxtable["top"].GetString());
 core::RefPtr<core::Texture> sky0 = resourcemanager->GetTexture("front",skyimage0);
 core::RefPtr<core::Texture> sky1 = resourcemanager->GetTexture("back",skyimage1);
 core::RefPtr<core::Texture> sky2 = resourcemanager->GetTexture("left",skyimage2);
 core::RefPtr<core::Texture> sky3 = resourcemanager->GetTexture("right",skyimage3);
 core::RefPtr<core::Texture> sky4 = resourcemanager->GetTexture("top",skyimage4);
 
 //! 得到天空盒指针
 core::RefPtr<core::Renderable> skybox = scenemanager->GetSkyBox(sky0,sky1,sky2,sky3,sky4,
 skyboxtable["width"].GetFloat(),
 skyboxtable["length"].GetFloat(),
 skyboxtable["heigth"].GetFloat()
 ,skyboxtable["rotstep"].GetFloat());
 //! 载入lua脚本
 (*lua)->DoFile("..\\script//terrain.lua");
 //! 获取地形表对象
 LuaPlus::LuaObject terraintable = (*lua)->GetGlobal("terrain");
 
 //! 得到地形图形和其纹理
 core::RefPtr<core::Image>   terrainimage0 = resourcemanager->GetImage("terrain0",terraintable["image1"].GetString());
 core::RefPtr<core::Image>   terrainimage1 = resourcemanager->GetImage("terrain1",terraintable["image2"].GetString());
 core::RefPtr<core::Texture> terraintexture0 = resourcemanager->GetTexture("terraim0",terrainimage0);
 core::RefPtr<core::Texture> terraintexture1 = resourcemanager->GetTexture("terraim1",terrainimage1);
 
 //! 创建地形描述符
 core::TerrainDesc desc;
 desc.main_texture = terraintexture0;
 desc.detail_texture = terraintexture1;
 desc.use_detail = terraintable["usedetail"].GetInteger();
 
 //! 获取地形指针
 core::RefPtr<core::Terrain> terrain = scenemanager->GetTerrain(desc);
 terrain->LoadHeigthMap(terraintable["rawfile"].GetString(),terraintable["mapsize"].GetInteger(),terraintable["cell"].GetInteger());
 
 //! 获取全局摄像机
 core::RefPtr<core::Camera> camera = scenemanager->GetGlobalCamera(Vector3f(250,terrain->GetHeight(250,215)+10,215),
 Vector3f(251,terrain->GetHeight(251,216)+10,216),
 Vector3f(0,1,0));
 camera->SetViewport(0,0,640,480);
 camera->SetPerspective(50.0f,640.0f/480.0f,0.1f,1000.0f);
 glClearDepth(1.0f);
 glDepthFunc(GL_LEQUAL);
 glEnable(GL_DEPTH_TEST);
 glEnable(GL_CULL_FACE);
 glShadeModel(GL_SMOOTH);
 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
 
 //! 获取雾指针
 core::RefPtr<core::Fog> fog = scenemanager->GetFog();
 //! 载入lua脚本
 (*lua)->DoFile("..\\script//fog.lua");
 //! 获取雾表对象
 LuaPlus::LuaObject fogtable = (*lua)->GetGlobal("fog");
 fog->SetDensity(fogtable["density"].GetFloat());
 fog->SetBound(fogtable["near"].GetFloat(),fogtable["far"].GetFloat());
 fog->SetQuality(fogtable["quality"].GetFloat());
 fog->SetColor(core::Color(fogtable["red"].GetFloat(),
 fogtable["green"].GetFloat(),
 fogtable["blue"].GetFloat(),
 fogtable["alpha"].GetFloat()));
 fog->Render();
 BEGIN_LOOP(device)
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 glLoadIdentity();
 camera->SetPerspective(45.0f,640.0f/480.0f,0.1f,1000.0f);
 camera->Render();
 skybox->Render();
 terrain->Render();
 END_LOOP(device)
 
 device->Close();
 device->Drop();
 
 return 0;
 }
 | 
 |