http://blog.csdn.net/pizi0475
痞子龙3D编程
CEGuiDrawable.h
#pragma once
#include <osg/Drawable>
class CEGuiDrawable :
public osg::Drawable
{
public:
CEGuiDrawable();
CEGuiDrawable(const CEGuiDrawable& drawable,const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY):
Drawable(drawable,copyop) {}
META_Object(osg,CEGuiDrawable);
//初始话CEGUI,添加所需要的资源以及设定相关的属性
void InitCEGUI();
//Drawable纯虚函数,实现OpenGL渲染时必须重写
void drawImplementation(osg::RenderInfo& renderInfo) const;
protected:
//析构函数。在结束时释放资源
virtual ~CEGuiDrawable();
unsigned int m_activeContextID;
};
CEGuiDrawable.cpp
#include "StdAfx.h"
#include "CEGuiDrawable.h"
#include "CEGuiEventCallback.h"
#include <ScriptingModules/CEGUILua/LuaScriptModule/include/CEGUILua.h>
CEGuiDrawable::CEGuiDrawable()
{
setSupportsDisplayList(false);
setEventCallback(new CEGuiEventCallback());
new CEGUI::System( new CEGUI::OpenGLRenderer(0));
m_activeContextID = 0;
}
void CEGuiDrawable::drawImplementation(osg::RenderInfo& renderInfo) const
{
osg::State& state = *renderInfo.getState();
if (state.getContextID()!=m_activeContextID) return;
glPushAttrib(GL_ALL_ATTRIB_BITS);
state.disableAllVertexArrays();
//在每帧渲染后调用
CEGUI::System::getSingleton().renderGUI();
glPopAttrib();
state.checkGLErrors("CEGuiDrawable::drawImplementation");
}
void CEGuiDrawable::InitCEGUI()
{
using namespace CEGUI;
// 初始化资源目录
DefaultResourceProvider* rp = static_cast<DefaultResourceProvider*>
(System::getSingleton().getResourceProvider());
rp->setResourceGroupDirectory("schemes", "ceguiDataFiles/schemes/");
rp->setResourceGroupDirectory("imagesets", "ceguiDataFiles/imagesets/");
rp->setResourceGroupDirectory("fonts", "ceguiDataFiles/fonts/");
rp->setResourceGroupDirectory("layouts", "ceguiDataFiles/layouts/");
rp->setResourceGroupDirectory("looknfeels", "ceguiDataFiles/looknfeel/");
rp->setResourceGroupDirectory("lua_scripts", "ceguiDataFiles/lua_scripts/");
// 设置资源组
Imageset::setDefaultResourceGroup("imagesets");
Font::setDefaultResourceGroup("fonts");
Scheme::setDefaultResourceGroup("schemes");
WidgetLookManager::setDefaultResourceGroup("looknfeels");
WindowManager::setDefaultResourceGroup("layouts");
ScriptModule::setDefaultResourceGroup("lua_scripts");
// 加载Lua脚本
LuaScriptModule* script = new LuaScriptModule();
System::getSingleton().setScriptingModule(script);
System::getSingleton().executeScriptFile("GuiScript.lua");
}
CEGuiDrawable::~CEGuiDrawable()
{
delete CEGUI::System::getSingleton().getScriptingModule();
}
CEGuiEventCallback.h
#pragma once
class CEGuiEventCallback :
public osgGA::GUIEventHandler
{
public:
CEGuiEventCallback(void);
~CEGuiEventCallback(void);
virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa, osg::Object* obj, osg::NodeVisitor* nv);
};
CEGuiEventCallback.cpp
#include "StdAfx.h"
#include "CEGuiEventCallback.h"
#include "CEGuiDrawable.h"
CEGuiEventCallback::CEGuiEventCallback(void)
{
}
CEGuiEventCallback::~CEGuiEventCallback(void)
{
}
bool CEGuiEventCallback::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa, osg::Object* obj, osg::NodeVisitor* nv)
{
osgGA::EventVisitor* ev = dynamic_cast<osgGA::EventVisitor*>(nv);
CEGuiDrawable* cd = dynamic_cast<CEGuiDrawable*>(obj);
if (!ev || !cd) return false;
switch(ea.getEventType())
{
case(osgGA::GUIEventAdapter::DRAG):
case(osgGA::GUIEventAdapter::MOVE):
CEGUI::System::getSingleton().injectMousePosition(ea.getX(),ea.getWindowHeight()- ea.getY());
return true;
case(osgGA::GUIEventAdapter::PUSH):
{
CEGUI::System::getSingleton().injectMousePosition(ea.getX(), ea.getWindowHeight()- ea.getY());
if (ea.getButton() == osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON) // left
CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::LeftButton);
else if (ea.getButton() == osgGA::GUIEventAdapter::MIDDLE_MOUSE_BUTTON) // middle
CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::MiddleButton);
else if (ea.getButton() == osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON) // right
CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::RightButton);
return true;
}
case(osgGA::GUIEventAdapter::RELEASE):
{
CEGUI::System::getSingleton().injectMousePosition(ea.getX(), ea.getWindowHeight()- ea.getY());
if (ea.getButton() == osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON) // left
CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::LeftButton);
else if (ea.getButton() == osgGA::GUIEventAdapter::MIDDLE_MOUSE_BUTTON) // middle
CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::MiddleButton);
else if (ea.getButton() == osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON) // right
CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::RightButton);
return true;
}
case(osgGA::GUIEventAdapter::DOUBLECLICK):
{
CEGUI::System::getSingleton().injectMousePosition(ea.getX(), ea.getWindowHeight()- ea.getY());
if (ea.getButton() == osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON) // left
CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::LeftButton);
else if (ea.getButton() == osgGA::GUIEventAdapter::MIDDLE_MOUSE_BUTTON) // middle
CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::MiddleButton);
else if (ea.getButton() == osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON) // right
CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::RightButton);
return true;
}
case(osgGA::GUIEventAdapter::KEYDOWN):
CEGUI::System::getSingleton().injectKeyDown( static_cast<CEGUI::uint>(ea.getKey()) );
CEGUI::System::getSingleton().injectChar( static_cast<CEGUI::utf32>( ea.getKey() ) );
return true;
case(osgGA::GUIEventAdapter::KEYUP):
CEGUI::System::getSingleton().injectKeyUp( static_cast<CEGUI::uint>(ea.getKey()) );
return true;
default:
break;
}
return false;
}
main.cpp
#include <osgDB/ReadFile>
#include <osgUtil/Optimizer>
#include <osgViewer/Viewer>
#include <osg/CoordinateSystemNode>
#include <osgGA/GUIEventAdapter>
#include <CEGUI.h>
#include <CEGUISystem.h>
#include <RendererModules/OpenGLGUIRenderer/openglrenderer.h>
#include <CEGUIScriptModule.h>
#include <CEGUIFontManager.h>
#include <CEGUISchemeManager.h>
#include <CEGUIWindowManager.h>
#include <CEGUIExceptions.h>
#include <CEGUIImagesetManager.h>
#include <CEGUIFontManager.h>
#include <CEGUIDefaultResourceProvider.h>
// OsgCeguiFirst.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "CEGuiDrawable.h"
using namespace osg;
using namespace osgDB;
using namespace osgViewer;
int _tmain(int argc, _TCHAR* argv[])
{
// 创建OSG场景的根结点
osg::ref_ptr<osg::Group> rootNode = new osg::Group;
osgViewer::Viewer viewer;
// CEGUI只支持单线程
viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded);
// 初始化OpenGL环境
viewer.realize();
viewer.getCamera()->getGraphicsContext()->makeCurrent();
// 初始化CEGUI
osg::ref_ptr<osg::Geode> ceguiGeode = new osg::Geode;
osg::ref_ptr<CEGuiDrawable> ceguiDraw = new CEGuiDrawable();
ceguiDraw->InitCEGUI();
ceguiGeode->addDrawable(ceguiDraw);
// 加载模型
osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("osgDataFiles//cow.osg");
rootNode->addChild(model);
rootNode->addChild(ceguiGeode);
// 设置数据并渲染
viewer.setSceneData(rootNode.get());
viewer.run();
}
GuiScript.lua
-----------------------------------------
-- Start of handler functions
-----------------------------------------
function luabtnOK_clicked(e)
local we = CEGUI.toWindowEventArgs(e)
we.window:setText("OK clicked");
end
function luabtnCancel_clicked(e)
local we = CEGUI.toWindowEventArgs(e)
we.window:setText("Cancel clicked");
end
-----------------------------------------
-- Script Entry Point
-----------------------------------------
local guiSystem = CEGUI.System:getSingleton()
local schemeMgr = CEGUI.SchemeManager:getSingleton()
local winMgr = CEGUI.WindowManager:getSingleton()
-- load our demo8 scheme
schemeMgr:loadScheme("TaharezLook.scheme");
-- load our demo8 window layout
local root = winMgr:loadWindowLayout("Cegui.layout")
-- set the layout as the root
guiSystem:setGUISheet(root)
-- set default mouse cursor
guiSystem:setDefaultMouseCursor("TaharezLook", "MouseArrow")
-- set the Tooltip type
guiSystem:setDefaultTooltip("TaharezLook/Tooltip")
Cegui.layout
<?xml version="1.0" encoding="UTF-8"?>
<GUILayout >
<Window Type="DefaultWindow" Name="Root" >
<Property Name="InheritsAlpha" Value="False" />
<Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" />
<Property Name="UnifiedAreaRect" Value="{{0,0},{0,0},{1,0},{1,0}}" />
<Window Type="TaharezLook/FrameWindow" Name="Hello" >
<Property Name="Text" Value="Hello World!" />
<Property Name="Alpha" Value="0.75" />
<Property Name="TitlebarFont" Value="Commonwealth-10" />
<Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" />
<Property Name="TitlebarEnabled" Value="True" />
<Property Name="UnifiedAreaRect" Value="{{0.279703,0},{0.275744,0},{0.656124,0},{0.608014,0}}" />
<Window Type="TaharezLook/StaticText" Name="Hello/StaticText" >
<Property Name="Font" Value="Commonwealth-10" />
<Property Name="Text" Value="Welcome to OSG + CEGUI" />
<Property Name="HorzFormatting" Value="WordWrapLeftAligned" />
<Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" />
<Property Name="VertFormatting" Value="TopAligned" />
<Property Name="UnifiedAreaRect" Value="{{0.043543,0},{0.217033,0},{0.967456,0},{0.679647,0}}" />
</Window>
<Window Type="TaharezLook/Button" Name="Hello/Ok" >
<Property Name="Text" Value="OK" />
<Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" />
<Property Name="UnifiedAreaRect" Value="{{0.19414,0},{0.750594,0},{0.432419,0},{0.897941,0}}" />
<Event Name="Clicked" Function="luabtnOK_clicked" />
</Window>
<Window Type="TaharezLook/Button" Name="Hello/Cancel" >
<Property Name="Font" Value="Commonwealth-10" />
<Property Name="Text" Value="Cancel" />
<Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" />
<Property Name="UnifiedAreaRect" Value="{{0.52738,0},{0.753934,0},{0.76566,0},{0.901281,0}}" />
<Event Name="Clicked" Function="luabtnCancel_clicked" />
</Window>
</Window>
</Window>
</GUILayout>