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.
- The
window::get_refresh_rate
function 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: The
serde_support
feature was renamed toserde
. - Breaking: Updated
vek
to 0.17. - Breaking: Updated
rodio
to 0.20. - Breaking: Updated
image
to 0.25. - Updated
sdl2
to 0.37. - Updated
glow
to 0.16. - Updated
hashbrown
to 0.15.
0.8.0 - 2023-03-17
Animation
now hasis_finished
andhas_frames_remaining
utility methods. (@vrmiguel in #315)ContextBuilder
now has afps_limit
option, which allows users to disable the built-in FPS capping behaviour. (@fililip in #321)ScreenScaler
now hasscale_factor
and sizing utility methods. (@timerertim in #327)ScreenScaler
now has afrom_canvas
constructor. This can be used for greater control over the canvas that is used for scaling.
- Breaking: Updated
rodio
to 0.17. - Breaking: Updated
lyon_tessellation
to 1.0. - Updated
half
to 2.1. - Updated
hashbrown
to 0.13. - Updated
glow
to 0.12. - Various types now implement
Eq
as well asPartialEq
.
0.7.0 - 2022-03-23
Texture
,Canvas
andImageData
can now be created with different underlying data formats.- Vector fonts can now be generated with premultiplied alpha.
Color::clamp
can 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:
new
usually involves loading from a file path (as this is the most common use-case).from_data
loads from raw data, without any specific file-type encoding (e.g. RGBA8 pixels).from_encoded
loads from encoded data in a supported file format (e.g. PNG).- This applies to
Texture
,ImageData
,Sound
andBmFontBuilder
.
- Breaking:
BlendMode
andBlendAlphaMode
have been replaced withBlendState
,BlendFactor
andBlendOperation
, which give you much lower-level control of how colors are blended.- As such,
graphics::set_blend_mode
andgraphics::reset_blend_mode
have been renamed tographics::set_blend_state
andgraphics::reset_blend_state
respectively. - The old presets for blending behaviour are still available as
const
constructors onBlendState
, so you should be able to migrate without any changes in behaviour.
- As such,
- Breaking: Updated
vek
to 0.15. - Breaking: Updated
rodio
to 0.15. - Updated
hashbrown
to 0.12. Color
operations 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::multisampled
has been removed - useCanvas::builder
instead. - Breaking:
Texture::from_rgba
has been removed - useTexture::from_data
instead. - Breaking:
ImageData::from_rgba
has been removed - useImageData::from_data
instead. - Breaking:
BmFontBuilder::with_page_rgba
has been removed - useBmFontBuilder::with_page_data
instead. Key
s that don't represent a physical position on the keyboard have been removed - you should either switch to theKey
for the position you want, or switch toKeyLabel
if you still want to use the system keyboard layout.
Shader::from_vertex_string
andShader::from_fragment_string
no 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_fps
no 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
sdl2
to 0.35.
- Tetra no longer fails to compile when built in a project with
edition = "2021"
orresolver = "2"
in the Cargo.toml. - The
Display
implementation forTetraError
now 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_icon
has 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
window
module, 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
KeyLabel
type has been added, which represents how keys are labelled in the current keyboard layout. input::get_key_with_label
andinput::get_key_label
have been added, so that keys can be mapped to and from the current system keyboard layout.
Key
now 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.KeyModifier
now implementsDisplay
.- The
ContextBuilder::key_repeat
setting 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_pressed
andget_keys_pressed
. - The behaviour with
key_repeat
turned off is unchanged.
- This is in order to make the API more consistent - now, whenever there is an
- Updated
glow
to 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
Canvas
rendering. (@tesselode in #261)- Stencil buffers will only be created if they are requested via
ContextBuilder::stencil_buffer
orCanvasBuilder::stencil_buffer
.
- Stencil buffers will only be created if they are requested via
window::get_physical_size
has been added, making it possible to find out the size of the window in unscaled, physical pixels.window::get_dpi_scale
has been added, allowing the window/monitor's pixel density to be queried. (@sumibi-yakitori in #249)Texture
andCanvas
now have aget_data
method, allowing their texture data to be copied from the GPU into anImageData
.ImageData
now hasas_bytes
andinto_bytes
method, 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_rgba
has been replaced withImageData::from_rgba8
, andBmFontBuilder::with_page_rgba
has 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
glow
to 0.9.
Texture::filter_mode
andCanvas::filter_mode
now return the correct initial value. Previously, they would always returnFilterMode::Linear
untilset_filter_mode
was called.- DPI scaling should now continue to work after calling
graphics::reset_canvas
. graphics::set_scissor
is 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_rgba
andBmFontBuilder::with_page_rgba
has been deprecated in favour of more consistently named functions (see above).Canvas::multisampled
has been deprecated in favour ofCanvas::builder
.
0.6.3 - 2021-04-09
- BMFont-formatted fonts are now supported, via
Font::bmfont
andBmFontBuilder
. - Various
std
operator traits have been implemented for the combination ofColor
andf32
, 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
Color
now has ato_premultiplied
method, which can be used to convert a color into its premultiplied version.Color
can now be converted to and from[f32; 4]
and[u8; 4]
viaFrom
andInto
.- The
ImageData
struct 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
Color
s, automatically converting to and from as needed.
Color
andVertex
now 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
UniformValue
trait.
0.6.2 - 2021-03-15
VertexBuffer::set_data
was 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_scissor
andgraphics::reset_scissor
. Rectangle::combine
has 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::wrapped
constructor or theText::set_max_width
method. - More events have been added for window state changes, such as minimizing and maximizing. (@sumibi-yakitori in #248
window::set_visible
andwindow::is_visible
can be used to get and set whether or not the window is currently hidden to the user.
- Updated
hashbrown
to 0.11. - Updated
glow
to 0.8.
Text::get_bounds
no 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
draw
method, instead of relying onDrawable
/graphics::draw
. Texture::draw_region
can be used to draw a sub-section of a texture.Texture::draw_nine_slice
can be used to draw UI panels.DrawParams::to_matrix
has been added, which can be used to create a transformation matrix matching the behaviour ofDrawParams
.Font
now has afrom_vector_file_data
constructor, which is a shortcut forVectorFontBuilder::from_file_data(data)?.with_size(ctx, size)
. (@fossegutten in #232)Mesh
now has methods for getting and setting the winding order, which will automatically be applied when drawing it.Mesh
now has methods for getting, enabling and disabling backface culling.- A new
Canvas::multisampled
constructor 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 maingraphics
module. - Breaking: The
zoom
field onCamera
has 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::draw
andText::get_bounds
now take&mut self
.- This better reflects the fact that they cache geometry under the hood, and avoids
RefCell
overhead.
- This better reflects the fact that they cache geometry under the hood, and avoids
- Breaking:
NineSlice
is now a config object forTexture::draw_nine_slice
, rather than a wrapper for a texture. - Breaking:
Font
are 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_flac
feature to re-enable it. - Breaking: Updated
vek
to 0.13.- As Vek is exposed via Tetra's API in the form of the
tetra::math
module, this is potentially a breaking change.
- As Vek is exposed via Tetra's API in the form of the
time::get_delta_time
now returns a fixed value when called fromupdate
in 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
tetras
example are no longer ridiculously big.
- Breaking:
graphics::draw
and theDrawable
trait has been removed.- Use the
draw
method on individual types instead. - See #94 (comment) for the rationale behind this change.
- Use the
- Breaking:
DrawParams::clip
has been removed.Texture::draw_region
can be used instead.
- Breaking:
graphics::get_front_face_winding
andgraphics::set_front_face_winding
have been removed.Mesh::front_face_winding
andMesh::set_front_face_winding
can be used instead.
- Breaking:
graphics::ui
has been removed.NineSlice
is 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.
Mesh
now has constructors for various primitive shapes. (@tesselode in #226)- There is also a new
GeometryBuilder
type, which can be used to create more complex/combined shapes.
- There is also a new
Color
now has methods (with_red
,with_blue
,with_green
,with_alpha
) for creating a newColor
with one component changed. (@tesselode in #227)
- When running in
Timestep::Fixed
mode, 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
bytemuck
to 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_repeat
orwindow::set_key_repeat_enabled
. (@sumibi-yakitori in #220
- Reading and writing the volume or speed of a
SoundInstance
is now lock-free, reducing the chances of blocking the audio thread.- This also applies to
audio::get_master_volume
andaudio::set_master_volume
.
- This also applies to
Rectangle
is now generic, allowing types other thanf32
to be used for the components.- The type parameter defaults to
f32
, so this should not be a breaking change.
- The type parameter defaults to
Rectangle
now implementsEq
,Default
andHash
, if the component type also implements the corresponding trait.- The docs for creating a high-DPI
Context
have been improved. - Updated
glow
to 0.7.
SoundInstance
no 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_winding
andgraphics::set_front_face_winding
have 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_enabled
andwindow::is_screen_saver_enabled
have 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::sleep
instead ofstd::thread::yield_now
at 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
Mesh
now 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 forMesh
tinting 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
,Color
andTexture
values as shader uniforms. From<Color>
is now implemented forVec4<f32>
.From<Vec4<f32>>
is now implemented forColor
.
TetraError
'sDisplay
implementation no longer duplicates the source error'sDisplay
text.- The
State
trait 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
,thiserror
andeyre
.
0.5.1 - 2020-10-13
- Color now implements
Add
,AddAssign
,Sub
,SubAssign
,Mul
,MulAssign
,Div
andDivAssign.
- 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.
Texture
andCanvas
now have methods for writing pixel data at runtime:set_data
writes to a specified region of the texture.replace_data
is a shortcut method for replacing the entire texture's data at once.
- Updated
hashbrown
to 0.8. - Updated
glow
to 0.6.
0.5.0 - 2020-09-02
SoundInstance::state
andSoundInstance::set_state
have 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 aSoundInstance
can 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
delta
field 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_texture
is 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
bytemuck
to 1.4. - Breaking: Updated
vek
to 0.12.- As Vek is exposed via Tetra's API in the form of the
tetra::math
module, 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_rect
method 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::project
andCamera::unproject
no longer requireCamera::update
to be called to give correct results.- This is for consistency with the new
visible_rect
method.
- This is for consistency with the new
- Textures now use
CLAMP_TO_EDGE
wrapping, 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
bytemuck
to 1.3.
- The matrix created by a
Camera
now correctly reflects the viewport width and height before the firstupdate
.
0.4.1 - 2020-08-02
ContextBuilder
can now be serialized and deserialized via Serde, if theserde_support
feature 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
ContextBuilder
to 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
TetraError
andEvent
enums 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
glow
to 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_mouse
method onContextBuilder
, and theis_mouse_grabbed
/set_mouse_grabbed
functions in thewindow
module.
- This is exposed via the
- Breaking: The text rendering API has been rewritten from scratch.
- It now uses
ab_glyph
instead 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::text
submodule to avoid cluttering the maingraphics
module.
- It now uses
- Improved the documentation for various types' performance characteristics.
- Breaking: Updated
vek
to 0.11.- As Vek is exposed via Tetra's API in the form of the
tetra::math
module, this is potentially a breaking change.
- As Vek is exposed via Tetra's API in the form of the
- Updated
hashbrown
to 0.8.
- Breaking:
Font
no 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
window
module, 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_text
andinput::set_clipboard_text
. input::get_key_modifier_down
andinput::get_key_modifier_up
have been added, allowing for code handling the control, alt and shift keys to be made more compact.- An
Animation
can now be set to stop playing after all the frames have been displayed, instead of looping. This can either be controlled by theset_repeating
method, or you can create a non-looping animation directly by callingAnimation::once
. hex
andtry_hex
constructors have been added toColor
.
- Updated
sdl2
to 0.34.
0.3.4 - 2020-04-12
Animation
now 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
Rectangle
for getting the co-ordinates of the sides, center and corners. - A
content_mut
getter has been added toText
, allowing the content to be mutated using the standardString
API (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
Texture
objects has been changed to improve performance. - Updated
sdl2
to 0.33. - Updated
hashbrown
to 0.7. - Updated
image
to 0.23. - Updated
rodio
to 0.11.
0.3.2 - 2020-01-15
Rectangle::intersects
,Rectangle::contains
andRectangle::contains_point
have 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
math
module to make it clearer why a re-export is used. - Updated
glow
to 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
State
trait now provides anevent
method 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
Context
can now be configured to have a variable update rate, if that suits your game/architecture better. This is exposed via thetime_step
method onContextBuilder
. - Several new functions have been added to the
time
module, 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_string
andShader::from_fragment_string
constructors have been added.Color::RED
,Color::GREEN
andColor::BLUE
constants have been added.graphics::get_transform_matrix
,graphics::set_transform_matrix
andgraphics::reset_transform_matrix
has been added, which allows you to apply a transformation to your rendering.- The
Camera
struct has been added, which provides a simple way of creating a transform matrix. - Serde support has been added (via the
serde_support
Cargo feature) for the following types:graphics::Color
graphics::Rectangle
input::Key
input::MouseButton
input::GamepadButton
input::GamepadAxis
input::GamepadStick
- Various
math
types, as defined by theVek
crate.
- 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::draw
no longer takes the blend factor as a third parameter - instead, you can call the newtime::get_blend_factor
function.Key
andMouseButton
are 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::Sdl
andTetraError::OpenGl
have been merged intoTetraError::PlatformError
, since they both represent the scenario where something's gone seriously wrong with the underlying platform.DEFAULT_VERTEX_SHADER
andDEFAULT_FRAGMENT_SHADER
are now const instead of static.- Screen scaling has been extracted from the core of the engine, and is now provided via the
ScreenScaler
struct. This allows it to be more flexibly integrated with the rest of your game's rendering. - Various functions now return errors instead of panicking.
TetraError
has been reorganized, so that the errors returned are more descriptive.- The
glm
module has been renamed tomath
, and thenalgebra-glm
dependency has been replaced withvek
. Vec2
is now exported frommath
, notgraphics
.- More types can now be passed into shader uniforms via the
UniformValue
trait. - The graphics device debugging info is now hidden by default. Set the
debug_info
option onGame
totrue
to 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::vertex
andShader::fragment
constructors have been renamed toShader::from_vertex_file
andShader::from_fragment_file
. - Animations now use a
Duration
to specify the frame length, and as such, they are no longer coupled to your game's tick rate. Calladvance
from yourdraw
method to advance the animation's timer. - Updated
glow
to 0.3.0-alpha3. - Updated
hashbrown
to 0.6. - Updated
image
to 0.22. - Updated
glyph_brush
to 0.6. - Updated
rodio
to 0.10.
time::duration_to_f64
andtime::f64_to_duration
have been removed, as the standard library now provides this functionality (Duration::from_secs_f64
andDuration::as_secs_f64
respectively).ContextBuilder::tick_rate
has been removed, asContextBuilder::time_step
now fulfils the same purpose.- Removed deprecated sub-modules from
graphics
. - Removed deprecated
color::BLACK
andcolor::WHITE
constants - useColor::BLACK
andColor::WHITE
instead. - Removed deprecated
from_data
constructors - usefrom_file_data
instead. - Removed deprecated
DrawParams::build_matrix
method. - Removed re-exports of
Animation
andNineSlice
fromgraphics
- from now on this functionality will be accessible viagraphics::animation
andgraphics::ui
respectively.
0.2.20 - 2019-07-13
- All of the SDL2 code is now localized to a single
platform
module. 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
graphics
has been simplified, so that only animation and GUI code is grouped into submodules, not 'primitive' types. The existing paths have been deprecated. - The
BLACK
andWHITE
color constants are now associated with the type, not the module. The existing constants have been deprecated. Color::rgb
,Color::rgba
andRectangle::new
are nowconst fn
.- Updated
glyph-brush
to 0.5.3.
window::is_mouse_visible
now 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
image
to 0.21.2. - Updated
hashbrown
to 0.5.0. - Updated
rodio
to 0.9.0.
0.2.18 - 2019-05-18
- The
tetras
example now has sound effects and music. - There are now constructors for
Color
that takeu8
values. (@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-glm
to 0.4.0.
0.2.17 - 2019-05-05
- An example of how to interpolate between ticks using the
dt
has been added. - Basic support for gamepad vibration has been added.
- A showcase page has been added to the documentation.
- Updated
gl
to 0.12.0. - Updated
image
to 0.21.1. - Updated
hashbrown
to 0.3.0. - Updated
glyph-brush
to 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-glm
to 0.2.0 to avoid increasing the minimum Rust version.
0.2.15 - 2019-04-07
Animation
,Text
andNineSlice
now expose more getters and setters, allowing more of their state to be accessed and manipulated after creation.
- The way that
nalgebra-glm
is 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
sdl2
to 0.32.2. - Updated
nalgebra-glm
to 0.4.0. - Updated
hashbrown
to 0.2.0. - Updated
glyph_brush
to 0.4.1.
- The workaround for the issues with
rand_core
has been removed, as the underlying issue has been fixed. You may need tocargo clean
if this causes issues.
0.2.14 - 2019-03-30
graphics::set_letterbox_color
allows 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
Canvas
object. - An
animation_controller
example has been added, showing how to change animations based on the player's input. (@mgocobachi in #110) - A
from_file_data
constructor has been added toFont
, for consistency withTexture
andSound
.
- 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_data
has been deprecated.
0.2.13 - 2019-03-05
- A
from_rgba
constructor has been added toTexture
. from_file_data
constructors have been added toTexture
andSound
. These function the same as thefrom_data
constructors, but are more clearly named to reflect the fact that they expect encoded data, not raw data.
- The
tetras
example has been updated to demonstrate how you could approach adding multiple screens/states to a game.
- The
from_data
constructors 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
SoundInstance
more reliably. This was mainly an issue with OGG and MP3 files.
0.2.10 - 2019-02-03
from_data
constructors were added toTexture
,Font
andSound
, allowing them to be constructed from binary data. This is useful if you want to useinclude_bytes
to 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
bunnymark
example in release mode!
0.2.8 - 2019-02-01
- The
time::get_fps
function 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
hashbrown
implementation ofHashMap
/HashSet
instead of thefnv
hasher. 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
hashbrown
integration, 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_bundled
andsdl2_static_link
features.
- 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_matrix
method onDrawParams
was 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
DrawParams
are 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-brush
handle 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_with
is 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_PROFILE
environment 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
Texture
now has methods to get the width and height.- The
bundled
andstatic-link
features from thesdl2
crate can now be used through Tetra by enabling thesdl2_bundled
andsdl2_static_link
features. (@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_input
function. (@VictorKoenders in #36) Text
now 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
ScreenScaling
types 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
window
module. - The
update
anddraw
methods onState
are now both optional. - The
graphics
module now re-exportsVec2
. - In addition to the normal
run
method, there is now also arun_with
method 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
Debug
andClone
where appropriate. TetraError
now implements the standard libraryError
trait.
- The library has been upgraded to the 2018 edition of Rust.
ContextBuilder::new
now takes the title and size as parameters. The old behavior of the function can be replicated by usingContextBuilder::default
instead.run
is now a method onContext
, instead of a free function.- The
update
anddraw
methods onState
now 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
scale
option onContextBuilder
has been renamed towindow_scale
, to better reflect its behavior. Shader::from_file
is now calledShader::new
, andShader::new
is now calledShader::from_string
. This is more consistent with the other constructors.- Tick rates are now specified in ticks per second.
- The
ContextBuilder
no longer consumes itself when called - this is more flexible for e.g. calling methods inside a conditional. quit
has been moved to thewindow
module.set_tick_rate
has been moved to thetime
module.- 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
TetraError
will now force you to add a wildcard arm. This will prevent the addition of new error types from being a breaking change. Shader::from_string
now 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
NineSlice
no longer gets distorted if the x and y of thefill_rect
aren'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_pressed
andis_mouse_button_released
functions now work correctly.
0.1.6 - 2018-12-09
- The
Font
andText
types have been added, allowing you to render out text using a TTF font. - Inspired by FNA, the
TETRA_OPENGL_FORCE_CORE_PROFILE
environment 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
rotation
method 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
NineSlice
type 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::Result
andtetra::error::TetraError
are now re-exported in the root of the crate. This allows you to writetetra::Result
in your function signatures, which aligns a bit better with other customResult
types likeio::Result
.- An example of how to use the
Animation
type 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!