Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add component denpendent decorator (#796) #807

Merged
merged 1 commit into from
May 25, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 4 additions & 5 deletions packages/core/src/Camera.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { Logger } from "./base";
import { BoolUpdateFlag } from "./BoolUpdateFlag";
import { deepClone, ignoreClone } from "./clone/CloneManager";
import { Component } from "./Component";
import { dependencies } from "./ComponentsDependencies";
import { dependentComponents } from "./ComponentsDependencies";
import { Entity } from "./Entity";
import { CameraClearFlags } from "./enums/CameraClearFlags";
import { Layer } from "./Layer";
Expand All @@ -16,7 +16,6 @@ import { ShaderMacroCollection } from "./shader/ShaderMacroCollection";
import { TextureCubeFace } from "./texture/enums/TextureCubeFace";
import { RenderTarget } from "./texture/RenderTarget";
import { Transform } from "./Transform";
import { UpdateFlag } from "./UpdateFlag";

class MathTemp {
static tempVec4 = new Vector4();
Expand All @@ -26,8 +25,9 @@ class MathTemp {

/**
* Camera component, as the entrance to the three-dimensional world.
* @decorator `@dependentComponents(Transform)`
*/
@dependencies(Transform)
@dependentComponents(Transform)
export class Camera extends Component {
private static _viewMatrixProperty = Shader.getPropertyByName("u_viewMat");
private static _projectionMatrixProperty = Shader.getPropertyByName("u_projMat");
Expand Down Expand Up @@ -314,8 +314,7 @@ export class Camera extends Component {
}

/**
* Create the Camera component.
* @param entity - Entity
* @internal
*/
constructor(entity: Entity) {
super(entity);
Expand Down
33 changes: 18 additions & 15 deletions packages/core/src/ComponentsDependencies.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,25 +14,24 @@ export class ComponentsDependencies {
private static _invDependenciesMap = new Map<ComponentConstructor, ComponentConstructor[]>();

/**
* Register component dependencies.
* @param currentComponent - The component you want to be register.
* @param dependentComponent - The component's dependencies.
* @internal
*/
static register(currentComponent: ComponentConstructor, dependentComponent: ComponentConstructor) {
static _register(currentComponent: ComponentConstructor, dependentComponent: ComponentConstructor): void {
this._addDependency(currentComponent, dependentComponent, this._dependenciesMap);
this._addDependency(dependentComponent, currentComponent, this._invDependenciesMap);
}

/**
* @internal
*/
static _addCheck(entity: Entity, type: ComponentConstructor) {
static _addCheck(entity: Entity, type: ComponentConstructor): void {
// Check if there are dependent components.
const dependencies = ComponentsDependencies._dependenciesMap.get(type);
if (dependencies) {
for (let i = 0, len = dependencies.length; i < len; i++) {
if (!entity.getComponent(dependencies[i])) {
throw `you should add ${dependencies[i]} before adding ${type}`;
const dependentComponents = ComponentsDependencies._dependenciesMap.get(type);
if (dependentComponents) {
for (let i = 0, n = dependentComponents.length; i < n; i++) {
const dependentComponent = dependentComponents[i];
if (!entity.getComponent(dependentComponent)) {
entity.addComponent(dependentComponent);
}
}
}
Expand All @@ -41,7 +40,7 @@ export class ComponentsDependencies {
/**
* @internal
*/
static _removeCheck(entity: Entity, type: ComponentConstructor) {
static _removeCheck(entity: Entity, type: ComponentConstructor): void {
const invDependencies = ComponentsDependencies._invDependenciesMap.get(type);
if (invDependencies) {
for (let i = 0, len = invDependencies.length; i < len; i++) {
Expand All @@ -55,8 +54,8 @@ export class ComponentsDependencies {
private static _addDependency(
currentComponent: ComponentConstructor,
dependentComponent: ComponentConstructor,
map: Map<any, any>
) {
map: Map<ComponentConstructor, ComponentConstructor[]>
): void {
let components = map.get(currentComponent);
if (!components) {
components = [];
Expand All @@ -70,8 +69,12 @@ export class ComponentsDependencies {
private constructor() {}
}

export function dependencies(...componentClass: ComponentConstructor[]) {
/**
* Dependent components, automatically added if they do not exist.
* @param components - Dependent components
*/
export function dependentComponents(...components: ComponentConstructor[]) {
return function <T extends ComponentConstructor>(target: T): void {
componentClass.forEach((component) => ComponentsDependencies.register(target, component));
components.forEach((component) => ComponentsDependencies._register(target, component));
};
}
11 changes: 8 additions & 3 deletions packages/core/src/Renderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,22 @@ import { BoolUpdateFlag } from "./BoolUpdateFlag";
import { Camera } from "./Camera";
import { deepClone, ignoreClone, shallowClone } from "./clone/CloneManager";
import { Component } from "./Component";
import { dependentComponents } from "./ComponentsDependencies";
import { Entity } from "./Entity";
import { Material } from "./material/Material";
import { RenderContext } from "./RenderPipeline/RenderContext";
import { Shader } from "./shader";
import { ShaderDataGroup } from "./shader/enums/ShaderDataGroup";
import { ShaderData } from "./shader/ShaderData";
import { ShaderMacroCollection } from "./shader/ShaderMacroCollection";
import { UpdateFlag } from "./UpdateFlag";
import { Transform } from "./Transform";

/**
* Renderable component.
* @decorator `@dependentComponents(Transform)`
*/
export abstract class Renderer extends Component {
@dependentComponents(Transform)
export class Renderer extends Component {
private static _localMatrixProperty = Shader.getPropertyByName("u_localMat");
private static _worldMatrixProperty = Shader.getPropertyByName("u_modelMat");
private static _mvMatrixProperty = Shader.getPropertyByName("u_MVMat");
Expand Down Expand Up @@ -286,7 +289,9 @@ export abstract class Renderer extends Component {
/**
* @internal
*/
abstract _render(camera: Camera): void;
_render(camera: Camera): void {
throw "not implement";
}

/**
* @internal
Expand Down
3 changes: 3 additions & 0 deletions packages/core/src/Transform.ts
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,9 @@ export class Transform extends Component {
this._setDirtyFlagFalse(TransformFlag.WorldMatrix);
}

/**
* @internal
*/
constructor(entity: Entity) {
super(entity);

Expand Down
3 changes: 3 additions & 0 deletions packages/core/src/fog/Fog.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ export class Fog extends Component {

private _color: Color = new Color(1, 0, 0, 1);

/**
* @internal
*/
constructor(entity: Entity) {
super(entity);
this.color = this._color;
Expand Down
2 changes: 1 addition & 1 deletion packages/core/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ export { Entity } from "./Entity";
export { Component } from "./Component";
export { Script } from "./Script";
export { Renderer } from "./Renderer";
export { dependencies } from "./ComponentsDependencies";
export { dependentComponents } from "./ComponentsDependencies";
export { Camera } from "./Camera";
export { Transform } from "./Transform";
export { UpdateFlag } from "./UpdateFlag";
Expand Down
1 change: 0 additions & 1 deletion packages/core/src/mesh/MeshRenderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import { Entity } from "../Entity";
import { Mesh } from "../graphic/Mesh";
import { Renderer } from "../Renderer";
import { Shader } from "../shader/Shader";
import { UpdateFlag } from "../UpdateFlag";

/**
* MeshRenderer Component.
Expand Down
22 changes: 14 additions & 8 deletions packages/core/src/physics/Collider.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
import { Component } from "../Component";
import { ignoreClone } from "../clone/CloneManager";
import { ICollider } from "@oasis-engine/design";
import { ColliderShape } from "./shape/ColliderShape";
import { UpdateFlag } from "../UpdateFlag";
import { Entity } from "../Entity";
import { BoolUpdateFlag } from "../BoolUpdateFlag";
import { ignoreClone } from "../clone/CloneManager";
import { Component } from "../Component";
import { dependentComponents } from "../ComponentsDependencies";
import { Entity } from "../Entity";
import { Transform } from "../Transform";
import { ColliderShape } from "./shape/ColliderShape";

/**
* Abstract class for collider shapes.
* Base class for all colliders.
* @decorator `@dependentComponents(Transform)`
*/
export abstract class Collider extends Component {
@dependentComponents(Transform)
export class Collider extends Component {
/** @internal */
@ignoreClone
_index: number = -1;
Expand All @@ -27,7 +30,10 @@ export abstract class Collider extends Component {
return this._shapes;
}

protected constructor(entity: Entity) {
/**
* @internal
*/
constructor(entity: Entity) {
super(entity);
this._updateFlag = this.entity.transform.registerWorldChangeFlag();
}
Expand Down
5 changes: 4 additions & 1 deletion packages/core/src/physics/DynamicCollider.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { IDynamicCollider } from "@oasis-engine/design";
import { Quaternion, Vector3 } from "@oasis-engine/math";
import { Entity } from "../Entity";
import { Collider } from "./Collider";
import { PhysicsManager } from "./PhysicsManager";
import { Vector3, Quaternion } from "@oasis-engine/math";

/**
* A dynamic collider can act with self-defined movement or physical force.
Expand Down Expand Up @@ -199,6 +199,9 @@ export class DynamicCollider extends Collider {
(<IDynamicCollider>this._nativeCollider).setCollisionDetectionMode(value);
}

/**
* @internal
*/
constructor(entity: Entity) {
super(entity);
const { transform } = this.entity;
Expand Down
3 changes: 3 additions & 0 deletions packages/core/src/physics/StaticCollider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ import { PhysicsManager } from "./PhysicsManager";
* @remarks Mostly used for object which always stays at the same place and never moves around.
*/
export class StaticCollider extends Collider {
/**
* @internal
*/
constructor(entity: Entity) {
super(entity);
const { transform } = this.entity;
Expand Down