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.
Files changed (148) hide show
  1. package/dist/bg2e-js.js +356 -326
  2. package/dist/bg2e-js.js.map +1 -1
  3. package/package.json +56 -56
  4. package/src/app/AppController.ts +39 -39
  5. package/src/app/Bg2KeyboardEvent.ts +54 -54
  6. package/src/app/Bg2MouseEvent.ts +82 -82
  7. package/src/app/Bg2TouchEvent.ts +18 -18
  8. package/src/app/Canvas.ts +108 -108
  9. package/src/app/EventBase.ts +10 -10
  10. package/src/app/MainLoop.ts +273 -273
  11. package/src/app/index.ts +24 -24
  12. package/src/base/Color.ts +134 -134
  13. package/src/base/Environment.ts +183 -183
  14. package/src/base/Light.ts +192 -192
  15. package/src/base/Material.ts +620 -620
  16. package/src/base/PolyList.ts +365 -365
  17. package/src/base/Texture.ts +620 -620
  18. package/src/base/index.ts +81 -81
  19. package/src/db/Bg2LoaderPlugin.ts +143 -143
  20. package/src/db/DBPluginApi.ts +48 -48
  21. package/src/db/Loader.ts +116 -116
  22. package/src/db/LoaderPlugin.ts +34 -34
  23. package/src/db/MtlParser.ts +7 -7
  24. package/src/db/ObjLoaderPlugin.ts +54 -54
  25. package/src/db/ObjParser.ts +252 -252
  26. package/src/db/ObjWriterPlugin.ts +18 -18
  27. package/src/db/VitscnjLoaderPlugin.ts +112 -112
  28. package/src/db/Writer.ts +52 -52
  29. package/src/db/WriterPlugin.ts +22 -22
  30. package/src/db/index.ts +44 -44
  31. package/src/debug/DebugRenderer.ts +173 -173
  32. package/src/debug/WebGLTextureViewer.ts +75 -75
  33. package/src/debug/index.ts +6 -6
  34. package/src/index.html +11 -11
  35. package/src/index.ts +33 -33
  36. package/src/manipulation/SelectionBuffer.ts +81 -81
  37. package/src/manipulation/SelectionHighlight.ts +105 -84
  38. package/src/manipulation/SelectionIdAssignVisitor.ts +96 -96
  39. package/src/manipulation/SelectionManager.ts +196 -188
  40. package/src/manipulation/SelectionMode.ts +6 -6
  41. package/src/math/Mat3.ts +259 -259
  42. package/src/math/Mat4.ts +710 -710
  43. package/src/math/MatrixStrategy.ts +25 -25
  44. package/src/math/Quat.ts +65 -65
  45. package/src/math/Vec.ts +753 -753
  46. package/src/math/constants.ts +46 -46
  47. package/src/math/functions.ts +103 -103
  48. package/src/math/index.ts +74 -74
  49. package/src/phsics/joint.ts +137 -137
  50. package/src/primitives/arrow.ts +57 -57
  51. package/src/primitives/cone.ts +138 -138
  52. package/src/primitives/cube.ts +60 -60
  53. package/src/primitives/cylinder.ts +216 -216
  54. package/src/primitives/index.ts +13 -13
  55. package/src/primitives/plane.ts +31 -31
  56. package/src/primitives/sphere.ts +809 -809
  57. package/src/react/useBg2e.ts +69 -69
  58. package/src/render/BRDFIntegrationMap.ts +4 -4
  59. package/src/render/Environment.ts +135 -135
  60. package/src/render/FrameBuffer.ts +35 -35
  61. package/src/render/MaterialRenderer.ts +34 -34
  62. package/src/render/Pipeline.ts +108 -108
  63. package/src/render/PolyListRenderer.ts +47 -47
  64. package/src/render/RenderBuffer.ts +197 -197
  65. package/src/render/RenderQueue.ts +198 -198
  66. package/src/render/RenderState.ts +116 -116
  67. package/src/render/Renderer.ts +248 -248
  68. package/src/render/SceneAppController.ts +250 -250
  69. package/src/render/SceneRenderer.ts +387 -387
  70. package/src/render/Shader.ts +32 -32
  71. package/src/render/ShadowRenderer.ts +176 -176
  72. package/src/render/SkyCube.ts +105 -105
  73. package/src/render/SkySphere.ts +117 -117
  74. package/src/render/TextureMergerRenderer.ts +70 -70
  75. package/src/render/TextureRenderer.ts +34 -34
  76. package/src/render/index.ts +67 -67
  77. package/src/render/webgl/FrameBuffer.ts +9 -9
  78. package/src/render/webgl/MaterialRenderer.ts +112 -112
  79. package/src/render/webgl/Pipeline.ts +88 -88
  80. package/src/render/webgl/PolyListRenderer.ts +260 -260
  81. package/src/render/webgl/RenderBuffer.ts +226 -226
  82. package/src/render/webgl/Renderer.ts +262 -262
  83. package/src/render/webgl/SceneRenderer.ts +67 -67
  84. package/src/render/webgl/ShaderProgram.ts +424 -424
  85. package/src/render/webgl/ShadowRenderer.ts +6 -6
  86. package/src/render/webgl/SkyCube.ts +15 -15
  87. package/src/render/webgl/SkySphere.ts +15 -15
  88. package/src/render/webgl/State.ts +152 -152
  89. package/src/render/webgl/TextureRenderer.ts +167 -167
  90. package/src/render/webgl/VertexBuffer.ts +137 -137
  91. package/src/render/webgl/index.ts +35 -35
  92. package/src/scene/Camera.ts +458 -458
  93. package/src/scene/Chain.ts +44 -44
  94. package/src/scene/ChainJoint.ts +58 -58
  95. package/src/scene/Component.ts +177 -177
  96. package/src/scene/ComponentMap.ts +106 -106
  97. package/src/scene/Drawable.ts +154 -154
  98. package/src/scene/EnvironmentComponent.ts +141 -141
  99. package/src/scene/FindNodeVisitor.ts +59 -59
  100. package/src/scene/LightComponent.ts +154 -154
  101. package/src/scene/MatrixState.ts +46 -46
  102. package/src/scene/Node.ts +328 -328
  103. package/src/scene/NodeVisitor.ts +15 -15
  104. package/src/scene/OrbitCameraController.ts +450 -450
  105. package/src/scene/SmoothOrbitCameraController.ts +99 -99
  106. package/src/scene/Transform.ts +73 -73
  107. package/src/scene/index.ts +60 -60
  108. package/src/shaders/BasicDiffuseColorShader.ts +111 -111
  109. package/src/shaders/BasicPBRLightShader.ts +276 -276
  110. package/src/shaders/DebugRenderShader.ts +97 -97
  111. package/src/shaders/DepthRenderShader.ts +127 -127
  112. package/src/shaders/IrradianceMapCubeShader.ts +115 -115
  113. package/src/shaders/PBRLightIBLShader.ts +486 -486
  114. package/src/shaders/PickSelectionShader.ts +101 -101
  115. package/src/shaders/PresentDebugFramebufferShader.ts +118 -118
  116. package/src/shaders/PresentTextureShader.ts +99 -99
  117. package/src/shaders/SelectionHighlightShader.ts +143 -127
  118. package/src/shaders/ShaderFunction.ts +318 -318
  119. package/src/shaders/SkyCubeShader.ts +93 -93
  120. package/src/shaders/SkySphereShader.ts +102 -102
  121. package/src/shaders/SpecularMapCubeShader.ts +164 -164
  122. package/src/shaders/TextureMergerShader.ts +171 -171
  123. package/src/shaders/index.ts +36 -36
  124. package/src/shaders/webgl/color_correction.glsl +47 -47
  125. package/src/shaders/webgl/constants.glsl +6 -6
  126. package/src/shaders/webgl/index.ts +70 -70
  127. package/src/shaders/webgl/normal_map.glsl +9 -9
  128. package/src/shaders/webgl/pbr.glsl +173 -173
  129. package/src/shaders/webgl/uniforms.glsl +91 -91
  130. package/src/shaders/webgl_shader_lib.ts +213 -213
  131. package/src/tools/BinaryResourceProvider.ts +14 -14
  132. package/src/tools/ImageResourceProvider.ts +66 -66
  133. package/src/tools/MaterialModifier.ts +446 -446
  134. package/src/tools/Resource.ts +203 -203
  135. package/src/tools/ResourceProvider.ts +69 -69
  136. package/src/tools/TextResourceProvider.ts +24 -24
  137. package/src/tools/TextureCache.ts +51 -51
  138. package/src/tools/TextureResourceDatabase.ts +100 -100
  139. package/src/tools/UserAgent.ts +362 -362
  140. package/src/tools/VideoResourceProvider.ts +50 -50
  141. package/src/tools/WriteStrategy.ts +22 -22
  142. package/src/tools/base64.ts +11 -11
  143. package/src/tools/crypto.ts +19 -19
  144. package/src/tools/endiantess.ts +13 -13
  145. package/src/tools/image.ts +18 -18
  146. package/src/tools/index.ts +41 -41
  147. package/src/tools/processType.ts +39 -39
  148. 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
+ }