Two months af­ter the pre­vi­ous re­lease, Mag­num comes with the big­gest change in five years of its pub­lic his­to­ry. With 2018.04 the OpenGL wrap­ping lay­er and as­set man­age­ment APIs are no longer a core part of the li­brary, but com­plete­ly op­tion­al — this fi­nal­ly al­lows for the Vulkan port im­ple­men­ta­tion and al­so makes it pos­si­ble to use Mag­num in con­texts where it was not pos­si­ble be­fore. The changel­og since 2018.02 is al­most as long as list of changes for whole three years be­fore, so let’s dive right in!

OpenGL wrap­ping lay­er made op­tion­al There’s a new GL li­brary con­tain­ing all buf­fer, mesh, tex­ture and oth­er APIs that were pre­vi­ous­ly part of the core li­brary. It’s built by de­fault, but can be com­plete­ly dis­abled. Some Mag­num li­braries still have a hard de­pen­den­cy on it, at the mo­ment it’s Text and Shaders. This will change dur­ing the next re­leas­es, es­pe­cial­ly the Text li­brary is sched­uled to re­ceive up­dates that sep­a­rate the text lay­out­ing from GPU ren­der­ing. How­ev­er, these up­dates will be rather in­cre­men­tal com­pared to this re­lease. Some Mag­num li­braries pro­vide func­tion­al­i­ty that makes use of the GL li­brary (for ex­am­ple Mesh­Tools::com­pile() or De­bug­Tools::tex­ture­SubIm­age()). This doesn’t make them tied to it, how­ev­er — you can dis­able OpenGL in­te­gra­tion and leave just the API-ag­nos­tic fea­tures there. Look in the doc­u­men­ta­tion for de­tails.

Plug­in work­flow im­prove­ments A lot of ef­fort went in­to im­prov­ing the gen­er­al plug­in work­flow. Un­til now, load­ing a file us­ing plug­ins in­volved quite a lot of set­up in or­der to find and load the cor­rect plug­in from the filesys­tem. Not any­more — load­ing a mod­el from a glTF file is now just a mat­ter of this: PluginManager :: Manager < Trade :: AbstractImporter > manager ; std :: unique_ptr < Trade :: AbstractImporter > importer = manager . loadAndInstantiate ( "GltfImporter" ); importer -> openFile ( "cave.gltf" ); Containers :: Optional < Trade :: MeshData3D > data = importer -> mesh3D ( importer -> mesh3DForName ( "treasure-chest" )); And the work­flow is the same in­de­pen­dent­ly on the plat­form — thanks to @Squareys the Vcp­kg pack­ages al­so re­ceived up­dates that make the plug­in “just work” on Win­dows as well, in­clud­ing de­ploy­ment of all nec­es­sary files. There’s more — plug­in alias pri­or­i­ties, plug­in-spe­cif­ic con­fig­u­ra­tion and au­tomag­ic im­port of stat­ic plug­ins. And if you like glTF, there’s now a fresh TinyGlt­fIm­porter plug­in for im­port­ing this for­mat. Fur­ther de­tails about all plug­in us­abil­i­ty im­prove­ments are in a ded­i­cat­ed ar­ti­cle.