VS2010+OSG3.2+CEGUI0.8.4环境下实现简单的HelloWorld程序

VS2010+OSG3.2+CEGUI0.8.4环境下实现简单的HelloWorld程序VS2010+OSG3.2+CEGUI0.8.4环境下实现简单的HelloWorld程序写文章之前必须要先吐槽一下CEGUI的兼容性,好多函数改了名称换了命名空间,以致于花了好长时间查看自带的Demo文件以及帮助文档,不过最终还是搞出来了,现将整个流程编写如下。1.首先创建工程之前必须先链接OSG以及CEGUI的开发库,根据自身配置路径进行设置,现将本人设置路径贴出来以供参考,如下:包含目录…

大家好,又见面了,我是你们的朋友全栈君。

VS2010+OSG3.2+CEGUI0.8.4环境下实现简单的HelloWorld程序

写文章之前必须要先吐槽一下CEGUI的兼容性,好多函数改了名称换了命名空间,以致于花了好长时间查看自带的Demo文件以及帮助文档,不过最终还是搞出来了,现将整个流程编写如下。

1.首先创建工程之前必须先链接OSG以及CEGUI的开发库,根据自身配置路径进行设置,现将本人设置路径贴出来以供参考,如下:

包含目录:

   E:\OSG\include

   F:\CEGUI\cegui-0.8.4\cegui\include

   F:\CEGUI\cegui-0.8.4\dependencies\include

   F:\CEGUI\cegui-0.8.4\samples_framework\include

库目录:

   E:\OSG\lib

   F:\CEGUI\cegui-0.8.4\lib

   F:\CEGUI\cegui-0.8.4\dependencies\lib\dynamic

   F:\CEGUI\cegui-0.8.4\dependencies\lib\static

附加依赖项:

   OpenThreadsd.lib
   osgd.lib
   osgDBd.lib
   osgUtild.lib
   osgGAd.lib
   osgViewerd.lib
   osgTextd.lib
   osgWidgetd.lib
   CEGUIBase-0_d.lib
   CEGUIOpenGLRenderer-0_d.lib
   glew.lib
   glu.lib
   opengl.lib

2.创建CEGUIDrawable,实现对CEGUI的渲染。

#pragma once
#include <osg/Drawable>
#include <osg/RenderInfo>
#include <CEGUI/CEGUI.h>
#include <CEGUI/System.h>
#include <CEGUI/DefaultResourceProvider.h>
#include <CEGUI/RendererModules/OpenGL/GL.h>
#include <CEGUI/RendererModules/OpenGL/GLRenderer.h>
#include <CEGUI/Scheme.h>
#include <CEGUI/SchemeManager.h>
#include <CEGUI/Font.h>
#include <CEGUI/FontManager.h>
#include <CEGUI/Image.h>
#include <CEGUI/ImageManager.h>
#include <CEGUI/Window.h>
#include <CEGUI/WindowManager.h>
#include <CEGUI/WindowRenderer.h>  
#include "CEGUIEventCallback.h"
    
     
class CEGUIDrawable : public osg::Drawable
{
public:
	CEGUIDrawable(void);
	~CEGUIDrawable(void);
public:
	CEGUIDrawable(const CEGUIDrawable&drawable,const osg::CopyOp   &copyop=osg::CopyOp::SHALLOW_COPY):Drawable(drawable,copyop){}
	META_Object(osg,CEGUIDrawable);

	void InitCEGUI();  //初始化CEGUI,添加所需要的资源以及设定相关属性
	void drawImplementation(osg::RenderInfo& renderInfo) const;

	//这个函数在基类Drawable里是一个纯虚函数,实现OpenGL渲染时必须重写

};

 

#include "StdAfx.h"
#include "CEGUIDrawable.h"


