這是設計的蓋莫游戲引擎2.1.2的demo例子小試
interface設計如下:
以后還會修改之
///////////////////////////////////////////////////////////
/// 定義渲染到紋理對象
///////////////////////////////////////////////////////////
class G_DLL_API RenderToTexture : public Renderable
{
public:
////////////////////////////////////////////////////////
//! 構造,析構渲染到紋理
////////////////////////////////////////////////////////
RenderToTexture();
virtual ~RenderToTexture();
public:
////////////////////////////////////////////////////////
//! 設置渲染回調函數
////////////////////////////////////////////////////////
virtual void SetRenderCallBack(RenderCallBack rendertexture) = 0;
////////////////////////////////////////////////////////
//! 設置渲染到紋理參數
////////////////////////////////////////////////////////
virtual void SetPara(float fov,float near,float far) = 0;
////////////////////////////////////////////////////////
//! 設置紋理清屏色,fbo色
////////////////////////////////////////////////////////
virtual void SetClearColor(const Color& color) = 0;
virtual void SetFboColor(const Color& color) = 0;
DECLARE_OBJECT(RenderToTexture)
};
}
#endif
//! ccsdu2004
測試代碼如下:
#include <GEngine/Gaimo.hpp>
using namespace std;
using namespace core;
RefPtr<Texture> boxtexture = NULL;
RefPtr<Camera> camera = NULL;
//! 獲取引擎視頻驅動器
RefPtr<VideoDriver> videodriver = NULL;
//! 立方體繪制
void _RenderCube_(float color[6][4]);
float color[6][4];
float yaw_angle = 0.0f;
float pitch_angle = 0.0f;
void InitClearColor()
{
for(int i = 0; i < 6; i++)
for(int j = 0; j < 4; j++)
color[i][j] = 0.8f;
color[0][0] = 0.5f;
color[1][1] = 0.5f;
color[2][2] = 0.5f;
color[3][0] = 0.5f;
color[3][1] = 0.5f;
color[4][1] = 0.5f;
color[4][2] = 0.5f;
color[5][0] = 0.5f;
}
void G_CALL draw()
{
videodriver->SetPilotView(0.0f,0.0f,5.0f,-55.0f,-pitch_angle,-yaw_angle);
_RenderCube_(color);
}
int main(int argc, char **argv)
{
//! 初始化引擎設備并得到設備指針
RefPtr<Device> device = core::InitDevice("渲染到紋理");
//! 得到引擎場景指針
RefPtr<SceneManager> scenemanager = device->GetSceneManager();
//! 得到引擎資源指針
RefPtr<ResourceManager> resourcemanager = device->GetResourceManager();
//! 獲取引擎紋理管理器指針
RefPtr<TextureManager> texturemanager = resourcemanager->GetTextureManager();
//! 獲取光管理器指針
RefPtr<LightManager> lightmanager = resourcemanager->GetLightManager();
//! 獲取引擎圖形管理器
RefPtr<ImageManager> imagemanager = resourcemanager->GetImageManager();
//! 獲取引擎視頻驅動器
videodriver = device->GetVideoDriver();
glEnable(GL_TEXTURE_2D);
//! 啟用環境光
lightmanager->RenderGlobalAmbient(false);
//! 啟用光源
lightmanager->EnableLight();
//! 獲取光指針
RefPtr<Light> light = lightmanager->CreateObject("rttlight","..\\script//rtt.lua","light");
//! 獲取全局攝像機,設置攝像機參數
camera = scenemanager->GetActiveCamera();
camera->SetPosition(Vector3f(0,0,18));
camera->SetView(Vector3f(0,0,0));
camera->SetDirection(Vector3f(0,1,0));
camera->SetViewPort(Recti(0,0,640,480));
camera->SetPerspective(50.0f,640.0f/480.0f,1.0f,100.0f);
InitClearColor();
RefPtr<RenderToTexture> rtt = device->GetRenderer()->GetRenderToTexture(&draw);
rtt->SetClearColor(Color(0.2f,0.2f,0.7f,0.5f));
rtt->SetFboColor(Color(1.0f,0.9f,0.7f,0.6f));
light->Render();
BEGIN_LOOP(device)
//camera->Render();
yaw_angle += 0.3f;
pitch_angle += 0.21f;
rtt->Render();
END_LOOP(device)
//delete fbo;
return 0;
}
//! 立方體繪制
void _RenderCube_(float color[6][4])
{
//! draw cube
glEnable(GL_COLOR_MATERIAL);
glColor4fv(color[0]);
glBegin(GL_TRIANGLE_STRIP);
glNormal3f(0.0f, 0.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(1.0f, -1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(1.0f, 1.0f, -1.0f);
glEnd();
glColor4fv(color[1]);
glBegin(GL_TRIANGLE_STRIP);
glNormal3f(1.0f, 0.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(1.0f, -1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(1.0f, 1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(1.0f, 1.0f, 1.0f);
glEnd();
glColor4fv(color[2]);
glBegin(GL_TRIANGLE_STRIP);
glNormal3f(0.0f, 0.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glEnd();
glColor4fv(color[3]);
glBegin(GL_TRIANGLE_STRIP);
glNormal3f(-1.0f, 0.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f);
glEnd();
glColor4fv(color[4]);
glBegin(GL_TRIANGLE_STRIP);
glNormal3f(0.0f, -1.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(1.0f, -1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(1.0f, -1.0f, -1.0f);
glEnd();
glColor4fv(color[5]);
glBegin(GL_TRIANGLE_STRIP);
glNormal3f(0.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-1.0f, 1.0f, -1.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(1.0f, 1.0f, 1.0f);
glEnd();
}
貼圖為:

.

....................................................................................................................................................................
繼續.
這是蓋莫游戲引擎2.1.2中GUI之2-GUI刷子
該對象提供對2d基本圖元的繪制和操作
提供以下功能
1.點繪制
2.線段繪制
3.矩形繪制
4.三角形繪制
5.紋理渲染
以后還會加入更多的功能
其功能大致相當于UI lib中的Graphics,
Glooery中的Renderer
以及GUI Chart中的Graphics!
其接口如下:
////////////////////////////////////////////////////////////
/// 定義引擎GUI刷子(提供簡單的幾何體繪制操作)
////////////////////////////////////////////////////////////
class G_DLL_API GuiBrush : public Object
{
public:
////////////////////////////////////////////////////////
/// GUI刷子構造,析構
////////////////////////////////////////////////////////
GuiBrush();
virtual ~GuiBrush();
public:
////////////////////////////////////////////////////////
/// 設置GUI刷子顏色
////////////////////////////////////////////////////////
virtual void SetBrushColor(const Color& color) = 0;
//////////////////////////////////////////////////////////
/// 設置刷子線寬
//////////////////////////////////////////////////////////
virtual void SetLineWidth(float width) = 0;
virtual float GetMaxLineWidth()const = 0;
virtual float GetLineWidth()const = 0;
//////////////////////////////////////////////////////////
/// 繪制一個點
//////////////////////////////////////////////////////////
virtual void RenderPoint(const Point& point) = 0;
virtual void RenderPoint(const Vector2f& point) = 0;
virtual void RenderPoint(int x,int y) = 0;
virtual void RenderPoint(float x,float y) = 0;
////////////////////////////////////////////////////////
/// 繪制一個線段
////////////////////////////////////////////////////////
virtual void RenderLine(const Vector2f& from, const Vector2f& to) = 0;
virtual void RenderLine(const Point& from, const Point& to) = 0;
////////////////////////////////////////////////////////
/// 繪制一個矩陣框(填充與否)
////////////////////////////////////////////////////////
virtual void RenderRect(const Recti& rect, bool fill = true) = 0;
virtual void RenderRect(const Rectf& rect, bool fill = true) = 0;
////////////////////////////////////////////////////////
/// 繪制一個三角形
////////////////////////////////////////////////////////
virtual void RenderTriangle(const Vector2f& p1,const Vector2f& p2,const Vector2f& p3, bool fill = true) = 0;
virtual void RenderTriangle(const Point& p1,const Point& p2,const Point& p3, bool fill = true) = 0;
//////////////////////////////////////////////////////////
/// 繪制一個園,園扇(segments為邊數)
//////////////////////////////////////////////////////////
virtual void RenderCircle(const Vector2f& center,float radius,int segments = 32) = 0;
virtual void RenderCircleSegment(const Vector2f& center,float radius,float angle1,float angle2,int segments = 32,bool filled = true) = 0;
////////////////////////////////////////////////////////
/// 渲染紋理
////////////////////////////////////////////////////////
virtual void RenderTexture(float x,float y,float w,float h) = 0;
virtual void RenderTexture(const Rectf& rect) = 0;
DECLARE_OBJECT(GuiBrush)
};
可以看出比較簡單 沒有什么復雜的東西!
在GUI部分
引擎還會陸續加入以下對象
1.Widget 基本控件單元
2.Border 控件裝飾器
3.Layout 控件布局管理器
4.UIManager UI管理器
5.UIEvent UI消息事件
6.WidgetSort 提供對控件的深度排序
可能還會加入UISurface以提供對控件表面的裝飾效果
引擎UI需要達到的高度
1.控件組動態生成(要求源于xml config file)
2.控件自布局
3.靈活簡單易用
4.UI引擎和引擎的低聚合
.....
這是剛寫的渲染到紋理代碼 還有點問題 以后慢慢修改吧
先上interface
///////////////////////////////////////////////////////////
/// 定義渲染到紋理對象
///////////////////////////////////////////////////////////
class G_DLL_API RenderToTexture : public Renderable
{
public:
////////////////////////////////////////////////////////
//! 構造,析構渲染到紋理
////////////////////////////////////////////////////////
RenderToTexture();
virtual ~RenderToTexture();
public:
////////////////////////////////////////////////////////
//! 設置渲染紋理,目標回調函數
////////////////////////////////////////////////////////
virtual void SetRenderTexture(RenderCallBack rendertexture) = 0;
virtual void SetRenderTarget(RenderCallBack rendertarget) = 0;
////////////////////////////////////////////////////////
//! 設置渲染攝像機透視參數
////////////////////////////////////////////////////////
virtual void SetRenderPara(float fov,float near,float far) = 0;
////////////////////////////////////////////////////////
//! 設置紋理清屏色
////////////////////////////////////////////////////////
virtual void SetClearColor(const Color& color) = 0;
DECLARE_OBJECT(RenderToTexture)
};
下面是測試的例子代碼:
#include <GEngine/Gaimo.hpp>
using namespace std;
using namespace core;
RefPtr<Texture> boxtexture = NULL;
RefPtr<Camera> camera = NULL;
//! 獲取引擎視頻驅動器
RefPtr<VideoDriver> videodriver = NULL;
///////////////////////////////////////////////////////////////////////////////
// 渲染回調函數
///////////////////////////////////////////////////////////////////////////////
void G_CALL Render()
{
glBegin(GL_QUADS);
glTexCoord2f(1, 1);
glVertex2f( 1, 1);
glTexCoord2f(0, 1);
glVertex2f(-5, 1);
glTexCoord2f(0, 0);
glVertex2f(-5,-5);
glTexCoord2f(1, 0);
glVertex2f( 1,-5);
glTexCoord2f(1, 1);
glVertex2f(3, 3);
glTexCoord2f(0, 1);
glVertex2f(-3,3);
glTexCoord2f(0, 0);
glVertex2f(-3,-3);
glTexCoord2f(1, 0);
glVertex2f(3,-3);
glEnd();
}
///////////////////////////////////////////////////////////////////////////////
//
///////////////////////////////////////////////////////////////////////////////
void G_CALL RenderTexture()
{
boxtexture->AttachRenderTarget();
glBegin(GL_QUADS);
glTexCoord2f(1, 1);
glVertex2f(0,0);
glTexCoord2f(0, 1);
glVertex2f(-8,0);
glTexCoord2f(0, 0);
glVertex2f(-8,-8);
glTexCoord2f(1, 0);
glVertex2f(0,-8);
glEnd();
}
int main(int argc, char **argv)
{
//! 初始化引擎設備并得到設備指針
RefPtr<Device> device = core::InitDevice("渲染到紋理");
//! 得到引擎場景指針
RefPtr<SceneManager> scenemanager = device->GetSceneManager();
//! 得到引擎資源指針
RefPtr<ResourceManager> resourcemanager = device->GetResourceManager();
//! 獲取引擎紋理管理器指針
RefPtr<TextureManager> texturemanager = resourcemanager->GetTextureManager();
//! 獲取引擎圖形管理器
RefPtr<ImageManager> imagemanager = resourcemanager->GetImageManager();
//! 獲取引擎視頻驅動器
videodriver = device->GetVideoDriver();
//! 得到tile圖形和其紋理
core::RefPtr<Image> box = imagemanager->CreateObject("cube","..\\image//logo.bmp");
boxtexture = texturemanager->CreateObject("cube",box);
boxtexture->Generate();
//! 獲取全局攝像機,設置攝像機參數
camera = scenemanager->GetActiveCamera();
camera->SetPosition(Vector3f(0,0,18));
camera->SetView(Vector3f(0,0,0));
camera->SetDirection(Vector3f(0,1,0));
camera->SetViewPort(Recti(0,0,640,480));
camera->SetPerspective(50.0f,640.0f/480.0f,1.0f,100.0f);
videodriver->EnableCulling();
//! 獲取渲染到紋理指針
RefPtr<RenderToTexture> render = device->GetRenderer()->GetRenderToTexture(256,256);
render->SetRenderTexture(&RenderTexture);
render->SetRenderTarget(&Render);
render->SetClearColor(Color::Blue);
render->SetRenderPara(45.0f,1.0f,100.0f);
BEGIN_LOOP(device)
camera->Render();
render->Render();
END_LOOP(device)
return 0;
}
貼圖比較簡單就不上了 這個以后還要修改之!
這是蓋莫游戲引擎2.1.2的游標控制類
該類主要負責游標圖形 游標顯示和設置游標位置
比較簡單直接上代碼不說啥了
namespace core
{
////////////////////////////////////////////////////////////
/// 定義引擎游標控制類(當前最大支持8個光標)(當前僅對win32有效)
////////////////////////////////////////////////////////////
class G_DLL_API CursorControl : public Object
{
public:
////////////////////////////////////////////////////////
/// 構造,析構游標控制
////////////////////////////////////////////////////////
CursorControl();
virtual ~CursorControl();
public:
////////////////////////////////////////////////////////
/// 載入光標文件(win32下可載入.cur,.ani,.ico格式)(返回光標索引)
////////////////////////////////////////////////////////
virtual int OpenCursor(const engine_string& cursor) = 0;
////////////////////////////////////////////////////////
/// 設置給定索引的光標
////////////////////////////////////////////////////////
virtual bool SetCursor(int cursor) = 0;
////////////////////////////////////////////////////////
/// 光標的顯示和隱藏
////////////////////////////////////////////////////////
virtual void ShowCursor(bool show) = 0;
////////////////////////////////////////////////////////
/// 設置光標位置
////////////////////////////////////////////////////////
virtual void SetCursotPosition(int x, int y) = 0;
DECLARE_OBJECT(CursorControl)
};
摘要: 好幾天沒寫博客了接著以前寫的Loki系列來首先Loki Factory設計的目的就是讓對象功能按名生成!該文主要涉及Loki/Factory.h文件首先上工廠異常類如下:
/** * \defgroup FactoryErrorPoliciesGroup Factory Error Policies&...
閱讀全文
摘要: 蓋莫音頻引擎1.2.8的上次發布版本為1.1.2版本當前發布版本增加功能如下:1.對音頻錄入的支持2.對xm,mod,it,s3m的支持3.修改了一些內部實現總的說來本引擎(API)功能如下:1.支持ogg,mp3,wav,xm,it,s3m,mod格式2.基于多線程流式播放音頻3.真3d音效4.支持低通,次級音效本音頻引擎完全勝任游戲開發,嵌入式設備等商業應用!本音頻引擎使用于商業用途只需要付出...
閱讀全文
剛做完了蓋莫音頻引擎1.2.8的音頻錄入功能
這個比較簡單
就是把聽到的音頻保存為一定格式的音頻文件(當前只設計了保存為wav文件)
接口很簡單
如下:
////////////////////////////////////////////////////////////
/// 定義音頻錄入類接口
////////////////////////////////////////////////////////////
class AudioCapture : public Object
{
public:
/////////////////////////////////////////////////////////
//! 構造,析構音頻錄入
/////////////////////////////////////////////////////////
AudioCapture();
virtual ~AudioCapture();
/////////////////////////////////////////////////////////
//! 捕獲,停止捕獲音頻數據
/////////////////////////////////////////////////////////
virtual void CaptureData() = 0;
virtual void StopCapture() = 0;
DECLARE_OBJECT(AudioCapture)
};
只有2個函數
一個是音頻數據分批錄入
一個就是停止錄入音頻數據
那么該指針從哪里獲取呢?
當然是AudioDevice了
如下(這是蓋莫音頻引擎的中樞)
/////////////////////////////////////////////////////////
//! 定義音頻設備基類
/////////////////////////////////////////////////////////
class AudioDevice : public Object
{
public:
/////////////////////////////////////////////////////////
//! 初始化,卸載音頻設備
/////////////////////////////////////////////////////////
virtual bool Init(const engine_string &devicename,
uint16 eax_effect_num,
uint output_freq) = 0;
virtual bool Deinit() = 0;
/////////////////////////////////////////////////////////
//! 獲取音頻引擎版本號
/////////////////////////////////////////////////////////
virtual const char* GetVerson() const = 0;
/////////////////////////////////////////////////////////
//! 獲取音頻引擎作者
/////////////////////////////////////////////////////////
virtual const char* GetMaker() const = 0;
/////////////////////////////////////////////////////////
//! 查詢音頻設備是否支持指定格式的音頻文件
/////////////////////////////////////////////////////////
virtual bool IsSupport(const AudioFileType& type) = 0;
/////////////////////////////////////////////////////////
//! 抓取音頻音源指針(最大可獲取255個音源)
/////////////////////////////////////////////////////////
virtual AudioSource* GetAudioSource() = 0;
/////////////////////////////////////////////////////////
//! 獲取聽者指針
/////////////////////////////////////////////////////////
virtual AudioListener* GetAudioListener() = 0;
/////////////////////////////////////////////////////////
//! 獲取音頻捕獲設備指針(參數為音頻名字)(當前僅僅支持wav格式)(全局唯一)
/////////////////////////////////////////////////////////
virtual RefPtr<AudioCapture> GetAudioCapture(const engine_string& name = "capture")const = 0;
/////////////////////////////////////////////////////////
//! 獲取音頻設備列表個數
/////////////////////////////////////////////////////////
virtual uint16 GetAudioDeviceNumber() = 0;
virtual engine_string GetDeviceByIndex(uint8 index) = 0;
/////////////////////////////////////////////////////////
//! 獲取默認設備名
/////////////////////////////////////////////////////////
virtual engine_string GetDefaultDeviceName()const = 0;
DECLARE_OBJECT(AudioDevice)
};
那么如何使用蓋莫音頻引擎錄入音頻呢?
如下:
/*!==========================================================================
*
* 蓋莫游戲引擎(GaiMo Game Engine)
*
* 版權所有 (C) 2009-2009 成都蓋莫軟件技術工作室 保留所有權利
* Copyright (C) 成都蓋莫軟件技術工作室. All Rights Reserved.
*
* 了解更多情況,請訪問 http://www.gaimo.net
****************************************************************************/
#include <GEngine/Gaimo.hpp>
//! 使用蓋莫游戲引擎內核命名空間
using namespace core;
using namespace std;
int Main()
{
RefPtr<Device> device = InitDevice("音頻捕獲");
//! 獲取音頻設備指針
RefPtr<core::AudioDevice> audiodevice = device->GetAudioDevice();
//! 獲取音頻設備個數
uint16 number = audiodevice->GetAudioDeviceNumber();
for(int i = 0; i < number ; i++)
{
std::cout<<audiodevice->GetDeviceByIndex(i)<<std::endl;
}
//! 初始化音頻設備
engine_string audiodeviceinde = audiodevice->GetDeviceByIndex(0);
cout<<"初始化音頻設備"<<audiodevice->Init(audiodeviceinde,4,0)<<endl;
//! 獲取音頻錄入指針
RefPtr<AudioCapture> audiocapture = audiodevice->GetAudioCapture("capture");
//! 獲取錄制開始時間
float time = device->GetTime();
BEGIN_LOOP(device)
//! 錄制時間10秒
if(device->GetTime() > time +10)
break;
audiocapture->CaptureData();
END_LOOP(device)
audiocapture->StopCapture();
return EXIT_SUCCESS;
}
步驟就是從設備指針獲取音頻管理器指針
從音頻管理器指針獲取音頻錄入指針
然后在錄入過程中調用數據錄入函數
停止錄入的時候調用StopAudioCapture即可!
當然這是基于蓋莫游戲引擎的音頻錄入
過些天我要發布一個單獨的蓋莫音頻引擎sdk(第三次發布)
題外話
在蓋莫游戲引擎2.1.2中音頻部分需要增加的功能就是對midi,mid.mod系列音樂文件的支持了
(不過聽人說這個解碼似乎不太好處理)
到時候歡迎下載啊
順手翻了下3d游戲引擎設計實時計算機圖形學的應用方法這本書(英文本第二版)
在其800page.18.4章的
template<class T>
class Stack中這兒有一個小錯誤
就是
在函數
bool Push..
中間 其判斷條件是錯誤的
對于這個類模板
我把它成了了蓋莫引擎死板的風格
如下:
///////////////////////////////////////////////////////////
/// 定義引擎棧模板類
///////////////////////////////////////////////////////////
template<class T>
class Stack : NonCopyable
{
public:
///////////////////////////////////////////////////////
/// 構造,析構棧模板
///////////////////////////////////////////////////////
Stack(int maxsize);
~Stack();
public:
///////////////////////////////////////////////////////
/// 數據入棧
///////////////////////////////////////////////////////
bool Push(const T& element);
///////////////////////////////////////////////////////
/// 數據出棧
///////////////////////////////////////////////////////
bool Pop(T& element);
//////////////////////////////////////////////////////////
/// 獲取棧頂元素
//////////////////////////////////////////////////////////
bool GetTop(T& element)const;
///////////////////////////////////////////////////////
/// 檢查棧是否為空棧,滿棧
///////////////////////////////////////////////////////
bool IsEmpty()const;
bool IsFull()const;
private:
int maxsize;
int top;
T* data;
};
#include <GEngine/Template/Stack.inl>
in stack.inl
///////////////////////////////////////////////////////
/// 構造,析構棧模板
///////////////////////////////////////////////////////
template<class T>
Stack<T>::Stack(int maxsize):
top(-1)
{
ASSERT(maxsize > 0);
this->maxsize = maxsize;
data = new T[this->maxsize];
}
template<class T>
Stack<T>::~Stack()
{
CHECK_PTR_ARRAY_AND_DELETE(data);
}
///////////////////////////////////////////////////////
/// 數據入棧
///////////////////////////////////////////////////////
template<class T>
inline bool Stack<T>::Push(const T& element)
{
if(top < maxsize-1)
{
data[++top] = element;
return true;
}
return false;
}
///////////////////////////////////////////////////////
/// 數據出棧
///////////////////////////////////////////////////////
template<class T>
inline bool Stack<T>::Pop(T& element)
{
if(top >=0)
{
element = data[top--];
return true;
}
return false;
}
//////////////////////////////////////////////////////////
/// 獲取棧頂元素
//////////////////////////////////////////////////////////
template<class T>
inline bool Stack<T>::GetTop(T& element)const
{
if(top >= 0)
{
element = data[top];
return true;
}
return false;
}
///////////////////////////////////////////////////////
/// 檢查棧是否為空棧,滿棧
///////////////////////////////////////////////////////
template<class T>
inline bool Stack<T>::IsEmpty()const
{
return top == -1;
}
template<class T>
inline bool Stack<T>::IsFull()const
{
return top == maxsize-1;
}
從2008年年底我就一直想設計一套基于OpenGL的游戲專用GUI系統出來
當然有人說現在不是有現成的嗎?CEGUI...
使用這個當然沒什么問題
但是覺得自己開發的游戲引擎還是配備一個套自行開發的GUI系統比較好(比如irr)
當然在下面使用若干子庫(比如freetype,sigc++等等)還是沒有問題的
也是從那個時候看了很多GUI系統,比如CEGUI,MyGUI,GLOOEY,UFO GUI,UI LIB 等等
之后我開始設計了一個套GUI系統但是感覺問題多多
一個主要的問題就是沒有處理好事件
現在重新看UI系統
設計她的前置條件有
1.良好的字體渲染器
2.對象系列化
3.中文輸入.
4.其它
UI系統應該包括的內容(個人感覺)
1.UI事件
2.UI工廠(或者管理器)
3.UI控件對象(按鍵,組合框等等)
4.UI邊框(裝飾器)
5.UI布局管理器
6.其它
故從蓋莫引擎2.1.2版本起我會逐步加入新設計的GUI引擎
下面是我的開胃菜
GUI主題色
設置這個的目的是為了統一GUI控件顏色而不需要一個一個設計它
下面是實現很簡單的!
class G_DLL_API UIThemeColor : public Object
{
public:
////////////////////////////////////////////////////////
/// 獲取默認主題色
////////////////////////////////////////////////////////
static UIThemeColor GetDefaultTheme();
public:
////////////////////////////////////////////////////////
/// 構造,析構主題色
////////////////////////////////////////////////////////
UIThemeColor();
UIThemeColor(const Color &normal,const Color &disable,const Color &focus,const Color &tagged);
UIThemeColor(UIThemeColor &theme);
~UIThemeColor(){}
////////////////////////////////////////////////////////
/// 使用默認主題色
////////////////////////////////////////////////////////
void UseDefaultTheme();
////////////////////////////////////////////////////////
/// 重新設置,獲取主題色
////////////////////////////////////////////////////////
void SetThemeColor(const Color &normal,const Color &disable,const Color &focus,const Color &tagged);
void GetThemeColor(Color &normal,Color &disable,Color &focus,Color &tagged);
////////////////////////////////////////////////////////
/// 設置,獲取主題正常色
////////////////////////////////////////////////////////
void SetNormalColor(const Color &color){this->color[0] = color;}
Color GetNormalColor()const{return color[0];}
////////////////////////////////////////////////////////
/// 設置,獲取主題不可用色
////////////////////////////////////////////////////////
void SetDisableColor(const Color &color){this->color[1] = color;}
Color GetDisableColor()const{return color[0];}
////////////////////////////////////////////////////////
/// 設置,獲取主題聚焦顏色
////////////////////////////////////////////////////////
void SetFocusColor(const Color &color){this->color[2] = color;}
Color GetFocusColor()const{return color[2];}
////////////////////////////////////////////////////////
/// 設置,獲取主題(被選中的)顏色
////////////////////////////////////////////////////////
void SetTaggedColor(const Color &color){this->color[3] = color;}
Color GetTaggedColor()const{return color[3];}
private:
static UIThemeColor themecolor;
//! 當前保留一個空的顏色值
static const int themecolor_number = 5;
Color color[themecolor_number];
然后每個控件包含一個主題色對象
(當前這里認為控件有4個狀態.正常,禁止,聚焦,選中)
這是使用蓋莫游戲引擎2.1.2測試環境映射的demo
對opengl而言
環境映射主要就圍繞函數glTexEnv工作的
但是其實現起來不是那么容易
該測試例子源于2.1.1版本demo中的球面映射一例
增加的代碼為:
RefPtr<TexEnv> texenv = reflect->GetTexEnv();
texenv->SetEnvColor(Color::Blue);
texenv->SetMode(TEXTURE_ENV_MODE_BLEND);
texenv->SetLodBias(0.2f);
texenv->SetPointSpriteCoordReplace(true);
texenv->SetRGBScale(1.2f);
texenv->SetAlphaScale(0.8f);
texenv->SetCombineMode(TEXTURE_ENV_MODE_INTERPOLATE);
texenv->SetEnvSource0(TEXTURE_ENV_SOURCE_TEXTURE0);
texenv->SetEnvSource1(TEXTURE_ENV_SOURCE_TEXTURE1);
texenv->SetEnvSource2(TEXTURE_ENV_SOURCE_TEXTURE2);
環境映射的操作模式就是從紋理中獲取對應的環境映射指針并設置合適的參數數值
全demo源碼為:
/*!==========================================================================
*
* 蓋莫游戲引擎(GaiMo Game Engine)
*
* 版權所有 (C) 2009-2009 成都蓋莫軟件技術工作室 保留所有權利
* Copyright (C) 成都蓋莫軟件技術工作室. All Rights Reserved.
*
* 了解更多情況,請訪問 http://www.gaimo.net
****************************************************************************/
#include <GEngine/Gaimo.hpp>
using namespace std;
using namespace core;
int main(int argc, char **argv)
{
//! 初始化引擎設備并得到設備指針
RefPtr<Device> device = core::InitDevice("環境映射");
//! 得到引擎場景指針
RefPtr<SceneManager> scenemanager = device->GetSceneManager();
//! 得到引擎資源指針
RefPtr<ResourceManager> resourcemanager = device->GetResourceManager();
//! 獲取引擎紋理管理器指針
RefPtr<TextureManager> texturemanager = resourcemanager->GetTextureManager();
//! 獲取引擎圖形管理器
RefPtr<ImageManager> imagemanager = resourcemanager->GetImageManager();
//! 獲取引擎視頻驅動器
RefPtr<VideoDriver> videodriver = device->GetVideoDriver();
//! 得到圖形和其紋理
RefPtr<Image> image1 = imagemanager->CreateObject("background","..\\image//spheremap//tree.jpg");
RefPtr<Texture> background = texturemanager->CreateObject("background",image1);
background->Generate();
RefPtr<Image> image2 = imagemanager->CreateObject("reflect","..\\image//spheremap//tree1.jpg");
RefPtr<Texture> reflect = texturemanager->CreateSphereMap("reflect",image2);
RefPtr<TexEnv> texenv = reflect->GetTexEnv();
texenv->SetEnvColor(Color::Blue);
texenv->SetMode(TEXTURE_ENV_MODE_BLEND);
texenv->SetLodBias(0.2f);
texenv->SetPointSpriteCoordReplace(true);
texenv->SetRGBScale(1.2f);
texenv->SetAlphaScale(0.8f);
texenv->SetCombineMode(TEXTURE_ENV_MODE_INTERPOLATE);
texenv->SetEnvSource0(TEXTURE_ENV_SOURCE_TEXTURE0);
texenv->SetEnvSource1(TEXTURE_ENV_SOURCE_TEXTURE1);
texenv->SetEnvSource2(TEXTURE_ENV_SOURCE_TEXTURE2);
reflect->Generate();
//! 獲取全局攝像機,設置攝像機參數
core::RefPtr<core::Camera> camera = scenemanager->GetActiveCamera();
camera->SetPosition(Vector3f(0,0,30));
camera->SetView(Vector3f(0,0,0));
camera->SetDirection(Vector3f(0,1,0));
camera->SetViewPort(Recti(0,0,640,480));
camera->SetPerspective(50.0f,640.0f/480.0f,0.1f,300.0f);
videodriver->EnableCulling();
BEGIN_LOOP(device)
videodriver->SetClearBuffer(ENGINE_CLEAR_COLOR | ENGINE_CLEAR_DEPTH);
videodriver->SetClearColor(core::Color::Blue);
camera->Render();
background->AttachRenderTarget();
glBegin(GL_QUADS);
glNormal3f( 0.0f, 0.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-13.0f, -12.0f, 10.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 13.0f, -12.0f, 10.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 13.0f, 12.0f, 10.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-13.0f, 12.0f, 10.0f);
glEnd();
reflect->AttachRenderTarget();
videodriver->RenderSphere(12,32,32);
videodriver->RenderSphere(9,32,32);
videodriver->RenderSphere(6,32,32);
reflect->Destroy();
END_LOOP(device)
return 0;
}
當前測試例子設置環境映射模式為渲染模式
則其效果為:

再貼一次對應的無環境映射的圖片如下:

可以看出蓋莫游戲引擎一直在不斷完善ing.