2024_04_28 - Atmospheric release

Newly introduced :

  • [657] : nkAstraeus : Added the EnvironmentRenderer, a class offering utilities to render dynamic shaders into cube maps, or converting cube maps to flat spherical maps. This tool can be used for instance to render the AtmosphereEffect into an environment texture and use it within the materials used to light the rendered objects.
  • [637] : nkAstraeus : Introduced the AtmosphereEffect, which allows to simulate an atmosphere and the way the light travels in it. While defaulting to a realistic looking atmosphere, the effect features a lot of customization points to allow for creative rendering.

Fixed :

  • [655] : nkMemory : Removed the exports for primitive types versions of BufferView, and BufferCast. These exports were causing templated methods that were not supposed to be exported, to be exported. This could cause issues when using them in a client project with mismatched compiler settings.

2024_04_01 - Next effect final preparations

Newly introduced :

  • [652] : nkGraphics : Added cross defines allowing to use 2d texture arrays in both GLSL and HLSL. See Program::setActivateCrossCompilerDefines() for the added defines (nkTexture2dArray, nkTexture2dArrayDecl).
  • [648] : nkGraphics : The nkGraphics::TextureUtils::computeIrradianceSH method has been moved to nkAstraeus::PbsEnvMapFilter::requestIrradianceComputing to better reflect its usage situations. The method now also supports cube maps as input. Also, it has been changed to generate the mip chain if possible and load the texture to make it directly usable.

Fixed :

  • [651] : nkMaths : Got rid of std::array within the Matrix class, as it proved, after more investigation, to be unsafe when mixing the release build in another debug project.
  • [653] : nkGraphics : Fixed an issue within the Dx12Renderer that prevented the correct feeding of 2d texture arrays to the shaders.
  • [649] : nkGraphics : Fixed an issue that would cause partially wrong output during gamma corrected mip generation, for the Dx11 and Dx12 renderers. Overall, the mips would be dimmer than they should be in some parts of the interpolated images. Gamma correction is now properly handled.

2024_03_03 - Better texture control

Newly introduced :

  • [646] : nkGraphics : It is now possible to request a texture to generate its mip chain after it has been loaded. This can be useful when generating a texture's first mip content by rendering to it, for instance. See Texture::generateMipChain().
  • [645] : nkWinUi : The Static component now allows to enable word wrapping, which will break lines to make them fit in width, within the component.
  • [639] : nkWinUi : The Font class is now ready to be used and allows to load a font face, linked to a size. Each component using text can now have a custom font set, allowing to customize further its look.
  • [644] : nkGraphics : The Dx12 renderer can now correctly generate mips for texture arrays / cubemaps.

Fixed :

  • [642] : nkGraphics : Fixed an issue that could cause a crash within the Dx11Renderer, if a render context was used and erased after.
  • [643] : nkGraphics : Fixed an issue that would prevent the Dx11/Dx12 renderers to correctly load texture arrays / cube maps if only a partial mip chain was provided.

2024_02_05 - Progressive Jpg

Newly introduced :

  • [634] : nkImages : JpgEncoder now supports decoding images using progressive DCT scans.

Fixed :

  • [636] : nkAstraeus : Improved the documentation of the vertex stage code within PostProcessingLib to properly state which semantic is output for the next stage.

2024_01_07 - Shadow mapping

Newly introduced :

  • [631] : nkAstraeus : The PbsMaterial now uses the newly introduced shader library to supports shadow mapping.
  • [628] : nkAstraeus : Introduced the ShaderLib concept, in which HLSL/GLSL sources are exposed and directly usable in any program, with cross language compatibility. This can range from simple methods to full stage sources, adding features or quality of life. The first introduced candidates are the ShadowMappingLib and the PostProcessingLib.
  • [627] : nkGraphics : Added more interoperability defines within the shader programs, helping to work with comparison (shadow) samplers. The change also sanitizes the way resources are declared and referred to. For instance, the old nkTexture2d(name, slot) changed to nkTexture2dDecl(name, slot), while nkTexture2d now refers to the raw type of a texture 2d. This allows to pass it around to functions, as an example. If you were using any of those defines, it will be necessary to add the "Decl" suffix. Please check the Program::setActivateCrossCompilerDefines() documentation for more information.
  • [629] : nkGraphics : The Camera class now supports switching between the perspective projection, and the orthographic projection.
  • [630] : nkImages : Added the method setPixel() to the ImageBase class, allowing to set a pixel's value in a transparent way. For now, this only supports uncompressed formats.
  • [632] : nkGraphics : Added support for UINT8 format indices within a Mesh. This format is now also detected within a GlTF file and correctly addressed. Note that for DirectX based renderers, it remains better to not go lower than UINT16 indices, as UINT8 format is not natively supported and requires manual work from the renderers.

2023_12_10 - Winter dusting

Newly introduced :

  • [620] : nkExport : Added the TreeReader utility class, which should offer an easier and more straightforward way to parse trees within the library. It supports a starting set of targets that will get developped over time.
  • [539] : nKEditor : The texture size shader pass memory slot now correctly feeds the right dimensions for each potential rendering context, when the texture is using dynamic sizes.
  • [623] : nkAstraeus : The PbsMaterial now offers the capability to mix a parameter given value with the one sampled from the texture provided. It is possible to do so for albedo, specular, emissive, environment, metalness, roughness / glossiness, alpha.
  • [617] : nkImages : The AlignmentDescriptor's _forceRgbFormat flag is now set to true by default, instead of false. This should make the decoding of Jpg more consistent with the rest of the formats, as setting this flag on false would output them in their native format, YUV.

Fixed :

  • [615] : nkMemory : Fixed an issue that could cause a crash when comparing a String or StringView with a nullptr char*.

2023_11_12 - Gltf2 Parsing Remaster

Newly introduced :

  • [576] : nkMemory : A first correct wasm wrapping of the Buffer and BufferView has been made. Features will be added later, but the initial correct usage and lifetime management has been implemented.
  • [441] : nkGraphics : The GltfEncoder has now been fully adapted to the new data infrastructure to support glTF2 parsing. It also has been improved to support both .glb and .gltf forms, and the KHR_materials_pbrSpecularGlossiness material extension. Please note that skins and joints are not fully supported yet and will be addressed later.
  • [605] : nkAstraeus : The PbsMaterial now also supports the glossiness based model. Please see PbsMaterial::setPbsModel to get more information on it. Used the opportunity to extend the THREE_CHANNEL_PACK enum to support all possible channels ordering.
  • [608] : nkGraphics : Added setRelativeTransform and setAbsoluteTransform with the Node API do be able to directly alter the transformation matrices. Also renamed the getLocalTransform method into getRelativeTransform to align it with the rest of the names within the API.

Fixed :

  • [614] : nkGraphics : The RESOURCE_MISC_FLAG enum previously available in Utils/DxDefinesWrapper.h is now moved into Resources/Enums/ResourceMiscFlag.h and has been made into an enum class (RESOURCE_MISC_FLAG). All previous references should update to this new include folder / enum class formatting requirements.
  • [612] : nkGraphics : The CPU_ACCESS_FLAG enum previously available in Utils/DxDefinesWrapper.h is now moved into Buffers/Enums/BufferCpuAccessFlag.h and has been made into an enum class (BUFFER_CPU_ACCESS_FLAG). All previous references should update to this new include folder / enum class formatting requirements.
  • [613] : nkGraphics : The BIND_FLAG enum previously available in Utils/DxDefinesWrapper.h is now moved into Buffers/Enums/BufferBindFlag.h and has been made into an enum class (BUFFER_BIND_FLAG). All previous references should update to this new include folder / enum class formatting requirements.
  • [611] : nkGraphics : The USAGE enum previously available in Utils/DxDefinesWrapper.h is now moved into Buffers/Enums/BufferUsage.h and has been made into an enum class (BUFFER_USAGE). All previous references should update to this new include folder / enum class formatting requirements.
  • [609] : nkAstraeus : Improved the PbsMaterial rendering especially when using Image Based Lighting, fixing a dark artifact that could appear when looking a diffuse material under the opposite direction of the specified light's one.

2023_10_16 - Gltf Preparations

Newly introduced :

  • [602] : nkExport : Added filtering capatilities within the Node member retrieval methods. This bonus parameter allows to put a constraint on the nature, or value type, of a member to retrieve. See Node::getMemberValue for more details on this.
  • [606] : nkGraphics : Simplified the Node hierarchy management API, down to only one method : setParentNode (from addChildNode, insertIntoTree, etc...). If you were using any method previously available, they need to be switched to child->setParentNode(parent) (equivalent of insertIntoTree). Please check the update Node documentation for more information.
  • [607] : nkGraphics : Added a callback parameter in the MainSystem::run() method signature, allowing to inject custom code within the default rendering loop. This can be used to inject a lambda updating inputs and a camera for each frame, for instance, without having to make a custom rendering loop right away.
  • [604] : nkImages : Improved jpeg parsing and image conversion performances.
  • [596] : nkAstraeus : The PbsMaterial now supports overloading the attributes semantic names it will look for, allowing it to adapt to any input layout a mesh could have.

Fixed :

  • [599] : nkGraphics : Fixed an issue within the DirectX based renderers, which would prevent any numerical suffixed semantic name within an input layout to be usable (for instance, TEXCOORD_0).
  • [598] : nkWinUi : Fixed an issue that prevented an ImageDisplay to correctly update when the linked Image was unloaded.
  • [603] : nkGraphics : Fixed an issue within the Dx12Renderer which could cause it to crash during its shutdown.
  • [601] : nkGraphics : Fixed an issue in the Dx12Renderer which could cause it to incorrectly load a mesh if the total layout stride was not aligning perfectly with the source vertex buffer size.
  • [600] : nkGraphics : Added a safety during mesh loading that checks an attribute's offset is not impossible to have. For instance, a buffer of size 160 with an offset of 180.

2023_09_18 - Improved PbsMaterial

Newly introduced :

  • [597] : nkAstraeus : PbsMaterial now supports having an occlusion texture. Occlusion will drive how the material will react to the diffuse lighting. See PbsMaterial::setOcclusionTexture().
  • [589] : nkGraphics : ObjEncoder now parses normal maps from an Obj's mtl file (field 'map_bump').
  • [595] : nkAstraeus : The PbsMaterial now reconstructs binormals during rendering, from the normal and tangent if normal mapping is requested. This behaviour is now enabled by default, but binormals can still be provided from the vertex buffers if needed, through setReconstructBinormals().
  • [592] : nkInputs : Added a center button (wheel) status getter within the MouseDevice.
  • [590] : nkAstraeus : The PbsMaterial now supports setting an alpha value, or an alpha map.
  • [591] : nkGraphics : ObjEncoder now parses alpha values and alpha maps from an Obj's mtl file (fields 'd' and 'map_d').

Fixed :

  • [594] : nkMemory : Made all containers nothrow_move_constructible and nothrow_constructible, which should allow for moving when nesting them into structures used within vectors.

