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
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
import type Renderer from "./Renderer";
|
|
2
|
-
import type PolyList from "../base/PolyList";
|
|
3
|
-
|
|
4
|
-
export default class PolyListRenderer {
|
|
5
|
-
protected _renderer: Renderer;
|
|
6
|
-
protected _polyList: PolyList;
|
|
7
|
-
|
|
8
|
-
constructor(renderer: Renderer, polyList: PolyList) {
|
|
9
|
-
if ((polyList as any).renderer) {
|
|
10
|
-
throw new Error("Invalid initialization of polyList renderer: the polyList is already controlled by another polyList renderer.")
|
|
11
|
-
}
|
|
12
|
-
this._renderer = renderer;
|
|
13
|
-
this._polyList = polyList;
|
|
14
|
-
(this._polyList as any)._renderer = this;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
get polyList(): PolyList {
|
|
18
|
-
return this._polyList;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
get renderer(): Renderer {
|
|
22
|
-
return this._renderer;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
init(): void {
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
// Updates the internal state of the renderer. It is necessary to call this
|
|
30
|
-
// function if the polyList has been modified, so that the internal objects
|
|
31
|
-
// of the specific rendering API are updated.
|
|
32
|
-
refresh(): void {
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
bindBuffers(): void {
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
draw(): void {
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
destroy(): void {
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
}
|
|
1
|
+
import type Renderer from "./Renderer";
|
|
2
|
+
import type PolyList from "../base/PolyList";
|
|
3
|
+
|
|
4
|
+
export default class PolyListRenderer {
|
|
5
|
+
protected _renderer: Renderer;
|
|
6
|
+
protected _polyList: PolyList;
|
|
7
|
+
|
|
8
|
+
constructor(renderer: Renderer, polyList: PolyList) {
|
|
9
|
+
if ((polyList as any).renderer) {
|
|
10
|
+
throw new Error("Invalid initialization of polyList renderer: the polyList is already controlled by another polyList renderer.")
|
|
11
|
+
}
|
|
12
|
+
this._renderer = renderer;
|
|
13
|
+
this._polyList = polyList;
|
|
14
|
+
(this._polyList as any)._renderer = this;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
get polyList(): PolyList {
|
|
18
|
+
return this._polyList;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
get renderer(): Renderer {
|
|
22
|
+
return this._renderer;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
init(): void {
|
|
26
|
+
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Updates the internal state of the renderer. It is necessary to call this
|
|
30
|
+
// function if the polyList has been modified, so that the internal objects
|
|
31
|
+
// of the specific rendering API are updated.
|
|
32
|
+
refresh(): void {
|
|
33
|
+
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
bindBuffers(): void {
|
|
37
|
+
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
draw(): void {
|
|
41
|
+
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
destroy(): void {
|
|
45
|
+
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -1,197 +1,197 @@
|
|
|
1
|
-
import Texture, { TextureDataType, TextureTarget, TextureRenderTargetAttachmentNames } from "../base/Texture";
|
|
2
|
-
import Vec from "../math/Vec";
|
|
3
|
-
import Mat4 from "../math/Mat4";
|
|
4
|
-
|
|
5
|
-
export enum RenderBufferType {
|
|
6
|
-
UNINITIALIZED = 0,
|
|
7
|
-
TEXTURE = 1,
|
|
8
|
-
CUBE_MAP = 2
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export const RenderBufferTypeName: Record<RenderBufferType, string> = {
|
|
12
|
-
[RenderBufferType.UNINITIALIZED]: 'UNINITIALIZED',
|
|
13
|
-
[RenderBufferType.TEXTURE]: 'TEXTURE',
|
|
14
|
-
[RenderBufferType.CUBE_MAP]: 'CUBE_MAP'
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
export enum CubeMapFace {
|
|
18
|
-
NONE = 0,
|
|
19
|
-
POSITIVE_X = 1,
|
|
20
|
-
NEGATIVE_X = 2,
|
|
21
|
-
POSITIVE_Y = 3,
|
|
22
|
-
NEGATIVE_Y = 4,
|
|
23
|
-
POSITIVE_Z = 5,
|
|
24
|
-
NEGATIVE_Z = 6
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export type DrawFunc = (face?: CubeMapFace, viewMatrix?: Mat4, projectionMatrix?: Mat4) => void;
|
|
28
|
-
|
|
29
|
-
function getTargetType(texture: Texture): RenderBufferType | undefined {
|
|
30
|
-
if (texture.target === TextureTarget.TEXTURE_2D) {
|
|
31
|
-
return RenderBufferType.TEXTURE;
|
|
32
|
-
}
|
|
33
|
-
else if (texture.target === TextureTarget.CUBE_MAP) {
|
|
34
|
-
return RenderBufferType.CUBE_MAP;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function getRenderBufferTypeName(type: RenderBufferType): string {
|
|
39
|
-
return RenderBufferTypeName[type];
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
export default class RenderBuffer {
|
|
44
|
-
protected _renderer: any;
|
|
45
|
-
protected _attachments: Record<string, any>;
|
|
46
|
-
protected _size: Vec;
|
|
47
|
-
protected _dirty: boolean;
|
|
48
|
-
protected _type: RenderBufferType;
|
|
49
|
-
|
|
50
|
-
constructor(renderer: any, size: Vec = new Vec([512,512])) {
|
|
51
|
-
this._renderer = renderer;
|
|
52
|
-
this._attachments = {};
|
|
53
|
-
this._size = size;
|
|
54
|
-
this._dirty = true;
|
|
55
|
-
this._type = RenderBufferType.UNINITIALIZED;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
get renderer(): any { return this._renderer; }
|
|
59
|
-
|
|
60
|
-
get type(): RenderBufferType { return this._type; }
|
|
61
|
-
|
|
62
|
-
get size(): Vec { return this._size; }
|
|
63
|
-
|
|
64
|
-
set size(s: Vec | number[]) {
|
|
65
|
-
this._size = new Vec(s);
|
|
66
|
-
for (const att in this.attachments) {
|
|
67
|
-
const textureRenderer = this.attachments[att];
|
|
68
|
-
const texture = textureRenderer.texture;
|
|
69
|
-
if (!Vec.Equals(texture.size, this.size)) {
|
|
70
|
-
texture.size = this.size;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
this._dirty = true;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// This is an object of type { TextureRenderTargetAttachmentName: TextureRenderer }
|
|
77
|
-
get attachments(): Record<string, any> { return this._attachments; }
|
|
78
|
-
|
|
79
|
-
getTextureRenderer(attachment: string): any {
|
|
80
|
-
return this._attachments[attachment];
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
getTexture(attachment: string): Texture | undefined {
|
|
84
|
-
return this.getTextureRenderer(attachment)?.texture;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
get dirty(): boolean { return this._dirty; }
|
|
88
|
-
|
|
89
|
-
setUpdated(updated: boolean = true): void { this._dirty = !updated; }
|
|
90
|
-
|
|
91
|
-
async attachTexture(texture: Texture): Promise<void> {
|
|
92
|
-
if (this._attachments[texture.renderTargetAttachment]) {
|
|
93
|
-
throw new Error(`RenderBuffer.attachTexture(): The attachment is occupied by another texture ${TextureRenderTargetAttachmentNames[texture.renderTargetAttachment]}`);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
if (this.type !== RenderBufferType.UNINITIALIZED) {
|
|
97
|
-
const type = getTargetType(texture);
|
|
98
|
-
if (this.type !== type) {
|
|
99
|
-
throw new Error(`Invalid texture attachment. RenderBuffer is ${ getRenderBufferTypeName(this.type) }, but the new attachment is ${ getRenderBufferTypeName(type || RenderBufferType.UNINITIALIZED) }`);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
this._type = getTargetType(texture) || RenderBufferType.UNINITIALIZED;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
texture.dataType = TextureDataType.RENDER_TARGET;
|
|
107
|
-
texture.size = this.size;
|
|
108
|
-
await texture.loadImageData();
|
|
109
|
-
const textureRenderer = this.renderer.factory.texture(texture);
|
|
110
|
-
this._attachments[texture.renderTargetAttachment] = textureRenderer;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
detachTexture(texture: Texture): void {
|
|
114
|
-
const textureRenderer = this._attachments[texture.renderTargetAttachment];
|
|
115
|
-
if (!textureRenderer) {
|
|
116
|
-
throw new Error(`RenderBuffer.detachTexture(): no texture attached to ${TextureRenderTargetAttachmentNames[texture.renderTargetAttachment]}`);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
if (textureRenderer.texture !== texture) {
|
|
120
|
-
throw new Error(`RenderBuffer.detachTexture(): the texture is not attached to ${TextureRenderTargetAttachmentNames[texture.renderTargetAttachment]}`);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
this._attachments[texture.renderTargetAttachment] = null;
|
|
124
|
-
textureRenderer.deleteTexture();
|
|
125
|
-
this._dirty = true;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
beginUpdate(textureFace: CubeMapFace = CubeMapFace.NONE): void {
|
|
129
|
-
throw new Error("RenderBuffer.beginUpdate(): calling base implementation.");
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
endUpdate(textureFace: CubeMapFace = CubeMapFace.NONE): void {
|
|
133
|
-
throw new Error("RenderBuffer.endUpdate(): calling base implementation.");
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
destroy(): void {
|
|
137
|
-
throw new Error("RenderBuffer.destory(): calling base implementation.");
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
get frameBuffer(): any {
|
|
141
|
-
throw new Error("RenderBuffer.frameBuffer: calling base implementation");
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
// Save and restore buffer states must save the currently binded array buffer and restore it
|
|
145
|
-
saveVertexBufferState(): void {
|
|
146
|
-
throw new Error("RenderBuffer.saveVertexBufferState: callig base implementation");
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
restoreVertexBufferState(): void {
|
|
150
|
-
throw new Error("RenderBuffer.restoreVertexBufferState: calling base implementation");
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
update(drawFunc: DrawFunc): void {
|
|
154
|
-
this.saveVertexBufferState();
|
|
155
|
-
if (this.type === RenderBufferType.TEXTURE) {
|
|
156
|
-
this.beginUpdate();
|
|
157
|
-
drawFunc();
|
|
158
|
-
this.endUpdate();
|
|
159
|
-
}
|
|
160
|
-
else if (this.type === RenderBufferType.CUBE_MAP) {
|
|
161
|
-
const viewMatrix = Mat4.MakeIdentity();
|
|
162
|
-
const projectionMatrix = Mat4.MakePerspective(90, 1, 0.1, 100000);
|
|
163
|
-
for (let i = 0; i<6; ++i) {
|
|
164
|
-
const face = CubeMapFace.POSITIVE_X + i;
|
|
165
|
-
switch (face) {
|
|
166
|
-
case CubeMapFace.POSITIVE_X:
|
|
167
|
-
viewMatrix.lookAt(new Vec([-1, 0, 0]), new Vec([0, 0, 0]), new Vec([0,-1, 0]));
|
|
168
|
-
break;
|
|
169
|
-
case CubeMapFace.NEGATIVE_X:
|
|
170
|
-
viewMatrix.lookAt(new Vec([ 1, 0, 0]), new Vec([0, 0, 0]), new Vec([0,-1, 0]));
|
|
171
|
-
break;
|
|
172
|
-
case CubeMapFace.POSITIVE_Y:
|
|
173
|
-
viewMatrix.lookAt(new Vec([ 0,-1, 0]), new Vec([0, 0, 0]), new Vec([0, 0, 1]));
|
|
174
|
-
break;
|
|
175
|
-
case CubeMapFace.NEGATIVE_Y:
|
|
176
|
-
viewMatrix.lookAt(new Vec([ 0, 1, 0]), new Vec([0, 0, 0]), new Vec([0, 0,-1]));
|
|
177
|
-
break;
|
|
178
|
-
case CubeMapFace.POSITIVE_Z:
|
|
179
|
-
viewMatrix.lookAt(new Vec([ 0, 0,-1]), new Vec([0, 0, 0]), new Vec([0,-1, 0]));
|
|
180
|
-
break;
|
|
181
|
-
case CubeMapFace.NEGATIVE_Z:
|
|
182
|
-
viewMatrix.lookAt(new Vec([ 0, 0, 1]), new Vec([0, 0, 0]), new Vec([0,-1, 0]));
|
|
183
|
-
break;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
this.beginUpdate(face);
|
|
187
|
-
drawFunc(face,viewMatrix,projectionMatrix);
|
|
188
|
-
this.endUpdate(face);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
this.restoreVertexBufferState();
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
readPixels(x: number, y: number, width: number, height: number): Uint8Array | undefined {
|
|
195
|
-
return undefined;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
1
|
+
import Texture, { TextureDataType, TextureTarget, TextureRenderTargetAttachmentNames } from "../base/Texture";
|
|
2
|
+
import Vec from "../math/Vec";
|
|
3
|
+
import Mat4 from "../math/Mat4";
|
|
4
|
+
|
|
5
|
+
export enum RenderBufferType {
|
|
6
|
+
UNINITIALIZED = 0,
|
|
7
|
+
TEXTURE = 1,
|
|
8
|
+
CUBE_MAP = 2
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const RenderBufferTypeName: Record<RenderBufferType, string> = {
|
|
12
|
+
[RenderBufferType.UNINITIALIZED]: 'UNINITIALIZED',
|
|
13
|
+
[RenderBufferType.TEXTURE]: 'TEXTURE',
|
|
14
|
+
[RenderBufferType.CUBE_MAP]: 'CUBE_MAP'
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export enum CubeMapFace {
|
|
18
|
+
NONE = 0,
|
|
19
|
+
POSITIVE_X = 1,
|
|
20
|
+
NEGATIVE_X = 2,
|
|
21
|
+
POSITIVE_Y = 3,
|
|
22
|
+
NEGATIVE_Y = 4,
|
|
23
|
+
POSITIVE_Z = 5,
|
|
24
|
+
NEGATIVE_Z = 6
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export type DrawFunc = (face?: CubeMapFace, viewMatrix?: Mat4, projectionMatrix?: Mat4) => void;
|
|
28
|
+
|
|
29
|
+
function getTargetType(texture: Texture): RenderBufferType | undefined {
|
|
30
|
+
if (texture.target === TextureTarget.TEXTURE_2D) {
|
|
31
|
+
return RenderBufferType.TEXTURE;
|
|
32
|
+
}
|
|
33
|
+
else if (texture.target === TextureTarget.CUBE_MAP) {
|
|
34
|
+
return RenderBufferType.CUBE_MAP;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function getRenderBufferTypeName(type: RenderBufferType): string {
|
|
39
|
+
return RenderBufferTypeName[type];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
export default class RenderBuffer {
|
|
44
|
+
protected _renderer: any;
|
|
45
|
+
protected _attachments: Record<string, any>;
|
|
46
|
+
protected _size: Vec;
|
|
47
|
+
protected _dirty: boolean;
|
|
48
|
+
protected _type: RenderBufferType;
|
|
49
|
+
|
|
50
|
+
constructor(renderer: any, size: Vec = new Vec([512,512])) {
|
|
51
|
+
this._renderer = renderer;
|
|
52
|
+
this._attachments = {};
|
|
53
|
+
this._size = size;
|
|
54
|
+
this._dirty = true;
|
|
55
|
+
this._type = RenderBufferType.UNINITIALIZED;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
get renderer(): any { return this._renderer; }
|
|
59
|
+
|
|
60
|
+
get type(): RenderBufferType { return this._type; }
|
|
61
|
+
|
|
62
|
+
get size(): Vec { return this._size; }
|
|
63
|
+
|
|
64
|
+
set size(s: Vec | number[]) {
|
|
65
|
+
this._size = new Vec(s);
|
|
66
|
+
for (const att in this.attachments) {
|
|
67
|
+
const textureRenderer = this.attachments[att];
|
|
68
|
+
const texture = textureRenderer.texture;
|
|
69
|
+
if (!Vec.Equals(texture.size, this.size)) {
|
|
70
|
+
texture.size = this.size;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
this._dirty = true;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// This is an object of type { TextureRenderTargetAttachmentName: TextureRenderer }
|
|
77
|
+
get attachments(): Record<string, any> { return this._attachments; }
|
|
78
|
+
|
|
79
|
+
getTextureRenderer(attachment: string): any {
|
|
80
|
+
return this._attachments[attachment];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
getTexture(attachment: string): Texture | undefined {
|
|
84
|
+
return this.getTextureRenderer(attachment)?.texture;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
get dirty(): boolean { return this._dirty; }
|
|
88
|
+
|
|
89
|
+
setUpdated(updated: boolean = true): void { this._dirty = !updated; }
|
|
90
|
+
|
|
91
|
+
async attachTexture(texture: Texture): Promise<void> {
|
|
92
|
+
if (this._attachments[texture.renderTargetAttachment]) {
|
|
93
|
+
throw new Error(`RenderBuffer.attachTexture(): The attachment is occupied by another texture ${TextureRenderTargetAttachmentNames[texture.renderTargetAttachment]}`);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (this.type !== RenderBufferType.UNINITIALIZED) {
|
|
97
|
+
const type = getTargetType(texture);
|
|
98
|
+
if (this.type !== type) {
|
|
99
|
+
throw new Error(`Invalid texture attachment. RenderBuffer is ${ getRenderBufferTypeName(this.type) }, but the new attachment is ${ getRenderBufferTypeName(type || RenderBufferType.UNINITIALIZED) }`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
this._type = getTargetType(texture) || RenderBufferType.UNINITIALIZED;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
texture.dataType = TextureDataType.RENDER_TARGET;
|
|
107
|
+
texture.size = this.size;
|
|
108
|
+
await texture.loadImageData();
|
|
109
|
+
const textureRenderer = this.renderer.factory.texture(texture);
|
|
110
|
+
this._attachments[texture.renderTargetAttachment] = textureRenderer;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
detachTexture(texture: Texture): void {
|
|
114
|
+
const textureRenderer = this._attachments[texture.renderTargetAttachment];
|
|
115
|
+
if (!textureRenderer) {
|
|
116
|
+
throw new Error(`RenderBuffer.detachTexture(): no texture attached to ${TextureRenderTargetAttachmentNames[texture.renderTargetAttachment]}`);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (textureRenderer.texture !== texture) {
|
|
120
|
+
throw new Error(`RenderBuffer.detachTexture(): the texture is not attached to ${TextureRenderTargetAttachmentNames[texture.renderTargetAttachment]}`);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
this._attachments[texture.renderTargetAttachment] = null;
|
|
124
|
+
textureRenderer.deleteTexture();
|
|
125
|
+
this._dirty = true;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
beginUpdate(textureFace: CubeMapFace = CubeMapFace.NONE): void {
|
|
129
|
+
throw new Error("RenderBuffer.beginUpdate(): calling base implementation.");
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
endUpdate(textureFace: CubeMapFace = CubeMapFace.NONE): void {
|
|
133
|
+
throw new Error("RenderBuffer.endUpdate(): calling base implementation.");
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
destroy(): void {
|
|
137
|
+
throw new Error("RenderBuffer.destory(): calling base implementation.");
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
get frameBuffer(): any {
|
|
141
|
+
throw new Error("RenderBuffer.frameBuffer: calling base implementation");
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Save and restore buffer states must save the currently binded array buffer and restore it
|
|
145
|
+
saveVertexBufferState(): void {
|
|
146
|
+
throw new Error("RenderBuffer.saveVertexBufferState: callig base implementation");
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
restoreVertexBufferState(): void {
|
|
150
|
+
throw new Error("RenderBuffer.restoreVertexBufferState: calling base implementation");
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
update(drawFunc: DrawFunc): void {
|
|
154
|
+
this.saveVertexBufferState();
|
|
155
|
+
if (this.type === RenderBufferType.TEXTURE) {
|
|
156
|
+
this.beginUpdate();
|
|
157
|
+
drawFunc();
|
|
158
|
+
this.endUpdate();
|
|
159
|
+
}
|
|
160
|
+
else if (this.type === RenderBufferType.CUBE_MAP) {
|
|
161
|
+
const viewMatrix = Mat4.MakeIdentity();
|
|
162
|
+
const projectionMatrix = Mat4.MakePerspective(90, 1, 0.1, 100000);
|
|
163
|
+
for (let i = 0; i<6; ++i) {
|
|
164
|
+
const face = CubeMapFace.POSITIVE_X + i;
|
|
165
|
+
switch (face) {
|
|
166
|
+
case CubeMapFace.POSITIVE_X:
|
|
167
|
+
viewMatrix.lookAt(new Vec([-1, 0, 0]), new Vec([0, 0, 0]), new Vec([0,-1, 0]));
|
|
168
|
+
break;
|
|
169
|
+
case CubeMapFace.NEGATIVE_X:
|
|
170
|
+
viewMatrix.lookAt(new Vec([ 1, 0, 0]), new Vec([0, 0, 0]), new Vec([0,-1, 0]));
|
|
171
|
+
break;
|
|
172
|
+
case CubeMapFace.POSITIVE_Y:
|
|
173
|
+
viewMatrix.lookAt(new Vec([ 0,-1, 0]), new Vec([0, 0, 0]), new Vec([0, 0, 1]));
|
|
174
|
+
break;
|
|
175
|
+
case CubeMapFace.NEGATIVE_Y:
|
|
176
|
+
viewMatrix.lookAt(new Vec([ 0, 1, 0]), new Vec([0, 0, 0]), new Vec([0, 0,-1]));
|
|
177
|
+
break;
|
|
178
|
+
case CubeMapFace.POSITIVE_Z:
|
|
179
|
+
viewMatrix.lookAt(new Vec([ 0, 0,-1]), new Vec([0, 0, 0]), new Vec([0,-1, 0]));
|
|
180
|
+
break;
|
|
181
|
+
case CubeMapFace.NEGATIVE_Z:
|
|
182
|
+
viewMatrix.lookAt(new Vec([ 0, 0, 1]), new Vec([0, 0, 0]), new Vec([0,-1, 0]));
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
this.beginUpdate(face);
|
|
187
|
+
drawFunc(face,viewMatrix,projectionMatrix);
|
|
188
|
+
this.endUpdate(face);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
this.restoreVertexBufferState();
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
readPixels(x: number, y: number, width: number, height: number): Uint8Array | undefined {
|
|
195
|
+
return undefined;
|
|
196
|
+
}
|
|
197
|
+
}
|