bg2e-js 2.3.11 → 2.3.13
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.
- package/dist/bg2e-js.js +356 -326
- package/dist/bg2e-js.js.map +1 -1
- package/package.json +56 -56
- package/src/app/AppController.ts +39 -39
- package/src/app/Bg2KeyboardEvent.ts +54 -54
- package/src/app/Bg2MouseEvent.ts +82 -82
- package/src/app/Bg2TouchEvent.ts +18 -18
- package/src/app/Canvas.ts +108 -108
- package/src/app/EventBase.ts +10 -10
- package/src/app/MainLoop.ts +273 -273
- package/src/app/index.ts +24 -24
- package/src/base/Color.ts +134 -134
- package/src/base/Environment.ts +183 -183
- package/src/base/Light.ts +192 -192
- package/src/base/Material.ts +620 -620
- package/src/base/PolyList.ts +365 -365
- package/src/base/Texture.ts +620 -620
- package/src/base/index.ts +81 -81
- package/src/db/Bg2LoaderPlugin.ts +143 -143
- package/src/db/DBPluginApi.ts +48 -48
- package/src/db/Loader.ts +116 -116
- package/src/db/LoaderPlugin.ts +34 -34
- package/src/db/MtlParser.ts +7 -7
- package/src/db/ObjLoaderPlugin.ts +54 -54
- package/src/db/ObjParser.ts +252 -252
- package/src/db/ObjWriterPlugin.ts +18 -18
- package/src/db/VitscnjLoaderPlugin.ts +112 -112
- package/src/db/Writer.ts +52 -52
- package/src/db/WriterPlugin.ts +22 -22
- package/src/db/index.ts +44 -44
- package/src/debug/DebugRenderer.ts +173 -173
- package/src/debug/WebGLTextureViewer.ts +75 -75
- package/src/debug/index.ts +6 -6
- package/src/index.html +11 -11
- package/src/index.ts +33 -33
- package/src/manipulation/SelectionBuffer.ts +81 -81
- package/src/manipulation/SelectionHighlight.ts +105 -84
- package/src/manipulation/SelectionIdAssignVisitor.ts +96 -96
- package/src/manipulation/SelectionManager.ts +196 -188
- package/src/manipulation/SelectionMode.ts +6 -6
- package/src/math/Mat3.ts +259 -259
- package/src/math/Mat4.ts +710 -710
- package/src/math/MatrixStrategy.ts +25 -25
- package/src/math/Quat.ts +65 -65
- package/src/math/Vec.ts +753 -753
- package/src/math/constants.ts +46 -46
- package/src/math/functions.ts +103 -103
- package/src/math/index.ts +74 -74
- package/src/phsics/joint.ts +137 -137
- package/src/primitives/arrow.ts +57 -57
- package/src/primitives/cone.ts +138 -138
- package/src/primitives/cube.ts +60 -60
- package/src/primitives/cylinder.ts +216 -216
- package/src/primitives/index.ts +13 -13
- package/src/primitives/plane.ts +31 -31
- package/src/primitives/sphere.ts +809 -809
- package/src/react/useBg2e.ts +69 -69
- package/src/render/BRDFIntegrationMap.ts +4 -4
- package/src/render/Environment.ts +135 -135
- package/src/render/FrameBuffer.ts +35 -35
- package/src/render/MaterialRenderer.ts +34 -34
- package/src/render/Pipeline.ts +108 -108
- package/src/render/PolyListRenderer.ts +47 -47
- package/src/render/RenderBuffer.ts +197 -197
- package/src/render/RenderQueue.ts +198 -198
- package/src/render/RenderState.ts +116 -116
- package/src/render/Renderer.ts +248 -248
- package/src/render/SceneAppController.ts +250 -250
- package/src/render/SceneRenderer.ts +387 -387
- package/src/render/Shader.ts +32 -32
- package/src/render/ShadowRenderer.ts +176 -176
- package/src/render/SkyCube.ts +105 -105
- package/src/render/SkySphere.ts +117 -117
- package/src/render/TextureMergerRenderer.ts +70 -70
- package/src/render/TextureRenderer.ts +34 -34
- package/src/render/index.ts +67 -67
- package/src/render/webgl/FrameBuffer.ts +9 -9
- package/src/render/webgl/MaterialRenderer.ts +112 -112
- package/src/render/webgl/Pipeline.ts +88 -88
- package/src/render/webgl/PolyListRenderer.ts +260 -260
- package/src/render/webgl/RenderBuffer.ts +226 -226
- package/src/render/webgl/Renderer.ts +262 -262
- package/src/render/webgl/SceneRenderer.ts +67 -67
- package/src/render/webgl/ShaderProgram.ts +424 -424
- package/src/render/webgl/ShadowRenderer.ts +6 -6
- package/src/render/webgl/SkyCube.ts +15 -15
- package/src/render/webgl/SkySphere.ts +15 -15
- package/src/render/webgl/State.ts +152 -152
- package/src/render/webgl/TextureRenderer.ts +167 -167
- package/src/render/webgl/VertexBuffer.ts +137 -137
- package/src/render/webgl/index.ts +35 -35
- package/src/scene/Camera.ts +458 -458
- package/src/scene/Chain.ts +44 -44
- package/src/scene/ChainJoint.ts +58 -58
- package/src/scene/Component.ts +177 -177
- package/src/scene/ComponentMap.ts +106 -106
- package/src/scene/Drawable.ts +154 -154
- package/src/scene/EnvironmentComponent.ts +141 -141
- package/src/scene/FindNodeVisitor.ts +59 -59
- package/src/scene/LightComponent.ts +154 -154
- package/src/scene/MatrixState.ts +46 -46
- package/src/scene/Node.ts +328 -328
- package/src/scene/NodeVisitor.ts +15 -15
- package/src/scene/OrbitCameraController.ts +450 -450
- package/src/scene/SmoothOrbitCameraController.ts +99 -99
- package/src/scene/Transform.ts +73 -73
- package/src/scene/index.ts +60 -60
- package/src/shaders/BasicDiffuseColorShader.ts +111 -111
- package/src/shaders/BasicPBRLightShader.ts +276 -276
- package/src/shaders/DebugRenderShader.ts +97 -97
- package/src/shaders/DepthRenderShader.ts +127 -127
- package/src/shaders/IrradianceMapCubeShader.ts +115 -115
- package/src/shaders/PBRLightIBLShader.ts +486 -486
- package/src/shaders/PickSelectionShader.ts +101 -101
- package/src/shaders/PresentDebugFramebufferShader.ts +118 -118
- package/src/shaders/PresentTextureShader.ts +99 -99
- package/src/shaders/SelectionHighlightShader.ts +143 -127
- package/src/shaders/ShaderFunction.ts +318 -318
- package/src/shaders/SkyCubeShader.ts +93 -93
- package/src/shaders/SkySphereShader.ts +102 -102
- package/src/shaders/SpecularMapCubeShader.ts +164 -164
- package/src/shaders/TextureMergerShader.ts +171 -171
- package/src/shaders/index.ts +36 -36
- package/src/shaders/webgl/color_correction.glsl +47 -47
- package/src/shaders/webgl/constants.glsl +6 -6
- package/src/shaders/webgl/index.ts +70 -70
- package/src/shaders/webgl/normal_map.glsl +9 -9
- package/src/shaders/webgl/pbr.glsl +173 -173
- package/src/shaders/webgl/uniforms.glsl +91 -91
- package/src/shaders/webgl_shader_lib.ts +213 -213
- package/src/tools/BinaryResourceProvider.ts +14 -14
- package/src/tools/ImageResourceProvider.ts +66 -66
- package/src/tools/MaterialModifier.ts +446 -446
- package/src/tools/Resource.ts +203 -203
- package/src/tools/ResourceProvider.ts +69 -69
- package/src/tools/TextResourceProvider.ts +24 -24
- package/src/tools/TextureCache.ts +51 -51
- package/src/tools/TextureResourceDatabase.ts +100 -100
- package/src/tools/UserAgent.ts +362 -362
- package/src/tools/VideoResourceProvider.ts +50 -50
- package/src/tools/WriteStrategy.ts +22 -22
- package/src/tools/base64.ts +11 -11
- package/src/tools/crypto.ts +19 -19
- package/src/tools/endiantess.ts +13 -13
- package/src/tools/image.ts +18 -18
- package/src/tools/index.ts +41 -41
- package/src/tools/processType.ts +39 -39
- package/src/vite-env.d.ts +12 -12
package/src/scene/Chain.ts
CHANGED
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
|
|
2
|
-
import Mat4 from "../math/Mat4";
|
|
3
|
-
import Component from "./Component";
|
|
4
|
-
import { ChainJoint } from "./ChainJoint";
|
|
5
|
-
|
|
6
|
-
export default class Chain extends Component {
|
|
7
|
-
constructor() {
|
|
8
|
-
super('Chain');
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
willUpdate(frame: number, matrixState: any): void {
|
|
12
|
-
if (this.node) {
|
|
13
|
-
const matrix = Mat4.MakeIdentity();
|
|
14
|
-
this.node.children.forEach((child, index) => {
|
|
15
|
-
const trx = child.transform;
|
|
16
|
-
const inJoint = child.component("InputChainJoint") as ChainJoint;
|
|
17
|
-
const outJoint = child.component("OutputChainJoint") as ChainJoint;
|
|
18
|
-
|
|
19
|
-
if (index > 0 && inJoint) {
|
|
20
|
-
inJoint.joint.applyTransform(matrix);
|
|
21
|
-
}
|
|
22
|
-
else {
|
|
23
|
-
matrix.identity();
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
if (trx) {
|
|
27
|
-
trx.matrix.assign(matrix);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
if (outJoint) {
|
|
31
|
-
outJoint.joint.applyTransform(matrix);
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
clone(): Chain { return new Chain(); }
|
|
38
|
-
assign(other: Chain): void {}
|
|
39
|
-
async deserialize(sceneData: any, loader: any): Promise<void> {}
|
|
40
|
-
|
|
41
|
-
async serialize(sceneData: any, writer: any): Promise<void> {
|
|
42
|
-
await super.serialize(sceneData, writer);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
1
|
+
|
|
2
|
+
import Mat4 from "../math/Mat4";
|
|
3
|
+
import Component from "./Component";
|
|
4
|
+
import { ChainJoint } from "./ChainJoint";
|
|
5
|
+
|
|
6
|
+
export default class Chain extends Component {
|
|
7
|
+
constructor() {
|
|
8
|
+
super('Chain');
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
willUpdate(frame: number, matrixState: any): void {
|
|
12
|
+
if (this.node) {
|
|
13
|
+
const matrix = Mat4.MakeIdentity();
|
|
14
|
+
this.node.children.forEach((child, index) => {
|
|
15
|
+
const trx = child.transform;
|
|
16
|
+
const inJoint = child.component("InputChainJoint") as ChainJoint;
|
|
17
|
+
const outJoint = child.component("OutputChainJoint") as ChainJoint;
|
|
18
|
+
|
|
19
|
+
if (index > 0 && inJoint) {
|
|
20
|
+
inJoint.joint.applyTransform(matrix);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
matrix.identity();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (trx) {
|
|
27
|
+
trx.matrix.assign(matrix);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (outJoint) {
|
|
31
|
+
outJoint.joint.applyTransform(matrix);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
clone(): Chain { return new Chain(); }
|
|
38
|
+
assign(other: Chain): void {}
|
|
39
|
+
async deserialize(sceneData: any, loader: any): Promise<void> {}
|
|
40
|
+
|
|
41
|
+
async serialize(sceneData: any, writer: any): Promise<void> {
|
|
42
|
+
await super.serialize(sceneData, writer);
|
|
43
|
+
}
|
|
44
|
+
}
|
package/src/scene/ChainJoint.ts
CHANGED
|
@@ -1,58 +1,58 @@
|
|
|
1
|
-
import Component from "./Component";
|
|
2
|
-
import Joint, { LinkTransformOrder, LinkJoint } from "../phsics/joint";
|
|
3
|
-
|
|
4
|
-
export class ChainJoint extends Component {
|
|
5
|
-
protected _joint: LinkJoint;
|
|
6
|
-
|
|
7
|
-
constructor(typeId: string) {
|
|
8
|
-
super(typeId);
|
|
9
|
-
|
|
10
|
-
this._joint = new LinkJoint();
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
get joint(): LinkJoint { return this._joint; }
|
|
14
|
-
set joint(j: LinkJoint) { this._joint = j; }
|
|
15
|
-
|
|
16
|
-
assign(other: ChainJoint): void {
|
|
17
|
-
this.joint.assign(other.joint);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
async deserialize(sceneData: any, loader: any): Promise<void> {
|
|
21
|
-
const joint: Joint | null = Joint.Factory(sceneData.joint);
|
|
22
|
-
if (joint && joint instanceof LinkJoint) {
|
|
23
|
-
this.joint = joint;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
async serialize(sceneData: any, writer: any): Promise<void> {
|
|
28
|
-
await super.serialize(sceneData, writer);
|
|
29
|
-
sceneData.joint = {};
|
|
30
|
-
this.joint.serialize(sceneData.joint);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export class InputChainJoint extends ChainJoint {
|
|
35
|
-
constructor() {
|
|
36
|
-
super('InputChainJoint');
|
|
37
|
-
this.joint.transformOrder = LinkTransformOrder.ROTATE_TRANSLATE;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
clone(): InputChainJoint {
|
|
41
|
-
const result = new InputChainJoint();
|
|
42
|
-
result.assign(this);
|
|
43
|
-
return result;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export class OutputChainJoint extends ChainJoint {
|
|
48
|
-
constructor() {
|
|
49
|
-
super('OutputChainJoint');
|
|
50
|
-
this.joint.transformOrder = LinkTransformOrder.TRANSLATE_ROTATE;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
clone(): OutputChainJoint {
|
|
54
|
-
const result = new OutputChainJoint();
|
|
55
|
-
result.assign(this);
|
|
56
|
-
return result;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
1
|
+
import Component from "./Component";
|
|
2
|
+
import Joint, { LinkTransformOrder, LinkJoint } from "../phsics/joint";
|
|
3
|
+
|
|
4
|
+
export class ChainJoint extends Component {
|
|
5
|
+
protected _joint: LinkJoint;
|
|
6
|
+
|
|
7
|
+
constructor(typeId: string) {
|
|
8
|
+
super(typeId);
|
|
9
|
+
|
|
10
|
+
this._joint = new LinkJoint();
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
get joint(): LinkJoint { return this._joint; }
|
|
14
|
+
set joint(j: LinkJoint) { this._joint = j; }
|
|
15
|
+
|
|
16
|
+
assign(other: ChainJoint): void {
|
|
17
|
+
this.joint.assign(other.joint);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
async deserialize(sceneData: any, loader: any): Promise<void> {
|
|
21
|
+
const joint: Joint | null = Joint.Factory(sceneData.joint);
|
|
22
|
+
if (joint && joint instanceof LinkJoint) {
|
|
23
|
+
this.joint = joint;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async serialize(sceneData: any, writer: any): Promise<void> {
|
|
28
|
+
await super.serialize(sceneData, writer);
|
|
29
|
+
sceneData.joint = {};
|
|
30
|
+
this.joint.serialize(sceneData.joint);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export class InputChainJoint extends ChainJoint {
|
|
35
|
+
constructor() {
|
|
36
|
+
super('InputChainJoint');
|
|
37
|
+
this.joint.transformOrder = LinkTransformOrder.ROTATE_TRANSLATE;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
clone(): InputChainJoint {
|
|
41
|
+
const result = new InputChainJoint();
|
|
42
|
+
result.assign(this);
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export class OutputChainJoint extends ChainJoint {
|
|
48
|
+
constructor() {
|
|
49
|
+
super('OutputChainJoint');
|
|
50
|
+
this.joint.transformOrder = LinkTransformOrder.TRANSLATE_ROTATE;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
clone(): OutputChainJoint {
|
|
54
|
+
const result = new OutputChainJoint();
|
|
55
|
+
result.assign(this);
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
}
|
package/src/scene/Component.ts
CHANGED
|
@@ -1,177 +1,177 @@
|
|
|
1
|
-
import Renderer from "../render/Renderer";
|
|
2
|
-
import Camera from "./Camera";
|
|
3
|
-
import Drawable from "./Drawable";
|
|
4
|
-
import LightComponent from "./LightComponent";
|
|
5
|
-
import Node from "./Node";
|
|
6
|
-
import Transform from "./Transform";
|
|
7
|
-
import Bg2KeyboardEvent from "../app/Bg2KeyboardEvent";
|
|
8
|
-
import Bg2MouseEvent from "../app/Bg2MouseEvent";
|
|
9
|
-
import Bg2TouchEvent from "../app/Bg2TouchEvent";
|
|
10
|
-
import Loader from "../db/Loader";
|
|
11
|
-
|
|
12
|
-
// Type definitions
|
|
13
|
-
type ComponentConstructor<T extends Component = Component> = new () => T;
|
|
14
|
-
|
|
15
|
-
interface ComponentRegistry {
|
|
16
|
-
[typeId: string]: ComponentConstructor;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const g_componentClasses: ComponentRegistry = {};
|
|
20
|
-
|
|
21
|
-
export const registerComponent = <T extends Component>(
|
|
22
|
-
typeId: string,
|
|
23
|
-
componentClass: ComponentConstructor<T>
|
|
24
|
-
): void => {
|
|
25
|
-
g_componentClasses[typeId] = componentClass;
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
export const createComponent = (typeId: string): Component | null => {
|
|
29
|
-
const ComponentClass = g_componentClasses[typeId];
|
|
30
|
-
if (ComponentClass) {
|
|
31
|
-
try {
|
|
32
|
-
const compInstance = new ComponentClass();
|
|
33
|
-
return compInstance;
|
|
34
|
-
}
|
|
35
|
-
catch (err: any) {
|
|
36
|
-
if (err.code === -1) {
|
|
37
|
-
throw new Error(`Error in component constructor definition. Check the implementation of the '${ typeId }' component constructor. It should call super('typeId') to configure the component type id.`);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
console.debug(`Ignoring component with type id='${typeId}'. If this is not expected, check if the component is registered in the component factory.`);
|
|
43
|
-
return null;
|
|
44
|
-
}
|
|
45
|
-
return null;
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
export const deserializeComponent = async (sceneData: any, loader: Loader): Promise<Component | null> => {
|
|
49
|
-
const componentInstance = createComponent(sceneData.type);
|
|
50
|
-
if (!componentInstance) {
|
|
51
|
-
return null;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
await componentInstance.deserialize(sceneData, loader);
|
|
55
|
-
return componentInstance;
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
export default class Component {
|
|
59
|
-
private _node: any = null;
|
|
60
|
-
private _typeId: string;
|
|
61
|
-
protected _renderer: Renderer | null = null;
|
|
62
|
-
|
|
63
|
-
constructor(typeId: string) {
|
|
64
|
-
if (!typeId) {
|
|
65
|
-
const e: any = new Error("Invalid typeId specified creating component.");
|
|
66
|
-
e.code = -1;
|
|
67
|
-
throw e;
|
|
68
|
-
}
|
|
69
|
-
this._typeId = typeId;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
get node(): Node { return this._node; }
|
|
73
|
-
|
|
74
|
-
get typeId(): string { return this._typeId; }
|
|
75
|
-
|
|
76
|
-
clone(): Component {
|
|
77
|
-
throw new Error("Component.clone() not implemented");
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
assign(other: Component): void {
|
|
81
|
-
throw new Error("Component.assign() not implemented");
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
destroy(): void {
|
|
85
|
-
// Override in subclasses if needed
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
addedToNode(node: Node): void {
|
|
89
|
-
// Override in subclasses if needed
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
removedFromNode(node: Node): void {
|
|
93
|
-
// Override in subclasses if needed
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
async deserialize(sceneData: any, loader: any): Promise<void> {
|
|
97
|
-
// Override in subclasses if needed
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
async serialize(sceneData: any, writer: any): Promise<void> {
|
|
101
|
-
sceneData.type = this.typeId;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
bindRenderer(renderer: Renderer): void {
|
|
105
|
-
if (!(renderer instanceof Renderer)) {
|
|
106
|
-
throw Error("Component.bindRenderer(): invalid renderer. Object is not instance of render.Renderer");
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
this._renderer = renderer;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
async init(): Promise<void> {
|
|
113
|
-
// Override in subclasses if needed
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
get ready(): boolean {
|
|
117
|
-
return this._renderer !== null;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
get renderer(): Renderer | null {
|
|
121
|
-
return this._renderer;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// Access to brother components
|
|
125
|
-
component(identifier: string): Component | undefined {
|
|
126
|
-
return this.node.component(identifier);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
get transform(): Transform | undefined {
|
|
130
|
-
return this.component("Transform") as Transform;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
get lightComponent(): LightComponent | undefined {
|
|
134
|
-
return this.component("Light") as LightComponent;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
get drawable(): Drawable | undefined {
|
|
138
|
-
return this.component("Drawable") as Drawable;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
get camera(): Camera | undefined {
|
|
142
|
-
return this.component("Camera") as Camera;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// Life cycle functions and properties
|
|
146
|
-
get requireWillUpdate(): boolean {
|
|
147
|
-
return typeof((this as any).willUpdate) === "function";
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
get requireUpdate(): boolean {
|
|
151
|
-
return typeof((this as any).update) === "function";
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
get requireDraw(): boolean {
|
|
155
|
-
return typeof((this as any).draw) === "function";
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// The following functions can be implemented in component classes to complete the
|
|
159
|
-
// life cycle functions
|
|
160
|
-
// async init(): Promise<void> {}
|
|
161
|
-
// willUpdate(delta: number): void {}
|
|
162
|
-
// update(delta: number, modelMatrix: any): void {}
|
|
163
|
-
// draw(renderQueue: any, modelMatrix: any): void {}
|
|
164
|
-
|
|
165
|
-
// Event callbacks
|
|
166
|
-
keyDown(evt: Bg2KeyboardEvent): void {}
|
|
167
|
-
keyUp(evt: Bg2KeyboardEvent): void {}
|
|
168
|
-
mouseUp(evt: Bg2MouseEvent): void {}
|
|
169
|
-
mouseDown(evt: Bg2MouseEvent): void {}
|
|
170
|
-
mouseMove(evt: Bg2MouseEvent): void {}
|
|
171
|
-
mouseOut(evt: Bg2MouseEvent): void {}
|
|
172
|
-
mouseDrag(evt: Bg2MouseEvent): void {}
|
|
173
|
-
mouseWheel(evt: Bg2MouseEvent): void {}
|
|
174
|
-
touchStart(evt: Bg2TouchEvent): void {}
|
|
175
|
-
touchMove(evt: Bg2TouchEvent): void {}
|
|
176
|
-
touchEnd(evt: Bg2TouchEvent): void {}
|
|
177
|
-
}
|
|
1
|
+
import Renderer from "../render/Renderer";
|
|
2
|
+
import Camera from "./Camera";
|
|
3
|
+
import Drawable from "./Drawable";
|
|
4
|
+
import LightComponent from "./LightComponent";
|
|
5
|
+
import Node from "./Node";
|
|
6
|
+
import Transform from "./Transform";
|
|
7
|
+
import Bg2KeyboardEvent from "../app/Bg2KeyboardEvent";
|
|
8
|
+
import Bg2MouseEvent from "../app/Bg2MouseEvent";
|
|
9
|
+
import Bg2TouchEvent from "../app/Bg2TouchEvent";
|
|
10
|
+
import Loader from "../db/Loader";
|
|
11
|
+
|
|
12
|
+
// Type definitions
|
|
13
|
+
type ComponentConstructor<T extends Component = Component> = new () => T;
|
|
14
|
+
|
|
15
|
+
interface ComponentRegistry {
|
|
16
|
+
[typeId: string]: ComponentConstructor;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const g_componentClasses: ComponentRegistry = {};
|
|
20
|
+
|
|
21
|
+
export const registerComponent = <T extends Component>(
|
|
22
|
+
typeId: string,
|
|
23
|
+
componentClass: ComponentConstructor<T>
|
|
24
|
+
): void => {
|
|
25
|
+
g_componentClasses[typeId] = componentClass;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export const createComponent = (typeId: string): Component | null => {
|
|
29
|
+
const ComponentClass = g_componentClasses[typeId];
|
|
30
|
+
if (ComponentClass) {
|
|
31
|
+
try {
|
|
32
|
+
const compInstance = new ComponentClass();
|
|
33
|
+
return compInstance;
|
|
34
|
+
}
|
|
35
|
+
catch (err: any) {
|
|
36
|
+
if (err.code === -1) {
|
|
37
|
+
throw new Error(`Error in component constructor definition. Check the implementation of the '${ typeId }' component constructor. It should call super('typeId') to configure the component type id.`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
console.debug(`Ignoring component with type id='${typeId}'. If this is not expected, check if the component is registered in the component factory.`);
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
export const deserializeComponent = async (sceneData: any, loader: Loader): Promise<Component | null> => {
|
|
49
|
+
const componentInstance = createComponent(sceneData.type);
|
|
50
|
+
if (!componentInstance) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
await componentInstance.deserialize(sceneData, loader);
|
|
55
|
+
return componentInstance;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export default class Component {
|
|
59
|
+
private _node: any = null;
|
|
60
|
+
private _typeId: string;
|
|
61
|
+
protected _renderer: Renderer | null = null;
|
|
62
|
+
|
|
63
|
+
constructor(typeId: string) {
|
|
64
|
+
if (!typeId) {
|
|
65
|
+
const e: any = new Error("Invalid typeId specified creating component.");
|
|
66
|
+
e.code = -1;
|
|
67
|
+
throw e;
|
|
68
|
+
}
|
|
69
|
+
this._typeId = typeId;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
get node(): Node { return this._node; }
|
|
73
|
+
|
|
74
|
+
get typeId(): string { return this._typeId; }
|
|
75
|
+
|
|
76
|
+
clone(): Component {
|
|
77
|
+
throw new Error("Component.clone() not implemented");
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
assign(other: Component): void {
|
|
81
|
+
throw new Error("Component.assign() not implemented");
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
destroy(): void {
|
|
85
|
+
// Override in subclasses if needed
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
addedToNode(node: Node): void {
|
|
89
|
+
// Override in subclasses if needed
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
removedFromNode(node: Node): void {
|
|
93
|
+
// Override in subclasses if needed
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
async deserialize(sceneData: any, loader: any): Promise<void> {
|
|
97
|
+
// Override in subclasses if needed
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
async serialize(sceneData: any, writer: any): Promise<void> {
|
|
101
|
+
sceneData.type = this.typeId;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
bindRenderer(renderer: Renderer): void {
|
|
105
|
+
if (!(renderer instanceof Renderer)) {
|
|
106
|
+
throw Error("Component.bindRenderer(): invalid renderer. Object is not instance of render.Renderer");
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
this._renderer = renderer;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async init(): Promise<void> {
|
|
113
|
+
// Override in subclasses if needed
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
get ready(): boolean {
|
|
117
|
+
return this._renderer !== null;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
get renderer(): Renderer | null {
|
|
121
|
+
return this._renderer;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Access to brother components
|
|
125
|
+
component(identifier: string): Component | undefined {
|
|
126
|
+
return this.node.component(identifier);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
get transform(): Transform | undefined {
|
|
130
|
+
return this.component("Transform") as Transform;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
get lightComponent(): LightComponent | undefined {
|
|
134
|
+
return this.component("Light") as LightComponent;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
get drawable(): Drawable | undefined {
|
|
138
|
+
return this.component("Drawable") as Drawable;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
get camera(): Camera | undefined {
|
|
142
|
+
return this.component("Camera") as Camera;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Life cycle functions and properties
|
|
146
|
+
get requireWillUpdate(): boolean {
|
|
147
|
+
return typeof((this as any).willUpdate) === "function";
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
get requireUpdate(): boolean {
|
|
151
|
+
return typeof((this as any).update) === "function";
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
get requireDraw(): boolean {
|
|
155
|
+
return typeof((this as any).draw) === "function";
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// The following functions can be implemented in component classes to complete the
|
|
159
|
+
// life cycle functions
|
|
160
|
+
// async init(): Promise<void> {}
|
|
161
|
+
// willUpdate(delta: number): void {}
|
|
162
|
+
// update(delta: number, modelMatrix: any): void {}
|
|
163
|
+
// draw(renderQueue: any, modelMatrix: any): void {}
|
|
164
|
+
|
|
165
|
+
// Event callbacks
|
|
166
|
+
keyDown(evt: Bg2KeyboardEvent): void {}
|
|
167
|
+
keyUp(evt: Bg2KeyboardEvent): void {}
|
|
168
|
+
mouseUp(evt: Bg2MouseEvent): void {}
|
|
169
|
+
mouseDown(evt: Bg2MouseEvent): void {}
|
|
170
|
+
mouseMove(evt: Bg2MouseEvent): void {}
|
|
171
|
+
mouseOut(evt: Bg2MouseEvent): void {}
|
|
172
|
+
mouseDrag(evt: Bg2MouseEvent): void {}
|
|
173
|
+
mouseWheel(evt: Bg2MouseEvent): void {}
|
|
174
|
+
touchStart(evt: Bg2TouchEvent): void {}
|
|
175
|
+
touchMove(evt: Bg2TouchEvent): void {}
|
|
176
|
+
touchEnd(evt: Bg2TouchEvent): void {}
|
|
177
|
+
}
|