4D Draw

Revision History

1.10.1 26 Oct 2023

Removes temporary code needed to work around a bug in iOS 17.0.x. This new version runs correctly on iOS 15, 16 and 17.1 or later.

1.10 3 Oct 2023

Adjusted navigation bar for iOS 17 compatibility.

When running on iOS 17, the navigation bar includes a drop-down menu that lets you • export your drawing's source code • rename your drawing (However, iOS 17.0.2 is a bit quirky about how it updates the navigation bar: for example, opening the Export panel can cause the navigation bar to revert to the drawing's previous title.)

5 Apr 2023

Replaced UIKit gesture handlers with SwiftUI gesture handlers.

10 Mar 2023

On iOS 16, moves the drawing title up to the navigation bar.

9 Mar 2023

In Touch Alternatives message, changed "Preferences" to "Settings" for consistency with macOS 13.

7 Sep 2022

Saves exported images to "Exported Images/<drawing name>/"

29 Aug 2022

Changed iOS Deployment Target to iOS 15, because it's now widely used, and I have no iOS 14 device to test on.

26 Jul 2022

(iOS) Added option to Export drawings with transparent background.

1.9 5 Apr 2022

(iOS) Entire app re-written in Swift for simplicity (in particular to avoid the awkward interface between the SwiftUI interface code and the old C code) and easier maintainability.

26 Jan 2022

(iOS) Set a threshold below which the drawing doesn't rotate, even if inertia is on. This makes it easier to keep the drawing still at the end of a rotation.

19 Dec 2021

(legacy iOS) Changed iOS Deployment Target to iOS 14, because Apple has stopped supporting iOS 12. Thus, in particular, I no longer have a maintainable iOS 12 device to test on.

(legacy iOS) Added UINavigationBarAppearance so that navigation bars will have an opaque background when running on iOS 15.

26 Nov 2021

The SwiftUI version of GeometryGamesView invalidates itsAnimationTimer when the GeometryGamesView gets removed from its window, and recreates itsAnimationTimer when it gets added to a window. Before this fix, there was a memory leak because the run loop kept a strong reference to itsAnimationTimer and itsAnimationTimer keep a strong reference to the GeometryGamesView (and thence to itsModelData and itsRenderer).

19 Nov 2021

In the SwiftUI version of GeometryGamesBufferPool, replaced buffer.allocatedSize with buffer.length, to correctly allow reuse of MTLBuffers that have the desired size. Before this fix, the app was generating new buffers every frame.

1.8.1 15 Sep 2021

Added Italian translation, thanks to Daniela, Isabella Eva and Davide Bigatti

1.8 27 May 2021

(iOS) User interface rewritten in SwiftUI.

(iOS) New file browser supports iCloud Drive as well as local storage on device.

(iOS) More flexible image export.

1.7 20 Jan 2021

(macOS) Runs natively on both Apple Silicon and Intel Macs.

22 Nov 2020

Changed various GPU uniforms, colors in buffers, etc. to half-precision (__fp16 and faux_simd_half4) where appropriate.

5 Nov 2020

Removed workaround for bug that function-constant assignments like
constant bool gFoo [[ function_constant(0) ]];
constant bool gBar = ! gFoo;
used to work as expected on iOS but fail on macOS. They now work correctly on both OS’s.

1.6.4 1 Sep 2020

Swapped position of Help and Menu buttons.

Changed Menu button icon from “vertical dots” to “hamburger”.

12 Aug 2020

Added Portuguese translation, thanks to Nuno Fernandes

1 Jul 2020

Because the UISegmentedControl is a lot bulkier on iOS 13 than it was on iOS 12, it made the toolbar on my iPhone SE 2020 so crowdeded that the UIKit shrunk the Help and Etc toolbar buttons to perhaps half their normal size, leaving them hardly unnoticeable. To fix this problem, I re-made the Mode Selector's buttons at 20pt instead of 24pt, which leaves enough room for the Help and Etc buttons.

1 Jul 2020

Renders drawing colors as fully-saturated Display P3, when available.

16 Apr 2020

Renders to Wide Color (Display P3) when available.

Some of the shared code that won't be needed in the upcoming SwiftUI versions of the Geometry Games apps has been migrated to "-LEGACY" files, to allow the SwiftUI versions to include desired utilities without including legacy cruft like PixelRGBA, ImageRGBA, etc.

1.6.3 31 Mar 2020

(iOS) Converted launch screen format from .xib to .storyboard to comply with new App Store requirements.

1.6.2 8 Nov 2019

Replaced functions deprecated in iOS 13 or macOS 10.15 with non-deprecated alternatives.

1.6.1 11 Nov 2018

(macOS) Enabled Hardened Runtime to allow Notarization by Apple.

31 Oct 2018

(iOS) Added screenshots for iPad Pro (3rd Gen).

1.6 17 Oct 2018

(iOS) Table images, toolbar icons and other images re-created at @1x, @2x and @3x. Source files for those images all simplified and tidied up (now mostly as iDraw files).

(iOS) Toolbar icons resized to 24pt, which is the new recommended size.

16 Sep 2018

(iOS) Now Metal-only. Removed all OpenGL ES code.

30 Apr 2018

(macOS) On multi-GPU systems, selects the GPU that's already running the displays attached to the main computer (but ignores any externally attached removable GPUs). If the system switches to a different GPU, this app switches to that GPU as well.