2023_08_20 - Obj Materials

Newly introduced :

  • [572] : nkWinUi : The TreeView is now custom painted to offer an alternative look to the native one along with more capabilities like painting an icon as an item header.
  • [588] : nkWinUi : Updated Image and ImageDisplay to support alpha enabled images.
  • [486] : nkWinUi : Added a method to retrieve the screen's dimensions. See ComponentUtils::getScreenDimensions().
  • [587] : nkGraphics : The ConfigManager, ConfigReader, and ConfigHolder family classes have been replaced with a simpler Configuration class. As the engine evolved over time, these classes have become obsolete. What remains in the settings is the rendering API to use. The vsync setting has been moved to the render contexts. The support for automatic fullscreen support has been removed, but a utility method in nkWinUi has been added to be able to set it up as necessary (nkWinUi::ComponentUtils::getScreenDimensions()). For the nkEditor, a field "resourceFolder" has been added to its configuration file to customize the data folder.
  • [581] : nkScripts : The Environment has been updated to support variable retrieval through a path. As a result, it is now possible to get a nested variables by using, for instance, env.getVar("x.type.callback").
  • [585] : nkExport : It is now possible to index a tree using the path to the target member. See Node::getMemberValue's updated documentation.
  • [584] : nkMemory : Added a split utility method to the String and StringView.
  • [566] : nkGraphics : The ObjEncoder now supports decoding material information from an Obj file. The decoding structures have been updated to support everything needed, and new parameters have been introduced to customize the decoding process. See the updated nkGraphics::DecodedData structure and the new links available inside.
  • [579] : nkGraphics : Added a semanticName - format constructor to the MeshInputLayoutAttribute structure, for quality of life.

Fixed :

  • [586] : nkGraphics : Fixed an issue that would cause the Gles renderer to not properly detect semantic matching between a program, and the mesh and shader it is paired with. This would cause the program to be flagged as incompatible with the renderable, making it impossible to use.
  • [583] : nkMemory : Reworked the BufferCast implementation to avoid any use of delete[] within the header. This would cause discrepencies between the various build configurations and cause crashes if they were not compatible. The class should now be safe to use in any configuration.
  • [580] : nkGraphics : Fixed an issue that could cause a crash if a target size shader pass slot was used to render the first image, for the Dx12 and Gles renderers.

2023_07_23 - Web Assembly Bootstrap

Newly introduced :

  • [567] : nkWinUi : Added a new component, ImageDisplay, which allows to display images within the interface. Its associated type is IMAGE_DISPLAY, and to work with it, a new resource type has been added, Image. This new resource will be managed by the ImageManager.
  • [568] : nkWinUi : Added the Clipboard class, which is available through the MainSystem::getClipboard() method. This new class abstracts the OS clipboard and currently allows to copy text and images inside it.
  • [569] : nkExport : Propagated the nkMemory::UniquePtr where it matters to properly convery the idea of ownership.
  • [575] : nkWeb : Correctly bound and tested the basis of the nkMaths component, on the algebra side (Vector, Quaternion, Matrix). Please check the WebUnitTests to get a feel of how they can be used.
  • [574] : The Web Assembly build is now available in the Wasm/ folder of the release archive. Its unit test project is also part of the archive, to give an overview of what is supposed to be available, and how it can be used. Note that the web assembly build is still in its early days, and not everything is available nor perfect from the get go. Nevertheless, it is now possible to start experimenting with it !

2023_06_25 - nkEditor mesh attribute generation

Newly introduced :

  • [443] : nkGraphics : Improved the ObjEncoder to properly handle objects and groups, which will now create separate mesh decoded data entries.
  • [562] : nkEditor : Loading a mesh from a source file will now decode in the worker thread pool.
  • [557] : nkEditor : Now persisting the attribute generation and mesh import settings during mesh declaration file saving, and project saving.
  • [547] : nkEditor : Re-introduced the attribute generation UX within the mesh container UI. It now allows to compute normals, binormals and tangents in a compatible way with the changed mesh API within nkGraphics.

Fixed :

  • [565] : nkMemory : Fixed an issue that could make an equality test between 2 non null terminated StringView return an invalid result.
  • [564] : nkWinUi : Fixed an issue within the TreeView which prevented the UI under WinApi to be updated when calling the clearItems method.
  • [563] : nkGraphics : Fixed an issue within the RenderQueue which prevented the proper RenderStrategy update whenever an entity was erased.
  • [561] : nkEditor : Fixed an issue that caused the new mesh creation popup to hide itself when the declaration file search dialog was validated using a double click.

2023_05_29 - Customized nkEditor mesh import

Newly introduced :

  • [554] : nkTasks : Reworked the usage of Threads and made the API more modern. Clearly separated the ThreadPool (pure asynch work) from the Scheduler (also offering a syncing point) in an attempt to offer a more straightforward experience using the component. The nkEditor now uses a ThreadPool to process some work asynchronously. If you were using the Scheduler, the tasks will now need to inherit from SchedulerTask and their API will have to be simplified to fit the new API, as seen within the SchedulerTask's documentation.
  • [548] : nkEditor : The Material preview window now also integrates the Orbital Controller.
  • [550] : nkEditor : Requesting to load a mesh will now pop a window allowing to customize the decoding options. They first have been populated for the Obj format, along with a preset to directly set them up for Blender compatible imports.
  • [555] : nkMemory : Added a basic UniquePtr implementation, which aim is to offer a safe way to pass around an equivalent of std::unique_ptr through the method calls and Dll boundary. The use should be purely transparent and emulating how a std::unique_ptr is used. The first user will be nkTasks with its ThreadPool and Scheduler, for which tasks are passed using a UniquePtr, effectively passing the given Task's ownership to the component which will be responsible to free it when possible.
  • [454] : nkDebug : Updated the testing API to better fit the upcoming wasm build. While not all use-cases should be impacted, more details can be found within the updated documentation if necessary.

Fixed :

  • [556] : nkWinUi : Fixed an issue that would cause a crash when using a ComboBox after the migration to an isolated MainSystem.

2023_05_01 - nkEditor's Mesh UI Rework

Newly introduced :

  • [551] : nkWinUi : The system is now compatible with a usage as a Singleton, but also as isolated instances. For normal usage, it is recommended to still use the Singleton approach which should be the most comfortable one. However, if for some reason an isolated instance of the system is required, they can simply be allocated normally and used where it matters. For instance, the engine's unit tests are using this feature to host the test hub UI within the Singleton instance, and allocates isolated systems to test individual features and ensure proper isolation.
  • [540] : nkEditor : Reworked the Mesh container UI to reflect the new changes made in the Mesh API previously. For this first iteration, it is now possible to check a mesh's stats, along with its input layout in details. It is also possible to see a preview of the mesh, rendered with the default nkGraphics shaders available for it. A basic orbital controller was also introduced to rotate around it.
  • [507] : nkWinUi : Improved the organization of the various callbacks offered within the system. Components will now all offer callback setup for mouse and keyboard related events, along with closing and visibility events. The InputSystem will allow to set the fallback callback for these events too. In addition, specific callback for given component types will be offered, such as the mouse leave callback for a window, or the item selection change callback for a tree view. These will not be available within the InputSystem.The callback signatures were also simplified as much as possible, to return void instead of bool if the boolean was not used internally.If you were using the callbacks, the transition will need to change the bool returns to void, and adapt the signature for some. Also, the pattern to name callbacks such as setSpecializedClickCallback were shortened to a simpler setClickCallback. For Button, the dedicated setClickCallback has been renamed setButtonClickCallback to avoid hiding the new Component::setClickCallback. In doubt, be sure to check the updated documentation.
  • [542] : nkWinUi : Removed the PopupCustomDescriptor::_popupShouldCloseTracker boolean flag pointer, in favour of using the newly cleaned callback API to listen to the contained component's closing or hiding events. If you were using the flag to manage the popup, the new way to do it is by removing the flag, and hiding or unloading the contained component (the one fed into PopupCustomDescriptor::_customComponent). The popup will automatically follow.
  • [543] : nkWinUi : Moved InputSystem::setCursorPositionScreen() into CursorUtils::setCursorPosition(). If you were using the function, a simple change to the new one will be sufficient.
  • [506] : nkWinUi : Removed the "using" keywords for callback definitions, in favour of inlining them. This will allow for a quicker discovery of what a callback should be like.

2023_04_02 - nkEditor dynamic texture dimensions

Newly introduced :

  • [467] : nkEditor : Reworked the automatic texture resizing, when they are declared as render targets with their size adapting to the window they are rendered into. The system is now fully compatible with the potential for an arbitraty number of active engine windows. These targets can now be used in any number of compositors into any number of engine windows, and will transparently fit the sizes needed for each. Note that this system currently has limitations, namely, a given shader pass slot feeding the dimensions of such a texture will provided incorrect data. This will be addressed in a coming release (issue 539).

Fixed :

  • [538] : nkEditor : Fixed an issue that could cause a crash if a left click was done on an engine window, before a right click has been made in any other window.
  • [533] : nkEditor : Fixed an issue that would prevent the proper update of the RenderInfo's interface combo boxes when a render info declaration was loaded with new meshes / shaders not registered into the system. Closing and re-opening the popup was necessary for it to be taken into account, but this is not the case anymore.
  • [532] : nkGraphics : Improved the Dx11 and Dx12 renderers to preemptively fail a shader program loading when a signature mismatch is detected between some of its stages. For instance, a vertex stage outputting a float4 while its next stage, the pixel one, is waiting for a int2 for the same semantic.
  • [522] : nkGraphics : Fixed an issue in the Dx12Renderer that could cause a crash when rendering an unloaded mesh.
  • [537] : nkGraphics : Fixed an issue within the Dx11Renderer which would cause it to crash if an unloaded mesh was used during the rendering of a frame.
  • [528] : nkGraphics : Fixed an issue within the Dx11 renderer that would potentially cause bad rendering of a mesh after it has been reloaded with different data, if the strides / offsets for its vertex buffers were changed.
  • [536] : nkWinUi : Fixed an issue within the TreeView which would cause it to not properly preserve items initialization order / links if they were added before the component was loaded. Used the opportunity to get rid of the std containers in its header.

2023_03_05 - Restored nkEditor Picking

Newly introduced :

  • [527] : nkEditor : Restored the picking and interaction feature, which is also now properly propagating updates through all the potential interface container needing it.
  • [525] : nkWinUi : The PopupCustomDescriptor now takes a Component, rather than a Window. This opens for an easier customization of the notification's interface. The related field has been renamed _customComponent, from _customWindow, to better reflect this. Simply renaming all references in related code will be sufficient.

