Until now, the Platform::Sdl2Application was the go-to solution for mostplatforms including the web and mobile. However, not everybody needs all thefeatures SDL provides and, especially on Emscripten, apart from simplifyingporting it doesn’t really add anything extra on top. On the contrary, theadditional layer of translation between HTML5 and SDL APIs increases theexecutable size and makes some features unnecessarily hard to access.
Your Mac’s Recovery Mode is a treasure trove of useful tools, and it’s the easiest way to wipe your computer and start from scratch. Shut down your Mac, turn it on while holding down Command+R. Your Mac will boot into the recovery partition. Data made available by Net Applications credits Mac OS X with a a share of 7.31% of the operating system market with Windows at 91.79%. In that way MS over whelm.
To solve that, the new Platform::EmscriptenApplication, contributed inmosra/magnum#300 by @Squareys, is using Emscripten HTML5 APIsdirectly, opening new possibilities while making the code smaller and moreefficient.
Since there’s some confusion about SDL among Emscripten users, let’s clarifythat first. Using SDL in Emscripten is actually possible in two ways — theimplicit support, implemented in library_sdl.js,gives you a slightly strange hybrid of SDL1 and SDL2 in a relatively smallpackage. Not all SDL2 APIs are present there, on the other hand it has enoughfrom SDL2 to make it a viable alternative to the SDL2 everyone is used to. Thisis what Platform::Sdl2Application is using.
This was the first Mac OS X article I wrote, but you'll find a good number of other Mac related articles here now. By the way, if you are completely unfamilar with Unix command line interfaces, you can get a very complete and basic introduction from Take Control of the Mac Command Line with Terminal. That's an inexpensive PDF book that starts. Os X High Sierra Dmg Piratebay How To Use Dmg File In Windows What Is Mac Open Base Dmg 3d Compositing Software Thepiratebay Dmg How To Install Mac Os From Dmg Download Pidgin For Mac Dmg Divinity 2 Does Finesse Weapons Use Finesse Dmg How To Convert A Dmg File To Iso Windows 7 Dmg Doesn't Open After Attaching. The video you just watched is a free application for Mac OS X called Clutter, brought to us by the fine folks over at Sprote Rsrch. Clutter allows you to pick albums from your iTunes library that you’d like strewn about on your desktop.
The other way is a “full SDL2”, available if you pass -s USE_SDL=2
to thelinker. Two years ago we tried to remove all Emscripten-specific workaroundsfrom Platform::Sdl2Application by switching to this full SDL2, butquickly realized it was a bad decision — in total it removed 30 lines ofcode, but caused the resulting code to be almost 600 kB larger. The sizeincrease was so serious that it didn’t warrant the very minor improvements incode maintainability. For the record, the original pull request is archived atmosra/magnum#218.
All application implementations in Magnum strive for almost full APIcompatibility, with the goal of making it possible to use an implementationoptimal for chosen platform and use case. This was already the case withPlatform::GlfwApplication and Platform::Sdl2Application, whereswitching from one to the other is in 90% cases just a matter of using adifferent #include
and passing a different component to CMake’sfind_package()
.
The new Platform::EmscriptenApplication continues in this fashion and weported all existing examples and tools that formerly usedPlatform::Sdl2Application to it to ensure it works in broad use cases.Apart from that, the new implementation fixes some of the long-standing issueslike miscalculated event coordinates on mobile web browsers or theDelete key leaking through text input events.
Only two widely used APIs are missing from it right now — thePlatform::Sdl2Application::tickEvent() andPlatform::Sdl2Application::setSwapInterval(). The former will getadded together with an equivalent in GLFW application, while the secondwill be exposed differently, allowing to use the extended browser APIs.Right now it’s enough to#ifdef
around it, as browsers, unlikemost desktop platforms, enable VSync by default.Since the very beginning, all Magnum application implementations default toredrawing only when needed in order to save power — because Magnum is notjust for games that have to animate something every frame, it doesn’t makesense to use up all system resources by default. While this is simple toimplement efficiently on desktop apps where the application has the fullcontrol over the main loop (and thus can block indefinitely waiting for aninput event), it’s harder in the callback-based browser environment.
The original Platform::Sdl2Application makes use ofemscripten_set_main_loop(),which periodically calls window.requestAnimationFrame()in order to maintain a steady frame rate. For apps that need to redraw onlywhen needed this means the callback will be called 60 times per second only tobe a no-op. While that’s still significantly more efficient than drawingeverything each time, it still means the browser has to wake up 60 times persecond to do nothing.
Platform::EmscriptenApplication instead makes use ofrequestAnimationFrame()directly — the next animation frame is implicitly scheduled, but cancelledagain after the draw event if the app doesn’t wish to redraw immediately again.That takes the best of both worlds — redraws are still VSync’d, but thebrowser is not looping needlessly if the app just wants to wait with a redrawfor the next input event. To give you some numbers, below is a ten-secondoutput of Chrome’s performance monitor comparing SDL and Emscripten appimplementation waiting for an input event. You can reproduce this with theMagnum Player — no matter how complexanimated scene you throw at it, if you pause the animation it will use as muchCPU as a plain static text web page.
Arguably to simplify porting, the Emscripten SDL emulation recalculates allinput event coordinates to match framebuffer pixels. The actual DPI scaling(or device pixel ratio) is then being exposed through dpiScaling(),making it behave the same as Linux, Windows and Android on high-DPI screens. Incontrast, HTML5 APIs behave like macOS / iOS andPlatform::EmscriptenApplication follows that behavior —framebufferSize()thus matches device pixels while windowSize()(to which all events are related) is smaller on HiDPI systems. For moreinformation, check out the DPI awareness docs.
It’s important to note that even though different platforms expose DPIawareness in a different way, Magnum APIs are designed in a way that makesit possible to have the same code behave correctly everywhere. Theseparation into dpiScaling(),framebufferSize() andwindowSize() propertiesis mainly for a more fine-grained control where needed.Because we didn’t end up using the heavyweight “full SDL2” in the first place,the difference in executable size is nothing extreme — in total, in a ReleaseWebAssembly build, the JS size got smaller by about 20 kB, while the WASM filestays roughly the same.
On the other hand, since the new application doesn’t use any of the emscripten_set_main_loop()
APIs from library_browser.js
, it makes ita good candidate for playing with the relatively recentMINIMAL_RUNTIME feature of Emscripten.Now, while Magnum is moving in the right direction, it’s not yet in a statewhere this would “just work”. Supporting MINIMAL_RUNTIME
requires eithermoving fast and breaking lots of things or have the APIs slowly evolve into astate that makes it possible. Because reliable backwards compatibility andpainless upgrade path is a valuable asset in our portfolio, we chose thelatter — it will eventually happen, but not right now. Another reason is thatwhile Magnum itself can be highly optimized to be compatible with minimalruntime, the usual application code is not able to satisfy those requirementswithout removing and rewriting most third-party dependencies.
That being said, why not spend one afternoon with a chainsaw and trydemolishing the code to see what could come out? It’s however important tonote that MINIMAL_RUNTIME
is still a very fresh feature and thus it’s verylikely that a lot of code will simply not work with it. All the discoveredproblems are listed below because at this point there are no results at allwhen googling them, so hopefully this helps other people stuck in similarplaces:
environ
variable (used byUtility::Arguments) results in writeAsciiToMemory()
beingcalled, which is right now explicitly disabledfor minimal runtime (and thus you either get a failure at runtime or theClosure Compiler complaining about these names being undefined). SinceEmscripten’s environment is just a bunch of hardcoded values and Magnum isusing Node.js APIs to get the real values for command-line apps anyway,solution is to simply not use those functions.llvm_stacksave()
andllvm_stackrestore()
. The JavaScript implementationsthen call stackSave()
and stackRestore()
which however do notget pulled in in MINIMAL_RUNTIME
, again resulting in either a runtimeerror every time you call into JS (so also allemscripten_set_mousedown_callback()
functions) or when you use theClosure Compiler. After wasting a few hours trying to convince Emscriptento emit these two by adding _llvm_stacksave__deps:['$stackSave']
theultimate solution was to kill everything stream-related. Consideringeveryone who’s interested in MINIMAL_RUNTIME
probably did that already,it explains why this is another ungoogleable error.strftime()
and the only way to get ridof it is removing all stream usage as well. Grep your JS file for Monday
— if it’s there, you have a problem.dynCall()
or allocate()
are notavailable and putting them into either EXTRA_EXPORTED_RUNTIME_METHODS
or RUNTIME_FUNCS_TO_IMPORT
either didn’t do anything or moved theerror into a different place. For the former it was possible to work aroundit by directly calling one of its specializations (in that particular casedynCall_ii()
), the second resulted in a frustrated tableflip and therelevant piece of code getting cut off.Below is a breakdown of various optimizations on a minimal application thatdoes just a framebuffer clear, each step chopping another bit off the totaldownload size. All sizes are uncompressed, built in Release mode with -Oz
,--llvm-lto 1
and --closure 1
. Later on in the process,Bloaty McBloatFace experimentalWebAssembly support was used to discover what functions contribute the most to finalcode size.
Operation | JS size | WASM size |
---|---|---|
Initial state | 52.1 kB | 226.3 kB |
Enabling minimal runtime 1 | 36.3 kB | 224.5 kB |
Additional slimming flags 2 | 35.7 kB | 224.5 kB |
Disabling filesystem 3 | 19.4 kB | 224.5 kB |
Chopping off all C++ stream usage | 14.7 kB | 83.6 kB |
Enabling CORRADE_NO_ASSERT | 14.7 kB | 75.4 kB |
Removing a single use of std::sort()4 | 14.7 kB | 69.3 kB |
Removing one std::unordered_map4 | 14.7 kB | 62.6 kB |
Using emmalloc instead of dlmalloc 5 | 14.7 kB | 56.3 kB |
Removing all printf() usage 6 | 14.7 kB | 44 kB (estimate) |
-s MINIMAL_RUNTIME=2 -s ENVIRONMENT=web -lGL
plus temporarilyenabling also -s IGNORE_CLOSURE_COMPILER_ERRORS=1
in order to makeClosure Compiler survive undefined variable errors due to iostreams andother, mentioned above-s SUPPORT_ERRNO=0 -s GL_EMULATE_GLES_VERSION_STRING_FORMAT=0 -s GL_EXTENSIONS_IN_PREFIXED_FORMAT=0 -s GL_SUPPORT_AUTOMATIC_ENABLE_EXTENSIONS=0 -s GL_TRACK_ERRORS=0 -s DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1
— basically disabling what’s enabled by default. In particular, theGL_EXTENSIONS_IN_PREFIXED_FORMAT=0
is not supported by Magnum rightnow, causing it to not report any extensions, but that can be easily fixed.The result of disabling all these is … underwhelming.-s FILESYSTEM=0
, makes Emscripten not emit any filesystem-relatedcode. Magnum provides filesystem access through various APIs(Utility::Directory, GL::Shader::addFile(),Trade::AbstractImporter::openFile(), …) and at the moment there’sno possibility to compile all these out, so this is a nuclear option thatworks.-s MALLOC=emmalloc
instead. We don’tpretend Magnum is at that state yet, but other projectssucessfully switched to it, shavingmore bytes off the download size.While all of the above size reductions were done in a hack-and-slash manner,the final executable still initializes and executes properly, clearing theframebuffer and reacting to input events. For reference, check out diffs ofthe chainsaw-surgery
branches in corradeand magnum.
The above is definitely not all that can be done — especially consideringthat removing two uses of semi-heavy STL APIs led to almost 20% save in codesize, there are most probably more of such low hanging fruits. The above taskswere added to mosra/magnum#293 (if not there already) and will getgradually integrated into master
.
Bright times ahead! The new Platform::EmscriptenApplication is the firststep to truly minimal WebAssembly builds and the above hints that it’s possibleto have download sizes not too far from code carefully written in plain C.To give a fair comparison, the basic framebuffer clear sample from@floooh‘s Sokol Samples is 42kB in total, while the above equivalent is roughly 59 kB. Using C++(11), butnot overusing it — and that’s just the beginning.
Questions? Complaints? Share your opinion on social networks:Twitter,Reddit r/cpp,r/WebAssembly,Hacker NewsWhen looking at the changelog for the latest version, it’s hard to believe thatonly six months passed since the last release, 2018.04.The list is — as usual — very long, so I’m only cherry-picking the mostinteresting bits. Scroll way down for the full detailed change lists.
This long-awaited feature finally managed to rise to the top of the prioritylist and so the new release contains a brand-new Animation namespace.Some design ideas are borrowed from Ozz-Animation,with one end goal being high-performance playback of animations imported fromglTF files (with other formats cominglater). The other goal is being able to quickly iterate on hand-craftedanimations of arbitrary values when writing a gameplay or UI transitions.
The animation library supports interleaved or separate keyframe data forcache-optimized data access; float
s, std::chrono, frame index(or just anything) for representing time, and yes, you can also animatestrings, enum values, bool
s or even the state of another animation —and why not animating a time value to make the playback non-linear! There’s aset of builtin interpolation modes —constant, linear, spherical linear and spline-based; but you can also supplyyour own interpolator function if you need some ease-in/ease-out, or, forexample, unpack a quaternion from a 10–10–10–2 representation first.
At the moment the Animation library is marked as experimentalLabyr1nth mac os. as its API is not set in stone yet. There’s a lot to explain, so stay tuned fordetailed introductory blogposts (and examples) for all features. For a briefoverview, check the Animation::Track and Animation::Player classdocs.
Animation import is done through the new Trade::AnimationData class andat the moment the Trade::AbstractImporter interfaces handle just basicobject transformation. Skinning and morphing will need some more-or-lessbreaking changes to some Trade APIs and so these features are scheduledfor next releases. Along with that, the goal for the Trade library isallowing zero-copy asset import — for example playing back an animationdirectly from a memory-mapped glTF file, with no data copies in between. Seemosra/magnum#240 for further work in this area.
I had to stop adding new features because the release would otherwise nevermake it out. There’s already more in the buffer — builtin easingfunctions, interpolator chaining and more. See mosra/magnum#101help wanted for details. There’s lot of small andself-contained things to work on, so if you feel brave and want to help,let us know!
While the Animation API itself doesn’t have any dedicated example yet,there’s now a new app, Magnum Player, that can play back a scene fileyou throw at it. The final goal for this app will be showcasing the full Magnumfeature set — debugging and introspection tools, material tweaking etc. Checkout the online version below — it supports multi-file drag&drop, so simplydrop a glTF file on it to play it. If you don’t have any glTF file handy,there’s the official Khronos glTF sample model repositoryon GitHub. Sketchfab also has 1000s of modelsdownloadable as glTF.
After the hard work of removing mandatory OpenGL dependency was done in2018.04, Magnum is slowly gaining bits and pieces needed for Vulkan support. InJune I took over a maintainership of flextGL and addedVulkan support to it. Shortly after, Magnum gained a Vk library thatprovides platform-independent function pointer loading. It gives you a choicewhether you want global function pointers (like with OpenGL) or manage themlocally. See the original post about flextGLfor details.
The Vk library also provides conversion of generic PixelFormat,SamplerFilter, MeshPrimitive, … enums to Vulkan-specificVkFormat, VkFilter, VkPrimitiveTopology, … values.That allows you to use Magnum asset management APIs to load image and scenedata and use them directly without time-consuming manual format conversion.There is also a new example focused on rendering a simple triangle to anoffscreen buffer using a handcrafted SPIR-V shader and then saving it as a PNGusing the Magnum PngImageConverter plugin.
Further additions like shader/SPIR-V tools, device/instance abstractionsand initial pieces of the Vulkan backend are scheduled for next releases.Subscribe to mosra/magnum#234 for updates. Red desert render mac os.
Long gone are the days of a standard 1024×768 resolution and fixed 96 DPI— dense screens are now a common feature for higher-end laptops and desktops.In the 2018.10 release, Magnum is DPI-aware on macOS, iOS, Linux andEmscripten. The usability goal is that requesting an 800×600 window willmake it the same physical size as an 800×600 window would have on a 96DPI screen — so basically with no extra involvement from the user. For weband mobile, Magnum simply ensures that for given canvas / screen size you’llget all the pixels that are there, with no scaling on top. If you have a HiDPIscreen, check out the WebGL demos on the Showcasepage — everything should be nicely crisp. This topic is way more complex thanit might seem, see DPI awareness for a detailed overviewof DPI-awareness on all platforms and what that means for you as a developer.
Unfortunately out-of-the-box Windows support didn’t make it to the release(though you are able to force arbitrary scaling with a --magnum-dpi-scaling
parameter). Full Android support and advanced things like DPI change eventswhen dragging a window across differently dense monitors are also waiting to bedone, see mosra/magnum#243help wanted for details.
Introduction of the Animation library required quite a few additions tothe Math library — there’s a new Math::CubicHermite class forCubic Hermite splines. As a generic base for TCB curves and Catmull-Rom splinesthey are easily convertible to and from Math::Bezier.
Cubic spline interpolation is henceforth referred to as splerp
— Thew (@AmazingThew) December 24, 2016And because spline storage is useless on its own, the zoo of interpolationfunctions got extended with Math::splerp() variants. Besides that, theexisting Math::lerp() was extended to allow linear interpolation ofMath::CubicHermite points, if you ever need that, and there’s a newMath::select() utility that does constant interpolation of all existingmath types. And also strings, enums or booleans. See thefull list in the documentation. There’salso a recent blog post aboutneglected optimization opportunities in quaternion interpolation.
As a side-product of Squareys’ bachelor thesis,Magnum gained a large collection of cone intersection functions in theMath::Intersection namespace. The Math::Range class gotintersection methods as well, along with other niceties.
Many projects either use or interface with the GLMlibrary and so it made sense to be interoperable with it. Simply include one ofthe headers in the GlmIntegration library and you’ll get conversion ofall vector, matrix and quaternion types and also an ability to print the GLMtypes using Utility::Debug:
Listing all the additions to Math library would be beyond overwhelming, jumpto the complete changelog for the rest.
Yes, it’s now possible to get a GL::Mesh directly fromTrade::MeshDatawith a single click —just use the brand new MeshTools::compile() reimplementation and it’lldrag all GL::Buffer instances along with itself, without you needing tomanage them. Of course there are flexibility tradeoffs, so when using the meshAPIs directly, you have the option of GL::Mesh::addVertexBuffer() eithertaking a non-owning reference to the buffer or fully taking over its ownership.
There’s a new Containers::ScopedExit class that simply calls a passedexit / close / destroy function on given value at the end of scope. Very usefulwhen interacting with low-level C APIs and much easier than wrestling withstd::unique_ptr, trying to convince it to do the same.
If you ever need to iterate on a array of interleaved values and take alwaysthe third value, there’s now Containers::StridedArrayView that abstractsit away. It’s used internally by the Animation::TrackView APIs to allowfor both flexible and cache-efficient layout of keyframe data.
There’s a new Utility::format() family offunctions for Python-style type-safe string formatting. The reason I’m addingthis is because std::ostream (and to some extent printf())is notoriously inefficient, negatively affecting executable size especially onasm.js / WebAssembly targets. However the full implementation didn’t make itinto the release, only the surface APIs, Magnum is not ported away from streamsjust yet — there will be a detailed post about all this later 😉
More of an internal thing, the DebugTools::CompareImage utility got aCompareImageToFile counterpart,together with other combinations. In subsequent updates, these will get usedfor fuzzy shader output verification — very important for implementing PBRshaders that are later on the roadmap.
Shown above is a new Primitives::gradient2D() function (together withits 3D counterpart), useful for simple backdrops. The Shaders::Phongshader got a long-requested support for multiple lights and there’s now alphamasking support in both Shaders::Phong and Shaders::Flat —useful for quick’n’dirty prototyping when you don’t want to bother yourselfwith depth sorting or OIT.
Since the TinyGltfImporter plugin initialrelease in 2018.04, it’s receiving an endless stream of updates. While thebiggest new feature is animation import, it also received support formulti-primitive meshes, name mapping for all data, camera aspect ratio importand various conformance fixes and performance improvements. It’s now easier toaccess its internal state, in case youwant to parse custom glTF properties or access data that the importer does notsupport yet.
To support loading data from memory, from AAssetManager
on Android orfor example voa drag&drop on Emscripten, all scene and image importers nowsupport file loading callbacks.For you it means you can continue loading assets as usual — using theirfilenames — and only set up a different file callback for each platform. Theimplementation was done in a way that makes all existing (and future) pluginsimplicitly work with file callbacks, moreover theTinyGltfImporter,AssimpImporter andOpenGexImporter also use provided filecallbacks for external data referenced from scene files (such as images or databuffers).
There’s finally a JpegImageConverter pluginfor compressing JPEG files, using a libJPEG implementation of your choice —be it the vanilla implementation, libjpeg-turboor, for example, MozJPEG. Similarly, thestb_image-based StbImageConvertergot updated to support JPEG output as well — and you can load either of themusing the JpegImageConverter
alias. Both plugins support specifying theoutput quality via a runtime setting; more encoding options may be added in thefuture.
Among other things, the StbTrueTypeFont wasupdated to a new version of stb_truetype
, gaining OTF support, and you cannow load it (along with the other HarfBuzzFont andFreeTypeFont implementations) via the genericOpenTypeFont
alias.
If you happen to be using Magnum with a buildsystem other than CMake, there’snow a high-level guide, pointing out the biggestpain points. The Math::Matrix4 and Matrix3 docsare improved with equations visualizing most operations; theMath::Intersection and Math::Distance functions andMath::Constants got updated equations as well.
The Using the scene graph guide now has a visual intro, explaining the basicconcepts; the JavaScript, HTML5 and WebGL and Android guideswere extended with further tips and troubleshooting items. Oh, and theShaders and Primitives docs now have images that look properlycrisp on HiDPi screens.
Magnum is now over eight years old and it became apparent that some earlyfunctionality didn’t stand the test of time — either because it depended ona now-outdated toolkit, because the required time investment for continuedmaintenance was not worth it or simply because it was a design experiment thatfailed. The following libraries are now marked as deprecated, are not built bydefault (in case they ever were) and will be completely removed in about sixmonths time.
The Shapes
obsolete library, together withDebugTools::ShapeRenderer
obsolete and theBulletIntegration::convertShape()
obsolete function.Failed design experiment that couldn’t ever be made performant (and abusing%
operators for collision queries was just plain wrong).
Related geometry algorithms were moved to Math::Distance andMath::Intersection namespaces. If you need a full-fledged physicslibrary, please have look at Bullet, whichhas Magnum integration in BulletIntegration (together with debugdraw implemented in BulletIntegration::DebugDraw), or atBox2D, which has a Magnum exampleas well.
The Platform::GlutApplication
obsolete application. It’sbased on an outdated GLUT toolkit, has portability issues and doesn’t makesense on the path forward to Vulkan. Consider switching to eitherPlatform::Sdl2Application or Platform::GlfwApplication. https://os-bee-mac-torrentjoomla-rush-rlf.peatix.com.
The ColladaImporter
obsolete plugin, because it’s based onan outdated Qt4 toolkit. Moreover, due to the sheer complexity of theCOLLADA format and poor conformance of various exporters it’s not feasibleto maintain a builtin importer anymore. Consider either usingAssimpImporter for COLLADA import orswitching to better-designed and better-supported formats such as glTF orOpenGEX using TinyGltfImporter orOpenGexImporter. There’s also the officialCOLLADA2GLTF converter.
With a heavy heart I have to say that recent updates of MSVC 2017 wereregressing instead of improving with their C++11 conformance, crashing withInternal Compiler Error on code involving constexpr
. While wemanaged to reproduce and work around all reported issues so far, it mayhappen that your code triggers some new corner case. Try to update to thelatest version first and if the problem persists,let us know. Thank you and sorry for the bumps.
Note that MSVC 2015 is not affected by these.
Two new examples were contributed by our great community, namely an integrationof the Box2D physics engine and an advanced depth-aware mouse interactionexample. Both are ported to WebGL and you can play with them right now:
The Magnum website is never storing any cookies or doing user tracking (anddoesn’t plan to be doing that), so there’s no need to be worried about yourdata being compromised. Nevertheless, it’s now served over HTTPS, with acertificate from Let’s Encrypt. Some tradeoffswere made as it’s either full security or supporting the not-most-recentbrowsers (but not both), so if you experience any issues, please let us know.
Sometimes ahard kickis all it takes to get things done.
Magnum is now partnering with a few universities with a goal of improvingcomputer graphics courses by offering students things that are fun to playwith. You’re invited to the party as well — each GitHub repositorynow has issues marked with a help wanted label and theseissues are specifically picked to be self-contained, excercise a well-definedarea of knowledge and to not require deep understanding of Magnum internals.The most rewarding among these are various examples, you can also implement afancy algorithm, integrate support for a new file format or share yourexpertise in an area you know the best. If you pick something, let us knowand we’ll help you get on the right path.
There’s also a possibility to write a guest postfor this very blog and share interesting details about a Magnum-related thingyou’re working on.
In contrast to 2018.04, this release is more of an evolutional one.Nevertheless, even though we’re always going to extreme lengths to preservebackwards compatibility, it may happen that some changes will have negativeaffect on your code. Please check the Deprecated APIs and Potentialcompatibility issues sections in the complete changelog below for moreinformation.
Thanks to @matjam there’s now aPPA repositorycontaining prebuilt packages for Ubuntu 14.04, 16.04 and 18.04. If you followthe #movingtogitlab movement,Magnum now has a mirror on GitLab, butnote that primary development, roadmap and milestone planning is stillhappening on GitHub and will stay there for the foreseeable future.
The 2018.10 release is already available in Homebrewand ArchLinux AUR. At thetime of writing, the PPA repository, Vcpkg andArchLinux repos are not updated yet, we’reworking on getting the latest version there as well.
It’s longer than you might expect 😉
Lots of work in this release is done thanks to external contributors:
[community]
package maintenanceAgain thanks a lot to everyone, not to forget all people who reported issues,suggested improvements or just wrote encouraging messages on theGitter chat. Cheers!