All notable changes to this project will be documented in this file, following the format defined at keepachangelog.com. Where a change was contributed via a third-party pull request, the author will be credited.
This project adheres to Semantic Versioning.
- The internal representation of
Textureobjects has been changed to improve performance.
0.3.2 - 2019-01-15
Rectangle::contains_pointhave been added.
- Added a missing function parameter to
window::set_mouse_visible, so that you can actually set the value.
- This is technically a breaking change, but given that the functionality is completely broken, this will be included in a patch release rather than 0.4.
- Restructured the platform layer to better facilitate new backends in the future.
- Improved docs for the
mathmodule to make it clearer why a re-export is used.
0.3.1 - 2019-12-15
- Fixed an issue with variable timesteps causing an infinite loop.
0.3.0 - 2019-12-14
Statetrait now provides an
eventmethod for hooking into window/input events. This is useful in scenarios where you want to be notified of events rather than polling (for example, reacting to window size changes).
Contextcan now be configured to have a variable update rate, if that suits your game/architecture better. This is exposed via the
- Several new functions have been added to the
timemodule, to support both variable and fixed timesteps.
- Functions for getting and setting vsync have been added to
- Details of the active graphics device can now be retrieved by calling
Shader::from_fragment_stringconstructors have been added.
Color::BLUEconstants have been added.
graphics::reset_transform_matrixhas been added, which allows you to apply a transformation to your rendering.
Camerastruct has been added, which provides a simple way of creating a transform matrix.
- Serde support has been added (via the
serde_supportCargo feature) for the following types:
mathtypes, as defined by the
- Tetra now targets the latest stable Rust compiler, rather than a fixed minimum version. This will hopefully change once Cargo has better functionality for enforcing minimum supported compiler versions - currently it's impossible to make guarentees, as our dependencies can change their minimum versions at will.
State::drawno longer takes the blend factor as a third parameter - instead, you can call the new
MouseButtonare now Tetra-specific types, rather than re-exporting the SDL versions. Note that some names have been changed for consistency, and some variants have been removed to simplify the docs.
TetraError::OpenGlhave been merged into
TetraError::PlatformError, since they both represent the scenario where something's gone seriously wrong with the underlying platform.
DEFAULT_FRAGMENT_SHADERare now const instead of static.
- Screen scaling has been extracted from the core of the engine, and is now provided via the
ScreenScalerstruct. This allows it to be more flexibly integrated with the rest of your game's rendering.
- Various functions now return errors instead of panicking.
TetraErrorhas been reorganized, so that the errors returned are more descriptive.
glmmodule has been renamed to
math, and the
nalgebra-glmdependency has been replaced with
Vec2is now exported from
- More types can now be passed into shader uniforms via the
- The graphics device debugging info is now hidden by default. Set the
trueto bring this back.
- The functions for setting the fullscreen/cursor visibility state have been changed to take booleans, instead of there being multiple functions.
Shader::fragmentconstructors have been renamed to
- Animations now use a
Durationto specify the frame length, and as such, they are no longer coupled to your game's tick rate. Call
drawmethod to advance the animation's timer.
time::f64_to_durationhave been removed, as the standard library now provides this functionality (
ContextBuilder::tick_ratehas been removed, as
ContextBuilder::time_stepnow fulfils the same purpose.
- Removed deprecated sub-modules from
- Removed deprecated
color::WHITEconstants - use
- Removed deprecated
from_dataconstructors - use
- Removed deprecated
- Removed re-exports of
graphics- from now on this functionality will be accessible via
0.2.20 - 2019-07-13
- All of the SDL2 code is now localized to a single
platformmodule. This is a first step towards decoupling the engine from any particular windowing library.
- The OpenGL backend is now implemented using glow.
- The public module structure of
graphicshas been simplified, so that only animation and GUI code is grouped into submodules, not 'primitive' types. The existing paths have been deprecated.
WHITEcolor constants are now associated with the type, not the module. The existing constants have been deprecated.
window::is_mouse_visiblenow actually returns a value (whoops).
0.2.19 - 2019-06-13
- Textures and canvases now provide a method for setting the texture filtering mode.
0.2.18 - 2019-05-18
tetrasexample now has sound effects and music.
- There are now constructors for
u8values. (@aaneto in #124)
- Tetra now requires Rust 1.32 or higher. While I personally consider this to be a breaking change and was going to save it for 0.3, a dependency has forced our hand by increasing their minimum Rust version in a patch release, breaking 1.31 support for all versions of Tetra :(
0.2.17 - 2019-05-05
- An example of how to interpolate between ticks using the
dthas been added.
- Basic support for gamepad vibration has been added.
- A showcase page has been added to the documentation.
- Fixed issue with the backbuffer not being bound on the first frame.
- Disconnecting a gamepad while a button is down no longer causes a panic.
0.2.16 - 2019-04-07
nalgebra-glmto 0.2.0 to avoid increasing the minimum Rust version.
0.2.15 - 2019-04-07
NineSlicenow expose more getters and setters, allowing more of their state to be accessed and manipulated after creation.
- The way that
nalgebra-glmis re-exported has been changed slightly, to make it so we can provide a bit more documentation. This should not have any impact on usage or the public facing API.
- The workaround for the issues with
rand_corehas been removed, as the underlying issue has been fixed. You may need to
cargo cleanif this causes issues.
0.2.14 - 2019-03-30
graphics::set_letterbox_colorallows you to set the color of the letterbox bars shown in certain scaling modes.
- Basic support for off-screen rendering/'render to texture' has been implemented, in the form of the
animation_controllerexample has been added, showing how to change animations based on the player's input. (@mgocobachi in #110)
from_file_dataconstructor has been added to
Font, for consistency with
- Alpha blending should now work in a more predictable way. This may need further tweaks later on.
- The renderer now flips drawing automatically when drawing to a framebuffer, due to how OpenGL stores textures. This is similar to how FNA and Love2D handle the same problem.
- The renderer no longer implicitly re-binds shaders after calling
Font::from_datahas been deprecated.
0.2.13 - 2019-03-05
from_rgbaconstructor has been added to
from_file_dataconstructors have been added to
Sound. These function the same as the
from_dataconstructors, but are more clearly named to reflect the fact that they expect encoded data, not raw data.
tetrasexample has been updated to demonstrate how you could approach adding multiple screens/states to a game.
from_dataconstructors have been deprecated.
0.2.12 - 2019-02-07
- The renderer has been optimized a bit more.
- The 'color' DrawParams property is now being sent to the shader properly - the last few versions had a bug where the blue level was being sent in place of the green channel.
0.2.11 - 2019-02-06
- The audio engine now handles repeats/restarts of a
SoundInstancemore reliably. This was mainly an issue with OGG and MP3 files.
0.2.10 - 2019-02-03
from_dataconstructors were added to
Sound, allowing them to be constructed from binary data. This is useful if you want to use
include_bytesto bundle assets into your executable. Note that an equivalent constructor already existed on
Shader, which can be used in combination with
- The default shaders have been amended to use GLSL 1.50 instead of GLSL 1.30. This seems to be required to get Tetra working on Mac.
0.2.9 - 2019-02-03
- Some optimizations have been made to the rendering code, mainly to avoid unnecessary allocations. This nearly doubled the performance of the
bunnymarkexample in release mode!
0.2.8 - 2019-02-01
time::get_fpsfunction was added, which returns the current FPS, averaged out over the last few seconds. (@selimeren in #96)
0.2.7 - 2019-01-23
- We now use the
HashSetinstead of the
fnvhasher. The hope was that this would give a performance boost, but it didn't seem to have any real observable impact :( That said, several of Tetra's dependencies use
hashbrown, so in the interests of keeping the dependency tree light, we're switching anyway.
- A race condition between Rodio and SDL has been fixed.
- While testing
hashbrownintegration, it was found that the benchmark numbers in the FAQ were slightly inaccurate - this has now been fixed.
0.2.6 - 2019-01-20
- Audio playback has been added, using Rodio as the backend!
- A port of the popular 'BunnyMark' benchmark has been added, which can be helpful for comparing relative performance of different versions/configurations of Tetra.
- The documentation has been updated to detail the
- The code that handles sprite transformations has been rewritten, and is now around 10 times faster than 0.2.5 in debug mode, and twice as fast as 0.2.5 in release mode.
DrawParamswas meant to be an internal utility, not a part of the public API. Tetra no longer uses it, so it has been deprecated, and will be removed in 0.3.
0.2.5 - 2019-01-06
- Custom shaders can now be used for rendering!
- The parameters contained within an instance of
DrawParamsare now publicly accessible - without these, it wasn't possible to write a proper custom implementation of
- Shaders now bind their outputs explicitly - this should help with compatability.
0.2.4 - 2019-01-04
- Fixed an issue where the OpenGL context would fail to initialize when using NVidia's proprietary Linux drivers.
0.2.3 - 2019-01-03
- Tetra now has support for gamepads! The API is roughly the same as that of keyboard and mouse, aside from having to specify which gamepad's state you're querying.
- Text is now drawn using the same shader as everything else - this likely won't be noticable now, but it will make things a lot easier once custom shaders get added!
- Some subtle issues around font cache invalidation have been fixed - in general we now let
glyph-brushhandle that side of things.
- Texture flipping was broken in 2.0 - this has now been fixed.
- The OpenGL context now explicitly requests a 32 bit color buffer and double buffering.
- Shaders now bind their texture sampler explicitly, which should avoid black screens on some drivers.
0.2.2 - 2018-12-24
- Tetra now has a website, with a tutorial on how to get started using it.
run_withis now less restrictive about what kinds of closure it will accept.
- We now always request an OpenGL 3.2 core profile context - this is required for us to support MacOS.
TETRA_OPENGL_FORCE_CORE_PROFILEenvironment variable has been removed, since we now always force a core profile.
0.2.1 - 2018-12-22
- Shader errors are now properly reported via
- The shader attribute order is now explicitly defined - this fixes an issue with black screens on some drivers.
0.2.0 - 2018-12-21
Texturenow has methods to get the width and height.
static-linkfeatures from the
sdl2crate can now be used through Tetra by enabling the
sdl2_static_linkfeatures. (@VictorKoenders in #33)
- New methods have been added to allow iterating over down/pressed/released keys on the keyboard. (@VictorKoenders in #35)
- Text input typed by the user can now be retrieved using the
input::get_text_inputfunction. (@VictorKoenders in #36)
Textnow has a method for efficiently calculating (and caching) the outer bounds of the text. (@VictorKoenders in #41)
- New methods have been added to
Animation, allowing it to be modified after it is initially created. (@VictorKoenders in #48)
- There are now numerous different
ScreenScalingtypes that can be chosen from.
- Extra options have been added to the
ContextBuilder, allowing you to start the window in various different states (e.g. fullscreen).
- There are now many new methods for manipulating the window/game loop in the
Stateare now both optional.
graphicsmodule now re-exports
- In addition to the normal
runmethod, there is now also a
run_withmethod that uses a closure to construct the
State. This is handy when method chaining - see the examples for how it can be used.
- Public types now implement
TetraErrornow implements the standard library
- The library has been upgraded to the 2018 edition of Rust.
ContextBuilder::newnow takes the title and size as parameters. The old behavior of the function can be replicated by using
runis now a method on
Context, instead of a free function.
tetra::Result, allowing errors to be returned (or propagated via the
?operator). Any errors returned from these methods will stop the game - your main method can then handle the error (e.g. log it out).
ContextBuilderhas been renamed to
window_scale, to better reflect its behavior.
Shader::from_fileis now called
Shader::newis now called
Shader::from_string. This is more consistent with the other constructors.
- Tick rates are now specified in ticks per second.
ContextBuilderno longer consumes itself when called - this is more flexible for e.g. calling methods inside a conditional.
quithas been moved to the
set_tick_ratehas been moved to the
- The functions for getting the game's internal width/height have been renamed to disambiguate them from the functions for getting the window width/height.
- Matching on
TetraErrorwill now force you to add a wildcard arm. This will prevent the addition of new error types from being a breaking change.
Result, as proper error handling will be added to to it eventually.
- The model matrix is now calculated once per
Drawable, instead of once per vertex. This should speed up rendering.
- The top left corner of a
NineSliceno longer gets distorted if the x and y of the
- The renderer now automatically flushes instead of panicking if it hits capacity.
- The renderer will now batch up to 2048 sprites, instead of 1024.
- The default shaders have been rewritten in an older/more compatible syntax, in order to fix some issues with black screens on Mesa drivers.
is_mouse_button_releasedfunctions now work correctly.
0.1.6 - 2018-12-09
Texttypes have been added, allowing you to render out text using a TTF font.
- Inspired by FNA, the
TETRA_OPENGL_FORCE_CORE_PROFILEenvironment variable can now be set to force the application to run using the 3.2 core profile. This might end up getting removed in favour of a more robust solution later on, but it's handy for testing (e.g. Renderdoc requires the core profile to be enabled).
- The internal framebuffer is now an RGB texture instead of an RGBA texture - this was causing some strange issues with blending.
0.1.5 - 2018-12-08
- The batcher was performing a flush after texture switches occured, not before.
0.1.4 - 2018-12-08
- Graphics can now be rotated using the
- The calculation of how many elements to render when flushing was broken, which could lead to geometry persisting between frames even when the associated graphic was no longer active.
0.1.3 - 2018-12-07
NineSlicetype has been added, allowing you to easily create dialog boxes from small textures.
- The window size can now be set explicitly. This will take precedence over the scale setting.
tetra::error::TetraErrorare now re-exported in the root of the crate. This allows you to write
tetra::Resultin your function signatures, which aligns a bit better with other custom
- An example of how to use the
Animationtype has been added.
0.1.2 - 2018-12-03
- Quick fix to the docs for the mouse button methods.
0.1.1 - 2018-12-03
- Functions for checking the state of the mouse buttons have been added.
- Scaling is now applied relative to the origin.
- Mouse positions now take into account letterboxing.
- Various fixes to the documentation and crate metadata.
0.1.0 - 2018-12-02
- Initial release!