CEGUI Window环境编译

Posted 林多

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CEGUI Window环境编译相关的知识,希望对你有一定的参考价值。

CEGUI编译

  • 平台:Window
  • CEGUI版本:0.8.7
  • 前提:Visual Studio任意版本(本文为2013)

CEGUI源码下载

登录CEGUI官网网站:
http://cegui.org.uk/download
下载CEGUI0.8.7源码+ 0.8.X Dependencies

  • 下载完成后,解压(例:这里我解压到了D:/Myproject/Coding/CEGUI)
  • cegui-0.8.7是cegui的源码。cegui-dependencies-0.8.x 是cegui 0.8.x版本所需要的编译运行依赖环境。

编译cegui-dependicies-0.8.x

  • 使用CMake编译起来非常方便,由于之后要编译为Visual Studio 2013可用项目。所以需要前安装 vs 2013。当然安装其他任意版本的vs也可以。
  • 打开CMake,讲source和build目录设置为,cegui-dependicies-0.8.x目录。然后点击 “Configure”,在弹出的对话框选择“visual studio 2013对应的版本”,再次点击 configure。
  • 点击“Generate”
  • 点击open project,使用vs 2013打开项目 ,然后“生成解决方案”(release版)。然后将cegui-dependencies-0.8.x目录下的“dependecies”拷贝到“D:\\Myproject\\Coding\\CEGUI\\cegui-0.8.7”目录下面。

编译CEGUI

  • 该步骤,与编译cegui-dependicies-0.8.x一致。使用CMake将,Source和Build设置为“D:\\Myproject\\Coding\\CEGUI\\cegui-0.8.7”。然后使用 VS2013打开,生成解决项目。
  • 将dependecies目录设置为Path环境变量(例:"D:\\Myproject\\Coding\\CEGUI\\cegui-0.8.7\\dependencies\\bin"目录)。
  • 重启或注销电脑。

使用CEGUI自带SampleFramework

  • CEGUI写了一套Sample框架,用一套框架运行多个SampleDemo。
  • 将“CEGUISampleFramework-0.8”设置为启动项目,编译然后运行,如下图。
  • 由于CEGUI提供了,SampleFrameWork,要花一定时间分析单个Demo是如何启动的。下面分析完成后,参考sampleFrameWork写的一段,可以运行的Demo.
#include "CEGUI/RendererModules/OpenGL/GL.h"
#include "CEGUI/CEGUI.h"
#include "CEGUI/RenderTarget.h"
#include <GL/glfw.h>
#include <stdexcept>
#include <sstream>


#include <iostream>
#include "CEGUI/RendererModules/OpenGL/GLRenderer.h"

