From 426eb85782b4124ed9a42a8336bafbb0750f1bc0 Mon Sep 17 00:00:00 2001 From: Egor Bogatov Date: Tue, 25 Apr 2017 18:27:48 +0200 Subject: [PATCH] Stable Exit for iOS UrhoSurface + Add Playgrounds.iOS to test it. --- Bindings/Portable/Application.cs | 50 +++--- Bindings/Portable/Consts.cs | 4 +- Bindings/iOS/UrhoSurface.cs | 116 ++++++++++--- .../Urho.Extensions.Cocoa/UrhoSurface.cs | 4 + .../Playgrounds.Cocoa/AppDelegate.cs | 10 ++ .../Playgrounds.Cocoa/ViewController.cs | 4 +- .../Playgrounds/Playgrounds.WinForms/Game.cs | 29 +++- .../Playgrounds.Wpf/MainWindow.xaml.cs | 1 - .../Playgrounds.iOS/AppDelegate.cs | 59 +++++++ .../AppIcon.appiconset/Contents.json | 157 ++++++++++++++++++ .../Assets.xcassets/Contents.json | 6 + .../First.imageset/Contents.json | 55 ++++++ .../Assets.xcassets/First.imageset/vector.pdf | Bin 0 -> 2465 bytes .../Second.imageset/Contents.json | 55 ++++++ .../Second.imageset/vector.pdf | Bin 0 -> 2423 bytes .../Playgrounds.iOS/Entitlements.plist | 6 + .../Playgrounds.iOS/FirstViewController.cs | 70 ++++++++ .../FirstViewController.designer.cs | 20 +++ Tests/Playgrounds/Playgrounds.iOS/Info.plist | 40 +++++ .../Playgrounds.iOS/LaunchScreen.storyboard | 27 +++ Tests/Playgrounds/Playgrounds.iOS/Main.cs | 15 ++ .../Playgrounds.iOS/Main.storyboard | 146 ++++++++++++++++ .../Playgrounds.iOS/Playgrounds.iOS.csproj | 131 +++++++++++++++ .../Playgrounds.iOS/SecondViewController.cs | 28 ++++ .../SecondViewController.designer.cs | 20 +++ Urho.sln | 75 +++++++++ Urho3D/Source | 2 +- 27 files changed, 1077 insertions(+), 53 deletions(-) create mode 100644 Tests/Playgrounds/Playgrounds.iOS/AppDelegate.cs create mode 100644 Tests/Playgrounds/Playgrounds.iOS/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Tests/Playgrounds/Playgrounds.iOS/Assets.xcassets/Contents.json create mode 100644 Tests/Playgrounds/Playgrounds.iOS/Assets.xcassets/First.imageset/Contents.json create mode 100644 Tests/Playgrounds/Playgrounds.iOS/Assets.xcassets/First.imageset/vector.pdf create mode 100644 Tests/Playgrounds/Playgrounds.iOS/Assets.xcassets/Second.imageset/Contents.json create mode 100644 Tests/Playgrounds/Playgrounds.iOS/Assets.xcassets/Second.imageset/vector.pdf create mode 100644 Tests/Playgrounds/Playgrounds.iOS/Entitlements.plist create mode 100644 Tests/Playgrounds/Playgrounds.iOS/FirstViewController.cs create mode 100644 Tests/Playgrounds/Playgrounds.iOS/FirstViewController.designer.cs create mode 100644 Tests/Playgrounds/Playgrounds.iOS/Info.plist create mode 100644 Tests/Playgrounds/Playgrounds.iOS/LaunchScreen.storyboard create mode 100644 Tests/Playgrounds/Playgrounds.iOS/Main.cs create mode 100644 Tests/Playgrounds/Playgrounds.iOS/Main.storyboard create mode 100644 Tests/Playgrounds/Playgrounds.iOS/Playgrounds.iOS.csproj create mode 100644 Tests/Playgrounds/Playgrounds.iOS/SecondViewController.cs create mode 100644 Tests/Playgrounds/Playgrounds.iOS/SecondViewController.designer.cs diff --git a/Bindings/Portable/Application.cs b/Bindings/Portable/Application.cs index b94eadf65..b74a01460 100644 --- a/Bindings/Portable/Application.cs +++ b/Bindings/Portable/Application.cs @@ -17,7 +17,8 @@ using Urho.Actions; using Urho.Gui; -namespace Urho { +namespace Urho +{ [PreserveAttribute(AllMembers = true)] public partial class Application @@ -36,17 +37,17 @@ public partial class Application List actionsToDispatch = new List(); [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate void ActionIntPtr (IntPtr value); + public delegate void ActionIntPtr(IntPtr value); - [DllImport (Consts.NativeImport, CallingConvention=CallingConvention.Cdecl)] - static extern IntPtr ApplicationProxy_ApplicationProxy (IntPtr contextHandle, ActionIntPtr setup, ActionIntPtr start, ActionIntPtr stop, string args, IntPtr externalWindow); + [DllImport(Consts.NativeImport, CallingConvention = CallingConvention.Cdecl)] + static extern IntPtr ApplicationProxy_ApplicationProxy(IntPtr contextHandle, ActionIntPtr setup, ActionIntPtr start, ActionIntPtr stop, string args, IntPtr externalWindow); static Application current; public static Application Current { get { - if (current == null) + if (current == null) throw new InvalidOperationException("The application is not configured yet"); return current; } @@ -71,14 +72,14 @@ public static Context CurrentContext public const float PixelSize = 0.01f; [Preserve] - public Application(ApplicationOptions options) : this(new Context(), options) {} + public Application(ApplicationOptions options) : this(new Context(), options) { } - Application (Context context, ApplicationOptions options = null) : base (UrhoObjectFlag.Empty) + Application(Context context, ApplicationOptions options = null) : base(UrhoObjectFlag.Empty) { //Workbooks specific: CancelActiveActionsOnStop = this is SimpleApplication; if (context == null) - throw new ArgumentNullException (nameof(context)); + throw new ArgumentNullException(nameof(context)); //keep references to callbacks (supposed to be passed to native code) as long as the App is alive setupCallback = ProxySetup; @@ -91,8 +92,8 @@ public Application(ApplicationOptions options) : this(new Context(), options) {} #endif Options = options ?? new ApplicationOptions(assetsFolder: null); - handle = ApplicationProxy_ApplicationProxy (context.Handle, setupCallback, startCallback, stopCallback, Options.ToString(), Options.ExternalWindow); - Runtime.RegisterObject (this); + handle = ApplicationProxy_ApplicationProxy(context.Handle, setupCallback, startCallback, stopCallback, Options.ToString(), Options.ExternalWindow); + Runtime.RegisterObject(this); } public bool IsClosed { get; private set; } @@ -115,7 +116,7 @@ public Application(ApplicationOptions options) : this(new Context(), options) {} /// Frame update event /// public event Action Update; - + /// /// Invoke actions in the Main Thread (the next Update call) /// @@ -123,14 +124,13 @@ public static void InvokeOnMain(Action action) { if (!HasCurrent) { - Urho.IO.Log.Write(LogLevel.Warning, "InvokeOnMain was invoked before an Application was initialized."); if (staticActionsToDispatch == null) staticActionsToDispatch = new List(); lock (staticActionsToDispatch) staticActionsToDispatch.Add(action); return; - } + } var actions = Current.actionsToDispatch; lock (actions) @@ -229,17 +229,17 @@ void HandleUpdate(UpdateEventArgs args) } [MonoPInvokeCallback(typeof(ActionIntPtr))] - static void ProxySetup (IntPtr h) + static void ProxySetup(IntPtr h) { isExiting = false; Runtime.Setup(); Current = GetApp(h); CurrentContext = Current.Context; - Current.Setup (); + Current.Setup(); } [MonoPInvokeCallback(typeof(ActionIntPtr))] - static void ProxyStart (IntPtr h) + static void ProxyStart(IntPtr h) { Runtime.Start(); Current = GetApp(h); @@ -262,7 +262,7 @@ static void ProxyStart (IntPtr h) public static bool CancelActiveActionsOnStop { get; set; } [MonoPInvokeCallback(typeof(ActionIntPtr))] - static void ProxyStop (IntPtr h) + static void ProxyStop(IntPtr h) { isExiting = true; if (CancelActiveActionsOnStop) @@ -270,9 +270,9 @@ static void ProxyStop (IntPtr h) LogSharp.Debug("ProxyStop"); UrhoPlatformInitializer.Initialized = false; var context = Current.Context; - var app = GetApp (h); + var app = GetApp(h); app.IsClosed = true; - app.Stop (); + app.Stop(); LogSharp.Debug("ProxyStop: Runtime.Cleanup"); Runtime.Cleanup(); LogSharp.Debug("ProxyStop: Disposing context"); @@ -292,9 +292,16 @@ void SubscribeToAppEvents() internal static async Task StopCurrent() { - if (current == null) + if (current == null && !current.IsActive) return; + + //Current.Engine.PauseMinimized = true; + Current.Input.Enabled = false; + isExiting = true; +#if IOS + iOS.UrhoSurface.StopRendering(current); +#endif #if WINDOWS_UWP && !UWP_HOLO UWP.UrhoSurface.StopRendering().Wait(); @@ -321,10 +328,11 @@ internal static async Task StopCurrent() }); } #else - if (Current.IsFrameRendering) + if (Current.IsFrameRendering)// && !Current.Engine.PauseMinimized) { waitFrameEndTaskSource = new TaskCompletionSource(); await waitFrameEndTaskSource.Task; + waitFrameEndTaskSource = null; } Current.Engine.Exit (); #endif diff --git a/Bindings/Portable/Consts.cs b/Bindings/Portable/Consts.cs index 6110af1b4..7ce70b9e7 100644 --- a/Bindings/Portable/Consts.cs +++ b/Bindings/Portable/Consts.cs @@ -5,7 +5,9 @@ namespace Urho { internal static class Consts { -#if IOS +#if DESKTOP + public const string NativeImport = "mono-urho"; +#elif IOS public const string NativeImport = "@rpath/Urho.framework/Urho"; #elif UWP_HOLO public const string NativeImport = "mono-holourho"; diff --git a/Bindings/iOS/UrhoSurface.cs b/Bindings/iOS/UrhoSurface.cs index 918bd1ff1..1fbb5ccb8 100644 --- a/Bindings/iOS/UrhoSurface.cs +++ b/Bindings/iOS/UrhoSurface.cs @@ -3,58 +3,126 @@ using System.Runtime.InteropServices; using CoreGraphics; using UIKit; +using Foundation; +using System.ComponentModel; +using System.Threading; namespace Urho.iOS { + [Register("UrhoSurface"), DesignTimeVisible(true)] public class UrhoSurface : UIView { - [DllImport("@rpath/Urho.framework/Urho", CallingConvention = CallingConvention.Cdecl)] + [DllImport(Consts.NativeImport, CallingConvention = CallingConvention.Cdecl)] static extern void SDL_SetExternalViewPlaceholder(IntPtr viewPtr, IntPtr windowPtr); - TaskCompletionSource initTaskSource = new TaskCompletionSource(); + [DllImport(Consts.NativeImport)] + static extern void UIKit_StopRenderLoop(IntPtr window); - public Task InitializeTask => initTaskSource.Task; + static readonly SemaphoreSlim Semaphore = new SemaphoreSlim(1); + bool paused; - public UrhoSurface() + public UrhoSurface() { } + public UrhoSurface(IntPtr handle) : base(handle) { } + + public override void AwakeFromNib() { - UrhoPlatformInitializer.DefaultInit(); - initTaskSource = new TaskCompletionSource(); - BackgroundColor = UIColor.Black; + base.AwakeFromNib(); } public UrhoSurface(CGRect frame) : base(frame) { UrhoPlatformInitializer.DefaultInit(); - BackgroundColor = UIColor.Black; - initTaskSource = new TaskCompletionSource(); } - public void Pause() + public static void Pause() { - if (!Urho.Application.HasCurrent) return; - Urho.Application.Current.Engine.PauseMinimized = true; + if (!Application.HasCurrent) return; + Application.Current.Input.Enabled = false; + Application.Current.Engine.PauseMinimized = true; Sdl.SendWindowEvent(SdlWindowEvent.SDL_WINDOWEVENT_FOCUS_LOST); Sdl.SendWindowEvent(SdlWindowEvent.SDL_WINDOWEVENT_MINIMIZED); } - public void Resume() + public static void Resume() { - if (!Urho.Application.HasCurrent) return; - Urho.Application.Current.Engine.PauseMinimized = false; + if (!Application.HasCurrent) return; + Application.Current.Input.Enabled = true; + Application.Current.Engine.PauseMinimized = false; Sdl.SendWindowEvent(SdlWindowEvent.SDL_WINDOWEVENT_FOCUS_GAINED); Sdl.SendWindowEvent(SdlWindowEvent.SDL_WINDOWEVENT_RESTORED); } - - public override void MovedToWindow() + + public Application Application { get; private set; } + + public bool Paused { - base.MovedToWindow(); - var wndHandle = Window?.Handle; - SDL_SetExternalViewPlaceholder(Handle, wndHandle ?? IntPtr.Zero); - if (wndHandle != null) { - initTaskSource.TrySetResult (true); - } else { - initTaskSource = new TaskCompletionSource (); + get { return paused; } + set + { + if (!value) + Resume(); + else + Pause(); + paused = value; + } + } + + public async Task Show(ApplicationOptions opts = null) where TApplication : Application + { + return (TApplication)(await Show(typeof(TApplication), opts)); + } + + public async Task Show(Type appType, ApplicationOptions opts = null) + { + UrhoPlatformInitializer.DefaultInit(); + await Task.Yield(); + paused = false; + opts = opts ?? new ApplicationOptions(); + await Semaphore.WaitAsync(); + if (Application.HasCurrent) + await Application.Current.Exit(); + await Task.Yield(); + + SDL_SetExternalViewPlaceholder(Handle, Window.Handle); + + Hidden = true; + var app = Application.CreateInstance(appType, opts); + Application = app; + app.Run(); + Semaphore.Release(); + await Application.ToMainThreadAsync(); + InvokeOnMainThread(() => Hidden = false); + return app; + } + + public static void StopRendering(Application app) + { + Resume(); + StartOrStopAnimationCallback(false); + } + + static void StartOrStopAnimationCallback(bool start) + { + if (Application.HasCurrent && Application.Current.Graphics?.IsDeleted != true) + { + var window = Application.Current.Graphics.SdlWindow; + if (window != IntPtr.Zero) + UIKit_StopRenderLoop(window); + } + } + + public async Task Stop() + { + if (Application == null && Application.IsActive) + return; + + await Semaphore.WaitAsync(); + Application.Exit(); + foreach (var view in Subviews) + { + view.RemoveFromSuperview(); } + Semaphore.Release(); } } } \ No newline at end of file diff --git a/Extensions/Urho.Extensions.Cocoa/UrhoSurface.cs b/Extensions/Urho.Extensions.Cocoa/UrhoSurface.cs index dfa5ad922..3a732d9e8 100644 --- a/Extensions/Urho.Extensions.Cocoa/UrhoSurface.cs +++ b/Extensions/Urho.Extensions.Cocoa/UrhoSurface.cs @@ -87,8 +87,12 @@ public async Task Show(Type appType, ApplicationOptions opts = null var app = Application.CreateInstance(appType, opts); Application = app; app.Run(); + Hidden = true; + Semaphore.Release(); StartLoop(app); + await Task.Yield(); + Hidden = false; return app; } diff --git a/Tests/Playgrounds/Playgrounds.Cocoa/AppDelegate.cs b/Tests/Playgrounds/Playgrounds.Cocoa/AppDelegate.cs index dda9488de..1ac69ca8b 100644 --- a/Tests/Playgrounds/Playgrounds.Cocoa/AppDelegate.cs +++ b/Tests/Playgrounds/Playgrounds.Cocoa/AppDelegate.cs @@ -19,5 +19,15 @@ public override void WillTerminate(NSNotification notification) { // Insert code here to tear down your application } + + public override NSApplicationTerminateReply ApplicationShouldTerminate(NSApplication sender) + { + return base.ApplicationShouldTerminate(sender); + } + + public override bool ApplicationShouldTerminateAfterLastWindowClosed(NSApplication sender) + { + return true; + } } } diff --git a/Tests/Playgrounds/Playgrounds.Cocoa/ViewController.cs b/Tests/Playgrounds/Playgrounds.Cocoa/ViewController.cs index 41a04d8b9..cd2ed1dd5 100644 --- a/Tests/Playgrounds/Playgrounds.Cocoa/ViewController.cs +++ b/Tests/Playgrounds/Playgrounds.Cocoa/ViewController.cs @@ -1,9 +1,9 @@ using System; using Urho; using Urho.Extensions.Cocoa; -using Playgrounds.WinForms; using AppKit; using Foundation; +using System.Threading.Tasks; namespace Playgrounds.Cocoa { @@ -17,7 +17,6 @@ public ViewController(IntPtr handle) : base(handle) {} public override async void ViewDidLoad() { base.ViewDidLoad(); - urhoSurface = new UrhoSurface(); urhoSurface.Frame = UrhoSurfacePlaceholder.Bounds; @@ -27,6 +26,7 @@ public override async void ViewDidLoad() async partial void RestartClicked(NSObject sender) { + await Task.Yield(); game = await urhoSurface.Show(new ApplicationOptions()); } diff --git a/Tests/Playgrounds/Playgrounds.WinForms/Game.cs b/Tests/Playgrounds/Playgrounds.WinForms/Game.cs index 2454f7d6c..3b3c952d3 100644 --- a/Tests/Playgrounds/Playgrounds.WinForms/Game.cs +++ b/Tests/Playgrounds/Playgrounds.WinForms/Game.cs @@ -3,7 +3,7 @@ using Urho.Gui; using Urho.Shapes; -namespace Playgrounds.WinForms +namespace Playgrounds { class Game : Application { @@ -18,6 +18,8 @@ public Game(ApplicationOptions opts) : base(opts) { } public float Yaw { get; private set; } public float Pitch { get; private set; } + public static Urho.Color BackgroundColor { get; set; } = Color.White; + protected override void Start() { instanceId++; @@ -53,8 +55,8 @@ protected override void Start() // Viewport Viewport = new Viewport(Context, Scene, camera, null); - Viewport.RenderPath.Append(CoreAssets.PostProcess.FXAA3); - Viewport.SetClearColor(Color.White); + //Viewport.RenderPath.Append(CoreAssets.PostProcess.FXAA2); + Viewport.SetClearColor(BackgroundColor); Renderer.SetViewport(0, Viewport); new MonoDebugHud(this).Show(Color.Red); @@ -100,10 +102,31 @@ protected void SimpleMoveCamera3D(float timeStep, float moveSpeed = 10.0f) if (Input.GetKeyDown(Key.D)) CameraNode.Translate(Vector3.UnitX * moveSpeed * timeStep); } + protected void MoveCameraByTouches(float timeStep) + { + var input = Input; + for (uint i = 0, num = input.NumTouches; i < num; ++i) + { + TouchState state = input.GetTouch(i); + if (state.TouchedElement != null) + continue; + + if (state.Delta.X != 0 || state.Delta.Y != 0) + { + var camera = CameraNode.GetComponent(); + Yaw += 2 * camera.Fov / Graphics.Height * state.Delta.X; + Pitch += 2 * camera.Fov / Graphics.Height * state.Delta.Y; + CameraNode.Rotation = new Quaternion(Pitch, Yaw, 0); + } + } + } + protected override void OnUpdate(float timeStep) { if (Input.GetMouseButtonDown(MouseButton.Left)) SimpleMoveCamera3D(timeStep); + MoveCameraByTouches(timeStep); + helloText.Value = $"UrhoSharp Instance: {instanceId}\nResolution: {Graphics.Width}x{Graphics.Height}"; base.OnUpdate(timeStep); } diff --git a/Tests/Playgrounds/Playgrounds.Wpf/MainWindow.xaml.cs b/Tests/Playgrounds/Playgrounds.Wpf/MainWindow.xaml.cs index 579090d53..9a686e56f 100644 --- a/Tests/Playgrounds/Playgrounds.Wpf/MainWindow.xaml.cs +++ b/Tests/Playgrounds/Playgrounds.Wpf/MainWindow.xaml.cs @@ -1,6 +1,5 @@ using System.Windows; using System.Windows.Media; -using Playgrounds.WinForms; namespace Playgrounds.Wpf { diff --git a/Tests/Playgrounds/Playgrounds.iOS/AppDelegate.cs b/Tests/Playgrounds/Playgrounds.iOS/AppDelegate.cs new file mode 100644 index 000000000..9e24e9392 --- /dev/null +++ b/Tests/Playgrounds/Playgrounds.iOS/AppDelegate.cs @@ -0,0 +1,59 @@ +using Foundation; +using UIKit; + +namespace Playgrounds.iOS +{ + // The UIApplicationDelegate for the application. This class is responsible for launching the + // User Interface of the application, as well as listening (and optionally responding) to application events from iOS. + [Register("AppDelegate")] + public class AppDelegate : UIApplicationDelegate + { + // class-level declarations + + public override UIWindow Window + { + get; + set; + } + + public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions) + { + // Override point for customization after application launch. + // If not required for your application you can safely delete this method + + return true; + } + + public override void OnResignActivation(UIApplication application) + { + // Invoked when the application is about to move from active to inactive state. + // This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) + // or when the user quits the application and it begins the transition to the background state. + // Games should use this method to pause the game. + } + + public override void DidEnterBackground(UIApplication application) + { + // Use this method to release shared resources, save user data, invalidate timers and store the application state. + // If your application supports background exection this method is called instead of WillTerminate when the user quits. + } + + public override void WillEnterForeground(UIApplication application) + { + // Called as part of the transiton from background to active state. + // Here you can undo many of the changes made on entering the background. + } + + public override void OnActivated(UIApplication application) + { + // Restart any tasks that were paused (or not yet started) while the application was inactive. + // If the application was previously in the background, optionally refresh the user interface. + } + + public override void WillTerminate(UIApplication application) + { + // Called when the application is about to terminate. Save data, if needed. See also DidEnterBackground. + } + } +} + diff --git a/Tests/Playgrounds/Playgrounds.iOS/Assets.xcassets/AppIcon.appiconset/Contents.json b/Tests/Playgrounds/Playgrounds.iOS/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..4e646784c --- /dev/null +++ b/Tests/Playgrounds/Playgrounds.iOS/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,157 @@ +{ + "images": [ + { + "idiom": "iphone", + "size": "29x29", + "scale": "1x" + }, + { + "idiom": "iphone", + "size": "29x29", + "scale": "2x" + }, + { + "idiom": "iphone", + "size": "29x29", + "scale": "3x" + }, + { + "idiom": "iphone", + "size": "40x40", + "scale": "2x" + }, + { + "idiom": "iphone", + "size": "40x40", + "scale": "3x" + }, + { + "idiom": "iphone", + "size": "57x57", + "scale": "1x" + }, + { + "idiom": "iphone", + "size": "57x57", + "scale": "2x" + }, + { + "idiom": "iphone", + "size": "60x60", + "scale": "2x" + }, + { + "idiom": "iphone", + "size": "60x60", + "scale": "3x" + }, + { + "idiom": "ipad", + "size": "29x29", + "scale": "1x" + }, + { + "idiom": "ipad", + "size": "29x29", + "scale": "2x" + }, + { + "idiom": "ipad", + "size": "40x40", + "scale": "1x" + }, + { + "idiom": "ipad", + "size": "40x40", + "scale": "2x" + }, + { + "idiom": "ipad", + "size": "50x50", + "scale": "1x" + }, + { + "idiom": "ipad", + "size": "50x50", + "scale": "2x" + }, + { + "idiom": "ipad", + "size": "72x72", + "scale": "1x" + }, + { + "idiom": "ipad", + "size": "72x72", + "scale": "2x" + }, + { + "idiom": "ipad", + "size": "76x76", + "scale": "1x" + }, + { + "idiom": "ipad", + "size": "76x76", + "scale": "2x" + }, + { + "size": "24x24", + "idiom": "watch", + "scale": "2x", + "role": "notificationCenter", + "subtype": "38mm" + }, + { + "size": "27.5x27.5", + "idiom": "watch", + "scale": "2x", + "role": "notificationCenter", + "subtype": "42mm" + }, + { + "size": "29x29", + "idiom": "watch", + "role": "companionSettings", + "scale": "2x" + }, + { + "size": "29x29", + "idiom": "watch", + "role": "companionSettings", + "scale": "3x" + }, + { + "size": "40x40", + "idiom": "watch", + "scale": "2x", + "role": "appLauncher", + "subtype": "38mm" + }, + { + "size": "44x44", + "idiom": "watch", + "scale": "2x", + "role": "longLook", + "subtype": "42mm" + }, + { + "size": "86x86", + "idiom": "watch", + "scale": "2x", + "role": "quickLook", + "subtype": "38mm" + }, + { + "size": "98x98", + "idiom": "watch", + "scale": "2x", + "role": "quickLook", + "subtype": "42mm" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +} \ No newline at end of file diff --git a/Tests/Playgrounds/Playgrounds.iOS/Assets.xcassets/Contents.json b/Tests/Playgrounds/Playgrounds.iOS/Assets.xcassets/Contents.json new file mode 100644 index 000000000..4caf392f9 --- /dev/null +++ b/Tests/Playgrounds/Playgrounds.iOS/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Tests/Playgrounds/Playgrounds.iOS/Assets.xcassets/First.imageset/Contents.json b/Tests/Playgrounds/Playgrounds.iOS/Assets.xcassets/First.imageset/Contents.json new file mode 100644 index 000000000..dbeeb8907 --- /dev/null +++ b/Tests/Playgrounds/Playgrounds.iOS/Assets.xcassets/First.imageset/Contents.json @@ -0,0 +1,55 @@ +{ + "images": [ + { + "filename": "vector.pdf", + "idiom": "universal" + }, + { + "scale": "1x", + "idiom": "universal" + }, + { + "scale": "2x", + "idiom": "universal" + }, + { + "scale": "3x", + "idiom": "universal" + }, + { + "idiom": "iphone" + }, + { + "scale": "1x", + "idiom": "iphone" + }, + { + "scale": "2x", + "idiom": "iphone" + }, + { + "subtype": "retina4", + "scale": "2x", + "idiom": "iphone" + }, + { + "scale": "3x", + "idiom": "iphone" + }, + { + "idiom": "ipad" + }, + { + "scale": "1x", + "idiom": "ipad" + }, + { + "scale": "2x", + "idiom": "ipad" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +} diff --git a/Tests/Playgrounds/Playgrounds.iOS/Assets.xcassets/First.imageset/vector.pdf b/Tests/Playgrounds/Playgrounds.iOS/Assets.xcassets/First.imageset/vector.pdf new file mode 100644 index 0000000000000000000000000000000000000000..47d911dea647d55983671ead4d08b6f6b3600715 GIT binary patch literal 2465 zcmai03se(l7FLvisY+L#f-EBsK`11Xkc1=%MIujmB|xQ!>5vQ%APFP`Mlf5nSPOKE z2-^C>7DZkM!J;Da5{kfrC?Kvp3J41-3shFXvhuJqKo*oer*r0H{{P-P_x0cTzLzjD!bE z0qT;#Q7l4Gy%fMoXJaKT`@{5#R(MOqJPwQifv8iK6A%Ot9L14h2`38T!2s4PM=1!< zmL06}VYAA|ay#jZRs>HpA%X+eQW4rufWU%d1w5GTy!X#LeZsF_+~ccZmn3Fi)v^Z; zIG;?uU*yLLEYs61tjD>gXOFvSWsh{48xJvPNqKrIJtMdCz2cA2aC7TF?b@K`V!Lw- zE;zpH&ApqhoRjAHt}gK}>(qAc8dvrkD31*`<5<%C(&4_LqhQ3-GOf8~n^leG?+-@@^pjPa$J2gW@O)!b9hdTJ zTauyIJ&~rqeEZC1p9dWgx7{_WRc2=drMO=wcT7B{Zd58z`d)r_36r4V<6PGkCjpGfbnVMtm@;b}F!T?)Qav$_y7H5T;Mf!T}M zWxP9TNqrV?e5;b|pWd3^u2KAatk&3aDB@0 zZBaQNdCZ2#fblzYZnRCCjQ-GQWb-s8bX&<)?SxnUGdDYVFVk`xIf7@g3~$DX`H71_;r5OSZz1p`$_8y_9 z{;MJJ+n=>7Ewg;GnGHoz)&ID0z@F2!e$F7cWQ?d6s(!VY)_Gw})xCyMvsD={5i&H* zAIr_ACo8;Se6<*!-mm9Am79Iz^RVlc?%S5sg|E*SyIV{dd9{Mpf#d3cih5WKt=%ps zBEo)bt8EjmeCFYJRYU|b7d`p+-V|X2wOCYtyLP6t=!WH-kgdf0A};ytPfZiCwVPx{ z`g;zpe{8a4RQxQUwVU02<4X3w|9h;}XjhGWquqn{vVqq8g{*}BQF9=ybe_TM*!M=rFs1pN)yzctIXAoicsCe6>fit>wgZ#vp^hZOY0`J`rx zwdSK?GwR_xm9;5XjH|vf{O+Yg-)z;s*xt>;-vU`D-_SK<=~4eEVQkV~57{vyH6ebu>DqwE~Mx_A31Lg~$ zy`i52ew?GEluE%AN>ju*5z~dx2QQLP-G+E>o|En2+s&<^4*d zWD+<8PXs_Jp7_5Dpi(Gg3J?M;%Rn0{dcxQRh!ip+iHJ_e`!bM1MGxwI8Iedr+x>wI zq@&04fsADHfBccq^gpm8Q_u-~Uj|Z$YwSR(^_mzUb!}Xb2Cj`uqphg}v_Y%?Fs=;= zWq3s{hy)Tu!ji@RJsd$C+G{F6V2j1*Xk+7xo|LO7M2yb)(wc=%x-AclP9pLsbTF7m tf?*P!2EjJu5MD57P32Q4pdJ3tO_shCDT2=K;$ebx8ymcd$v!V9{2$sQiO>K5 literal 0 HcmV?d00001 diff --git a/Tests/Playgrounds/Playgrounds.iOS/Assets.xcassets/Second.imageset/Contents.json b/Tests/Playgrounds/Playgrounds.iOS/Assets.xcassets/Second.imageset/Contents.json new file mode 100644 index 000000000..dbeeb8907 --- /dev/null +++ b/Tests/Playgrounds/Playgrounds.iOS/Assets.xcassets/Second.imageset/Contents.json @@ -0,0 +1,55 @@ +{ + "images": [ + { + "filename": "vector.pdf", + "idiom": "universal" + }, + { + "scale": "1x", + "idiom": "universal" + }, + { + "scale": "2x", + "idiom": "universal" + }, + { + "scale": "3x", + "idiom": "universal" + }, + { + "idiom": "iphone" + }, + { + "scale": "1x", + "idiom": "iphone" + }, + { + "scale": "2x", + "idiom": "iphone" + }, + { + "subtype": "retina4", + "scale": "2x", + "idiom": "iphone" + }, + { + "scale": "3x", + "idiom": "iphone" + }, + { + "idiom": "ipad" + }, + { + "scale": "1x", + "idiom": "ipad" + }, + { + "scale": "2x", + "idiom": "ipad" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +} diff --git a/Tests/Playgrounds/Playgrounds.iOS/Assets.xcassets/Second.imageset/vector.pdf b/Tests/Playgrounds/Playgrounds.iOS/Assets.xcassets/Second.imageset/vector.pdf new file mode 100644 index 0000000000000000000000000000000000000000..401614e288b4b160471c2776bed6f09762af3e1c GIT binary patch literal 2423 zcmai02~-nz8dqq7rWU#)x2z)&iMWtV?gK$2a)?|BP!TbkV}J-Gl1wmy+3G9S0=uOY zwCjai6uBOPMMdNiN`VDYKwLQr2#W^`R93*Ua=0^)EGYY4=grIf|KIohziYnv{elnR zdN_hk6db<(+3RPcxs!iut8c(j0TLh=9mY931H^rhEE0|aXo!dh5Iv+ZFr+}9F+v#P zLSnfD0$f~hN>~92V{z)WJA&2)5rW!|I?;o?oI*%zejJiuY>hFLQwKlAa9O+PnPh#% zJp~JAfs-De6u@;{cREMs}D-sGib_4>50m8_|Uj-zC0m@Qx zJV+^5Da4Qxpf3sBtKZs<_aI$Cb1T+h<->yL^rfiGNelYkqgC3#SqVP_iy*_RPcbjH)xYf zvYdC-)D_t8c{=5%;$VJQxs_#61J*kuXMC?|&PbPo-7uSxoNr~&J94|gKk+03JGXXM zx4w~=^VUzWqQveu_ilRgPdgNNdnLZCH`=;w91}cP5ihdm*B_jI+rk=Pz2Lk!)XUu| zkls3P5&YHJ!t0kF+MUVBHOAx)a zy|JxHNd37z*~b5#%*0w_F|#4?erNP;pG`Fevoq2%?9Y>%Cmzv1(ks;aPIGaiy1mhU zr{7lB^Mem&`QK{b{uiDC zLD8muY(FNk{YdV|zO#o_VB%);8|~Bh(Z4p?GM}g-HN2;q7~YNl-lD~HZ$taYw$Fzbn6c?c5eo=@`i>()el#qwB)hI-gp0 ztsw@dh-I5NJkk)RCoBC`L8ffKfY)=oG=#4LA9TO6eA}9~@a6dupB+=S{%s&NY}^0GY`hAqod)uxXHitrN%bWOJohV>t?!&Z#d4y^7J@=Oh`HV zee**4j>xRUd)|D0^I-B#<`m1-5PO{)!v(q?ecFYqr_8Q{+z7#n0uFbq%_?hZ-Ck(6NRn=vDS7Nb1Xxx_)9`!i- zGR>av*PJ+P_AGO*a_$FbtCCISg5PK44p&W#t$)+HVcxpR9LAL%_Pv$p`0tO*sYZD0 zCG3-ipr4WoVbjpw%Nf^r^rnWcDcjumgBPEjO;NM6QtZ8wU#0rjHx5zs%CahF4$W*U zxu!q8kYP+>v!BNPVIRJUGIWU@7qVvx2VZDw4gV8%z%bjpF#aF(W|PmliwlakuRq>= zhaCRc^R!7T)#Twb0{!Tns=CxGcGX|leErg`f3|v0eBXxHU&6Sj-_>zOL!!d+j5Xt* zPS;rWd^zEF{5d5%)nNK=)zFJ8Uc=aQKD%UK)_TNes1Gh{SD*Mb_@O` z7*zs9Uq~Vq?v|^8FcM-yLGMKzR3YFB0z@CFM2X-dio%Gu6&MJj=I?uS7sA3AdE^p8 zE49$PjJzPIJwfn;jso7X2#jynr3dO@p5QAK1O9wqKLC=PkQjj~p#n|-5O`ihbTzzu zL{}2QEe28pJYfVZRW56FL`LvO&|C^1Th{0}hQMW$Ng$QPpnzlwnMnf=kVy8(y==L% zLMa>r0gELdT + + + + + diff --git a/Tests/Playgrounds/Playgrounds.iOS/FirstViewController.cs b/Tests/Playgrounds/Playgrounds.iOS/FirstViewController.cs new file mode 100644 index 000000000..d6bef0ef6 --- /dev/null +++ b/Tests/Playgrounds/Playgrounds.iOS/FirstViewController.cs @@ -0,0 +1,70 @@ +using System; +using CoreGraphics; +using UIKit; +using Urho; +using Urho.iOS; + +namespace Playgrounds.iOS +{ + public partial class FirstViewController : UIViewController + { + UrhoSurface urhoSurface; + Game game; + + protected FirstViewController(IntPtr handle) : base(handle) + { + } + + public override async void ViewDidLoad() + { + base.ViewDidLoad(); + + // Restart button + UIButton restartBtn = new UIButton(UIButtonType.RoundedRect); + restartBtn.Frame = new CGRect(10f, 0f, 50, 50f); + restartBtn.SetTitle("Restart", UIControlState.Normal); + restartBtn.TouchUpInside += async (sender, e) => game = await urhoSurface.Show(new ApplicationOptions()); + View.AddSubview(restartBtn); + + // Stop button + UIButton stopBtn = new UIButton(UIButtonType.RoundedRect); + stopBtn.Frame = new CGRect(75f, 0f, 50, 50f); + stopBtn.SetTitle("Stop", UIControlState.Normal); + stopBtn.TouchUpInside += (sender, e) => + { + urhoSurface.Stop(); + game = null; + }; + View.AddSubview(stopBtn); + + // Spawn button + UIButton spawnBtn = new UIButton(UIButtonType.RoundedRect); + spawnBtn.Frame = new CGRect(135f, 0f, 50, 50f); + spawnBtn.SetTitle("Spawn", UIControlState.Normal); + spawnBtn.TouchUpInside += (sender, e) => + { + if (game != null) + Urho.Application.InvokeOnMain(() => game?.SpawnRandomShape()); + }; + View.AddSubview(spawnBtn); + + // Pause/Unpause button + UIButton pauseBtn = new UIButton(UIButtonType.RoundedRect); + pauseBtn.Frame = new CGRect(200f, 0f, 80, 50f); + pauseBtn.SetTitle("(Un)pause", UIControlState.Normal); + pauseBtn.TouchUpInside += (sender, e) => urhoSurface.Paused = !urhoSurface.Paused; + View.AddSubview(pauseBtn); + + urhoSurface = new UrhoSurface(); + urhoSurface.Frame = new CoreGraphics.CGRect(0, 50, View.Bounds.Width, View.Bounds.Height - 50); + urhoSurface.AutoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight; + View.Add(urhoSurface); + } + + public override void DidReceiveMemoryWarning() + { + base.DidReceiveMemoryWarning(); + // Release any cached data, images, etc that aren't in use. + } + } +} diff --git a/Tests/Playgrounds/Playgrounds.iOS/FirstViewController.designer.cs b/Tests/Playgrounds/Playgrounds.iOS/FirstViewController.designer.cs new file mode 100644 index 000000000..1448b15d4 --- /dev/null +++ b/Tests/Playgrounds/Playgrounds.iOS/FirstViewController.designer.cs @@ -0,0 +1,20 @@ +// WARNING +// +// This file has been generated automatically by Xamarin Studio from the outlets and +// actions declared in your storyboard file. +// Manual changes to this file will not be maintained. +// +using Foundation; +using System; +using System.CodeDom.Compiler; + +namespace Playgrounds.iOS +{ + [Register ("FirstViewController")] + partial class FirstViewController + { + void ReleaseDesignerOutlets () + { + } + } +} \ No newline at end of file diff --git a/Tests/Playgrounds/Playgrounds.iOS/Info.plist b/Tests/Playgrounds/Playgrounds.iOS/Info.plist new file mode 100644 index 000000000..3e3a6f4ca --- /dev/null +++ b/Tests/Playgrounds/Playgrounds.iOS/Info.plist @@ -0,0 +1,40 @@ + + + + + CFBundleName + Playgrounds.iOS + CFBundleIdentifier + com.xamarin.playgrounds-ios + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1.0 + LSRequiresIPhoneOS + + MinimumOSVersion + 9.0 + UIDeviceFamily + + 1 + 2 + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + XSAppIconAssets + Assets.xcassets/AppIcon.appiconset + + diff --git a/Tests/Playgrounds/Playgrounds.iOS/LaunchScreen.storyboard b/Tests/Playgrounds/Playgrounds.iOS/LaunchScreen.storyboard new file mode 100644 index 000000000..a6c72bb02 --- /dev/null +++ b/Tests/Playgrounds/Playgrounds.iOS/LaunchScreen.storyboard @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Tests/Playgrounds/Playgrounds.iOS/Main.cs b/Tests/Playgrounds/Playgrounds.iOS/Main.cs new file mode 100644 index 000000000..c09eb5c4d --- /dev/null +++ b/Tests/Playgrounds/Playgrounds.iOS/Main.cs @@ -0,0 +1,15 @@ +using UIKit; + +namespace Playgrounds.iOS +{ + public class Application + { + // This is the main entry point of the application. + static void Main(string[] args) + { + // if you want to use a different Application Delegate class from "AppDelegate" + // you can specify it here. + UIApplication.Main(args, null, "AppDelegate"); + } + } +} diff --git a/Tests/Playgrounds/Playgrounds.iOS/Main.storyboard b/Tests/Playgrounds/Playgrounds.iOS/Main.storyboard new file mode 100644 index 000000000..e9483751c --- /dev/null +++ b/Tests/Playgrounds/Playgrounds.iOS/Main.storyboard @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Tests/Playgrounds/Playgrounds.iOS/Playgrounds.iOS.csproj b/Tests/Playgrounds/Playgrounds.iOS/Playgrounds.iOS.csproj new file mode 100644 index 000000000..3935d5316 --- /dev/null +++ b/Tests/Playgrounds/Playgrounds.iOS/Playgrounds.iOS.csproj @@ -0,0 +1,131 @@ + + + + Debug + iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF} + {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Exe + Playgrounds.iOS + Playgrounds.iOS + Resources + + + true + full + false + bin\iPhoneSimulator\Debug + DEBUG;ENABLE_TEST_CLOUD; + prompt + 4 + iPhone Developer + true + true + true + true + 35738 + None + x86_64 + HttpClientHandler + + + pdbonly + true + bin\iPhone\Release + + prompt + 4 + iPhone Developer + true + true + Entitlements.plist + SdkOnly + ARMv7, ARM64 + HttpClientHandler + + + pdbonly + true + bin\iPhoneSimulator\Release + + prompt + 4 + iPhone Developer + true + true + None + i386, x86_64 + HttpClientHandler + + + true + full + false + bin\iPhone\Debug + DEBUG;ENABLE_TEST_CLOUD; + prompt + 4 + iPhone Developer + true + true + true + true + true + Entitlements.plist + SdkOnly + ARMv7, ARM64 + HttpClientHandler + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FirstViewController.cs + + + SecondViewController.cs + + + Game.cs + + + + + {048373C2-B60A-4F61-B095-287C57437EFB} + Urho.iOS + + + + + CoreData.pak + + + + \ No newline at end of file diff --git a/Tests/Playgrounds/Playgrounds.iOS/SecondViewController.cs b/Tests/Playgrounds/Playgrounds.iOS/SecondViewController.cs new file mode 100644 index 000000000..016f3ff72 --- /dev/null +++ b/Tests/Playgrounds/Playgrounds.iOS/SecondViewController.cs @@ -0,0 +1,28 @@ +using System; + +using UIKit; +using Urho; +using Urho.iOS; + +namespace Playgrounds.iOS +{ + public partial class SecondViewController : UIViewController + { + protected SecondViewController(IntPtr handle) : base(handle) + { + // Note: this .ctor should not contain any initialization logic. + } + + public override async void ViewDidLoad() + { + base.ViewDidLoad(); + // Perform any additional setup after loading the view, typically from a nib. + } + + public override void DidReceiveMemoryWarning() + { + base.DidReceiveMemoryWarning(); + // Release any cached data, images, etc that aren't in use. + } + } +} diff --git a/Tests/Playgrounds/Playgrounds.iOS/SecondViewController.designer.cs b/Tests/Playgrounds/Playgrounds.iOS/SecondViewController.designer.cs new file mode 100644 index 000000000..92eea4653 --- /dev/null +++ b/Tests/Playgrounds/Playgrounds.iOS/SecondViewController.designer.cs @@ -0,0 +1,20 @@ +// WARNING +// +// This file has been generated automatically by Xamarin Studio from the outlets and +// actions declared in your storyboard file. +// Manual changes to this file will not be maintained. +// +using Foundation; +using System; +using System.CodeDom.Compiler; + +namespace Playgrounds.iOS +{ + [Register ("SecondViewController")] + partial class SecondViewController + { + void ReleaseDesignerOutlets () + { + } + } +} \ No newline at end of file diff --git a/Urho.sln b/Urho.sln index fca36426f..3413f347f 100644 --- a/Urho.sln +++ b/Urho.sln @@ -96,6 +96,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Urho.Extensions.Cocoa", "Ex EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Playgrounds.Cocoa", "Tests\Playgrounds\Playgrounds.Cocoa\Playgrounds.Cocoa.csproj", "{AA325D2D-B242-4773-B303-A609C4DA5017}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Playgrounds.iOS", "Tests\Playgrounds\Playgrounds.iOS\Playgrounds.iOS.csproj", "{8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}" +EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution Bindings\Urho.Shared.projitems*{048373c2-b60a-4f61-b095-287c57437efb}*SharedItemsImports = 4 @@ -2390,6 +2392,78 @@ Global {AA325D2D-B242-4773-B303-A609C4DA5017}.RelWithDebInfo|x64.Build.0 = Release|Any CPU {AA325D2D-B242-4773-B303-A609C4DA5017}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU {AA325D2D-B242-4773-B303-A609C4DA5017}.RelWithDebInfo|x86.Build.0 = Release|Any CPU + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Ad-Hoc|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Ad-Hoc|Any CPU.Build.0 = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Ad-Hoc|ARM.ActiveCfg = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Ad-Hoc|ARM.Build.0 = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Ad-Hoc|iPhone.ActiveCfg = Release|iPhone + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Ad-Hoc|iPhone.Build.0 = Release|iPhone + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Ad-Hoc|x64.ActiveCfg = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Ad-Hoc|x64.Build.0 = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Ad-Hoc|x86.ActiveCfg = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Ad-Hoc|x86.Build.0 = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.AppStore|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.AppStore|Any CPU.Build.0 = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.AppStore|ARM.ActiveCfg = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.AppStore|ARM.Build.0 = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.AppStore|iPhone.ActiveCfg = Release|iPhone + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.AppStore|iPhone.Build.0 = Release|iPhone + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.AppStore|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.AppStore|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.AppStore|x64.ActiveCfg = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.AppStore|x64.Build.0 = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.AppStore|x86.ActiveCfg = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.AppStore|x86.Build.0 = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Debug|ARM.ActiveCfg = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Debug|ARM.Build.0 = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Debug|iPhone.ActiveCfg = Debug|iPhone + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Debug|iPhone.Build.0 = Debug|iPhone + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Debug|x64.ActiveCfg = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Debug|x64.Build.0 = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Debug|x86.ActiveCfg = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Debug|x86.Build.0 = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Package|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Package|Any CPU.Build.0 = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Package|ARM.ActiveCfg = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Package|ARM.Build.0 = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Package|iPhone.ActiveCfg = Release|iPhone + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Package|iPhone.Build.0 = Release|iPhone + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Package|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Package|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Package|x64.ActiveCfg = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Package|x64.Build.0 = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Package|x86.ActiveCfg = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Package|x86.Build.0 = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Release|Any CPU.ActiveCfg = Release|iPhone + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Release|Any CPU.Build.0 = Release|iPhone + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Release|ARM.ActiveCfg = Release|iPhone + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Release|ARM.Build.0 = Release|iPhone + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Release|iPhone.ActiveCfg = Release|iPhone + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Release|iPhone.Build.0 = Release|iPhone + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Release|x64.ActiveCfg = Release|iPhone + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Release|x64.Build.0 = Release|iPhone + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Release|x86.ActiveCfg = Release|iPhone + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.Release|x86.Build.0 = Release|iPhone + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.RelWithDebInfo|Any CPU.Build.0 = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.RelWithDebInfo|ARM.ActiveCfg = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.RelWithDebInfo|ARM.Build.0 = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.RelWithDebInfo|iPhone.ActiveCfg = Release|iPhone + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.RelWithDebInfo|iPhone.Build.0 = Release|iPhone + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.RelWithDebInfo|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.RelWithDebInfo|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.RelWithDebInfo|x64.ActiveCfg = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.RelWithDebInfo|x64.Build.0 = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.RelWithDebInfo|x86.ActiveCfg = Debug|iPhoneSimulator + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF}.RelWithDebInfo|x86.Build.0 = Debug|iPhoneSimulator EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -2422,5 +2496,6 @@ Global {E37A3156-6705-4864-AB4C-5457665A744D} = {7B31BB67-CA12-41DD-8DDF-779B7E7561D3} {0703D797-E1A2-48A9-AB21-ABCDC46D4E7F} = {F150367D-92FD-4017-80DA-10058DA8414F} {AA325D2D-B242-4773-B303-A609C4DA5017} = {7B31BB67-CA12-41DD-8DDF-779B7E7561D3} + {8C12B028-853C-4E51-AB9D-FD4CE4C50FBF} = {7B31BB67-CA12-41DD-8DDF-779B7E7561D3} EndGlobalSection EndGlobal diff --git a/Urho3D/Source b/Urho3D/Source index 258fbf824..bb8e0a499 160000 --- a/Urho3D/Source +++ b/Urho3D/Source @@ -1 +1 @@ -Subproject commit 258fbf824eb2c083be183b6db9f986c9f891954f +Subproject commit bb8e0a499033682e01101afe8f2892143e2467b9