diff options
-rw-r--r-- | .gitmodules | 3 | ||||
m--------- | meta/3rd/luaecs | 0 | ||||
-rw-r--r-- | meta/3rd/luaecs/config.json | 4 | ||||
-rw-r--r-- | meta/3rd/luaecs/library/ecs.lua | 380 |
4 files changed, 3 insertions, 384 deletions
diff --git a/.gitmodules b/.gitmodules index 5b8848c5..840fc7a0 100644 --- a/.gitmodules +++ b/.gitmodules @@ -46,3 +46,6 @@ [submodule "meta/3rd/lovr"] path = meta/3rd/lovr url = https://github.com/LuaCATS/lovr.git +[submodule "meta/3rd/luaecs"] + path = meta/3rd/luaecs + url = https://github.com/LuaCATS/luaecs.git diff --git a/meta/3rd/luaecs b/meta/3rd/luaecs new file mode 160000 +Subproject 21192fbdccc0f140dae2f74f7c3ec7d74e2aadd diff --git a/meta/3rd/luaecs/config.json b/meta/3rd/luaecs/config.json deleted file mode 100644 index 21d5453c..00000000 --- a/meta/3rd/luaecs/config.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name" : "luaecs", - "words" : [ "ecs%.world()" ] -} diff --git a/meta/3rd/luaecs/library/ecs.lua b/meta/3rd/luaecs/library/ecs.lua deleted file mode 100644 index 56b421ca..00000000 --- a/meta/3rd/luaecs/library/ecs.lua +++ /dev/null @@ -1,380 +0,0 @@ ----@meta - ----Library of https://github.com/cloudwu/luaecs - ----We use a component id and a index in a component pooid, then we can ----get this component's entity id ,then get all other components. ----@class ITER ----@field index integer index of the component pool ----@field cid integer component type id ----@field iter ENTITY_GROUPITER #userdata - ----Return depend the pattern, every pattern will be return a table. ----This is a C function, and it will be used as the __call metamethod of the ----ECSWorld#_groupiter 's return usedata's metatable. ----If the pattern of select is a component name but not a condition,then return ----is the component pool index and component id. ----@alias ENTITY_GROUPITER fun():ITER - ----Every entity must defined which component it contains on new. ----@class ECSWorld -local meta = {} - ----Register a component, use Lua table to describe data struct. ----The table is a name field and data field list, and can has a type field, field will be 'filed_name:type'. ----Then, will caulate the size of component type's data. ----Support type is: int, float, bool, int64, dword, word, byte, double, userdata ----* if type is `lua`, the size is ecs._LUAOBJECT, -1; ----* if type is `raw`, we must set the type's size explict; ----* or the size may bigger than 0, which caculated from the data field list. ----* or if the size is 0, it is a one value component, if it has type field, then the size is the type size; ----* or if the size litter then 0, it is a tag. ----``` ----In C, this is init a component pool, every component pool's data will in a continus memory. ---- {name = 'vector', 'x:float','y:float'} -- normal component ---- {name = 'object',type='lua'}} -- lua component ---- {name = 'hp', type='int'} -- one value component ---- {name = 'mark'}, -- tag, default it boolean -----{name = 'rawobj', type='raw', size= '20'} -- raw object ---- {name = 'byname', order = true} -- order tag ---- Then the c api _newtype will malloc a continus memory of the types' size. ----@param typeclass table ----@see ECSWorld#_newtype -function meta:register(typeclass) -end - ----Construct a new entity, use Lua table to describe it. ----The key is the component type, must register it before, ----so, every kv pair is a component. ----Every component pool will get the new entity id. ----@param obj? table #{name = "hello", position= {x = 1, y = 2}} ----@return integer #eid -function meta:new(obj) -end - ----Return the info of a list of component names. ----May be, for test use? ----@param t string[] component name list ----@return userdata #ctx info ----@see ECSWorld#_context -function meta:context(t) -end - ----Select a patterns of entitys, the mainkey( first key) can't not be has absent condtion. ----The pattern is a space-separated combination of `componentname[:?]action`, and the `action` can be ----* in : read the component ----* out : write the component ----* update : read / write ----* absent : check if the component is not exist ----* exist (default) : check if the component is exist ----* new : create the component ----* ? means it's an optional action if the component is not exist ----NOTICE: If you use action `new` , you must guarantee the component is clear (None entity has this component) before iteration. ----If opt and inout is absent, the return is the id info of the entitys.{ {pooid, cid}} ----**Return value will only has components in he pattern** ----**Return value will like {component_index, component_id,ENTITY_GROUPITER,component1, component2} ----@param pat string #key [{opt inout}] , opt is : or ?, inout is in, out, update, exist(default), absent, new.like t:in, b:out, id?update ----@return ENTITY_GROUPITER #iter function ----@see ECSWorld#_groupiter -function meta:select(pat) -end - ----Sync all then component of the entity represent by a iter to LUA ----@param iter number|ITER #ITER or entity id ----@return table ----@see ECSWorld#_read ----@see ECSWorld#access ----@see ECSWorld#fetch -function meta:readall(iter) -end - ----Clear a component type of name `name` ----@param name string component name ----@see ECSWorld#_clear -function meta:clear(name) -end - ----Clear all component types. ----@see ECSWorld#clear -function meta:clearall() -end - ----Dump all indexes of a component of name `name` ----@param name string ----@return integer[] ----@see ECSWorld#_dumpid -function meta:dumpid(name) -end - ----Update world, will free removed(default, or with tag `tagname`) entity. ----@param tagname? string #tagname, default is REMOVED, but we also can use other tag to delete entities. ----@see ECSWorld#_update -function meta:update(tagname) -end - -local M = { - _MAXTYPE = 255, - _METHODS = meta, - _TYPE_INT = 0, - _TYPE_FLOAT = 1, - _TYPE_BOOL = 2, - _TYPE_INT64 = 3, - _TYPE_DWORD = 4, - _TYPE_WORD = 5, - _TYPE_BYTE = 6, - _TYPE_DOUBLE = 7, - _TYPE_USERDATA = 8, - _TYPE_COUNT = 9, - _LUAOBJECT = -1, - _REMOVED = 0, - _ORDERKEY = -2, - NULL = 0x0, -- userdata -} - ----Lua function ----Construct a new LuaECS World ----@return ECSWorld -function M.world() -end - ----Like new(obj), but use a specifie entity ----@param eid integer #entity id ----@param obj table #describe all component of the type -function meta:import(eid, obj) -end - --- Create a template first ----local t = w:template { ---- name = "foobar" ----} --- instance the template into an entity, and add visible tag. ---- The additional components ( { visible = true } ) is optional. ---- local eid = w:template_instance(w:new(), t, { visible = true }) ----Use a templat to Construct an entity. ----@param eid integer #entity id ----@param temp string #template name ----@param obj table -function meta:template_instance(eid, temp, obj) -end - ----Get an entity's one component, can can write the value. ----@param eid integer ----@param pat string #only one key ----@param value? any # when with this values, is write. ----@return any|nil # pattern key is tag, return boolean; lua type, return lua data; else table; if write, return nil. ----@see ECSWorld#readall ----@see ECSWorld#fetch -function meta:access(eid, pat, value) -end - ----Count the pattern 's object number ----@param pat string ----@return integer -function meta:count(pat) -end - ----Extend an iter with pattern. ----@param iter ITER ----@param expat string ----@see ECSWorld#_read -function meta:extend(iter, expat) end - ----Get component id by name ----@param name string ----@return integer #component id -function meta:component_id(name) end - ----Persist Use -function meta:read_component(reader, name, offset, stride, n) end - ----Get the first entity of pattern `pattern` ----We can use this as a signletone component. ----@param pattern string ----@return ITER -function meta:first(pattern) end - ----Check pattern `pattern` whether has entitys. ----Work same as ECSWorld#first but return boolean. ----@param pattern string ----@return boolean -function meta:check(pattern) end - ----Register a template. ----@param obj table #component and value pairs -function meta:template(obj) end - ----You can tags entities in groups with `w:group_enable(tagname, groupid1, groupid2,...)` ----Enable tag `tagname` on multi groups ----@param tagname string tagname ----@param ... number #group id s ----@see ECSWorld#_group_enable -function meta:group_enable(tagname, ...) end - ----Get a component's type. ----@param name string ----@return string # tag | lua | c | M._TYPE* -function meta:type(name) end - ----This will reset `tagname`'s component pool. ----Set tag on entitys in pattern `pat` ----@param tagname string ----@param pat string -function meta:filter(tagname, pat) end - ----Fetch entity's component with pattern `pat` ----You can use out, update and then w:sumit() to modify entity. ----@param eid integer ----@param pat? string ----@see ECSWorld#readall ----@see ECSWorld#access ----@return table # entity with pat specified component -function meta:fetch(eid, pat) end - ------------ C API ------------- ----C API ----Get the world size ----@return integer, integer #capaticy size, used size -function meta:memory() end - ----C API ----shrink_component_pool -function meta:collect() end - ----C API ----New component type. ----@param cid integer component id, cacul from the Lua ----@param size integer # size ----@see ECSWorld#register -function meta:_newtype(cid, size) -end - ---- C API ----Return a new entity ----@return integer entity id -function meta:_newentity() -end - ---- C API ----Check the entity is exist ----@param eid integer ----@return integer #entity's index in the world, start at 0 ----@see ECSWorld#exist -function meta:_indexentity(eid) end - ---- C API ----Add entity of id `eid` to the component pool of id `cid`, return the pool index. ----@param eid integer entity id ----@param cid integer component id, ----@return integer #pool index id -function meta:_addcomponent(eid, cid) -end - ---- C API ----Update world. ----Remove all entity which removed(default) or with component id `cid`, and will rearrange the world. ----@param cid? integer #tagid ----@see ECSWorld#update -function meta:_update(cid) -end - ---- C API ----Clear component of id `cid` ----@param cid integer component id ----@see ECSWorld#clear -function meta:_clear(cid) -end - ---- C API ----Return the info of a list of component ids. ----@param t integer[] ----@return userdata #ctx info ----@see ECSWorld#context -function meta:_context(t) -end - ---- C API ----Return an iter function for a list of pattren. ----@param pat_desc table[] #{ {name, id, type, [opt, r, w, exist, absent, new] } ----@return ENTITY_GROUPITER #iter C function -function meta:_groupiter(pat_desc) -end - ---- C API -function meta:_mergeiter(...) end - ---- C API ----Get a iter of entity eid. ----@param eid integer ----@return ITER # the cid will by -1 -function meta:_fetch(eid) end - ---- C API ----Entity exists? ----@param eid integer -function meta:exist(eid) end - ---- C API ---- Remove an entity with eid ---- The removed entity will has a tag REMOVED ----@param eid number -function meta:remove(eid) -end - ----C API ----@param ref ENTITY_GROUPITER #the iter of component ----@param cv any #the inited component ----@param index integer #the index of the component pool -function meta:_object(ref, cv, index) -end - ----@param pattern string ----@param iter ITER -function meta:_read(pattern, iter) -end - ----C API ----Commit an mod of a group iter with out or new ----@param iter ITER -function meta:submit(iter) end - ----@see ECSWorld:#first -function meta:_first(...) end - ----Dump all id of a component of id `cid` ----@param cid integer ----@return integer[] ----@see ECSWorld#dumpid -function meta:_dumpid(cid) -end - ----@see ECSWorld:count -function meta:_count(...) end - ----@see ECSWorld:filter -function meta:_filter(...) end - -function meta:_access(...) end - -function meta:__gc(...) end - ----C API ---- Add entity (eid) into a group with groupid (32bit integer) ----**NOTE:We can add entity to a group, but we can not remove it from a group.** ----**NOTE:We can iterate a group, but we can not random visit a group member.** ----@param groupid number #32bit ----@param eid number -function meta:group_add(groupid, eid) end - ----C API. Add tag of group's entitys ----**NOTICE: this call will clear the the tag's component pool.** ----@param tagid number ----@param ... number #max number is 1024 ----@see ECSWorld#group_enable -function meta:_group_enable(tagid, ...) end - ----C api, get the eid list of a group ----@param groupid number ----@return table # eid list -function meta:group_get(groupid) end - -return M |