Cinder

  • Main Page
  • Related Pages
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

include/cinder/app/AppBasic.h

Go to the documentation of this file.
00001 /*
00002  Copyright (c) 2010, The Barbarian Group
00003  All rights reserved.
00004 
00005  Redistribution and use in source and binary forms, with or without modification, are permitted provided that
00006  the following conditions are met:
00007 
00008     * Redistributions of source code must retain the above copyright notice, this list of conditions and
00009     the following disclaimer.
00010     * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
00011     the following disclaimer in the documentation and/or other materials provided with the distribution.
00012 
00013  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
00014  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
00015  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
00016  ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
00017  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00018  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00019  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00020  POSSIBILITY OF SUCH DAMAGE.
00021 */
00022 
00023 #pragma once
00024 
00025 #include "cinder/app/App.h"
00026 #include "cinder/Display.h"
00027 
00028 #if defined( CINDER_MAC )
00029     #include <OpenGL/CGLTypes.h>
00030     #ifdef __OBJC__
00031         @class AppImplCocoaBasic;
00032     #else
00033         class AppImplCocoaBasic;
00034     #endif
00035 #endif
00036 
00037 
00038 namespace cinder { namespace app {
00039 
00040 class AppBasic : public App {
00041  public:
00042     class Settings : public App::Settings {
00043      public:
00044         Settings();
00045 
00046         void    setShouldQuit ( bool aShouldQuit = true );
00047         void    setFullScreenSize( int aFullScreenSizeX, int aFullScreenSizeY );
00048         void    setFullScreen( bool aFullScreen = true );
00049         void    setResizable( bool aResizable = true );
00050 
00051         int     getFullScreenWidth() const { return mFullScreenSizeX; }
00052         int     getFullScreenHeight() const { return mFullScreenSizeY; }
00053 
00055         Display*    getDisplay() const { return mDisplay; }
00056         void        setDisplay( shared_ptr<Display> aDisplay );
00057      private:
00058         int         mFullScreenSizeX, mFullScreenSizeY;
00059         Display     *mDisplay;
00060     };
00061 
00062  public:
00063     AppBasic();
00064     virtual ~AppBasic();
00065 
00066     virtual void            prepareSettings( Settings *settings ) {}
00067 
00069     virtual int     getWindowWidth() const;
00071     void            setWindowWidth( int windowWidth );
00073     virtual int     getWindowHeight() const;
00075     void            setWindowHeight( int windowHeight );
00077     void            setWindowSize( int windowWidth, int windowHeight );
00078 
00080     virtual float       getFrameRate() const;
00082     virtual void        setFrameRate( float frameRate );
00084     virtual bool        isFullScreen() const;
00086     virtual void        setFullScreen( bool fullScreen );
00087 
00089     Vec2i               getMousePos() const;
00091     void                hideCursor();
00093     void                showCursor();
00094 
00095     const Settings&     getSettings() const { return mSettings; }
00096     const Display&      getDisplay();
00097 
00099     virtual void        quit();
00100 
00102     virtual std::string         getAppPath();
00103 
00104 #if defined( CINDER_MAC )
00105     void                privateSetImpl__( AppImplCocoaBasic *aImpl );
00106 #elif defined( CINDER_MSW )
00107     virtual bool        getsWindowsPaintEvents() { return true; }
00108 #endif
00109     
00111     static AppBasic*    get()   { return sInstance; }
00112 
00114     // These are called by application instantation macros and are only used in the launch process
00115     static void     prepareLaunch() { App::prepareLaunch(); }
00116     static void     executeLaunch( AppBasic *app, class Renderer *renderer, const char *title, int argc, char * const argv[] ) { sInstance = app; App::executeLaunch( app, renderer, title, argc, argv ); }
00117     static void     cleanupLaunch() { App::cleanupLaunch(); }
00118     
00119     virtual void    launch( const char *title, int argc, char * const argv[] );
00121 
00123     virtual void    privateResize__( int width, int height );
00125 
00126  private:
00127  
00128     static AppBasic*    sInstance;
00129 
00130 #if defined( CINDER_MAC )
00131     AppImplCocoaBasic       *mImpl;
00132 #elif defined( CINDER_MSW )
00133     class AppImplMswBasic   *mImpl;
00134     friend class AppImplMswBasic;
00135 #endif
00136 
00137     Settings        mSettings;
00138 };
00139 
00140 } } // namespace cinder::app
00141 
00142 // App-instantiation macros
00143 
00144 #if defined( CINDER_MAC )
00145     #define CINDER_APP_BASIC( APP, RENDERER )                               \
00146     int main( int argc, char * const argv[] ) {                             \
00147         cinder::app::AppBasic::prepareLaunch();                             \
00148         cinder::app::AppBasic *app = new APP;                               \
00149         cinder::app::Renderer *ren = new RENDERER;                          \
00150         cinder::app::AppBasic::executeLaunch( app, ren, #APP, argc, argv ); \
00151         cinder::app::AppBasic::cleanupLaunch();                             \
00152         return 0;                                                           \
00153     }
00154 #elif defined( CINDER_MSW )
00155     #define CINDER_APP_BASIC( APP, RENDERER )                                                       \
00156     int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) {  \
00157         cinder::app::AppBasic::prepareLaunch();                                                     \
00158         cinder::app::AppBasic *app = new APP;                                                       \
00159         cinder::app::Renderer *ren = new RENDERER;                                                  \
00160         cinder::app::AppBasic::executeLaunch( app, ren, #APP, -1, 0 );                              \
00161         cinder::app::AppBasic::cleanupLaunch();                                                     \
00162         return 0;                                                                                   \
00163     }
00164 #endif