Fixed :

  • [531] : nkGraphics : Fixed an issue within all renderers that would lead to improper instance data being provided to some entities under certain conditions.
  • [530] : nkWinUi : Fixed an issue within the ComboBox with the WinApi, which could crash upon a click on the most bottom pixels.
  • [529] : nkEditor : Fixed an issue causing a Mesh's source load request to lag behind, needing another load request to be in effect. Now, a Mesh's source will be taken into account right away.
  • [526] : nkWinUi : Tuned the GroupBox's styling flags within its WinAPI implementation to limit flickering in deeply nested interfaces.
  • [524] : nkWinUi : Fixed an issue where an EditBox's caret position was not properly clamped to the label's size, causing it to rather stick to the last position it was in, if outside of the range.
  • [523] : nkGraphics : Fixed an issue on non RTX-enabled devices that could cause crashes if a raytraced render queue was used in some contexts.
  • [521] : nkEditor : Fixed an issue that could cause a crash when creating a Mesh from a declaration file, and then changing its source path through the UI.

2023_02_06 - LODs in nkEditor

Newly introduced :

  • [519] : nkWinUi : Added a method to clear a TreeView in one call. See TreeView::clearItems.
  • [499] : nkEditor : Integrated the new render information logic within an Entity's setup. To access it, simply append an entity within the graph, right-click on it, and edit its render information. A choice is given wether to use the legacy, simplified way (mesh - shader), or the advanced way using the render groups and lods.
  • [514] : nkGraphics : It is now possible to access an EntityRenderInfo's slot with a getter using the wanted index, rather than directly accessing the BufferCast reference. This is also true for a slot's given lod.
  • [511] : nkWinUi : The ComboBox now fully supports disabling it within the interface.
  • [510] : nkWinUi : Introduced the CursorUtils, which allows to interact with the cursor. So far, it only allows to retrieve the cursor's position on screen.
  • [509] : nkWinUi : The Notificator now supports nested calls of popups, allowing to make multiple layers of popups.
  • [508] : nkWinUi : Split the EditBox's event callback on a key into two different aspects. You can now register only for the chars that get added, or only for transparent key down / up events, or both. Before, registering a callback was triggered on both events, sometimes duplicating the call.

Fixed :

  • [517] : nkEditor : Fixed an issue which could cause a crash if a texture's manipulation UI was resized before a preview was visualized.
  • [518] : nkEditor : Fixed an issue that could cause a crash if an incomplete settings file was used during initialization.
  • [515] : nkGraphics : Fixed an issue within the export of an EntityRenderLodSlot which could cause a crash.
  • [513] : nkGraphics : Fixed an issue where the Entity was not properly initializing its internal EntityRenderInfo at construction time, preventing its updates to be properly propagated.
  • [512] : nkWinUi : Fixed an issue in the Notificator, where the custom run callback was not called in the nested message handling routines.
  • [502] : Fixed a styling issue within the API documentation in dark mode.

2022_12_19 - LOD Selection

Newly introduced :

  • [501] : nkGraphics : The DefaultRenderStrategy now supports a basic LOD selection logic, based on an object's screen height coverage for a given distance. See DefaultRenderStrategy's documentation to get a hint about how this works.

Fixed :

  • [483] : nkGraphics : The Dx12 renderer now allows to map D24S8 textures transparently like other renderers. The format has multiple planes that required to be handled manually.

2022_11_19 - Mesh groups & Render strategies

Newly introduced :

  • [492] : nkGraphics : Fully reworked the Entity - SubEntity part, to support multiple groups in an Entity, with Levels Of Detail (LOD). These changes allow for much more flexibility in the description of how an Entity should be rendered during a pass. Do note, however, that LOD support is currently not yet within the DefaultRenderStrategy. For more information, you can check the tutorial 03 and the EntityRenderInfo class documentation.
  • [493] : nkGraphics : Opened the RenderQueue to customize its rendering logic, by introducing the RenderStrategy. Client code can now easily wire their own logic to populate a command queue and drive how the Renderer works during a scene pass. A DefaultRenderStrategy is also provided and used by default, offering the same features as previously available. For more information, see RenderStrategy, and RenderCommandQueue.
  • [498] : nkMaths : Matrix, Quaternion, Vector's interface has been updated so that they are properly detected as trivially destructible.
  • [491] : nkMemory : Buffer, BufferCast, and BufferView now support range for loop constructions.

Fixed :

  • [500] : nkMemory : Made Buffer, BufferCast and String sturdier when passing in empty buffer / arrays / vectors to create them.
  • [497] : nkMemory : Fixed an issue that could potentially cause crashes when using the BufferCast to contain objects, rather than primitive types.
  • [494] : nkGraphics : Fixed an issue that could cause crashes within the Dx12Renderer, when trying to load a shader program for raytracing and defining macros for it.

2022_09_11 - Summer cleaning part 2

Newly introduced :

  • [487] : nkGraphics : Erased the Light and LightManager classes, which were not used so far. They might come back in a further iteration over the functionalities, but they won't pollute the component further in the meantime.
  • [484] : nkGraphics : The Systems hierarchy has been simplified to only MainSystem, which is now doing what GraphicSystem was doing, and holding the Renderer. The InputSystem has been erased along with the input handlers to break the nkInputs dependency. If your code was registering input handlers, it will be necessary to provide them with a device and manually update them from now on as it won't be possible to register them within nkGraphics anymore.
  • [480] : nkGraphics : Fixed the ProgramSourcesHolder to use safe nkMemory containers, rather than std string and vectors. This could lead to trouble with different compilation setups, as this object is meant to be allocated and populated by client code.
  • [479] : nkGraphics : Removed the activate method from the ShaderResource public API. The only purpose of ShaderResource is now to mark resources that can be fed to a Shader as data.
  • [485] : nkGraphics : Shader's setAttachedShaderProgram and getAttachedShaderProgram have been collapsed into setProgram and getProgram. This comes in line with the other changes to make the API more pragmatic and easier to approach. If you were using these methods, a simple rename will be necessary.

Fixed :

  • [488] : nkMemory : Fixed an issue that would corrupt a Buffer or String's memory if it was assigned with itself as a parameter.

2022_08_28 - Summer cleaning

Newly introduced :

  • [478] : nkGraphics : Simplified the RenderQueue management logic. Now, a RenderQueue will only be managed through a name, like any other resources within the component. The indexed alternative has been erased and queues cannot be managed nor addressed through this way in the manager or the scene related passes. A default queue is made available through a name that can be found and used from within the manager itself. If you were using the first index queue (through get(0)) which was the old default, the call can be replaced by get(RenderQueueManager::DEFAULT_RENDER_QUEUE).
  • [477] : nkGraphics : Made the general Pass API more uniform and aligned with the rest. Be sure to check the various Pass's updated documentation. Biggest changes are about naming, to make it more pragmatic and uniform (getPassType() -> getType(), getAttachedShader() / getLinkedShader() / getProcessShader() -> getShader(), and so on).
  • [481] : nkGraphics : Improved the ClearTargetsPass that now allows to customize the depth and stencil values used during clearing, and whether the stencil target should also be cleared. Reworked the API to renovate it and make it clearer. Please see the documentation for the updated API and export / import tree format.

Fixed :

  • [482] : nkGraphics : Fixed an issue in Dx11 preventing the correct mapping of a depth buffer.
  • [465] : nkWinUi : Fixed an issue that would cause tabs to not be properly hidden on load, when their names upon creation would collide.
  • [466] : nkEditor : Fixed an issue when reloading a project with a PbsMaterial, which could cause the irradiance map to not be properly reassigned right away.
  • [446] : nkImages : Fixed an issue regarding JPG images encoded in YUV420, with dimensions that were not multiple of 16 in height. The internal offset to find back the UV plane in memory was incorrectly computed, leading to a misalignment of the Y and UV planes once read back.
  • [447] : nkImages : Fixed an issue within the DdsEncoder that could decode images with odd dimensions and compressed formats incorrectly.
  • [464] : nkGraphics : Fixed an issue in ObjEncoder that could make it crash or decode corrupted data if key characters were used in some ignored lines (for instance, encountering an 'f' within an object line).

2022_08_14 - Cleanup and fixes

Newly introduced :

  • [462] : nkGraphics : Resources now have a flag allowing or disallowing the GPU load deferring. This is particularly useful when using the Dx12 API as it allows to emulate the behavior of Dx11 and Gles based renderers which wait for resources to be available before rendering. For more details, see nkGraphics::Resources::setGpuUploadCanBeDeferred().
  • [408] : nkGraphics : The Dx12Renderer now supports resources requiring more than 64MB to be copied on the GPU. This was a limitation in the memory pooling algorithm, now addressed.
  • [432] : nkDebug : TestClass macros now offering a NS variant to wrap classes and names into namespaces. This will help with class name collisions.

Fixed :

  • [463] : nkGraphics : BuiltIn shaders are now correctly mapping any custom layout semantic name when declared as position, normal, or texture coordinate. To benefit from the component's shader fallback mechanism should a mesh not naturally have awaited semantic names (POSITION, NORMAL, TEXCOORD), be sure to correctly linked custom semantic names to their equivalent using the MeshInputLayout capabilities (MeshInputLayout::setPositionAttributeName and related).
  • [358] : nkGraphics : Implemented a safety when assigning meshes with no common attributes semantics with the shaders ultimately rendering them from an Entity. Now, the shader will be kept around to check against any mesh update that it can be used or not and automatically swapped with a compatible built-in shader as required.
  • [431] : nkAstraeus : Now using the GPU load deferring control flag to ensure PBS related pre-filtering of environment maps also works in all cases when used with the Dx12Renderer.
  • [433] : nkEngine : Code has been recompiled and fixed against the /permissive- compilation flag, to improve it's portability.

2022_07_31 - nkEditor Material UI

Newly Introduced

  • [426] : nkAstraeus : Introduced the import / export of material declarations, starting with the PbsMaterial. For this occasion, the folder hierarchy for the ProjectLoader has been revamped to be aligned on the one from nkScripts. If you were using the ProjectLoader, it is now located within NilkinsAstraeus/Exporter/Project.
  • [182] : nkEditor : Materials are now imported / exported with all other resources when loading / saving a project. It is now possible to assign materials to entities in a scene.

Fixed :

  • [427] : nkMemory : StringView's operator+ overloads are now correctly marked as const.
  • [430] : nkEditor : Fixed an issue that could cause incorrect material preview update if no Engine view was activated.
  • [428] : nkEditor : Fixed an issue that would cause a crash on material preview if a Material view was created after initial software launch.

2022_07_17 - UnitTester nUnit formatting

Newly introduced :

  • [424] : nkAstraeus : PbsMaterial has new getters allowing to access the channels used for each texture. Some consistency work has also been done, causing all color / value setters to effectively reset the texture variant linked when called.
  • [411] : nkDebug : The nUnit formatter is now reporting all vital information upon logging, making it usable into a CI environment.

Fixed :

  • [425] : nkGraphics, nkAstraeus : Irradiance and environment filtering functions now properly check and fix parameters that can cause gamma correction / mip generation warnings.
  • [423] : nkWinUi : Fixed an issue within Window in WinApi system, which could cause it to be badly positioned when used within nkGraphics.
  • [422] : nkWinUi : Fixed an issue with the Windows under WinAPI preventing correct focus switch between windows without parents.

