From Stephan Huber, "proposed changes allows the user to add a osgGraphicsWindowIOS as an
UIView, respecting the sizes via GraphicsContext::Traits. This helps users, who want to integrate osg into an existing ios-app with multiple UIViews. Additinally a view-controller gets only created if needed, set IGNORE_ORIENTATION via the WindowData-struct. "
This commit is contained in:
parent
c44ef1bfd9
commit
cd2eaf2826
@ -136,6 +136,7 @@ class GraphicsWindowIOS : public osgViewer::GraphicsWindow
|
||||
{
|
||||
public:
|
||||
enum DeviceOrientation{
|
||||
IGNORE_ORIENTATION = 0,
|
||||
PORTRAIT_ORIENTATION = 1<<0,
|
||||
PORTRAIT_UPSIDEDOWN_ORIENTATION = 1<<1,
|
||||
LANDSCAPE_LEFT_ORIENTATION = 1<<2,
|
||||
@ -144,8 +145,8 @@ class GraphicsWindowIOS : public osgViewer::GraphicsWindow
|
||||
};
|
||||
typedef unsigned int DeviceOrientationFlags;
|
||||
|
||||
WindowData(UIWindow* window = NULL, DeviceOrientationFlags orientationFlags = ALL_ORIENTATIONS, float scaleFactor = -1.0f)
|
||||
: _window(window),
|
||||
WindowData(UIView* window_or_view = NULL, DeviceOrientationFlags orientationFlags = ALL_ORIENTATIONS, float scaleFactor = -1.0f)
|
||||
: _windowOrView(window_or_view),
|
||||
_deviceOrientationFlags(orientationFlags),
|
||||
_viewContentScaleFactor(scaleFactor)
|
||||
{
|
||||
@ -155,9 +156,10 @@ class GraphicsWindowIOS : public osgViewer::GraphicsWindow
|
||||
|
||||
void setViewContentScaleFactor(float scaleFactor) { _viewContentScaleFactor = scaleFactor; }
|
||||
|
||||
UIView* getWindowOrParentView() const { return _windowOrView; }
|
||||
private:
|
||||
|
||||
UIWindow* _window;
|
||||
UIView* _windowOrView;
|
||||
DeviceOrientationFlags _deviceOrientationFlags;
|
||||
float _viewContentScaleFactor;
|
||||
|
||||
@ -167,7 +169,7 @@ class GraphicsWindowIOS : public osgViewer::GraphicsWindow
|
||||
|
||||
EAGLContext* getContext() { return _context; }
|
||||
GraphicsWindowIOSWindow* getWindow() { return _window; }
|
||||
|
||||
GraphicsWindowIOSGLView* getView() { return _view; }
|
||||
void setVSync(bool f);
|
||||
|
||||
/** adapts a resize / move of the window, coords in global screen space */
|
||||
@ -176,7 +178,7 @@ class GraphicsWindowIOS : public osgViewer::GraphicsWindow
|
||||
|
||||
WindowData::DeviceOrientationFlags getDeviceOrientationFlags() const { return _deviceOrientationFlags; }
|
||||
|
||||
void getDeviceOrientationFlags(WindowData::DeviceOrientationFlags flags) { _deviceOrientationFlags = flags; }
|
||||
void setDeviceOrientationFlags(WindowData::DeviceOrientationFlags flags) { _deviceOrientationFlags = flags; }
|
||||
|
||||
|
||||
//
|
||||
|
@ -125,7 +125,7 @@
|
||||
|
||||
- (osgGA::GUIEventAdapter::TouchPhase) convertTouchPhase: (UITouchPhase) phase;
|
||||
- (osg::Vec2) convertPointToPixel: (osg::Vec2) point;
|
||||
|
||||
- (void) dealloc;
|
||||
@end
|
||||
|
||||
@implementation GraphicsWindowIOSGLView
|
||||
@ -181,6 +181,7 @@
|
||||
_context = context;
|
||||
}
|
||||
|
||||
|
||||
// You must implement this method
|
||||
+ (Class)layerClass {
|
||||
return [CAEAGLLayer class];
|
||||
@ -220,10 +221,8 @@
|
||||
//
|
||||
- (void) dealloc
|
||||
{
|
||||
//[self destroyFramebuffer];
|
||||
//[_context release];//OBJC_TEST
|
||||
//_context = nil;
|
||||
//_win = NULL;
|
||||
OSG_INFO << "GraphicsWindowIOSGLView::dealloc" << std::endl;
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
@ -590,6 +589,9 @@ void GraphicsWindowIOS::init()
|
||||
_ownsWindow = false;
|
||||
_context = NULL;
|
||||
_window = NULL;
|
||||
_view = NULL;
|
||||
_viewController = NULL;
|
||||
|
||||
_updateContext = true;
|
||||
//if -1.0 we use the screens scale factor
|
||||
_viewContentScaleFactor = -1.0f;
|
||||
@ -638,10 +640,10 @@ bool GraphicsWindowIOS::realizeImplementation()
|
||||
WindowData* windowData = _traits->inheritedWindowData ? dynamic_cast<WindowData*>(_traits->inheritedWindowData.get()) : NULL;
|
||||
if (windowData)
|
||||
{
|
||||
if (windowData->_window)
|
||||
if (windowData->getWindowOrParentView())
|
||||
{
|
||||
_ownsWindow = false;
|
||||
_window = windowData->_window;
|
||||
_window = windowData->getWindowOrParentView();
|
||||
}
|
||||
|
||||
_deviceOrientationFlags = windowData->_deviceOrientationFlags;
|
||||
@ -661,28 +663,28 @@ bool GraphicsWindowIOS::realizeImplementation()
|
||||
//but we need to create our views and windows in points. By default we create a full res buffer across all devices. This
|
||||
//means that for backward compatibility you need to set the windowData _viewContentScaleFactor to 1.0f and set the screen res to the
|
||||
//res of the older gen device.
|
||||
CGRect viewBounds;
|
||||
CGRect window_bounds;
|
||||
osg::Vec2 pointsOrigin = this->pixelToPoint(osg::Vec2(_traits->x, _traits->y));
|
||||
osg::Vec2 pointsSize = this->pixelToPoint(osg::Vec2(_traits->width, _traits->height));
|
||||
|
||||
viewBounds.origin.x = pointsOrigin.x();
|
||||
viewBounds.origin.y = pointsOrigin.y();
|
||||
viewBounds.size.width = pointsSize.x();
|
||||
viewBounds.size.height = pointsSize.y();
|
||||
window_bounds.origin.x = pointsOrigin.x();
|
||||
window_bounds.origin.y = pointsOrigin.y();
|
||||
window_bounds.size.width = pointsSize.x();
|
||||
window_bounds.size.height = pointsSize.y();
|
||||
|
||||
|
||||
//if we own the window we need to create one
|
||||
if (_ownsWindow)
|
||||
{
|
||||
//create the IOS window object using the viewbounds (in points) required for our context size
|
||||
_window = [[GraphicsWindowIOSWindow alloc] initWithFrame: viewBounds];// styleMask: style backing: NSBackingStoreBuffered defer: NO];
|
||||
_window = [[GraphicsWindowIOSWindow alloc] initWithFrame: window_bounds];// styleMask: style backing: NSBackingStoreBuffered defer: NO];
|
||||
|
||||
if (!_window) {
|
||||
OSG_WARN << "GraphicsWindowIOS::realizeImplementation: ERROR: Failed to create GraphicsWindowIOSWindow can not display gl view" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
OSG_DEBUG << "GraphicsWindowIOS::realizeImplementation: INFO: Created UIWindow with bounds '" << viewBounds.size.width << ", " << viewBounds.size.height << "' (points)." << std::endl;
|
||||
OSG_DEBUG << "GraphicsWindowIOS::realizeImplementation: INFO: Created UIWindow with bounds '" << window_bounds.size.width << ", " << window_bounds.size.height << "' (points)." << std::endl;
|
||||
|
||||
//if the user has requested a differnet screenNum from default 0 get the UIScreen object and
|
||||
//apply to our window (this is for IPad external screens, I don't have one, so I've no idea if it works)
|
||||
@ -711,7 +713,8 @@ bool GraphicsWindowIOS::realizeImplementation()
|
||||
}
|
||||
|
||||
//create the view to display our context in our window
|
||||
GraphicsWindowIOSGLView* theView = [[ GraphicsWindowIOSGLView alloc ] initWithFrame:[ _window frame ] : this ];
|
||||
CGRect gl_view_bounds = (_ownsWindow) ? [_window frame] : window_bounds;
|
||||
GraphicsWindowIOSGLView* theView = [[ GraphicsWindowIOSGLView alloc ] initWithFrame: gl_view_bounds : this ];
|
||||
if(!theView)
|
||||
{
|
||||
OSG_FATAL << "GraphicsWindowIOS::realizeImplementation: ERROR: Failed to create GraphicsWindowIOSGLView, can not create frame buffers." << std::endl;
|
||||
@ -724,7 +727,6 @@ bool GraphicsWindowIOS::realizeImplementation()
|
||||
//size to our desired context size.
|
||||
#ifdef __IPHONE_4_0 && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0)
|
||||
theView.contentScaleFactor = _viewContentScaleFactor;
|
||||
|
||||
#endif
|
||||
[theView setGraphicsWindow: this];
|
||||
[theView setOpenGLContext:_context];
|
||||
@ -732,17 +734,19 @@ bool GraphicsWindowIOS::realizeImplementation()
|
||||
|
||||
OSG_DEBUG << "GraphicsWindowIOS::realizeImplementation / view: " << theView << std::endl;
|
||||
|
||||
//
|
||||
_viewController = [[GraphicsWindowIOSGLViewController alloc] init];
|
||||
_viewController.view = _view;
|
||||
|
||||
if (getDeviceOrientationFlags() != WindowData::IGNORE_ORIENTATION)
|
||||
{
|
||||
_viewController = [[GraphicsWindowIOSGLViewController alloc] init];
|
||||
_viewController.view = _view;
|
||||
}
|
||||
|
||||
// Attach view to window
|
||||
[_window addSubview: _view];
|
||||
[theView release];
|
||||
|
||||
//if we own the window also make it visible
|
||||
if (_ownsWindow) {
|
||||
if (_ownsWindow)
|
||||
{
|
||||
//show window
|
||||
[_window makeKeyAndVisible];
|
||||
}
|
||||
@ -764,22 +768,27 @@ bool GraphicsWindowIOS::realizeImplementation()
|
||||
// ----------------------------------------------------------------------------------------------------------
|
||||
void GraphicsWindowIOS::closeImplementation()
|
||||
{
|
||||
OSG_ALWAYS << "close IOS window" << std::endl;
|
||||
OSG_INFO << "close IOS window" << std::endl;
|
||||
_valid = false;
|
||||
_realized = false;
|
||||
|
||||
|
||||
if (_view) {
|
||||
if (_view)
|
||||
{
|
||||
[_view setOpenGLContext: NULL];
|
||||
[_context release];
|
||||
[_view removeFromSuperview];
|
||||
[_view setGraphicsWindow: NULL];
|
||||
[_view release];
|
||||
}
|
||||
|
||||
if (_viewController) {
|
||||
if (_viewController)
|
||||
{
|
||||
[_viewController release];
|
||||
_viewController = NULL;
|
||||
}
|
||||
|
||||
if (_window && _ownsWindow) {
|
||||
if (_window && _ownsWindow)
|
||||
{
|
||||
[_window release];
|
||||
//[glView release];
|
||||
}
|
||||
@ -787,6 +796,7 @@ void GraphicsWindowIOS::closeImplementation()
|
||||
|
||||
_window = NULL;
|
||||
_view = NULL;
|
||||
_context = NULL;
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user