All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
-
[world]
:- 16% faster
world:get
- 16% faster
-
[typescript]
- Fixed Entity type to default to
undefined | unknown
instead of justundefined
- Fixed Entity type to default to
-
[query]
:- Fixed bug where
world:clear
did not invokejecs.OnRemove
hooks - Changed
query.__iter
to drain on iteration- It will initialize once wherever you left iteration off at last time
- Changed
query:iter
to restart the iterator - Removed
query:drain
andquery:next
- If you want to get individual results outside of a for-loop, you need to call
query:iter
to initialize the iterator and then call the iterator function manually
local it = world:query(A, B, C):iter() local entity, a, b, c = it() entity, a, b, c = it() -- get next results
- If you want to get individual results outside of a for-loop, you need to call
- Fixed bug where
-
[world
- Fixed a bug with
world:clear
not invokingjecs.OnRemove
hooks
- Fixed a bug with
-
[typescript]
:- Changed pair to accept generics
- Improved handling of Tags
[world]
:- Changed
world:cleanup
to traverse a header type for graph edges. (Edit) - Fixed a regression that occurred when you call
world:set
following aworld:remove
using the same component - Remove explicit error in JECS_DEBUG for
world:target
when not applying an index parameter
- Changed
[typescript]
:- Fixed
world.set
with NoInfer
- Fixed
[world]
:- Added an index parameter to
world:target
- Added a way to change the components limit via
_G.JECS_HI_COMPONENT_ID
- Set it to whatever number you want but try to make it as close to the number of components you will use as possible
- Make sure to set this before importing jecs or else it will not work
- Added debug mode, enable via setting
_G.JECS_DEBUG
to true- Make sure to set this before importing jecs or else it will not work
- Added
world:cleanup
which is called to cleanup empty archetypes manually - Changed
world:delete
to delete archetypes that are dependent on the passed entity - Changed
world:delete
to delete entity's children before the entity to prevent cycles
- Added an index parameter to
[query]
:- Fixed the iterator to not drain by default
[typescript]
- Fixed entry point of the package.json file to be
src
rather thansrc/init
- Fixed
query.next
returning a query object whereas it would be expected to return a tuple containing the entity and the corresponding component values - Exported
query.archetypes
- Changed
pair
to return a number instead of an entity- Preventing direct usage of a pair as an entity while still allowing it to be used as a component
- Exported built-in components
ChildOf
andName
- Exported
world.parent
- Fixed entry point of the package.json file to be
[world]
:- Improved performance for hooks
- Changed
world:set
to be idempotent when setting tags
[traits]
:- Added cleanup condition
jecs.OnDelete
for when the entity or component is deleted - Added cleanup action
jecs.Remove
which removes instances of the specified (component) id from all entities- This is the default cleanup action
- Added component trait
jecs.Tag
which allows for zero-cost components used as tags- Setting data to a component with this trait will do nothing
- Added cleanup condition
[luau]
:- Exported
world:contains()
- Exported
query:drain()
- Exported
Query
- Improved types for the hook
OnAdd
,OnSet
,OnRemove
- Changed functions to accept any ID including pairs in type parameters
- Applies to
world:add()
,world:set()
,world:remove()
,world:get()
,world:has()
andworld:query()
- New exported type
Id<T = nil> = Entity<T> | Pair
- Applies to
- Changed
world:contains()
to return aboolean
instead of an entity which may or may not exist - Fixed
world:has()
to take the correct parameters
- Exported
0.2.2 - 2024-07-07
- Added
query:replace(function(...T) return ...U end)
for replacing components in place- Method is fast pathed to replace the data to the components for each corresponding entity
- Iterator now goes backwards instead to prevent common cases of iterator invalidation
0.2.1 - 2024-07-06
- Added
jecs.Component
built-in component which will be added to ids created withworld:component()
.- Used to find every component id with `query(jecs.Component)
0.2.0 - 2024-07-03
- Added
world:parent(entity)
andjecs.ChildOf
respectively as first class citizen for building parent-child relationships.- Give a parent to an entity with
world:add($source, pair(ChildOf, $target))
- Use
world:parent(entity)
to find the target of the relationship
- Give a parent to an entity with
- Added user-facing Luau types
- Improved iteration speeds 20-40% by manually indexing rather than using
next()
😱
0.1.1 - 2024-05-19
- Added
world:clear(entity)
for removing the components to the corresponding entity - Added Typescript Types
0.1.0 - 2024-05-13
- Optimized iterator
0.1.0-rc.6 - 2024-05-13
- Added a
jecs.Wildcard
term- it lets you query any partially matched pairs
0.1.0-rc.5 - 2024-05-10
- Added Entity relationships for creating logical connections between entities
- Added
world:__iter method
which allows for iteration over the whole world to get every entity- used for reconciling whole worlds such as via replication, saving/loading, etc
- Added
world:add(entity, component)
which adds a component to the entity- it is an idempotent function, so calling it twice and in any order should be fine
- Fixed component overriding when in disorder
- Previously setting the components in different order results in it overriding component data because it incorrectly mapped the index of the column. So it took the index from the source archetype rather than the destination archetype
- Added observers
- Added an arm to query
query:without()
for chaining invariants.
-
Separates ranges for components and entity IDs.
- IDs created with
world:component()
will promote array lookups rather than map lookups in thecomponentIndex
which is a significant boost
- IDs created with
-
No longer caches the column pointers directly and instead the column indices which stay persistent even when data is reallocated during swap-removals
- This was an issue with the iterator being invalidated when you move an entity to a different archetype.
- Fixed a bug where changing an existing component would be slow because it was always appending changing the row of the entity record
- The fix dramatically improves times where it is basically down to just the speed of setting a field in a table
0.0.0-prototype.rc.2 - 2024-04-26
-
Optimized the creation of the query
- It will now finds the smallest archetype map to iterate over
-
Optimized the query iterator
- It will now populates iterator with columns for faster indexing
-
Renamed the insertion method from world:add to world:set to better reflect what it does.
0.0.0-prototype.rc.2 - 2024-04-23
- Initial release