blender/source/gameengine/GamePlayer/ghost/GPG_Application.h
Dalai Felinto c56fe3efe6 Patch [#26799] 2.5x blenderplayer (BGE) anti-aliasing & embedding by Sebastian Korczak (with some small tweaks) + adding GHOST_PRINTF
The patch can also be found in http://codereview.appspot.com/4431072/

##############
This patch fix anti-aliasing (multisampling) implementation for win32 platform. It also gives opportunity to embed blenderplayer inside parent window.

Usage:
blenderplayer.exe -i 123456 -m 16 file.blend

where:
123456 - parent window handler (integer, default: 0)
16 - multisample level (integer, default: 0, max: 16. Put there maximum level you want. If not supported, player will automatically try 15,14,13,...,3,2,1)
##############

This patch was originally created as part of the Burster (aka webplugin) project but benefit any one embedding the bge in a custom OpenGL context. By the way, to embed the BGE in a .Net application is really straightforward now =)
The Multisampling work for blenderplayer as a whole.

Missing functionalities:
- to expose the multisampling to the ui (so far it only works in console)
- window focus and keyboard messages for embedded blenderplayer (supported in their previous patch for 2.49, yet to be ported over)
- handle resizing (to be investigated, indeed the changes in getState() in GHOST_WindowWin32.cpp are going to get in the way of that if I'm not mistaken. To be addressed together.

Doxygen documentation to be added whenever I sort out how to do so. Sorry Nathan too many stuff to deal with at the same time. The sooner this patch gets in, the sooner the missing functionalities can be patched on top of that.
2011-05-04 01:50:17 +00:00

164 lines
4.8 KiB
C++

/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
* All rights reserved.
*
* The Original Code is: all of this file.
*
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
*/
/** \file GPG_Application.h
* \ingroup player
* \brief GHOST Blender Player application declaration file.
*/
#include "GHOST_IEventConsumer.h"
#include "STR_String.h"
#ifdef WIN32
#include <wtypes.h>
#endif
class KX_KetsjiEngine;
class KX_ISceneConverter;
class NG_LoopBackNetworkDeviceInterface;
class RAS_IRasterizer;
class GHOST_IEvent;
class GHOST_ISystem;
class GHOST_ITimerTask;
class GHOST_IWindow;
class GPC_MouseDevice;
class GPC_RenderTools;
class GPG_Canvas;
class GPG_KeyboardDevice;
class GPG_System;
struct Main;
struct Scene;
class GPG_Application : public GHOST_IEventConsumer
{
public:
GPG_Application(GHOST_ISystem* system);
~GPG_Application(void);
bool SetGameEngineData(struct Main* maggie, struct Scene* scene, int argc, char** argv);
bool startWindow(STR_String& title, int windowLeft, int windowTop, int windowWidth, int windowHeight,
const bool stereoVisual, const int stereoMode, const GHOST_TUns16 samples=0);
bool startFullScreen(int width, int height, int bpp, int frequency, const bool stereoVisual, const int stereoMode, const GHOST_TUns16 samples=0);
bool startEmbeddedWindow(STR_String& title, const GHOST_TEmbedderWindowID parent_window, const bool stereoVisual, const int stereoMode, const GHOST_TUns16 samples=0);
#ifdef WIN32
bool startScreenSaverFullScreen(int width, int height, int bpp, int frequency, const bool stereoVisual, const int stereoMode, const GHOST_TUns16 samples=0);
bool startScreenSaverPreview(HWND parentWindow, const bool stereoVisual, const int stereoMode, const GHOST_TUns16 samples=0);
#endif
virtual bool processEvent(GHOST_IEvent* event);
int getExitRequested(void);
const STR_String& getExitString(void);
bool StartGameEngine(int stereoMode);
void StopGameEngine();
protected:
bool handleWheel(GHOST_IEvent* event);
bool handleButton(GHOST_IEvent* event, bool isDown);
bool handleCursorMove(GHOST_IEvent* event);
bool handleKey(GHOST_IEvent* event, bool isDown);
/**
* Initializes the game engine.
*/
bool initEngine(GHOST_IWindow* window, int stereoMode);
/**
* Starts the game engine.
*/
bool startEngine(void);
/**
* Stop the game engine.
*/
void stopEngine(void);
/**
* Shuts the game engine down.
*/
void exitEngine(void);
/* The game data */
STR_String m_startSceneName;
struct Scene* m_startScene;
struct Main* m_maggie;
/* Exit state. */
int m_exitRequested;
STR_String m_exitString;
/* GHOST system abstraction. */
GHOST_ISystem* m_system;
/* Main window. */
GHOST_IWindow* m_mainWindow;
/* Timer to advance frames. */
GHOST_ITimerTask* m_frameTimer;
/* The cursor shape displayed. */
GHOST_TStandardCursor m_cursor;
/** Engine construction state. */
bool m_engineInitialized;
/** Engine state. */
bool m_engineRunning;
/** Running on embedded window */
bool m_isEmbedded;
/** the gameengine itself */
KX_KetsjiEngine* m_ketsjiengine;
/** The game engine's system abstraction. */
GPG_System* m_kxsystem;
/** The game engine's keyboard abstraction. */
GPG_KeyboardDevice* m_keyboard;
/** The game engine's mouse abstraction. */
GPC_MouseDevice* m_mouse;
/** The game engine's canvas abstraction. */
GPG_Canvas* m_canvas;
/** The game engine's platform dependent render tools. */
GPC_RenderTools* m_rendertools;
/** the rasterizer */
RAS_IRasterizer* m_rasterizer;
/** Converts Blender data files. */
KX_ISceneConverter* m_sceneconverter;
/** Network interface. */
NG_LoopBackNetworkDeviceInterface* m_networkdevice;
bool m_blendermat;
bool m_blenderglslmat;
/*
* GameLogic.globalDict as a string so that loading new blend files can use the same dict.
* Do this because python starts/stops when loading blend files.
*/
char* m_pyGlobalDictString;
int m_pyGlobalDictString_Length;
/* argc and argv need to be passed on to python */
int m_argc;
char** m_argv;
};