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,167 +1,167 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import TextureRenderer from '../TextureRenderer';
|
|
4
|
-
import Texture, {
|
|
5
|
-
TextureTargetName,
|
|
6
|
-
TextureDataType,
|
|
7
|
-
TextureComponentFormat,
|
|
8
|
-
TextureRenderTargetAttachment,
|
|
9
|
-
TextureTarget,
|
|
10
|
-
textureWrapString,
|
|
11
|
-
textureFilterString
|
|
12
|
-
} from '../../base/Texture';
|
|
13
|
-
import Vec from '../../math/Vec';
|
|
14
|
-
import { generateUUID } from '../../tools/crypto';
|
|
15
|
-
import Renderer from '../Renderer';
|
|
16
|
-
|
|
17
|
-
const getTarget = (gl: WebGLRenderingContext, tex: Texture): number => {
|
|
18
|
-
switch (tex.target) {
|
|
19
|
-
case TextureTarget.TEXTURE_2D:
|
|
20
|
-
return gl.TEXTURE_2D;
|
|
21
|
-
case TextureTarget.CUBE_MAP:
|
|
22
|
-
return gl.TEXTURE_CUBE_MAP;
|
|
23
|
-
default:
|
|
24
|
-
throw new Error("Error creating WebGL Texture: invalid target");
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const getClampMode = (gl: WebGLRenderingContext, mode: number): number => {
|
|
29
|
-
if (mode === 1) {
|
|
30
|
-
return gl.CLAMP_TO_EDGE;
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
const name = textureWrapString(mode);
|
|
34
|
-
return (gl as any)[name];
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const getTextureFilter = (gl: WebGLRenderingContext, filter: number): number => {
|
|
39
|
-
const name = textureFilterString(filter);
|
|
40
|
-
return (gl as any)[name];
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const getDataFormat = (gl: WebGLRenderingContext, texture: Texture): number => {
|
|
44
|
-
const componentFormat = texture.componentFormat;
|
|
45
|
-
switch (componentFormat) {
|
|
46
|
-
case TextureComponentFormat.UNSIGNED_BYTE:
|
|
47
|
-
return gl.UNSIGNED_BYTE;
|
|
48
|
-
case TextureComponentFormat.FLOAT32:
|
|
49
|
-
return gl.FLOAT;
|
|
50
|
-
default:
|
|
51
|
-
throw new Error("Error creating webgl texture: invalid component data format");
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const bg2eCreateTexture = (gl: any, textureObject: any): void => {
|
|
56
|
-
textureObject._apiObject = gl.createTexture();
|
|
57
|
-
textureObject._apiObject._bg2_uuid = generateUUID();
|
|
58
|
-
gl._bg2_textures = gl._bg2_textures || {};
|
|
59
|
-
let id = textureObject.name || textureObject._apiObject._bg2_uuid;
|
|
60
|
-
if (gl._bg2_textures[id] && gl._bg2_textures[id] !== textureObject) {
|
|
61
|
-
id = textureObject.name + "_" + textureObject._apiObject._bg2_uuid;
|
|
62
|
-
}
|
|
63
|
-
gl._bg2_textures[id] = textureObject;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const bg2eDeleteTexture = (gl: any, textureObject: any): void => {
|
|
67
|
-
if (textureObject._apiObject) {
|
|
68
|
-
gl.deleteTexture(textureObject._apiObject);
|
|
69
|
-
delete gl._bg2_textures[textureObject._apiObject._bg2_uuid];
|
|
70
|
-
textureObject._apiObject = null;
|
|
71
|
-
textureObject.setUpdated(false);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
const getWebGLTexture = (gl: WebGLRenderingContext, textureObject: any): void => {
|
|
76
|
-
if (!textureObject.imageData) {
|
|
77
|
-
throw new Error("Error loading WebGL texture: image data not loaded");
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
bg2eDeleteTexture(gl, textureObject);
|
|
81
|
-
bg2eCreateTexture(gl, textureObject);
|
|
82
|
-
|
|
83
|
-
const target = getTarget(gl, textureObject);
|
|
84
|
-
const dataFormat = getDataFormat(gl, textureObject);
|
|
85
|
-
gl.bindTexture(target, textureObject._apiObject);
|
|
86
|
-
|
|
87
|
-
if (textureObject.dataType ===TextureDataType.RENDER_TARGET) {
|
|
88
|
-
const { width, height } = textureObject.size;
|
|
89
|
-
|
|
90
|
-
const isDepthTexture = textureObject.renderTargetAttachment === TextureRenderTargetAttachment.DEPTH_ATTACHMENT;
|
|
91
|
-
const internalFormat = isDepthTexture ? gl.DEPTH_COMPONENT : gl.RGBA;
|
|
92
|
-
let format = isDepthTexture ? gl.DEPTH_COMPONENT : gl.RGBA;
|
|
93
|
-
const type = isDepthTexture ? gl.UNSIGNED_SHORT : dataFormat;
|
|
94
|
-
|
|
95
|
-
gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
|
96
|
-
gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
97
|
-
gl.texParameteri(target, gl.TEXTURE_WRAP_S, getClampMode(gl,textureObject.wrapModeX));
|
|
98
|
-
gl.texParameteri(target, gl.TEXTURE_WRAP_T, getClampMode(gl,textureObject.wrapModeY));
|
|
99
|
-
|
|
100
|
-
if (target === gl.TEXTURE_CUBE_MAP) {
|
|
101
|
-
for (let i = 0; i<6; ++i) {
|
|
102
|
-
gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, internalFormat, width, height, 0, format, type, null);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
else {
|
|
106
|
-
gl.texImage2D(target, 0, internalFormat, width, height, 0, format, type, null);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
textureObject.imageData.currentSize = new Vec(textureObject.size);
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
|
|
113
|
-
gl.texImage2D(target, 0, gl.RGBA, gl.RGBA, dataFormat, textureObject._imageData);
|
|
114
|
-
|
|
115
|
-
gl.texParameteri(target, gl.TEXTURE_WRAP_S, getClampMode(gl,textureObject.wrapModeX));
|
|
116
|
-
gl.texParameteri(target, gl.TEXTURE_WRAP_T, getClampMode(gl,textureObject.wrapModeY));
|
|
117
|
-
|
|
118
|
-
gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, getTextureFilter(gl, textureObject.magFilter));
|
|
119
|
-
gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, getTextureFilter(gl, textureObject.minFilter));
|
|
120
|
-
|
|
121
|
-
if (textureObject.mipmapRequired) {
|
|
122
|
-
gl.generateMipmap(target);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
export default class WebGLTextureRenderer extends TextureRenderer {
|
|
128
|
-
static ListTextures(glOrRenderer: Renderer | any): Record<string, any> {
|
|
129
|
-
if (glOrRenderer instanceof Renderer) {
|
|
130
|
-
glOrRenderer = (glOrRenderer as any).gl;
|
|
131
|
-
}
|
|
132
|
-
return glOrRenderer._bg2_textures || {};
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
getApiObject(): any {
|
|
136
|
-
if (this.texture.dirty) {
|
|
137
|
-
try {
|
|
138
|
-
getWebGLTexture((this.renderer as any).gl, this.texture);
|
|
139
|
-
this.texture.setUpdated();
|
|
140
|
-
}
|
|
141
|
-
catch (err: any) {
|
|
142
|
-
console.warn(err.message);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
return (this.texture as any)._apiObject;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
destroy(): void {
|
|
149
|
-
const { gl } = this.renderer as any;
|
|
150
|
-
bg2eDeleteTexture(gl, this.texture);
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
///// webgl specific functions
|
|
154
|
-
// Returns the webgl target (TEXTURE_2D, TEXTURE_3D...)
|
|
155
|
-
get target(): number {
|
|
156
|
-
return (this.renderer as any).gl[TextureTargetName[this.texture.target]];
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
activeTexture(index: number = 0): void {
|
|
160
|
-
const { gl } = this.renderer as any;
|
|
161
|
-
gl.activeTexture(gl.TEXTURE0 + index);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
bindTexture(): void {
|
|
165
|
-
(this.renderer as any).gl.bindTexture(this.target, this.getApiObject());
|
|
166
|
-
}
|
|
167
|
-
}
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import TextureRenderer from '../TextureRenderer';
|
|
4
|
+
import Texture, {
|
|
5
|
+
TextureTargetName,
|
|
6
|
+
TextureDataType,
|
|
7
|
+
TextureComponentFormat,
|
|
8
|
+
TextureRenderTargetAttachment,
|
|
9
|
+
TextureTarget,
|
|
10
|
+
textureWrapString,
|
|
11
|
+
textureFilterString
|
|
12
|
+
} from '../../base/Texture';
|
|
13
|
+
import Vec from '../../math/Vec';
|
|
14
|
+
import { generateUUID } from '../../tools/crypto';
|
|
15
|
+
import Renderer from '../Renderer';
|
|
16
|
+
|
|
17
|
+
const getTarget = (gl: WebGLRenderingContext, tex: Texture): number => {
|
|
18
|
+
switch (tex.target) {
|
|
19
|
+
case TextureTarget.TEXTURE_2D:
|
|
20
|
+
return gl.TEXTURE_2D;
|
|
21
|
+
case TextureTarget.CUBE_MAP:
|
|
22
|
+
return gl.TEXTURE_CUBE_MAP;
|
|
23
|
+
default:
|
|
24
|
+
throw new Error("Error creating WebGL Texture: invalid target");
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const getClampMode = (gl: WebGLRenderingContext, mode: number): number => {
|
|
29
|
+
if (mode === 1) {
|
|
30
|
+
return gl.CLAMP_TO_EDGE;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
const name = textureWrapString(mode);
|
|
34
|
+
return (gl as any)[name];
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const getTextureFilter = (gl: WebGLRenderingContext, filter: number): number => {
|
|
39
|
+
const name = textureFilterString(filter);
|
|
40
|
+
return (gl as any)[name];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const getDataFormat = (gl: WebGLRenderingContext, texture: Texture): number => {
|
|
44
|
+
const componentFormat = texture.componentFormat;
|
|
45
|
+
switch (componentFormat) {
|
|
46
|
+
case TextureComponentFormat.UNSIGNED_BYTE:
|
|
47
|
+
return gl.UNSIGNED_BYTE;
|
|
48
|
+
case TextureComponentFormat.FLOAT32:
|
|
49
|
+
return gl.FLOAT;
|
|
50
|
+
default:
|
|
51
|
+
throw new Error("Error creating webgl texture: invalid component data format");
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const bg2eCreateTexture = (gl: any, textureObject: any): void => {
|
|
56
|
+
textureObject._apiObject = gl.createTexture();
|
|
57
|
+
textureObject._apiObject._bg2_uuid = generateUUID();
|
|
58
|
+
gl._bg2_textures = gl._bg2_textures || {};
|
|
59
|
+
let id = textureObject.name || textureObject._apiObject._bg2_uuid;
|
|
60
|
+
if (gl._bg2_textures[id] && gl._bg2_textures[id] !== textureObject) {
|
|
61
|
+
id = textureObject.name + "_" + textureObject._apiObject._bg2_uuid;
|
|
62
|
+
}
|
|
63
|
+
gl._bg2_textures[id] = textureObject;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const bg2eDeleteTexture = (gl: any, textureObject: any): void => {
|
|
67
|
+
if (textureObject._apiObject) {
|
|
68
|
+
gl.deleteTexture(textureObject._apiObject);
|
|
69
|
+
delete gl._bg2_textures[textureObject._apiObject._bg2_uuid];
|
|
70
|
+
textureObject._apiObject = null;
|
|
71
|
+
textureObject.setUpdated(false);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const getWebGLTexture = (gl: WebGLRenderingContext, textureObject: any): void => {
|
|
76
|
+
if (!textureObject.imageData) {
|
|
77
|
+
throw new Error("Error loading WebGL texture: image data not loaded");
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
bg2eDeleteTexture(gl, textureObject);
|
|
81
|
+
bg2eCreateTexture(gl, textureObject);
|
|
82
|
+
|
|
83
|
+
const target = getTarget(gl, textureObject);
|
|
84
|
+
const dataFormat = getDataFormat(gl, textureObject);
|
|
85
|
+
gl.bindTexture(target, textureObject._apiObject);
|
|
86
|
+
|
|
87
|
+
if (textureObject.dataType ===TextureDataType.RENDER_TARGET) {
|
|
88
|
+
const { width, height } = textureObject.size;
|
|
89
|
+
|
|
90
|
+
const isDepthTexture = textureObject.renderTargetAttachment === TextureRenderTargetAttachment.DEPTH_ATTACHMENT;
|
|
91
|
+
const internalFormat = isDepthTexture ? gl.DEPTH_COMPONENT : gl.RGBA;
|
|
92
|
+
let format = isDepthTexture ? gl.DEPTH_COMPONENT : gl.RGBA;
|
|
93
|
+
const type = isDepthTexture ? gl.UNSIGNED_SHORT : dataFormat;
|
|
94
|
+
|
|
95
|
+
gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
|
96
|
+
gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
97
|
+
gl.texParameteri(target, gl.TEXTURE_WRAP_S, getClampMode(gl,textureObject.wrapModeX));
|
|
98
|
+
gl.texParameteri(target, gl.TEXTURE_WRAP_T, getClampMode(gl,textureObject.wrapModeY));
|
|
99
|
+
|
|
100
|
+
if (target === gl.TEXTURE_CUBE_MAP) {
|
|
101
|
+
for (let i = 0; i<6; ++i) {
|
|
102
|
+
gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, internalFormat, width, height, 0, format, type, null);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
gl.texImage2D(target, 0, internalFormat, width, height, 0, format, type, null);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
textureObject.imageData.currentSize = new Vec(textureObject.size);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
|
|
113
|
+
gl.texImage2D(target, 0, gl.RGBA, gl.RGBA, dataFormat, textureObject._imageData);
|
|
114
|
+
|
|
115
|
+
gl.texParameteri(target, gl.TEXTURE_WRAP_S, getClampMode(gl,textureObject.wrapModeX));
|
|
116
|
+
gl.texParameteri(target, gl.TEXTURE_WRAP_T, getClampMode(gl,textureObject.wrapModeY));
|
|
117
|
+
|
|
118
|
+
gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, getTextureFilter(gl, textureObject.magFilter));
|
|
119
|
+
gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, getTextureFilter(gl, textureObject.minFilter));
|
|
120
|
+
|
|
121
|
+
if (textureObject.mipmapRequired) {
|
|
122
|
+
gl.generateMipmap(target);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export default class WebGLTextureRenderer extends TextureRenderer {
|
|
128
|
+
static ListTextures(glOrRenderer: Renderer | any): Record<string, any> {
|
|
129
|
+
if (glOrRenderer instanceof Renderer) {
|
|
130
|
+
glOrRenderer = (glOrRenderer as any).gl;
|
|
131
|
+
}
|
|
132
|
+
return glOrRenderer._bg2_textures || {};
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
getApiObject(): any {
|
|
136
|
+
if (this.texture.dirty) {
|
|
137
|
+
try {
|
|
138
|
+
getWebGLTexture((this.renderer as any).gl, this.texture);
|
|
139
|
+
this.texture.setUpdated();
|
|
140
|
+
}
|
|
141
|
+
catch (err: any) {
|
|
142
|
+
console.warn(err.message);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return (this.texture as any)._apiObject;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
destroy(): void {
|
|
149
|
+
const { gl } = this.renderer as any;
|
|
150
|
+
bg2eDeleteTexture(gl, this.texture);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
///// webgl specific functions
|
|
154
|
+
// Returns the webgl target (TEXTURE_2D, TEXTURE_3D...)
|
|
155
|
+
get target(): number {
|
|
156
|
+
return (this.renderer as any).gl[TextureTargetName[this.texture.target]];
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
activeTexture(index: number = 0): void {
|
|
160
|
+
const { gl } = this.renderer as any;
|
|
161
|
+
gl.activeTexture(gl.TEXTURE0 + index);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
bindTexture(): void {
|
|
165
|
+
(this.renderer as any).gl.bindTexture(this.target, this.getApiObject());
|
|
166
|
+
}
|
|
167
|
+
}
|
|
@@ -1,137 +1,137 @@
|
|
|
1
|
-
export enum BufferTarget {
|
|
2
|
-
ARRAY_BUFFER = 0,
|
|
3
|
-
ELEMENT_ARRAY_BUFFER = 1,
|
|
4
|
-
|
|
5
|
-
// WebGL 2:
|
|
6
|
-
COPY_READ_BUFFER = 2,
|
|
7
|
-
COPY_WRITE_BUFFER = 3,
|
|
8
|
-
TRANSFORM_FEEDBACK_BUFFER = 4,
|
|
9
|
-
UNIFORM_BUFFER = 5,
|
|
10
|
-
PIXEL_PACK_BUFFER = 6,
|
|
11
|
-
PIXEL_UNPACK_BUFFER = 7
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export enum BufferUsage {
|
|
15
|
-
STATIC_DRAW = 0,
|
|
16
|
-
DYNAMIC_DRAW = 1,
|
|
17
|
-
STREAM_DRAW = 2,
|
|
18
|
-
|
|
19
|
-
// WebGL 2:
|
|
20
|
-
STATIC_READ = 3,
|
|
21
|
-
DYNAMIC_READ = 4,
|
|
22
|
-
STREAM_READ = 5,
|
|
23
|
-
STATIC_COPY = 6,
|
|
24
|
-
DYNAMIC_COPY = 7,
|
|
25
|
-
STREAM_COPY = 8
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const g_bufferTargetConversion: number[] = [];
|
|
29
|
-
const g_bufferUsageConversion: number[] = [];
|
|
30
|
-
|
|
31
|
-
const g_createdBuffers: { [key: number]: { [key: number]: VertexBuffer } } = {};
|
|
32
|
-
|
|
33
|
-
// DEBUG: assign an unique identifier to each buffer
|
|
34
|
-
let g_bg2e_id__: number = 0;
|
|
35
|
-
|
|
36
|
-
export default class VertexBuffer {
|
|
37
|
-
|
|
38
|
-
private _gl: WebGLRenderingContext;
|
|
39
|
-
private _buffer: WebGLBuffer | null;
|
|
40
|
-
|
|
41
|
-
static Delete(buffer: VertexBuffer): void {
|
|
42
|
-
if (!buffer._buffer || !buffer._gl) return;
|
|
43
|
-
|
|
44
|
-
const gls = (buffer._gl as any)._bg2_id_;
|
|
45
|
-
const buffer_id = (buffer._buffer as any)._bg2e_id_;
|
|
46
|
-
|
|
47
|
-
if (g_createdBuffers[gls]?.[buffer_id]) {
|
|
48
|
-
delete g_createdBuffers[gls][buffer_id];
|
|
49
|
-
}
|
|
50
|
-
buffer._gl.deleteBuffer(buffer._buffer);
|
|
51
|
-
buffer._buffer = null;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
static CreateArrayBuffer(gl: WebGLRenderingContext, data: ArrayBufferView, usage: BufferUsage = BufferUsage.STATIC_DRAW): VertexBuffer {
|
|
55
|
-
const buffer = new VertexBuffer(gl);
|
|
56
|
-
buffer.bind(BufferTarget.ARRAY_BUFFER);
|
|
57
|
-
buffer.bufferData(BufferTarget.ARRAY_BUFFER, data, usage);
|
|
58
|
-
return buffer;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
static CreateElementArrayBuffer(gl: WebGLRenderingContext, data: ArrayBufferView, usage: BufferUsage = BufferUsage.STATIC_DRAW): VertexBuffer {
|
|
62
|
-
const buffer = new VertexBuffer(gl);
|
|
63
|
-
buffer.bind(BufferTarget.ELEMENT_ARRAY_BUFFER);
|
|
64
|
-
buffer.bufferData(BufferTarget.ELEMENT_ARRAY_BUFFER, data, usage);
|
|
65
|
-
return buffer;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
static CurrentBuffer(gl: WebGLRenderingContext, target: BufferTarget): VertexBuffer | undefined {
|
|
69
|
-
let glTarget: number;
|
|
70
|
-
if (target === BufferTarget.ARRAY_BUFFER) {
|
|
71
|
-
glTarget = gl.ARRAY_BUFFER_BINDING;
|
|
72
|
-
}
|
|
73
|
-
else if (target === BufferTarget.ELEMENT_ARRAY_BUFFER) {
|
|
74
|
-
glTarget = gl.ELEMENT_ARRAY_BUFFER_BINDING;
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
return undefined;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const gls = (gl as any)._bg2_id_;
|
|
81
|
-
g_createdBuffers[gls] = g_createdBuffers[gls] || {};
|
|
82
|
-
const gl_buffer = gl.getParameter(glTarget) as WebGLBuffer & { _bg2e_id_: number };
|
|
83
|
-
const buffer = g_createdBuffers[gls]?.[gl_buffer?._bg2e_id_];
|
|
84
|
-
return buffer;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
get id(): number | undefined {
|
|
88
|
-
return (this._buffer as any)?._bg2e_id_;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
constructor(gl: WebGLRenderingContext) {
|
|
92
|
-
this._gl = gl;
|
|
93
|
-
this._buffer = gl.createBuffer();
|
|
94
|
-
|
|
95
|
-
(gl as any)._bg2_id_ = (gl as any)._bg2_id_ ?? ++g_bg2e_id__;
|
|
96
|
-
(this._buffer as any)._bg2e_id_ = ++g_bg2e_id__;
|
|
97
|
-
|
|
98
|
-
const gls = (gl as any)._bg2_id_;
|
|
99
|
-
g_createdBuffers[gls] = g_createdBuffers[gls] || {};
|
|
100
|
-
g_createdBuffers[gls][(this._buffer as any)._bg2e_id_] = this;
|
|
101
|
-
|
|
102
|
-
if (g_bufferTargetConversion.length === 0) {
|
|
103
|
-
g_bufferTargetConversion.push(gl.ARRAY_BUFFER);
|
|
104
|
-
g_bufferTargetConversion.push(gl.ELEMENT_ARRAY_BUFFER);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
if (g_bufferUsageConversion.length === 0) {
|
|
108
|
-
g_bufferUsageConversion.push(gl.STATIC_DRAW);
|
|
109
|
-
g_bufferUsageConversion.push(gl.DYNAMIC_DRAW);
|
|
110
|
-
g_bufferUsageConversion.push(gl.STREAM_DRAW);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
get buffer(): WebGLBuffer | null {
|
|
115
|
-
return this._buffer;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
bind(target: BufferTarget): void {
|
|
119
|
-
if (this._buffer) {
|
|
120
|
-
this._gl.bindBuffer(g_bufferTargetConversion[target], this._buffer);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
bufferData(target: BufferTarget, size: number, usage: BufferUsage): void;
|
|
125
|
-
bufferData(target: BufferTarget, data: ArrayBufferView | ArrayBuffer, usage: BufferUsage): void;
|
|
126
|
-
bufferData(
|
|
127
|
-
target: BufferTarget,
|
|
128
|
-
dataOrSize: ArrayBufferView | ArrayBuffer | number,
|
|
129
|
-
usage: BufferUsage
|
|
130
|
-
): void {
|
|
131
|
-
this._gl.bufferData(
|
|
132
|
-
g_bufferTargetConversion[target],
|
|
133
|
-
dataOrSize as any,
|
|
134
|
-
g_bufferUsageConversion[usage]
|
|
135
|
-
);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
1
|
+
export enum BufferTarget {
|
|
2
|
+
ARRAY_BUFFER = 0,
|
|
3
|
+
ELEMENT_ARRAY_BUFFER = 1,
|
|
4
|
+
|
|
5
|
+
// WebGL 2:
|
|
6
|
+
COPY_READ_BUFFER = 2,
|
|
7
|
+
COPY_WRITE_BUFFER = 3,
|
|
8
|
+
TRANSFORM_FEEDBACK_BUFFER = 4,
|
|
9
|
+
UNIFORM_BUFFER = 5,
|
|
10
|
+
PIXEL_PACK_BUFFER = 6,
|
|
11
|
+
PIXEL_UNPACK_BUFFER = 7
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export enum BufferUsage {
|
|
15
|
+
STATIC_DRAW = 0,
|
|
16
|
+
DYNAMIC_DRAW = 1,
|
|
17
|
+
STREAM_DRAW = 2,
|
|
18
|
+
|
|
19
|
+
// WebGL 2:
|
|
20
|
+
STATIC_READ = 3,
|
|
21
|
+
DYNAMIC_READ = 4,
|
|
22
|
+
STREAM_READ = 5,
|
|
23
|
+
STATIC_COPY = 6,
|
|
24
|
+
DYNAMIC_COPY = 7,
|
|
25
|
+
STREAM_COPY = 8
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const g_bufferTargetConversion: number[] = [];
|
|
29
|
+
const g_bufferUsageConversion: number[] = [];
|
|
30
|
+
|
|
31
|
+
const g_createdBuffers: { [key: number]: { [key: number]: VertexBuffer } } = {};
|
|
32
|
+
|
|
33
|
+
// DEBUG: assign an unique identifier to each buffer
|
|
34
|
+
let g_bg2e_id__: number = 0;
|
|
35
|
+
|
|
36
|
+
export default class VertexBuffer {
|
|
37
|
+
|
|
38
|
+
private _gl: WebGLRenderingContext;
|
|
39
|
+
private _buffer: WebGLBuffer | null;
|
|
40
|
+
|
|
41
|
+
static Delete(buffer: VertexBuffer): void {
|
|
42
|
+
if (!buffer._buffer || !buffer._gl) return;
|
|
43
|
+
|
|
44
|
+
const gls = (buffer._gl as any)._bg2_id_;
|
|
45
|
+
const buffer_id = (buffer._buffer as any)._bg2e_id_;
|
|
46
|
+
|
|
47
|
+
if (g_createdBuffers[gls]?.[buffer_id]) {
|
|
48
|
+
delete g_createdBuffers[gls][buffer_id];
|
|
49
|
+
}
|
|
50
|
+
buffer._gl.deleteBuffer(buffer._buffer);
|
|
51
|
+
buffer._buffer = null;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
static CreateArrayBuffer(gl: WebGLRenderingContext, data: ArrayBufferView, usage: BufferUsage = BufferUsage.STATIC_DRAW): VertexBuffer {
|
|
55
|
+
const buffer = new VertexBuffer(gl);
|
|
56
|
+
buffer.bind(BufferTarget.ARRAY_BUFFER);
|
|
57
|
+
buffer.bufferData(BufferTarget.ARRAY_BUFFER, data, usage);
|
|
58
|
+
return buffer;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
static CreateElementArrayBuffer(gl: WebGLRenderingContext, data: ArrayBufferView, usage: BufferUsage = BufferUsage.STATIC_DRAW): VertexBuffer {
|
|
62
|
+
const buffer = new VertexBuffer(gl);
|
|
63
|
+
buffer.bind(BufferTarget.ELEMENT_ARRAY_BUFFER);
|
|
64
|
+
buffer.bufferData(BufferTarget.ELEMENT_ARRAY_BUFFER, data, usage);
|
|
65
|
+
return buffer;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
static CurrentBuffer(gl: WebGLRenderingContext, target: BufferTarget): VertexBuffer | undefined {
|
|
69
|
+
let glTarget: number;
|
|
70
|
+
if (target === BufferTarget.ARRAY_BUFFER) {
|
|
71
|
+
glTarget = gl.ARRAY_BUFFER_BINDING;
|
|
72
|
+
}
|
|
73
|
+
else if (target === BufferTarget.ELEMENT_ARRAY_BUFFER) {
|
|
74
|
+
glTarget = gl.ELEMENT_ARRAY_BUFFER_BINDING;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const gls = (gl as any)._bg2_id_;
|
|
81
|
+
g_createdBuffers[gls] = g_createdBuffers[gls] || {};
|
|
82
|
+
const gl_buffer = gl.getParameter(glTarget) as WebGLBuffer & { _bg2e_id_: number };
|
|
83
|
+
const buffer = g_createdBuffers[gls]?.[gl_buffer?._bg2e_id_];
|
|
84
|
+
return buffer;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
get id(): number | undefined {
|
|
88
|
+
return (this._buffer as any)?._bg2e_id_;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
constructor(gl: WebGLRenderingContext) {
|
|
92
|
+
this._gl = gl;
|
|
93
|
+
this._buffer = gl.createBuffer();
|
|
94
|
+
|
|
95
|
+
(gl as any)._bg2_id_ = (gl as any)._bg2_id_ ?? ++g_bg2e_id__;
|
|
96
|
+
(this._buffer as any)._bg2e_id_ = ++g_bg2e_id__;
|
|
97
|
+
|
|
98
|
+
const gls = (gl as any)._bg2_id_;
|
|
99
|
+
g_createdBuffers[gls] = g_createdBuffers[gls] || {};
|
|
100
|
+
g_createdBuffers[gls][(this._buffer as any)._bg2e_id_] = this;
|
|
101
|
+
|
|
102
|
+
if (g_bufferTargetConversion.length === 0) {
|
|
103
|
+
g_bufferTargetConversion.push(gl.ARRAY_BUFFER);
|
|
104
|
+
g_bufferTargetConversion.push(gl.ELEMENT_ARRAY_BUFFER);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (g_bufferUsageConversion.length === 0) {
|
|
108
|
+
g_bufferUsageConversion.push(gl.STATIC_DRAW);
|
|
109
|
+
g_bufferUsageConversion.push(gl.DYNAMIC_DRAW);
|
|
110
|
+
g_bufferUsageConversion.push(gl.STREAM_DRAW);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
get buffer(): WebGLBuffer | null {
|
|
115
|
+
return this._buffer;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
bind(target: BufferTarget): void {
|
|
119
|
+
if (this._buffer) {
|
|
120
|
+
this._gl.bindBuffer(g_bufferTargetConversion[target], this._buffer);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
bufferData(target: BufferTarget, size: number, usage: BufferUsage): void;
|
|
125
|
+
bufferData(target: BufferTarget, data: ArrayBufferView | ArrayBuffer, usage: BufferUsage): void;
|
|
126
|
+
bufferData(
|
|
127
|
+
target: BufferTarget,
|
|
128
|
+
dataOrSize: ArrayBufferView | ArrayBuffer | number,
|
|
129
|
+
usage: BufferUsage
|
|
130
|
+
): void {
|
|
131
|
+
this._gl.bufferData(
|
|
132
|
+
g_bufferTargetConversion[target],
|
|
133
|
+
dataOrSize as any,
|
|
134
|
+
g_bufferUsageConversion[usage]
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
}
|