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,165 +1,165 @@
|
|
|
1
|
-
import Shader from "../render/Shader";
|
|
2
|
-
import ShaderProgram from "../render/webgl/ShaderProgram";
|
|
3
|
-
import PolyListRenderer from '../render/PolyListRenderer';
|
|
4
|
-
import MaterialRenderer from '../render/MaterialRenderer';
|
|
5
|
-
import Mat4 from "../math/Mat4";
|
|
6
|
-
import Vec from "../math/Vec";
|
|
7
|
-
import WebGLRenderer from "../render/webgl/Renderer";
|
|
8
|
-
import Renderer from "../render/Renderer";
|
|
9
|
-
import WebGLTextureRenderer from "../render/webgl/TextureRenderer";
|
|
10
|
-
import WebGLPolyListRenderer from "../render/webgl/PolyListRenderer";
|
|
11
|
-
|
|
12
|
-
const g_code = {
|
|
13
|
-
webgl: {
|
|
14
|
-
vertex: `precision mediump float;
|
|
15
|
-
|
|
16
|
-
attribute vec3 vertPosition;
|
|
17
|
-
|
|
18
|
-
uniform mat4 uMVP;
|
|
19
|
-
|
|
20
|
-
varying vec3 fragNormal;
|
|
21
|
-
|
|
22
|
-
void main() {
|
|
23
|
-
gl_Position = uMVP * vec4(vertPosition, 1.0);
|
|
24
|
-
fragNormal = normalize(vertPosition);
|
|
25
|
-
}`,
|
|
26
|
-
|
|
27
|
-
fragment: (sampleCount: number, roughness: number) => `precision mediump float;
|
|
28
|
-
|
|
29
|
-
varying vec3 fragNormal;
|
|
30
|
-
|
|
31
|
-
uniform samplerCube uCubemap;
|
|
32
|
-
|
|
33
|
-
float vanDerCorpus(int n, int base) {
|
|
34
|
-
float invBase = 1.0 / float(base);
|
|
35
|
-
float denom = 1.0;
|
|
36
|
-
float result = 0.0;
|
|
37
|
-
|
|
38
|
-
for(int i = 0; i < 16; ++i)
|
|
39
|
-
{
|
|
40
|
-
if(n > 0)
|
|
41
|
-
{
|
|
42
|
-
denom = mod(float(n), 2.0);
|
|
43
|
-
result += denom * invBase;
|
|
44
|
-
invBase = invBase / 2.0;
|
|
45
|
-
n = int(float(n) / 2.0);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return result;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
vec2 hammersleyNoBitOps(int i, int N) {
|
|
53
|
-
return vec2(float(i)/float(N), vanDerCorpus(i, 2));
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
vec3 importanceSampleGGX(vec2 Xi, vec3 N) {
|
|
57
|
-
// compute roughness^4 outside the gpu
|
|
58
|
-
float a = ${ roughness*roughness*roughness*roughness };
|
|
59
|
-
|
|
60
|
-
float phi = ${ 2.0 * Math.PI } * Xi.x;
|
|
61
|
-
float cosTheta = sqrt((1.0 - Xi.y) / (1.0 + (a - 1.0) * Xi.y));
|
|
62
|
-
float sinTheta = sqrt(1.0 - cosTheta*cosTheta);
|
|
63
|
-
|
|
64
|
-
// from spherical coordinates to cartesian coordinates
|
|
65
|
-
vec3 H;
|
|
66
|
-
H.x = sin(phi) * sinTheta;
|
|
67
|
-
H.y = cos(phi) * sinTheta;
|
|
68
|
-
H.z = cosTheta;
|
|
69
|
-
|
|
70
|
-
// from tangent-space vector to world-space sample vector
|
|
71
|
-
vec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);
|
|
72
|
-
vec3 tangent = normalize(cross(up, N));
|
|
73
|
-
vec3 bitangent = cross(N, tangent);
|
|
74
|
-
|
|
75
|
-
vec3 sampleVec = tangent * H.x + bitangent * H.y + N * H.z;
|
|
76
|
-
return normalize(sampleVec);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
void main() {
|
|
80
|
-
vec3 N = normalize(fragNormal);
|
|
81
|
-
vec3 R = N;
|
|
82
|
-
vec3 V = R;
|
|
83
|
-
|
|
84
|
-
float totalWeight = 0.0;
|
|
85
|
-
vec3 prefilteredColor = vec3(0.0);
|
|
86
|
-
for (int i = 0; i < ${ sampleCount }; ++i)
|
|
87
|
-
{
|
|
88
|
-
vec2 Xi = hammersleyNoBitOps(i, ${ sampleCount });
|
|
89
|
-
vec3 H = importanceSampleGGX(Xi, N);
|
|
90
|
-
vec3 L = normalize(2.0 * dot(V, H) * H - V);
|
|
91
|
-
|
|
92
|
-
float NdotL = max(dot(N,L), 0.0);
|
|
93
|
-
if (NdotL > 0.0)
|
|
94
|
-
{
|
|
95
|
-
prefilteredColor += textureCube(uCubemap, L).rgb * NdotL;
|
|
96
|
-
totalWeight += NdotL;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
prefilteredColor = prefilteredColor / totalWeight;
|
|
100
|
-
|
|
101
|
-
gl_FragColor = vec4(prefilteredColor, 1.0);
|
|
102
|
-
}`
|
|
103
|
-
}
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
export default class SpecularMapCubeShader extends Shader {
|
|
107
|
-
protected _roughness: number = 0.4;
|
|
108
|
-
protected _program: ShaderProgram | null = null;
|
|
109
|
-
|
|
110
|
-
constructor(renderer: Renderer) {
|
|
111
|
-
super(renderer);
|
|
112
|
-
|
|
113
|
-
if (renderer.typeId !== "WebGL") {
|
|
114
|
-
throw Error("SpecularMapCubeShader is only compatible with WebGL renderer");
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
get roughness() { return this._roughness; }
|
|
119
|
-
|
|
120
|
-
async load() {
|
|
121
|
-
const { gl } = (this.renderer as WebGLRenderer);
|
|
122
|
-
|
|
123
|
-
// This matches with the getPrefilteredColor function in pbr.glsl
|
|
124
|
-
this._roughness = 0.4;
|
|
125
|
-
|
|
126
|
-
this._program = new ShaderProgram(gl, "SpecularMapCubeShader");
|
|
127
|
-
this._program.attachVertexSource(g_code.webgl.vertex);
|
|
128
|
-
this._program.attachFragmentSource(g_code.webgl.fragment(128, this._roughness));
|
|
129
|
-
this._program.link();
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
setup(
|
|
133
|
-
plistRenderer: PolyListRenderer,
|
|
134
|
-
materialRenderer: MaterialRenderer,
|
|
135
|
-
modelMatrix: Mat4,
|
|
136
|
-
viewMatrix: Mat4,
|
|
137
|
-
projectionMatrix: Mat4
|
|
138
|
-
) {
|
|
139
|
-
if (!this._program) {
|
|
140
|
-
throw new Error("SpecularMapCubeShader: Shader program is not loaded.");
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
const { material } = materialRenderer;
|
|
144
|
-
const rend = this.renderer as WebGLRenderer;
|
|
145
|
-
const { gl } = rend;
|
|
146
|
-
rend.state.shaderProgram = this._program;
|
|
147
|
-
|
|
148
|
-
const mvp = Mat4.Mult(projectionMatrix, viewMatrix);
|
|
149
|
-
this._program.uniformMatrix4fv('uMVP', false, mvp);
|
|
150
|
-
|
|
151
|
-
gl.activeTexture(gl.TEXTURE0);
|
|
152
|
-
this._program.uniform1i('uCubemap', 0);
|
|
153
|
-
const webglTexture = (materialRenderer.getTextureRenderer('albedoTexture') as WebGLTextureRenderer)?.getApiObject();
|
|
154
|
-
gl.bindTexture(gl.TEXTURE_CUBE_MAP, webglTexture);
|
|
155
|
-
|
|
156
|
-
this._program.positionAttribPointer((plistRenderer as WebGLPolyListRenderer).positionAttribParams('vertPosition'));
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
destroy() {
|
|
160
|
-
if (this._program) {
|
|
161
|
-
ShaderProgram.Delete(this._program);
|
|
162
|
-
this._program = null;
|
|
163
|
-
}
|
|
164
|
-
}
|
|
1
|
+
import Shader from "../render/Shader";
|
|
2
|
+
import ShaderProgram from "../render/webgl/ShaderProgram";
|
|
3
|
+
import PolyListRenderer from '../render/PolyListRenderer';
|
|
4
|
+
import MaterialRenderer from '../render/MaterialRenderer';
|
|
5
|
+
import Mat4 from "../math/Mat4";
|
|
6
|
+
import Vec from "../math/Vec";
|
|
7
|
+
import WebGLRenderer from "../render/webgl/Renderer";
|
|
8
|
+
import Renderer from "../render/Renderer";
|
|
9
|
+
import WebGLTextureRenderer from "../render/webgl/TextureRenderer";
|
|
10
|
+
import WebGLPolyListRenderer from "../render/webgl/PolyListRenderer";
|
|
11
|
+
|
|
12
|
+
const g_code = {
|
|
13
|
+
webgl: {
|
|
14
|
+
vertex: `precision mediump float;
|
|
15
|
+
|
|
16
|
+
attribute vec3 vertPosition;
|
|
17
|
+
|
|
18
|
+
uniform mat4 uMVP;
|
|
19
|
+
|
|
20
|
+
varying vec3 fragNormal;
|
|
21
|
+
|
|
22
|
+
void main() {
|
|
23
|
+
gl_Position = uMVP * vec4(vertPosition, 1.0);
|
|
24
|
+
fragNormal = normalize(vertPosition);
|
|
25
|
+
}`,
|
|
26
|
+
|
|
27
|
+
fragment: (sampleCount: number, roughness: number) => `precision mediump float;
|
|
28
|
+
|
|
29
|
+
varying vec3 fragNormal;
|
|
30
|
+
|
|
31
|
+
uniform samplerCube uCubemap;
|
|
32
|
+
|
|
33
|
+
float vanDerCorpus(int n, int base) {
|
|
34
|
+
float invBase = 1.0 / float(base);
|
|
35
|
+
float denom = 1.0;
|
|
36
|
+
float result = 0.0;
|
|
37
|
+
|
|
38
|
+
for(int i = 0; i < 16; ++i)
|
|
39
|
+
{
|
|
40
|
+
if(n > 0)
|
|
41
|
+
{
|
|
42
|
+
denom = mod(float(n), 2.0);
|
|
43
|
+
result += denom * invBase;
|
|
44
|
+
invBase = invBase / 2.0;
|
|
45
|
+
n = int(float(n) / 2.0);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
vec2 hammersleyNoBitOps(int i, int N) {
|
|
53
|
+
return vec2(float(i)/float(N), vanDerCorpus(i, 2));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
vec3 importanceSampleGGX(vec2 Xi, vec3 N) {
|
|
57
|
+
// compute roughness^4 outside the gpu
|
|
58
|
+
float a = ${ roughness*roughness*roughness*roughness };
|
|
59
|
+
|
|
60
|
+
float phi = ${ 2.0 * Math.PI } * Xi.x;
|
|
61
|
+
float cosTheta = sqrt((1.0 - Xi.y) / (1.0 + (a - 1.0) * Xi.y));
|
|
62
|
+
float sinTheta = sqrt(1.0 - cosTheta*cosTheta);
|
|
63
|
+
|
|
64
|
+
// from spherical coordinates to cartesian coordinates
|
|
65
|
+
vec3 H;
|
|
66
|
+
H.x = sin(phi) * sinTheta;
|
|
67
|
+
H.y = cos(phi) * sinTheta;
|
|
68
|
+
H.z = cosTheta;
|
|
69
|
+
|
|
70
|
+
// from tangent-space vector to world-space sample vector
|
|
71
|
+
vec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);
|
|
72
|
+
vec3 tangent = normalize(cross(up, N));
|
|
73
|
+
vec3 bitangent = cross(N, tangent);
|
|
74
|
+
|
|
75
|
+
vec3 sampleVec = tangent * H.x + bitangent * H.y + N * H.z;
|
|
76
|
+
return normalize(sampleVec);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
void main() {
|
|
80
|
+
vec3 N = normalize(fragNormal);
|
|
81
|
+
vec3 R = N;
|
|
82
|
+
vec3 V = R;
|
|
83
|
+
|
|
84
|
+
float totalWeight = 0.0;
|
|
85
|
+
vec3 prefilteredColor = vec3(0.0);
|
|
86
|
+
for (int i = 0; i < ${ sampleCount }; ++i)
|
|
87
|
+
{
|
|
88
|
+
vec2 Xi = hammersleyNoBitOps(i, ${ sampleCount });
|
|
89
|
+
vec3 H = importanceSampleGGX(Xi, N);
|
|
90
|
+
vec3 L = normalize(2.0 * dot(V, H) * H - V);
|
|
91
|
+
|
|
92
|
+
float NdotL = max(dot(N,L), 0.0);
|
|
93
|
+
if (NdotL > 0.0)
|
|
94
|
+
{
|
|
95
|
+
prefilteredColor += textureCube(uCubemap, L).rgb * NdotL;
|
|
96
|
+
totalWeight += NdotL;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
prefilteredColor = prefilteredColor / totalWeight;
|
|
100
|
+
|
|
101
|
+
gl_FragColor = vec4(prefilteredColor, 1.0);
|
|
102
|
+
}`
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
export default class SpecularMapCubeShader extends Shader {
|
|
107
|
+
protected _roughness: number = 0.4;
|
|
108
|
+
protected _program: ShaderProgram | null = null;
|
|
109
|
+
|
|
110
|
+
constructor(renderer: Renderer) {
|
|
111
|
+
super(renderer);
|
|
112
|
+
|
|
113
|
+
if (renderer.typeId !== "WebGL") {
|
|
114
|
+
throw Error("SpecularMapCubeShader is only compatible with WebGL renderer");
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
get roughness() { return this._roughness; }
|
|
119
|
+
|
|
120
|
+
async load() {
|
|
121
|
+
const { gl } = (this.renderer as WebGLRenderer);
|
|
122
|
+
|
|
123
|
+
// This matches with the getPrefilteredColor function in pbr.glsl
|
|
124
|
+
this._roughness = 0.4;
|
|
125
|
+
|
|
126
|
+
this._program = new ShaderProgram(gl, "SpecularMapCubeShader");
|
|
127
|
+
this._program.attachVertexSource(g_code.webgl.vertex);
|
|
128
|
+
this._program.attachFragmentSource(g_code.webgl.fragment(128, this._roughness));
|
|
129
|
+
this._program.link();
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
setup(
|
|
133
|
+
plistRenderer: PolyListRenderer,
|
|
134
|
+
materialRenderer: MaterialRenderer,
|
|
135
|
+
modelMatrix: Mat4,
|
|
136
|
+
viewMatrix: Mat4,
|
|
137
|
+
projectionMatrix: Mat4
|
|
138
|
+
) {
|
|
139
|
+
if (!this._program) {
|
|
140
|
+
throw new Error("SpecularMapCubeShader: Shader program is not loaded.");
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const { material } = materialRenderer;
|
|
144
|
+
const rend = this.renderer as WebGLRenderer;
|
|
145
|
+
const { gl } = rend;
|
|
146
|
+
rend.state.shaderProgram = this._program;
|
|
147
|
+
|
|
148
|
+
const mvp = Mat4.Mult(projectionMatrix, viewMatrix);
|
|
149
|
+
this._program.uniformMatrix4fv('uMVP', false, mvp);
|
|
150
|
+
|
|
151
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
152
|
+
this._program.uniform1i('uCubemap', 0);
|
|
153
|
+
const webglTexture = (materialRenderer.getTextureRenderer('albedoTexture') as WebGLTextureRenderer)?.getApiObject();
|
|
154
|
+
gl.bindTexture(gl.TEXTURE_CUBE_MAP, webglTexture);
|
|
155
|
+
|
|
156
|
+
this._program.positionAttribPointer((plistRenderer as WebGLPolyListRenderer).positionAttribParams('vertPosition'));
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
destroy() {
|
|
160
|
+
if (this._program) {
|
|
161
|
+
ShaderProgram.Delete(this._program);
|
|
162
|
+
this._program = null;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
165
|
}
|
|
@@ -1,171 +1,171 @@
|
|
|
1
|
-
|
|
2
|
-
import Texture, { TextureChannel } from '../base/Texture';
|
|
3
|
-
import PolyListRenderer from '../render/PolyListRenderer';
|
|
4
|
-
import MaterialRenderer from '../render/MaterialRenderer';
|
|
5
|
-
import Renderer from '../render/Renderer';
|
|
6
|
-
import WebGLRenderer from '../render/webgl/Renderer';
|
|
7
|
-
import Shader from '../render/Shader';
|
|
8
|
-
import ShaderProgram from '../render/webgl/ShaderProgram';
|
|
9
|
-
import Mat4 from '../math/Mat4';
|
|
10
|
-
import WebGLTextureRenderer from '../render/webgl/TextureRenderer';
|
|
11
|
-
import WebGLPolyListRenderer from '../render/webgl/PolyListRenderer';
|
|
12
|
-
|
|
13
|
-
const g_code = {
|
|
14
|
-
webgl: {
|
|
15
|
-
vertex: `precision mediump float;
|
|
16
|
-
|
|
17
|
-
attribute vec3 position;
|
|
18
|
-
attribute vec2 texCoord;
|
|
19
|
-
|
|
20
|
-
varying vec2 fragTexCoord;
|
|
21
|
-
|
|
22
|
-
void main() {
|
|
23
|
-
fragTexCoord = texCoord;
|
|
24
|
-
gl_Position = vec4(position, 1.0);
|
|
25
|
-
}`,
|
|
26
|
-
|
|
27
|
-
fragment: `precision mediump float;
|
|
28
|
-
|
|
29
|
-
varying vec2 fragTexCoord;
|
|
30
|
-
|
|
31
|
-
uniform sampler2D uTextureR;
|
|
32
|
-
uniform sampler2D uTextureG;
|
|
33
|
-
uniform sampler2D uTextureB;
|
|
34
|
-
uniform sampler2D uTextureA;
|
|
35
|
-
|
|
36
|
-
uniform int uRChannel;
|
|
37
|
-
uniform int uGChannel;
|
|
38
|
-
uniform int uBChannel;
|
|
39
|
-
uniform int uAChannel;
|
|
40
|
-
|
|
41
|
-
float getChannel(vec4 color, int channel) {
|
|
42
|
-
if (channel == 1) {
|
|
43
|
-
return color.r;
|
|
44
|
-
}
|
|
45
|
-
else if (channel == 2) {
|
|
46
|
-
return color.g;
|
|
47
|
-
}
|
|
48
|
-
else if (channel == 3) {
|
|
49
|
-
return color.b;
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
return color.a;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
void main() {
|
|
57
|
-
vec4 result = vec4(
|
|
58
|
-
getChannel(texture2D(uTextureR, fragTexCoord), uRChannel),
|
|
59
|
-
getChannel(texture2D(uTextureG, fragTexCoord), uGChannel),
|
|
60
|
-
getChannel(texture2D(uTextureB, fragTexCoord), uBChannel),
|
|
61
|
-
getChannel(texture2D(uTextureA, fragTexCoord), uAChannel)
|
|
62
|
-
);
|
|
63
|
-
|
|
64
|
-
gl_FragColor = result;
|
|
65
|
-
}`
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const g_renderers: { [key: string]: TextureMergerShader } = {};
|
|
70
|
-
export default class TextureMergerShader extends Shader {
|
|
71
|
-
protected _textures: { [key in TextureChannel]?: Texture | null };
|
|
72
|
-
protected _textureChannels: { [key in TextureChannel]?: TextureChannel };
|
|
73
|
-
protected _program!: ShaderProgram;
|
|
74
|
-
|
|
75
|
-
static GetUnique(renderer: Renderer) {
|
|
76
|
-
if (!g_renderers[renderer.uniqueId]) {
|
|
77
|
-
g_renderers[renderer.uniqueId] = new TextureMergerShader(renderer);
|
|
78
|
-
g_renderers[renderer.uniqueId].load();
|
|
79
|
-
}
|
|
80
|
-
return g_renderers[renderer.uniqueId];
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
constructor(renderer: Renderer) {
|
|
84
|
-
super(renderer);
|
|
85
|
-
|
|
86
|
-
if (renderer.typeId !== "WebGL") {
|
|
87
|
-
throw Error("TextureMergerShader is only compatible with WebGL renderer");
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
this._textures = {};
|
|
91
|
-
this._textureChannels = {};
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
async load() {
|
|
95
|
-
const { gl } = (this.renderer as WebGLRenderer);
|
|
96
|
-
|
|
97
|
-
this._program = new ShaderProgram(gl, "DefaultTextureMergerShader");
|
|
98
|
-
this._program.attachVertexSource(g_code.webgl.vertex);
|
|
99
|
-
this._program.attachFragmentSource(g_code.webgl.fragment);
|
|
100
|
-
this._program.link();
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
setTexture(
|
|
104
|
-
tex: Texture,
|
|
105
|
-
channel: TextureChannel,
|
|
106
|
-
dstChannel = TextureChannel.R
|
|
107
|
-
) {
|
|
108
|
-
if (channel<TextureChannel.R || channel>TextureChannel.A) {
|
|
109
|
-
throw new Error(`TextureMergerShader: invalid texture channel set ${ channel }`);
|
|
110
|
-
}
|
|
111
|
-
this._textures[channel] = tex;
|
|
112
|
-
this._textureChannels[channel] = dstChannel;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
get isComplete() {
|
|
116
|
-
return this._textures[TextureChannel.R] &&
|
|
117
|
-
this._textures[TextureChannel.G] &&
|
|
118
|
-
this._textures[TextureChannel.B] &&
|
|
119
|
-
this._textures[TextureChannel.A] && true;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
setup(
|
|
123
|
-
plistRenderer: PolyListRenderer,
|
|
124
|
-
materialRenderer: MaterialRenderer,
|
|
125
|
-
modelMatrix: Mat4,
|
|
126
|
-
viewMatrix: Mat4,
|
|
127
|
-
projectionMatrix: Mat4
|
|
128
|
-
) {
|
|
129
|
-
if (!this.isComplete) {
|
|
130
|
-
throw new Error("TextureMergerShader: the texture shader is not complete. Check that the textures are set for all channels");
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
if (!this._program) {
|
|
134
|
-
throw new Error("TextureMergerShader: shader program is not loaded");
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
const rend = this.renderer as WebGLRenderer;
|
|
138
|
-
|
|
139
|
-
rend.state.shaderProgram = this._program;
|
|
140
|
-
|
|
141
|
-
if (!this._textures[TextureChannel.R]) {
|
|
142
|
-
throw new Error("TextureMergerShader: R texture is not set");
|
|
143
|
-
}
|
|
144
|
-
if (!this._textures[TextureChannel.G]) {
|
|
145
|
-
throw new Error("TextureMergerShader: G texture is not set");
|
|
146
|
-
}
|
|
147
|
-
if (!this._textures[TextureChannel.B]) {
|
|
148
|
-
throw new Error("TextureMergerShader: B texture is not set");
|
|
149
|
-
}
|
|
150
|
-
if (!this._textures[TextureChannel.A]) {
|
|
151
|
-
throw new Error("TextureMergerShader: A texture is not set");
|
|
152
|
-
}
|
|
153
|
-
const r = this.renderer.factory.texture(this._textures[TextureChannel.R]) as WebGLTextureRenderer;
|
|
154
|
-
const g = this.renderer.factory.texture(this._textures[TextureChannel.G]) as WebGLTextureRenderer;
|
|
155
|
-
const b = this.renderer.factory.texture(this._textures[TextureChannel.B]) as WebGLTextureRenderer;
|
|
156
|
-
const a = this.renderer.factory.texture(this._textures[TextureChannel.A]) as WebGLTextureRenderer;
|
|
157
|
-
|
|
158
|
-
this._program.bindTexture("uTextureR", r, 0);
|
|
159
|
-
this._program.bindTexture("uTextureG", g, 1);
|
|
160
|
-
this._program.bindTexture("uTextureB", b, 2);
|
|
161
|
-
this._program.bindTexture("uTextureA", a, 3);
|
|
162
|
-
|
|
163
|
-
this._program.uniform1i("uRChannel", this._textureChannels[TextureChannel.R] || 0);
|
|
164
|
-
this._program.uniform1i("uGChannel", this._textureChannels[TextureChannel.G] || 1);
|
|
165
|
-
this._program.uniform1i("uBChannel", this._textureChannels[TextureChannel.B] || 2);
|
|
166
|
-
this._program.uniform1i("uAChannel", this._textureChannels[TextureChannel.A] || 3);
|
|
167
|
-
|
|
168
|
-
this._program.positionAttribPointer((plistRenderer as WebGLPolyListRenderer).positionAttribParams("position"));
|
|
169
|
-
this._program.texCoordAttribPointer((plistRenderer as WebGLPolyListRenderer).texCoord0AttribParams("texCoord"));
|
|
170
|
-
}
|
|
171
|
-
}
|
|
1
|
+
|
|
2
|
+
import Texture, { TextureChannel } from '../base/Texture';
|
|
3
|
+
import PolyListRenderer from '../render/PolyListRenderer';
|
|
4
|
+
import MaterialRenderer from '../render/MaterialRenderer';
|
|
5
|
+
import Renderer from '../render/Renderer';
|
|
6
|
+
import WebGLRenderer from '../render/webgl/Renderer';
|
|
7
|
+
import Shader from '../render/Shader';
|
|
8
|
+
import ShaderProgram from '../render/webgl/ShaderProgram';
|
|
9
|
+
import Mat4 from '../math/Mat4';
|
|
10
|
+
import WebGLTextureRenderer from '../render/webgl/TextureRenderer';
|
|
11
|
+
import WebGLPolyListRenderer from '../render/webgl/PolyListRenderer';
|
|
12
|
+
|
|
13
|
+
const g_code = {
|
|
14
|
+
webgl: {
|
|
15
|
+
vertex: `precision mediump float;
|
|
16
|
+
|
|
17
|
+
attribute vec3 position;
|
|
18
|
+
attribute vec2 texCoord;
|
|
19
|
+
|
|
20
|
+
varying vec2 fragTexCoord;
|
|
21
|
+
|
|
22
|
+
void main() {
|
|
23
|
+
fragTexCoord = texCoord;
|
|
24
|
+
gl_Position = vec4(position, 1.0);
|
|
25
|
+
}`,
|
|
26
|
+
|
|
27
|
+
fragment: `precision mediump float;
|
|
28
|
+
|
|
29
|
+
varying vec2 fragTexCoord;
|
|
30
|
+
|
|
31
|
+
uniform sampler2D uTextureR;
|
|
32
|
+
uniform sampler2D uTextureG;
|
|
33
|
+
uniform sampler2D uTextureB;
|
|
34
|
+
uniform sampler2D uTextureA;
|
|
35
|
+
|
|
36
|
+
uniform int uRChannel;
|
|
37
|
+
uniform int uGChannel;
|
|
38
|
+
uniform int uBChannel;
|
|
39
|
+
uniform int uAChannel;
|
|
40
|
+
|
|
41
|
+
float getChannel(vec4 color, int channel) {
|
|
42
|
+
if (channel == 1) {
|
|
43
|
+
return color.r;
|
|
44
|
+
}
|
|
45
|
+
else if (channel == 2) {
|
|
46
|
+
return color.g;
|
|
47
|
+
}
|
|
48
|
+
else if (channel == 3) {
|
|
49
|
+
return color.b;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
return color.a;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
void main() {
|
|
57
|
+
vec4 result = vec4(
|
|
58
|
+
getChannel(texture2D(uTextureR, fragTexCoord), uRChannel),
|
|
59
|
+
getChannel(texture2D(uTextureG, fragTexCoord), uGChannel),
|
|
60
|
+
getChannel(texture2D(uTextureB, fragTexCoord), uBChannel),
|
|
61
|
+
getChannel(texture2D(uTextureA, fragTexCoord), uAChannel)
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
gl_FragColor = result;
|
|
65
|
+
}`
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const g_renderers: { [key: string]: TextureMergerShader } = {};
|
|
70
|
+
export default class TextureMergerShader extends Shader {
|
|
71
|
+
protected _textures: { [key in TextureChannel]?: Texture | null };
|
|
72
|
+
protected _textureChannels: { [key in TextureChannel]?: TextureChannel };
|
|
73
|
+
protected _program!: ShaderProgram;
|
|
74
|
+
|
|
75
|
+
static GetUnique(renderer: Renderer) {
|
|
76
|
+
if (!g_renderers[renderer.uniqueId]) {
|
|
77
|
+
g_renderers[renderer.uniqueId] = new TextureMergerShader(renderer);
|
|
78
|
+
g_renderers[renderer.uniqueId].load();
|
|
79
|
+
}
|
|
80
|
+
return g_renderers[renderer.uniqueId];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
constructor(renderer: Renderer) {
|
|
84
|
+
super(renderer);
|
|
85
|
+
|
|
86
|
+
if (renderer.typeId !== "WebGL") {
|
|
87
|
+
throw Error("TextureMergerShader is only compatible with WebGL renderer");
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
this._textures = {};
|
|
91
|
+
this._textureChannels = {};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
async load() {
|
|
95
|
+
const { gl } = (this.renderer as WebGLRenderer);
|
|
96
|
+
|
|
97
|
+
this._program = new ShaderProgram(gl, "DefaultTextureMergerShader");
|
|
98
|
+
this._program.attachVertexSource(g_code.webgl.vertex);
|
|
99
|
+
this._program.attachFragmentSource(g_code.webgl.fragment);
|
|
100
|
+
this._program.link();
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
setTexture(
|
|
104
|
+
tex: Texture,
|
|
105
|
+
channel: TextureChannel,
|
|
106
|
+
dstChannel = TextureChannel.R
|
|
107
|
+
) {
|
|
108
|
+
if (channel<TextureChannel.R || channel>TextureChannel.A) {
|
|
109
|
+
throw new Error(`TextureMergerShader: invalid texture channel set ${ channel }`);
|
|
110
|
+
}
|
|
111
|
+
this._textures[channel] = tex;
|
|
112
|
+
this._textureChannels[channel] = dstChannel;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
get isComplete() {
|
|
116
|
+
return this._textures[TextureChannel.R] &&
|
|
117
|
+
this._textures[TextureChannel.G] &&
|
|
118
|
+
this._textures[TextureChannel.B] &&
|
|
119
|
+
this._textures[TextureChannel.A] && true;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
setup(
|
|
123
|
+
plistRenderer: PolyListRenderer,
|
|
124
|
+
materialRenderer: MaterialRenderer,
|
|
125
|
+
modelMatrix: Mat4,
|
|
126
|
+
viewMatrix: Mat4,
|
|
127
|
+
projectionMatrix: Mat4
|
|
128
|
+
) {
|
|
129
|
+
if (!this.isComplete) {
|
|
130
|
+
throw new Error("TextureMergerShader: the texture shader is not complete. Check that the textures are set for all channels");
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (!this._program) {
|
|
134
|
+
throw new Error("TextureMergerShader: shader program is not loaded");
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const rend = this.renderer as WebGLRenderer;
|
|
138
|
+
|
|
139
|
+
rend.state.shaderProgram = this._program;
|
|
140
|
+
|
|
141
|
+
if (!this._textures[TextureChannel.R]) {
|
|
142
|
+
throw new Error("TextureMergerShader: R texture is not set");
|
|
143
|
+
}
|
|
144
|
+
if (!this._textures[TextureChannel.G]) {
|
|
145
|
+
throw new Error("TextureMergerShader: G texture is not set");
|
|
146
|
+
}
|
|
147
|
+
if (!this._textures[TextureChannel.B]) {
|
|
148
|
+
throw new Error("TextureMergerShader: B texture is not set");
|
|
149
|
+
}
|
|
150
|
+
if (!this._textures[TextureChannel.A]) {
|
|
151
|
+
throw new Error("TextureMergerShader: A texture is not set");
|
|
152
|
+
}
|
|
153
|
+
const r = this.renderer.factory.texture(this._textures[TextureChannel.R]) as WebGLTextureRenderer;
|
|
154
|
+
const g = this.renderer.factory.texture(this._textures[TextureChannel.G]) as WebGLTextureRenderer;
|
|
155
|
+
const b = this.renderer.factory.texture(this._textures[TextureChannel.B]) as WebGLTextureRenderer;
|
|
156
|
+
const a = this.renderer.factory.texture(this._textures[TextureChannel.A]) as WebGLTextureRenderer;
|
|
157
|
+
|
|
158
|
+
this._program.bindTexture("uTextureR", r, 0);
|
|
159
|
+
this._program.bindTexture("uTextureG", g, 1);
|
|
160
|
+
this._program.bindTexture("uTextureB", b, 2);
|
|
161
|
+
this._program.bindTexture("uTextureA", a, 3);
|
|
162
|
+
|
|
163
|
+
this._program.uniform1i("uRChannel", this._textureChannels[TextureChannel.R] || 0);
|
|
164
|
+
this._program.uniform1i("uGChannel", this._textureChannels[TextureChannel.G] || 1);
|
|
165
|
+
this._program.uniform1i("uBChannel", this._textureChannels[TextureChannel.B] || 2);
|
|
166
|
+
this._program.uniform1i("uAChannel", this._textureChannels[TextureChannel.A] || 3);
|
|
167
|
+
|
|
168
|
+
this._program.positionAttribPointer((plistRenderer as WebGLPolyListRenderer).positionAttribParams("position"));
|
|
169
|
+
this._program.texCoordAttribPointer((plistRenderer as WebGLPolyListRenderer).texCoord0AttribParams("texCoord"));
|
|
170
|
+
}
|
|
171
|
+
}
|