Nwge Changelog
This document contains changelogs for all publicly available versions of the
engine. Each version is also accompanied by the date on which it was released.
0.20
July 8th, 2025
- Added
VertexAttribute helper class.
- Added random number generation functions:
randU64(), randInt(),
randF32(), randFloat().
- Fixed a crash when destroying an invalid object.
- Removed
e.objects console command.
- Added
e.objectCount and e.verboseObjects console commands.
- Added
e.version as an alias for the e.ver console command.
- Updated the Renderer Options window in the debug toolbar.
- Added a
Fullscreen checkbox. This is equivalent to pressing F11
or the r.fullscreen console command.
- Added a
Texture Filtering checkbox that enables or disables filtering for
Texture and AnimatedTexture objects. This is equivalent to the
r.filterTextures console command.
- Added a
Font Texture Filtering checkbox that enables or disables filtering
for textures used by Font objects.
- Added a
Disable Textures checkbox that, when enabled, replaces all
textures (excluding fonts) with a blank, white texture. This is equivalent
to the r.disableTextures console command.
- Added a
Cull Mode list, which is equivalent to the r.cullMode console
command.
- Updated the object counters to also include the maximum amount of a given
object.
- Fixed
Font::measure and render::measureText.
- Updated how font account for window aspect ratio.
- No longer uses an AspectRatio object internally.
0.19
July 5th, 2025
- Added support for IMA ADPCM encoding in RIFF WAVE files.
- Added support for the Quite OK Image format.
- Added support for the Quite OK Audio format.
- Added support for non-RGBA textures.
- If your texture is stored with only 3 color channels (no transparency), then
the texture will also be stored in that format on the GPU.
- This will decrease VRAM usage slightly.
- Rewrote a majority of the
render::Image class.
- Added
r.memory and r.fontList.
- Improved consistency of engine object copying behavior.
- All engine objects now have proper copy constructors and copy assignment
operators.
- Fixed leaks of certain objects when copying.
- Added
render::windowIcon and Bundle::nqWindowIcon.
- Added
render::clearDepth.
0.18
July 1st, 2025
- Added
Maybe::orElse.
- Fixed rare crash when encoding JSON.
- Fixed mods not loading.
- Optimized mod loading.
- Fixed CFN fonts being incorrectly decoded on Windows.
0.17
June 23rd, 2025
- Improved implementation of certain renderer functions:
- OpenGL object names are now pregenerated when the renderer is initialized.
This should make creating and destroying engine-level texture, buffer etc.
objects faster.
Rect::draw() (used by render::rect()) uses Primitive::TriangleFan and
no longer uses an EBO.
- Ditto for
render::plane().
render::line() uses a specialized vertex shader and thus no longer
uses atan2 or sqrt.
- Changed how mouse cursors are handled:
- Renamed
<nwge/cursor.hpp> to <nwge/Cursor.hpp>.
Cursor enum was renamed to CursorState.
getCursor() becomes getCursorState(), setCursor() becomes
setCursorState() etc.
- Added
CursorState::Custom.
- Added
Cursor object, which represents a custom cursor.
- Added
NWGE_MAX_CURSOR_OBJECT_COUNT with a value of 8.
- Added support for parsing cursors in XCursor format.
- Fixed a potential crash when an invalid object is created before GUI is
initialized.
- Improved memory layout to reduce amount of small allocations when creating
certain objects.
- Improved texture upload:
- If a texture is already in
RGBA32 format, it is no longer converted before
being uploaded to the GPU.
- This should improve texture loading performance.
- Fixed mods using case-sensitive names on Linux.
- Improved object pool implementation.
- The engine is now much less prone to crashing due to uninitialized objects.
- Removed the ability to create duplicate console command objects.
- Creating two console command objects with the same name is now properly
detected, in which case only the first object will be valid.
- A warning will be issued to the engine journal about this.
- Added a limit on how long command names can be (32 characters).
- Rewritten
nwge::String class.
- No longer a subclass of
nwge::Array.
- Performs optimizations for small strings. In case a string is smaller than
the size of a pointer, then the string data is stored in place of the
pointer. This helps eliminate small allocations and slightly improves memory
usage.
- Better comments.
- Optimized
String::formatted().
- Added
FauxObject.
- Fixed
operator ArrayView<const T>() sometimes causing an ambiguous
constructor error.
- Added a
data::FileView constructor accepting a path.
- Fixed
Schema using non-const ArrayViews over array elements.
- Updated config loading code to use file mapping instead of reading the config
file into memory manually.
- Replaced
json::Value with a more optimal implementation.
- More compact memory layout:
- 3 bits for type
- 61 bits for an element count (for strings, arrays, objects)
- either f64 (for numbers) or pointer to data (for string, arrays, objects)
- This removes a double indirection previously present in the implementation
(for arrays,
Value used a pointer to a heap-allocated Array, which in
turn contained its own pointer to the actual heap-allocated data)
- More consistent handling of copying & moving (moved objects turn into
null)
- Default constructed values are
null, and the nullptr_t constructor has
been removed.
- Removed
VertexBuffer::draw, render::shape and render::put functions
accepting a VertexBuffer.
- Added
Journal to e.memory.
- Fixed some issues with lengthy journal entries.
- Entries can now have theoretically infinitely long messages and
descriptions.
- Increased the length limit of entries when saving to disk to 1024 (from
496).
- Added support for
libsndfile.
- If
libsndfile is installed on your system, nwge will be able to use it to
load many more audio formats.
- Without
libsndfile nwge can only load WAVs and MP3s.
- You can simply bundle a
libsndfile DLL with your game, nwge will handle
the rest.
- If you do not intend to use this extra functionality, it is completely
optional.
- Added the “Memory Stats” engine GUI window, which shows the same information
as the
e.memory console command except in real-time.
- Added
ArrayView methods:
equals() and operator==()
find(), reverseFind() and contains()
- Removed
StringView::equals, StringView::find and StringView::reverseFind
in favor of ArrayView::equals, ArrayView::find and
ArrayView::reverseFind respectively.
- Fixed bundle tree validation returning errors on valid bundles.
- Fixed 3D camera calculations.
- Optimized bundle tree search.
- Fixed OBJ parser crash when mesh doesn’t have texture coordinates.
- Increased camera far Z to 250.
- Added
String methods:
concat(), operator+(), operator+=()
equals(), operator==()
- Added automatic uniform:
in_InvModelMatrix, the inverse of the model matrix.
- Added support for per-character coloring of text.
- To take advantage of this, use a
Cursor.
- Between adding text to the Cursor (via
operator<<), simply call
render::color() to change the color of the characters being added.
- Example:
auto cursor = myFont.cursor(textAnchor, textHeight);
render::color();
cursor << "This text will be white. ";
render::color({0, 0, 0});
cursor << "But this will be black.\n";
cursor.draw();
- Removed the
KeyDown and KeyUp events.
- Changed how the bundle library and the NwgeCFN library are loaded.
- These two libraries are now loaded at run-time, as the engine is
initializing.
- In case either is missing, the user will be met with a much nicer message
explaining that a needed library is missing. Otherwise, we rely on the
operating system relaying that information to the user, which can be quite
cryptic (see: Linux).
- Added
ArrayView::constBytes() and removed the const-qualified overload of
ArrayView::bytes().
- Removed support for SDL2_image.
- Below are listed some other, optional libraries you can use instead.
- Nwge will automatically load supported libraries and use them.
- If none of the optional libraries are found, nwge has built-in fallbacks
that should provide a good enough set of functionality.
- This way, you can only ship the libraries you intend on using. For example,
if you only intend to use PNG & JPEG, then there’s no need to use any
library as nwge has built-in support for the two.
- Added support for FreeImage.
- This is an optional library. If you bundle it with your app, nwge will
automatically load it and use it to load
Textures.
- Loading
AnimatedTextures is not supported.
- If not present,
stb_image is used as a fallback.
stb_image is only compiled with support for PNG and JPEG.
- Added support for
libwebp.
- This is an optional library. If you bundle it with your app nwge will
automatically load it and use it to load
Textures and AnimatedTextures.
- Unlike FreeImage,
libwebp can be used to load animated WebPs as
AnimatedTextures.
- Added support for
libvorbisfile.
- This is an optional library. If you bundle it with you app nwge will
automatically load it and use it to load
Sounds (and by extension
Buffers) from Ogg files using the Vorbis codec.
- Ogg files with other codecs can be loaded with
libsndfile instead.
- Added support for
libFLAC.
- This is an optional library. If you bundle it with you app nwge will
automatically load it and use it to load
Sounds (any by extension
Buffers) from FLAC files and Ogg files using the FLAC codec.
- Added ability to query availability of optional features.
- In
<nwge/common/feature.h>, use nwgeQueryFeature().
- Can be used to throw errors if a library you expect to be present isn’t
available. (In case of a corrupt installation or the user meddling with
your app’s files, for example)
- Removed
Camera::front() and Camera::right().
- Added
near and far to CameraSettings.
- Changed NwgeCFN font generation.
- Now uses
SDL_ttf again.
- Font generation is an optional feature, only available if the
SDL_ttf
library is installed on your system.
- That means the
nwge_cfn library can be shipped without any reliance on
SDL_ttf being present to function whilst still using its font generation
capabilities when installed.
- Added
cfnGenerationAvailable() function to libnwge_cfn.
- Added
audio::Buffer methods:
sampleRate() and sampleCount()
- Utility
duration() method that calculates the duration of the buffer’s
audio using the sample rate and sample count.
- Updated CFN format with improved bitmap compression.
cfn.h: Renamed CFN_FLAG_RLE to CFN_FLAG_COMPRESSED.
cfn.h: Removed CFN_FLAG_RLE2.
nwgecfn tool: Renamed -no-rle to -no-compression.
nwgecfn tool: Removed -old-rle.
- Fixed an issue where uploading new data to a VBO or EBO after it was added to
a VAO would cause the vertex/element count used for rendering to
de-synchronize.
- Fixed a crash when loading an OBJ file without normals.
- Added
render::mat::pushTransform().
0.16
February 12th, 2025
- Moved
json::Value and related definitions to <nwge/json/Value.hpp>.
- Added key hashes to
json::Object.
- This brings the implementation of
json::Object and Table closer.
json::Object cannot be typedefed to Table since json::Object is
implicitly convertible to json::Value, whereas Table isn’t.
- Fixed engine crashing on loads that shouldn’t crash.
- Added
SubState::Options::subTimeScale.
- Replaced implementation of
Date::today() and Time::now() with an inline
one using <chrono>.
- Added
render::Texture::loaded().
- Added
MoveH and MoveV to nwge::Cursor.
- Added
render::Cursor::defaultFont().
- Added
nwge::KeyBind::keyName().
- Fixed app name not being displayed correctly when checking which programs are
inhibiting screen saver.
- Some Linux desktops list applications that are preventing the screen from
being locked (KDE’s Power Management applet, for example).
- This would previously display “My SDL application”.
- It now correctly shows the name of your app.
- Fixed how UTF-8 codepoints are handled in
Path::sanitize().
- Added
<nwge/data/FileView.hpp> header, containing FileView.
- Moved
json::parse() into <nwge/json/parse.hpp>.
- Added
json::parse() overload accepting a data::RW to parse files as JSON
directly.
- This uses
FileView internally.
- Added
json::Error structure, which wraps a json::ErrorID providing utility
operator overloads for more concise code.
- Moved
render::clear() into <nwge/render/draw.hpp>.
- Added State and SubState labels.
State and SubState constructors now accepts an optional StringView to
use as a label in engine journal and in renderer debug messages.
- Added
State::label() and SubState::label() to retrieve the
aforementioned label.
- Removed SubState Stack section from State options temporarily.
- Increased scratch-space allocation history size.
- You can now make many more scratch-space allocations before it will return
to the beginning of the memory arena.
- Added support for on-disk shader caching.
- Requires the
GL_ARB_get_program_binary extension.
- Currently, only built-in shader programs are cached.
- You can view the currently cached shaders in:
$XDG_CACHE_HOME/nwge/shader-cache (most likely
~/.cache/nwge/shader-cache) on Linux
%APPDATA%\nwge\shader-cache on Windows
- Check the engine journal to see the shader cache in action.
- Added
memCopy() and memMove() for ArrayViews.
- Added
Path::empty().
- Refactored path iteration functionality:
- Removed
Path::Iterator and moved it into a separate struct,
PathIterator.
PathIterator can be constructed directly, Path::iterate() is just a
shorthand for PathIterator(const Path&).
PathIterator skips over directories and hidden files by default.
- Added
PathIterator::includeDirs(), PathIterator::includeHidden() and
PathIterator::onlyDirs().
- Fixed
render::square() incorrect textures.
- Fixed a crash when calling
Path::ext() with an empty StringView.
- Fixed
SubStates not being de-allocated if they couldn’t be pushed onto the
sub-state stack.
- Improved RLE format for NwgeCFN fonts. (via
CFN_FLAG_RLE2 flag)
- Added support for automatically-updated uniforms for custom shader programs.
- For example, if your shader program has a uniform named
in_Tint, that
uniform will be updated with the color last set by the render::color()
function so you can tint your shader output correctly.
- This is handled transparently by the engine.
- The following uniforms are currently supported:
vec4 in_Tint: color set by render::color().
mat4 in_Transform, mat4 in_ModelMatrix: obtained from the matrix
stack, manipulated with functions from the render::mat namespace.
mat4 in_ProjMatrix: projection matrix of the current 3D camera.
mat4 in_ViewMatrix: view matrix of the current 3D camera.
float in_Time: time since engine initialization.
- Renamed
Mesh::draw() to Mesh::draw3D().
- Added
Mesh::draw2D() and Mesh::draw().
- Moved
Mesh::bind() to private, as it’s only used internally.
- Replaced the scratch-space implementation with
qmlScratch
(https://github.com/qeaml/scratch)
- Additionally, the memory is now stored in a dedicated memory page rather
than being stored alongside all other engine state. This will make the
scratch-space more resistant to memory corruption, buffer overruns etc.
- Removed
nwgeScratchQuery().
- Updated output of
e.scratch.
- Fixed memory leaks when changing state.
- Fixed memory leaks when shutting down the engine
- Added
e.memory console command.
- Removed
e.alloc and e.scratch console commands, being replaced with
e.memory.
- Added
VertexArray::defaultVertexLayout.
- Changed default
CullMode to CounterClockwise, as per most other 3D
applications.
- The engine will no longer reorder triangles in STL files.
- (Linux-only) Added invalid memory access diagnosis.
- Whenever a SIGSEGV is caught, the engine will examine the address that
caused it and display a likely cause of the error.
- For example, there are guard pages set up around the engine scratch-space.
If one was to write to these guard pages the kernel will generate a
segmentation fault. The engine can detect that the faulty address is in one
of the guard pages and thus suggest the error may be a scratch-space buffer
overrun.
- Because Windows does not provide
sigaction(), this is only available on
Linux. To examine the address of a segmentation fault on Windows, you must
use a debugger. (at which point you can examine the code to find out what
went wrong)
0.15
December 22nd, 2024
- Fixed
nwgebndl extract file name filter.
- Added
CodepointIterator.
- Updated string rendering to properly handle UTF-8 codepoints.
- Updated JSON parser & encoder to accept UTF-8 codepoints.
- Updated file path parser to accept UTF-8 codepoints.
- Reintroduced
render::text.
- Added support for MP3 files.
- Improved handling of engine panic before the renderer has been fully
initialized.
- Before: The app would freeze with no way to exit it other than to terminate
the process.
- Now: The engine will check if a usable window is present and show a dialog
box if not.
- Removed a lot of bloat from the engine journal.
- Improved how the sub-state stack is implemented to avoid a ton of potential
use-after-free issues.
- Fixed some edge cases with sub-state ordering.
- Added
nwge::clearSubStates().
- Improved how data loading queues are defined.
- Added dedicated queues for
AnimatedTextures, Sounds and
audio::Buffers.
- Removed
JSON queue.
- All queues are now defined in the
data/queues.ipp header.
- Added
render::Mesh.
- Added STL and OBJ model loading support.
- Note: Nwge, by default, uses clockwise
winding order. Most other software, on the other hand, uses
counter-clockwise. When loading an STL file, Nwge will reorder the
triangles’ vertices. Nwge does not reorder vertices in OBJ files.
- Tip: Use the
render::cullMode and render::resetCullMode functions to
control winding order.
- Removed in-engine profiler.
- Added a call to
glPushDebugGroup() for main state render and every sub-state
render. (and an appropriate glPopDebugGroup() call of course)
- This should make it easier to troubleshoot issues with multiple sub-states
rendering incorrectly.
- Improved error handling in
libnwge_bndl.
- Bundle file structure is now validated. Files can no longer overlap the
header or file tree.
- Errors are now properly shown in the
nwgebndl CLI.
bndlFreeWriter now returns a BndlErr. The function has also been marked
as no-discard to ensure the error is handled after updating.
- Improved implementation details of
nwgebndl CLI.
- Added basic mod support.
- Mods are folders inside the
mods folder in the same directory as the main
app executable.
- Each mod contains a folder for each bundle file it modifies.
- Files placed in a bundle folder will replace the files present in the bundle
with the ones from the modded folder instead.
- Example:
mods/.../game/Settings.json will replace Settings.json in
game.bndl.
- Fixed
Path::ext() incorrectly handling empty extensions.
- Removed custom bundle lookup directories.
- Bundles are loaded from either the current working directory or from the
data directory.
- Fixed sub state stack ticking inexistent sub states.
0.14
October 14th, 2024
- Changed how engine GUIs are handled internally. This changes how some
engine-level key bindings behave:
- The journal/crash button was changed from F12 to F10.
Additionally, it now works the same regardless of whether the debugging
toolbar is visible or not.
- Pressing function keys no longer causes key bindings to be triggered.
- Fixed some minor Dear ImGui API usage issues.
- Changed debugging toolbar key bindings:
- F2 - toggle console.
- F3 - toggle journal viewer.
- F4 - toggle profiler.
- Esc - hide the debugging toolbar.
- Changed
NWGE_UNREACHABLE & nwgeUnreachable() to accept a message.
- Improved console implementation.
- Removed
console::show().
- Added
console::Command::run().
- Changed some internal implementation details of various engine subsystems,
which may result in minor performance improvements.
- Fixed a potential buffer overflow in
cliParse().
- Added basic support for 3D rendering.
- Added
render::model, which simply renders the provided mesh using the
current matrix stack as the model matrix.
- Added
render::plane, which accepts a transform object defining its
position, rotation and scale as well as an optional texture.
- Added
render::Camera.
- Use
Camera::makeCurrent() to make the camera the current camera. This
will cause all future rendering to use the camera’s settings, position,
rotation etc.
- Use
Camera::settings() to view or change the camera’s settings.
- Use
Camera::pos() to get the camera’s position.
- Use
Camera::move() to move the camera.
- Use
Camera::rot() to get or change the camera’s rotation.
- Use
Camera::front() to get the camera’s front vector.
- Use
Camera::right() to get the camera’s right vector.
- Rewrote mouse cursor management code.
- Fixed “Quit App” button in the debugging toolbar.
- Added ability to change cull mode on the fly.
- Added
render::cullMode().
- Added
r.cullMode command.
- Added
Cursor::Hidden and Cursor::Captured.
- Removed
releaseCursor(), use defaultCursor() instead.
- Fixed window not being resizable.
- Increased maximum amount of Shaders and Shader Programs to 16 each.
- Added audio system.
- 16-bit signed 44.1 kHz audio.
- Uses MojoAL for audio playback and dr_wav for loading WAV files.
- Added
audio::Buffer.
- Added
audio::Source.
- Added
audio::listenerXxx functions.
- Added
gainScale user configuration option.
- Added
config::setGainScale and config::getGainScale.
- Added
a.gain command.
- Changed CFN generation to use stb_truetype instead of SDL_ttf.
- All functions which previously accepted a
TTF_Font pointer now accept an
SDL_RWops for a TrueType font file as well as an atlas height.
- Monospace fonts are currently not supported and all fonts will be generated
as a variable-width font.
- SDL_ttf is no longer a required dependency.
- Added
CfnErrorInvalidArg, CfnErrorUnimplemented.
- Renamed
CFN_FLAG_X_MASK to CFN_FLAG_X.
- Added support for Run-Length Encoding in NwgeCFN fonts.
- Changed the font compiler to use RLE by default.
- Added
-no-rle flag to disable RLE.
- Added
Path::Iterator and Path::iterate().
- Added
Path::isFile() and Path::isDir().
- Changed built-in blank texture to no longer use up an entry in the texture
object pool.
- Added
r.textures to enable & disable textures.
- Added
json::ObjectBuilder and json::ArrayBuilder for easier construction
of these values.
- Added
json::Schema for easier parsing and validation of JSON objects and
arrays.
- Added
std::formatter for Maybe.
- Added
Table.
- Added
XXH64.
- Changed
Slice::push() to return a reference to the newly pushed element.
- Added
Slice::emplace().
- Changed how window state is saved to config file:
- Added
windowState:
Default is used when the user didn’t change anything about the window.
Resized is used when the user resized the window.
Maximized is used when the user maximized the window.
Fullscreen is used when the user toggled fullscreen mode.
- Changed
windowW and windowH to only be saved when windowState is
Resized.
- Added
config::WindowState and config::User::windowState.
- Changed window size to be separate from viewport size and render resolution.
- Added
config::Dev::filterTextures.
- Defaults to
false to replicate old behavior.
- Added
r.filterTextures command.
- Added console command history.
- Fixed
e.quit and toolbar’s Quit App button not working.
- Added the kill screen.
- Fixed the built-in default font.
- Added
Store::nqDelete.
- Added
rebuild action to the nwgecfn tool.
nwgecfn rebuild <input NwgeCFN font> [output NwgeCFN font]
- Rewrote the entire fonts & text rendering code.
- Changed NwgeCFN version to v2. NwgeCFN v1 is no longer supported.
- Updated built-in default font.
- Improved font texture atlas generation.
- Removed support for loading TrueType fonts.
- Removed
Font methods:
save()
generate()
createMonospace()
createVariable()
- Added support for Nwge Bundle version 2.
- V2 offers support for file modification times:
- Currently, this is only supported by the binary format. The API does not
support this.
- V2 ensures file tree integrity by checking the file tree hash.
- This is performed automatically when loading or saving a bundle.
- This uses the xxHash64 algorithm.
- V2 supports flags, which allow for more advanced features to be added in a
backwards-compatible manner.
- Added
d.help and d.bundleList commands.
0.13
August 11th, 2024
- Added new
StringView methods:
trimPrefix() & trimSuffix()
find()
- Rewrote some Linux-specific code (memory usage, debugger detection & distro
information)
- Added more system information to journal when pre-initializing engine.
- Fixed
nwgebndl list not displaying 12-character long filenames correctly.
- Added 16-byte alignment to all file data in newly created bundle files. This
does not invalidate any existing bundles and only affects newly created
bundles. This affects
libnwge_bndl directly, and as such no code changes are
necessary.
- Added warning about long filenames and/or extensions to
nwgebndl create.
- Added
cliInit().
- Added
CLI_ESC, CLI_SGR and multiple CLI_SGR_XXX macros.
- Changed
nwgebndl create to be less noisy.
- Changed engine directories to be more compliant with the XDG Base Directory
Specification on Linux. The Windows version is unchanged.
- Added
recurse parameter to Path::mkdir() to allow for recursive
directory creation.
- Added journal dump if the engine fails to pre-initialize or initialize.
- Updated journal file & terminal output formatting.
- Updated data system teardown process.
- Updated console system teardown process.
- Fixed some edge cases where crashing during state changes would cause
resources to leak.
- Rewrote render system. Major changes include:
- Renamed
<nwge/render/font.hpp> to <nwge/render/Font.hpp>.
- Renamed
<nwge/render/aspectRatio.hpp> to <nwge/render/AspectRatio.hpp>.
- Removed all
<nwge/render/gl/...> header files.
- Removed
<nwge/render/gl.hpp> header.
- Removed
render::hideWindow(), render::showWindow(), and
render::toggleWindow().
- Split
render::setScissorEnabled() into render::enableScissor() and
render::disableScissor().
- Removed
r.wireframe and r.info.
- Added
r.textureList, r.shaderList and r.programList.
- All render objects are now engine objects. The corresponding
NWGE_RENDER_MAX_*_OBJECT_COUNT macros have been added to engineLimits.h.
- Added the following engine object types:
Texture: 7
Shader: 8
ShaderProgram: 9
Buffer: 10
VertexArray: 11
- Removed the
nwge::render::gl:: namespace. All names previously within it
are now inside nwge::render instead.
- Objects that were previously subclasses of
Buffer now simply wrap a plain
Buffer object.
- Shaders are now properly detached from shader programs upon linking,
allowing for them to be properly destroyed.
- Added
ArrayView::bytes().
- Added
CullMode.
- Updated mouse motion event:
Instead of a simple
vec2 for the mouse motion, it now contains
the position from which the movement began, the position where the movement
ended and the relative movement.
- Improved state system, which should result in a small performance boost. This
affects the main engine loop as well as event handling & key bindings.
- Improved handling of missing & invalid textures. The engine should now catch
many more cases of such textures.
- Added
AnimatedTexture.
- Improved JSON string parsing & encoding.
- Added
r.bufferList.
- Added
BBox.
- Added
std::formatter for glm::vec3. (in render/Vertex.hpp)
- Removed
render/misc.hpp.
- Added
render::line().
- Changed app state de-init. The states are now destroyed right after the engine
exits the main loop. Thus, any code that runs after the engine returns from
start()/startPtr() will run after all states have been destroyed.
0.12
July 13th, 2024
- Added
NWGE_UNREACHABLE and nwgeUnreachable(...)
- Moved
console::Callback into console::Command
- Added
console::Var
- Removed
dialog::input and dialog::password functions and replaced them
with dialog::Input class
- Improved handling of empty title and message for various dialog boxes
- Added
Path::rename and data::nqRename
- Added
FilePicker::defaultPath
- Added
data::nqSave
- Added
_MIN, _MAX, _BITS macros for f32, f64, ssize and usize.
- Added
F32_EPSILON and F64_EPSILON.
- Added implementation of
render::windowTitle.
- Added
dialog::color().
- Added console & journal output to terminal if one is present. (Linux only)
- Added operating system information to journal for debugging purposes and
e.ver console command.
- Added
Date and Time.
- Added
openURL.
0.11
June 8th, 2024
- Added open/save file dialogs. (
nwge::dialog::FilePicker)
- Added folder picker dialogs. (
nwge::dialog::pickDirectory)
- Added
nwge::console::show()
- Added ‘Tick Once’ button to state options.
- ‘Break and tick’ and ‘Break and render’ buttons in state options now ask for
confirmation when a debugger isn’t attached.
- Fixed
dialog::confirm() always returning false.
- Added the following statistics to the profiler:
- Minimum: The shortest time between when the tick began
and the render finished.
- Maximum: Similar to Minimum, but the longest time instead.
- Average: Similar to Minimum and Maximum, but the average time instead.
nwgebndl create now ignores files ending with a tilde (~).
- Changed key binds to a callback-based approach.
- Added
Path methods: open(), copy().
- Added
Store::path().
- Added
data::nqCopy().
- Added prompt asking user to open the journal file after it is dumped to disk.
- Added
dialog::input() and dialog::password().
- Added
dialog::Choice
- Added
render::gl::Texture::load(data::RW&) to satisfy Loadable.
- Added the ability to load files directly from paths via
data::nqLoad(const
Path&, Loadable&)
- Added
Event::MouseScroll
- Added automatic culling to
render::rect and text renderer.
- If the engine determines that a rectangle is outside the screen, then the
command to draw it is never sent to the GPU. Note that if you manually
manipulate the rectangle’s position via the matrix stack, the engine may
mistakenly decide not to render your rectangle. Please ensure that is not
the case.
- If a character from a text string is determined to be outside the screen,
then that character is discarded. Note that each character in the string is
considered individually, so only some substrings may be rendered instead of
the full string.
- Separated
render::gl::ArrayBuffer (for any type of data) and
render::gl::VertexBuffer (specifically for vertex data)
- Added
render::gl::Stats::vertexBuffers, counting the amount of
VertexBuffer objects
- Changed how character data buffers are handled by text renderer.
- Each font now has its own character data buffer.
- Improves cache locality for renders.
- Avoids potential conflicts when using
Cursor objects with multiple fonts.
- Added
toUpper(ArrayView<char>) and toLower(ArrayView<char>).
- Fixed
isSpace() considering non-ASCII characters as spaces.
- Added proper copy and move constructors for
Object and all its subclasses.
- Added
render::square
- Fixed journal buffer overrun
- Fixed some ordering issues in engine shutdown
- Added fallback directories to place journal files in in case the usual path
could not be determined.
- Downgraded to OpenGL 3.3, which disables some rendering features