bg2e-js 2.1.1 → 2.2.0

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.
Files changed (147) hide show
  1. package/dist/bg2e-js.js +7031 -6989
  2. package/dist/bg2e-js.js.map +1 -1
  3. package/package.json +20 -2
  4. package/src/app/AppController.ts +39 -0
  5. package/src/app/Bg2KeyboardEvent.ts +54 -0
  6. package/src/app/Bg2MouseEvent.ts +82 -0
  7. package/src/app/Bg2TouchEvent.ts +18 -0
  8. package/src/app/Canvas.ts +108 -0
  9. package/src/app/EventBase.ts +10 -0
  10. package/src/app/MainLoop.ts +273 -0
  11. package/src/app/index.ts +25 -0
  12. package/src/base/Color.ts +134 -0
  13. package/src/base/Environment.ts +183 -0
  14. package/src/base/Light.ts +192 -0
  15. package/src/base/Material.ts +616 -0
  16. package/src/base/PolyList.ts +365 -0
  17. package/src/base/Texture.ts +620 -0
  18. package/src/base/index.ts +81 -0
  19. package/src/db/Bg2LoaderPlugin.ts +129 -0
  20. package/src/db/DBPluginApi.ts +48 -0
  21. package/src/db/Loader.ts +116 -0
  22. package/src/db/LoaderPlugin.ts +34 -0
  23. package/src/db/MtlParser.ts +7 -0
  24. package/src/db/ObjLoaderPlugin.ts +55 -0
  25. package/src/db/ObjParser.ts +252 -0
  26. package/src/db/ObjWriterPlugin.ts +19 -0
  27. package/src/db/VitscnjLoaderPlugin.ts +100 -0
  28. package/src/db/Writer.ts +52 -0
  29. package/src/db/WriterPlugin.ts +22 -0
  30. package/src/db/index.ts +44 -0
  31. package/src/debug/DebugRenderer.ts +173 -0
  32. package/src/debug/WebGLTextureViewer.ts +75 -0
  33. package/src/debug/index.ts +7 -0
  34. package/src/index.html +11 -0
  35. package/src/index.ts +33 -0
  36. package/src/manipulation/SelectionBuffer.ts +82 -0
  37. package/src/manipulation/SelectionHighlight.ts +85 -0
  38. package/src/manipulation/SelectionIdAssignVisitor.ts +97 -0
  39. package/src/manipulation/SelectionManager.ts +166 -0
  40. package/src/manipulation/SelectionMode.ts +6 -0
  41. package/src/math/Mat3.ts +259 -0
  42. package/src/math/Mat4.ts +706 -0
  43. package/src/math/MatrixStrategy.ts +25 -0
  44. package/src/math/Quat.ts +65 -0
  45. package/src/math/Vec.ts +753 -0
  46. package/src/math/constants.ts +47 -0
  47. package/src/math/functions.ts +103 -0
  48. package/src/math/index.ts +74 -0
  49. package/src/phsics/joint.ts +137 -0
  50. package/src/primitives/arrow.ts +58 -0
  51. package/src/primitives/cone.ts +138 -0
  52. package/src/primitives/cube.ts +60 -0
  53. package/src/primitives/cylinder.ts +216 -0
  54. package/src/primitives/index.ts +13 -0
  55. package/src/primitives/plane.ts +31 -0
  56. package/src/primitives/sphere.ts +809 -0
  57. package/src/render/BRDFIntegrationMap.ts +4 -0
  58. package/src/render/Environment.ts +136 -0
  59. package/src/render/FrameBuffer.ts +35 -0
  60. package/src/render/MaterialRenderer.ts +34 -0
  61. package/src/render/Pipeline.ts +109 -0
  62. package/src/render/PolyListRenderer.ts +47 -0
  63. package/src/render/RenderBuffer.ts +197 -0
  64. package/src/render/RenderQueue.ts +199 -0
  65. package/src/render/RenderState.ts +116 -0
  66. package/src/render/Renderer.ts +248 -0
  67. package/src/render/SceneAppController.ts +238 -0
  68. package/src/render/SceneRenderer.ts +373 -0
  69. package/src/render/Shader.ts +32 -0
  70. package/src/render/ShadowRenderer.ts +176 -0
  71. package/src/render/SkyCube.ts +106 -0
  72. package/src/render/SkySphere.ts +118 -0
  73. package/src/render/TextureMergerRenderer.ts +70 -0
  74. package/src/render/TextureRenderer.ts +34 -0
  75. package/src/render/index.ts +67 -0
  76. package/src/render/webgl/FrameBuffer.ts +10 -0
  77. package/src/render/webgl/MaterialRenderer.ts +113 -0
  78. package/src/render/webgl/Pipeline.ts +89 -0
  79. package/src/render/webgl/PolyListRenderer.ts +260 -0
  80. package/src/render/webgl/RenderBuffer.ts +227 -0
  81. package/src/render/webgl/Renderer.ts +262 -0
  82. package/src/render/webgl/SceneRenderer.ts +68 -0
  83. package/src/render/webgl/ShaderProgram.ts +424 -0
  84. package/src/render/webgl/ShadowRenderer.ts +6 -0
  85. package/src/render/webgl/SkyCube.ts +16 -0
  86. package/src/render/webgl/SkySphere.ts +16 -0
  87. package/src/render/webgl/State.ts +152 -0
  88. package/src/render/webgl/TextureRenderer.ts +167 -0
  89. package/src/render/webgl/VertexBuffer.ts +137 -0
  90. package/src/render/webgl/index.ts +35 -0
  91. package/src/scene/Camera.ts +458 -0
  92. package/src/scene/Chain.ts +44 -0
  93. package/src/scene/ChainJoint.ts +58 -0
  94. package/src/scene/Component.ts +173 -0
  95. package/src/scene/ComponentMap.ts +107 -0
  96. package/src/scene/Drawable.ts +154 -0
  97. package/src/scene/EnvironmentComponent.ts +142 -0
  98. package/src/scene/FindNodeVisitor.ts +60 -0
  99. package/src/scene/LightComponent.ts +155 -0
  100. package/src/scene/MatrixState.ts +46 -0
  101. package/src/scene/Node.ts +314 -0
  102. package/src/scene/NodeVisitor.ts +15 -0
  103. package/src/scene/OrbitCameraController.ts +450 -0
  104. package/src/scene/SmoothOrbitCameraController.ts +99 -0
  105. package/src/scene/Transform.ts +73 -0
  106. package/src/scene/index.ts +57 -0
  107. package/src/shaders/BasicDiffuseColorShader.ts +111 -0
  108. package/src/shaders/BasicPBRLightShader.ts +277 -0
  109. package/src/shaders/DebugRenderShader.ts +98 -0
  110. package/src/shaders/DepthRenderShader.ts +91 -0
  111. package/src/shaders/IrradianceMapCubeShader.ts +116 -0
  112. package/src/shaders/PBRLightIBLShader.ts +487 -0
  113. package/src/shaders/PickSelectionShader.ts +101 -0
  114. package/src/shaders/PresentDebugFramebufferShader.ts +118 -0
  115. package/src/shaders/PresentTextureShader.ts +99 -0
  116. package/src/shaders/SelectionHighlightShader.ts +127 -0
  117. package/src/shaders/ShaderFunction.ts +318 -0
  118. package/src/shaders/SkyCubeShader.ts +94 -0
  119. package/src/shaders/SkySphereShader.ts +102 -0
  120. package/src/shaders/SpecularMapCubeShader.ts +165 -0
  121. package/src/shaders/TextureMergerShader.ts +171 -0
  122. package/src/shaders/index.ts +37 -0
  123. package/src/shaders/webgl/color_correction.glsl +47 -0
  124. package/src/shaders/webgl/constants.glsl +6 -0
  125. package/src/shaders/webgl/index.ts +70 -0
  126. package/src/shaders/webgl/normal_map.glsl +9 -0
  127. package/src/shaders/webgl/pbr.glsl +173 -0
  128. package/src/shaders/webgl/uniforms.glsl +91 -0
  129. package/src/shaders/webgl_shader_lib.ts +213 -0
  130. package/src/tools/BinaryResourceProvider.ts +14 -0
  131. package/src/tools/ImageResourceProvider.ts +66 -0
  132. package/src/tools/MaterialModifier.ts +276 -0
  133. package/src/tools/Resource.ts +203 -0
  134. package/src/tools/ResourceProvider.ts +69 -0
  135. package/src/tools/TextResourceProvider.ts +24 -0
  136. package/src/tools/TextureCache.ts +52 -0
  137. package/src/tools/TextureResourceDatabase.ts +100 -0
  138. package/src/tools/UserAgent.ts +362 -0
  139. package/src/tools/VideoResourceProvider.ts +50 -0
  140. package/src/tools/WriteStrategy.ts +22 -0
  141. package/src/tools/base64.ts +11 -0
  142. package/src/tools/crypto.ts +19 -0
  143. package/src/tools/endiantess.ts +13 -0
  144. package/src/tools/image.ts +18 -0
  145. package/src/tools/index.ts +41 -0
  146. package/src/tools/processType.ts +38 -0
  147. package/src/vite-env.d.ts +12 -0