CEGUIDrawable::CEGUIDrawable(void)
{
     setSupportsDisplayList(false);//CEGUI仅支持单线程,必须进行设置才能渲染
     CEGUI::OpenGLRenderer& myRenderer =CEGUI::OpenGLRenderer::create();
     myRenderer.enableExtraStateSettings(true);//必须进行设置才能让字体显示
     setEventCallback(new CEGUIEventCallback);//事件处理函数
     CEGUI::System::create(myRenderer);
    
     CEGUI::DefaultResourceProvider* rp = static_cast(CEGUI::System::getSingleton().getResourceProvider());
     rp->setResourceGroupDirectory("schemes", "F:\\CEGUI\\cegui-0.8.4\\datafiles\\schemes");
     rp->setResourceGroupDirectory("imagesets", "F:\\CEGUI\\cegui-0.8.4\\datafiles\\imagesets");
     rp->setResourceGroupDirectory("fonts", "F:\\CEGUI\\cegui-0.8.4\\datafiles\\fonts");
     rp->setResourceGroupDirectory("layouts", "F:\\CEGUI\\cegui-0.8.4\\datafiles\\layouts");
     rp->setResourceGroupDirectory("looknfeels", "F:\\CEGUI\\cegui-0.8.4\\datafiles\\looknfeel");
     rp->setResourceGroupDirectory("lua_scripts", "F:\\CEGUI\\cegui-0.8.4\\datafiles\\lua_scripts");
     // This is only really needed if you are using Xerces and need to specify the schemas location
     rp->setResourceGroupDirectory("schemas", "F:\\CEGUI\\cegui-0.8.4\\datafiles\\xml_schemas");
    
     CEGUI::ImageManager::setImagesetDefaultResourceGroup("imagesets");
     CEGUI::Font::setDefaultResourceGroup("fonts");
     CEGUI::Scheme::setDefaultResourceGroup("schemes");
     CEGUI::WidgetLookManager::setDefaultResourceGroup("looknfeels");
     CEGUI::WindowManager::setDefaultResourceGroup("layouts");
     CEGUI::ScriptModule::setDefaultResourceGroup("lua_scripts");
    
     CEGUI::XMLParser* parser = CEGUI::System::getSingleton().getXMLParser();
     if (parser->isPropertyPresent("SchemaDefaultResourceGroup"))
     	parser->setProperty("SchemaDefaultResourceGroup", "schemas");

}


CEGUIDrawable::~CEGUIDrawable(void)
{
}

void CEGUIDrawable::InitCEGUI()
{
     using namespace CEGUI;
     CEGUI::SchemeManager::getSingleton().createFromFile( "TaharezLook.scheme" );
     CEGUI::System::getSingleton().getDefaultGUIContext().getMouseCursor().setDefaultImage( "TaharezLook/MouseArrow" );
     Font& defaultFont = FontManager::getSingleton().createFromFile("DejaVuSans-10.font");
     System::getSingleton().getDefaultGUIContext().setDefaultFont(&defaultFont);
    
     WindowManager& wmgr = WindowManager::getSingleton();
     Window* myRoot = (Window* )wmgr.createWindow( "DefaultWindow", "root" );
     System::getSingleton().getDefaultGUIContext().setRootWindow( myRoot );
     FrameWindow* fWnd = static_cast<FrameWindow* >(wmgr.createWindow( "TaharezLook/FrameWindow", "testWindow" ));
     myRoot->addChild( fWnd );
     fWnd->setPosition( UVector2(UDim( 0.25f,0.0f),UDim(0.25f,0.0f)));
     fWnd->setSize(USize(UDim(0.5f, 0.0f), UDim(0.5f,0.0f)));
     fWnd->setText( "Hello World!");
}

void CEGUIDrawable::drawImplementation(osg::RenderInfo& renderInfo) const
{
     CEGUI::System::getSingleton().renderAllGUIContexts();
}

3.编写CEGUIEventCallback,实现对CEGUI的事件处理

#pragma once
#include <osgGA/GUIActionAdapter>
#include <osgGA/GUIEventAdapter>
#include <osgGA/GUIEventHandler>
#include <CEGUI/System.h>
#include <CEGUI/GUIContext.h>

class CEGUIEventCallback : public osgGA::GUIEventHandler
{
public:
	CEGUIEventCallback();
	~CEGUIEventCallback(void);
public:
	virtual bool handle(const osgGA::GUIEventAdapter &ea,osgGA::GUIActionAdapter &aa);
};

 
#include "StdAfx.h"
#include "CEGUIEventCallback.h"


CEGUIEventCallback::CEGUIEventCallback()
{
}

CEGUIEventCallback::~CEGUIEventCallback(void)
{
}

bool CEGUIEventCallback::handle(const osgGA::GUIEventAdapter &ea,osgGA::GUIActionAdapter &aa)
{
	switch(ea.getEventType())
	{
	case osgGA::GUIEventAdapter::DRAG:
	case osgGA::GUIEventAdapter::MOVE:
		{
			CEGUI::System::getSingleton().getDefaultGUIContext().injectMousePosition(ea.getX(),900-ea.getY());

			//CEGUI的坐标系统跟OSG坐标系统是不一样的,如果是全屏的话,CEGUI中的0在OSG中是900(以1440*900为例),所以需要进行调整,以便CEGUI与OSG屏幕一致
			return false;
		}
	case osgGA::GUIEventAdapter::PUSH:
		{
			CEGUI::System::getSingleton().getDefaultGUIContext().injectMousePosition(ea.getX(),900-ea.getY());

			//CEGUI的坐标系统跟OSG坐标系统是不一样的,如果是全屏的话,CEGUI中的0在OSG中是900(以1440*900为例),所以需要进行调整,以便CEGUI与OSG屏幕一致
			if (ea.getButton()==osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON)
			{
				CEGUI::System::getSingleton().getDefaultGUIContext().injectMouseButtonDown(CEGUI::LeftButton);

			}
			else
			{
			}
			return false;
		}
	case osgGA::GUIEventAdapter::RELEASE:
		{
			CEGUI::System::getSingleton().getDefaultGUIContext().injectMousePosition(ea.getX(),900-ea.getY());

			//CEGUI的坐标系统跟OSG坐标系统是不一样的,如果是全屏的话,CEGUI中的0在OSG中是900(以1440*900为例),所以需要进行调整,以便CEGUI与OSG屏幕一致
			if (ea.getButton()==osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON)
			{
				CEGUI::System::getSingleton().getDefaultGUIContext().injectMouseButtonUp(CEGUI::LeftButton);
			}
			else
			{
			}
			return false;
		}
	}
	return false;
}