2022_07_03 - Windows Snapping

Newly introduced :

  • [421] : nkWinUi : The GraphicsWindow component has been merged into the Window one. Features are the same, so the transition should be as simple as renaming any GraphicsWindow mentions in code, to Window.
  • [418] : nkEditor : Now saving on shutdown, and restoring on startup, the window size / fullscreen settings.

Fixed :

  • [419] : nkWinUi : Under Windows, the Window component will now be fully integrated within Windows' Aero Snap system. As such, it is now possible to use the win + arrow keys or move the window to the screen borders to efficiently resize it.
  • [420] : nkWinUi : Aligned the naming convention of ALIGNMENT and RELATIVE_POSITION enumeration classes. As such, ALIGNMENT::LEFT_TOP and ALIGNMENT::RIGHT_BOTTOM were renamed to TOP_LEFT and BOTTOM_RIGHT.

2022_06_05 - nkDebug's return

Newly introduced :

  • [413] : nkLog : Improved String / StringView API to align it better with its nkMemory counterparty, and added more operators to improve transparency.
  • [414] : nkDebug : Added the OutputTarget concept, allowing to customize where the result output will be logged.
  • [417] : nkMemory : Improved the String / StringView API to propose more operators and improve transparency.

Fixed :

  • [407] : nkGraphics : Fixed an issue causing bad erasure of BlendState from internal memory when calling BlendStateManager::erase().
  • [416] : nkDebug : Fixed an issue preventing nkDebug from appearing in the packed release files.

2022_05_22 - Unit Testing basics

Newly introduced :

  • [381] : nkDebug : Introduced basis for unit testing capabilities. See the UnitTester and TestClass to have an idea of what is currently possible.

Fixed :

  • [415] : nkGraphics : Fixed an issue causing a Program to not write its cross compiler flag during export.
  • [410] : nkDebug : Fixed an issue which prevented nkDebug from appearing in the API documentation.

2022_04_11 - SIMD capabilities

Newly introduced :

  • [409] : nkImages : Now using nkDebug's SIMD detection capabilities to enable the use of SSE / AVX instruction sets during Jpeg decoding.
  • [405] : nkDebug : Now offering SIMD / AVX capabilities detection. See CpuDetector.

2022_03_13 - System Information

Newly introduced :

  • [406] : nkEditor : Fixed an issue in which reordering a node, target operation or pass would unselect it.
  • [404] : nkDebug : Now able to report basic system information, focusing on Windows 10 for now. See SystemDetector for more information.

2022_02_27 - Slider Introduction

Newly introduced :

  • [403] : nkWinUi : First working version of the Slider, introduced as a simple, continuous slider. Features to start with includes theme system support, basic min / max / current driveable values, basic mouse interaction and callback registering.

Fixed :

  • [402] : nkGraphics, nkImages : Images / Textures are now able load BCx format textures with size not multiple of 4. This will cause the size to be realigned to the nearest correct multiplier.
  • [401] : nkGraphics : Fixed an issue which could cause a Texture's data to not be properly reloaded after a failed load from a resource path.

2022_02_13 - Bug Hunt Pt.2

Newly introduced :

  • [400] : nkLog : Now offering a basic String implementation for components that won't rely on nkMemory and its String implementation. This is totally transparent from an API point of view and inter-operable with both nkMemory's and std's variants, and as such client code should not need to worry about this.

Fixed :

  • [399] : nkGraphics : Fixed issues when using Dx12, that prevented a Compositor's pass order change to be effective. This also fixes crashes if passes where erased.
  • [397] : nkEditor : Fixed renaming of texture which was not working.

2022_01_30 - Bug hunt

Newly introduced :

  • [391] : nkEditor : Added a button to take screenshots of a given engine window and save it to disk.

Fixed :

  • [393] : nkImages : Fixed issues within JpgEncoder preventing good image encoding under some conditions (bad RLE encoding, wrong encoding of DC value in MCU).
  • [169] : nkWinUi : Fixed an issue in WinAPI EditBox that caused the caret to not correctly appear.
  • [394] : nkGraphics : Fixed an issue preventing to map a texture used as a context's back buffer more than once, even after unmapping it. This was a problem for the Dx12 renderer type.
  • [364] : nkGraphics : Improved how a Texture realigns an input Image, now better realigning pixel formats for sturdier results in general.
  • [385] : nkEditor : Fixed the obsolete basic shader program sources, and activated the cross compiler defines to help with HLSL / GLSL program source development.
  • [384] : nkEditor : Fixed an issue which prevented character erasure using the backspace key, within the UI tab renaming edit box.
  • [389] : nkEditor : Fixed an issue causing meshes to not properly export their data source path on project save.
  • [386] : nkEditor : Fixed an issue preventing the proper update of a clear pass's color values after edition.
  • [390] : nkGraphics : Fixed a typo within addCpuDataSliceRelativeToLast function name, and fixed API documentation for these new functions, which were missing.

2022_01_16 - Buffer and Texture feeding API

Newly introduced :

  • [382] : nkGraphics : Feeding data to a Buffer is now easier and directly mapped to nkMemory::Buffer / BufferView. The API is also aligned on the one from Mesh, to give the choice to use a view, copy, or forward approach. If you were using the old API, the descriptor can be replaced with a simple cal to the Buffer with required data.
  • [367] : nkGraphics : Textures now feature a new API to provide them with CPU data or Images. In both cases, the logic has been aligned on the existing one within Mesh, with the view, copy, or forward approaches. Please see the documentation for the new functions and their behaviour. If you were using the old API, you will need to translate it. To do so, each sub-resource previously provided in the descriptor array will need to be fed as a slice in the Texture itself.
  • [383] : nkImages : Image can now be created using an ImageView. This is a utility functionality but beware this will make a copy of viewed data, as a result.

2022_01_02 - nkImages Encoders improvements

Newly introduced :

  • [362] : nkImages : All encoders can now export any format of image, with a warning when the conversion to their native format might be lossy. Currently, formats encompass all formats correctly supported by the ConversionUtils, and as a result exclude BCx and half float when not native to the format.

2021_12_19 - Jpeg Encoding

Newly introduced :

  • [378] : nkMaths : Simplified the Vector and Quaternion APIs by stripping the unions making the fields. Now, only way to access a field is through its unique name (_x, _y, _z, _w). In the process, the getters and setters have been cleaned away as the fields are public, cleaning functions that were not really needed.
  • [361] : nkImages : ConversionUtils has been completed and can now convert between all formats supported. Only exceptions are BC based and half float formats.
  • [379] : nkImages : BGR based formats are now returned in their original order from ImageBase::getPixel(). This means that the red channel is now in the _z field of the nkMaths::Vector, and blue in the _x one. This goes in pair with the YUV format clarifications to ensure clear relation from a format type to its memory / pixel channels layout. This also maps better with the nkMaths::Vector API and field names simplifications, to clear any ambiguous meaning.
  • [377] : nkImages : Changed expected memory layout for YUV formats, and updated attached PIXEL_FORMAT enumeration entry names to properly describe how channels should be set in the buffer. For instance, Y8U8V8_444 was in UYV order, but is now expected like the name implies, YUV. Y8U8V8_422 label has been changed to Y8U8Y8V8_422, reflecting its new memory layout. If you were reading pixel data straight from the buffer pointer, be sure to take this into account when decoding pixel data.
  • [375] : nkImages : All classes and structures internal to encoders are now in a sub-namespace, to help with code discovery and guide better to useful classes.
  • [360] : nkImages : The JpgEncoder can now encode images. It supports exporting data compressed as YUV 4:4:4, 4:2:2, and 4:2:0 semi planar. It also allows to drive compression vs. quality ratio to have good control over the resulting data.

Fixed :

  • [380] : nkImages : Fixed an issue that could corrupt pixel information when decoding Dds files with an alpha channel using the NO_ALPHA mode to strip the channel out.

2021_12_05 - Buffer from array

Newly introduced :

  • [374] : nkMemory : Buffer, BufferView, and BufferCast now have templated constructors from std::array.
  • [373] : nkMaths : Quaternion does not inherit from Vector anymore. This strips the class from function with ambiguous meaning for a Quaternion.

Fixed :

  • [376] : nkEditor : Fixed a bad semantic name in the picking shader program HLSL, preventing picking from correctly happening.

2021_11_21 - Darker, Faster

Newly introduced :

  • [372] : nkImages : Introduced a new tutorial about image parsing, its usage into the engine, and the different tools around it.
  • [369] : API documentation now has a dark theme color scheme that is selected whenever the system is set to dark mode.
  • [371] : The offline tutorials now have a dark color scheme when dark mode is detected.
  • [370] : Website has now a dark color scheme applied when the system is detected to prefer the dark mode.

2021_11_07 - Monochromatic Jpeg

Newly introduced :

  • [359] : nkImages : Added support for monochromatic Jpeg decoding within JpgEncoder.
  • [368] : nkImages : JpgEncoder now uses fast iDCT algorithms for image blocks decoding, further improving performances.
  • [366] : nkImages : Improved JpgEncoder's performances concerning Huffman decoding and bit stream reading, further improving performances of Jpeg decoding.

2021_10_24 - JPEG and SIMD

Newly introduced :

  • [365] : nkImages : Improved JpgEncoder's general performances when decoding images. It also now uses SSE and AVX when available. In testing environment with all improvements applied, it showed a ~x6 speed-up.
  • [363] : nkImages : JpgEncoder now also supports images that have dimensions not multiple of 8.

2021_10_10 - Jpeg decoding

Newly introduced :

  • [93] : nkImages : Now supporting Jpeg format decoding, see JpgEncoder. See class's documentation to get more information on current support and limitations. This new encoder has been integrated in the CompositeEncoder, and is allowing nkGraphics to work with Jpg files for its textures loaded from files.

2021_09_26 - YUV in nkImages

Newly introduced :

  • [355] : nkImages : Basic support for YUV format, through new enum values and basic reading capabilities in images. Also added the ConverterUtils, able to convert from a format to another (YUV, RGB, BGR, RGB32...).

2021_09_12 - This as script reference

Newly introduced :

  • [354] : nkAstraeus : Now leveraging the new functionality in nkScripts to properly return the missing references in all nkMaths wraps (Vector, Quaternion and Matrix). The Lua API is now working like the C++ API as intended.
  • [353] : nkScripts : UserType::addMethod now has a new boolean parameter to change its first parameter from a FUNCTION_PARAMETER_TYPE::USER_DATA_PTR to a FUNCTION_PARAMETER_TYPE::UDER_DATA. This means it is now possible to also receive a script reference over the caller to safely be able to work with it. It can be used to safely return the reference over the caller, for instance. This parameter is off by default, retaining the old behaviour.

Fixed :

  • [357] : nkMemory : All container classes now have a const variant of their front() and back() functions. This impacts Buffer, BufferCast, and BufferView.

