00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #pragma once
00024
00025 #include "cinder/Cinder.h"
00026 #include "cinder/app/Renderer.h"
00027 #include "cinder/Vector.h"
00028 #include "cinder/app/MouseEvent.h"
00029 #include "cinder/app/KeyEvent.h"
00030 #include "cinder/app/FileDropEvent.h"
00031 #include "cinder/Stream.h"
00032 #include "cinder/Display.h"
00033 #include "cinder/DataSource.h"
00034 #include "cinder/Timer.h"
00035 #if defined( CINDER_COCOA )
00036 #if defined( CINDER_COCOA_TOUCH )
00037 #if defined( __OBJC__ )
00038 #import <UIKit/UIKit.h>
00039 #import <CoreFoundation/CoreFoundation.h>
00040 #endif
00041 #else
00042 #include <ApplicationServices/ApplicationServices.h>
00043 #endif
00044 #if defined __OBJC__
00045 @class CinderView;
00046 @class AppImplCocoaRendererQuartz;
00047 @class AppImplCocoaRendererGl;
00048 #else
00049 class AppImplCocoaRendererQuartz;
00050 class AppImplCocoaRendererGl;
00051 #endif
00052
00053 #elif defined( CINDER_MSW )
00054 #include "cinder/msw/OutputDebugStringStream.h"
00055 #endif
00056
00057 #include <vector>
00058
00059 namespace cinder { namespace app {
00060
00061 class App {
00062 public:
00063 class Settings {
00064 public:
00065
00066 bool isPrepared() const { return !mShouldQuit; };
00067
00069 void setWindowSize( int aWindowSizeX, int aWindowSizeY );
00070
00072 void setFrameRate( float aFrameRate );
00073
00075 void enablePowerManagement( bool aPowerManagement = true );
00076
00078 bool isFullScreen() const { return mFullScreen; }
00080 int getWindowWidth() const { return mWindowSizeX; }
00082 int getWindowHeight() const { return mWindowSizeY; }
00084 Vec2i getWindowSize() const { return Vec2i( mWindowSizeX, mWindowSizeY ); }
00086 Area getWindowBounds() const { return Area( 0, 0, mWindowSizeX, mWindowSizeY ); }
00088 void setTitle( const std::string &title ) { mTitle = title; }
00089
00091 float getFrameRate() const { return mFrameRate; }
00093 bool isResizable() const { return mResizable; }
00095 bool getPowerManagement() const { return mPowerManagement; }
00096
00097 protected:
00098 Settings();
00099 virtual ~Settings() {}
00100
00101 bool mShouldQuit;
00102 int mWindowSizeX, mWindowSizeY;
00103 bool mFullScreen;
00104 float mFrameRate;
00105 bool mResizable;
00106 bool mPowerManagement;
00107 std::string mTitle;
00108 };
00109
00110
00111 public:
00112
00113 App();
00114 virtual ~App();
00115
00117 virtual void setup() {}
00119 virtual void shutdown() {}
00120
00122 virtual void update() {}
00124 virtual void draw() {}
00125
00127 virtual void mouseDown( MouseEvent event ) {}
00129 virtual void mouseUp( MouseEvent event ) {}
00131 virtual void mouseWheel( MouseEvent event ) {}
00133 virtual void mouseMove( MouseEvent event ) {}
00135 virtual void mouseDrag( MouseEvent event ) {}
00137 virtual void keyDown( KeyEvent event ) {}
00139 virtual void keyUp( KeyEvent event ) {}
00141 virtual void resize( int width, int height ) {}
00143 virtual void fileDrop( FileDropEvent event ) {}
00144
00146 virtual void quit() = 0;
00147
00148 class Listener {
00149 public:
00150 virtual bool mouseDown( MouseEvent event ) { return false; }
00151 virtual bool mouseUp( MouseEvent event ) { return false; }
00152 virtual bool mouseWheel( MouseEvent event ) { return false; }
00153 virtual bool mouseMove( MouseEvent event ) { return false; }
00154 virtual bool mouseDrag( MouseEvent event ) { return false; }
00155 virtual bool keyDown( KeyEvent event ) { return false; }
00156 virtual bool keyUp( KeyEvent event ) { return false; }
00157 virtual bool resize( int width, int height ) { return false; }
00158 virtual bool fileDrop( FileDropEvent event ) { return false; }
00159 };
00160
00162 void addListener( Listener *listener );
00164 void removeListener( Listener *listener );
00165
00166
00167 virtual const Settings& getSettings() const { return getSettings(); }
00168 Renderer* getRenderer() const { return mRenderer.get(); }
00169
00171 virtual int getWindowWidth() const = 0;
00173 virtual void setWindowWidth( int windowWidth ) = 0;
00175 virtual int getWindowHeight() const = 0;
00177 virtual void setWindowHeight( int windowHeight ) = 0;
00179 virtual void setWindowSize( int windowWidth, int windowHeight ) = 0;
00181 void setWindowSize( const Vec2i &size ) { setWindowSize( size.x, size.y ); }
00183
00184 Vec2f getWindowCenter() const { return Vec2f( (float)getWindowWidth(), (float)getWindowHeight() ) * 0.5f; }
00186 Vec2i getWindowSize() const { return Vec2i( getWindowWidth(), getWindowHeight() ); }
00188 float getWindowAspectRatio() const { return getWindowWidth() / (float)getWindowHeight(); }
00190
00191 Area getWindowBounds() const { return Area( 0, 0, getWindowWidth(), getWindowHeight() ); }
00193 virtual float getFrameRate() const = 0;
00195 virtual void setFrameRate( float aFrameRate ) = 0;
00197 virtual bool isFullScreen() const = 0;
00199 virtual void setFullScreen( bool aFullScreen ) = 0;
00200
00202 double getElapsedSeconds() const { return mTimer.getSeconds(); }
00204 uint32_t getElapsedFrames() const { return mFrameCount; }
00205
00206
00207 static DataSourceRef loadResource( const std::string &macPath, int mswID, const std::string &mswType );
00208 #if defined( CINDER_COCOA )
00209 static DataSourcePathRef loadResource( const std::string &macPath );
00210 std::string getResourcePath( const std::string &rsrcRelativePath );
00211 #else
00212 static DataSourceBufferRef loadResource( int mswID, const std::string &mswType );
00213 #endif
00214
00216 virtual std::string getAppPath() = 0;
00218
00221 std::string getOpenFilePath( const std::string &initialPath = "", std::vector<std::string> extensions = std::vector<std::string>() );
00223
00226 std::string getSaveFilePath( const std::string &initialPath = "", std::vector<std::string> extensions = std::vector<std::string>() );
00227
00229 std::ostream& console();
00230
00232 Surface copyWindowSurface();
00234 Surface copyWindowSurface( const Area &area );
00236 void restoreWindowContext();
00237
00238
00239
00241
00242 void privateMouseDown__( const MouseEvent &event );
00243 void privateMouseUp__( const MouseEvent &event );
00244 void privateMouseWheel__( const MouseEvent &event );
00245 void privateMouseMove__( const MouseEvent &event );
00246 void privateMouseDrag__( const MouseEvent &event );
00247 void privateKeyDown__( const KeyEvent &event );
00248 void privateKeyUp__( const KeyEvent &event );
00249 void privateFileDrop__( const FileDropEvent &event );
00250
00251 virtual void privateSetup__();
00252 virtual void privateResize__( int width, int height );
00253 virtual void privateUpdate__();
00254 virtual void privateDraw__();
00255 virtual void privateShutdown__();
00257
00258 #if defined( CINDER_MSW )
00259
00260 virtual bool getsWindowsPaintEvents() = 0;
00261 #endif
00262
00263 virtual bool receivesEvents() const { return true; }
00264
00266 static App* get() { return sInstance; }
00267
00268 protected:
00270
00271 static void prepareLaunch();
00272 static void executeLaunch( App *app, class Renderer *renderer, const char *title, int argc, char * const argv[] );
00273 static void cleanupLaunch();
00274
00275 virtual void launch( const char *title, int argc, char * const argv[] ) = 0;
00277
00278 private:
00279
00280 #if defined( CINDER_MSW )
00281 friend class AppImplMsw;
00282 shared_ptr<cinder::msw::dostream> mOutputStream;
00283 #else
00284 static void *sAutoReleasePool;
00285 #endif
00286
00287 Timer mTimer;
00288 uint32_t mFrameCount;
00289
00290 shared_ptr<Renderer> mRenderer;
00291 std::vector<Listener*> mListeners;
00292
00293 static App* sInstance;
00294 };
00295
00300
00301 inline int getWindowWidth() { return App::get()->getWindowWidth(); }
00303 inline void setWindowWidth( int windowWidth ) { App::get()->setWindowWidth( windowWidth ); }
00305 inline int getWindowHeight() { return App::get()->getWindowHeight(); }
00307 inline void setWindowHeight( int windowHeight ) { App::get()->setWindowHeight( windowHeight ); }
00309 inline void setWindowSize( int windowWidth, int windowHeight ) { App::get()->setWindowSize( windowWidth, windowHeight ); }
00311
00312 inline Vec2f getWindowCenter() { return App::get()->getWindowCenter(); }
00314 inline Vec2i getWindowSize() { return App::get()->getWindowSize(); }
00316 inline float getWindowAspectRatio() { return App::get()->getWindowAspectRatio(); }
00318
00319 inline Area getWindowBounds() { return App::get()->getWindowBounds(); }
00321 inline float getFrameRate() { return App::get()->getFrameRate(); }
00323 inline void setFrameRate( float frameRate ) { App::get()->setFrameRate( frameRate ); }
00325 inline bool isFullScreen() { return App::get()->isFullScreen(); }
00327 inline void setFullScreen( bool fullScreen = true ) { App::get()->setFullScreen( fullScreen ); }
00328
00330 inline double getElapsedSeconds() { return App::get()->getElapsedSeconds(); }
00332 inline uint32_t getElapsedFrames() { return App::get()->getElapsedFrames(); }
00333
00334 inline DataSourceRef loadResource( const std::string &macPath, int mswID, const std::string &mswType ) { return App::get()->loadResource( macPath, mswID, mswType ); }
00335 #if defined( CINDER_COCOA )
00336 inline DataSourcePathRef loadResource( const std::string &macPath ) { return App::get()->loadResource( macPath ); }
00337 inline std::string getResourcePath( const std::string &rsrcRelativePath ) { return App::get()->getResourcePath( rsrcRelativePath ); }
00338 #else
00339 inline DataSourceBufferRef loadResource( int mswID, const std::string &mswType ) { return App::get()->loadResource( mswID, mswType ); }
00340 #endif
00341
00343 inline std::string getAppPath() { return App::get()->getAppPath(); }
00345
00348 inline std::string getOpenFilePath( const std::string &initialPath = "", std::vector<std::string> extensions = std::vector<std::string>() ) { return App::get()->getOpenFilePath( initialPath, extensions ); }
00350
00353 inline std::string getSaveFilePath( const std::string &initialPath = "", std::vector<std::string> extensions = std::vector<std::string>() ) { return App::get()->getSaveFilePath( initialPath, extensions ); }
00354
00356
00359 inline std::ostream& console() { return App::get()->console(); }
00360
00362 inline Surface copyWindowSurface() { return App::get()->copyWindowSurface(); }
00364 inline Surface copyWindowSurface( const Area &area ) { return App::get()->copyWindowSurface( area ); }
00366 inline void restoreWindowContext() { return App::get()->restoreWindowContext(); }
00367
00368 #if defined( CINDER_COCOA )
00369
00370 inline ::CGContextRef createWindowCgContext() { return ((Renderer2d*)(App::get()->getRenderer()))->getCgContext(); }
00371 #endif
00372
00374
00375 } }