@@ -7,6 +7,7 @@ import { Layer } from "./Layer";
7
7
import { Scene } from "./Scene" ;
8
8
import { Script } from "./Script" ;
9
9
import { Transform } from "./Transform" ;
10
+ import { UpdateFlagManager } from "./UpdateFlagManager" ;
10
11
import { ReferResource } from "./asset/ReferResource" ;
11
12
import { EngineObject } from "./base" ;
12
13
import { ComponentCloner } from "./clone/ComponentCloner" ;
@@ -73,8 +74,6 @@ export class Entity extends EngineObject {
73
74
name : string ;
74
75
/** The layer the entity belongs to. */
75
76
layer : Layer = Layer . Layer0 ;
76
- /** Transform component. */
77
- readonly transform : Transform ;
78
77
79
78
/** @internal */
80
79
_isActiveInHierarchy : boolean = false ;
@@ -94,14 +93,24 @@ export class Entity extends EngineObject {
94
93
_isActive : boolean = true ;
95
94
/** @internal */
96
95
_siblingIndex : number = - 1 ;
97
-
98
96
/** @internal */
99
97
_isTemplate : boolean = false ;
98
+ /** @internal */
99
+ _updateFlagManager : UpdateFlagManager = new UpdateFlagManager ( ) ;
100
+ /** @internal */
101
+ _transform : Transform ;
100
102
101
103
private _templateResource : ReferResource ;
102
104
private _parent : Entity = null ;
103
105
private _activeChangedComponents : Component [ ] ;
104
106
107
+ /**
108
+ * The transform of this entity.
109
+ */
110
+ get transform ( ) : Transform {
111
+ return this . _transform ;
112
+ }
113
+
105
114
/**
106
115
* Whether to activate locally.
107
116
*/
@@ -192,12 +201,17 @@ export class Entity extends EngineObject {
192
201
/**
193
202
* Create a entity.
194
203
* @param engine - The engine the entity belongs to
204
+ * @param name - The name of the entity
205
+ * @param components - The types of components you wish to add
195
206
*/
196
- constructor ( engine : Engine , name ?: string ) {
207
+ constructor ( engine : Engine , name ?: string , ... components : ComponentConstructor [ ] ) {
197
208
super ( engine ) ;
198
209
this . name = name ;
199
- this . transform = this . addComponent ( Transform ) ;
200
- this . _inverseWorldMatFlag = this . transform . registerWorldChangeFlag ( ) ;
210
+ for ( let i = 0 , n = components . length ; i < n ; i ++ ) {
211
+ this . addComponent ( components [ i ] ) ;
212
+ }
213
+ ! this . _transform && this . addComponent ( Transform ) ;
214
+ this . _inverseWorldMatFlag = this . registerWorldChangeFlag ( ) ;
201
215
}
202
216
203
217
/**
@@ -394,7 +408,10 @@ export class Entity extends EngineObject {
394
408
* @returns The child entity
395
409
*/
396
410
createChild ( name ?: string ) : Entity {
397
- const child = new Entity ( this . engine , name ) ;
411
+ const transform = this . _transform ;
412
+ const child = transform
413
+ ? new Entity ( this . engine , name , transform . constructor as ComponentConstructor )
414
+ : new Entity ( this . engine , name ) ;
398
415
child . layer = this . layer ;
399
416
child . parent = this ;
400
417
return child ;
@@ -429,6 +446,14 @@ export class Entity extends EngineObject {
429
446
return cloneEntity ;
430
447
}
431
448
449
+ /**
450
+ * Listen for changes in the world pose of this `Entity`.
451
+ * @returns Change flag
452
+ */
453
+ registerWorldChangeFlag ( ) : BoolUpdateFlag {
454
+ return this . _updateFlagManager . createFlag ( BoolUpdateFlag ) ;
455
+ }
456
+
432
457
/**
433
458
* @internal
434
459
*/
@@ -438,8 +463,10 @@ export class Entity extends EngineObject {
438
463
}
439
464
440
465
private _createCloneEntity ( ) : Entity {
441
- const cloneEntity = new Entity ( this . _engine , this . name ) ;
442
-
466
+ const transform = this . _transform ;
467
+ const cloneEntity = transform
468
+ ? new Entity ( this . engine , this . name , transform . constructor as ComponentConstructor )
469
+ : new Entity ( this . engine , this . name ) ;
443
470
const templateResource = this . _templateResource ;
444
471
if ( templateResource ) {
445
472
cloneEntity . _templateResource = templateResource ;
@@ -448,12 +475,7 @@ export class Entity extends EngineObject {
448
475
449
476
cloneEntity . layer = this . layer ;
450
477
cloneEntity . _isActive = this . _isActive ;
451
- const { transform : cloneTransform } = cloneEntity ;
452
- const { transform : srcTransform } = this ;
453
- cloneTransform . position = srcTransform . position ;
454
- cloneTransform . rotation = srcTransform . rotation ;
455
- cloneTransform . scale = srcTransform . scale ;
456
-
478
+ cloneEntity . transform . _copyFrom ( this . transform ) ;
457
479
const srcChildren = this . _children ;
458
480
for ( let i = 0 , n = srcChildren . length ; i < n ; i ++ ) {
459
481
cloneEntity . addChild ( srcChildren [ i ] . _createCloneEntity ( ) ) ;
@@ -478,7 +500,7 @@ export class Entity extends EngineObject {
478
500
for ( let i = 0 , n = components . length ; i < n ; i ++ ) {
479
501
const sourceComp = components [ i ] ;
480
502
if ( ! ( sourceComp instanceof Transform ) ) {
481
- const targetComp = target . addComponent ( < new ( entity : Entity ) => Component > sourceComp . constructor ) ;
503
+ const targetComp = target . addComponent ( < ComponentConstructor > sourceComp . constructor ) ;
482
504
ComponentCloner . cloneComponent ( sourceComp , targetComp , srcRoot , targetRoot , deepInstanceMap ) ;
483
505
}
484
506
}
@@ -765,3 +787,5 @@ type ComponentArguments<T extends new (entity: Entity, ...args: any[]) => Compon
765
787
) => Component
766
788
? P
767
789
: never ;
790
+
791
+ type ComponentConstructor = new ( entity : Entity ) => Component ;
0 commit comments