bg2e-js 2.1.2 → 2.2.1
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 +7031 -6989
- package/dist/bg2e-js.js.map +1 -1
- package/package.json +20 -2
- package/src/app/AppController.ts +39 -0
- package/src/app/Bg2KeyboardEvent.ts +54 -0
- package/src/app/Bg2MouseEvent.ts +82 -0
- package/src/app/Bg2TouchEvent.ts +18 -0
- package/src/app/Canvas.ts +108 -0
- package/src/app/EventBase.ts +10 -0
- package/src/app/MainLoop.ts +273 -0
- package/src/app/index.ts +25 -0
- package/src/base/Color.ts +134 -0
- package/src/base/Environment.ts +183 -0
- package/src/base/Light.ts +192 -0
- package/src/base/Material.ts +619 -0
- package/src/base/PolyList.ts +365 -0
- package/src/base/Texture.ts +620 -0
- package/src/base/index.ts +81 -0
- package/src/db/Bg2LoaderPlugin.ts +129 -0
- package/src/db/DBPluginApi.ts +48 -0
- package/src/db/Loader.ts +116 -0
- package/src/db/LoaderPlugin.ts +34 -0
- package/src/db/MtlParser.ts +7 -0
- package/src/db/ObjLoaderPlugin.ts +55 -0
- package/src/db/ObjParser.ts +252 -0
- package/src/db/ObjWriterPlugin.ts +19 -0
- package/src/db/VitscnjLoaderPlugin.ts +100 -0
- package/src/db/Writer.ts +52 -0
- package/src/db/WriterPlugin.ts +22 -0
- package/src/db/index.ts +44 -0
- package/src/debug/DebugRenderer.ts +173 -0
- package/src/debug/WebGLTextureViewer.ts +75 -0
- package/src/debug/index.ts +7 -0
- package/src/index.html +11 -0
- package/src/index.ts +33 -0
- package/src/manipulation/SelectionBuffer.ts +82 -0
- package/src/manipulation/SelectionHighlight.ts +85 -0
- package/src/manipulation/SelectionIdAssignVisitor.ts +97 -0
- package/src/manipulation/SelectionManager.ts +166 -0
- package/src/manipulation/SelectionMode.ts +6 -0
- package/src/math/Mat3.ts +259 -0
- package/src/math/Mat4.ts +706 -0
- package/src/math/MatrixStrategy.ts +25 -0
- package/src/math/Quat.ts +65 -0
- package/src/math/Vec.ts +753 -0
- package/src/math/constants.ts +47 -0
- package/src/math/functions.ts +103 -0
- package/src/math/index.ts +74 -0
- package/src/phsics/joint.ts +137 -0
- package/src/primitives/arrow.ts +58 -0
- package/src/primitives/cone.ts +138 -0
- package/src/primitives/cube.ts +60 -0
- package/src/primitives/cylinder.ts +216 -0
- package/src/primitives/index.ts +13 -0
- package/src/primitives/plane.ts +31 -0
- package/src/primitives/sphere.ts +809 -0
- package/src/render/BRDFIntegrationMap.ts +4 -0
- package/src/render/Environment.ts +136 -0
- package/src/render/FrameBuffer.ts +35 -0
- package/src/render/MaterialRenderer.ts +34 -0
- package/src/render/Pipeline.ts +109 -0
- package/src/render/PolyListRenderer.ts +47 -0
- package/src/render/RenderBuffer.ts +197 -0
- package/src/render/RenderQueue.ts +199 -0
- package/src/render/RenderState.ts +116 -0
- package/src/render/Renderer.ts +248 -0
- package/src/render/SceneAppController.ts +238 -0
- package/src/render/SceneRenderer.ts +373 -0
- package/src/render/Shader.ts +32 -0
- package/src/render/ShadowRenderer.ts +176 -0
- package/src/render/SkyCube.ts +106 -0
- package/src/render/SkySphere.ts +118 -0
- package/src/render/TextureMergerRenderer.ts +70 -0
- package/src/render/TextureRenderer.ts +34 -0
- package/src/render/index.ts +67 -0
- package/src/render/webgl/FrameBuffer.ts +10 -0
- package/src/render/webgl/MaterialRenderer.ts +113 -0
- package/src/render/webgl/Pipeline.ts +89 -0
- package/src/render/webgl/PolyListRenderer.ts +260 -0
- package/src/render/webgl/RenderBuffer.ts +227 -0
- package/src/render/webgl/Renderer.ts +262 -0
- package/src/render/webgl/SceneRenderer.ts +68 -0
- package/src/render/webgl/ShaderProgram.ts +424 -0
- package/src/render/webgl/ShadowRenderer.ts +6 -0
- package/src/render/webgl/SkyCube.ts +16 -0
- package/src/render/webgl/SkySphere.ts +16 -0
- package/src/render/webgl/State.ts +152 -0
- package/src/render/webgl/TextureRenderer.ts +167 -0
- package/src/render/webgl/VertexBuffer.ts +137 -0
- package/src/render/webgl/index.ts +35 -0
- package/src/scene/Camera.ts +458 -0
- package/src/scene/Chain.ts +44 -0
- package/src/scene/ChainJoint.ts +58 -0
- package/src/scene/Component.ts +173 -0
- package/src/scene/ComponentMap.ts +107 -0
- package/src/scene/Drawable.ts +154 -0
- package/src/scene/EnvironmentComponent.ts +142 -0
- package/src/scene/FindNodeVisitor.ts +60 -0
- package/src/scene/LightComponent.ts +155 -0
- package/src/scene/MatrixState.ts +46 -0
- package/src/scene/Node.ts +314 -0
- package/src/scene/NodeVisitor.ts +15 -0
- package/src/scene/OrbitCameraController.ts +450 -0
- package/src/scene/SmoothOrbitCameraController.ts +99 -0
- package/src/scene/Transform.ts +73 -0
- package/src/scene/index.ts +57 -0
- package/src/shaders/BasicDiffuseColorShader.ts +111 -0
- package/src/shaders/BasicPBRLightShader.ts +277 -0
- package/src/shaders/DebugRenderShader.ts +98 -0
- package/src/shaders/DepthRenderShader.ts +91 -0
- package/src/shaders/IrradianceMapCubeShader.ts +116 -0
- package/src/shaders/PBRLightIBLShader.ts +487 -0
- package/src/shaders/PickSelectionShader.ts +101 -0
- package/src/shaders/PresentDebugFramebufferShader.ts +118 -0
- package/src/shaders/PresentTextureShader.ts +99 -0
- package/src/shaders/SelectionHighlightShader.ts +127 -0
- package/src/shaders/ShaderFunction.ts +318 -0
- package/src/shaders/SkyCubeShader.ts +94 -0
- package/src/shaders/SkySphereShader.ts +102 -0
- package/src/shaders/SpecularMapCubeShader.ts +165 -0
- package/src/shaders/TextureMergerShader.ts +171 -0
- package/src/shaders/index.ts +37 -0
- package/src/shaders/webgl/color_correction.glsl +47 -0
- package/src/shaders/webgl/constants.glsl +6 -0
- package/src/shaders/webgl/index.ts +70 -0
- package/src/shaders/webgl/normal_map.glsl +9 -0
- package/src/shaders/webgl/pbr.glsl +173 -0
- package/src/shaders/webgl/uniforms.glsl +91 -0
- package/src/shaders/webgl_shader_lib.ts +213 -0
- package/src/tools/BinaryResourceProvider.ts +14 -0
- package/src/tools/ImageResourceProvider.ts +66 -0
- package/src/tools/MaterialModifier.ts +276 -0
- package/src/tools/Resource.ts +203 -0
- package/src/tools/ResourceProvider.ts +69 -0
- package/src/tools/TextResourceProvider.ts +24 -0
- package/src/tools/TextureCache.ts +52 -0
- package/src/tools/TextureResourceDatabase.ts +100 -0
- package/src/tools/UserAgent.ts +362 -0
- package/src/tools/VideoResourceProvider.ts +50 -0
- package/src/tools/WriteStrategy.ts +22 -0
- package/src/tools/base64.ts +11 -0
- package/src/tools/crypto.ts +19 -0
- package/src/tools/endiantess.ts +13 -0
- package/src/tools/image.ts +18 -0
- package/src/tools/index.ts +41 -0
- package/src/tools/processType.ts +38 -0
- package/src/vite-env.d.ts +12 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import Texture, { TextureRenderTargetAttachment, TextureTarget } from "../base/Texture";
|
|
2
|
+
import IrradianceMapCubeShader from "../shaders/IrradianceMapCubeShader";
|
|
3
|
+
import SpecularMapCubeShader from "../shaders/SpecularMapCubeShader";
|
|
4
|
+
import RenderBuffer from "./RenderBuffer";
|
|
5
|
+
import Renderer from "./Renderer";
|
|
6
|
+
import SkySphere from "./SkySphere";
|
|
7
|
+
import SkyCube from "./SkyCube";
|
|
8
|
+
import Mat4 from "../math/Mat4";
|
|
9
|
+
|
|
10
|
+
type TextureResources = {
|
|
11
|
+
renderer: Renderer;
|
|
12
|
+
texture: Texture;
|
|
13
|
+
renderBuffer: RenderBuffer;
|
|
14
|
+
skyShape: SkySphere | SkyCube | null;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const createTextureResources = async (renderer: Renderer, size: [number, number]) : Promise<TextureResources> => {
|
|
18
|
+
const texture = new Texture();
|
|
19
|
+
texture.renderTargetAttachment = TextureRenderTargetAttachment.COLOR_ATTACHMENT_0;
|
|
20
|
+
texture.target = TextureTarget.CUBE_MAP;
|
|
21
|
+
|
|
22
|
+
const renderBuffer = renderer.factory.renderBuffer();
|
|
23
|
+
await renderBuffer.attachTexture(texture);
|
|
24
|
+
renderBuffer.size = size;
|
|
25
|
+
|
|
26
|
+
return { renderer, texture, renderBuffer, skyShape: null };
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const destroyTextureResources = (resources: TextureResources) => {
|
|
30
|
+
resources.texture.destroy();
|
|
31
|
+
resources.renderBuffer.destroy();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const updateMap = (mapResources: TextureResources) => {
|
|
35
|
+
const { renderBuffer, skyShape } = mapResources;
|
|
36
|
+
renderBuffer.update((face,viewMatrix,projectionMatrix) => {
|
|
37
|
+
mapResources.renderer.clearBuffer();
|
|
38
|
+
skyShape?.updateRenderState({
|
|
39
|
+
viewMatrix: viewMatrix || Mat4.MakeIdentity(),
|
|
40
|
+
projectionMatrix
|
|
41
|
+
});
|
|
42
|
+
skyShape?.draw();
|
|
43
|
+
})
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export default class Environment {
|
|
47
|
+
protected _renderer: Renderer;
|
|
48
|
+
protected _updated: boolean = false;
|
|
49
|
+
|
|
50
|
+
protected _environmentMapResources: TextureResources | null = null;
|
|
51
|
+
protected _specularMapResources: TextureResources | null = null;
|
|
52
|
+
protected _irradianceMapResources: TextureResources | null = null;
|
|
53
|
+
protected _envMapSize: [number, number] = [512, 512];
|
|
54
|
+
protected _specMapSize: [number, number] = [128, 128];
|
|
55
|
+
protected _irrMapSize: [number, number] = [32, 32];
|
|
56
|
+
|
|
57
|
+
constructor(renderer: Renderer) {
|
|
58
|
+
this._renderer = renderer;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
get renderer() {
|
|
62
|
+
return this._renderer;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
get updated() {
|
|
66
|
+
return this._updated;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
get environmentMap(): Texture | null {
|
|
70
|
+
return this._environmentMapResources?.texture || null;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
get specularMap(): Texture | null {
|
|
74
|
+
return this._specularMapResources?.texture || null;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
get irradianceMap(): Texture | null {
|
|
78
|
+
return this._irradianceMapResources?.texture || null;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async load({
|
|
82
|
+
textureUrl = null,
|
|
83
|
+
environmentMapSize = [ 512, 512 ],
|
|
84
|
+
specularMapSize = [ 128, 128 ],
|
|
85
|
+
irradianceMapSize = [32, 32]
|
|
86
|
+
} : {
|
|
87
|
+
textureUrl?: string | null,
|
|
88
|
+
environmentMapSize?: [number, number],
|
|
89
|
+
specularMapSize?: [number, number],
|
|
90
|
+
irradianceMapSize?: [number, number]
|
|
91
|
+
} = {}): Promise<void> {
|
|
92
|
+
this._envMapSize = environmentMapSize;
|
|
93
|
+
this._specMapSize = specularMapSize;
|
|
94
|
+
this._irrMapSize = irradianceMapSize;
|
|
95
|
+
|
|
96
|
+
this._environmentMapResources = await createTextureResources(this.renderer, environmentMapSize);
|
|
97
|
+
const envShape = this.renderer.factory.skySphere();
|
|
98
|
+
await envShape.load(textureUrl || null);
|
|
99
|
+
this._environmentMapResources.skyShape = envShape;
|
|
100
|
+
|
|
101
|
+
this._specularMapResources = await createTextureResources(this.renderer, specularMapSize);
|
|
102
|
+
const specShape = this.renderer.factory.skyCube();
|
|
103
|
+
specShape.load(this._environmentMapResources.texture, SpecularMapCubeShader, [0.5]);
|
|
104
|
+
this._specularMapResources.skyShape = specShape;
|
|
105
|
+
|
|
106
|
+
this._irradianceMapResources = await createTextureResources(this.renderer, irradianceMapSize);
|
|
107
|
+
const irrShape = this.renderer.factory.skyCube();
|
|
108
|
+
await irrShape.load(this._environmentMapResources.texture, IrradianceMapCubeShader);
|
|
109
|
+
this._irradianceMapResources.skyShape = irrShape;
|
|
110
|
+
this._updated = false;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
destroy() {
|
|
114
|
+
this._environmentMapResources && destroyTextureResources(this._environmentMapResources);
|
|
115
|
+
this._specularMapResources && destroyTextureResources(this._specularMapResources);
|
|
116
|
+
this._irradianceMapResources && destroyTextureResources(this._irradianceMapResources);
|
|
117
|
+
this._updated = false;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
updateMaps() {
|
|
121
|
+
this._environmentMapResources && updateMap(this._environmentMapResources);
|
|
122
|
+
this._specularMapResources && updateMap(this._specularMapResources);
|
|
123
|
+
this._irradianceMapResources && updateMap(this._irradianceMapResources);
|
|
124
|
+
this._updated = true;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
async reloadImage(imageUrl: string) {
|
|
128
|
+
if (!this._environmentMapResources) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (this._environmentMapResources.skyShape instanceof SkySphere) {
|
|
132
|
+
await this._environmentMapResources.skyShape.setTexture(imageUrl);
|
|
133
|
+
}
|
|
134
|
+
this._updated = false;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type Renderer from "./Renderer";
|
|
2
|
+
|
|
3
|
+
export interface ClearOptions {
|
|
4
|
+
color?: boolean;
|
|
5
|
+
depth?: boolean;
|
|
6
|
+
stencil?: boolean;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export default class FrameBuffer {
|
|
10
|
+
protected _renderer: Renderer;
|
|
11
|
+
|
|
12
|
+
constructor(renderer: Renderer) {
|
|
13
|
+
this._renderer = renderer;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
get renderer(): Renderer {
|
|
17
|
+
return this._renderer;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
clearColor(): void {
|
|
21
|
+
this.clear({ color: true, depth: false, stencil: false });
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
clearDepth(): void {
|
|
25
|
+
this.clear({ color: true, depth: true, stencil: false });
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
clearStencil(): void {
|
|
29
|
+
this.clear({color: false, depth: false, stencil: true });
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
clear({ color = true, depth = true, stencil = false }: ClearOptions = {}): void {
|
|
33
|
+
throw new Error("FrameBuffer: calling base implementation of clear()");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import Texture from "../base/Texture";
|
|
2
|
+
import Renderer from "./Renderer";
|
|
3
|
+
import Material from "../base/Material";
|
|
4
|
+
import TextureRenderer from "./TextureRenderer";
|
|
5
|
+
|
|
6
|
+
export default class MaterialRenderer {
|
|
7
|
+
protected _renderer: Renderer;
|
|
8
|
+
protected _material: Material;
|
|
9
|
+
|
|
10
|
+
constructor(renderer: Renderer, material: Material) {
|
|
11
|
+
this._renderer = renderer;
|
|
12
|
+
this._material = material;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
get renderer() {
|
|
16
|
+
return this._renderer;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
get material() {
|
|
20
|
+
return this._material;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
getTextureRenderer(materialAttribute: keyof Material): TextureRenderer | null {
|
|
24
|
+
const element = this.material[materialAttribute];
|
|
25
|
+
if (element instanceof Texture) {
|
|
26
|
+
// The texture renderer factory will create a texture renderer, or
|
|
27
|
+
// return the existing one
|
|
28
|
+
return this.renderer.factory.texture(element);
|
|
29
|
+
}
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
}
|
|
34
|
+
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
export enum BlendEquation {
|
|
2
|
+
ADD = 1,
|
|
3
|
+
SUBTRACT = 2,
|
|
4
|
+
REVERSE_SUBTRACT = 3
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export enum BlendFunction {
|
|
8
|
+
NULL = 0,
|
|
9
|
+
ZERO = 1,
|
|
10
|
+
ONE = 2,
|
|
11
|
+
SRC_COLOR = 3,
|
|
12
|
+
ONE_MINUS_SRC_COLOR = 4,
|
|
13
|
+
DST_COLOR = 5,
|
|
14
|
+
ONE_MINUS_DST_COLOR = 6,
|
|
15
|
+
SRC_ALPHA = 7,
|
|
16
|
+
ONE_MINUS_SRC_ALPHA = 8,
|
|
17
|
+
DST_ALPHA = 9,
|
|
18
|
+
ONE_MINUS_DST_ALPHA = 10
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface BlendState {
|
|
22
|
+
enabled: boolean;
|
|
23
|
+
blendEquation: BlendEquation;
|
|
24
|
+
blendFuncSrc: BlendFunction;
|
|
25
|
+
blendFuncDst: BlendFunction;
|
|
26
|
+
blendFuncSrcAlpha: BlendFunction;
|
|
27
|
+
blendFuncDstAlpha: BlendFunction;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface BlendStateParams {
|
|
31
|
+
enabled?: boolean;
|
|
32
|
+
blendEquation?: BlendEquation;
|
|
33
|
+
blendFuncSrc?: BlendFunction;
|
|
34
|
+
blendFuncDst?: BlendFunction;
|
|
35
|
+
blendFuncSrcAlpha?: BlendFunction;
|
|
36
|
+
blendFuncDstAlpha?: BlendFunction;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export default class Pipeline {
|
|
40
|
+
protected _renderer: any;
|
|
41
|
+
protected _blendState: BlendState = {
|
|
42
|
+
enabled: false,
|
|
43
|
+
blendEquation: BlendEquation.ADD,
|
|
44
|
+
blendFuncSrc: BlendFunction.SRC_ALPHA,
|
|
45
|
+
blendFuncDst: BlendFunction.ONE_MINUS_SRC_ALPHA,
|
|
46
|
+
blendFuncSrcAlpha: BlendFunction.SRC_ALPHA,
|
|
47
|
+
blendFuncDstAlpha: BlendFunction.ONE_MINUS_SRC_ALPHA
|
|
48
|
+
}
|
|
49
|
+
protected _depthTestEnabled: boolean;
|
|
50
|
+
protected _cullFace: boolean;
|
|
51
|
+
|
|
52
|
+
constructor(renderer: any) {
|
|
53
|
+
this._renderer = renderer;
|
|
54
|
+
|
|
55
|
+
this._depthTestEnabled = true;
|
|
56
|
+
|
|
57
|
+
this._cullFace = true;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
get renderer(): any {
|
|
61
|
+
return this._renderer;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
setBlendState({
|
|
65
|
+
enabled = false,
|
|
66
|
+
blendEquation = BlendEquation.ADD,
|
|
67
|
+
blendFuncSrc = BlendFunction.SRC_ALPHA,
|
|
68
|
+
blendFuncDst = BlendFunction.ONE_MINUS_SRC_ALPHA,
|
|
69
|
+
blendFuncSrcAlpha = BlendFunction.SRC_ALPHA,
|
|
70
|
+
blendFuncDstAlpha = BlendFunction.ONE_MINUS_SRC_ALPHA
|
|
71
|
+
}: BlendStateParams = {}): void {
|
|
72
|
+
this._blendState = {
|
|
73
|
+
enabled,
|
|
74
|
+
blendEquation,
|
|
75
|
+
blendFuncSrc,
|
|
76
|
+
blendFuncDst,
|
|
77
|
+
blendFuncSrcAlpha,
|
|
78
|
+
blendFuncDstAlpha
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
get blendState(): BlendState {
|
|
83
|
+
return this._blendState;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
get depthTest(): boolean {
|
|
87
|
+
return this._depthTestEnabled;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
set depthTest(dt: boolean) {
|
|
91
|
+
this._depthTestEnabled = dt;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
set cullFace(cf: boolean) {
|
|
95
|
+
this._cullFace = cf;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
get cullFace(): boolean {
|
|
99
|
+
return this._cullFace;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
create(): void {
|
|
103
|
+
throw new Error("Pipeline.create(): calling base class method.");
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
activate(): void {
|
|
107
|
+
throw new Error("Pipeline.activate(): calling base class method.");
|
|
108
|
+
}
|
|
109
|
+
}
|
|
@@ -0,0 +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
|
+
}
|
|
@@ -0,0 +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
|
+
}
|