kiwi-ecs 0.0.3 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/arch_store.rb +7 -0
- data/lib/archetype.rb +82 -78
- data/lib/bitmap.rb +6 -0
- data/lib/entity.rb +6 -0
- data/lib/query.rb +4 -0
- data/lib/world.rb +50 -48
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3c28c74f941f35abc3fe5ae1d565f8942f7676b01341e4c3efeef7969dcb1512
|
4
|
+
data.tar.gz: 6ac603e29b87be9c27da787dc330291f8c6bc8ce28e8807e4b8d36294609638e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: db0833836918141ec6f231b943c9c2fb6455e232c6d451cb46b80ff949eb245a164d037dfd984054af69019bf717ebe380734c6a74a1493db429623ed22825d1
|
7
|
+
data.tar.gz: a1d9e6d195d65505ea25f21f5cc98224c4bf4729adaca7fb4a0fa9725a74e3748956853d7fda3e22d6108eab4d98651a612a10b847784f8bee3c99f47f3bd7b3
|
data/README.md
CHANGED
data/lib/arch_store.rb
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
require_relative 'archetype'
|
2
2
|
|
3
|
+
module Kiwi
|
4
|
+
# Internal methods not meant for outside use
|
5
|
+
module Internal
|
6
|
+
|
3
7
|
class ArchStore
|
4
8
|
# [[Integer]:Integer]
|
5
9
|
attr_accessor :compMap
|
@@ -28,3 +32,6 @@ class ArchStore
|
|
28
32
|
end
|
29
33
|
end
|
30
34
|
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
data/lib/archetype.rb
CHANGED
@@ -1,93 +1,97 @@
|
|
1
1
|
ComponentColumn = Struct.new(:components)
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
def new_arch_row_id(entityId)
|
16
|
-
id = @availableEntityRows.pop
|
17
|
-
if id != nil
|
18
|
-
@entities[id] = entityId
|
19
|
-
return id
|
20
|
-
else
|
21
|
-
id = @entities.size
|
22
|
-
@entities.push entityId
|
23
|
-
return id
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def set_component(archRowId, component)
|
28
|
-
compCol = @components[component.class.object_id]
|
29
|
-
if compCol.components.size <= archRowId
|
30
|
-
compCol.components.push component
|
31
|
-
else
|
32
|
-
compCol.components[archRowId] = component
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def get_component(archRowId, componentId)
|
37
|
-
return @components[componentId].components[archRowId]
|
38
|
-
end
|
39
|
-
|
40
|
-
def has_component(componentId)
|
41
|
-
return @components[componentId] != nil
|
42
|
-
end
|
3
|
+
module Kiwi
|
4
|
+
module Internal
|
5
|
+
class Archetype
|
6
|
+
# @params [Array<Integer>] componentIds
|
7
|
+
def initialize(componentIds)
|
8
|
+
# [Integer(componentId): ComponentColumn]
|
9
|
+
@components = componentIds.map do |compId|
|
10
|
+
[compId, ComponentColumn.new([])]
|
11
|
+
end.to_h
|
12
|
+
@availableEntityRows = []
|
13
|
+
@entities = []
|
14
|
+
end
|
43
15
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
16
|
+
# @return [int]
|
17
|
+
def new_arch_row_id(entityId)
|
18
|
+
id = @availableEntityRows.pop
|
19
|
+
if id != nil
|
20
|
+
@entities[id] = entityId
|
21
|
+
return id
|
22
|
+
else
|
23
|
+
id = @entities.size
|
24
|
+
@entities.push entityId
|
25
|
+
return id
|
26
|
+
end
|
27
|
+
end
|
48
28
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
@components[compId].components
|
29
|
+
def set_component(archRowId, component)
|
30
|
+
compCol = @components[component.class.object_id]
|
31
|
+
if compCol.components.size <= archRowId
|
32
|
+
compCol.components.push component
|
33
|
+
else
|
34
|
+
compCol.components[archRowId] = component
|
35
|
+
end
|
57
36
|
end
|
58
|
-
compCount = componentIds.size
|
59
37
|
|
60
|
-
|
61
|
-
|
62
|
-
.filter do |entId, _|
|
63
|
-
entId != nil
|
38
|
+
def get_component(archRowId, componentId)
|
39
|
+
return @components[componentId].components[archRowId]
|
64
40
|
end
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
end
|
41
|
+
|
42
|
+
def has_component(componentId)
|
43
|
+
return @components[componentId] != nil
|
69
44
|
end
|
70
|
-
end
|
71
45
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
# ...
|
76
|
-
components = componentIds
|
77
|
-
.map do |compId|
|
78
|
-
@components[compId].components
|
46
|
+
def remove_entity(archRowId)
|
47
|
+
@availableEntityRows.push(archRowId)
|
48
|
+
@entities[archRowId] = nil
|
79
49
|
end
|
80
|
-
compCount = componentIds.size
|
81
50
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
51
|
+
# @return [[Component, EntityId]]
|
52
|
+
def active_components(componentIds)
|
53
|
+
# [comp1a, comp1b]
|
54
|
+
# [comp2a, comp2b]
|
55
|
+
# ...
|
56
|
+
components = componentIds
|
57
|
+
.map do |compId|
|
58
|
+
@components[compId].components
|
59
|
+
end
|
60
|
+
compCount = componentIds.size
|
61
|
+
|
62
|
+
@entities
|
63
|
+
.each_with_index
|
64
|
+
.filter do |entId, _|
|
65
|
+
entId != nil
|
66
|
+
end
|
67
|
+
.map do |_, rowIdx|
|
68
|
+
(0...compCount).map do |compRowId|
|
69
|
+
components[compRowId][rowIdx]
|
70
|
+
end
|
71
|
+
end
|
86
72
|
end
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
73
|
+
|
74
|
+
def components_and_ids(componentIds)
|
75
|
+
# [comp1a, comp1b]
|
76
|
+
# [comp2a, comp2b]
|
77
|
+
# ...
|
78
|
+
components = componentIds
|
79
|
+
.map do |compId|
|
80
|
+
@components[compId].components
|
81
|
+
end
|
82
|
+
compCount = componentIds.size
|
83
|
+
|
84
|
+
@entities
|
85
|
+
.each_with_index
|
86
|
+
.filter do |entId, _|
|
87
|
+
entId != nil
|
88
|
+
end
|
89
|
+
.map do |entId, rowIdx|
|
90
|
+
[entId, *(0...compCount).map do |compRowId|
|
91
|
+
components[compRowId][rowIdx]
|
92
|
+
end]
|
93
|
+
end
|
91
94
|
end
|
95
|
+
end
|
92
96
|
end
|
93
97
|
end
|
data/lib/bitmap.rb
CHANGED
data/lib/entity.rb
CHANGED
data/lib/query.rb
CHANGED
data/lib/world.rb
CHANGED
@@ -2,63 +2,65 @@ require_relative 'entity'
|
|
2
2
|
require_relative 'arch_store'
|
3
3
|
require_relative 'query'
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
module Kiwi
|
6
|
+
class World
|
7
|
+
def initialize
|
8
|
+
@entityStore = Kiwi::Internal::EntityStore.new
|
9
|
+
@archStore = Kiwi::Internal::ArchStore.new
|
10
|
+
end
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
12
|
+
def spawn(*components)
|
13
|
+
compIds = components.map { |c| c.class.object_id }.sort
|
14
|
+
archId = @archStore.get_archetype_id(compIds)
|
15
|
+
entId = @entityStore.new_id
|
16
|
+
archetype = @archStore.get(archId)
|
17
|
+
archRowId = archetype.new_arch_row_id(entId)
|
18
|
+
@entityStore.spawn(entId, archId, archRowId)
|
19
|
+
for component in components
|
20
|
+
archetype.set_component(archRowId, component)
|
21
|
+
end
|
22
|
+
return entId
|
20
23
|
end
|
21
|
-
return entId
|
22
|
-
end
|
23
24
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
25
|
+
def get_component(entityId, componentType)
|
26
|
+
entity = @entityStore.get(entityId)
|
27
|
+
archetype = @archStore.get(entity.archId)
|
28
|
+
archetype.get_component(entity.archRow, componentType.object_id)
|
29
|
+
end
|
29
30
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
31
|
+
def kill(entityId)
|
32
|
+
entity = @entityStore.get entityId
|
33
|
+
@entityStore.kill(entityId)
|
34
|
+
archetype = @archStore.get(entity.archId)
|
35
|
+
archetype.remove_entity(entity.archRow)
|
36
|
+
end
|
36
37
|
|
37
|
-
|
38
|
-
|
39
|
-
|
38
|
+
def entity_count
|
39
|
+
return @entityStore.entity_count
|
40
|
+
end
|
40
41
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
42
|
+
def has_component(entityId, componentType)
|
43
|
+
entity = @entityStore.get(entityId)
|
44
|
+
archetype = @archStore.get(entity.archId)
|
45
|
+
return archetype.has_component(componentType.object_id)
|
46
|
+
end
|
46
47
|
|
47
|
-
|
48
|
-
|
49
|
-
|
48
|
+
def has_flag(entityId, flagId)
|
49
|
+
return @entityStore.has_flag entityId, flagId
|
50
|
+
end
|
50
51
|
|
51
|
-
|
52
|
-
|
53
|
-
|
52
|
+
def has_flags(entityId, *flagIds)
|
53
|
+
return flagIds.filter { |flagId| !@entityStore.has_flag entityId, flagId }.count == 0
|
54
|
+
end
|
54
55
|
|
55
|
-
|
56
|
-
|
57
|
-
|
56
|
+
def set_flag(entityId, flagId)
|
57
|
+
@entityStore.set_flag(entityId, flagId)
|
58
|
+
end
|
58
59
|
|
59
|
-
|
60
|
-
|
61
|
-
|
60
|
+
def remove_flag(entityId, flagId)
|
61
|
+
@entityStore.remove_flag(entityId, flagId)
|
62
|
+
end
|
62
63
|
|
63
|
-
|
64
|
+
include Kiwi::Internal::Query
|
65
|
+
end
|
64
66
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kiwi-ecs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonas Everaert
|
@@ -10,8 +10,9 @@ bindir: bin
|
|
10
10
|
cert_chain: []
|
11
11
|
date: 2023-08-11 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
|
-
description:
|
14
|
-
|
13
|
+
description: |-
|
14
|
+
== Description
|
15
|
+
Kiwi is a versatile entity component system that is focussed on fast iteration and a nice api
|
15
16
|
email:
|
16
17
|
executables: []
|
17
18
|
extensions: []
|