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,199 +1,199 @@
|
|
|
1
|
-
|
|
2
|
-
import { getLayers, RenderLayer } from "../base/PolyList";
|
|
3
|
-
import Mat4 from "../math/Mat4";
|
|
4
|
-
import { BlendFunction } from "./Pipeline";
|
|
5
|
-
import RenderState from "./RenderState";
|
|
6
|
-
import type Renderer from "./Renderer";
|
|
7
|
-
import type Shader from "./Shader";
|
|
8
|
-
import type PolyListRenderer from "./PolyListRenderer";
|
|
9
|
-
import type MaterialRenderer from "./MaterialRenderer";
|
|
10
|
-
import type Pipeline from "./Pipeline";
|
|
11
|
-
import type Light from "../base/Light";
|
|
12
|
-
|
|
13
|
-
export interface QueuePipelines {
|
|
14
|
-
cullBackFace: Pipeline;
|
|
15
|
-
cullFaceDisabled: Pipeline;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export interface QueueItem {
|
|
19
|
-
layer: RenderLayer;
|
|
20
|
-
shader: Shader;
|
|
21
|
-
beginOperation: ((layer: RenderLayer) => void) | null;
|
|
22
|
-
endOperation: ((layer: RenderLayer) => void) | null;
|
|
23
|
-
enabled: boolean;
|
|
24
|
-
pipelines: QueuePipelines;
|
|
25
|
-
queue: RenderState[];
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export interface LightData {
|
|
29
|
-
light: Light;
|
|
30
|
-
transform: Mat4;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export interface EnableQueueOptions {
|
|
34
|
-
beginOperation?: ((layer: RenderLayer) => void) | null;
|
|
35
|
-
endOperation?: ((layer: RenderLayer) => void) | null;
|
|
36
|
-
enabled?: boolean;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export default class RenderQueue {
|
|
40
|
-
protected _renderer: Renderer;
|
|
41
|
-
protected _queues: QueueItem[];
|
|
42
|
-
protected _viewMatrix: Mat4;
|
|
43
|
-
protected _projectionMatrix: Mat4;
|
|
44
|
-
protected _lights: LightData[];
|
|
45
|
-
|
|
46
|
-
constructor(renderer: Renderer) {
|
|
47
|
-
this._renderer = renderer;
|
|
48
|
-
|
|
49
|
-
this._queues = [];
|
|
50
|
-
|
|
51
|
-
this._viewMatrix = Mat4.MakeIdentity();
|
|
52
|
-
this._projectionMatrix = Mat4.MakeIdentity();
|
|
53
|
-
|
|
54
|
-
this._lights = [];
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
get renderer(): Renderer {
|
|
58
|
-
return this._renderer;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
get queues(): QueueItem[] {
|
|
62
|
-
return this._queues;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
get viewMatrix(): Mat4 {
|
|
66
|
-
return this._viewMatrix;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
set viewMatrix(m: Mat4) {
|
|
70
|
-
this._viewMatrix.assign(m);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
get projectionMatrix(): Mat4 {
|
|
74
|
-
return this._projectionMatrix;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
set projectionMatrix(m: Mat4) {
|
|
78
|
-
this._projectionMatrix.assign(m);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
get lights(): LightData[] {
|
|
82
|
-
return this._lights;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
getQueue(layer: RenderLayer): QueueItem | undefined {
|
|
86
|
-
return this._queues.find(l => l.layer === layer);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
enableQueue(layer: RenderLayer, shader: Shader, { beginOperation = null, endOperation = null, enabled = true }: EnableQueueOptions = {}): void {
|
|
90
|
-
// TODO: Create pipelines for different render states (cull face, front face etc.)
|
|
91
|
-
const cullBackFace = this.renderer.factory.pipeline();
|
|
92
|
-
const cullFaceDisabled = this.renderer.factory.pipeline();
|
|
93
|
-
if (layer === RenderLayer.TRANSPARENT_DEFAULT) {
|
|
94
|
-
const blendState = {
|
|
95
|
-
enabled: true,
|
|
96
|
-
blendFuncSrc: BlendFunction.SRC_ALPHA,
|
|
97
|
-
blendFuncDst: BlendFunction.ONE_MINUS_SRC_ALPHA,
|
|
98
|
-
blendFuncSrcAlpha: BlendFunction.ONE,
|
|
99
|
-
blendFuncDstAlpha: BlendFunction.ONE_MINUS_SRC_ALPHA
|
|
100
|
-
};
|
|
101
|
-
cullBackFace.setBlendState(blendState);
|
|
102
|
-
cullFaceDisabled.setBlendState(blendState);
|
|
103
|
-
}
|
|
104
|
-
cullBackFace.create();
|
|
105
|
-
cullFaceDisabled.cullFace = false;
|
|
106
|
-
cullFaceDisabled.create();
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
const queue = this.getQueue(layer);
|
|
112
|
-
if (!queue) {
|
|
113
|
-
this._queues.push({
|
|
114
|
-
layer,
|
|
115
|
-
shader,
|
|
116
|
-
beginOperation,
|
|
117
|
-
endOperation,
|
|
118
|
-
enabled,
|
|
119
|
-
pipelines: {
|
|
120
|
-
cullBackFace,
|
|
121
|
-
cullFaceDisabled
|
|
122
|
-
},
|
|
123
|
-
queue: []
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
queue.enabled = true;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
disableQueue(layer: RenderLayer): void {
|
|
132
|
-
const queue = this.getQueue(layer);
|
|
133
|
-
if (queue) {
|
|
134
|
-
queue.enabled = true;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
isQueueEnabled(layer: RenderLayer): boolean {
|
|
139
|
-
return this.getQueue(layer)?.enabled || false;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
newFrame(): void {
|
|
143
|
-
this._queues.forEach(q => q.queue = []);
|
|
144
|
-
this._lights = [];
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
addPolyList(polyListRenderer: PolyListRenderer, materialRenderer: MaterialRenderer, modelMatrix: Mat4): void {
|
|
148
|
-
const plistLayers = getLayers(polyListRenderer.polyList, materialRenderer.material);
|
|
149
|
-
this._queues.forEach(({ layer, shader, queue, pipelines }) => {
|
|
150
|
-
if (plistLayers & layer) {
|
|
151
|
-
const { polyList } = polyListRenderer;
|
|
152
|
-
let pipeline = null;
|
|
153
|
-
// TODO: Select pipeline based on material and polyList properties
|
|
154
|
-
if (polyList.enableCullFace) {
|
|
155
|
-
pipeline = pipelines.cullBackFace;
|
|
156
|
-
}
|
|
157
|
-
else {
|
|
158
|
-
pipeline = pipelines.cullFaceDisabled;
|
|
159
|
-
}
|
|
160
|
-
queue.push(new RenderState({
|
|
161
|
-
shader,
|
|
162
|
-
polyListRenderer,
|
|
163
|
-
materialRenderer,
|
|
164
|
-
modelMatrix,
|
|
165
|
-
viewMatrix: this.viewMatrix,
|
|
166
|
-
projectionMatrix: this.projectionMatrix,
|
|
167
|
-
pipeline
|
|
168
|
-
}))
|
|
169
|
-
}
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
addLight(light: Light, transform: Mat4): void {
|
|
174
|
-
// Clear the depth texture, because this parameter
|
|
175
|
-
// is set each frame by the ShadowRenderer
|
|
176
|
-
light.depthTexture = null;
|
|
177
|
-
this._lights.push({ light, transform });
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
draw(layer: RenderLayer): void {
|
|
181
|
-
const queue = this.getQueue(layer);
|
|
182
|
-
if (queue) {
|
|
183
|
-
if (typeof(queue.beginOperation) === "function") {
|
|
184
|
-
queue.beginOperation(layer);
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
//queue.pipeline.activate();
|
|
188
|
-
queue.queue.forEach(rs => {
|
|
189
|
-
rs.draw();
|
|
190
|
-
});
|
|
191
|
-
if (typeof(queue.endOperation) === "function") {
|
|
192
|
-
queue.endOperation(layer);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
else {
|
|
196
|
-
console.warn(`No render queue found for layer ${layer}`);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
1
|
+
|
|
2
|
+
import { getLayers, RenderLayer } from "../base/PolyList";
|
|
3
|
+
import Mat4 from "../math/Mat4";
|
|
4
|
+
import { BlendFunction } from "./Pipeline";
|
|
5
|
+
import RenderState from "./RenderState";
|
|
6
|
+
import type Renderer from "./Renderer";
|
|
7
|
+
import type Shader from "./Shader";
|
|
8
|
+
import type PolyListRenderer from "./PolyListRenderer";
|
|
9
|
+
import type MaterialRenderer from "./MaterialRenderer";
|
|
10
|
+
import type Pipeline from "./Pipeline";
|
|
11
|
+
import type Light from "../base/Light";
|
|
12
|
+
|
|
13
|
+
export interface QueuePipelines {
|
|
14
|
+
cullBackFace: Pipeline;
|
|
15
|
+
cullFaceDisabled: Pipeline;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface QueueItem {
|
|
19
|
+
layer: RenderLayer;
|
|
20
|
+
shader: Shader;
|
|
21
|
+
beginOperation: ((layer: RenderLayer) => void) | null;
|
|
22
|
+
endOperation: ((layer: RenderLayer) => void) | null;
|
|
23
|
+
enabled: boolean;
|
|
24
|
+
pipelines: QueuePipelines;
|
|
25
|
+
queue: RenderState[];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface LightData {
|
|
29
|
+
light: Light;
|
|
30
|
+
transform: Mat4;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface EnableQueueOptions {
|
|
34
|
+
beginOperation?: ((layer: RenderLayer) => void) | null;
|
|
35
|
+
endOperation?: ((layer: RenderLayer) => void) | null;
|
|
36
|
+
enabled?: boolean;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export default class RenderQueue {
|
|
40
|
+
protected _renderer: Renderer;
|
|
41
|
+
protected _queues: QueueItem[];
|
|
42
|
+
protected _viewMatrix: Mat4;
|
|
43
|
+
protected _projectionMatrix: Mat4;
|
|
44
|
+
protected _lights: LightData[];
|
|
45
|
+
|
|
46
|
+
constructor(renderer: Renderer) {
|
|
47
|
+
this._renderer = renderer;
|
|
48
|
+
|
|
49
|
+
this._queues = [];
|
|
50
|
+
|
|
51
|
+
this._viewMatrix = Mat4.MakeIdentity();
|
|
52
|
+
this._projectionMatrix = Mat4.MakeIdentity();
|
|
53
|
+
|
|
54
|
+
this._lights = [];
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
get renderer(): Renderer {
|
|
58
|
+
return this._renderer;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
get queues(): QueueItem[] {
|
|
62
|
+
return this._queues;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
get viewMatrix(): Mat4 {
|
|
66
|
+
return this._viewMatrix;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
set viewMatrix(m: Mat4) {
|
|
70
|
+
this._viewMatrix.assign(m);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
get projectionMatrix(): Mat4 {
|
|
74
|
+
return this._projectionMatrix;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
set projectionMatrix(m: Mat4) {
|
|
78
|
+
this._projectionMatrix.assign(m);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
get lights(): LightData[] {
|
|
82
|
+
return this._lights;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
getQueue(layer: RenderLayer): QueueItem | undefined {
|
|
86
|
+
return this._queues.find(l => l.layer === layer);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
enableQueue(layer: RenderLayer, shader: Shader, { beginOperation = null, endOperation = null, enabled = true }: EnableQueueOptions = {}): void {
|
|
90
|
+
// TODO: Create pipelines for different render states (cull face, front face etc.)
|
|
91
|
+
const cullBackFace = this.renderer.factory.pipeline();
|
|
92
|
+
const cullFaceDisabled = this.renderer.factory.pipeline();
|
|
93
|
+
if (layer === RenderLayer.TRANSPARENT_DEFAULT) {
|
|
94
|
+
const blendState = {
|
|
95
|
+
enabled: true,
|
|
96
|
+
blendFuncSrc: BlendFunction.SRC_ALPHA,
|
|
97
|
+
blendFuncDst: BlendFunction.ONE_MINUS_SRC_ALPHA,
|
|
98
|
+
blendFuncSrcAlpha: BlendFunction.ONE,
|
|
99
|
+
blendFuncDstAlpha: BlendFunction.ONE_MINUS_SRC_ALPHA
|
|
100
|
+
};
|
|
101
|
+
cullBackFace.setBlendState(blendState);
|
|
102
|
+
cullFaceDisabled.setBlendState(blendState);
|
|
103
|
+
}
|
|
104
|
+
cullBackFace.create();
|
|
105
|
+
cullFaceDisabled.cullFace = false;
|
|
106
|
+
cullFaceDisabled.create();
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
const queue = this.getQueue(layer);
|
|
112
|
+
if (!queue) {
|
|
113
|
+
this._queues.push({
|
|
114
|
+
layer,
|
|
115
|
+
shader,
|
|
116
|
+
beginOperation,
|
|
117
|
+
endOperation,
|
|
118
|
+
enabled,
|
|
119
|
+
pipelines: {
|
|
120
|
+
cullBackFace,
|
|
121
|
+
cullFaceDisabled
|
|
122
|
+
},
|
|
123
|
+
queue: []
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
queue.enabled = true;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
disableQueue(layer: RenderLayer): void {
|
|
132
|
+
const queue = this.getQueue(layer);
|
|
133
|
+
if (queue) {
|
|
134
|
+
queue.enabled = true;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
isQueueEnabled(layer: RenderLayer): boolean {
|
|
139
|
+
return this.getQueue(layer)?.enabled || false;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
newFrame(): void {
|
|
143
|
+
this._queues.forEach(q => q.queue = []);
|
|
144
|
+
this._lights = [];
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
addPolyList(polyListRenderer: PolyListRenderer, materialRenderer: MaterialRenderer, modelMatrix: Mat4): void {
|
|
148
|
+
const plistLayers = getLayers(polyListRenderer.polyList, materialRenderer.material);
|
|
149
|
+
this._queues.forEach(({ layer, shader, queue, pipelines }) => {
|
|
150
|
+
if (plistLayers & layer) {
|
|
151
|
+
const { polyList } = polyListRenderer;
|
|
152
|
+
let pipeline = null;
|
|
153
|
+
// TODO: Select pipeline based on material and polyList properties
|
|
154
|
+
if (polyList.enableCullFace) {
|
|
155
|
+
pipeline = pipelines.cullBackFace;
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
pipeline = pipelines.cullFaceDisabled;
|
|
159
|
+
}
|
|
160
|
+
queue.push(new RenderState({
|
|
161
|
+
shader,
|
|
162
|
+
polyListRenderer,
|
|
163
|
+
materialRenderer,
|
|
164
|
+
modelMatrix,
|
|
165
|
+
viewMatrix: this.viewMatrix,
|
|
166
|
+
projectionMatrix: this.projectionMatrix,
|
|
167
|
+
pipeline
|
|
168
|
+
}))
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
addLight(light: Light, transform: Mat4): void {
|
|
174
|
+
// Clear the depth texture, because this parameter
|
|
175
|
+
// is set each frame by the ShadowRenderer
|
|
176
|
+
light.depthTexture = null;
|
|
177
|
+
this._lights.push({ light, transform });
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
draw(layer: RenderLayer): void {
|
|
181
|
+
const queue = this.getQueue(layer);
|
|
182
|
+
if (queue) {
|
|
183
|
+
if (typeof(queue.beginOperation) === "function") {
|
|
184
|
+
queue.beginOperation(layer);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
//queue.pipeline.activate();
|
|
188
|
+
queue.queue.forEach(rs => {
|
|
189
|
+
rs.draw();
|
|
190
|
+
});
|
|
191
|
+
if (typeof(queue.endOperation) === "function") {
|
|
192
|
+
queue.endOperation(layer);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
console.warn(`No render queue found for layer ${layer}`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
199
|
}
|
|
@@ -1,116 +1,116 @@
|
|
|
1
|
-
|
|
2
|
-
import { RenderLayer } from "../base/PolyList";
|
|
3
|
-
import Mat4 from "../math/Mat4";
|
|
4
|
-
import type Shader from "./Shader";
|
|
5
|
-
import type PolyListRenderer from "./PolyListRenderer";
|
|
6
|
-
import type MaterialRenderer from "./MaterialRenderer";
|
|
7
|
-
import type Renderer from "./Renderer";
|
|
8
|
-
import type Pipeline from "./Pipeline";
|
|
9
|
-
|
|
10
|
-
export interface RenderStateOptions {
|
|
11
|
-
shader?: Shader | null;
|
|
12
|
-
polyListRenderer?: PolyListRenderer | null;
|
|
13
|
-
materialRenderer?: MaterialRenderer | null;
|
|
14
|
-
modelMatrix?: Mat4;
|
|
15
|
-
viewMatrix?: Mat4;
|
|
16
|
-
projectionMatrix?: Mat4;
|
|
17
|
-
pipeline?: Pipeline | null;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export interface DrawOptions {
|
|
21
|
-
overrideShader?: Shader | null;
|
|
22
|
-
overrideViewMatrix?: Mat4 | null;
|
|
23
|
-
overrideProjectionMatrix?: Mat4 | null;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export default class RenderState {
|
|
27
|
-
protected _shader: Shader | null;
|
|
28
|
-
protected _polyListRenderer: PolyListRenderer | null;
|
|
29
|
-
protected _materialRenderer: MaterialRenderer | null;
|
|
30
|
-
protected _modelMatrix: Mat4;
|
|
31
|
-
protected _viewMatrix: Mat4;
|
|
32
|
-
protected _projectionMatrix: Mat4;
|
|
33
|
-
protected _pipeline: Pipeline | null;
|
|
34
|
-
|
|
35
|
-
constructor({
|
|
36
|
-
shader = null,
|
|
37
|
-
polyListRenderer = null,
|
|
38
|
-
materialRenderer = null,
|
|
39
|
-
modelMatrix = Mat4.MakeIdentity(),
|
|
40
|
-
viewMatrix = Mat4.MakeIdentity(),
|
|
41
|
-
projectionMatrix = Mat4.MakeIdentity(),
|
|
42
|
-
pipeline = null
|
|
43
|
-
}: RenderStateOptions = {}) {
|
|
44
|
-
this._shader = shader;
|
|
45
|
-
this._polyListRenderer = polyListRenderer;
|
|
46
|
-
this._materialRenderer = materialRenderer;
|
|
47
|
-
this._modelMatrix = modelMatrix;
|
|
48
|
-
this._viewMatrix = viewMatrix;
|
|
49
|
-
this._projectionMatrix = projectionMatrix;
|
|
50
|
-
this._pipeline = pipeline;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
get valid(): boolean {
|
|
54
|
-
return this._shader && this._polyListRenderer !== null && this._materialRenderer !== null || false;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
get renderer(): Renderer | undefined { return this._polyListRenderer?.renderer; }
|
|
58
|
-
|
|
59
|
-
set shader(shader: Shader | null) { this._shader = shader; }
|
|
60
|
-
get shader(): Shader | null { return this._shader; }
|
|
61
|
-
set polyListRenderer(polyListRenderer: PolyListRenderer | null) { this._polyListRenderer = polyListRenderer; }
|
|
62
|
-
get polyListRenderer(): PolyListRenderer | null { return this._polyListRenderer; }
|
|
63
|
-
set materialRenderer(materialRenderer: MaterialRenderer | null) { this._materialRenderer = materialRenderer; }
|
|
64
|
-
get materialRenderer(): MaterialRenderer | null { return this._materialRenderer; }
|
|
65
|
-
set modelMatrix(model: Mat4) { this._modelMatrix = model; }
|
|
66
|
-
get modelMatrix(): Mat4 { return this._modelMatrix; }
|
|
67
|
-
set viewMatrix(view: Mat4) { this._viewMatrix = view; }
|
|
68
|
-
get viewMatrix(): Mat4 { return this._viewMatrix; }
|
|
69
|
-
set projectionMatrix(projection: Mat4) { this._projectionMatrix = projection; }
|
|
70
|
-
get projectionMatrix(): Mat4 { return this._projectionMatrix; }
|
|
71
|
-
get pipeline(): Pipeline | null { return this._pipeline; }
|
|
72
|
-
set pipeline(pl: Pipeline | null) { this._pipeline = pl; }
|
|
73
|
-
|
|
74
|
-
isLayerEnabled(layer: RenderLayer): boolean {
|
|
75
|
-
const { polyList } = this._polyListRenderer || {};
|
|
76
|
-
const { material } = this._materialRenderer || {};
|
|
77
|
-
if (!polyList || !material) {
|
|
78
|
-
return false;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
const renderLayers = polyList.renderLayers === RenderLayer.AUTO ?
|
|
82
|
-
(material.isTransparent ? RenderLayer.TRANSPARENT_DEFAULT : RenderLayer.OPAQUE_DEFAULT) :
|
|
83
|
-
(polyList.renderLayers);
|
|
84
|
-
|
|
85
|
-
return (renderLayers & layer) !== 0;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
draw({ overrideShader = null, overrideViewMatrix = null, overrideProjectionMatrix = null}: DrawOptions = {}): void {
|
|
89
|
-
const shader = overrideShader || this.shader;
|
|
90
|
-
if (!this.polyListRenderer?.polyList.visible || !shader || !this.materialRenderer) {
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
if ((this.renderer as any)?.debugMode) {
|
|
94
|
-
console.log(`======= Begin render polyList "${this.polyListRenderer.polyList.name}" ==============`);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
if (this.pipeline) {
|
|
98
|
-
this.pipeline.activate();
|
|
99
|
-
}
|
|
100
|
-
this.polyListRenderer.bindBuffers();
|
|
101
|
-
|
|
102
|
-
const viewMatrix = overrideViewMatrix || this.viewMatrix;
|
|
103
|
-
const projectionMatrix = overrideProjectionMatrix || this.projectionMatrix;
|
|
104
|
-
shader.setup(
|
|
105
|
-
this.polyListRenderer,
|
|
106
|
-
this.materialRenderer,
|
|
107
|
-
this.modelMatrix,
|
|
108
|
-
viewMatrix,
|
|
109
|
-
projectionMatrix
|
|
110
|
-
);
|
|
111
|
-
this.polyListRenderer.draw();
|
|
112
|
-
if ((this.renderer as any)?.debugMode) {
|
|
113
|
-
console.log(`======= End render polyList "${this.polyListRenderer.polyList.name}" ==============`);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
1
|
+
|
|
2
|
+
import { RenderLayer } from "../base/PolyList";
|
|
3
|
+
import Mat4 from "../math/Mat4";
|
|
4
|
+
import type Shader from "./Shader";
|
|
5
|
+
import type PolyListRenderer from "./PolyListRenderer";
|
|
6
|
+
import type MaterialRenderer from "./MaterialRenderer";
|
|
7
|
+
import type Renderer from "./Renderer";
|
|
8
|
+
import type Pipeline from "./Pipeline";
|
|
9
|
+
|
|
10
|
+
export interface RenderStateOptions {
|
|
11
|
+
shader?: Shader | null;
|
|
12
|
+
polyListRenderer?: PolyListRenderer | null;
|
|
13
|
+
materialRenderer?: MaterialRenderer | null;
|
|
14
|
+
modelMatrix?: Mat4;
|
|
15
|
+
viewMatrix?: Mat4;
|
|
16
|
+
projectionMatrix?: Mat4;
|
|
17
|
+
pipeline?: Pipeline | null;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface DrawOptions {
|
|
21
|
+
overrideShader?: Shader | null;
|
|
22
|
+
overrideViewMatrix?: Mat4 | null;
|
|
23
|
+
overrideProjectionMatrix?: Mat4 | null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export default class RenderState {
|
|
27
|
+
protected _shader: Shader | null;
|
|
28
|
+
protected _polyListRenderer: PolyListRenderer | null;
|
|
29
|
+
protected _materialRenderer: MaterialRenderer | null;
|
|
30
|
+
protected _modelMatrix: Mat4;
|
|
31
|
+
protected _viewMatrix: Mat4;
|
|
32
|
+
protected _projectionMatrix: Mat4;
|
|
33
|
+
protected _pipeline: Pipeline | null;
|
|
34
|
+
|
|
35
|
+
constructor({
|
|
36
|
+
shader = null,
|
|
37
|
+
polyListRenderer = null,
|
|
38
|
+
materialRenderer = null,
|
|
39
|
+
modelMatrix = Mat4.MakeIdentity(),
|
|
40
|
+
viewMatrix = Mat4.MakeIdentity(),
|
|
41
|
+
projectionMatrix = Mat4.MakeIdentity(),
|
|
42
|
+
pipeline = null
|
|
43
|
+
}: RenderStateOptions = {}) {
|
|
44
|
+
this._shader = shader;
|
|
45
|
+
this._polyListRenderer = polyListRenderer;
|
|
46
|
+
this._materialRenderer = materialRenderer;
|
|
47
|
+
this._modelMatrix = modelMatrix;
|
|
48
|
+
this._viewMatrix = viewMatrix;
|
|
49
|
+
this._projectionMatrix = projectionMatrix;
|
|
50
|
+
this._pipeline = pipeline;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
get valid(): boolean {
|
|
54
|
+
return this._shader && this._polyListRenderer !== null && this._materialRenderer !== null || false;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
get renderer(): Renderer | undefined { return this._polyListRenderer?.renderer; }
|
|
58
|
+
|
|
59
|
+
set shader(shader: Shader | null) { this._shader = shader; }
|
|
60
|
+
get shader(): Shader | null { return this._shader; }
|
|
61
|
+
set polyListRenderer(polyListRenderer: PolyListRenderer | null) { this._polyListRenderer = polyListRenderer; }
|
|
62
|
+
get polyListRenderer(): PolyListRenderer | null { return this._polyListRenderer; }
|
|
63
|
+
set materialRenderer(materialRenderer: MaterialRenderer | null) { this._materialRenderer = materialRenderer; }
|
|
64
|
+
get materialRenderer(): MaterialRenderer | null { return this._materialRenderer; }
|
|
65
|
+
set modelMatrix(model: Mat4) { this._modelMatrix = model; }
|
|
66
|
+
get modelMatrix(): Mat4 { return this._modelMatrix; }
|
|
67
|
+
set viewMatrix(view: Mat4) { this._viewMatrix = view; }
|
|
68
|
+
get viewMatrix(): Mat4 { return this._viewMatrix; }
|
|
69
|
+
set projectionMatrix(projection: Mat4) { this._projectionMatrix = projection; }
|
|
70
|
+
get projectionMatrix(): Mat4 { return this._projectionMatrix; }
|
|
71
|
+
get pipeline(): Pipeline | null { return this._pipeline; }
|
|
72
|
+
set pipeline(pl: Pipeline | null) { this._pipeline = pl; }
|
|
73
|
+
|
|
74
|
+
isLayerEnabled(layer: RenderLayer): boolean {
|
|
75
|
+
const { polyList } = this._polyListRenderer || {};
|
|
76
|
+
const { material } = this._materialRenderer || {};
|
|
77
|
+
if (!polyList || !material) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const renderLayers = polyList.renderLayers === RenderLayer.AUTO ?
|
|
82
|
+
(material.isTransparent ? RenderLayer.TRANSPARENT_DEFAULT : RenderLayer.OPAQUE_DEFAULT) :
|
|
83
|
+
(polyList.renderLayers);
|
|
84
|
+
|
|
85
|
+
return (renderLayers & layer) !== 0;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
draw({ overrideShader = null, overrideViewMatrix = null, overrideProjectionMatrix = null}: DrawOptions = {}): void {
|
|
89
|
+
const shader = overrideShader || this.shader;
|
|
90
|
+
if (!this.polyListRenderer?.polyList.visible || !shader || !this.materialRenderer) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if ((this.renderer as any)?.debugMode) {
|
|
94
|
+
console.log(`======= Begin render polyList "${this.polyListRenderer.polyList.name}" ==============`);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (this.pipeline) {
|
|
98
|
+
this.pipeline.activate();
|
|
99
|
+
}
|
|
100
|
+
this.polyListRenderer.bindBuffers();
|
|
101
|
+
|
|
102
|
+
const viewMatrix = overrideViewMatrix || this.viewMatrix;
|
|
103
|
+
const projectionMatrix = overrideProjectionMatrix || this.projectionMatrix;
|
|
104
|
+
shader.setup(
|
|
105
|
+
this.polyListRenderer,
|
|
106
|
+
this.materialRenderer,
|
|
107
|
+
this.modelMatrix,
|
|
108
|
+
viewMatrix,
|
|
109
|
+
projectionMatrix
|
|
110
|
+
);
|
|
111
|
+
this.polyListRenderer.draw();
|
|
112
|
+
if ((this.renderer as any)?.debugMode) {
|
|
113
|
+
console.log(`======= End render polyList "${this.polyListRenderer.polyList.name}" ==============`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|