mirror of
				https://github.com/Ukendio/jecs.git
				synced 2025-10-31 09:09:18 +00:00 
			
		
		
		
	Fix types
This commit is contained in:
		
							parent
							
								
									c3d745a88b
								
							
						
					
					
						commit
						1344398ffe
					
				
					 1 changed files with 47 additions and 45 deletions
				
			
		
							
								
								
									
										84
									
								
								lib/init.lua
									
									
									
									
									
								
							
							
						
						
									
										84
									
								
								lib/init.lua
									
									
									
									
									
								
							|  | @ -252,7 +252,7 @@ local function moveEntity(entityIndex: EntityIndex, entityId: i53, record: Recor | |||
| 	record.row = destinationRow | ||||
| end | ||||
| 
 | ||||
| local function hash(arr): string | number | ||||
| local function hash(arr): string | ||||
| 	return table.concat(arr, "_") | ||||
| end | ||||
| 
 | ||||
|  | @ -265,7 +265,7 @@ local function ensureComponentRecord( | |||
| 	local archetypesMap = componentIndex[componentId]  | ||||
| 
 | ||||
| 	if not archetypesMap then | ||||
| 		archetypesMap = { size = 0, cache = {} } | ||||
| 		archetypesMap = ({ size = 0, cache = {} }  :: any) :: ArchetypeMap | ||||
| 		componentIndex[componentId] = archetypesMap | ||||
| 	end | ||||
| 
 | ||||
|  | @ -490,7 +490,7 @@ local function findArchetypeWith(world: World, node: Archetype, componentId: i53 | |||
| 	-- them each time would be expensive. Instead this insertion sort can find the insertion | ||||
| 	-- point in the types array. | ||||
| 
 | ||||
| 	local destinationType = table.clone(node.types) | ||||
| 	local destinationType = table.clone(node.types) :: { i53 } | ||||
| 	local at = findInsert(types, componentId) | ||||
| 	if at == -1 then | ||||
| 		-- If it finds a duplicate, it just means it is the same archetype so it can return it | ||||
|  | @ -575,7 +575,7 @@ local function archetypeTraverseRemove(world: World, componentId: i53, from: Arc | |||
| 
 | ||||
| 	local remove = edge.remove | ||||
| 	if not remove then | ||||
| 		local to = table.clone(from.types) | ||||
| 		local to = table.clone(from.types) :: { i53 } | ||||
| 		local at = table.find(to, componentId) | ||||
| 		if not at then | ||||
| 			return from | ||||
|  | @ -615,7 +615,7 @@ local function get(record: Record, componentId: i24) | |||
| 	return archetype.columns[archetypeRecord][record.row] | ||||
| end | ||||
| 
 | ||||
| function World.get(world: World, entityId: i53, a: i53, b: i53?, c: i53?, d: i53?, e: i53?) | ||||
| function World.get(world: World, entityId: i53, a: i53, b: i53?, c: i53?, d: i53?, e: i53?): any | ||||
| 	local id = entityId | ||||
| 	local record = world.entityIndex.sparse[id] | ||||
| 	if not record then | ||||
|  | @ -658,14 +658,15 @@ function World.query(world: World, ...): Query | |||
| 		error("Missing components") | ||||
| 	end | ||||
| 
 | ||||
| 	local compatibleArchetypes = {} | ||||
| 	type CompatibleArchetype = { archetype: Archetype, indices: { number } } | ||||
| 	local compatibleArchetypes = {} :: { CompatibleArchetype } | ||||
| 	local length = 0 | ||||
| 
 | ||||
| 	local components = { ... } | ||||
| 	local archetypes = world.archetypes | ||||
| 	local queryLength = #components | ||||
| 
 | ||||
| 	local firstArchetypeMap | ||||
| 	local firstArchetypeMap: ArchetypeMap | ||||
| 	local componentIndex = world.componentIndex | ||||
| 
 | ||||
| 	for _, componentId in components do | ||||
|  | @ -707,7 +708,8 @@ function World.query(world: World, ...): Query | |||
| 		} | ||||
| 	end | ||||
| 
 | ||||
| 	local lastArchetype, compatibleArchetype = next(compatibleArchetypes) | ||||
| 	local lastArchetype, compatibleArchetype: CompatibleArchetype = next(compatibleArchetypes :: any) | ||||
| 
 | ||||
| 	if not lastArchetype then | ||||
| 		return EmptyQuery | ||||
| 	end | ||||
|  | @ -715,51 +717,24 @@ function World.query(world: World, ...): Query | |||
| 	local preparedQuery = {} | ||||
| 	preparedQuery.__index = preparedQuery | ||||
| 
 | ||||
| 	function preparedQuery:without(...) | ||||
| 		local withoutComponents = { ... } | ||||
| 		for i = #compatibleArchetypes, 1, -1 do | ||||
| 			local archetype = compatibleArchetypes[i].archetype | ||||
| 			local records = archetype.records | ||||
| 			local shouldRemove = false | ||||
| 
 | ||||
| 			for _, componentId in withoutComponents do | ||||
| 				if records[componentId] then | ||||
| 					shouldRemove = true | ||||
| 					break | ||||
| 				end | ||||
| 			end | ||||
| 
 | ||||
| 			if shouldRemove then | ||||
| 				table.remove(compatibleArchetypes, i) | ||||
| 			end | ||||
| 		end | ||||
| 
 | ||||
| 		lastArchetype, compatibleArchetype = next(compatibleArchetypes) | ||||
| 		if not lastArchetype then | ||||
| 			return EmptyQuery | ||||
| 		end | ||||
| 
 | ||||
| 		return self | ||||
| 	end | ||||
| 
 | ||||
| 	local lastRow | ||||
| 	local queryOutput = {} | ||||
| 
 | ||||
| 	function preparedQuery:__iter() | ||||
| 		return function()  | ||||
| 			local archetype = compatibleArchetype.archetype | ||||
| 			local row: number = next(archetype.entities, lastRow) :: number | ||||
| 			local row: number = next(archetype.entities, lastRow) | ||||
| 			while row == nil do | ||||
| 				lastArchetype, compatibleArchetype = next(compatibleArchetypes, lastArchetype) | ||||
| 				if lastArchetype == nil then | ||||
| 					return | ||||
| 				end | ||||
| 				archetype = compatibleArchetype.archetype | ||||
| 				row = next(archetype.entities, row) :: number | ||||
| 				row = next(archetype.entities, row) | ||||
| 			end | ||||
| 			lastRow = row | ||||
| 
 | ||||
| 			local entityId = archetype.entities[row :: number] | ||||
| 			local entityId = archetype.entities[row] | ||||
| 			local columns = archetype.columns | ||||
| 			local tr = compatibleArchetype.indices | ||||
| 
 | ||||
|  | @ -811,20 +786,47 @@ function World.query(world: World, ...): Query | |||
| 				queryOutput[i] = columns[tr[i]][row] | ||||
| 			end | ||||
| 
 | ||||
| 			return entityId, unpack(queryOutput, 1, queryLength) | ||||
| 			return entityId, unpack(queryOutput :: any, 1, queryLength) | ||||
| 		end | ||||
| 	end | ||||
| 
 | ||||
| 	function preparedQuery:without(...) | ||||
| 		local withoutComponents = { ... } | ||||
| 		for i = #compatibleArchetypes, 1, -1 do | ||||
| 			local archetype = compatibleArchetypes[i].archetype | ||||
| 			local records = archetype.records | ||||
| 			local shouldRemove = false | ||||
| 
 | ||||
| 			for _, componentId in withoutComponents do | ||||
| 				if records[componentId] then | ||||
| 					shouldRemove = true | ||||
| 					break | ||||
| 				end | ||||
| 			end | ||||
| 
 | ||||
| 			if shouldRemove then | ||||
| 				table.remove(compatibleArchetypes, i) | ||||
| 			end | ||||
| 		end | ||||
| 
 | ||||
| 		lastArchetype, compatibleArchetype = next(compatibleArchetypes :: any) | ||||
| 		if not lastArchetype then | ||||
| 			return EmptyQuery | ||||
| 		end | ||||
| 
 | ||||
| 		return self | ||||
| 	end | ||||
| 
 | ||||
| 	return setmetatable({}, preparedQuery) :: any | ||||
| end | ||||
| 
 | ||||
| function World.__iter(world: World): () -> (number?, unknown?) | ||||
| function World.__iter(world: World): () -> any  | ||||
| 	local dense = world.entityIndex.dense | ||||
| 	local sparse = world.entityIndex.sparse | ||||
| 	local last | ||||
| 
 | ||||
| 	return function() | ||||
| 		local lastEntity, entityId = next(dense, last) | ||||
| 		local lastEntity: number?, entityId: number = next(dense, last) | ||||
| 		if not lastEntity then  | ||||
| 			return  | ||||
| 		end | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue