openscenegraph
GraphicsWindowIOS
Go to the documentation of this file.
1/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
2 *
3 * This library is open source and may be redistributed and/or modified under
4 * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
5 * (at your option) any later version. The full license is in LICENSE file
6 * included with this distribution, and on the openscenegraph.org website.
7 *
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * OpenSceneGraph Public License for more details.
12*/
13
14/* Note, elements of GraphicsWindowX11 have used Prodcer/RenderSurface_X11.cpp as both
15 * a guide to use of X11/GLX and copiying directly in the case of setBorder().
16 * These elements are license under OSGPL as above, with Copyright (C) 2001-2004 Don Burns.
17 */
18
19#ifndef OSGVIEWER_GRAPHICSWINDOWCOCOA
20#define OSGVIEWER_GRAPHICSWINDOWCOCOA 1
21
22#ifdef __APPLE__
23
24#ifdef __OBJC__
25@class GraphicsWindowIOSWindow;
26@class GraphicsWindowIOSGLView;
27@class GraphicsWindowIOSGLViewController;
28@class EAGLContext;
29@class UIWindow;
30@class UIView;
31@class UIViewController;
32#else
33class GraphicsWindowIOSGLView;
34class GraphicsWindowIOSWindow;
35class GraphicsWindowIOSGLViewController;
36class EAGLContext;
37class UIWindow;
38class UIView;
39class UIViewController;
40#endif
41
42#include <osgViewer/GraphicsWindow>
43
44// Do not include any cocoa-header here, because this will pollute the name-space and causes compile errors
45
46namespace osgViewer
47{
48/**
49 * Implementation of a GraphicsWindow for the iOS platform.
50 */
51class GraphicsWindowIOS : public osgViewer::GraphicsWindow
52{
53 public:
54 class Implementation;
55
56 GraphicsWindowIOS(osg::GraphicsContext::Traits* traits) : GraphicsWindow(),
57 _valid(false),
58 _initialized(false),
59 _realized(false),
60 _window(NULL),
61 _view(NULL),
62 _viewController(NULL),
63 _context(NULL),
64 _ownsWindow(true),
65 _deviceOrientationFlags(WindowData::ALL_ORIENTATIONS),
66 _viewContentScaleFactor(-1.0f)
67 {
68 _traits = traits;
69
70 init();
71
72 if (valid())
73 {
74 setState( new osg::State );
75 getState()->setGraphicsContext(this);
76
77 if (_traits.valid() && _traits->sharedContext.valid())
78 {
79 getState()->setContextID( _traits->sharedContext->getState()->getContextID() );
80 incrementContextIDUsageCount( getState()->getContextID() );
81 }
82 else
83 {
84 getState()->setContextID( osg::GraphicsContext::createNewContextID() );
85 }
86 }
87 }
88
89 virtual bool isSameKindAs(const Object* object) const { return dynamic_cast<const GraphicsWindowIOS*>(object)!=0; }
90 virtual const char* libraryName() const { return "osgViewer"; }
91 virtual const char* className() const { return "GraphicsWindowIOS"; }
92
93 virtual void runOperations();
94
95 virtual bool valid() const { return _valid; }
96
97 /** Realise the GraphicsContext.*/
98 virtual bool realizeImplementation();
99
100 /** Return true if the graphics context has been realised and is ready to use.*/
101 virtual bool isRealizedImplementation() const { return _realized; }
102
103 /** Close the graphics context.*/
104 virtual void closeImplementation();
105
106 /** Make this graphics context current.*/
107 virtual bool makeCurrentImplementation();
108
109 /** Release the graphics context.*/
110 virtual bool releaseContextImplementation();
111
112 /** Swap the front and back buffers.*/
113 virtual void swapBuffersImplementation();
114
115 /** Check to see if any events have been generated.*/
116 virtual bool checkEvents();
117
118 /** Set Window decoration.*/
119 virtual bool setWindowDecorationImplementation(bool flag);
120
121 /** Get focus.*/
122 virtual void grabFocus();
123
124 /** Get focus on if the pointer is in this window.*/
125 virtual void grabFocusIfPointerInWindow();
126
127 /** Raise the window to the top.*/
128 virtual void raiseWindow();
129
130 virtual void resizedImplementation(int x, int y, int width, int height);
131
132 virtual bool setWindowRectangleImplementation(int x, int y, int width, int height);
133
134 virtual void setWindowName (const std::string & name);
135 virtual void useCursor(bool cursorOn);
136 virtual void setCursor(MouseCursor mouseCursor);
137
138 // WindowData is used to pass in the an existing UIWindow to be used to display our glView
139 class WindowData : public osg::Referenced
140 {
141 public:
142 enum DeviceOrientation{
143 IGNORE_ORIENTATION = 0,
144 PORTRAIT_ORIENTATION = 1<<0,
145 PORTRAIT_UPSIDEDOWN_ORIENTATION = 1<<1,
146 LANDSCAPE_LEFT_ORIENTATION = 1<<2,
147 LANDSCAPE_RIGHT_ORIENTATION = 1<<3,
148 ALL_ORIENTATIONS = PORTRAIT_ORIENTATION | PORTRAIT_UPSIDEDOWN_ORIENTATION | LANDSCAPE_LEFT_ORIENTATION | LANDSCAPE_RIGHT_ORIENTATION
149 };
150 typedef unsigned int DeviceOrientationFlags;
151
152 WindowData(UIView* window_or_view = NULL, UIViewController* parentController = NULL, DeviceOrientationFlags orientationFlags = ALL_ORIENTATIONS, float scaleFactor = -1.0f)
153 : _windowOrView(window_or_view),
154 _parentController(parentController),
155 _deviceOrientationFlags(orientationFlags),
156 _viewContentScaleFactor(scaleFactor),
157 _createTransparentView(false),
158 _useRetainedBacking(false)
159 {
160 }
161
162 void setAdaptToDeviceOrientation(DeviceOrientationFlags flags) { _deviceOrientationFlags = flags; }
163
164 void setViewContentScaleFactor(float scaleFactor) { _viewContentScaleFactor = scaleFactor; }
165
166 UIView* getWindowOrParentView() const { return _windowOrView; }
167 UIViewController* getController() const;
168
169 bool getCreateTransparentView() { return _createTransparentView; }
170 void setCreateTransparentView(bool b) { _createTransparentView = b; }
171
172 bool getUseRetainedBacking() { return _useRetainedBacking; }
173 void setUseRetainedBacking(bool b) { _useRetainedBacking = b; }
174
175 private:
176
177 UIView* _windowOrView;
178 UIViewController* _parentController;
179 DeviceOrientationFlags _deviceOrientationFlags;
180 float _viewContentScaleFactor;
181 bool _createTransparentView;
182 bool _useRetainedBacking;
183
184 friend class GraphicsWindowIOS;
185
186 };
187
188 EAGLContext* getContext() { return _context; }
189 GraphicsWindowIOSWindow* getWindow() { return _window; }
190 GraphicsWindowIOSGLView* getView() { return _view; }
191 void setVSync(bool f);
192
193 /** adapts a resize / move of the window, coords in global screen space */
194 void adaptResize(int x, int y, int w, int h);
195
196
197 WindowData::DeviceOrientationFlags getDeviceOrientationFlags() const { return _deviceOrientationFlags; }
198
199 void setDeviceOrientationFlags(WindowData::DeviceOrientationFlags flags) { _deviceOrientationFlags = flags; }
200
201
202 //
203 //helper funs for converting points to pixels
204 osg::Vec2 pointToPixel(const osg::Vec2& point);
205 osg::Vec2 pixelToPoint(const osg::Vec2& pixel);
206
207 protected:
208
209 void init();
210
211 void transformMouseXY(float& x, float& y);
212
213 virtual ~GraphicsWindowIOS();
214
215
216 bool _valid;
217 bool _initialized;
218 bool _realized;
219 bool _useWindowDecoration;
220
221
222 private:
223
224 GraphicsWindowIOSWindow* _window;
225 GraphicsWindowIOSGLView* _view;
226 GraphicsWindowIOSGLViewController* _viewController;
227 EAGLContext* _context;
228 bool _updateContext;
229
230 bool _ownsWindow;
231
232 WindowData::DeviceOrientationFlags _deviceOrientationFlags;
233
234 float _viewContentScaleFactor;
235
236};
237
238}
239
240#endif
241#endif