游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2100|回复: 0

使用简单脚本配置下的天空盒和地形测试

[复制链接]

50

主题

69

帖子

69

积分

注册会员

Rank: 2

积分
69
发表于 2010-3-3 13:08:00 | 显示全部楼层 |阅读模式
使用简单脚本配置下的天空盒和地形测试
当然是使用盖莫游戏引擎乐

代码如下:

#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;
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-5-11 15:29

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表