2021_08_29 - Matrix in Lua

Newly introduced :

  • [347] : nkAstraeus : Now wrapping nkMaths::Matrix in Lua scripting environment. Also added a basic wrapper for std::array<T, S>, used to wrap Matrix::_m attribute. See documentation in nkAstraeus::lua::nkMathsWrap and nkAstraeus::lua::stdWrap for more information.
  • [352] : nkScripts : Namespace now support the same overloads than Environment for the setVar function, allowing more control over what variable types can be set in a namespace.
  • [351] : nkAstraeus : Now offering a Lua wrap of nkMaths::MathConstants values, within nkMaths.MathConstants namespace.
  • [344] : nkAstraeus : The existing API wrapping in Lua is now better aligned with the C++ API. All getters and setters that were expressed as attributes are now using the same functions as the C++ variant. For instance, to get a camera's frustum, camera.frustum is now camera:getFrustum().Note that public attributes exposed have their name also aligned on the C++ version with the leading underscore.
  • [349] : nkAstraeus : Now offering a more complete Lua wrapping of nkScripts::Script and related enums and structures (INTERPRETER, COMPILATION_FAILURE_TYPE, CompilationResult...).
  • [348] : nkScripts : Scripts now have clearer API to specify their target interpreter. setScriptFor and getScriptType now are replaced by setTargetInterpreter and getTargetInterpreter. Be sure to switch the  naming if you were using them.

Fixed :

  • [350] : nkScripts : Manipulating Namespace on an Environment can now use the shorthand notation ns0::ns1::ns2 for nested namespaces, like for UserType. Functions affected are setNamespace(), isNamespaceSet(), and getNamespace().

2021_08_15 - nkMaths Lua API improvements

Newly introduced :

  • [346] : nkAstraeus : Improved Lua wrapping of nkMaths::Vector and nkMaths::Quaternion.
  • [345] : nkExport : ExportError has been changed from a class with getters and setters to a structure with public fields. If you were using the class, be sure to change the getters and setters to read or write the attached attribute.

2021_07_18 - New Mesh and Encoder API

Newly introduced :

  • [340] : nkGraphics : Added generation of normals for geometry. Reworked the generation of tangents and binormals. Everything is available in the MeshUtils class. New capabilities allow to generate data from input buffers with different formats, strides, offsets. Output can now also be either float32 or float16, generated in either a buffer allocated during the call, or an already existing buffer to populate afterwards. Please check all the details from the documentation of MeshUtils::computeNormals, MeshUtils::computeBinormals, and MeshUtils::computeTangents.
  • [17] : nkGraphics : Reworked all the API around Mesh. All high-level accesses have been separated for a cleaner API. Also, Mesh offers many new capabilities, like multiple vertex buffer handling, totally custom input layout setup, new index format support... To get more information, don't hesitate to take a look at the revised API documentation and tutorials (nkGraphics/03).
  • [334] : nkGraphics : MeshLoader has been removed in favor of the MeshUtils. MeshUtils also took over all the high-level capabilities of the mesh like generating tangents, binormals, filling from high level structures... and now offers all these capabilities in an isolated API. This allows to make room for the new tighter mesh API.
  • [336] : nkGraphics : The BoundingBox API has been improved, and its documentation made clearer.
  • [337] : nkGraphics : All MeshDecoders were reworked. First, they are not tied to meshes anymore and will be more abstractly decoding data, which will be able to contain much more information each format can output. Then, they have been renamed Encoders, to fit better into the engine's naming conventions. Please see ObjEncoder or tutorial Number 3 for more information.
  • [339] : nkMaths : Now offers the FloatEncoder, able to encode floats to halfs and the other way around. As a result, nkImages::PixelFormatUtils::halfToFloat has been removed in favour of this new API. If you used it, you will now find it within nkMaths::FloatEncoder::halfToFloat.
  • [335] : nkMaths : Introduced capability to create hashes from various types (see new Hasher class). This class has been moved from nkGraphics to nkMaths for a more easy and intuitive location.

Fixed :

  • [343] : nkWinUi : Fixed an issue in which a Static could flicker when changing its label, if using the WinAPI windowing system.
  • [341] : nkGraphics : Improved robustness of sampler declaration file import. It will now correctly parse ints, floats and doubles for its numerical fields.
  • [338] : nkMemory : Creating a Buffer or a BufferCast<> with a size of 0 is now safe to do.

Incompatible changes :

  • The PRIMITIVE_TOPOLOGY enum has been moved to NilkinsGraphics/Meshes/Enums/PrimitiveTopology.h. It has been converted to an enum class.
  • All folders named Utilities have been renamed to Utils to align all components naming conventions.
  • NilkinsExport/Encoders/Base64Encoder.h has been moved to NilkinsExport/Encoders/Base64/Base64Encoder.h to align folders with other components exposing encoders.
  • All logger headers have been moved from NilkinsLog/XLogger.h to NilkinsLog/Loggers/XLogger.h to help with organization.
  • World matrix shader instance slots are now sending to semantic name WORLD_MATRIX rather than WORLDMAT, to be clearer. Documentation will be corrected soon.
  • World matrix inverse transpose instance slots are now sending to semantic name WORLD_MATRIX_INVERSE_TRANSPOSE rather than WORLDMAT_INV_TRANSPOSE, to be clearer. Documentation will be corrected soon.
  • Warning : ObjEncoder does not use indices anymore when decoding meshes. This can cause problems in raytracing shader programs if you were indexing these buffers. Please switch to use a pure primitive indexed logic to find back the vertices in a ray hit.

2021_05_23 - nkImages better integration & API cleanings

Newly introduced :

  • [333] : nkGraphics : Mapping a texture now also fills a new format field into the MapResult structure. This allows to know which format the data should be using while writing or reading. Note that in the usual case, data will be the same format as the texture. However, some renderers have limited support for reading texture data. In such case, format can be altered to make it work as intended, and the change will be notified through this new field.
  • [330] : nkGraphics : Texture now allows to load from a pre-decoded nkImages::ImageView. See Texture::setFromImage().

Fixed :

  • [332] : nkImages : DdsEncoder now also supports the alpha mode request within an AlignmentDescriptor. With this, all available encoders now support forcing the alpha channel to be off or on.
  • [331] : nkGraphics : Texture::getDepth() and Texture::getArraySize() have been merged into Texture::getDepthOrArraySize(), as both are mutually exclusive (either 3D -> depth, or 2D -> array size). This also aligns better with the linked getter.

2021_05_09 - Glsl & Hlsl interop

Newly introduced :

  • [325] : nkGraphics : Introduced a basic inter-operability layer between GLSL and HLSL code. See Program::setActivateCrossCompilerDefines, providing new types and functions that will correctly map to both GLSL and HLSL. This feature is extensively used within nkAstraeus within graphics effects / materials.
  • [326] : nkAstraeus : Effects, ComplexEffects and PbsMaterial are now using the new interoperability capabilities in nkGraphics::Program to adapt to both Gl and Dx based renderers.

Fixed :

  • [327] : nkGraphics : As OpenGL works with bottom left origin for textures, GlesRenderer now works with "upside down" textures at all times, by using images that have a top left origin, and flipping all projection matrices on the y axis. To account for that, render contexts will flip their content before swapping. Doing this allows nkGraphics to be consistent with all renderers, as they all expect top left origin images. This also means that programs do not need to flip uvs in glsl.

2021_04_25 - GlesRenderer

Newly introduced :

  • [284] : nkGraphics : Introducing the first OpenGL based renderer, GlesRenderer, in its first usable version. It is accessible by using the RENDERING_API::GLES enum in the launching configuration. This renderer is meant to be compatible with OpenGL ES 3 and WebGL 2. As such, it does not include all OpenGL 4 features. For now, the depth stencil states and raster states have limited support. This will be addressed in future releases.
  • [324] : nkGraphics : Program will now automatically provide a define allowing to differentiate between HLSL or GLSL compilation. A DirectX based renderer's program will provide the NK_HLSL define, while an OpenGL based one will provide the NK_GLSL define. This helps when writing cross-renderer shader code.
  • [317] : nkImages : The BmpEncoder now also follows the alpha mode specified in an alignment descriptor, during decoding of data. This means, it will indeed discard or add an alpha channel depending on the data and settings specified. This is true for all decompression logics supported.

Fixed :

  • [323] : nkScripts : DataStack structure has been transited from a vector to a BufferView. This will make sure no problem will occur for different compiler setups. If you were using this structure from a callback function, no action needs to be taken. If you were creating DataStack objects, such as for manual script function calls, then you will need to make a vector and work with it, before making a BufferView out of it.
  • [322] : nkImages : The DdsEncoder was not reordering the RGB channels when requested on an image using the standard compression pattern (aka not bitfield). This has been fixed.

2021_04_11 - Maintenance & openings

Newly introduced :

  • [321] : nkGraphics : It is now possible to set which extension a Program will seek when setting a folder for its sources. See Program::setFileExtensions. This can be used to customize the behavior when using multiple renderers, as by default, DirectX renderers will seek .hlsl files and OpenGL renderers will seek .glsl files.

Fixed :

  • [319] : nkEngine : Updated some tutorial prefaces which were outdated.

2021_04_04 - Dof & Blur

Newly introduced :

  • [311] : nkGraphics : Compositor is not a resource anymore. This means it is not necessary to call the load() method on it to make it usable. This helps in having a more reliable rendering system, along with mapping better with the new ComplexEffect API that could alter the compositor setup on a reload.
  • [316] : nkImages : Added an ALPHA_MODE enumeration that drives how alpha should be appended to an output parsed image. Using this within the AlignmentDescriptor, it becomes possible to force the presence of the alpha channel, or force it to be dropped. Note that this is currently only supported by the HdrEncoder. BmpEncoder and DdsEncoder won't use the enumeration set on the descriptor. This is tracked by issue number 317.
  • [315] : nkGraphics : TextureUtils::computeIrradianceSH now supports correctly R32G32B32 texture format as input.
  • [177] : nkAstraeus : Introduced the DofComplexEffect, allowing to work with depth of field.
  • [312] : nkAstraeus : SsaoEffect can now use a linearly defined depth buffer, and overload the camera used for projection parameters.
  • [313] : nkImages : Added support for R32G32B32A32 floating point format, and its half float variant, R16G16B16A16. The Bmp and Hdr encoders can use such data and encode them into readable images. This allows nkGraphics to convert half floats images into more friendly images.
  • [305] : nkAstraeus : Introduced the ComplexEffect class series, allowing to offer effects that can require multiple passes and / or custom updates per frame. The first effect to make it is the BlurComplexEffect, an efficient multi-pass blurring effect, currently offering gaussian blur.
  • [310] : nkGraphics : Texture now offers the method convertToImage(), allowing to create an nkImages::Image from the data of a given texture mip and slice automatically. This can be used as an alternative to the standard map() method, to access the data in a more user-friendly way.