/*************************************************************************
    Sample specific initialisation goes here.
*************************************************************************/
bool HelloWorldDemo::initialise(CEGUI::GUIContext* guiContext)

    using namespace CEGUI;

     d_usedFiles = CEGUI::String(__FILE__);

    // CEGUI relies on various systems being set-up, so this is what we do
    // here first.
    //
    // The first thing to do is load a CEGUI 'scheme' this is basically a file
    // that groups all the required resources and definitions for a particular
    // skin so they can be loaded / initialised easily
    //
    // So, we use the SchemeManager singleton to load in a scheme that loads the
    // imagery and registers widgets for the TaharezLook skin.  This scheme also
    // loads in a font that gets used as the system default.
    SchemeManager::getSingleton().createFromFile("TaharezLook.scheme");

    // The next thing we do is to set a default mouse cursor image.  This is
    // not strictly essential, although it is nice to always have a visible
    // cursor if a window or widget does not explicitly set one of its own.
    //
    // The TaharezLook Imageset contains an Image named "MouseArrow" which is
    // the ideal thing to have as a defult mouse cursor image.
    guiContext->getMouseCursor().setDefaultImage("TaharezLook/MouseArrow");

    // Now the system is initialised, we can actually create some UI elements, for
    // this first example, a full-screen 'root' window is set as the active GUI
    // sheet, and then a simple frame window will be created and attached to it.

    // All windows and widgets are created via the WindowManager singleton.
    WindowManager& winMgr = WindowManager::getSingleton();

    // Here we create a "DefaultWindow".  This is a native type, that is, it does
    // not have to be loaded via a scheme, it is always available.  One common use
    // for the DefaultWindow is as a generic container for other windows.  Its
    // size defaults to 1.0f x 1.0f using the Relative metrics mode, which means
    // when it is set as the root GUI sheet window, it will cover the entire display.
    // The DefaultWindow does not perform any rendering of its own, so is invisible.
    //
    // Create a DefaultWindow called 'Root'.
    d_root = (DefaultWindow*)winMgr.createWindow("DefaultWindow", "Root");

    // load font and setup default if not loaded via scheme
    Font& defaultFont = FontManager::getSingleton().createFromFile("DejaVuSans-12.font");
    // Set default font for the gui context
    guiContext->setDefaultFont(&defaultFont);

    // Set the root window as root of our GUI Context
    guiContext->setRootWindow(d_root);

    // A FrameWindow is a window with a frame and a titlebar which may be moved around
    // and resized.
    //
    // Create a FrameWindow in the TaharezLook style, and name it 'Demo Window'
    FrameWindow* wnd = (FrameWindow*)winMgr.createWindow("TaharezLook/FrameWindow", "Demo Window");

    // Here we attach the newly created FrameWindow to the previously created
    // DefaultWindow which we will be using as the root of the displayed gui.
    d_root->addChild(wnd);

    // Windows are in Relative metrics mode by default.  This means that we can
    // specify sizes and positions without having to know the exact pixel size
    // of the elements in advance.  The relative metrics mode co-ordinates are
    // relative to the parent of the window where the co-ordinates are being set.
    // This means that if 0.5f is specified as the width for a window, that window
    // will be half as its parent window.
    //
    // Here we set the FrameWindow so that it is half the size of the display,
    // and centered within the display.
    wnd->setPosition(UVector2(cegui_reldim(0.0f), cegui_reldim( 0.0f)));
    wnd->setSize(USize(cegui_reldim(1.0f), cegui_reldim(1.0f)));

    // now we set the maximum and minum sizes for the new window.  These are
    // specified using relative co-ordinates, but the important thing to note
    // is that these settings are aways relative to the display rather than the
    // parent window.
    //
    // here we set a maximum size for the FrameWindow which is equal to the size
    // of the display, and a minimum size of one tenth of the display.
    wnd->setMaxSize(USize(cegui_reldim(1.0f), cegui_reldim( 1.0f)));
    wnd->setMinSize(USize(cegui_reldim(0.1f), cegui_reldim( 0.1f)));

    // As a final step in the initialisation of our sample window, we set the window's
    // text to "Hello World!", so that this text will appear as the caption in the
    // FrameWindow's titlebar.
    wnd->setText("Hello World Linduo!");

    wnd->subscribeEvent(CEGUI::Window::EventMouseClick,  Event::Subscriber(&HelloWorldDemo::handleHelloWorldClicked, this));

    // return true so that the samples framework knows that initialisation was a
    // success, and that it should now run the sample.
    return true;



/*************************************************************************
    Cleans up resources allocated in the initialiseSample call.
*************************************************************************/
void HelloWorldDemo::deinitialise()



bool HelloWorldDemo::handleHelloWorldClicked(const CEGUI::EventArgs&)

    std::cout << "Hello World!" << std::endl;
	std::cout << "Test For me" << std::endl;

    return false;


/*************************************************************************
    Define the module function that returns an instance of the sample
*************************************************************************/
extern "C" SAMPLE_EXPORT Sample& getSampleInstance()

    static HelloWorldDemo sample;
    return sample;

const char d_windowTitle[] = "Crazy Eddie's GUI Mk-2 - Sample Application";


void initCEGUI()

	using namespace CEGUI;

	// create renderer and enable extra states
	OpenGLRenderer& cegui_renderer = OpenGLRenderer::create(Sizef(800.f, 600.f));
	cegui_renderer.enableExtraStateSettings(true);

	// create CEGUI system object
	CEGUI::System::create(cegui_renderer);

	// setup resource directories
	DefaultResourceProvider* rp = static_cast<DefaultResourceProvider*>(System::getSingleton().getResourceProvider());
	rp->setResourceGroupDirectory("schemes", "../../datafiles/schemes/");
	rp->setResourceGroupDirectory("imagesets", "../../datafiles/imagesets/");
	rp->setResourceGroupDirectory("fonts", "../../datafiles/fonts/");
	rp->setResourceGroupDirectory("layouts", "../../datafiles/layouts/");
	rp->setResourceGroupDirectory("looknfeels", "../../datafiles/looknfeel/");
	rp->setResourceGroupDirectory("lua_scripts", "../../datafiles/lua_scripts/");
	rp->setResourceGroupDirectory("schemas", "../../datafiles/xml_schemas/");

	// set default resource groups
	ImageManager::setImagesetDefaultResourceGroup("imagesets");
	Font::setDefaultResourceGroup("fonts");
	Scheme::setDefaultResourceGroup("schemes");
	WidgetLookManager::setDefaultResourceGroup("looknfeels");
	WindowManager::setDefaultResourceGroup("layouts");
	ScriptModule::setDefaultResourceGroup("lua_scripts");

	XMLParser* parser = System::getSingleton().getXMLParser();
	if (parser->isPropertyPresent("SchemaDefaultResourceGroup"))
		parser->setProperty("SchemaDefaultResourceGroup", "schemas");

	// load TaharezLook scheme and DejaVuSans-10 font
	SchemeManager::getSingleton().createFromFile("TaharezLook.scheme", "schemes");
	FontManager::getSingleton().createFromFile("DejaVuSans-10.font");

	// set default font and cursor image and tooltip type
	System::getSingleton().getDefaultGUIContext().setDefaultFont("DejaVuSans-10");
	System::getSingleton().getDefaultGUIContext().getMouseCursor().setDefaultImage("TaharezLook/MouseArrow");
	System::getSingleton().getDefaultGUIContext().setDefaultTooltipType("TaharezLook/Tooltip");


