|
使用简单脚本配置下的天空盒和地形测试
当然是使用盖莫游戏引擎乐
代码如下:
#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;
} |
|