4.编写main函数,实现窗口渲染

#include "stdafx.h"
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include "CEGUIDrawable.h"

int _tmain(int argc, _TCHAR* argv[])
{
    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
     viewer->setThreadingModel(osgViewer::Viewer::SingleThreaded); //CEGUI仅支持单线程,必须进行设置
     viewer->realize(); //CEGUI仅支持单线程,必须进行设置
     viewer->getCamera()->getGraphicsContext()->makeCurrent(); //CEGUI仅支持单线程,必须进行设置

     osg::ref_ptr<osg::Geode> geode = new osg::Geode;
     osg::ref_ptr<CEGUIDrawable> cd = new CEGUIDrawable;
     geode->addDrawable(ceguiDrawable);
     ceguiDrawable->InitCEGUI();
     osg::ref_ptr<osg::Group> group = new osg::Group;
     group->addChild(geode);
     group->addChild(osgDB::readNodeFile("glider.osg"));
     viewer->setSceneData(group);
     return viewer->run();
}

原文出处:

转载链接

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163737.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ubuntu 卸载php「建议收藏」

    ubuntu 卸载php「建议收藏」卸载:一、删除php的相关包及配置sudoapt-getautoremovephp7*二、删除关联sudofind/etc-name”*php*”|xargsrm-rf三、清除dept列表sudoaptpurge`dpkg-l|grepphp|awk'{print$2}’|tr”\n”””`四、检查是否卸载干净(无返回就是卸载完成)dpkg-l|grepphp7.0…

    2022年5月9日
    39
  • 基于单片机的空气质量检测系统设计_单片机有难度毕业设计

    基于单片机的空气质量检测系统设计_单片机有难度毕业设计实物链接:基于单片机的空气质量检测-实物设计软件安装:Keil:点击下载 Proteus:点击下载 AD:点击下载 Visio:点击下载设计简介:本设计是基于单片机的空气质量检测设计,主要实现以下功能:可实现通过SGP30测量二氧化碳及甲醛浓度,当超过设置的最大值时,进行报警及通风和净化空气处理 可实现通过MQ-4测量甲烷浓度,当超过设置的最大值时,进行报警及通风和净化空气处理 可实现通过GP2Y10测量5浓度,当超过设置的最大值时,进行报警及通风和净化空气处理 可实现通过

    2022年10月3日
    0
  • Kafka 删除topic_kafka自动创建topic

    Kafka 删除topic_kafka自动创建topic2019独角兽企业重金招聘Python工程师标准>>>…

    2022年10月16日
    0
  • STM32CubeMX入门使用一

    STM32CubeMX入门使用一一、安装好CubeMX这个度娘中一大把。二、打开CubeMX软件—————-安装支持包和HAL库说明文档1、安装需要的芯片型号的package支持包2、找到下载的目录三、新建工程(以STM32F103ZET6为例)1、新建工程2、双击上图‘2’处就自动跳转到配置界面如下:3、先配置系统SystemCode中的RCC和SYS(特别提醒:SYS-Debug这个一定选上,否则下载程序后会禁用仿真下载口,后面就不能用这个口仿真下载

    2022年5月9日
    42
  • MySQL索引创建及使用

    MySQL索引创建及使用背景最近在深化学习数据库相关知识,借此机会总结记录一番,本来想自己总结概括一下,但是看到一篇写的简洁明了的博客,为节约时间就直接搬运过来了,有些地方加入一些自己的见解。https://blog.csdn.net/xluren/article/details/32746183关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL…

    2022年5月5日
    34
  • stm32cubemx软件库_STM32cube

    stm32cubemx软件库_STM32cube前言:本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用在我们的HAL库中,对硬件SPI函数做了很好的集成,使得之前SPI几百行代码,在HAL库中,只需要寥寥几行就可以完成那么这篇文章将带你去感受下它的优异之处,这些优异的函数,也正是HAL库的优点所在所用工具:1、芯片:STM32F103ZET62、STM32CubeMx软件3、IDE:…

    2022年8月31日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号