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,113 +1,113 @@
|
|
|
1
|
-
import Texture, { TextureChannel, TextureTargetName } from "../../base/Texture";
|
|
2
|
-
import Material from "../../base/Material";
|
|
3
|
-
import MaterialRenderer from "../MaterialRenderer";
|
|
4
|
-
import WebGLTextureRenderer from "./TextureRenderer";
|
|
5
|
-
import TextureMerger from "../TextureMergerRenderer";
|
|
6
|
-
import ShaderProgram from "./ShaderProgram";
|
|
7
|
-
import Renderer from "../Renderer";
|
|
8
|
-
import { whiteTexture, createWhiteTexture, blackTexture, createBlackTexture } from "../../tools/TextureResourceDatabase";
|
|
9
|
-
|
|
10
|
-
export default class WebGLMaterialRenderer extends MaterialRenderer {
|
|
11
|
-
protected _whiteTexture: WebGLTextureRenderer;
|
|
12
|
-
protected _blackTexture: WebGLTextureRenderer;
|
|
13
|
-
protected _textureMerger: TextureMerger;
|
|
14
|
-
|
|
15
|
-
static async InitResources(renderer: Renderer) {
|
|
16
|
-
await createWhiteTexture(renderer);
|
|
17
|
-
await createBlackTexture(renderer);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
constructor(renderer: Renderer, material: Material) {
|
|
21
|
-
super(renderer, material);
|
|
22
|
-
if (material.renderer) {
|
|
23
|
-
throw new Error("Duplicate material renderer set to material. Please, use the Renderer factory to get material renderer instance.");
|
|
24
|
-
}
|
|
25
|
-
// Link this material renderer to the material. This property is internal but should be accessed from the renderer
|
|
26
|
-
// The use of 'as any' is to provide access to the internal property like a friend class in C++
|
|
27
|
-
(material as any)._renderer = this;
|
|
28
|
-
|
|
29
|
-
this._whiteTexture = renderer.factory.texture(whiteTexture(renderer)) as WebGLTextureRenderer;
|
|
30
|
-
this._blackTexture = renderer.factory.texture(blackTexture(renderer)) as WebGLTextureRenderer;
|
|
31
|
-
this._textureMerger = renderer.factory.textureMerger();
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
mergeTextures() {
|
|
35
|
-
if (this.material.dirty) {
|
|
36
|
-
const getTexture = (att: keyof Material, fallbackTexture = this._whiteTexture) => {
|
|
37
|
-
if (this.material[att] instanceof Texture) {
|
|
38
|
-
return this.material[att];
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
return fallbackTexture.texture;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
this._textureMerger.setTexture(getTexture('metalnessTexture'), TextureChannel.R, TextureChannel.R + this.material.metalnessChannel);
|
|
46
|
-
this._textureMerger.setTexture(getTexture('roughnessTexture'), TextureChannel.G, TextureChannel.R + this.material.roughnessChannel);
|
|
47
|
-
this._textureMerger.setTexture(getTexture('lightEmission', this._blackTexture), TextureChannel.B, TextureChannel.R + this.material.lightEmissionChannel);
|
|
48
|
-
this._textureMerger.setTexture(getTexture('ambientOcclussion'), TextureChannel.A, TextureChannel.R + this.material.ambientOcclussionChannel);
|
|
49
|
-
this._textureMerger.update();
|
|
50
|
-
this.material.dirty = false;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
get metalnessRoughnessHeightAOTexture() {
|
|
55
|
-
return this._textureMerger.mergedTexture;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
destroy() {
|
|
59
|
-
console.log("Destroy material renderer");
|
|
60
|
-
if (this.material) {
|
|
61
|
-
// The use of 'as any' is to provide access to the internal property like a friend class in C++
|
|
62
|
-
(this.material as any)._renderer = null;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// Bind the metalness, roughness, height and ambient occlussion combined texture
|
|
67
|
-
bindMetalnessRoughnessHeightAOTexture(shaderProgram: ShaderProgram, uniformName: string, textureUnit: number): boolean {
|
|
68
|
-
const texRenderer = this.renderer.factory.texture(this.metalnessRoughnessHeightAOTexture) as WebGLTextureRenderer;
|
|
69
|
-
shaderProgram.bindTexture(uniformName, texRenderer, textureUnit);
|
|
70
|
-
return true;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// Binds the property to the uniformName uniform of the shader program, if the
|
|
74
|
-
// material property ies a texture. If not, it binds the fallbackTexture. If the fallbackTexture
|
|
75
|
-
// value is null, it binds a 2x2 px white texture
|
|
76
|
-
bindTexture(shaderProgram: ShaderProgram, property: keyof Material, uniformName: string, textureUnit: number, fallbackTexture: Texture | null = null) {
|
|
77
|
-
if (this.material[property] instanceof Texture) {
|
|
78
|
-
shaderProgram.bindTexture(uniformName, this.getTextureRenderer(property) as WebGLTextureRenderer, textureUnit);
|
|
79
|
-
return true;
|
|
80
|
-
}
|
|
81
|
-
else if (fallbackTexture instanceof Texture) {
|
|
82
|
-
const texRenderer = this.renderer.factory.texture(fallbackTexture) as WebGLTextureRenderer;
|
|
83
|
-
shaderProgram.bindTexture(uniformName, texRenderer, textureUnit);
|
|
84
|
-
return false;
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
shaderProgram.bindTexture(uniformName, this._whiteTexture, textureUnit);
|
|
88
|
-
return false;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// Bind the property to the uniformName uniform of the shader program, if the
|
|
93
|
-
// material property is a color. If not, it binds the fallbackColor vector
|
|
94
|
-
bindColor(shaderProgram: ShaderProgram, property: keyof Material, uniformName: string, fallbackColor = [1, 1, 1, 1]) {
|
|
95
|
-
if (this.material[property].length>=4) {
|
|
96
|
-
shaderProgram.uniform4fv(uniformName, this.material[property]);
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
shaderProgram.uniform4fv(uniformName, fallbackColor);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// Bind the property to the uniformName uniform of the shader program, if the
|
|
104
|
-
// material property is a number. If not, it binds the fallbackValue value
|
|
105
|
-
bindValue(shaderProgram: ShaderProgram, property: keyof Material, uniformName: string, fallbackValue = 1) {
|
|
106
|
-
if (typeof(this.material[property]) === "number") {
|
|
107
|
-
shaderProgram.uniform1f(uniformName, this.material[property]);
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
110
|
-
shaderProgram.uniform1f(uniformName, fallbackValue);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
1
|
+
import Texture, { TextureChannel, TextureTargetName } from "../../base/Texture";
|
|
2
|
+
import Material from "../../base/Material";
|
|
3
|
+
import MaterialRenderer from "../MaterialRenderer";
|
|
4
|
+
import WebGLTextureRenderer from "./TextureRenderer";
|
|
5
|
+
import TextureMerger from "../TextureMergerRenderer";
|
|
6
|
+
import ShaderProgram from "./ShaderProgram";
|
|
7
|
+
import Renderer from "../Renderer";
|
|
8
|
+
import { whiteTexture, createWhiteTexture, blackTexture, createBlackTexture } from "../../tools/TextureResourceDatabase";
|
|
9
|
+
|
|
10
|
+
export default class WebGLMaterialRenderer extends MaterialRenderer {
|
|
11
|
+
protected _whiteTexture: WebGLTextureRenderer;
|
|
12
|
+
protected _blackTexture: WebGLTextureRenderer;
|
|
13
|
+
protected _textureMerger: TextureMerger;
|
|
14
|
+
|
|
15
|
+
static async InitResources(renderer: Renderer) {
|
|
16
|
+
await createWhiteTexture(renderer);
|
|
17
|
+
await createBlackTexture(renderer);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
constructor(renderer: Renderer, material: Material) {
|
|
21
|
+
super(renderer, material);
|
|
22
|
+
if (material.renderer) {
|
|
23
|
+
throw new Error("Duplicate material renderer set to material. Please, use the Renderer factory to get material renderer instance.");
|
|
24
|
+
}
|
|
25
|
+
// Link this material renderer to the material. This property is internal but should be accessed from the renderer
|
|
26
|
+
// The use of 'as any' is to provide access to the internal property like a friend class in C++
|
|
27
|
+
(material as any)._renderer = this;
|
|
28
|
+
|
|
29
|
+
this._whiteTexture = renderer.factory.texture(whiteTexture(renderer)) as WebGLTextureRenderer;
|
|
30
|
+
this._blackTexture = renderer.factory.texture(blackTexture(renderer)) as WebGLTextureRenderer;
|
|
31
|
+
this._textureMerger = renderer.factory.textureMerger();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
mergeTextures() {
|
|
35
|
+
if (this.material.dirty) {
|
|
36
|
+
const getTexture = (att: keyof Material, fallbackTexture = this._whiteTexture) => {
|
|
37
|
+
if (this.material[att] instanceof Texture) {
|
|
38
|
+
return this.material[att];
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
return fallbackTexture.texture;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
this._textureMerger.setTexture(getTexture('metalnessTexture'), TextureChannel.R, TextureChannel.R + this.material.metalnessChannel);
|
|
46
|
+
this._textureMerger.setTexture(getTexture('roughnessTexture'), TextureChannel.G, TextureChannel.R + this.material.roughnessChannel);
|
|
47
|
+
this._textureMerger.setTexture(getTexture('lightEmission', this._blackTexture), TextureChannel.B, TextureChannel.R + this.material.lightEmissionChannel);
|
|
48
|
+
this._textureMerger.setTexture(getTexture('ambientOcclussion'), TextureChannel.A, TextureChannel.R + this.material.ambientOcclussionChannel);
|
|
49
|
+
this._textureMerger.update();
|
|
50
|
+
this.material.dirty = false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
get metalnessRoughnessHeightAOTexture() {
|
|
55
|
+
return this._textureMerger.mergedTexture;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
destroy() {
|
|
59
|
+
console.log("Destroy material renderer");
|
|
60
|
+
if (this.material) {
|
|
61
|
+
// The use of 'as any' is to provide access to the internal property like a friend class in C++
|
|
62
|
+
(this.material as any)._renderer = null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Bind the metalness, roughness, height and ambient occlussion combined texture
|
|
67
|
+
bindMetalnessRoughnessHeightAOTexture(shaderProgram: ShaderProgram, uniformName: string, textureUnit: number): boolean {
|
|
68
|
+
const texRenderer = this.renderer.factory.texture(this.metalnessRoughnessHeightAOTexture) as WebGLTextureRenderer;
|
|
69
|
+
shaderProgram.bindTexture(uniformName, texRenderer, textureUnit);
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Binds the property to the uniformName uniform of the shader program, if the
|
|
74
|
+
// material property ies a texture. If not, it binds the fallbackTexture. If the fallbackTexture
|
|
75
|
+
// value is null, it binds a 2x2 px white texture
|
|
76
|
+
bindTexture(shaderProgram: ShaderProgram, property: keyof Material, uniformName: string, textureUnit: number, fallbackTexture: Texture | null = null) {
|
|
77
|
+
if (this.material[property] instanceof Texture) {
|
|
78
|
+
shaderProgram.bindTexture(uniformName, this.getTextureRenderer(property) as WebGLTextureRenderer, textureUnit);
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
else if (fallbackTexture instanceof Texture) {
|
|
82
|
+
const texRenderer = this.renderer.factory.texture(fallbackTexture) as WebGLTextureRenderer;
|
|
83
|
+
shaderProgram.bindTexture(uniformName, texRenderer, textureUnit);
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
shaderProgram.bindTexture(uniformName, this._whiteTexture, textureUnit);
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Bind the property to the uniformName uniform of the shader program, if the
|
|
93
|
+
// material property is a color. If not, it binds the fallbackColor vector
|
|
94
|
+
bindColor(shaderProgram: ShaderProgram, property: keyof Material, uniformName: string, fallbackColor = [1, 1, 1, 1]) {
|
|
95
|
+
if (this.material[property].length>=4) {
|
|
96
|
+
shaderProgram.uniform4fv(uniformName, this.material[property]);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
shaderProgram.uniform4fv(uniformName, fallbackColor);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Bind the property to the uniformName uniform of the shader program, if the
|
|
104
|
+
// material property is a number. If not, it binds the fallbackValue value
|
|
105
|
+
bindValue(shaderProgram: ShaderProgram, property: keyof Material, uniformName: string, fallbackValue = 1) {
|
|
106
|
+
if (typeof(this.material[property]) === "number") {
|
|
107
|
+
shaderProgram.uniform1f(uniformName, this.material[property]);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
shaderProgram.uniform1f(uniformName, fallbackValue);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
113
|
}
|
|
@@ -1,89 +1,89 @@
|
|
|
1
|
-
|
|
2
|
-
import Pipeline, { BlendEquation, BlendFunction } from "../Pipeline";
|
|
3
|
-
|
|
4
|
-
const getBlendEquation = (gl: WebGLRenderingContext, blendEquation: BlendEquation): number => {
|
|
5
|
-
switch (blendEquation) {
|
|
6
|
-
case BlendEquation.ADD:
|
|
7
|
-
return gl.FUNC_ADD;
|
|
8
|
-
case BlendEquation.SUBTRACT:
|
|
9
|
-
return gl.FUNC_SUBTRACT;
|
|
10
|
-
case BlendEquation.REVERSE_SUBTRACT:
|
|
11
|
-
return gl.FUNC_REVERSE_SUBTRACT;
|
|
12
|
-
}
|
|
13
|
-
throw new Error(`Invalid blend equation specified in WebGLPipeline: ${ blendEquation }`);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const getBlendFunc = (gl: WebGLRenderingContext, blendFunc: BlendFunction): number | null => {
|
|
17
|
-
switch (blendFunc) {
|
|
18
|
-
case BlendFunction.NULL:
|
|
19
|
-
return null;
|
|
20
|
-
case BlendFunction.ZERO:
|
|
21
|
-
return gl.ZERO;
|
|
22
|
-
case BlendFunction.ONE:
|
|
23
|
-
return gl.ONE;
|
|
24
|
-
case BlendFunction.SRC_COLOR:
|
|
25
|
-
return gl.SRC_COLOR;
|
|
26
|
-
case BlendFunction.ONE_MINUS_SRC_COLOR:
|
|
27
|
-
return gl.ONE_MINUS_SRC_COLOR;
|
|
28
|
-
case BlendFunction.DST_COLOR:
|
|
29
|
-
return gl.DST_COLOR;
|
|
30
|
-
case BlendFunction.ONE_MINUS_DST_COLOR:
|
|
31
|
-
return gl.ONE_MINUS_DST_COLOR;
|
|
32
|
-
case BlendFunction.SRC_ALPHA:
|
|
33
|
-
return gl.SRC_ALPHA;
|
|
34
|
-
case BlendFunction.ONE_MINUS_SRC_ALPHA:
|
|
35
|
-
return gl.ONE_MINUS_SRC_ALPHA;
|
|
36
|
-
case BlendFunction.DST_ALPHA:
|
|
37
|
-
return gl.DST_ALPHA;
|
|
38
|
-
case BlendFunction.ONE_MINUS_DST_ALPHA:
|
|
39
|
-
return gl.ONE_MINUS_DST_ALPHA;
|
|
40
|
-
}
|
|
41
|
-
throw new Error(`Invalid blend function specified in WebGLPipeline: ${ blendFunc }`);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export default class WebGLPipeline extends Pipeline {
|
|
45
|
-
private _blendEquation!: number;
|
|
46
|
-
private _blendFuncSrcColor!: number | null;
|
|
47
|
-
private _blendFuncSrcAlpha!: number | null;
|
|
48
|
-
private _blendFuncDstColor!: number | null;
|
|
49
|
-
private _blendFuncDstAlpha!: number | null;
|
|
50
|
-
private _blendFunc!: (a: number | null, b: number | null, c?: number | null, d?: number | null) => void;
|
|
51
|
-
|
|
52
|
-
create(): void {
|
|
53
|
-
const { gl } = this.renderer;
|
|
54
|
-
|
|
55
|
-
// Set the webgl equivalent values
|
|
56
|
-
this._blendEquation = getBlendEquation(gl, this.blendState.blendEquation);
|
|
57
|
-
this._blendFuncSrcColor = getBlendFunc(gl, this.blendState.blendFuncSrc);
|
|
58
|
-
this._blendFuncSrcAlpha = getBlendFunc(gl, this.blendState.blendFuncSrcAlpha);
|
|
59
|
-
this._blendFuncDstColor = getBlendFunc(gl, this.blendState.blendFuncDst);
|
|
60
|
-
this._blendFuncDstAlpha = getBlendFunc(gl, this.blendState.blendFuncDstAlpha);
|
|
61
|
-
if ((this._blendFuncDstAlpha === null && this._blendFuncSrcAlpha !== null) ||
|
|
62
|
-
(this._blendFuncDstAlpha !== null && this._blendFuncSrcAlpha === null))
|
|
63
|
-
{
|
|
64
|
-
throw new Error("WebGLPipeline.create(): Invalid values of blendFuncDstAlpha and blendFuncSrcAlpha");
|
|
65
|
-
}
|
|
66
|
-
this._blendFunc = this._blendFuncDstAlpha !== null ? (a,b) => gl.blendFunc(a,b) : (a,b,c,d) => gl.blendFuncSeparate(a,b,c,d);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
activate(): void {
|
|
70
|
-
const { gl, state } = this.renderer;
|
|
71
|
-
this.blendState.enabled ? gl.enable(gl.BLEND) : gl.disable(gl.BLEND);
|
|
72
|
-
gl.blendEquation(this._blendEquation);
|
|
73
|
-
this._blendFunc(
|
|
74
|
-
this._blendFuncSrcColor,
|
|
75
|
-
this._blendFuncDstColor,
|
|
76
|
-
this._blendFuncSrcAlpha,
|
|
77
|
-
this._blendFuncDstAlpha
|
|
78
|
-
);
|
|
79
|
-
|
|
80
|
-
state.depthTestEnabled = this.depthTest;
|
|
81
|
-
|
|
82
|
-
if (this.cullFace) {
|
|
83
|
-
gl.enable(gl.CULL_FACE);
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
gl.disable(gl.CULL_FACE);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
1
|
+
|
|
2
|
+
import Pipeline, { BlendEquation, BlendFunction } from "../Pipeline";
|
|
3
|
+
|
|
4
|
+
const getBlendEquation = (gl: WebGLRenderingContext, blendEquation: BlendEquation): number => {
|
|
5
|
+
switch (blendEquation) {
|
|
6
|
+
case BlendEquation.ADD:
|
|
7
|
+
return gl.FUNC_ADD;
|
|
8
|
+
case BlendEquation.SUBTRACT:
|
|
9
|
+
return gl.FUNC_SUBTRACT;
|
|
10
|
+
case BlendEquation.REVERSE_SUBTRACT:
|
|
11
|
+
return gl.FUNC_REVERSE_SUBTRACT;
|
|
12
|
+
}
|
|
13
|
+
throw new Error(`Invalid blend equation specified in WebGLPipeline: ${ blendEquation }`);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const getBlendFunc = (gl: WebGLRenderingContext, blendFunc: BlendFunction): number | null => {
|
|
17
|
+
switch (blendFunc) {
|
|
18
|
+
case BlendFunction.NULL:
|
|
19
|
+
return null;
|
|
20
|
+
case BlendFunction.ZERO:
|
|
21
|
+
return gl.ZERO;
|
|
22
|
+
case BlendFunction.ONE:
|
|
23
|
+
return gl.ONE;
|
|
24
|
+
case BlendFunction.SRC_COLOR:
|
|
25
|
+
return gl.SRC_COLOR;
|
|
26
|
+
case BlendFunction.ONE_MINUS_SRC_COLOR:
|
|
27
|
+
return gl.ONE_MINUS_SRC_COLOR;
|
|
28
|
+
case BlendFunction.DST_COLOR:
|
|
29
|
+
return gl.DST_COLOR;
|
|
30
|
+
case BlendFunction.ONE_MINUS_DST_COLOR:
|
|
31
|
+
return gl.ONE_MINUS_DST_COLOR;
|
|
32
|
+
case BlendFunction.SRC_ALPHA:
|
|
33
|
+
return gl.SRC_ALPHA;
|
|
34
|
+
case BlendFunction.ONE_MINUS_SRC_ALPHA:
|
|
35
|
+
return gl.ONE_MINUS_SRC_ALPHA;
|
|
36
|
+
case BlendFunction.DST_ALPHA:
|
|
37
|
+
return gl.DST_ALPHA;
|
|
38
|
+
case BlendFunction.ONE_MINUS_DST_ALPHA:
|
|
39
|
+
return gl.ONE_MINUS_DST_ALPHA;
|
|
40
|
+
}
|
|
41
|
+
throw new Error(`Invalid blend function specified in WebGLPipeline: ${ blendFunc }`);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export default class WebGLPipeline extends Pipeline {
|
|
45
|
+
private _blendEquation!: number;
|
|
46
|
+
private _blendFuncSrcColor!: number | null;
|
|
47
|
+
private _blendFuncSrcAlpha!: number | null;
|
|
48
|
+
private _blendFuncDstColor!: number | null;
|
|
49
|
+
private _blendFuncDstAlpha!: number | null;
|
|
50
|
+
private _blendFunc!: (a: number | null, b: number | null, c?: number | null, d?: number | null) => void;
|
|
51
|
+
|
|
52
|
+
create(): void {
|
|
53
|
+
const { gl } = this.renderer;
|
|
54
|
+
|
|
55
|
+
// Set the webgl equivalent values
|
|
56
|
+
this._blendEquation = getBlendEquation(gl, this.blendState.blendEquation);
|
|
57
|
+
this._blendFuncSrcColor = getBlendFunc(gl, this.blendState.blendFuncSrc);
|
|
58
|
+
this._blendFuncSrcAlpha = getBlendFunc(gl, this.blendState.blendFuncSrcAlpha);
|
|
59
|
+
this._blendFuncDstColor = getBlendFunc(gl, this.blendState.blendFuncDst);
|
|
60
|
+
this._blendFuncDstAlpha = getBlendFunc(gl, this.blendState.blendFuncDstAlpha);
|
|
61
|
+
if ((this._blendFuncDstAlpha === null && this._blendFuncSrcAlpha !== null) ||
|
|
62
|
+
(this._blendFuncDstAlpha !== null && this._blendFuncSrcAlpha === null))
|
|
63
|
+
{
|
|
64
|
+
throw new Error("WebGLPipeline.create(): Invalid values of blendFuncDstAlpha and blendFuncSrcAlpha");
|
|
65
|
+
}
|
|
66
|
+
this._blendFunc = this._blendFuncDstAlpha !== null ? (a,b) => gl.blendFunc(a,b) : (a,b,c,d) => gl.blendFuncSeparate(a,b,c,d);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
activate(): void {
|
|
70
|
+
const { gl, state } = this.renderer;
|
|
71
|
+
this.blendState.enabled ? gl.enable(gl.BLEND) : gl.disable(gl.BLEND);
|
|
72
|
+
gl.blendEquation(this._blendEquation);
|
|
73
|
+
this._blendFunc(
|
|
74
|
+
this._blendFuncSrcColor,
|
|
75
|
+
this._blendFuncDstColor,
|
|
76
|
+
this._blendFuncSrcAlpha,
|
|
77
|
+
this._blendFuncDstAlpha
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
state.depthTestEnabled = this.depthTest;
|
|
81
|
+
|
|
82
|
+
if (this.cullFace) {
|
|
83
|
+
gl.enable(gl.CULL_FACE);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
gl.disable(gl.CULL_FACE);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
89
|
}
|