void initWindows()

	using namespace CEGUI;

	/
	// Add your gui initialisation code in here.
	// You should preferably use layout loading because you won't
	// have to recompile everytime you change the layout. But you
	// can also use static window creation code here, of course.
	/

	// load layout
	Window* root = WindowManager::getSingleton().loadLayoutFromFile("application_templates.layout");
	System::getSingleton().getDefaultGUIContext().setRootWindow(root);


static void GLFWCALL glfwWindowResizeCallback(int width, int height)

	CEGUI::System::getSingleton().notifyDisplaySizeChanged(
		CEGUI::Sizef(static_cast<float>(width), static_cast<float>(height)));
	glViewport(0, 0, width, height);


int main()

    //Init fw init
    if (glfwInit() != GL_TRUE)
        CEGUI_THROW(RendererException("Failed to initialise GLFW."));
    glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 1);
    glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 2);

	if (glfwOpenWindow(800, 600, 0, 0, 0, 0,
          24, 8, GLFW_WINDOW) != GL_TRUE)
    
        CEGUI_THROW(RendererException("Failed to open GLFW window."));
        glfwTerminate();
    
    glfwEnable (GLFW_KEY_REPEAT);

    glfwSetWindowTitle(d_windowTitle);
    //Deactivate VSYNC
    glfwSwapInterval(0);
    // Disable the mouse position in Non_Debug mode
#ifndef DEBUG
    glfwDisable(GLFW_MOUSE_CURSOR);
#endif
    // Clear Errors by GLFW, even if Setup is correct.
    glGetError();

	initCEGUI();

#if 0
    // Input callbacks of glfw for CEGUI
    glfwSetKeyCallback(glfwKeyCallback);
    glfwSetCharCallback(glfwCharCallback);
    glfwSetMouseButtonCallback(glfwMouseButtonCallback);
    glfwSetMouseWheelCallback(glfwMouseWheelCallback);
    glfwSetMousePosCallback(glfwMousePosCallback);

    //Window callbacks
    glfwSetWindowCloseCallback(glfwWindowCloseCallback);
	
#endif
	glfwSetWindowSizeCallback(glfwWindowResizeCallback);
    
	CEGUI::System::getSingleton().notifyDisplaySizeChanged(CEGUI::Sizef(800.f, 600.f));
	glViewport(0, 0, 800, 600);
	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
	// initWindows();

	HelloWorldDemo demo;
	CEGUI::GUIContext* conext = &CEGUI::System::getSingleton().getDefaultGUIContext();

	demo.initialise(conext);

	float time = glfwGetTime();

	CEGUI::OpenGLRenderer* renderer = static_cast<CEGUI::OpenGLRenderer*>(CEGUI::System::getSingleton().getRenderer());

	while (true && glfwGetWindowParam(GLFW_OPENED))
    
		glClear(GL_COLOR_BUFFER_BIT);

		// inject time pulses
		const float newtime = glfwGetTime();
		const float time_elapsed = newtime - time;
		CEGUI::System::getSingleton().injectTimePulse(time_elapsed);
		CEGUI::System::getSingleton().getDefaultGUIContext().injectTimePulse(time_elapsed);
		time = newtime;
		// render gui
		renderer->beginRendering();
		CEGUI::System::getSingleton().renderAllGUIContexts();
		renderer->endRendering();

		glfwSwapBuffers();
    
    return 0;

以上是关于CEGUI Window环境编译的主要内容,如果未能解决你的问题,请参考以下文章

CEGUI Window环境编译

Win7 64位 VS2015环境编译cegui-0.8.5

CEGUI Log系统

用vs2010编译cegui时,CEGUICoronaImageCodec项出错

VS2012中使用CEGUI项目发布到XP平台的问题(核心方法就一句话。“你项目使用的所有外部依赖库都用/MT编译。”)

CEGUILog系统