@@ -0,0 +1,102 @@
1
+ import Shader from "../render/Shader";
2
+ import ShaderProgram from "../render/webgl/ShaderProgram";
3
+ import { TextureTargetName } from "../base/Texture";
4
+ import PolyListRenderer from '../render/PolyListRenderer';
5
+ import MaterialRenderer from '../render/MaterialRenderer';
6
+ import Mat4 from "../math/Mat4";
7
+ import Renderer from "../render/Renderer";
8
+ import WebGLRenderer from "../render/webgl/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
+ attribute vec2 t0Position;
18
+
19
+ varying vec2 fragT0Pos;
20
+
21
+ uniform mat4 mView;
22
+ uniform mat4 mProj;
23
+
24
+ void main() {
25
+ fragT0Pos = t0Position;
26
+ gl_Position = mProj * mView * vec4(vertPosition, 1.0);
27
+ }`,
28
+
29
+ fragment: `precision mediump float;
30
+
31
+ varying vec2 fragT0Pos;
32
+
33
+ uniform sampler2D uTexture;
34
+
35
+ void main() {
36
+ vec4 texColor = texture2D(uTexture, fragT0Pos);
37
+ gl_FragColor = vec4(texColor.rgb, 1.0);
38
+ }`
39
+ }
40
+ };
41
+
42
+ export default class SkySphereShader extends Shader {
43
+ protected _program: ShaderProgram | null = null;
44
+
45
+ constructor(renderer: Renderer) {
46
+ super(renderer);
47
+
48
+ if (renderer.typeId !== "WebGL") {
49
+ throw Error("SkySphereShader is only compatible with WebGL renderer");
50
+ }
51
+ }
52
+
53
+ async load() {
54
+ const { gl } = (this.renderer as WebGLRenderer);
55
+ this._program = new ShaderProgram(gl, "SkySphereShader");
56
+ this._program.attachVertexSource(g_code.webgl.vertex);
57
+ this._program.attachFragmentSource(g_code.webgl.fragment);
58
+ this._program.link();
59
+ }
60
+
61
+ setup(
62
+ plistRenderer: PolyListRenderer,
63
+ materialRenderer: MaterialRenderer,
64
+ modelMatrix: Mat4,
65
+ viewMatrix: Mat4,
66
+ projectionMatrix: Mat4
67
+ ) {
68
+ if (!this._program) {
69
+ throw new Error("SkySphereShader: shader program is not loaded");
70
+ }
71
+
72
+
73
+ const { material } = materialRenderer;
74
+ if (!material.albedoTexture) {
75
+ throw new Error("SkySphereShader: material does not have an albedo texture");
76
+ }
77
+
78
+ const rend = this.renderer as WebGLRenderer;
79
+ const { gl } = rend;
80
+ rend.state.shaderProgram = this._program;
81
+
82
+ this._program.uniformMatrix4fv('mView', false, viewMatrix);
83
+ this._program.uniformMatrix4fv('mProj', false, projectionMatrix);
84
+
85
+ gl.activeTexture(gl.TEXTURE0);
86
+ this._program.uniform1i('uTexture', 0);
87
+
88
+ const webglTexture = (materialRenderer.getTextureRenderer('albedoTexture') as WebGLTextureRenderer)?.getApiObject();
89
+ const target = TextureTargetName[material.albedoTexture.target];
90
+ gl.bindTexture((gl as any)[target], webglTexture);
91
+
92
+ this._program.positionAttribPointer((plistRenderer as WebGLPolyListRenderer).positionAttribParams("vertPosition"));
93
+ this._program.texCoordAttribPointer((plistRenderer as WebGLPolyListRenderer).texCoord0AttribParams("t0Position"));
94
+ }
95
+
96
+ destroy() {
97
+ if (this._program) {
98
+ ShaderProgram.Delete(this._program);
99
+ this._program = null;
100
+ }
101
+ }
102
+ }
@@ -0,0 +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
+ }
165
+ }
@@ -0,0 +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
+ }
@@ -0,0 +1,37 @@
1
+ import BasicDiffuseColorShader from "./BasicDiffuseColorShader";
2
+ import BasicPBRLightShader from "./BasicPBRLightShader";
3
+ import DebugRenderShader from "./DebugRenderShader";
4
+ import DepthRenderShader from "./DepthRenderShader";
5
+ import IrradianceMapCubeShader from "./IrradianceMapCubeShader";
6
+ import PBRLightIBLShader from "./PBRLightIBLShader";
7
+ import PickSelectionShader from "./PickSelectionShader";
8
+ import PresentDebugFramebufferShader from "./PresentDebugFramebufferShader";
9
+ import PresentTextureShader from "./PresentTextureShader";
10
+ import SelectionHighlightShader from "./SelectionHighlightShader";
11
+ import ShaderFunction from "./ShaderFunction";
12
+ import SkyCubeShader from "./SkyCubeShader";
13
+ import SkySphereShader from "./SkySphereShader";
14
+ import SpecularMapCubeShader from "./SpecularMapCubeShader";
15
+ import TextureMergerShader from "./TextureMergerShader";
16
+ import * as webgl_shader_lib from "./webgl_shader_lib";
17
+
18
+ export default {
19
+ BasicDiffuseColorShader,
20
+ BasicPBRLightShader,
21
+ DebugRenderShader,
22
+ DepthRenderShader,
23
+ IrradianceMapCubeShader,
24
+ PBRLightIBLShader,
25
+ PickSelectionShader,
26
+ PresentDebugFramebufferShader,
27
+ PresentTextureShader,
28
+ SelectionHighlightShader,
29
+ ShaderFunction,
30
+ SkyCubeShader,
31
+ SkySphereShader,
32
+ SpecularMapCubeShader,
33
+ TextureMergerShader,
34
+ shaderLib: {
35
+ webgl: webgl_shader_lib
36
+ }
37
+ }
@@ -0,0 +1,47 @@
1
+ #ifndef COLOR_CORRECTION_GLSL
2
+ #define COLOR_CORRECTION_GLSL
3
+
4
+ // Convert lineal color to SRGB for shader output
5
+ vec4 lineal2SRGB(vec4 color, float gamma)
6
+ {
7
+ color = color / (color + vec4(1.0));
8
+ return vec4(pow(color.rgb, vec3(1.0 / gamma)), color.a);
9
+ }
10
+
11
+ vec3 lineal2SRGB(vec3 color, float gamma)
12
+ {
13
+ color = color / (color + vec3(1.0));
14
+ return pow(color.rgb, vec3(1.0 / gamma));
15
+ }
16
+
17
+ // Convert SRGB textures to lineal color
18
+ vec4 SRGB2Lineal(vec4 color, float gamma)
19
+ {
20
+ return vec4(pow(color.rgb, vec3(gamma)), color.a);
21
+ }
22
+
23
+ vec3 SRGB2lLineal(vec3 color, float gamma)
24
+ {
25
+ return pow(color, vec3(gamma));
26
+ }
27
+
28
+ vec4 brightnessContrast(vec4 color, float brightness, float contrast)
29
+ {
30
+ mat4 brightnessMat = mat4(
31
+ 1.0, 0.0, 0.0, 0.0,
32
+ 0.0, 1.0, 0.0, 0.0,
33
+ 0.0, 0.0, 1.0, 0.0,
34
+ brightness, brightness, brightness, 1.0
35
+ );
36
+ float t = (1.0 - contrast) / 2.0;
37
+ mat4 contrastMat = mat4(
38
+ contrast, 0.0, 0.0, 0.0,
39
+ 0.0, contrast, 0.0, 0.0,
40
+ 0.0, 0.0, contrast, 0.0,
41
+ t, t, t, 1.0
42
+ );
43
+ return contrastMat * brightnessMat * color;
44
+ }
45
+
46
+ #endif // COLOR_CORRECTION_GLSL
47
+
@@ -0,0 +1,6 @@
1
+
2
+ #define PI 3.14159265359
3
+ #define LIGHT_TYPE_POINT 5
4
+ #define LIGHT_TYPE_DIRECTIONAL 4
5
+ #define LIGHT_TYPE_SPOT 1
6
+ #define LIGHT_TYPE_DISABLED 10
@@ -0,0 +1,70 @@
1
+ import colorCorrection from "./color_correction.glsl?raw";
2
+ import constants from "./constants.glsl?raw";
3
+ import normalMap from "./normal_map.glsl?raw";
4
+ import pbr from "./pbr.glsl?raw";
5
+ import uniforms from "./uniforms.glsl?raw";
6
+
7
+ import ShaderFunction, {
8
+ generateShaderLibrary,
9
+ extractConstants,
10
+ processConstants,
11
+ ConstantDefinition,
12
+ DependencyItem
13
+ } from "../ShaderFunction";
14
+
15
+ let g_constants: ConstantDefinition[] | null = null;
16
+
17
+ export function getConstants() {
18
+ if (!g_constants) {
19
+ // Extract constants all the GLSL files
20
+ g_constants = [
21
+ ...extractConstants(constants),
22
+ ...extractConstants(colorCorrection),
23
+ ...extractConstants(normalMap),
24
+ ...extractConstants(pbr),
25
+ ...extractConstants(uniforms)
26
+ ];
27
+ }
28
+ return g_constants;
29
+ }
30
+
31
+ let g_colorCorrectionFunctions: DependencyItem[] | null = null;
32
+ export function getColorCorrectionFunctions() {
33
+ if (!g_colorCorrectionFunctions) {
34
+ g_colorCorrectionFunctions = generateShaderLibrary(colorCorrection);
35
+ }
36
+
37
+ return g_colorCorrectionFunctions;
38
+ }
39
+
40
+ let g_normalMapFunctions: DependencyItem[] | null = null;
41
+ export function getNormalMapFunctions() {
42
+ if (!g_normalMapFunctions) {
43
+ g_normalMapFunctions = generateShaderLibrary(normalMap);
44
+ }
45
+
46
+ return g_normalMapFunctions;
47
+ }
48
+
49
+ let g_pbrFunctions: DependencyItem[] | null = null;
50
+ export function getPBRFunctions() {
51
+ if (!g_pbrFunctions) {
52
+ g_pbrFunctions = generateShaderLibrary(pbr);
53
+ }
54
+
55
+ return g_pbrFunctions;
56
+ }
57
+
58
+ let g_uniformsFunctions: DependencyItem[] | null = null;
59
+ export function getUniformsFunctions() {
60
+ if (!g_uniformsFunctions) {
61
+ g_uniformsFunctions = generateShaderLibrary(uniforms);
62
+ }
63
+
64
+ return g_uniformsFunctions;
65
+ }
66
+
67
+ export function replaceConstants(shaderCode: string): string {
68
+ const constants = getConstants();
69
+ return processConstants(shaderCode, constants);
70
+ }
@@ -0,0 +1,9 @@
1
+
2
+ mat3 TBNMatrix(mat4 model, vec3 normal, vec3 tangent)
3
+ {
4
+ vec3 T = normalize(vec3(model * vec4(tangent, 0.0)));
5
+ vec3 B = normalize(vec3(model * vec4(cross(tangent, normal), 0.0)));
6
+ vec3 N = normalize(vec3(model * vec4(normal, 0.0)));
7
+ return mat3(T, B, N);
8
+ }
9
+