Fixed :

  • [318] : nkGraphics : Renderers now use the nkImages::ALPHA_MODE newly introduced feature to ensure that HDR images are loaded with an alpha channel available, to maximize compatibility with hardware and drivers. R32G32B32_FLOAT is not necessarily supported by all hardware or drivers, even recent, and as such it will be safer this way while a proper support check is made to use the feature when available.
  • [314] : nkAstraeus : The PbsEnvMapFilter is now more stable when using R32G32B32 / R32G32B32A32 floating point formats, which could cause issues. This means that R32G32B32 format will now output in R32G32B32A32 to be sure the hardware and driver supports using it properly. However, R32G32B32 can also be problematic when used as an input and as such, R32G32B32A32 should be preferred over it.

2021_03_14 - Dropping DxTex & maintenance

Newly introduced :

  • [303] : nkGraphics : Both Dx11 and Dx12 renderers now use nkImages internally, instead of DirectXTex for image parsing. As a result, DirectXTex has been pulled off the dependency list.
  • [308] : nkImages : The AlignmentDescriptor now feats a flag specifying that a BGR image should be realigned into an RGB format. This is used within nkGraphics for instance, to be able to still use automatic gamma correction of SRGB formats that are defined only for RGB, and not BGR.
  • [307] : nkImages : Now offering the CompositeEncoder, a utility allowing to automatically check all available encoders to decode binary data using the right format.
  • [306] : nkEngine : Made a run at replacing const char* and std::string[_view] parameters / output within the API. They were all replaced by nkMemory::String or nkMemory::StringView depending on the lifetime required, offering for a more consistent and reliable API across different compiler setups. If you notice any left-over from this transition, feel free to mention it as it should be complete.
  • [294] : nkImages : BmpEncoder now can encode images using the R32G32B32 format, with values outside of the [0, 1] range clamped into the [0, 255] range.

Fixed :

  • [309] : nkImages : Fixed some issues regarding memory alignment constraints override in BmpEncoder and DdsEncoder. This could cause some crashes as memory was not correctly realigned.
  • [296] : nkImages : BmpEncoder now correctly pads image rows if required, effectively ensuring that the 4-byte alignment is preserved. This was causing visual issues when decoding the image again.

2021_02_28 - ToneMapping & ImageEnvironment effects

Newly introduced :

  • [178] : nkAstraeus : Added the ToneMappingEffect, allowing to tone map linear textures to a given display device. Offering different tunable mapping logics out-of-the-box, this allows to improve the look of images going outside of the regular sRGB gamut to correctly visualize them on a standard monitor.
  • [290] : nkAstraeus : Added the ImageEnvironmentEffect, allowing to sample cubemaps or equirectangular textures to create panoramas easily.

Fixed :

  • [295] : nkImages : Corrected decoding of HDR files which were mirrored on the X axis.

2021_02_14 - TextureCopyEffect

Newly introduced :

  • [289] : nkAstraeus : Added the TextureCopyEffect, allowing to take a texture as input and paste it into active target. Can be used to downscale images or make copy of them easily.

Fixed :

  • [285] : nkImages : Fixed an issue in which creating images with empty buffer could result in crashes.

2021_01_31 - SSAO and FilmGrain effects

Newly introduced :

  • [283] : nkAstraeus : Added the FilmGrainEffect, aimed at reproducing noise usually found on real films due to various reasons when capturing them. This can participate in adding a realistic effect into an image.
  • [277] : nkImages : Converted all std::string_view parameters / return values from the API and replaced them by the nkMemory::StringView, allowing to avoid templates passing dll-boundary. The conversion should be handled automatically and no action is required in client code.
  • [176] : nkAstraeus : Added the SSAO effect to the effect roster. SSAO offers a good ambient occlusion algorithm in screen space, leading to usually compelling effects while not hitting too much on the frame budget. See SsaoEffect for more information.
  • [275] : nkMaths : Renamed IVector to IntVector, to better convey the purpose of the class.
  • [21] : nkMaths : Reworked the API and got rid of the DirectXMaths dependency, in favor of custom code. Some functions were renamed to make the API more homogeneous, matrices were made row-major, be sure to check the updated and completed documentation to get all new functionalities and adapt to them if required.

Fixed :

  • [149] : nkGraphics : Fixed an issue that could cause crashes on rendering when feeding empty sampler, shader resource, or uav to shaders.
  • [281] : nkGraphics : Fixed an issue in which adding defines to program stages, then loading sources from a folder would wipe out and ignore the defines specified before.
  • [279] : nkGraphics : Fixed an issue that would cause a Manager's getByIndex method to return the same resource multiple times for different indices.
  • [278] : nkEditor : Fixed an issue which was preventing pass type changes in the compositor interface.

2021_01_17 - First effect - FXAA

Newly introduced :

  • [175] : nkAstraeus : Introduced the Effect class and its basic API around it, centered around offering shaders compatible with nkGraphics' PostProcessPass rendering. The first effect introduced is the FXAA, offering anti-aliasing capabilities. See nkAstraeus::Effect and nkAstraeus::FxaaEffect to start with.
  • [272] : nkScripts : Now using String / StringView in the API, instead of char* and std variants. Conversions being handled automatically, adapting code should not be required.
  • [271] : nkAstraeus : Now using the String / StringView from nkMemory instead of const char* and std variants. Conversions being handled automatically, adapting code should not be required.
  • [264] : nkEditor : Converted the compositor interface to a container type.
  • [265] : nkEditor : The sampler window is now a container type.
  • [266] : nkEditor : The scripting interface is now a container type.
  • [261] : nkEditor : The depth stencil state window is now a container type.
  • [262] : nkEditor : The raster states window has been converted to a container type.
  • [260] : nkEditor : Blend State window has been converted to a container type.
  • [252] : nkEditor : The render queue floating window is now adapted to be a container type.
  • [258] : nkEditor : The Buffer floating window is now converted to a container type.
  • [257] : nkEditor : Interface for cameras has been converted to a container type. However, it has been mostly disabled while it is adapted to the new multi-rendering windows capabilities introduced recently.
  • [256] : nkEditor : The interface for meshes is now a type of container.
  • [251] : nkEditor : The shader resource floating window has been converted to an interface container type.
  • [268] : nkExport : Now using nkMemory's String and StringView in the API, which replaced the use of std::string[_view] and const char* variants.
  • [267] : nkGraphics : Resource manager's getByIndex methods now won't give access to hidden resources.
  • [253] : nkEditor : The "New" context menu option in the toolbar is now working properly and resetting the environment as intended.

Fixed :

  • [274] : nkGraphics : The way shader memory slots (instance and pass) feed matrices has been changed so that matrices are not transposed from row major to column major. This means that transformations in shader now need the matrices to be applied from the left side. See for instance ShaderPassMemorySlot::setAsViewMatrix() to get an example of how this should be used in a program.
  • [273] : nkAstraeus : Fixed an issue causing crashes if a PbsMaterial was unloaded and then its setters were called.
  • [269] : nkWInUi : Fixed an issue in which the text of a button could be misaligned with its background.

2021_01_03 - nkEditor UI Containers Improvements

Newly introduced :

  • [230] : nkEditor : Converted the shader program floating window to now be compatible with the interface containers. It is now a selectable view type for containers. The old source editing window has also been merged inside for easier and clearer edition.
  • [249] : nkEditor : Added the capability to add containers also from the context menu when right clicking a container's title. This can help if right clicking between the containers is not easy, due to the small distance between them.
  • [189] : nkEditor : Now saving the active theme and interface layout when exiting the application, and loading it back when opening it. The settings are currently saved next to the executable in a file named nkEditor_cfg.json.
  • [235] : nkEditor : It is now possible to set a fixed size for containers, both on width and height. To see available options, right click on a container's title label and see available options.
  • [248] : nkWinUi : Static can now accept a click callback. See Static::setClickCallback().
  • [247] : nkWinUi : Static can now align its content both on width and height. See Static::setAlignHorizontal() and setAlignVertical(). Note that for this, the ALIGNMENT enumeration has been updated to reflect the Left / Top and Right / Bottom duality. Be sure to check its documentation and adapt if required.
  • [245] : nkWinUi : Added more utility functions to the TabWindow, helping with manipulating tabs and behaviour. Check TabWindow::setClickCallback(), getTabByMouseRel(), getTabIndex().
  • [225] : nkEditor : Now supporting interface containers erasure to allow more control over the look of a tab's layout.
  • [244] : nkWinUi : Notificator can now make popups with fully customized windows. See Notificator::popup(), with the overload receving a PopupCustomDescriptor.
  • [246] : nkEditor : Now able to close interface tabs and unload them. To reach this, with more than one tab available, right click on the tab to close and then select "Close" in the context menu popping.
  • [241] : nkEditor : Now possible to edit the interfaces tabs names. For this, right click on the tab you want to edit, and select "Rename" in the context menu popping out.
  • [242] : nkWinUi : The Popup has now been cleared in favour of the newly introduced Notificator, as it was merely duplicating what the Window did. Notificator now offers static methods to make ephemeral popups, see Notificator::popup() for its first working methods.
  • [243] : nkEditor : The Nilkins Engine logo is now part of the executable, effectively replacing the default icon in the contexts where the window icon was not taken into account.
  • [228] : nkEditor : It is now possible to add new tabs within the interface, and switch between them to create different pages to work with.
  • [239] : nkWinUi : Improved TabWindow to now be able to reorder tabs programmatically and improve the tab switching callback API, which now also gives the selected tab. See TabWindow::reorderTab() and TabWindow::setTabSwitchCallback().
  • [229] : nkEditor : The interface to work with textures is now part of the new containers approach. As a result, it is possible to switch one container to this interface, and the old floating window approach has been removed.
  • [236] : nkWinUi : GridLayout now supports erasing specific rows and columns from its grid. See GridLayout::eraseRow() and GridLayout::eraseCol().
  • [234] : nkWinUi : ToolBar now offers the capability to select where the items should align in the bar : left, in the center, or right. See ToolBar::setItemOrigin().
  • [222] : nkEditor : Now offering 2 different themes for the interface : the usual dark theme and a new basic light theme.
  • [232] : nkWinUi : Added some utilities to the GridLayout, allowing to retrieve more information to work with. See GridLayout::getComponentAt(x, y) to get a component from a cell coordinate, GridLayout::getCellCoordinatesForPoint() to get a cell from a position.
  • [226] : nkEditor : Improved the way new containers are merged into an existing tab layout, by now splitting big enough elements when possible, rather than always creating new columns / rows.
  • [223] : nkWinUi : It is now possible to maximize a window and choose whether it should cover the task bar, or not. This behaviour is now used in the nkEditor to leave the task bar visible by default. A new view option has been added to switch to fullscreen mode, covering the task bar.

