/*!****************************************************************************
@file Shell/PVRShellImpl.h
@copyright Copyright (c) Imagination Technologies Limited.
@brief Makes programming for 3D APIs easier by wrapping surface
initialization, texture allocation and other functions for use by a demo.
******************************************************************************/
#ifndef __PVRSHELLIMPL_H_
#define __PVRSHELLIMPL_H_
/*****************************************************************************
** Build options
*****************************************************************************/
/*****************************************************************************
** Macros
*****************************************************************************/
#define FREE(X) { if(X) { free(X); (X)=0; } }
#ifndef _ASSERT
#define _ASSERT(X) /**/
#endif
/*****************************************************************************
** Defines
*****************************************************************************/
#define STR_WNDTITLE (" - Build ")
/*!***************************************************************************
@struct PVRShellData
@brief Holds PVRShell internal data.
*****************************************************************************/
struct PVRShellData
{
// Shell Interface Data
char *pszAppName; /*!< Application name string. */
char *pszExitMessage; /*!< Exit message string. */
int nShellDimX; /*!< Width in pixels. */
int nShellDimY; /*!< Height in pixels. */
int nShellPosX; /*!< X position of the window. */
int nShellPosY; /*!< Y position of the window. */
bool bFullScreen; /*!< Fullscreen boolean. */
bool bLandscape; /*!< Landscape orientation boolean. false = portrait orientation. */
bool bNeedPbuffer; /*!< True if pixel buffer is needed. */
bool bNeedZbuffer; /*!< True if Z buffer is needed. */
bool bNeedStencilBuffer; /*!< True if stencil buffer is needed. */
bool bNeedPixmap; /*!< True if pixmap is needed. */
bool bNeedPixmapDisableCopy; /*!< Disables copy if true, because pixmaps are used. */
bool bLockableBackBuffer; /*!< DX9 only. Enable the use of D3DPRESENTFLAG_LOCKABLE_BACKBUFFER. */
bool bSoftwareRender; /*!< Enable the use of software rendering. */
bool bNeedAlphaFormatPre; /*!< EGL only: If true, creates the EGL surface with EGL_ALPHA_FORMAT_PRE. */
bool bUsingPowerSaving; /*!< Use power saving mode when device is not in use. */
bool bOutputInfo; /*!< Enable information to be output via PVRShellOutputDebug. For example,
the depth of the colour surface created, extenstions supported and
dimensions of the surface created. */
bool bNoShellSwapBuffer; /*!< Disable eglswapbuffers at the end of each frame. */
int nSwapInterval; /*!< Interval to wait for monitor vertical sync. */
int nInitRepeats; /*!< Number of times to reinitialise. */
int nDieAfterFrames; /*!< Set shell to quit after this number of frames (-1 to disable) */
float fDieAfterTime; /*!< Set shell to quit after this number of seconds (-1 to disable). */
int nAASamples; /*!< Number of anti-aliasing samples to have. 0 disables anti-aliasing. */
int nColorBPP; /*!< Color buffer size. */
int nDepthBPP; /*!< Depth buffer size. */
int nCaptureFrameStart; /*!< The frame to start capturing screenshots from. */
int nCaptureFrameStop; /*!< The frame to stop capturing screenshots from. */
int nCaptureFrameScale; /*!< Save screenshots scale factor. 1 for no scaling. */
int nPriority; /*!< EGL: If supported sets the egl context priority;
0 for low, 1 for med and 2 for high. */
bool bForceFrameTime; /*!< Overrides PVRShellGetTime to force specified frame time. May cause
problems if PVRShellGetTime is called multiple times in a frame. */
int nFrameTime; /*!< How long for each frame time to last (in ms). */
bool bDiscardFrameColor; /*!< Discard color data at the end of a render. */
bool bDiscardFrameDepth; /*!< Discard depth data at the end of a render. */
bool bDiscardFrameStencil; /*!< Discard stencil data at the end of a render. */
// Internal Data
bool bShellPosWasDefault; /*!< Internal. Default position for the shell was used. */
int nShellCurFrameNum; /*!< Internal. Current frame number. */
#ifdef PVRSHELL_FPS_OUTPUT
bool bOutputFPS; /*!< Output frames per second. */
#endif
};
/*!***************************************************************************
@class PVRShellCommandLine
@brief Command-line interpreter
*****************************************************************************/
class PVRShellCommandLine
{
public:
char *m_psOrig, *m_psSplit;
SCmdLineOpt *m_pOpt;
int m_nOptLen, m_nOptMax;
public:
/*!***********************************************************************
@brief Constructor
*************************************************************************/
PVRShellCommandLine();
/*!***********************************************************************
@brief Destructor
*************************************************************************/
~PVRShellCommandLine();
/*!***********************************************************************
@brief Set command-line options to pStr
@param[in] pStr Input string
*************************************************************************/
void Set(const char *pStr);
/*!***********************************************************************
@brief Prepend command-line options to m_psOrig
@param[in] pStr Input string
*************************************************************************/
void Prefix(const char *pStr);
/*!***********************************************************************
@brief Prepend command-line options to m_psOrig from a file
@param[in] pFileName Input string
*************************************************************************/
bool PrefixFromFile(const char *pFileName);
/*!***********************************************************************
@brief Parse m_psOrig for command-line options and store them in m_pOpt
*************************************************************************/
void Parse();
/*!***********************************************************************
@brief Apply the command-line options to shell
@param[in] shell
*************************************************************************/
void Apply(PVRShell &shell);
};
/*!****************************************************************************
@enum EPVRShellState
@brief Current Shell state
*****************************************************************************/
enum EPVRShellState {
ePVRShellInitApp, /*!< Initialise app */
ePVRShellInitInstance, /*!< Initialise instance */
ePVRShellRender, /*!< Render */
ePVRShellReleaseView, /*!< Release View */
ePVRShellReleaseAPI, /*!< Release API */
ePVRShellReleaseOS, /*!< Release Operating System */
ePVRShellQuitApp, /*!< Quit App */
ePVRShellExit /*!< Exit */
};
/*!***************************************************************************
@class PVRShellInit
@brief The PVRShell initialisation class
****************************************************************************/
class PVRShellInit : public PVRShellInitAPI, public PVRShellInitOS
{
public:
friend class PVRShell;
friend class PVRShellInitOS;
friend class PVRShellInitAPI;
PVRShell *m_pShell; /*!< Our PVRShell class */
PVRShellCommandLine m_CommandLine; /*!< Our Command-line class */
bool gShellDone; /*!< Indicates that the application has finished */
EPVRShellState m_eState; /*!< Current PVRShell state */
// Key handling
PVRShellKeyName nLastKeyPressed; /*!< Holds the last key pressed */
PVRShellKeyName m_eKeyMapLEFT; /*!< Holds the value to be returned when PVRShellKeyNameLEFT is requested */
PVRShellKeyName m_eKeyMapUP; /*!< Holds the value to be returned when PVRShellKeyNameUP is requested */
PVRShellKeyName m_eKeyMapRIGHT; /*!< Holds the value to be returned when PVRShellKeyNameRIGHT is requested */
PVRShellKeyName m_eKeyMapDOWN; /*!< Holds the value to be returned when PVRShellKeyNameDOWN is requested */
// Read and Write path
char *m_pReadPath; /*!<Holds the path where the application will read the data from */
char *m_pWritePath; /*!<Holds the path where the application will write the data to */
#ifdef PVRSHELL_FPS_OUTPUT
// Frames per second (FPS)
int m_i32FpsFrameCnt, m_i32FpsTimePrev;
#endif
public:
protected:
float m_vec2PointerLocation[2];
float m_vec2PointerLocationStart[2];
float m_vec2PointerLocationEnd[2];
// Touch handling
bool m_bTouching;
public:
/*!***********************************************************************
@brief Constructor
*************************************************************************/
PVRShellInit();
/*!***********************************************************************
@brief Destructor
*************************************************************************/
~PVRShellInit();
/*!***********************************************************************
@brief PVRShell Initialisation.
@return True on success and false on failure
*************************************************************************/
bool Init();
/*!***********************************************************************
@brief PVRShell Deinitialisation.
*************************************************************************/
void Deinit();
/*!***********************************************************************
@param[in] str A string containing the command-line
@brief Receives the command-line from the application.
*************************************************************************/
void CommandLine(const char *str);
/*!***********************************************************************
@brief Receives the command-line from the application.
@param[in] argc Number of strings in argv
@param[in] argv An array of strings
*************************************************************************/
void CommandLine(int argc, char **argv);
/*!***********************************************************************
@brief Return 'true' if the specific key has been pressed.
@param[in] key The key we're querying for
*************************************************************************/
bool DoIsKeyPressed(const PVRShellKeyName key);
/*!***********************************************************************
@param[in] key The key that has been pressed
@brief Used by the OS-specific code to tell the Shell that a key has been pressed.
*************************************************************************/
void KeyPressed(PVRShellKeyName key);
/*!***********************************************************************
@brief Used by the OS-specific code to tell the Shell that a touch has began at a location.
@param[in] vec2Location The position of a click/touch on the screen when it first touches.
*************************************************************************/
void TouchBegan(const float vec2Location[2]);
/*!***********************************************************************
@brief Used by the OS-specific code to tell the Shell that a touch has began at a location.
@param[in] vec2Location The position of the pointer/touch pressed on the screen.
*************************************************************************/
void TouchMoved(const float vec2Location[2]);
/*!***********************************************************************
@brief Used by the OS-specific code to tell the Shell that the current touch has ended at a location.
@param[in] vec2Location The position of the pointer/touch on the screen when it is released.
*************************************************************************/
void TouchEnded(const float vec2Location[2]);
/*!***********************************************************************
@brief Used by the OS-specific code to tell the Shell where to read external files from.
@return A path the application is capable of reading from.
*************************************************************************/
const char *GetReadPath() const;
/*!***********************************************************************
@brief Used by the OS-specific code to tell the Shell where to write to.
@return A path the applications is capable of writing to
*************************************************************************/
const char *GetWritePath() const;
/*!******************************************************************************
@brief Sets the default app name (to be displayed by the OS)
@param[in] str The application name
*******************************************************************************/
void SetAppName(const char * const str);
/*!***********************************************************************
@brief Set the path to where the application expects to read from.
@param[in] str The read path
*************************************************************************/
void SetReadPath(const char * const str);
/*!***********************************************************************
@brief Set the path to where the application expects to write to.
@param[in] str The write path
*************************************************************************/
void SetWritePath(const char * const str);
/*!***********************************************************************
@brief Called from the OS-specific code to perform the render.
When this function fails the application will quit.
*************************************************************************/
bool Run();
/*!***********************************************************************
@brief When prefOutputInfo is set to true this function outputs
various pieces of non-API dependent information via
PVRShellOutputDebug.
*************************************************************************/
void OutputInfo();
/*!***********************************************************************
@brief When prefOutputInfo is set to true this function outputs
various pieces of API dependent information via
PVRShellOutputDebug.
*************************************************************************/
void OutputAPIInfo();
#ifdef PVRSHELL_FPS_OUTPUT
/*!****************************************************************************
@brief Calculates a value for frames-per-second (FPS).
*****************************************************************************/
void FpsUpdate();
#endif
/*
OS functionality
*/
/*!***********************************************************************
@brief Initialisation for OS-specific code.
*************************************************************************/
void OsInit();
/*!***********************************************************************
@brief Saves instance handle and creates main window
In this function, we save the instance handle in a global variable and
create and display the main program window.
*************************************************************************/
bool OsInitOS();
/*!***********************************************************************
@brief Destroys main window
*************************************************************************/
void OsReleaseOS();
/*!***********************************************************************
@brief Destroys main window
*************************************************************************/
void OsExit();
/*!***********************************************************************
@brief Perform API initialization and bring up window / fullscreen
*************************************************************************/
bool OsDoInitAPI();
/*!***********************************************************************
@brief Clean up after we're done
*************************************************************************/
void OsDoReleaseAPI();
/*!***********************************************************************
@brief Main message loop / render loop
*************************************************************************/
void OsRenderComplete();
/*!***********************************************************************
@brief When using pixmaps, copy the render to the display
*************************************************************************/
bool OsPixmapCopy();
/*!***********************************************************************
@brief Called from InitAPI() to get the NativeDisplayType
*************************************************************************/
void *OsGetNativeDisplayType();
/*!***********************************************************************
@brief Called from InitAPI() to get the NativePixmapType
*************************************************************************/
void *OsGetNativePixmapType();
/*!***********************************************************************
@brief Called from InitAPI() to get the NativeWindowType
*************************************************************************/
void *OsGetNativeWindowType();
/*!***********************************************************************
@brief Retrieves OS-specific data
@param[in] prefName Name of preference to get
@param[out] pn A pointer set to the preference.
@return true on success
*************************************************************************/
bool OsGet(const prefNameIntEnum prefName, int *pn);
/*!***********************************************************************
@brief Retrieves OS-specific data
@param[in] prefName Name of value to get
@param[out] pp A pointer set to the value asked for
@return true on success
*************************************************************************/
bool OsGet(const prefNamePtrEnum prefName, void **pp);
/*!***********************************************************************
@brief Sets OS-specific data
@param[in] prefName Name of preference to set to value
@param[in] value Value
@return true for success
*************************************************************************/
bool OsSet(const prefNameBoolEnum prefName, const bool value);
/*!***********************************************************************
@brief Sets OS-specific data
@param[in] prefName Name of value to set
@param[in] i32Value The value to set our named value to
@return true on success
*************************************************************************/
bool OsSet(const prefNameIntEnum prefName, const int i32Value);
/*!***********************************************************************
@brief Prints a debug string
@param[in] str The debug string to display
*************************************************************************/
void OsDisplayDebugString(char const * const str);
/*!***********************************************************************
@brief Gets the time in milliseconds
*************************************************************************/
unsigned long OsGetTime();
/*
API functionality
*/
/*!***********************************************************************
@brief Initialisation for API-specific code.
*************************************************************************/
bool ApiInitAPI();
/*!***********************************************************************
@brief Releases all resources allocated by the API.
*************************************************************************/
void ApiReleaseAPI();
/*!***********************************************************************
@brief API-specific function to store the current content of the
FrameBuffer into the memory allocated by the user.
@param[in] Width Width of the region to capture
@param[in] Height Height of the region to capture
@param[out] pBuf A buffer to put the screen capture into
@return true on success
*************************************************************************/
bool ApiScreenCaptureBuffer(int Width,int Height,unsigned char *pBuf);
/*!***********************************************************************
@brief Perform API operations required after a frame has finished (e.g., flipping).
*************************************************************************/
void ApiRenderComplete();
/*!***********************************************************************
@brief Set preferences which are specific to the API.
@param[in] prefName Name of preference to set
@param[out] i32Value Value to set it to
*************************************************************************/
bool ApiSet(const prefNameIntEnum prefName, const int i32Value);
/*!***********************************************************************
@brief Get parameters which are specific to the API.
@param[in] prefName Name of value to get
@param[out] pn A pointer set to the value asked for
*************************************************************************/
bool ApiGet(const prefNameIntEnum prefName, int *pn);
/*!***********************************************************************
@brief Get parameters which are specific to the API.
@param[in] prefName Name of value to get
@param[out] pp A pointer set to the value asked for
*************************************************************************/
bool ApiGet(const prefNamePtrEnum prefName, void **pp);
/*!***********************************************************************
@brief Run specific API code to perform the operations requested in preferences.
*************************************************************************/
void ApiActivatePreferences();
};
#endif /* __PVRSHELLIMPL_H_ */
/*****************************************************************************
End of file (PVRShellImpl.h)
*****************************************************************************/