khanat-opennel-code/code/nel/samples/3d/cegui/main.cpp

332 lines
10 KiB
C++

/**
* \file main.cpp
* \date November 2004
* \author Matt Raykowski
* \author Henri Kuuste
*/
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "globals.h"
#include "resource.h"
//
// System Includes
//
#ifdef NL_OS_WINDOWS
# define NOMINMAX
# include <windows.h>
HINSTANCE ghInstance = 0;
#endif
#include <string>
//
// CEGUI Includes
//
#include <nel/cegui/inellibrary.h>
#include <nel/cegui/nelrenderer.h>
//#include <nel/cegui/nellogger.h>
#include <CEGUI.h>
#include "NeLDriver.h"
#include <nel/misc/hierarchical_timer.h>
#include <nel/misc/dynloadlib.h>
//
// Namespaces
//
using namespace std;
//
// NEL GLOBALS
//
NeLDriver *gDriver;
uint16 gScreenWidth;
uint16 gScreenHeight;
//
// CEGUI GLOBALS
//
//CEGUI::NeLLogger *gGuiLogger;
CEGUI::System *gGuiSystem;
CEGUI::Renderer *gGuiRenderer;
bool gStopDemo;
void createDemoWindows();
void initDemoEventWiring();
bool handleQuit(const CEGUI::EventArgs& e);
bool handleSlider(const CEGUI::EventArgs& e);
bool handleRadio(const CEGUI::EventArgs& e);
bool handleCheck(const CEGUI::EventArgs& e);
#ifndef CEGUI_DATA_DIR
#define CEGUI_DATA_DIR "datafiles"
#endif // CEGUI_DATA_DIR
#ifdef NL_OS_WINDOWS
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow ) {
ghInstance = hInstance;
#else
int main(int argc, char **argv)
{
#endif
NLMISC::CApplicationContext myApplicationContext;
try {
gScreenWidth=800;
gScreenHeight=600;
NLMISC::CPath::addSearchPath(CEGUI_DATA_DIR,true,false);
// Load the CEGUI renderer and get a handle to the library.
NLMISC::CLibrary driverLib;
if(!driverLib.loadLibrary("nelceguirenderer", true, true , true)) {
nlerror("Failed to load NeL CEGUI Renderer library.");
}
NELRENDERER_CREATE_PROC createNelRenderer = reinterpret_cast<NELRENDERER_CREATE_PROC>(driverLib.getSymbolAddress(NELRENDERER_CREATE_PROC_NAME));
// CCeguiRendererNelLibrary *nelCeguiDriverLib = dynamic_cast<CCeguiRendererNelLibrary *>(driverLib.getNelLibraryInterface());
NL3D::UDriver *driver;
// Create a driver
uint icon = 0;
#ifdef NL_OS_WINDOWS
icon = (uint)LoadIcon(ghInstance,MAKEINTRESOURCE(IDI_ICON1));
#endif
bool useD3D = false;
#ifdef NL_INDEX_BUFFER_H //new 3d
NL3D::UDriver *driver = NL3D::UDriver::createDriver(icon,useD3D);
#else
driver = NL3D::UDriver::createDriver(icon);
#endif
nlassert(driver);
nlinfo("Start initializing the 3D system");
gDriver=new NeLDriver(driver);
gDriver->init();
// start up the Gui system.
//gGuiLogger = nelCeguiDriverLib->createNelLogger();
//gGuiRenderer = new CEGUI::NeLRenderer(driver);
gGuiRenderer = createNelRenderer(driver, true);
gGuiSystem = new CEGUI::System(gGuiRenderer);
CEGUI::NeLRenderer *rndr = (CEGUI::NeLRenderer *)gGuiRenderer;
rndr->activateInput();
rndr->captureCursor(true);
// load some GUI stuff for demo.
nlinfo("Start up and configure the GUI system.");
try {
using namespace CEGUI;
Logger::getSingleton().setLoggingLevel(Insane);
// load scheme and set up defaults
SchemeManager::getSingleton().loadScheme("TaharezLook.scheme");
System::getSingleton().setDefaultMouseCursor("TaharezLook", "MouseArrow");
// create the font and set it up as the default.
FontManager::getSingleton().createFont("Commonwealth-10.font");
// load an image to use as a background
ImagesetManager::getSingleton().createImagesetFromImageFile("BackgroundImage", "GPN-2000-001437.tga");
// here we will use a StaticImage as the root, then we can use it to place a background image
Window* background = WindowManager::getSingleton().createWindow("TaharezLook/StaticImage", "background_wnd");
// set position and size
background->setPosition(UVector2(cegui_reldim(0), cegui_reldim( 0)));
background->setSize(UVector2(cegui_reldim(1), cegui_reldim( 1)));
// disable frame and standard background
background->setProperty("FrameEnabled", "false");
background->setProperty("BackgroundEnabled", "false");
// set the background image
background->setProperty("Image", "set:BackgroundImage image:full_image");
// install this as the root GUI sheet
System::getSingleton().setGUISheet(background);
// load the windows for Demo7 from the layout file.
Window* sheet = WindowManager::getSingleton().loadWindowLayout("Demo7Windows.layout");
// attach this to the 'real' root
background->addChildWindow(sheet);
initDemoEventWiring();
} catch(CEGUI::Exception) { // catch to prevent exit (errors will be logged).
;
}
NLMISC::CRGBA pClearColor(0,0,0,255);
const CEGUI::Font *fnt = gGuiSystem->getDefaultFont();
gStopDemo=false;
// BEGIN MAIN LOOP
//NLMISC::CHTimer::startBench();
//NLMISC::CHTimer frameTimer("MAIN_DemoLoop");
//NLMISC::CHTimer renderGUITimer("MAIN_RenderGUI");
while(!gStopDemo) {
//frameTimer.before();
// stop the demo if the driver stops.
if(!gDriver->getDriver().isActive()) {
gStopDemo=true;
continue;
}
gDriver->getDriver().clearBuffers(pClearColor);
// RUN UPDATES
// 3D
gDriver->update();
// handle some input
if(gDriver->getDriver().AsyncListener.isKeyPushed(NLMISC::KeyESCAPE)) {
gStopDemo=true;
}
// RUN RENDERS
// draw display
//renderGUITimer.before();
gGuiSystem->renderGUI();
//renderGUITimer.after();
// 3D
gDriver->render();
// End 3D
// 3D Swap ** ALWAYS THE LAST PART
gDriver->getDriver().swapBuffers();
if(gDriver->getDriver().AsyncListener.isKeyPushed(NLMISC::KeyF2)) {
NLMISC::CBitmap btm;
gDriver->getDriver().getBuffer(btm);
std::string filename = NLMISC::CFile::findNewFile("screenshot.jpg");
NLMISC::COFile fs(filename);
btm.writeJPG(fs);
nlinfo("Screenshot '%s' saved", filename.c_str());
}
// 3D Swap ** NOTHING AFTER THIS
//frameTimer.after();
if(gDriver->getDriver().AsyncListener.isKeyPushed(NLMISC::KeyF3)) {
NLMISC::CHTimer::display();
}
}
// END MAIN LOOP
} catch(NLMISC::Exception &e) {
fprintf (stderr,"main trapped an exception: '%s'", e.what ());
}
return 0;
}
/*************************************************************************
Sample sub-class for ListboxTextItem that auto-sets the selection brush
image.
*************************************************************************/
class MyListItem : public CEGUI::ListboxTextItem
{
public:
MyListItem(const CEGUI::String& text) : ListboxTextItem(text)
{
setSelectionBrushImage((CEGUI::utf8*)"TaharezLook", (CEGUI::utf8*)"MultiListSelectionBrush");
}
};
/*************************************************************************
Perform required event hook-ups for this demo.
*************************************************************************/
void initDemoEventWiring(void)
{
using namespace CEGUI;
WindowManager::getSingleton().getWindow("Demo7/Window1/Quit")->
subscribeEvent(PushButton::EventClicked, handleQuit);
WindowManager::getSingleton().getWindow("Demo7/Window1/Slider1")->
subscribeEvent(Slider::EventValueChanged, handleSlider);
WindowManager::getSingleton().getWindow("Demo7/Window1/Checkbox")->
subscribeEvent(Checkbox::EventCheckStateChanged, handleCheck);
WindowManager::getSingleton().getWindow("Demo7/Window1/Radio1")->
subscribeEvent(RadioButton::EventSelectStateChanged, handleRadio);
WindowManager::getSingleton().getWindow("Demo7/Window1/Radio2")->
subscribeEvent(RadioButton::EventSelectStateChanged, handleRadio);
WindowManager::getSingleton().getWindow("Demo7/Window1/Radio3")->
subscribeEvent(RadioButton::EventSelectStateChanged, handleRadio);
}
bool handleQuit(const CEGUI::EventArgs& e)
{
gStopDemo=true;
return true;
}
bool handleSlider(const CEGUI::EventArgs& e)
{
using namespace CEGUI;
float val = ((Slider*)((const WindowEventArgs&)e).window)->getCurrentValue();
((ProgressBar*)WindowManager::getSingleton().getWindow("Demo7/Window2/Progbar1"))->setProgress(val);
((ProgressBar*)WindowManager::getSingleton().getWindow("Demo7/Window2/Progbar2"))->setProgress(1.0f - val);
WindowManager::getSingleton().getWindow("root_wnd")->setAlpha(val);
return true;
}
bool handleRadio(const CEGUI::EventArgs& e)
{
using namespace CEGUI;
CEGUI::uint id = ((RadioButton*)((const WindowEventArgs&)e).window)->getSelectedButtonInGroup()->getID();
if (id == 0)
{
WindowManager::getSingleton().getWindow("Demo7/Window2/Image1")->setProperty("Image", "set:WerewolfGuiImagery image:CeguiLogo");
}
else if (id == 1)
{
WindowManager::getSingleton().getWindow("Demo7/Window2/Image1")->setProperty("Image", "set:WerewolfGuiImagery image:NeLLogo");
}
else
{
WindowManager::getSingleton().getWindow("Demo7/Window2/Image1")->setProperty("Image", "set:WerewolfGuiImagery image:WerewolfLogo");
}
return true;
}
bool handleCheck(const CEGUI::EventArgs& e)
{
using namespace CEGUI;
if (((Checkbox*)((const WindowEventArgs&)e).window)->isSelected())
{
WindowManager::getSingleton().getWindow("Demo7/Window3")->show();
}
else
{
WindowManager::getSingleton().getWindow("Demo7/Window3")->hide();
}
return true;
}