/*!**************************************************************************** @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) *****************************************************************************/