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.
From 0.4.0 onwards, all breaking changes will be explicitly labelled, to make it easier to assess the impact of upgrading.
This project adheres to Semantic Versioning.
window::set_text_input_enabledandwindow::is_text_input_enabledwere added, allowing you to enable and disable text input events. They are currently on by default, but this may change in a future version. (@Tairesh in #356)
- Updated
sdl3to 0.18. - Updated
glowto 0.17. - Updated
hashbrownto 0.17.
0.9.1 - 2025-09-29
0.9.0 - 2025-09-20
- The
window::get_refresh_ratefunction was added, allowing you to check the current display's refresh rate. (@fililip in #345) - A new example was added, showing how to efficiently re-use a loaded font across multiple pieces of text. (@brettchalupa in #348)
- Breaking: Tetra now uses SDL3 instead of SDL2.
- This means that you will need to download the latest development libraries (and DLLs, on Windows) - see the installation docs for more details on how.
- Breaking: Mouse wheel movement is now represented as a
Vec2<f32>instead of aVec2<i32>. - Breaking:
window::get_monitor_countnow returns ausizeinstead of aResult<i32>. - Breaking: Monitor indices are now
usizerather thani32. - Breaking:
window::is_vsync_enablednow returns aResult<bool>instead of abool. - Breaking:
TetraError::FailedToChangeDisplayModeandTetraError::FailedToGetRefreshRatehave been removed.- These were effectively just variations on
TetraError::PlatformError, and it was a bit arbitary which were used where.
- These were effectively just variations on
- Breaking: The
serde_supportfeature was renamed toserde. - Breaking: The
sdl2_bundledfeature was renamed tosdl_build_from_source. - Breaking: The
sdl2_static_linkfeature was renamed tosdl_static_link. - Breaking: Updated
vekto 0.17. - Breaking: Updated
rodioto 0.20. - Breaking: Updated
imageto 0.25. - The docs for
Camerawere updated to use less confusing terminology. - Updated
glowto 0.16. - Updated
hashbrownto 0.16.
0.8.0 - 2023-03-17
Animationnow hasis_finishedandhas_frames_remainingutility methods. (@vrmiguel in #315)ContextBuildernow has afps_limitoption, which allows users to disable the built-in FPS capping behaviour. (@fililip in #321)ScreenScalernow hasscale_factorand sizing utility methods. (@timerertim in #327)ScreenScalernow has afrom_canvasconstructor. This can be used for greater control over the canvas that is used for scaling.
- Breaking: Updated
rodioto 0.17. - Breaking: Updated
lyon_tessellationto 1.0. - Updated
halfto 2.1. - Updated
hashbrownto 0.13. - Updated
glowto 0.12. - Various types now implement
Eqas well asPartialEq.
0.7.0 - 2022-03-23
Texture,CanvasandImageDatacan now be created with different underlying data formats.- Vector fonts can now be generated with premultiplied alpha.
Color::clampcan be used to clamp a color's components between 0 and 1.
- Breaking: This crate now uses Rust 2021, and therefore requires at least Rust 1.56.
- Breaking: Most enums in the API are now marked as
non_exhaustive, and so must have a wildcard arm when matching on them.- This is to make it so adding a new enum variant is not a breaking change in the future.
- Breaking: The naming scheme for various constructors has been changed to be more consistent/simple:
newusually involves loading from a file path (as this is the most common use-case).from_dataloads from raw data, without any specific file-type encoding (e.g. RGBA8 pixels).from_encodedloads from encoded data in a supported file format (e.g. PNG).- This applies to
Texture,ImageData,SoundandBmFontBuilder.
- Breaking:
BlendModeandBlendAlphaModehave been replaced withBlendState,BlendFactorandBlendOperation, which give you much lower-level control of how colors are blended.- As such,
graphics::set_blend_modeandgraphics::reset_blend_modehave been renamed tographics::set_blend_stateandgraphics::reset_blend_staterespectively. - The old presets for blending behaviour are still available as
constconstructors onBlendState, so you should be able to migrate without any changes in behaviour.
- As such,
- Breaking: Updated
vekto 0.15. - Breaking: Updated
rodioto 0.15. - Updated
hashbrownto 0.12. Coloroperations are no longer saturating.- This is so that HDR colors can be represented without data loss.
KeyModifier's behaviour has been reverted to be layout-based rather than position-based.- This better matches the expected behaviour for keyboard shortcuts (which is the primary use case for this type), and the behaviour of the underlying platform code.
- The transparent padding between font glyphs is now incorporated into the rendered quads. This prevents texture filtering/anti-aliasing from cutting off unnaturally at the edges.
- Breaking:
Canvas::multisampledhas been removed - useCanvas::builderinstead. - Breaking:
Texture::from_rgbahas been removed - useTexture::from_datainstead. - Breaking:
ImageData::from_rgbahas been removed - useImageData::from_datainstead. - Breaking:
BmFontBuilder::with_page_rgbahas been removed - useBmFontBuilder::with_page_datainstead. Keys that don't represent a physical position on the keyboard have been removed - you should either switch to theKeyfor the position you want, or switch toKeyLabelif you still want to use the system keyboard layout.
Shader::from_vertex_stringandShader::from_fragment_stringno longer have an unused type parameter. (@LiquidityC in #301)
0.6.7 - 2021-11-05
- The backend for gamepad vibration has been rewritten, and now supports a wider range of controllers (including DualShock 4).
time::get_fpsno longer pre-fills the buffer it uses for averaging the FPS at startup.- Previously, the whole buffer would be initialized to 60fps, with the intent being that the initial output would be less jittery. However, this didn't actually help that much, and it didn't work well if the monitor wasn't vsync-ed to 60hz.
- Updated
sdl2to 0.35.
- Tetra no longer fails to compile when built in a project with
edition = "2021"orresolver = "2"in the Cargo.toml. - The
Displayimplementation forTetraErrornow includes extra details for errors that don't have asource. - Games will no longer fail to start on platforms that do not support setting vsync on or off.
0.6.6 - 2021-10-10
window::set_iconhas been added, allowing for the window's icon to be changed at runtime.- In general, it's preferable to set the icons via your application's packaging - this function should only be used if the icon needs to change at runtime, or if you're feeling lazy and don't feel like setting up proper packaging.
- Various utility functions have been added to the
windowmodule, allowing for control over window positioning and size. (@Tairesh in #278) - An example of using ECS libraries with Tetra has been added. (@rghartmann in #268)
- A
KeyLabeltype has been added, which represents how keys are labelled in the current keyboard layout. input::get_key_with_labelandinput::get_key_labelhave been added, so that keys can be mapped to and from the current system keyboard layout.
Keynow represents the physical position of a key, rather than how it is labelled. This allows for non-QWERTY keyboard layouts to be supported without extra work on the developer's part.KeyModifiernow implementsDisplay.- The
ContextBuilder::key_repeatsetting now applies to the input polling APIs as well as events. (@Tairesh in #279)- This is in order to make the API more consistent - now, whenever there is an
Event::KeyPressed, it is guarenteed to also be returned viais_key_pressedandget_keys_pressed. - The behaviour with
key_repeatturned off is unchanged.
- This is in order to make the API more consistent - now, whenever there is an
- Updated
glowto 0.11.
- Fixed an issue where the blend mode was getting set on the GPU even when it hadn't changed.
0.6.5 - 2021-05-26
- Uniform arrays are now supported in shaders, and can be set by passing an array or a slice to
set_uniform. - Basic support for instanced mesh rendering has been added, via
Mesh::draw_instanced.
- Switching away from a non-multisampled canvas no longer resolves the canvas.
- This was a regression due to a refactor in 0.6.3 - it should not have caused any change to the rendered image, but may have negatively impacted performance.
0.6.4 - 2021-05-14
- Stencil buffers can now be used, both with the main framebuffer and with
Canvasrendering. (@tesselode in #261)- Stencil buffers will only be created if they are requested via
ContextBuilder::stencil_bufferorCanvasBuilder::stencil_buffer.
- Stencil buffers will only be created if they are requested via
window::get_physical_sizehas been added, making it possible to find out the size of the window in unscaled, physical pixels.window::get_dpi_scalehas been added, allowing the window/monitor's pixel density to be queried. (@sumibi-yakitori in #249)TextureandCanvasnow have aget_datamethod, allowing their texture data to be copied from the GPU into anImageData.ImageDatanow hasas_bytesandinto_bytesmethod, which allows you to access the underlying buffer.
- Canvases are now initialized to transparent black, rather than containing unspecified data on creation.
- Multisampled canvases will now automatically lower their level of multisampling (or disable it altogether) if the hardware does not support the requested number of samples.
- This should allow games with multisampling to gracefully degrade on older/weaker GPUs.
ImageData::from_rgbahas been replaced withImageData::from_rgba8, andBmFontBuilder::with_page_rgbahas been replaced withBmFontBuilder::with_page_rgba8.- This is for consistency with existing methods (e.g. on
Color). - The old names have been deprecated, and will be removed in 0.7.
- This is for consistency with existing methods (e.g. on
- Updated
glowto 0.9.
Texture::filter_modeandCanvas::filter_modenow return the correct initial value. Previously, they would always returnFilterMode::Linearuntilset_filter_modewas called.- DPI scaling should now continue to work after calling
graphics::reset_canvas. graphics::set_scissoris now properly aware of DPI scaling.- When a texture, canvas or buffer fails to be created by the GPU (e.g. due to being out of memory or going over the max size), an error will now be returned, instead of unspecified behaviour occurring.
ImageData::from_rgbaandBmFontBuilder::with_page_rgbahas been deprecated in favour of more consistently named functions (see above).Canvas::multisampledhas been deprecated in favour ofCanvas::builder.
0.6.3 - 2021-04-09
- BMFont-formatted fonts are now supported, via
Font::bmfontandBmFontBuilder. - Various
stdoperator traits have been implemented for the combination ofColorandf32, allowing for all four components to be operated on at once.- This can be especially useful when working with premultiplied alpha - to set the opacity of a opaque color, you can now just multiply it by an
f32.
- This can be especially useful when working with premultiplied alpha - to set the opacity of a opaque color, you can now just multiply it by an
Colornow has ato_premultipliedmethod, which can be used to convert a color into its premultiplied version.Colorcan now be converted to and from[f32; 4]and[u8; 4]viaFromandInto.- The
ImageDatastruct can be used to load and manipulate image data on the CPU, without the need for aContext.- This can be useful for asset loading/pre-processing.
- To avoid future breaking changes if/when Tetra gains support for multiple pixel formats, the API doesn't currently give access to the underlying raw pixel data. It instead operates purely on
Colors, automatically converting to and from as needed.
ColorandVertexnow implementDefault, with the default values being all zeroes (for consistency with the vector types, and to make them more useful for zeroing out buffers).
- Improved docs for the
UniformValuetrait.
0.6.2 - 2021-03-15
VertexBuffer::set_datawas mistakenly measuring its offset in individual floats, rather than vertices. This was inconsistent withIndexBuffer, and could potentially lead to corrupted data.- I do not believe this was a memory safety issue, as all writes were still valid and aligned - they were just in the wrong place!
0.6.1 - 2021-03-15
- Blend modes can now be set when rendering (including variants for pre-multiplied alpha). (@tesselode in #244)
- Scissor rectangles can now be set when rendering, via
graphics::set_scissorandgraphics::reset_scissor. Rectangle::combinehas been added, which can be used to get a rectangle that contains two other rectangles.- Fonts can now have their filter mode set, instead of always using nearest neighbor filtering. (@tesselode in #246)
- Fonts now also respect the default filter mode when they are created.
- Text now supports word-wrapping, via the
Text::wrappedconstructor or theText::set_max_widthmethod. - More events have been added for window state changes, such as minimizing and maximizing. (@sumibi-yakitori in #248
window::set_visibleandwindow::is_visiblecan be used to get and set whether or not the window is currently hidden to the user.
- Updated
hashbrownto 0.11. - Updated
glowto 0.8.
Text::get_boundsno longer returns incorrect results when a tall glyph is added after a short glyph. (@tesselode in #241)- Kerning is now taken into account when rasterizing characters, rather than just for positioning.
0.6.0 - 2021-02-05
- All drawable objects now have an inherant
drawmethod, instead of relying onDrawable/graphics::draw. Texture::draw_regioncan be used to draw a sub-section of a texture.Texture::draw_nine_slicecan be used to draw UI panels.DrawParams::to_matrixhas been added, which can be used to create a transformation matrix matching the behaviour ofDrawParams.Fontnow has afrom_vector_file_dataconstructor, which is a shortcut forVectorFontBuilder::from_file_data(data)?.with_size(ctx, size). (@fossegutten in #232)Meshnow has methods for getting and setting the winding order, which will automatically be applied when drawing it.Meshnow has methods for getting, enabling and disabling backface culling.- A new
Canvas::multisampledconstructor has been added, allowing for off-screen rendering with MSAA. - More example links have been added to the docs, where appropriate.
- Breaking: Mesh and shape rendering types have been moved to
graphics::mesh, to avoid cluttering the maingraphicsmodule. - Breaking: The
zoomfield onCamerahas been renamed toscale, and is now aVec2<f32>.- Note that numeric operations are implemented on
Vec2<f32>forf32, so you can still add/subtract/multiply/divide both components at the same time.
- Note that numeric operations are implemented on
- Breaking:
Text::drawandText::get_boundsnow take&mut self.- This better reflects the fact that they cache geometry under the hood, and avoids
RefCelloverhead.
- This better reflects the fact that they cache geometry under the hood, and avoids
- Breaking:
NineSliceis now a config object forTexture::draw_nine_slice, rather than a wrapper for a texture. - Breaking:
Fontare now sized and positioned more accurately, and should look the same in Tetra as in other programs. (@fossegutten in #229)- This is not an API breaking change, but will alter the behaviour of existing games.
- Breaking: FLAC audio support has been disabled by default - use the
audio_flacfeature to re-enable it. - Breaking: Updated
vekto 0.13.- As Vek is exposed via Tetra's API in the form of the
tetra::mathmodule, this is potentially a breaking change.
- As Vek is exposed via Tetra's API in the form of the
time::get_delta_timenow returns a fixed value when called fromupdatein fixed timestep mode.- Using delta time in fixed timestep mode is not required, but can be useful if you want to measure things in 'per second' terms rather than 'per frame'.
- Previously, trying to use delta time in this way could introduce floating point error/non-determinism into your game logic, and would break in the case of a double update.
- The audio files for the
tetrasexample are no longer ridiculously big.
- Breaking:
graphics::drawand theDrawabletrait has been removed.- Use the
drawmethod on individual types instead. - See #94 (comment) for the rationale behind this change.
- Use the
- Breaking:
DrawParams::cliphas been removed.Texture::draw_regioncan be used instead.
- Breaking:
graphics::get_front_face_windingandgraphics::set_front_face_windinghave been removed.Mesh::front_face_windingandMesh::set_front_face_windingcan be used instead.
- Breaking:
graphics::uihas been removed.NineSliceis now located ingraphics.
0.5.8 - 2021-01-26
- Basic support for multisample anti-aliasing has been added, in the form of
ContextBuilder::multisampling.- This is currently only supported for the main backbuffer.
Meshnow has constructors for various primitive shapes. (@tesselode in #226)- There is also a new
GeometryBuildertype, which can be used to create more complex/combined shapes.
- There is also a new
Colornow has methods (with_red,with_blue,with_green,with_alpha) for creating a newColorwith one component changed. (@tesselode in #227)
- When running in
Timestep::Fixedmode, the accumulator now has a cap of 150 milliseconds (around 6.5fps). This prevents the game from entering a 'spiral of doom' if updates are consistently running too slowly for the game loop to catch up - in this scenario, the game will now just slow down. This is still not a good experience for the player, but it prevents freezes/crashes. - Updated
bytemuckto 1.5.
- Font atlases now include the correct amount of padding after a resize.
0.5.7 - 2021-01-15
- Key repeat events can now be enabled, via
ContextBuilder::key_repeatorwindow::set_key_repeat_enabled. (@sumibi-yakitori in #220
- Reading and writing the volume or speed of a
SoundInstanceis now lock-free, reducing the chances of blocking the audio thread.- This also applies to
audio::get_master_volumeandaudio::set_master_volume.
- This also applies to
Rectangleis now generic, allowing types other thanf32to be used for the components.- The type parameter defaults to
f32, so this should not be a breaking change.
- The type parameter defaults to
Rectanglenow implementsEq,DefaultandHash, if the component type also implements the corresponding trait.- The docs for creating a high-DPI
Contexthave been improved. - Updated
glowto 0.7.
SoundInstanceno longer missed updates if you drop it before they're processed by the audio thread.
0.5.6 - 2020-12-20
graphics::get_front_face_windingandgraphics::set_front_face_windinghave been added, allowing the winding order of geometry to be changed.- This is useful if you are working with a library that only outputs clockwise-ordered data (e.g. ImGUI).
ContextBuilder::screen_saver_enabled,window::set_screen_saver_enabledandwindow::is_screen_saver_enabledhave been added, allowing you to control whether the user's screensaver can activate while playing your game. (@sumibi-yakitori in #216)
- Backface culling has been re-enabled, as the winding order of geometry can now be overridden.
- The game loop now calls
std::thread::sleepinstead ofstd::thread::yield_nowat the end of each iteration.- This provides some basic frame-limiting when running without vsync, and prevents CPU usage skyrocketing on some systems.
0.5.5 - 2020-12-03
Meshnow supportsDrawParams::color.- This is implemented via a new shader uniform called
u_diffuse. If you are using custom shaders, you will need to add this parameter in order forMeshtinting to work.
- This is implemented via a new shader uniform called
0.5.4 - 2020-11-27
- Added initial support for custom 2D meshes.
- Added experimental support for high-DPI rendering, on platforms that support it. (@sumibi-yakitori in #212)
- Backface culling has been disabled by default, to better support integration with other libraries that output clockwise vertex data (e.g. imGUI).
- This will be brought back as an opt-in setting soon.
- Lots of cross-links between docs pages have been added, using intra-doc links.
0.5.3 - 2020-11-21
- Fixed an issue where vector fonts would not create new cached glyphs for certain subpixel positionings.
0.5.2 - 2020-11-01
- You can now use
u32,ColorandTexturevalues as shader uniforms. From<Color>is now implemented forVec4<f32>.From<Vec4<f32>>is now implemented forColor.
TetraError'sDisplayimplementation no longer duplicates the source error'sDisplaytext.- The
Statetrait now has an optional type parameter for the error type. This allows you to use your own custom error types, or third-party error handling crates likeanyhow,thiserrorandeyre.
0.5.1 - 2020-10-13
- Color now implements
Add,AddAssign,Sub,SubAssign,Mul,MulAssign,DivandDivAssign.- For convenience's sake, these are currently implemented as saturating operations, preventing values from going outside the valid range for a color.
- In future versions, this clamping behaviour might be applied to the type as a whole, but this would require breaking changes.
TextureandCanvasnow have methods for writing pixel data at runtime:set_datawrites to a specified region of the texture.replace_datais a shortcut method for replacing the entire texture's data at once.
- Updated
hashbrownto 0.8. - Updated
glowto 0.6.
0.5.0 - 2020-09-02
SoundInstance::stateandSoundInstance::set_statehave been added, which allow you to check the current state of playback and modify it respectively. (@puppetmaster- in #205)- These methods use a new enum called
SoundState, which represents the possible states that aSoundInstancecan be in.
- These methods use a new enum called
- Breaking: The position of the mouse relative to the previous motion event can now be obtained via the
deltafield onEvent::MouseMoved. (@GGalizzi in #206)- As existing code may have been exhastively pattern matching on
Event::MouseMoved's data, this is technically a breaking change.
- As existing code may have been exhastively pattern matching on
- The window can now be set to
relative_mouse_mode, which allows the mouse to move outside of the bounds of the window while still reporting motion events. (@GGalizzi in #206) - Various feature flags have been added, allowing you to shrink your dependency tree by removing unused functionality.
- Breaking: ICO, TIFF, PNM, DDS/DXT and TGA texture loading is now off by default.
- Feature flags can be used to re-enable them.
- Breaking:
graphics::set_textureis now private.- There was no meaningful way to use this function without access to other private functions, so it has been hidden to avoid confusion.
- Updated
bytemuckto 1.4. - Breaking: Updated
vekto 0.12.- As Vek is exposed via Tetra's API in the form of the
tetra::mathmodule, this is potentially a breaking change.
- As Vek is exposed via Tetra's API in the form of the
0.4.2 - 2020-08-14
- A
visible_rectmethod has been added toCamera, which calculates the area of the screen that is currently visible. (@VictorKoenders in #201)
- Various improvements have been made to the documentation.
Camera::projectandCamera::unprojectno longer requireCamera::updateto be called to give correct results.- This is for consistency with the new
visible_rectmethod.
- This is for consistency with the new
- Textures now use
CLAMP_TO_EDGEwrapping, to avoid some sampling issues when drawing at non-integer co-ordinates.- In the future, it may be made possible to select other wrapping modes.
- Updated
bytemuckto 1.3.
- The matrix created by a
Cameranow correctly reflects the viewport width and height before the firstupdate.
0.4.1 - 2020-08-02
ContextBuildercan now be serialized and deserialized via Serde, if theserde_supportfeature is enabled. (@puppetmaster- in #195)- Note that the available settings could change between releases of Tetra (semver permitting). If you need a config file schema that will be stable in the long term, consider making your own and then mapping it to Tetra's API, rather than relying on
ContextBuilderto not change.
- Note that the available settings could change between releases of Tetra (semver permitting). If you need a config file schema that will be stable in the long term, consider making your own and then mapping it to Tetra's API, rather than relying on
- The
TetraErrorandEventenums are now marked asnon_exhaustive.- This is not a breaking change, as exaustive matching was already enforced via a hidden enum variant. This change just makes the code/docs/errors clearer, as well as potentially unlocking some compiler optimizations in the future.
- Updated
glowto 0.5.
0.4.0 - 2020-06-24
- The mouse can now be grabbed by the window. (@tatref in #184)
- This is exposed via the
grab_mousemethod onContextBuilder, and theis_mouse_grabbed/set_mouse_grabbedfunctions in thewindowmodule.
- This is exposed via the
- Breaking: The text rendering API has been rewritten from scratch.
- It now uses
ab_glyphinstead ofrusttype, which allows us to support OTF fonts, and should be faster in general. - This also fixes several long-standing bugs with text rendering (#125, #161, #180).
- The new API has been written with the requirements of bitmap fonts in mind, and a loader for these will likely be added in a future version.
- As this API may expand in the future, it has been moved into the
tetra::graphics::textsubmodule to avoid cluttering the maingraphicsmodule.
- It now uses
- Improved the documentation for various types' performance characteristics.
- Breaking: Updated
vekto 0.11.- As Vek is exposed via Tetra's API in the form of the
tetra::mathmodule, this is potentially a breaking change.
- As Vek is exposed via Tetra's API in the form of the
- Updated
hashbrownto 0.8.
- Breaking:
Fontno longer implementsDefault, and the Deja Vu Sans Mono font is no longer bundled with Tetra (#174).- It was previously a little murky whether or not the default font's license needed to be included even when you're not using it, due to the bytes being included in the binary.
- Fixed an issue where gamepad axis ranges were not being correctly mapped from integers to floats.
0.3.6 - 2020-05-15
- A new suite of functions has been added to the
windowmodule, allowing you to query info about the monitors that are connected to the current device.
- The window is now hidden when the game loop is not running. This avoids issues where the window would be displayed before the game has a chance to fully load assets, or to determine ideal rendering sizes.
- Fixed an issue where OpenGL objects would not be properly unbound when they were dropped.
- Fixed an issue where the OpenGL buffer attributes were not being set correctly.
0.3.5 - 2020-04-25
- File drag and drop events can now be detected via
Event::FileDropped. - The clipboard can now be manipulated via
input::get_clipboard_textandinput::set_clipboard_text. input::get_key_modifier_downandinput::get_key_modifier_uphave been added, allowing for code handling the control, alt and shift keys to be made more compact.- An
Animationcan now be set to stop playing after all the frames have been displayed, instead of looping. This can either be controlled by theset_repeatingmethod, or you can create a non-looping animation directly by callingAnimation::once. hexandtry_hexconstructors have been added toColor.
- Updated
sdl2to 0.34.
0.3.4 - 2020-04-12
Animationnow exposes methods for getting and setting the current frame index, and the amount of time that the current frame has been displayed for. This can be useful when implementing more complex animation behaviors. (@VictorKoenders in #169)- Some utility methods have been added to
Rectanglefor getting the co-ordinates of the sides, center and corners. - A
content_mutgetter has been added toText, allowing the content to be mutated using the standardStringAPI (e.g.push_str,clear, etc.).
0.3.3 - 2020-04-04
- The mouse wheel state can now be queried. (@VictorKoenders in #164)
- The internal representation of
Textureobjects has been changed to improve performance. - Updated
sdl2to 0.33. - Updated
hashbrownto 0.7. - Updated
imageto 0.23. - Updated
rodioto 0.11.
0.3.2 - 2020-01-15
Rectangle::intersects,Rectangle::containsandRectangle::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. - Updated
glowto 0.4.
0.3.1 - 2019-12-15
- Fixed an issue with variable timesteps causing an infinite loop.
0.3.0 - 2019-12-14
- The
Statetrait now provides aneventmethod 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). - A
Contextcan now be configured to have a variable update rate, if that suits your game/architecture better. This is exposed via thetime_stepmethod onContextBuilder. - 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
window. - Details of the active graphics device can now be retrieved by calling
graphics::get_device_info. Shader::from_vertex_stringandShader::from_fragment_stringconstructors have been added.Color::RED,Color::GREENandColor::BLUEconstants have been added.graphics::get_transform_matrix,graphics::set_transform_matrixandgraphics::reset_transform_matrixhas been added, which allows you to apply a transformation to your rendering.- The
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:graphics::Colorgraphics::Rectangleinput::Keyinput::MouseButtoninput::GamepadButtoninput::GamepadAxisinput::GamepadStick- Various
mathtypes, as defined by theVekcrate.
- 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 newtime::get_blend_factorfunction.KeyandMouseButtonare 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::SdlandTetraError::OpenGlhave been merged intoTetraError::PlatformError, since they both represent the scenario where something's gone seriously wrong with the underlying platform.DEFAULT_VERTEX_SHADERandDEFAULT_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.- The
glmmodule has been renamed tomath, and thenalgebra-glmdependency has been replaced withvek. Vec2is now exported frommath, notgraphics.- More types can now be passed into shader uniforms via the
UniformValuetrait. - The graphics device debugging info is now hidden by default. Set the
debug_infooption onGametotrueto bring this back. - The functions for setting the fullscreen/cursor visibility state have been changed to take booleans, instead of there being multiple functions.
- The
Shader::vertexandShader::fragmentconstructors have been renamed toShader::from_vertex_fileandShader::from_fragment_file. - Animations now use a
Durationto specify the frame length, and as such, they are no longer coupled to your game's tick rate. Calladvancefrom yourdrawmethod to advance the animation's timer. - Updated
glowto 0.3.0-alpha3. - Updated
hashbrownto 0.6. - Updated
imageto 0.22. - Updated
glyph_brushto 0.6. - Updated
rodioto 0.10.
time::duration_to_f64andtime::f64_to_durationhave been removed, as the standard library now provides this functionality (Duration::from_secs_f64andDuration::as_secs_f64respectively).ContextBuilder::tick_ratehas been removed, asContextBuilder::time_stepnow fulfils the same purpose.- Removed deprecated sub-modules from
graphics. - Removed deprecated
color::BLACKandcolor::WHITEconstants - useColor::BLACKandColor::WHITEinstead. - Removed deprecated
from_dataconstructors - usefrom_file_datainstead. - Removed deprecated
DrawParams::build_matrixmethod. - Removed re-exports of
AnimationandNineSlicefromgraphics- from now on this functionality will be accessible viagraphics::animationandgraphics::uirespectively.
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. - The
BLACKandWHITEcolor constants are now associated with the type, not the module. The existing constants have been deprecated. Color::rgb,Color::rgbaandRectangle::neware nowconst fn.- Updated
glyph-brushto 0.5.3.
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.
- Updated
imageto 0.21.2. - Updated
hashbrownto 0.5.0. - Updated
rodioto 0.9.0.
0.2.18 - 2019-05-18
- The
tetrasexample now has sound effects and music. - There are now constructors for
Colorthat takeu8values. (@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 :(
- Updated
nalgebra-glmto 0.4.0.
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.
- Updated
glto 0.12.0. - Updated
imageto 0.21.1. - Updated
hashbrownto 0.3.0. - Updated
glyph-brushto 0.5.0.
- 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
- Reverted
nalgebra-glmto 0.2.0 to avoid increasing the minimum Rust version.
0.2.15 - 2019-04-07
Animation,TextandNineSlicenow 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. - Updated
sdl2to 0.32.2. - Updated
nalgebra-glmto 0.4.0. - Updated
hashbrownto 0.2.0. - Updated
glyph_brushto 0.4.1.
- The workaround for the issues with
rand_corehas been removed, as the underlying issue has been fixed. You may need tocargo 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
Canvasobject. - An
animation_controllerexample has been added, showing how to change animations based on the player's input. (@mgocobachi in #110) - A
from_file_dataconstructor has been added toFont, for consistency withTextureandSound.
- 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
graphics::present.
Font::from_datahas been deprecated.
0.2.13 - 2019-03-05
- A
from_rgbaconstructor has been added toTexture. from_file_dataconstructors have been added toTextureandSound. These function the same as thefrom_dataconstructors, but are more clearly named to reflect the fact that they expect encoded data, not raw data.
- The
tetrasexample has been updated to demonstrate how you could approach adding multiple screens/states to a game.
- The
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 toTexture,FontandSound, allowing them to be constructed from binary data. This is useful if you want to useinclude_bytesto bundle assets into your executable. Note that an equivalent constructor already existed onShader, which can be used in combination withinclude_str.
- 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
- The
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
hashbrownimplementation ofHashMap/HashSetinstead of thefnvhasher. 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 usehashbrown, 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
sdl2_bundledandsdl2_static_linkfeatures.
- 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.
- The
build_matrixmethod onDrawParamswas 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 ofDrawable. - 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.
- The
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
TetraError::OpenGl.
- 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.- The
bundledandstatic-linkfeatures from thesdl2crate can now be used through Tetra by enabling thesdl2_bundledandsdl2_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
windowmodule. - The
updateanddrawmethods onStateare now both optional. - The
graphicsmodule now re-exportsVec2. - In addition to the normal
runmethod, there is now also arun_withmethod that uses a closure to construct theState. This is handy when method chaining - see the examples for how it can be used. - Public types now implement
DebugandClonewhere appropriate. TetraErrornow implements the standard libraryErrortrait.
- 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 usingContextBuilder::defaultinstead.runis now a method onContext, instead of a free function.- The
updateanddrawmethods onStatenow returntetra::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). - The
scaleoption onContextBuilderhas been renamed towindow_scale, to better reflect its behavior. Shader::from_fileis now calledShader::new, andShader::newis now calledShader::from_string. This is more consistent with the other constructors.- Tick rates are now specified in ticks per second.
- The
ContextBuilderno longer consumes itself when called - this is more flexible for e.g. calling methods inside a conditional. quithas been moved to thewindowmodule.set_tick_ratehas been moved to thetimemodule.- 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. Shader::from_stringnow returnsResult, 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 thefill_rectaren't equal. - 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.
- The
is_mouse_button_pressedandis_mouse_button_releasedfunctions now work correctly.
0.1.6 - 2018-12-09
- The
FontandTexttypes 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
rotationmethod onDrawParams.
- 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
- The
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::Resultandtetra::error::TetraErrorare now re-exported in the root of the crate. This allows you to writetetra::Resultin your function signatures, which aligns a bit better with other customResulttypes likeio::Result.- 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!