Cinder  0.8.6
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
Renderer.h
Go to the documentation of this file.
1 /*
2  Copyright (c) 2012, The Cinder Project, All rights reserved.
3  Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
4 
5  This code is intended for use with the Cinder C++ library: http://libcinder.org
6 
7  Redistribution and use in source and binary forms, with or without modification, are permitted provided that
8  the following conditions are met:
9 
10  * Redistributions of source code must retain the above copyright notice, this list of conditions and
11  the following disclaimer.
12  * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
13  the following disclaimer in the documentation and/or other materials provided with the distribution.
14 
15  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
16  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
17  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
18  ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
19  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
21  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
22  POSSIBILITY OF SUCH DAMAGE.
23 */
24 
25 #pragma once
26 
27 #include "cinder/Cinder.h"
28 #include "cinder/MatrixStack.h"
29 
30 #if defined( CINDER_MSW )
31  struct HWND__;
32  typedef HWND__* DX_WINDOW_TYPE;
33 #elif defined( CINDER_WINRT )
34  #include <agile.h>
35  typedef Platform::Agile<Windows::UI::Core::CoreWindow> DX_WINDOW_TYPE;
36  #undef min
37  #undef max
38 #endif
39 
40 #if !defined( CINDER_WINRT )
41  #include "cinder/gl/gl.h" // necessary to give GLee the jump on Cocoa.h
42 #endif
43 #include "cinder/Surface.h"
44 #include "cinder/Display.h"
45 
46 
47 #if defined( CINDER_MAC )
48  #include <ApplicationServices/ApplicationServices.h>
49  #include <CoreFoundation/CoreFoundation.h>
50  #if defined __OBJC__
53  @class NSOpenGLContext;
54  @class NSView;
55  #else
58  class NSOpenGLContext;
59  class NSView;
60  #endif
61  typedef struct _CGLContextObject *CGLContextObj;
62  typedef struct _CGLPixelFormatObject *CGLPixelFormatObj;
63 #elif defined( CINDER_COCOA_TOUCH )
64  #if defined __OBJC__
65  typedef struct CGContext * CGContextRef;
68  @class UIView;
69  @class EAGLContext;
70  #else
71  typedef struct CGContext * CGContextRef;
74  class UIView;
75  class EAGLContext;
76  #endif
77 #endif
78 
79 
80 namespace cinder { namespace app {
81 
82 class Window;
83 typedef std::shared_ptr<Window> WindowRef;
84 
85 class App;
86 
87 typedef std::shared_ptr<class Renderer> RendererRef;
88 class Renderer {
89  public:
91  {
94  };
95  virtual ~Renderer() {};
96 
97  virtual RendererRef clone() const = 0;
98  virtual RendererType getRendererType() const { return RENDERER_GL; }
99 
100 #if defined( CINDER_COCOA )
101  #if defined( CINDER_MAC )
102  virtual void setup( App *aApp, CGRect frame, NSView *cinderView, RendererRef sharedRenderer, bool retinaEnabled ) = 0;
103  virtual CGContextRef getCgContext() { throw; } // the default behavior is failure
104  virtual CGLContextObj getCglContext() { throw; } // the default behavior is failure
105  virtual CGLPixelFormatObj getCglPixelFormat() { throw; } // the default behavior is failure
106  #elif defined( CINDER_COCOA_TOUCH )
107  virtual void setup( App *aApp, const Area &frame, UIView *cinderView, RendererRef sharedRenderer ) = 0;
108  virtual bool isEaglLayer() const { return false; }
109  #endif
110 
111 
112  virtual void setFrameSize( int width, int height ) {}
113 
114 #elif defined( CINDER_MSW )
115  virtual void setup( App *aApp, HWND wnd, HDC dc, RendererRef sharedRenderer ) = 0;
116 
117  virtual void prepareToggleFullScreen() {}
118  virtual void finishToggleFullScreen() {}
119  virtual void kill() {}
120 
121  virtual HWND getHwnd() = 0;
122  virtual HDC getDc() { return NULL; }
123 #elif defined( CINDER_WINRT)
124  virtual void setup( App *aApp, DX_WINDOW_TYPE wnd) = 0;
125 
126  virtual void prepareToggleFullScreen() {}
127  virtual void finishToggleFullScreen() {}
128  virtual void kill() {}
129 #endif
130 
131  virtual Surface copyWindowSurface( const Area &area ) = 0;
132 
133  virtual void startDraw() {}
134  virtual void finishDraw() {}
135  virtual void makeCurrentContext() {}
136  virtual void defaultResize() {}
137 
138  protected:
139  Renderer() : mApp( 0 ) {}
140  Renderer( const Renderer &renderer );
141 
143 };
144 
145 #if !defined( CINDER_WINRT )
146 typedef std::shared_ptr<class RendererGl> RendererGlRef;
147 class RendererGl : public Renderer {
148  public:
149 #if defined( CINDER_COCOA_TOUCH )
150  RendererGl( int aAntiAliasing = AA_MSAA_4 );
151 #else
152  RendererGl( int aAntiAliasing = AA_MSAA_16 );
153 #endif
154  ~RendererGl();
155 
156  static RendererGlRef create( int antiAliasing = AA_MSAA_16 ) { return RendererGlRef( new RendererGl( antiAliasing ) ); }
157  virtual RendererRef clone() const { return RendererGlRef( new RendererGl( *this ) ); }
158 
159 #if defined( CINDER_COCOA )
160  #if defined( CINDER_MAC )
161  virtual void setup( App *aApp, CGRect frame, NSView *cinderView, RendererRef sharedRenderer, bool retinaEnabled );
162  virtual CGLContextObj getCglContext();
163  virtual CGLPixelFormatObj getCglPixelFormat();
164  virtual NSOpenGLContext* getNsOpenGlContext();
165  #elif defined( CINDER_COCOA_TOUCH )
166  virtual void setup( App *aApp, const Area &frame, UIView *cinderView, RendererRef sharedRenderer );
167  virtual bool isEaglLayer() const { return true; }
168  EAGLContext* getEaglContext() const;
169  #endif
170  virtual void setFrameSize( int width, int height );
171 #elif defined( CINDER_MSW )
172  virtual void setup( App *aApp, HWND wnd, HDC dc, RendererRef sharedRenderer );
173  virtual void kill();
174  virtual HWND getHwnd() { return mWnd; }
175  virtual void prepareToggleFullScreen();
176  virtual void finishToggleFullScreen();
177 #endif
178 
180  static const int sAntiAliasingSamples[];
181  void setAntiAliasing( int aAntiAliasing );
182  int getAntiAliasing() const { return mAntiAliasing; }
183 
184  virtual void startDraw();
185  virtual void finishDraw();
186  virtual void defaultResize();
187  virtual void makeCurrentContext();
188  virtual Surface copyWindowSurface( const Area &area );
189 
190  protected:
191  RendererGl( const RendererGl &renderer );
192 
194 #if defined( CINDER_MAC )
195  AppImplCocoaRendererGl *mImpl;
196 #elif defined( CINDER_COCOA_TOUCH )
198 #elif defined( CINDER_MSW )
199  class AppImplMswRendererGl *mImpl;
200  HWND mWnd;
201  friend class AppImplMswRendererGl;
202 #endif
203 };
204 
205 typedef std::shared_ptr<class Renderer2d> Renderer2dRef;
206 #if defined( CINDER_COCOA )
207 class Renderer2d : public Renderer {
208  public:
209  Renderer2d();
210 
211  static Renderer2dRef create() { return Renderer2dRef( new Renderer2d() ); }
212  virtual RendererRef clone() const { return Renderer2dRef( new Renderer2d( *this ) ); }
213 
214  #if defined( CINDER_COCOA_TOUCH )
215  virtual void setup( App *aApp, const Area &frame, UIView *cinderView, RendererRef sharedRenderer );
216  #else
217  ~Renderer2d();
218  virtual void setup( App *aApp, CGRect frame, NSView *cinderView, RendererRef sharedRenderer, bool retinaEnabled );
219  #endif
220 
221  virtual CGContextRef getCgContext();
222 
223  virtual void startDraw();
224  virtual void finishDraw();
225  virtual void defaultResize();
226  virtual void makeCurrentContext();
227  virtual void setFrameSize( int width, int height );
228  virtual Surface copyWindowSurface( const Area &area );
229 
230  protected:
231  Renderer2d( const Renderer2d &renderer );
232 
233 #if defined( CINDER_MAC )
235 #else
237 #endif
238  CGContextRef mCGContext;
239 };
240 
241 #elif defined( CINDER_MSW )
242 
243 class Renderer2d : public Renderer {
244  public:
245  Renderer2d( bool doubleBuffer = true );
246 
247  static Renderer2dRef create( bool doubleBuffer = true ) { return Renderer2dRef( new Renderer2d( doubleBuffer ) ); }
248  virtual RendererRef clone() const { return Renderer2dRef( new Renderer2d( *this ) ); }
249 
250  virtual void setup( App *aApp, HWND wnd, HDC dc, RendererRef sharedRenderer );
251  virtual void kill();
252 
253  virtual HWND getHwnd() { return mWnd; }
254  virtual HDC getDc();
255 
256  virtual void prepareToggleFullScreen();
257  virtual void finishToggleFullScreen();
258 
259  virtual void startDraw() override;
260  virtual void finishDraw() override;
261  virtual void defaultResize() override;
262  virtual Surface copyWindowSurface( const Area &area );
263 
264  protected:
265  Renderer2d( const Renderer2d &renderer );
266 
267  class AppImplMswRendererGdi *mImpl;
268 
269  bool mDoubleBuffer;
270  HWND mWnd;
271  HDC mDC;
272 };
273 
274 #endif
275 #endif // !defined( CINDER_WINRT )
276 
277 
278 } } // namespace cinder::app
virtual Surface copyWindowSurface(const Area &area)
static RendererGlRef create(int antiAliasing=AA_MSAA_16)
Definition: Renderer.h:156
Definition: Renderer.h:147
Definition: Renderer.h:179
std::shared_ptr< class RendererGl > RendererGlRef
Definition: Renderer.h:146
Definition: Area.h:37
virtual void makeCurrentContext()
Definition: Renderer.h:179
virtual void finishDraw()
RendererType
Definition: Renderer.h:90
GLenum GLsizei width
Definition: GLee.h:969
Surface copyWindowSurface()
Returns a copy of the current window's contents as a Surface8u.
Definition: App.h:688
Definition: Renderer.h:88
static const int sAntiAliasingSamples[]
Definition: Renderer.h:180
Definition: Renderer.h:179
void setAntiAliasing(int aAntiAliasing)
Definition: Renderer.cpp:80
SurfaceT< uint8_t > Surface
8-bit image. Synonym for Surface8u.
Definition: Surface.h:491
std::shared_ptr< Window > WindowRef
Definition: Event.h:49
virtual void defaultResize()
Definition: AppImplCocoaTouchRendererQuartz.h:26
std::shared_ptr< class Renderer2d > Renderer2dRef
Definition: Renderer.h:205
Definition: Renderer.h:179
Definition: App.h:127
virtual void makeCurrentContext()
Definition: Renderer.h:135
GLenum GLsizei GLsizei height
Definition: GLee.h:1029
virtual RendererRef clone() const
Definition: Renderer.h:157
App * mApp
Definition: Renderer.h:142
std::shared_ptr< class Renderer > RendererRef
Definition: Renderer.h:85
Definition: AppImplMswRendererGl.h:31
virtual RendererType getRendererType() const
Definition: Renderer.h:98
Definition: AppImplCocoaRendererQuartz.h:30
virtual void finishDraw()
Definition: Renderer.h:134
Renderer()
Definition: Renderer.h:139
Definition: Renderer.h:179
int mAntiAliasing
Definition: Renderer.h:193
virtual Surface copyWindowSurface(const Area &area)=0
Definition: Renderer.h:92
RendererGl(int aAntiAliasing=AA_MSAA_16)
Definition: Renderer.cpp:65
Definition: AppImplCocoaRendererGl.h:31
Definition: Renderer.h:179
Definition: Renderer.h:93
virtual void startDraw()
virtual void defaultResize()
Definition: Renderer.h:136
virtual ~Renderer()
Definition: Renderer.h:95
int getAntiAliasing() const
Definition: Renderer.h:182
virtual RendererRef clone() const =0
virtual void startDraw()
Definition: Renderer.h:133
Definition: Renderer.h:179
Definition: AppImplCocoaTouchRendererGl.h:28