mirror of
https://github.com/minetest/irrlicht.git
synced 2024-11-10 01:33:51 +01:00
Remove CIrrDeviceiOS
This commit is contained in:
parent
21c61e9973
commit
df8881898d
@ -1,86 +0,0 @@
|
||||
// Copyright (C) 2015 Patryk Nadrowski
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in Irrlicht.h
|
||||
|
||||
#ifndef __C_EAGL_MANAGER_H_INCLUDED__
|
||||
#define __C_EAGL_MANAGER_H_INCLUDED__
|
||||
|
||||
|
||||
#ifdef _IRR_COMPILE_WITH_EAGL_MANAGER_
|
||||
|
||||
#include "SIrrCreationParameters.h"
|
||||
#include "SExposedVideoData.h"
|
||||
#include "IContextManager.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace video
|
||||
{
|
||||
// EAGL manager.
|
||||
class CEAGLManager : public IContextManager
|
||||
{
|
||||
public:
|
||||
//! Constructor.
|
||||
CEAGLManager();
|
||||
|
||||
//! Destructor.
|
||||
virtual ~CEAGLManager();
|
||||
|
||||
// Initialize EAGL.
|
||||
/* This method checks if a view has CAEAGLLayer and grabs it if it does, anyway surface and context
|
||||
aren't create. */
|
||||
bool initialize(const SIrrlichtCreationParameters& params, const SExposedVideoData& data);
|
||||
|
||||
// Terminate EAGL.
|
||||
/* Terminate EAGL context. This method break both existed surface and context. */
|
||||
void terminate();
|
||||
|
||||
// Create EAGL surface.
|
||||
/* This method configure CAEAGLLayer. */
|
||||
bool generateSurface();
|
||||
|
||||
// Destroy EAGL surface.
|
||||
/* This method reset CAEAGLLayer states. */
|
||||
void destroySurface();
|
||||
|
||||
// Create EAGL context.
|
||||
/* This method create and activate EAGL context. */
|
||||
bool generateContext();
|
||||
|
||||
// Destroy EAGL context.
|
||||
/* This method destroy EAGL context. */
|
||||
void destroyContext();
|
||||
|
||||
const SExposedVideoData& getContext() const;
|
||||
|
||||
bool activateContext(const SExposedVideoData& videoData, bool restorePrimaryOnZero);
|
||||
|
||||
// Swap buffers.
|
||||
bool swapBuffers();
|
||||
|
||||
private:
|
||||
SIrrlichtCreationParameters Params;
|
||||
SExposedVideoData Data;
|
||||
|
||||
bool Configured;
|
||||
|
||||
void* DataStorage;
|
||||
|
||||
struct SFrameBuffer
|
||||
{
|
||||
SFrameBuffer() : BufferID(0), ColorBuffer(0), DepthBuffer(0)
|
||||
{
|
||||
}
|
||||
|
||||
u32 BufferID;
|
||||
u32 ColorBuffer;
|
||||
u32 DepthBuffer;
|
||||
};
|
||||
|
||||
SFrameBuffer FrameBuffer;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
@ -1,273 +0,0 @@
|
||||
// Copyright (C) 2015 Patryk Nadrowski
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in Irrlicht.h
|
||||
|
||||
#include "CEAGLManager.h"
|
||||
|
||||
#ifdef _IRR_COMPILE_WITH_EAGL_MANAGER_
|
||||
|
||||
#include "irrString.h"
|
||||
#include "os.h"
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import <OpenGLES/EAGL.h>
|
||||
|
||||
#if defined(_IRR_COMPILE_WITH_OGLES1_)
|
||||
#include <OpenGLES/ES1/gl.h>
|
||||
#include <OpenGLES/ES1/glext.h>
|
||||
#elif defined(_IRR_COMPILE_WITH_OGLES2_)
|
||||
#include <OpenGLES/ES2/gl.h>
|
||||
#include <OpenGLES/ES2/glext.h>
|
||||
#endif
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace video
|
||||
{
|
||||
|
||||
struct SEAGLManagerDataStorage
|
||||
{
|
||||
SEAGLManagerDataStorage() : Layer(0), Context(0)
|
||||
{
|
||||
}
|
||||
|
||||
CAEAGLLayer* Layer;
|
||||
EAGLContext* Context;
|
||||
};
|
||||
|
||||
CEAGLManager::CEAGLManager() : IContextManager(), Configured(false), DataStorage(0)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
setDebugName("CEAGLManager");
|
||||
#endif
|
||||
|
||||
DataStorage = new SEAGLManagerDataStorage();
|
||||
}
|
||||
|
||||
CEAGLManager::~CEAGLManager()
|
||||
{
|
||||
destroyContext();
|
||||
destroySurface();
|
||||
terminate();
|
||||
|
||||
delete static_cast<SEAGLManagerDataStorage*>(DataStorage);
|
||||
}
|
||||
|
||||
bool CEAGLManager::initialize(const SIrrlichtCreationParameters& params, const SExposedVideoData& data)
|
||||
{
|
||||
SEAGLManagerDataStorage* dataStorage = static_cast<SEAGLManagerDataStorage*>(DataStorage);
|
||||
|
||||
if (dataStorage->Layer != nil)
|
||||
return true;
|
||||
|
||||
Params = params;
|
||||
Data = data;
|
||||
|
||||
UIView* view = (__bridge UIView*)data.OpenGLiOS.View;
|
||||
|
||||
if (view == nil || ![[view layer] isKindOfClass:[CAEAGLLayer class]])
|
||||
{
|
||||
os::Printer::log("Could not get EAGL display.");
|
||||
return false;
|
||||
}
|
||||
|
||||
dataStorage->Layer = (CAEAGLLayer*)[view layer];
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CEAGLManager::terminate()
|
||||
{
|
||||
SEAGLManagerDataStorage* dataStorage = static_cast<SEAGLManagerDataStorage*>(DataStorage);
|
||||
|
||||
[EAGLContext setCurrentContext:0];
|
||||
|
||||
destroySurface();
|
||||
|
||||
if (dataStorage->Layer != nil)
|
||||
dataStorage->Layer = 0;
|
||||
}
|
||||
|
||||
bool CEAGLManager::generateSurface()
|
||||
{
|
||||
SEAGLManagerDataStorage* dataStorage = static_cast<SEAGLManagerDataStorage*>(DataStorage);
|
||||
CAEAGLLayer* layer = dataStorage->Layer;
|
||||
|
||||
if (layer == nil)
|
||||
return false;
|
||||
|
||||
if (Configured)
|
||||
return true;
|
||||
|
||||
NSDictionary* attribs = [NSDictionary dictionaryWithObjectsAndKeys:
|
||||
[NSNumber numberWithBool:NO],
|
||||
kEAGLDrawablePropertyRetainedBacking,
|
||||
(Params.Bits > 16) ? kEAGLColorFormatRGBA8 : kEAGLColorFormatRGB565,
|
||||
kEAGLDrawablePropertyColorFormat,
|
||||
nil];
|
||||
|
||||
[layer setOpaque:(Params.WithAlphaChannel) ? YES : NO];
|
||||
[layer setDrawableProperties:attribs];
|
||||
|
||||
Configured = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CEAGLManager::destroySurface()
|
||||
{
|
||||
SEAGLManagerDataStorage* dataStorage = static_cast<SEAGLManagerDataStorage*>(DataStorage);
|
||||
CAEAGLLayer* layer = dataStorage->Layer;
|
||||
|
||||
if (layer == nil)
|
||||
return;
|
||||
|
||||
[layer setOpaque:NO];
|
||||
[layer setDrawableProperties:nil];
|
||||
|
||||
Configured = false;
|
||||
}
|
||||
|
||||
bool CEAGLManager::generateContext()
|
||||
{
|
||||
SEAGLManagerDataStorage* dataStorage = static_cast<SEAGLManagerDataStorage*>(DataStorage);
|
||||
|
||||
if (dataStorage->Context != nil || !Configured)
|
||||
return false;
|
||||
|
||||
EAGLRenderingAPI OpenGLESVersion = kEAGLRenderingAPIOpenGLES2;
|
||||
|
||||
switch (Params.DriverType)
|
||||
{
|
||||
case EDT_OGLES1:
|
||||
OpenGLESVersion = kEAGLRenderingAPIOpenGLES1;
|
||||
break;
|
||||
case EDT_OGLES2:
|
||||
OpenGLESVersion = kEAGLRenderingAPIOpenGLES2;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
dataStorage->Context = [[EAGLContext alloc] initWithAPI:OpenGLESVersion];
|
||||
|
||||
if (dataStorage->Context == nil)
|
||||
{
|
||||
os::Printer::log("Could not create EAGL context.", ELL_ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
Data.OpenGLiOS.Context = (__bridge void*)dataStorage->Context;
|
||||
|
||||
os::Printer::log("EAGL context created with OpenGLESVersion: ", core::stringc(static_cast<int>(OpenGLESVersion)), ELL_DEBUG);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CEAGLManager::destroyContext()
|
||||
{
|
||||
SEAGLManagerDataStorage* dataStorage = static_cast<SEAGLManagerDataStorage*>(DataStorage);
|
||||
|
||||
[dataStorage->Context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:nil];
|
||||
|
||||
if (FrameBuffer.BufferID != 0)
|
||||
{
|
||||
glDeleteFramebuffersOES(1, &FrameBuffer.BufferID);
|
||||
FrameBuffer.BufferID = 0;
|
||||
}
|
||||
|
||||
if (FrameBuffer.ColorBuffer != 0)
|
||||
{
|
||||
glDeleteRenderbuffersOES(1, &FrameBuffer.ColorBuffer);
|
||||
FrameBuffer.ColorBuffer = 0;
|
||||
}
|
||||
|
||||
if (FrameBuffer.DepthBuffer != 0)
|
||||
{
|
||||
glDeleteRenderbuffersOES(1, &FrameBuffer.DepthBuffer);
|
||||
FrameBuffer.DepthBuffer = 0;
|
||||
}
|
||||
|
||||
[EAGLContext setCurrentContext:0];
|
||||
|
||||
if (dataStorage->Context != nil)
|
||||
dataStorage->Context = 0;
|
||||
|
||||
Data.OpenGLiOS.Context = 0;
|
||||
}
|
||||
|
||||
bool CEAGLManager::activateContext(const SExposedVideoData& videoData, bool restorePrimaryOnZero)
|
||||
{
|
||||
SEAGLManagerDataStorage* dataStorage = static_cast<SEAGLManagerDataStorage*>(DataStorage);
|
||||
EAGLContext* context = dataStorage->Context;
|
||||
|
||||
bool status = false;
|
||||
|
||||
if (context != nil)
|
||||
{
|
||||
status = ([EAGLContext currentContext] == context || [EAGLContext setCurrentContext:context]);
|
||||
}
|
||||
|
||||
if (status)
|
||||
{
|
||||
if (FrameBuffer.ColorBuffer == 0)
|
||||
{
|
||||
glGenRenderbuffersOES(1, &FrameBuffer.ColorBuffer);
|
||||
glBindRenderbufferOES(GL_RENDERBUFFER_OES, FrameBuffer.ColorBuffer);
|
||||
[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:dataStorage->Layer];
|
||||
}
|
||||
|
||||
if (FrameBuffer.DepthBuffer == 0)
|
||||
{
|
||||
GLenum depth = (Params.ZBufferBits >= 24) ? GL_DEPTH_COMPONENT24_OES : GL_DEPTH_COMPONENT16_OES;
|
||||
|
||||
glGenRenderbuffersOES(1, &FrameBuffer.DepthBuffer);
|
||||
glBindRenderbufferOES(GL_RENDERBUFFER_OES, FrameBuffer.DepthBuffer);
|
||||
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, depth, Params.WindowSize.Width, Params.WindowSize.Height);
|
||||
}
|
||||
|
||||
if (FrameBuffer.BufferID == 0)
|
||||
{
|
||||
glGenFramebuffersOES(1, &FrameBuffer.BufferID);
|
||||
glBindFramebufferOES(GL_FRAMEBUFFER_OES, FrameBuffer.BufferID);
|
||||
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, FrameBuffer.ColorBuffer);
|
||||
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, FrameBuffer.DepthBuffer);
|
||||
}
|
||||
|
||||
glBindFramebufferOES(GL_FRAMEBUFFER_OES, FrameBuffer.BufferID);
|
||||
}
|
||||
else
|
||||
{
|
||||
os::Printer::log("Could not make EGL context current.");
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
const SExposedVideoData& CEAGLManager::getContext() const
|
||||
{
|
||||
return Data;
|
||||
}
|
||||
|
||||
bool CEAGLManager::swapBuffers()
|
||||
{
|
||||
SEAGLManagerDataStorage* dataStorage = static_cast<SEAGLManagerDataStorage*>(DataStorage);
|
||||
EAGLContext* context = dataStorage->Context;
|
||||
|
||||
bool status = false;
|
||||
|
||||
if (context != nil && context == [EAGLContext currentContext])
|
||||
{
|
||||
glBindRenderbufferOES(GL_RENDERBUFFER_OES, FrameBuffer.ColorBuffer);
|
||||
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
|
||||
|
||||
status = true;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
@ -1,76 +0,0 @@
|
||||
// Copyright (C) 2002-2008 Nikolaus Gebhardt
|
||||
// Copyright (C) 2008 Redshift Software, Inc.
|
||||
// Copyright (C) 2012-2015 Patryk Nadrowski
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __C_IRR_DEVICE_IOS_H_INCLUDED__
|
||||
#define __C_IRR_DEVICE_IOS_H_INCLUDED__
|
||||
|
||||
|
||||
#ifdef _IRR_COMPILE_WITH_IOS_DEVICE_
|
||||
|
||||
#include "CIrrDeviceStub.h"
|
||||
#include "IrrlichtDevice.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
|
||||
class CIrrDeviceiOS : public CIrrDeviceStub
|
||||
{
|
||||
public:
|
||||
CIrrDeviceiOS(const SIrrlichtCreationParameters& params);
|
||||
virtual ~CIrrDeviceiOS();
|
||||
|
||||
bool run() override;
|
||||
void yield() override;
|
||||
void sleep(u32 timeMs, bool pauseTimer) override;
|
||||
|
||||
void setWindowCaption(const wchar_t* text) override;
|
||||
|
||||
bool isWindowActive() const override;
|
||||
bool isWindowFocused() const override;
|
||||
bool isWindowMinimized() const override;
|
||||
|
||||
void closeDevice() override;
|
||||
|
||||
void setResizable(bool resize = false) override;
|
||||
|
||||
void minimizeWindow() override;
|
||||
void maximizeWindow() override;
|
||||
void restoreWindow() override;
|
||||
|
||||
core::position2di getWindowPosition() override;
|
||||
|
||||
bool activateAccelerometer(float updateInterval = 0.016666f) override;
|
||||
bool deactivateAccelerometer() override;
|
||||
bool isAccelerometerActive() override;
|
||||
bool isAccelerometerAvailable() override;
|
||||
bool activateGyroscope(float updateInterval = 0.016666f) override;
|
||||
bool deactivateGyroscope() override;
|
||||
bool isGyroscopeActive() override;
|
||||
bool isGyroscopeAvailable() override;
|
||||
bool activateDeviceMotion(float updateInterval = 0.016666f) override;
|
||||
bool deactivateDeviceMotion() override;
|
||||
bool isDeviceMotionActive() override;
|
||||
bool isDeviceMotionAvailable() override;
|
||||
|
||||
E_DEVICE_TYPE getType() const override;
|
||||
|
||||
private:
|
||||
void createWindow();
|
||||
void createViewAndDriver();
|
||||
|
||||
void* DataStorage;
|
||||
|
||||
bool Close;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#ifdef _IRR_COMPILE_WITH_IOS_BUILTIN_MAIN_
|
||||
extern void irrlicht_main();
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#endif
|
@ -1,819 +0,0 @@
|
||||
// Copyright (C) 2002-2008 Nikolaus Gebhardt
|
||||
// Copyright (C) 2008 Redshift Software, Inc.
|
||||
// Copyright (C) 2012 Patryk Nadrowski
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#import "CIrrDeviceiOS.h"
|
||||
|
||||
#ifdef _IRR_COMPILE_WITH_IOS_DEVICE_
|
||||
|
||||
#include "IFileSystem.h"
|
||||
#include "CTimer.h"
|
||||
#include "CEAGLManager.h"
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import <CoreMotion/CoreMotion.h>
|
||||
|
||||
/* Important information */
|
||||
|
||||
// The application state events and following methods: IrrlichtDevice::isWindowActive, IrrlichtDevice::isWindowFocused
|
||||
// and IrrlichtDevice::isWindowMinimized works out of box only if you'll use built-in CIrrDelegateiOS,
|
||||
// so _IRR_COMPILE_WITH_IOS_BUILTIN_MAIN_ must be enabled in this case. If you need a custom UIApplicationDelegate you must
|
||||
// handle all application events yourself.
|
||||
|
||||
#ifdef _IRR_COMPILE_WITH_IOS_BUILTIN_MAIN_
|
||||
|
||||
namespace irr
|
||||
{
|
||||
class CIrrDeviceiOS;
|
||||
}
|
||||
|
||||
/* CIrrDelegateiOS */
|
||||
|
||||
@interface CIrrDelegateiOS : NSObject<UIApplicationDelegate>
|
||||
|
||||
- (void)setDevice:(irr::CIrrDeviceiOS*)device;
|
||||
- (bool)isActive;
|
||||
- (bool)hasFocus;
|
||||
|
||||
@property (strong, nonatomic) UIWindow* window;
|
||||
|
||||
@end
|
||||
|
||||
@implementation CIrrDelegateiOS
|
||||
{
|
||||
irr::CIrrDeviceiOS* Device;
|
||||
bool Active;
|
||||
bool Focus;
|
||||
}
|
||||
|
||||
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)options
|
||||
{
|
||||
Device = nil;
|
||||
Active = true;
|
||||
Focus = false;
|
||||
|
||||
[self performSelectorOnMainThread:@selector(runIrrlicht) withObject:nil waitUntilDone:NO];
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)applicationWillTerminate:(UIApplication*)application
|
||||
{
|
||||
if (Device != nil)
|
||||
{
|
||||
irr::SEvent ev;
|
||||
ev.EventType = irr::EET_APPLICATION_EVENT;
|
||||
ev.ApplicationEvent.EventType = irr::EAET_WILL_TERMINATE;
|
||||
|
||||
Device->postEventFromUser(ev);
|
||||
|
||||
Device->closeDevice();
|
||||
}
|
||||
}
|
||||
|
||||
- (void)applicationDidReceiveMemoryWarning:(UIApplication*)application
|
||||
{
|
||||
if (Device != nil)
|
||||
{
|
||||
irr::SEvent ev;
|
||||
ev.EventType = irr::EET_APPLICATION_EVENT;
|
||||
ev.ApplicationEvent.EventType = irr::EAET_MEMORY_WARNING;
|
||||
|
||||
Device->postEventFromUser(ev);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)applicationWillResignActive:(UIApplication*)application
|
||||
{
|
||||
if (Device != nil)
|
||||
{
|
||||
irr::SEvent ev;
|
||||
ev.EventType = irr::EET_APPLICATION_EVENT;
|
||||
ev.ApplicationEvent.EventType = irr::EAET_WILL_PAUSE;
|
||||
|
||||
Device->postEventFromUser(ev);
|
||||
}
|
||||
|
||||
Focus = false;
|
||||
}
|
||||
|
||||
- (void)applicationDidEnterBackground:(UIApplication*)application
|
||||
{
|
||||
if (Device != nil)
|
||||
{
|
||||
irr::SEvent ev;
|
||||
ev.EventType = irr::EET_APPLICATION_EVENT;
|
||||
ev.ApplicationEvent.EventType = irr::EAET_DID_PAUSE;
|
||||
|
||||
Device->postEventFromUser(ev);
|
||||
}
|
||||
|
||||
Active = false;
|
||||
}
|
||||
|
||||
- (void)applicationWillEnterForeground:(UIApplication*)application
|
||||
{
|
||||
if (Device != nil)
|
||||
{
|
||||
irr::SEvent ev;
|
||||
ev.EventType = irr::EET_APPLICATION_EVENT;
|
||||
ev.ApplicationEvent.EventType = irr::EAET_WILL_RESUME;
|
||||
|
||||
Device->postEventFromUser(ev);
|
||||
}
|
||||
|
||||
Active = true;
|
||||
}
|
||||
|
||||
- (void)applicationDidBecomeActive:(UIApplication*)application
|
||||
{
|
||||
if (Device != nil)
|
||||
{
|
||||
irr::SEvent ev;
|
||||
ev.EventType = irr::EET_APPLICATION_EVENT;
|
||||
ev.ApplicationEvent.EventType = irr::EAET_DID_RESUME;
|
||||
|
||||
Device->postEventFromUser(ev);
|
||||
}
|
||||
|
||||
Focus = true;
|
||||
}
|
||||
|
||||
- (void)runIrrlicht
|
||||
{
|
||||
irrlicht_main();
|
||||
}
|
||||
|
||||
- (void)setDevice:(irr::CIrrDeviceiOS*)device
|
||||
{
|
||||
Device = device;
|
||||
}
|
||||
|
||||
- (bool)isActive
|
||||
{
|
||||
return Active;
|
||||
}
|
||||
|
||||
- (bool)hasFocus
|
||||
{
|
||||
return Focus;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
|
||||
/* CIrrViewiOS */
|
||||
|
||||
@interface CIrrViewiOS : UIView
|
||||
|
||||
- (id)initWithFrame:(CGRect)frame forDevice:(irr::CIrrDeviceiOS*)device;
|
||||
|
||||
@end
|
||||
|
||||
@implementation CIrrViewiOS
|
||||
{
|
||||
irr::CIrrDeviceiOS* Device;
|
||||
float Scale;
|
||||
}
|
||||
|
||||
- (id)initWithFrame:(CGRect)frame forDevice:(irr::CIrrDeviceiOS*)device;
|
||||
{
|
||||
self = [super initWithFrame:frame];
|
||||
|
||||
if (self)
|
||||
{
|
||||
Device = device;
|
||||
Scale = ([self respondsToSelector:@selector(setContentScaleFactor:)]) ? [[UIScreen mainScreen] scale] : 1.f;
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (BOOL)isMultipleTouchEnabled
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
|
||||
{
|
||||
irr::SEvent ev;
|
||||
ev.EventType = irr::EET_TOUCH_INPUT_EVENT;
|
||||
ev.TouchInput.Event = irr::ETIE_PRESSED_DOWN;
|
||||
|
||||
for (UITouch* touch in touches)
|
||||
{
|
||||
ev.TouchInput.ID = (size_t)touch;
|
||||
|
||||
CGPoint touchPoint = [touch locationInView:self];
|
||||
|
||||
ev.TouchInput.X = touchPoint.x*Scale;
|
||||
ev.TouchInput.Y = touchPoint.y*Scale;
|
||||
|
||||
Device->postEventFromUser(ev);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
|
||||
{
|
||||
irr::SEvent ev;
|
||||
ev.EventType = irr::EET_TOUCH_INPUT_EVENT;
|
||||
ev.TouchInput.Event = irr::ETIE_MOVED;
|
||||
|
||||
for (UITouch* touch in touches)
|
||||
{
|
||||
ev.TouchInput.ID = (size_t)touch;
|
||||
|
||||
CGPoint touchPoint = [touch locationInView:self];
|
||||
|
||||
ev.TouchInput.X = touchPoint.x*Scale;
|
||||
ev.TouchInput.Y = touchPoint.y*Scale;
|
||||
|
||||
Device->postEventFromUser(ev);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
|
||||
{
|
||||
irr::SEvent ev;
|
||||
ev.EventType = irr::EET_TOUCH_INPUT_EVENT;
|
||||
ev.TouchInput.Event = irr::ETIE_LEFT_UP;
|
||||
|
||||
for (UITouch* touch in touches)
|
||||
{
|
||||
ev.TouchInput.ID = (size_t)touch;
|
||||
|
||||
CGPoint touchPoint = [touch locationInView:self];
|
||||
|
||||
ev.TouchInput.X = touchPoint.x*Scale;
|
||||
ev.TouchInput.Y = touchPoint.y*Scale;
|
||||
|
||||
Device->postEventFromUser(ev);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event
|
||||
{
|
||||
irr::SEvent ev;
|
||||
ev.EventType = irr::EET_TOUCH_INPUT_EVENT;
|
||||
ev.TouchInput.Event = irr::ETIE_LEFT_UP;
|
||||
|
||||
for (UITouch* touch in touches)
|
||||
{
|
||||
ev.TouchInput.ID = (size_t)touch;
|
||||
|
||||
CGPoint touchPoint = [touch locationInView:self];
|
||||
|
||||
ev.TouchInput.X = touchPoint.x*Scale;
|
||||
ev.TouchInput.Y = touchPoint.y*Scale;
|
||||
|
||||
Device->postEventFromUser(ev);
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
/* CIrrViewEAGLiOS */
|
||||
|
||||
@interface CIrrViewEAGLiOS : CIrrViewiOS
|
||||
|
||||
@end
|
||||
|
||||
@implementation CIrrViewEAGLiOS
|
||||
|
||||
+ (Class)layerClass
|
||||
{
|
||||
return [CAEAGLLayer class];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace video
|
||||
{
|
||||
IVideoDriver* createOGLES1Driver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager);
|
||||
|
||||
IVideoDriver* createOGLES2Driver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager);
|
||||
}
|
||||
|
||||
struct SIrrDeviceiOSDataStorage
|
||||
{
|
||||
SIrrDeviceiOSDataStorage() : Window(0), ViewController(0), View(0), MotionManager(0), ReferenceAttitude(0)
|
||||
{
|
||||
MotionManager = [[CMMotionManager alloc] init];
|
||||
}
|
||||
|
||||
UIWindow* Window;
|
||||
UIViewController* ViewController;
|
||||
CIrrViewiOS* View;
|
||||
CMMotionManager* MotionManager;
|
||||
CMAttitude* ReferenceAttitude;
|
||||
};
|
||||
|
||||
CIrrDeviceiOS::CIrrDeviceiOS(const SIrrlichtCreationParameters& params) : CIrrDeviceStub(params), DataStorage(0), Close(false)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
setDebugName("CIrrDeviceiOS");
|
||||
#endif
|
||||
|
||||
#ifdef _IRR_COMPILE_WITH_IOS_BUILTIN_MAIN_
|
||||
CIrrDelegateiOS* delegate = [UIApplication sharedApplication].delegate;
|
||||
[delegate setDevice:this];
|
||||
#endif
|
||||
|
||||
DataStorage = new SIrrDeviceiOSDataStorage();
|
||||
|
||||
FileSystem->changeWorkingDirectoryTo([[[NSBundle mainBundle] resourcePath] UTF8String]);
|
||||
|
||||
createWindow();
|
||||
createViewAndDriver();
|
||||
|
||||
if (!VideoDriver)
|
||||
return;
|
||||
|
||||
createGUIAndScene();
|
||||
}
|
||||
|
||||
CIrrDeviceiOS::~CIrrDeviceiOS()
|
||||
{
|
||||
deactivateDeviceMotion();
|
||||
deactivateGyroscope();
|
||||
deactivateAccelerometer();
|
||||
|
||||
delete static_cast<SIrrDeviceiOSDataStorage*>(DataStorage);
|
||||
|
||||
#ifdef _IRR_COMPILE_WITH_IOS_BUILTIN_MAIN_
|
||||
CIrrDelegateiOS* delegate = [UIApplication sharedApplication].delegate;
|
||||
[delegate setDevice:nil];
|
||||
#endif
|
||||
}
|
||||
|
||||
bool CIrrDeviceiOS::run()
|
||||
{
|
||||
if (!Close)
|
||||
{
|
||||
const CFTimeInterval timeInSeconds = 0.000002;
|
||||
|
||||
s32 result = 0;
|
||||
|
||||
do
|
||||
{
|
||||
result = CFRunLoopRunInMode(kCFRunLoopDefaultMode, timeInSeconds, TRUE);
|
||||
}
|
||||
while (result == kCFRunLoopRunHandledSource);
|
||||
|
||||
os::Timer::tick();
|
||||
|
||||
//! Update events
|
||||
|
||||
SIrrDeviceiOSDataStorage* dataStorage = static_cast<SIrrDeviceiOSDataStorage*>(DataStorage);
|
||||
CMMotionManager* motionManager = dataStorage->MotionManager;
|
||||
|
||||
//! Accelerometer
|
||||
if (motionManager.isAccelerometerActive)
|
||||
{
|
||||
irr::SEvent ev;
|
||||
ev.EventType = irr::EET_ACCELEROMETER_EVENT;
|
||||
ev.AccelerometerEvent.X = motionManager.accelerometerData.acceleration.x;
|
||||
ev.AccelerometerEvent.Y = motionManager.accelerometerData.acceleration.y;
|
||||
ev.AccelerometerEvent.Z = motionManager.accelerometerData.acceleration.z;
|
||||
|
||||
postEventFromUser(ev);
|
||||
}
|
||||
|
||||
//! Gyroscope
|
||||
if (motionManager.isGyroActive)
|
||||
{
|
||||
irr::SEvent ev;
|
||||
ev.EventType = irr::EET_GYROSCOPE_EVENT;
|
||||
ev.GyroscopeEvent.X = motionManager.gyroData.rotationRate.x;
|
||||
ev.GyroscopeEvent.Y = motionManager.gyroData.rotationRate.y;
|
||||
ev.GyroscopeEvent.Z = motionManager.gyroData.rotationRate.z;
|
||||
|
||||
postEventFromUser(ev);
|
||||
}
|
||||
|
||||
//! Device Motion
|
||||
if (motionManager.isDeviceMotionActive)
|
||||
{
|
||||
CMAttitude* currentAttitude = motionManager.deviceMotion.attitude;
|
||||
CMAttitude* referenceAttitude = dataStorage->ReferenceAttitude;
|
||||
|
||||
if (referenceAttitude != nil)
|
||||
[currentAttitude multiplyByInverseOfAttitude: referenceAttitude];
|
||||
else
|
||||
referenceAttitude = motionManager.deviceMotion.attitude;
|
||||
|
||||
irr::SEvent ev;
|
||||
ev.EventType = irr::EET_DEVICE_MOTION_EVENT;
|
||||
ev.AccelerometerEvent.X = currentAttitude.roll;
|
||||
ev.AccelerometerEvent.Y = currentAttitude.pitch;
|
||||
ev.AccelerometerEvent.Z = currentAttitude.yaw;
|
||||
|
||||
postEventFromUser(ev);
|
||||
}
|
||||
}
|
||||
|
||||
return !Close;
|
||||
}
|
||||
|
||||
void CIrrDeviceiOS::yield()
|
||||
{
|
||||
struct timespec ts = {0,0};
|
||||
nanosleep(&ts, NULL);
|
||||
}
|
||||
|
||||
void CIrrDeviceiOS::sleep(u32 timeMs, bool pauseTimer=false)
|
||||
{
|
||||
bool wasStopped = Timer ? Timer->isStopped() : true;
|
||||
|
||||
struct timespec ts;
|
||||
ts.tv_sec = (time_t) (timeMs / 1000);
|
||||
ts.tv_nsec = (long) (timeMs % 1000) * 1000000;
|
||||
|
||||
if (pauseTimer && !wasStopped)
|
||||
Timer->stop();
|
||||
|
||||
nanosleep(&ts, NULL);
|
||||
|
||||
if (pauseTimer && !wasStopped)
|
||||
Timer->start();
|
||||
}
|
||||
|
||||
void CIrrDeviceiOS::setWindowCaption(const wchar_t* text)
|
||||
{
|
||||
}
|
||||
|
||||
bool CIrrDeviceiOS::isWindowActive() const
|
||||
{
|
||||
#ifdef _IRR_COMPILE_WITH_IOS_BUILTIN_MAIN_
|
||||
CIrrDelegateiOS* delegate = [UIApplication sharedApplication].delegate;
|
||||
|
||||
return [delegate isActive];
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool CIrrDeviceiOS::isWindowFocused() const
|
||||
{
|
||||
#ifdef _IRR_COMPILE_WITH_IOS_BUILTIN_MAIN_
|
||||
CIrrDelegateiOS* delegate = [UIApplication sharedApplication].delegate;
|
||||
|
||||
return [delegate hasFocus];
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool CIrrDeviceiOS::isWindowMinimized() const
|
||||
{
|
||||
#ifdef _IRR_COMPILE_WITH_IOS_BUILTIN_MAIN_
|
||||
CIrrDelegateiOS* delegate = [UIApplication sharedApplication].delegate;
|
||||
|
||||
return ![delegate isActive];
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
void CIrrDeviceiOS::closeDevice()
|
||||
{
|
||||
CFRunLoopStop(CFRunLoopGetMain());
|
||||
|
||||
Close = true;
|
||||
}
|
||||
|
||||
void CIrrDeviceiOS::setResizable(bool resize)
|
||||
{
|
||||
}
|
||||
|
||||
void CIrrDeviceiOS::minimizeWindow()
|
||||
{
|
||||
}
|
||||
|
||||
void CIrrDeviceiOS::maximizeWindow()
|
||||
{
|
||||
}
|
||||
|
||||
void CIrrDeviceiOS::restoreWindow()
|
||||
{
|
||||
}
|
||||
|
||||
core::position2di CIrrDeviceiOS::getWindowPosition()
|
||||
{
|
||||
return core::position2di(0, 0);
|
||||
}
|
||||
|
||||
bool CIrrDeviceiOS::activateAccelerometer(float updateInterval)
|
||||
{
|
||||
bool status = false;
|
||||
|
||||
SIrrDeviceiOSDataStorage* dataStorage = static_cast<SIrrDeviceiOSDataStorage*>(DataStorage);
|
||||
CMMotionManager* motionManager = dataStorage->MotionManager;
|
||||
|
||||
if (motionManager.isAccelerometerAvailable)
|
||||
{
|
||||
if (!motionManager.isAccelerometerActive)
|
||||
{
|
||||
motionManager.accelerometerUpdateInterval = updateInterval;
|
||||
[motionManager startAccelerometerUpdates];
|
||||
}
|
||||
|
||||
status = true;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
bool CIrrDeviceiOS::deactivateAccelerometer()
|
||||
{
|
||||
bool status = false;
|
||||
|
||||
SIrrDeviceiOSDataStorage* dataStorage = static_cast<SIrrDeviceiOSDataStorage*>(DataStorage);
|
||||
CMMotionManager* motionManager = dataStorage->MotionManager;
|
||||
|
||||
if (motionManager.isAccelerometerAvailable)
|
||||
{
|
||||
if (motionManager.isAccelerometerActive)
|
||||
[motionManager stopAccelerometerUpdates];
|
||||
|
||||
status = true;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
bool CIrrDeviceiOS::isAccelerometerActive()
|
||||
{
|
||||
SIrrDeviceiOSDataStorage* dataStorage = static_cast<SIrrDeviceiOSDataStorage*>(DataStorage);
|
||||
|
||||
return (dataStorage->MotionManager.isAccelerometerActive);
|
||||
}
|
||||
|
||||
bool CIrrDeviceiOS::isAccelerometerAvailable()
|
||||
{
|
||||
SIrrDeviceiOSDataStorage* dataStorage = static_cast<SIrrDeviceiOSDataStorage*>(DataStorage);
|
||||
|
||||
return (dataStorage->MotionManager.isAccelerometerAvailable);
|
||||
}
|
||||
|
||||
bool CIrrDeviceiOS::activateGyroscope(float updateInterval)
|
||||
{
|
||||
bool status = false;
|
||||
|
||||
SIrrDeviceiOSDataStorage* dataStorage = static_cast<SIrrDeviceiOSDataStorage*>(DataStorage);
|
||||
CMMotionManager* motionManager = dataStorage->MotionManager;
|
||||
|
||||
if (motionManager.isGyroAvailable)
|
||||
{
|
||||
if (!motionManager.isGyroActive)
|
||||
{
|
||||
motionManager.gyroUpdateInterval = updateInterval;
|
||||
[motionManager startGyroUpdates];
|
||||
}
|
||||
|
||||
status = true;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
bool CIrrDeviceiOS::deactivateGyroscope()
|
||||
{
|
||||
bool status = false;
|
||||
|
||||
SIrrDeviceiOSDataStorage* dataStorage = static_cast<SIrrDeviceiOSDataStorage*>(DataStorage);
|
||||
CMMotionManager* motionManager = dataStorage->MotionManager;
|
||||
|
||||
if (motionManager.isGyroAvailable)
|
||||
{
|
||||
if (motionManager.isGyroActive)
|
||||
[motionManager stopGyroUpdates];
|
||||
|
||||
status = true;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
bool CIrrDeviceiOS::isGyroscopeActive()
|
||||
{
|
||||
SIrrDeviceiOSDataStorage* dataStorage = static_cast<SIrrDeviceiOSDataStorage*>(DataStorage);
|
||||
|
||||
return (dataStorage->MotionManager.isGyroActive);
|
||||
}
|
||||
|
||||
bool CIrrDeviceiOS::isGyroscopeAvailable()
|
||||
{
|
||||
SIrrDeviceiOSDataStorage* dataStorage = static_cast<SIrrDeviceiOSDataStorage*>(DataStorage);
|
||||
|
||||
return (dataStorage->MotionManager.isGyroAvailable);
|
||||
}
|
||||
|
||||
bool CIrrDeviceiOS::activateDeviceMotion(float updateInterval)
|
||||
{
|
||||
bool status = false;
|
||||
|
||||
SIrrDeviceiOSDataStorage* dataStorage = static_cast<SIrrDeviceiOSDataStorage*>(DataStorage);
|
||||
CMMotionManager* motionManager = dataStorage->MotionManager;
|
||||
|
||||
if (motionManager.isDeviceMotionAvailable)
|
||||
{
|
||||
if (!motionManager.isDeviceMotionActive)
|
||||
{
|
||||
dataStorage->ReferenceAttitude = nil;
|
||||
|
||||
motionManager.deviceMotionUpdateInterval = updateInterval;
|
||||
[motionManager startDeviceMotionUpdates];
|
||||
}
|
||||
|
||||
status = true;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
bool CIrrDeviceiOS::deactivateDeviceMotion()
|
||||
{
|
||||
bool status = false;
|
||||
|
||||
SIrrDeviceiOSDataStorage* dataStorage = static_cast<SIrrDeviceiOSDataStorage*>(DataStorage);
|
||||
CMMotionManager* motionManager = dataStorage->MotionManager;
|
||||
|
||||
if (motionManager.isDeviceMotionAvailable)
|
||||
{
|
||||
if (motionManager.isDeviceMotionActive)
|
||||
{
|
||||
[motionManager stopDeviceMotionUpdates];
|
||||
|
||||
dataStorage->ReferenceAttitude = nil;
|
||||
}
|
||||
|
||||
status = true;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
bool CIrrDeviceiOS::isDeviceMotionActive()
|
||||
{
|
||||
SIrrDeviceiOSDataStorage* dataStorage = static_cast<SIrrDeviceiOSDataStorage*>(DataStorage);
|
||||
|
||||
return (dataStorage->MotionManager.isDeviceMotionActive);
|
||||
}
|
||||
|
||||
bool CIrrDeviceiOS::isDeviceMotionAvailable()
|
||||
{
|
||||
SIrrDeviceiOSDataStorage* dataStorage = static_cast<SIrrDeviceiOSDataStorage*>(DataStorage);
|
||||
|
||||
return (dataStorage->MotionManager.isDeviceMotionAvailable);
|
||||
}
|
||||
|
||||
E_DEVICE_TYPE CIrrDeviceiOS::getType() const
|
||||
{
|
||||
return EIDT_IOS;
|
||||
}
|
||||
|
||||
void CIrrDeviceiOS::createWindow()
|
||||
{
|
||||
if (CreationParams.DriverType != video::EDT_NULL)
|
||||
{
|
||||
SIrrDeviceiOSDataStorage* dataStorage = static_cast<SIrrDeviceiOSDataStorage*>(DataStorage);
|
||||
|
||||
UIView* externalView = (__bridge UIView*)CreationParams.WindowId;
|
||||
|
||||
if (externalView == nil)
|
||||
{
|
||||
dataStorage->Window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
|
||||
dataStorage->ViewController = [[UIViewController alloc] init];
|
||||
dataStorage->Window.rootViewController = dataStorage->ViewController;
|
||||
|
||||
[dataStorage->Window makeKeyAndVisible];
|
||||
}
|
||||
else
|
||||
{
|
||||
dataStorage->Window = externalView.window;
|
||||
|
||||
UIResponder* currentResponder = externalView.nextResponder;
|
||||
|
||||
do
|
||||
{
|
||||
if ([currentResponder isKindOfClass:[UIViewController class]])
|
||||
{
|
||||
dataStorage->ViewController = (UIViewController*)currentResponder;
|
||||
|
||||
currentResponder = nil;
|
||||
}
|
||||
else if ([currentResponder isKindOfClass:[UIView class]])
|
||||
{
|
||||
currentResponder = currentResponder.nextResponder;
|
||||
}
|
||||
else
|
||||
{
|
||||
currentResponder = nil;
|
||||
|
||||
// Could not find view controller.
|
||||
_IRR_DEBUG_BREAK_IF(true);
|
||||
}
|
||||
}
|
||||
while (currentResponder != nil);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CIrrDeviceiOS::createViewAndDriver()
|
||||
{
|
||||
SIrrDeviceiOSDataStorage* dataStorage = static_cast<SIrrDeviceiOSDataStorage*>(DataStorage);
|
||||
|
||||
video::SExposedVideoData data;
|
||||
data.OpenGLiOS.Window = (__bridge void*)dataStorage->Window;
|
||||
data.OpenGLiOS.ViewController = (__bridge void*)dataStorage->ViewController;
|
||||
|
||||
UIView* externalView = (__bridge UIView*)CreationParams.WindowId;
|
||||
|
||||
CGRect resolution = (externalView == nil) ? [[UIScreen mainScreen] bounds] : externalView.bounds;
|
||||
|
||||
switch (CreationParams.DriverType)
|
||||
{
|
||||
case video::EDT_OGLES1:
|
||||
#ifdef _IRR_COMPILE_WITH_OGLES1_
|
||||
{
|
||||
CIrrViewEAGLiOS* view = [[CIrrViewEAGLiOS alloc] initWithFrame:resolution forDevice:this];
|
||||
CreationParams.WindowSize = core::dimension2d<u32>(view.frame.size.width, view.frame.size.height);
|
||||
|
||||
dataStorage->View = view;
|
||||
data.OpenGLiOS.View = (__bridge void*)view;
|
||||
|
||||
ContextManager = new video::CEAGLManager();
|
||||
ContextManager->initialize(CreationParams, data);
|
||||
|
||||
VideoDriver = video::createOGLES1Driver(CreationParams, FileSystem, ContextManager);
|
||||
|
||||
if (!VideoDriver)
|
||||
os::Printer::log("Could not create OpenGL ES 1.x driver.", ELL_ERROR);
|
||||
}
|
||||
#else
|
||||
os::Printer::log("No OpenGL ES 1.x support compiled in.", ELL_ERROR);
|
||||
#endif
|
||||
break;
|
||||
|
||||
case video::EDT_OGLES2:
|
||||
#ifdef _IRR_COMPILE_WITH_OGLES2_
|
||||
{
|
||||
CIrrViewEAGLiOS* view = [[CIrrViewEAGLiOS alloc] initWithFrame:resolution forDevice:this];
|
||||
CreationParams.WindowSize = core::dimension2d<u32>(view.frame.size.width, view.frame.size.height);
|
||||
|
||||
dataStorage->View = view;
|
||||
data.OpenGLiOS.View = (__bridge void*)view;
|
||||
|
||||
ContextManager = new video::CEAGLManager();
|
||||
ContextManager->initialize(CreationParams, data);
|
||||
|
||||
VideoDriver = video::createOGLES2Driver(CreationParams, FileSystem, ContextManager);
|
||||
|
||||
if (!VideoDriver)
|
||||
os::Printer::log("Could not create OpenGL ES 2.x driver.", ELL_ERROR);
|
||||
}
|
||||
#else
|
||||
os::Printer::log("No OpenGL ES 2.x support compiled in.", ELL_ERROR);
|
||||
#endif
|
||||
break;
|
||||
|
||||
case video::EDT_SOFTWARE:
|
||||
case video::EDT_BURNINGSVIDEO:
|
||||
case video::DEPRECATED_EDT_DIRECT3D8_NO_LONGER_EXISTS:
|
||||
case video::EDT_DIRECT3D9:
|
||||
case video::EDT_OPENGL:
|
||||
os::Printer::log("This driver is not available in iOS. Try OpenGL ES.", ELL_ERROR);
|
||||
break;
|
||||
|
||||
case video::EDT_NULL:
|
||||
VideoDriver = video::createNullDriver(FileSystem, CreationParams.WindowSize);
|
||||
break;
|
||||
|
||||
default:
|
||||
os::Printer::log("Unable to create video driver of unknown type.", ELL_ERROR);
|
||||
break;
|
||||
}
|
||||
|
||||
if (externalView == nil)
|
||||
dataStorage->ViewController.view = dataStorage->View;
|
||||
else
|
||||
[externalView addSubview:dataStorage->View];
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef _IRR_COMPILE_WITH_IOS_BUILTIN_MAIN_
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
int result = UIApplicationMain(argc, argv, 0, NSStringFromClass([CIrrDelegateiOS class]));
|
||||
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -29,10 +29,6 @@ static const char* const copyright = "Irrlicht Engine (c) 2002-2017 Nikolaus Geb
|
||||
#include "CIrrDeviceSDL.h"
|
||||
#endif
|
||||
|
||||
#ifdef _IRR_COMPILE_WITH_IOS_DEVICE_
|
||||
#include "CIrrDeviceiOS.h"
|
||||
#endif
|
||||
|
||||
#ifdef _IRR_COMPILE_WITH_ANDROID_DEVICE_
|
||||
#include "Android/CIrrDeviceAndroid.h"
|
||||
#endif
|
||||
@ -78,11 +74,6 @@ namespace irr
|
||||
if (params.DeviceType == EIDT_X11 || (!dev && params.DeviceType == EIDT_BEST))
|
||||
dev = new CIrrDeviceLinux(params);
|
||||
#endif
|
||||
|
||||
#ifdef _IRR_COMPILE_WITH_IOS_DEVICE_
|
||||
if (params.DeviceType == EIDT_IOS || (!dev && params.DeviceType == EIDT_BEST))
|
||||
dev = new CIrrDeviceiOS(params);
|
||||
#endif
|
||||
|
||||
#ifdef _IRR_COMPILE_WITH_ANDROID_DEVICE_
|
||||
if (params.DeviceType == EIDT_ANDROID || (!dev && params.DeviceType == EIDT_BEST))
|
||||
|
Loading…
Reference in New Issue
Block a user