(macOS) No longer calls [[NSNotificationCenter defaultCenter] removeObserver:self] because it's no longer necessary.

14 Apr 2018

(macOS) Main content view is now layer-backed. When going fullscreen, avoids macOS 10.13.4 bug.

22 Mar 2018

To refresh the user interface, overrides the newly reorganized -animationTimerFired:, in lieu of overriding -refreshAllViews as a few of the other Geometry Games apps do.

28 Sep 2017

CPU code consistently uses "double" (rather than "float") for essentially everything.

1.5 12 Jun 2017

(Mac) Completed Metal version for macOS.

6 Dec 2016

(Mac) Mac version is now Metal-only. Reason: The Mac OpenGL version of the Geometry Games uses an older approach that would have been very time-consuming to rewrite using a CAOpenGLLayer to bring it into line with iOS OpenGL, iOS Metal and Mac Metal versions. It hardly seemed worth investing that much time into OpenGL code that would soon get phased out anyhow. In any case, users of older Macs will always be able to download an older, OpenGL-compatible version of each app.

(Mac) Given that the Mac version is now Metal-only, it now requires macOS 10.12 or later. Reason: macOS 10.12 is the only version I can test the apps on, and I prefer not to release an app for earlier versions of the operating system, on which it's never been tested.

30 Nov 2016

Created a single project document with targets for iOS and macOS.

Created that single project document from scratch, to get rid of years of legacy cruft.

Retired the Android code.

1.4.2 1 Sep 2016

(iOS) Rewrote graphics using Metal. Falls back to OpenGL ES on older devices (pre-A7).

24 Aug 2016

(iOS) 4D Draw is now "device-assignable" for easy installation on school iPads via MDM.

15 May 2016

Separated OpenGL(ES)-specific data and code from graphics-system-independent data and code, in preparation for a migration from OpenGL(ES) to Metal on iOS and Mac (and maybe eventually to Vulkan on Android and to DX12 on Windows).

1.4.1 5 Apr 2016

(Android) Disabled COMPILE_ANDROID_FOR_GLES2, so app now requires OpenGL ES 3 on Android.

1.4 12 Jan 2016

(iOS) Updated for iOS 8/9. Extensive internal changes.

1.3 17 Nov 2015

(Mac) Updated code for Mac OS X 10.10, replacing all deprecated method calls. Requires OpenGL 3.3.

12 Nov 2015

(iOS, Mac) Converted memory management from Manual Retain-Release (MRR) to Automatic Reference Counting (ARC).

23 Oct 2015

(Mac) To work around a bug in OS X 10.11, installed a tweak in windowWillUseStandardFrame:defaultFrame: to manually account for the menu bar height.

28 Sep 2015

(iOS) Updated to require iOS 6. Removed -viewDidUnload and -shouldAutorotateToInterfaceOrientation.

25 May 2015

(Android) Fixed bug: No longer clears Undo/Redo stacks after device rotation

1.2.2 1 May 2015

(Mac) Stagger windows

(Android) "Up" navigation

(Android) Extended thumbnail label height

4 Apr 2015

(Mac) Lock and unlock drawings.

(Mac) Allows multiple windows.

1.2.1 31 Mar 2015

(Android) Saves image to Android's built-in Gallery app.

(Android) Smaller tab bar buttons so all six buttons fit on 320dp display.

1.2.0 22 Mar 2015

Added Android version.

22 Mar 2015

(iOS, Mac) Added "neutral mode" button.

(iOS, Mac) Automatically reverts to neutral mode if current mode becomes invalid.

23 Jan 2015

(iOS) Switched to view controller based status bar management, for consistent behavior (and flexibility) on iOS 7 and up.

20 Jan 2015

(Android) Finished migrating functionality to shared GeometryGamesApplication.java and GeometryGamesUtilities.java. Packaged shared C code into single library with app-specific C code.

1.1.0 18 Dec 2014

(iOS) New launch images that include new toolbar.

8 Dec 2014

(iOS) Portfolio-based user interface moved into code shared with KaleidoPaint.

(iOS) Drag thumbnails to re-order drawings.

(iOS) Lock/unlock drawings.

25 Nov 2014

(iOS) Loads and keeps only visible or nearly visible thumbnails, for better performance with large numbers of figures.

(iOS) Offers choice of touch-to-open or touch-for-menu interfaces.

12 Oct 2014

(Mac) Calls MarkEndpointEligibility() when reading a figure file.

1.0.1 3 Oct 2014

(iOS) Changed Bundle ID from "Draw4D-iOS" to "Draw4D-mobile" to avoid trademark infringement

21 Sep 2014

(iOS) Added iOS version

22 Aug 2014

(iOS) Minor changes for 64-bit iOS compatibility.

22 Aug 2014

Further migration to Char16.

21 Aug 2014

Expanded visibility of OpenGL headers, so the ModelData can refer to OpenGL objects as GLuint instead of "unsigned int", thus improving clarity and avoiding integer conversion warnings.

20 Aug 2014

Replaced L"…" → u"…" and L'·' → u'·'. The L syntax required -fshort-wchar to get 16-bit wide characters and generated copious warnings in Android, while the u syntax is part of the C11 standard.

19 Aug 2014

Completed deferred maintenance of Windows version (accommodated changes from last 15 months when I had no Windows computer).

6 Jul 2014

In New Point mode, dragging an existing point no longer clones it, but simply moves it.

1.0.0 23 Jun 2014

Initial public release