Fixed :

  • [240] : nkWinUi : Fixed an issue that could cause crashes when shutting down the system, in some cases where a still existing TabWindow had some tabs declared.
  • [238] : nkGraphics : CameraManager now also clears the links between contexts and cameras when erasing a camera. This fixes potential issues if contexts are freed and allocated right away at the same address (deleted camera could still be linked).
  • [237] : nkEditor : Improved logic of the thread driving the graphics part, preventing CPU usage from spiking up when no engine window is visible.
  • [231] : nkWinUi : Corrected an issue where the closing callback for windows was not called before destroying them, anymore. Also now correctly unloading UI components when they are closed.

2020_12_19 - Reworked nkEditor UI

Newly introduced :

  • [220] : nkWinUi : Completed ScrollBar input behaviour which now makes it usable to scroll using the buttons and by holding the control bar. A callback setter has been added to its methods, called whenever scrolling input is made.
  • [201] : nkWinUi : Painting a component into an image can now also paint a Component's frame (non-client area) if requested so using the dedicated boolean parameter. See Component::paintToImage().
  • [184] : nkEditor : The UI system has been totally revamped to allow for more customizable experience. It now works with "tabs" and "containers" that can be added and resized dynamically. A tab represents a page in which containers can be organized. Containers contain any type of UI and can be combined at will. The system is still in its early stage and many improvements will be made over time (layout saving and restoring, container closing, better addition logic, more window types within the containers).
  • [210] : nkWinUi : Window can now take a callback that gets called when clicks occur in it. See Window::setClickCallback().
  • [209] : nkWinUi : GridLayout now offers more utility functions to change its internal organization (change component grid coverage, change weights...).
  • [204] : nkWinUi : GridLayout now allows to set cell coordinates that will ignore the internal border offset given through setInternalBorder*. This can be useful in some contexts, for instance nkEditor is now using it for its main ToolBar, to give it a menu bar look and feel. See GridLayout::setIgnoreInternalBorderCell() for more information.
  • [185] : nkWinUi : Now able to set an icon for a window. The icon will be used for the task bar and the title bar. See Window::setIcon for more details. This functionality is now used by the Editor to inject Nilkins' logo.
  • [170] : nkWinUi : GridLayout can now assign weights to rows and columns. Next to that, adding a component can now be done with a resisable boolean parameter, which will make the component dynamically resizable in the interface, through the use of handles around it.

Fixed :

  • [207] : nkWinUi : Fixed TabWindow's tabs not properly updating their size when their label was modified.
  • [216] : nkGraphics : Camera's pixel direction query methods now accept an optional context as a parameter, which will drive how the relative sampling coordinates are computed. See Camera::getDirectionAtPixelWorld() and Camera::getDirectionAtPixelView().
  • [219] : nkWinUi : Improved LogWin's behavior at creation time, where scrolling could be showcasing weird results if lines were logged before the load method was called.
  • [206] : nkWinUi : Improved behaviour of popping context menus within ToolBar, for which the menu could disappear while its containing window would remain visible.
  • [217] : nkGraphics : Fixed an issue where RTX dependent structures could be initialized even if the hardware was not supporting the feature. This could cause issues with rendering.
  • [218] : nkMemory : Fixed an issue in which creating a StringView from empty std::string or std::string_view could cause crashes.
  • [213] : nkWinUi : Corrected an issue in which the title bar of a Window could be overlapping with its content.
  • [215] : nkWinUi : Fixed potential issues that could lead to crashes when removing Items from a TreeView. This could be triggered through the removal function or by deleting the TreeView.
  • [214] : nkWinUi : TreeView instances can now have a context menu callback. See TreeView::setContextMenuCallback().
  • [212] : nkWinUi : Fixed an issue that could cause a crash if a CheckBox had an empty label.
  • [211] : nkGraphics : RenderContextManager now can erase contexts without needing their window. Also fixed a bug that could cause crashes if the active context was erased.
  • [208] : nkWinUi : ContextMenu now checks for screen bounds when popping, adapting its position to avoid going out of them.

2020_12_06 - Custom painted frames

Newly introduced :

  • [161] : nkWinUi : Now custom painting a Window's borders and title bar, to make it fit better in the general look and feel of all other UI Elements. GraphicsWindow is not altered, for now.
  • [160] : nkWinUi : Introduced a new component, the ToolBar. As a result, MenuBar and all its related API has been removed. ToolBar will allow for more complex behaviour and fits better in nkWinUi's look and feel. As such it should be used from now on. If you were using the MenuBar, it needs to be translated to the ToolBar and its new callback based approach. The ToolBar will need to be inserted in your interface manually, while MenuBar was automatically fitted. See nkWinUi::ToolBar for more details.
  • [199] : nkWinUi : Component can now accept a Theme to override the colors provided from the ThemeManager's active theme. This allows to control the colors of the UI per component, if such a fine grained control is required.
  • [200] : nkWinUi : Reworked the Color class to add the alpha channel and work with floats internally (should values over 255 ever be useful). Attributes were also converted to private members in favor of getters, explicit about what scale the value should take (0-1 float interval or 0-255 char interval). See nkWinUi::Color for more details.
  • [162] : nkWinUi : ContextMenu is now a proper Component, which is custom drawn to fit the theming. The API has also been revamped to use callbacks per registered items, rather than rely on their index. See nkWinUi::ContextMenu in the API documentation for more details.

2020_11_21 - RTX tutorials

Newly introduced :

  • [146] : nkLog : Now using a utility function StringView to forward logging information to the component. This has been made to avoid plain pointers and std's templates over the API. Conversion should be done automatically from std or nkMemory strings, so no work should be needed to make the transition.
  • [163] : nkGraphics : Raygen shader stage was only supporting constant buffers, textures and UAVs, while the miss shader stage was not linked to any resource at runtime. This has been corrected, and now both stages can access all resource types along with samplers.
  • [147] : nkGraphics : Tutorial number 9 about raytracing using hardware is now out ! In there, see how the pipeline for raytracing can be setup and mixed with more common rasterization work.
  • [165] : nkGraphics : Tutorial number 10, going deeper into the raytracing functionalities to showcase how resources and passes can be used to recursively trace a scene.
  • [159] : nkImages : Now supporting encoding of images into HDR format. See HdrEncoder::encode().
  • [158] : nkImages : Now supporting parsing of HDR images using the .hdr / rgbe format. For more information, see nkImages::HdrEncoder.
  • [157] : nkImages : The DDS encoder now supports encoding image data as DDS format. Supported feature sets are the same as the ones supported during decoding. See DdsEncoder::encode() for more information.

Fixed :

  • [168] : nkGraphics : Fixed an issue in which a raytraced render queue's acceleration structure could miss node transformations updates.
  • [167] : nkGraphics : Now properly taking into account the maximum recursion depth specified in a RaytracingPass. It wasn't properly taken into account before, both for creation and updates where it was hard coded at 8. As it now defaults to 1, be sure to correct any code that was relying on the old behaviour, if it exists.
  • [166] : nkGraphics : Now supporting samplers for raytracing hit shaders.
  • [164] : nkImages : Corrected rounding logic when interpolating block color and alpha for BC1, BC2, and BC3 block decompression algorithms.
  • [156] : nkGraphics : Fixed an issue causing crashes when trying to launch a raytracing pass on an empty raytraced RQ.

2020_11_08 - Interface event simulations

Newly introduced :

  • [154] : nkImages : Now supporting formats expressed as bit masks within DDS files.
  • [155] : nkImages : DDS parser now being able to correctly parse cube maps.
  • [145] : nkImages : Can now create an ImageView over a particular slice / mip of another Image. This allows to encode a sub-part of an image, for instance.
  • [144] : nkWinUi : Now able to simulate input on components. This allows to manipulate the interface without using any input device, but rather, code. See Component::simulateEvent().

Fixed :

  • [148] : nkImages : BmpEncoder can now export images with format B8G8R8 and B8G8R8A8.
  • [151] : nkGraphics : Corrected a bug in which geometry wasn't correctly added to the raytracing pipeline if a render queue was fed with geometry before being set in a compositor pass.

2020_11_01 - Offscreen nkWinUi

Newly introduced :

  • [142] : nkResources : Now using the nkMemory::String class family in its API. No conversion should be required to account for this change.
  • [143] : nkWinUi : Now supporting offscreen rendering of UI elements, into images. See Component::paintToImage().
  • [141] : nkImages : Now supporting BC1, BC2, BC3 block decompression to read image pixels for these compressed formats. See the BcxCompressor class family.
  • [140] : nkImages : Added basic support for DDS decoding. It currently supports decoding textures, texture arrays, along with their mips in both cases. The Image class interface has been updated to cope with arrays / mips. Decoding works as long as the format is one of the supported formats within nkImages, and that the pixel format header is not used within the DDS file.

2020_10_25 - Maintenance run

Newly introduced :

  • [139] : nkGraphics : New tutorial introducing the use of compute passes, and how offscreen texture rendering works. Through it, you will see how a compute shader can be used to apply a sepia filter during rendering !
  • [137] : nkMemory : Introduced new classes String and StringView, that will be used when exchanging string information within the API. As they are fully exported, they will offer safer alternatives to std::string and std::string_view which are templated. They will also potentially be more efficient than plain const char*, as the aim is to avoid having to parse string sizes each time a string is required.
  • [138] : nkWinUi : GraphicsWindow now offer the capability to launch with no border. This can be useful to be able to do borderless fullscreen rendering and leverage its performance boosts within Windows.
  • [122] : nkResources : Now returning nkMemory::Buffer upon file loading, rather than a vector. This allows to avoid templates than can have different underlying implementations between Dlls and application.
  • [132] : nkGraphics : The ScreenshotTaker utility class now uses nkImages::Image as a communication type, rather than the temporary ImageData introduced.
  • [123] : nkAstraeus : Dropped the temporary UByteArray classes family to rather use the nkMemory::Buffer family within the scripting environment. For this, the nkMemory namespace has been introduced, along with the Buffer, BufferView, and BufferCast with some of their specialization. Use them to manipulate binary data in Lua !
  • [135] : nkAstraeus : Reorganized the scripting environment wrapping of nkMaths to align on the C++ API. Vectors and Quaternions were formerly in nkGraphics and as a result were still wrapped in the nkGraphics namespace. They now can be used from the nkMaths namespace.

Fixed :

  • [128] : nkGraphics : Revamped the creation of contexts to support better offscreen rendering. Offscreen rendering allows users to create a context and use it to frame / prepare pipeline for them transparently, without requiring a window creation. In some cases, this can leverage the built-in delayed Dll loading and void loading nkWinUi's Dll.
  • [125] : nkGraphics : Safe guard preventing crash when a shader with an uninitialized program was attached to an entity and used in a RenderScenePass. This was corrected for both Dx11 and Dx12 renderers.
  • [126] : nkGraphics : Added a safe guard against binding textures that are not marked as render targets, both in Dx11 and Dx12.
  • [127] : nkGraphics : Cameras now offer the setup of a flag to auto update some of their specs right before rendering, to fit the set rendering context. This allows to help auto updating aspect ratio, for instance, for different size of windows when doing multi window rendering.

