@@ -25,12 +25,15 @@ local function createComponentClass(initializer, superClass)
25
25
if superClass == nil then
26
26
superClass = ComponentClass
27
27
superClass ._Qualifiers = { [" Primary" ] = ComponentClass }
28
+ superClass ._QualifiersArr = { ComponentClass }
28
29
superClass ._Initializers = {}
29
30
else
31
+ superClass .HasQualifier = true
30
32
ComponentClass .IsQualifier = true
31
33
end
32
34
33
35
local Qualifiers = superClass ._Qualifiers
36
+ local QualifiersArr = superClass ._QualifiersArr
34
37
35
38
setmetatable (ComponentClass , {
36
39
__call = function (t , value )
@@ -80,7 +83,7 @@ local function createComponentClass(initializer, superClass)
80
83
]]
81
84
function ComponentClass .Qualifier (qualifier )
82
85
if type (qualifier ) ~= " string" then
83
- for _ , qualifiedClass in pairs ( Qualifiers ) do
86
+ for _ , qualifiedClass in ipairs ( QualifiersArr ) do
84
87
if qualifiedClass == qualifier then
85
88
return qualifier
86
89
end
@@ -92,6 +95,7 @@ local function createComponentClass(initializer, superClass)
92
95
if qualifiedClass == nil then
93
96
qualifiedClass = createComponentClass (initializer , superClass )
94
97
Qualifiers [qualifier ] = qualifiedClass
98
+ table.insert (QualifiersArr , qualifiedClass )
95
99
end
96
100
return qualifiedClass
97
101
end
@@ -103,15 +107,11 @@ local function createComponentClass(initializer, superClass)
103
107
@return ComponentClass[]
104
108
]]
105
109
function ComponentClass .Qualifiers (...)
106
-
107
- local qualifiers = {}
108
-
109
110
local filter = {... }
110
111
if # filter == 0 then
111
- for _ , qualifiedClass in pairs (Qualifiers ) do
112
- table.insert (qualifiers , qualifiedClass )
113
- end
112
+ return QualifiersArr
114
113
else
114
+ local qualifiers = {}
115
115
local cTypes = {}
116
116
for _ ,qualifier in ipairs ({... }) do
117
117
local qualifiedClass = ComponentClass .Qualifier (qualifier )
@@ -120,9 +120,8 @@ local function createComponentClass(initializer, superClass)
120
120
table.insert (qualifiers , qualifiedClass )
121
121
end
122
122
end
123
+ return qualifiers
123
124
end
124
-
125
- return qualifiers
126
125
end
127
126
128
127
--[[
@@ -197,63 +196,80 @@ local function createComponentClass(initializer, superClass)
197
196
end
198
197
199
198
--[[
200
- Merges data from the other component into the current component. This method should not be invoked, it is used
201
- by the entity to ensure correct retrieval of a component's qualifiers.
202
-
203
- @param other {Component}
199
+ Unlink this component with the other qualifiers
204
200
]]
205
- function ComponentClass :Merge ( other )
206
- if self == other then
201
+ function ComponentClass :Detach ( )
202
+ if not superClass . HasQualifier then
207
203
return
208
204
end
209
205
210
- if self ._qualifiers == other ._qualifiers then
211
- return
212
- end
206
+ -- remove old unlink
207
+ self ._qualifiers [ComponentClass ] = nil
213
208
214
- if not other : Is ( superClass ) then
215
- return
216
- end
209
+ -- new link
210
+ self . _qualifiers = { [ ComponentClass ] = self }
211
+ end
217
212
218
- local selfClass = ComponentClass
219
- local otherClass = other :GetType ()
220
-
221
- -- does anyone know the reference to the primary entity?
222
- local primaryQualifiers
223
- if selfClass == superClass then
224
- primaryQualifiers = self ._qualifiers
225
- elseif otherClass == superClass then
226
- primaryQualifiers = other ._qualifiers
227
- elseif self ._qualifiers [superClass ] ~= nil then
228
- primaryQualifiers = self ._qualifiers [superClass ]._qualifiers
229
- elseif other ._qualifiers [superClass ] ~= nil then
230
- primaryQualifiers = other ._qualifiers [superClass ]._qualifiers
231
- end
213
+ --[[
214
+ Merges data from the other component into the current component. This method should not be invoked, it is used
215
+ by the entity to ensure correct retrieval of a component's qualifiers.
232
216
233
- if primaryQualifiers ~= nil then
234
- if self ._qualifiers ~= primaryQualifiers then
235
- for qualifiedClass , component in pairs (self ._qualifiers ) do
236
- if superClass ~= qualifiedClass then
237
- primaryQualifiers [qualifiedClass ] = component
238
- component ._qualifiers = primaryQualifiers
217
+ @param other {Component}
218
+ ]]
219
+ function ComponentClass :Merge (other )
220
+ if superClass .HasQualifier then
221
+ if self == other then
222
+ return
223
+ end
224
+
225
+ if self ._qualifiers == other ._qualifiers then
226
+ return
227
+ end
228
+
229
+ if not other :Is (superClass ) then
230
+ return
231
+ end
232
+
233
+ local selfClass = ComponentClass
234
+ local otherClass = other :GetType ()
235
+
236
+ -- does anyone know the reference to the primary entity?
237
+ local primaryQualifiers
238
+ if selfClass == superClass then
239
+ primaryQualifiers = self ._qualifiers
240
+ elseif otherClass == superClass then
241
+ primaryQualifiers = other ._qualifiers
242
+ elseif self ._qualifiers [superClass ] ~= nil then
243
+ primaryQualifiers = self ._qualifiers [superClass ]._qualifiers
244
+ elseif other ._qualifiers [superClass ] ~= nil then
245
+ primaryQualifiers = other ._qualifiers [superClass ]._qualifiers
246
+ end
247
+
248
+ if primaryQualifiers ~= nil then
249
+ if self ._qualifiers ~= primaryQualifiers then
250
+ for qualifiedClass , component in pairs (self ._qualifiers ) do
251
+ if superClass ~= qualifiedClass then
252
+ primaryQualifiers [qualifiedClass ] = component
253
+ component ._qualifiers = primaryQualifiers
254
+ end
239
255
end
240
256
end
241
- end
242
-
243
- if other ._qualifiers ~= primaryQualifiers then
244
- for qualifiedClass , component in pairs ( other . _qualifiers ) do
245
- if superClass ~= qualifiedClass then
246
- primaryQualifiers [ qualifiedClass ] = component
247
- component . _qualifiers = primaryQualifiers
257
+
258
+ if other . _qualifiers ~= primaryQualifiers then
259
+ for qualifiedClass , component in pairs ( other ._qualifiers ) do
260
+ if superClass ~= qualifiedClass then
261
+ primaryQualifiers [ qualifiedClass ] = component
262
+ component . _qualifiers = primaryQualifiers
263
+ end
248
264
end
249
265
end
250
- end
251
- else
252
- -- none of the instances know the Primary, use the current object reference
253
- for qualifiedClass , component in pairs ( other . _qualifiers ) do
254
- if selfClass ~= qualifiedClass then
255
- self ._qualifiers [ qualifiedClass ] = component
256
- component . _qualifiers = self . _qualifiers
266
+ else
267
+ -- none of the instances know the Primary, use the current object reference
268
+ for qualifiedClass , component in pairs ( other . _qualifiers ) do
269
+ if selfClass ~= qualifiedClass then
270
+ self . _qualifiers [ qualifiedClass ] = component
271
+ component ._qualifiers = self . _qualifiers
272
+ end
257
273
end
258
274
end
259
275
end
0 commit comments