13
13
pub ( crate ) desc : sys:: ecs_system_desc_t ,
14
14
term_builder : TermBuilder ,
15
15
world : WorldRef < ' a > ,
16
+ /// Skip setting default phase (`OnUpdate`) if `kind` was set,
17
+ /// or an existing entity was passed in (via [`Self::new_from_desc`])
18
+ kind_set : bool ,
16
19
_phantom : core:: marker:: PhantomData < & ' a T > ,
17
20
}
18
21
@@ -26,23 +29,14 @@ where
26
29
desc : Default :: default ( ) ,
27
30
term_builder : TermBuilder :: default ( ) ,
28
31
world : world. into ( ) ,
32
+ kind_set : false ,
29
33
_phantom : core:: marker:: PhantomData ,
30
34
} ;
31
35
32
36
obj. desc . entity = unsafe { sys:: ecs_entity_init ( obj. world_ptr_mut ( ) , & Default :: default ( ) ) } ;
33
37
34
38
T :: populate ( & mut obj) ;
35
39
36
- #[ cfg( feature = "flecs_pipeline" ) ]
37
- unsafe {
38
- sys:: ecs_add_id (
39
- world. world_ptr_mut ( ) ,
40
- obj. desc . entity ,
41
- ecs_dependson ( ECS_ON_UPDATE ) ,
42
- ) ;
43
- sys:: ecs_add_id ( world. world_ptr_mut ( ) , obj. desc . entity , ECS_ON_UPDATE ) ;
44
- }
45
-
46
40
obj
47
41
}
48
42
@@ -51,26 +45,20 @@ where
51
45
desc,
52
46
term_builder : TermBuilder :: default ( ) ,
53
47
world : world. into ( ) ,
48
+ kind_set : false ,
54
49
_phantom : core:: marker:: PhantomData ,
55
50
} ;
56
51
57
52
if obj. desc . entity == 0 {
58
53
obj. desc . entity =
59
54
unsafe { sys:: ecs_entity_init ( obj. world_ptr_mut ( ) , & Default :: default ( ) ) } ;
55
+ } else {
56
+ // Can't make assumptions about the kind on an existing entity.
57
+ obj. kind_set = true ;
60
58
}
61
59
62
60
T :: populate ( & mut obj) ;
63
61
64
- #[ cfg( feature = "flecs_pipeline" ) ]
65
- unsafe {
66
- sys:: ecs_add_id (
67
- world. world_ptr_mut ( ) ,
68
- obj. desc . entity ,
69
- ecs_dependson ( ECS_ON_UPDATE ) ,
70
- ) ;
71
- sys:: ecs_add_id ( world. world_ptr_mut ( ) , obj. desc . entity , ECS_ON_UPDATE ) ;
72
- }
73
-
74
62
obj
75
63
}
76
64
82
70
desc : Default :: default ( ) ,
83
71
term_builder : TermBuilder :: default ( ) ,
84
72
world : world. into ( ) ,
73
+ kind_set : false ,
85
74
_phantom : core:: marker:: PhantomData ,
86
75
} ;
87
76
95
84
96
85
T :: populate ( & mut obj) ;
97
86
98
- #[ cfg( feature = "flecs_pipeline" ) ]
99
- unsafe {
100
- sys:: ecs_add_id (
101
- world. world_ptr_mut ( ) ,
102
- obj. desc . entity ,
103
- ecs_dependson ( ECS_ON_UPDATE ) ,
104
- ) ;
105
- sys:: ecs_add_id ( world. world_ptr_mut ( ) , obj. desc . entity , ECS_ON_UPDATE ) ;
106
- }
107
87
obj
108
88
}
109
89
@@ -134,6 +114,7 @@ where
134
114
if phase != 0 {
135
115
sys:: ecs_add_id ( self . world_ptr_mut ( ) , self . desc . entity , ecs_dependson ( phase) ) ;
136
116
sys:: ecs_add_id ( self . world_ptr_mut ( ) , self . desc . entity , phase) ;
117
+ self . kind_set = true ;
137
118
}
138
119
} ;
139
120
self
@@ -249,6 +230,22 @@ where
249
230
/// * C++ API: `node_builder::build`
250
231
#[ doc( alias = "node_builder::build" ) ]
251
232
fn build ( & mut self ) -> Self :: BuiltType {
233
+ #[ cfg( feature = "flecs_pipeline" ) ]
234
+ if !self . kind_set {
235
+ unsafe {
236
+ sys:: ecs_add_id (
237
+ self . world ( ) . world_ptr_mut ( ) ,
238
+ self . desc . entity ,
239
+ ecs_dependson ( ECS_ON_UPDATE ) ,
240
+ ) ;
241
+ sys:: ecs_add_id (
242
+ self . world ( ) . world_ptr_mut ( ) ,
243
+ self . desc . entity ,
244
+ ECS_ON_UPDATE ,
245
+ ) ;
246
+ }
247
+ }
248
+
252
249
let system = System :: new ( self . world ( ) , self . desc ) ;
253
250
for s in self . term_builder . str_ptrs_to_free . iter_mut ( ) {
254
251
unsafe { core:: mem:: ManuallyDrop :: drop ( s) } ;
0 commit comments