2020_10_18 - Environment pre-filtering

Newly introduced :

  • [134] : nkWinUi : The first tutorial about the component's working way has been made. In there, you will see how to start it, create UI elements, and handle input.
  • [104] : nkAstraeus : PbsMaterial now allows usage of pre-filtered environment map to use the split-sum approximation and improve performances while rendering the material. See PbsMaterial::setEnvironmentTexture() and its newly introduced parameter. To prefilter environment maps, please take a look at the newly introduced tool PbsEnvMapFilter.
  • [114] : nkAstraeus : Improved sampling method for both prefiltered and non prefiltered environment maps. This reduces noise for high contrast environment maps sampled with higher roughness values.
  • [91] : nkImages : Introduced basic BMP parsing supporting non compressed and bitfield compressed textures. For more information, please check BmpEncoder.
  • [87] : Introducing nkImages, the component dedicated to image and texture manipulation. First iteration supports some BMP compressions and introduce the basic architecture and API. Check the preface tutorial for more information on what nkImages is capable of.

Fixed :

  • [131] : nkGraphics : MapResult now holds an unsigned char* rather than a void*. This can help in some cases where unsigned chars fit the format and won't need to be casted as a result.
  • [129] : nkGraphics : Aligned between Dx11 and Dx12 how the texture data has to be specified within the CPU data. As a reminder, the way to go is the one described in the documentation of Texture::setCpuData().
  • [130] : nkGraphics : Fixed scissor tests that could be of bad size compared to the viewport, leading to truncated renders. This fix will hold while the scissor API is being designed.
  • [133] : nkGraphics : Fixed an issue in which both Dx11 and Dx12 renderers could crash while loading Textures. If the cpu data's subresource array was left empty (auto generate when loading), and the mip levels specified were not covering a complete mip chain, the loading would try to generate too many mip levels.

2020_10_11 - Pbs general improvements

Newly introduced :

  • [113] : nkScripts : Tutorial 06 is available. In it, you will learn about data serialization and inter-environment communication !
  • [115] : nkGraphics : It is now possible to render to specific mips within a texture. See TargetOperations::addColorTarget(), now using the newly introduced TargetDescriptor, which gives more control on where rendering should occur.
  • [120] : nkGraphics : Mapping textures can now be fine grained to map a particular mip and an entry in their array if possible.
  • [109] : nkAstraeus : PbsMaterial now detects when textures are specified many times over different parameters, and sets its program and shader to feed and sample them only once. This improves performances and support for the parameter channel packing from last release.

Fixed :

  • [121] : nkScripts : Script object serialization API now works with the newly introduced nkMemory::Buffer to avoid templated vector returns / parameters.
  • [117] : nkGraphics : Fixed the mapping of textures used as arrays, with multiple mips.
  • [118] : nkGraphics : Documentation about texture CPU data feeding has been augmented and made clearer.
  • [119] : nkGraphics : Dx11Renderer's clear target pass would not clear the right target in some multi target rendering context. This has been fixed.

2020_10_04 - Pbs normal mapping

Newly introduced :

  • [105] : nkScripts : New tutorial demonstrating how ScriptObjectReference can be used, to impact object reference counting in an Environment or to call scripting functions from the C++ environment. This means safer memory management, and more creative power !
  • [110] : nkAstraeus : PbsMaterial now properly transforms the normals, tangent and binormals using the inverse transpose of the world matrix.
  • [111] : nkGraphics : Now can feed instances world matrices, inversed and transposed, in shaders. See ShaderInstanceMemorySlot::setAsWorldMatrixInvTranspose().
  • [107] : nkAstraeus : PbsMaterial can now do normal mapping. See PbsMaterial::setNormalMapTexture().
  • [108] : nkAstraeus : PbsMaterial now offers the capability to set emissive color, through a constant color or a texture. See PbsMaterial::setEmissiveColor() and PbsMaterial::setEmissiveTexture().
  • [106] : nkAstraeus : The PbsMaterial now allows to specify which texture channels should be sampled to retrieve relevant data. For instance, it is now possible to set the same texture for albedo and roughness, and specify that albedo takes the RGB channels while roughness takes the A channel.
  • [103] : nkAstraeus : PbsMaterial now offers ways to tweak the specular color for the material, through a constant color or a texture.
  • [70] : nkMemory : Set up the architecture for dedicated buffers. Those buffers will allow to replace vectors within the components to avoid them passing the DLL boundary. If your code was already using vectors, no action is needed as conversion functions are in place to make it as transparent as possible.
  • [71] : nkExport : Now supporting Base64 encoding / decoding of binary buffers through the Base64Encoder.

2020_09_27 - Textured PBS

Newly introduced :

  • [75] : nkAstraeus : The PbsMaterial can now use textures encoding albedo, metalness and roughness. Those textures get indexed using the provided meshes texture coordinates, to give more lively results. Also improved the global quality of the shaders.
  • [73] : Now clearing the tutorial source files from all marker comments. They are required during the tutorial writing process to ensure code written is working, but add useless clutter once the release is made. Also did a pass at adding more comment to document better what code is doing, in existing tutorials.
  • [74] : nkScripts : Added the fourth tutorial, demonstrating more advanced user type features : overriding built-in operators, declaring fields, and indexing them as arrays.
  • [76] : nkWinUi : Components now give the possibility to select whether they should remain hidden or be shown on load. See Component::setVisibleOnLoad().

Fixed :

  • [77] : nkGraphics : Improved the render queue sorting when rendering, improving performances in some cases.
  • [67] : nkGraphics : Corrected offscreen context creation for which the window could be shown.
  • [48] : nkEditor : Corrected some GroupBox that should have been invisible on the Compositor window interface's load.
  • [72] : nkGraphics : Fixed a problem when generating mips for a texture in Dx12. Under load, the GPU could be too slow and placed resources were potentially not discarded before being populated.
  • [68] : nkGraphics : Fixed a crash when requesting to load a texture which was already loading in the Dx12 renderer.
  • [66] : nkGraphics : Fixed an issue within the Dx12 renderer that could potentially cause a crash when deleting a RenderContext while rendering was happening.

2020_09_20 - Introducing the material system

Newly introduced :

  • [53] : nkAstraeus : Created the Material system basis. Materials are shader effects that can be setup through API, and directly used in the rendering with nkGraphics. The first material introduced is the Physically Based Shading (PBS). While still being improved, it demonstrates well what the Material system will be capable of.
  • [54] : nkAstraeus : Added the basic API documentation about the related classes of the newly introduced material system. A good starting point would be the nkAstraeus::MaterialManager.
  • [55] : nkAstraeus : Added one tutorial about launching the component, and one guiding through the material system basics.
  • [56] : nkScripts : Wrote the third tutorial, guiding through the namespaces and user types.

Fixed :

  • [62] : nkGraphics : Fixed an issue within the Dx12 renderer that could lead to crashes when shader resources were not in consecutive slots.
  • [63] : nkGraphics : Fixed an issue within the Dx12 renderer, that could in some cases cause a crash when trying to use a cubemap texture which was still loading. Problem was due to a racing condition between CPU and GPU. During that short time, internal texture types were in an incorrect state, preventing an internal safety from being triggered.
  • [61] : nkGraphics : Improved the handling of external defines / macros setup for a Program compilation. The API is now clearer and more robust.
  • [58] : nkGraphics : Fixed an issue where some internal used programs and shaders could be exposed during exporting of a ResourceSet.
  • [57] : nkEditor : Fixed an issue in which sometimes, the editor relevant data was not exported with the project. This could cause the active compositor / script to be lost upon reload.

2020_09_13 - Basic nkScripts tutorials

Newly introduced :

  • [45] : nkScripts : Added the first two tutorials, to introduce the base of the API. First tutorial demonstrates a basic environment and script setup. Second one introduces environment variables and the usage of Function.

Fixed :

  • [50] : nkWinUi : Fixed a regression that prevented EditBox to use symbols like =, (, "...
  • [51] : nkScripts : Improved the documentation of Function to fix some code layout issues, and add more information to the addParameter function.
  • [47] : nkEditor : The shader interface now properly refreshes the type of a shader when its program gets assigned.
  • [49] : nkGraphics : Fixed an issue within the Dx11 and Dx12 renderers that could cause a crash to happen with buffers counting 0 elements of 0 bytes.
  • [24] : nkGraphics : Fixed an issue within the Dx12 renderer that could lead to a crash or prevent a pipeline state object to be correctly updated with shader instance slots updates.
  • [46] : nkEditor : Fixed a potential crash when selecting a program to link it to a shader, if the names were mismatched.
  • [43] : nkEditor : Simplified the default program sources set when switching their type.
  • [44] : nkEditor : Fixed the gamma correction of the picking staging texture, which caused the logging of a warning when launching the editor.
  • [40] : nkEditor : Improved the tutorial 01 to give better guidance over the whole process, through new images and better descriptions.
  • [42] : nkGraphics : Improved the logging of mismatch between Program input required and Mesh + Shader provided data in the Dx12 renderer. Also fixed an issue in such cases where fallback solution was crashing Intel drivers.
  • [41] : nkGraphics : Fixed an issue in which node graph could be omitted when exporting a resource set.

2020_09_06 - First week patch

Newly introduced :

  • [39] : Added a search box to the API documentation page to help navigation.
  • [38] : Added more information about components in their namespace API documentation, to help to get started with them.
  • [25] : Added a preface tutorial to all remaining components, offering a basic presentation for each of them. This can be a good starting point to get a bit more details about what each component does.
  • [26] : nkEditor : Added tutorials to help you getting to know it. You will now be able to read the purpose and functionalities presentation in the preface tutorial, and see its capabilities demonstrated in the following tutorial.
  • [35] : nkGraphics, nkEditor : Now logging a warning whenever a texture is requested to be gamma corrected but has a format not supporting sRGB variants. This was silent before, albeit the fact it is preventing automatic gamma correction from correctly happening. If this warning pops, manual correction has to be done in the shader, or the texture format should be changed to a format supporting sRGB variants. More information can be found within the API documentation of nkGraphics::Texture::setGammaCorrected().

Fixed :

  • [31] : nkGraphics : Corrected an issue in the Dx11 renderer where loading cube map textures from a file would not update the texture type correctly.
  • [33] : nkEditor : Corrected a crash when trying to search for program source files, using the dedicated buttons in the program interface.
  • [36] : nkGraphics : Correction of a documentation problem for the FORMAT enum. UNKNOWN value has been renamed UNKNOWN_FORMAT to be more specific. This way the API documentation finds its way back and is now correct.
  • [34] : nkWinUi : Fixed an issue where EditBox would take non alpha numeric char input (escape...) and insert them in the string, causing squares to be visualized.
  • [28] : nkEditor : By default, the 3D rendering window is now gamma corrected. The flag was turned off on the render context, leading to incorrect gamma correction when presenting the image.