@xeokit/xeokit-sdk 2.6.85-renderers-refactor-v2 → 2.6.86

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 (184) hide show
  1. package/dist/xeokit-sdk.cjs.js +44618 -13007
  2. package/dist/xeokit-sdk.es.js +44617 -13008
  3. package/dist/xeokit-sdk.es5.js +3488 -1387
  4. package/dist/xeokit-sdk.min.cjs.js +8 -8
  5. package/dist/xeokit-sdk.min.es.js +8 -8
  6. package/dist/xeokit-sdk.min.es5.js +7 -7
  7. package/package.json +1 -1
  8. package/src/plugins/lib/html/MenuEvent.js +2 -2
  9. package/src/viewer/Viewer.js +103 -55
  10. package/src/viewer/scene/canvas/Canvas.js +43 -3
  11. package/src/viewer/scene/geometry/ReadableGeometry.js +25 -0
  12. package/src/viewer/scene/lights/CubeTexture.js +13 -0
  13. package/src/viewer/scene/lights/DirLight.js +1 -2
  14. package/src/viewer/scene/lights/PointLight.js +1 -2
  15. package/src/viewer/scene/materials/Texture.js +9 -0
  16. package/src/viewer/scene/math/rtcCoords.js +38 -1
  17. package/src/viewer/scene/mesh/Mesh.js +212 -454
  18. package/src/viewer/scene/mesh/draw/DrawRenderer.js +998 -0
  19. package/src/viewer/scene/mesh/draw/DrawShaderSource.js +1504 -305
  20. package/src/viewer/scene/mesh/emphasis/EmphasisEdgesRenderer.js +259 -0
  21. package/src/viewer/scene/mesh/emphasis/EmphasisEdgesShaderSource.js +160 -0
  22. package/src/viewer/scene/mesh/emphasis/EmphasisFillRenderer.js +286 -0
  23. package/src/viewer/scene/mesh/emphasis/EmphasisFillShaderSource.js +263 -0
  24. package/src/viewer/scene/mesh/occlusion/OcclusionRenderer.js +221 -0
  25. package/src/viewer/scene/mesh/occlusion/OcclusionShaderSource.js +158 -9
  26. package/src/viewer/scene/mesh/pick/PickMeshRenderer.js +223 -0
  27. package/src/viewer/scene/mesh/pick/PickMeshShaderSource.js +151 -21
  28. package/src/viewer/scene/mesh/pick/PickTriangleRenderer.js +200 -0
  29. package/src/viewer/scene/mesh/pick/PickTriangleShaderSource.js +124 -12
  30. package/src/viewer/scene/mesh/shadow/ShadowRenderer.js +214 -0
  31. package/src/viewer/scene/mesh/shadow/ShadowShaderSource.js +97 -22
  32. package/src/viewer/scene/model/RENDER_PASSES.js +34 -0
  33. package/src/viewer/scene/model/SceneModel.js +861 -245
  34. package/src/viewer/scene/model/SceneModelEntity.js +4 -4
  35. package/src/viewer/scene/model/SceneModelMesh.js +3 -3
  36. package/src/viewer/scene/model/dtx/BindableDataTexture.js +31 -0
  37. package/src/viewer/scene/model/dtx/lines/DTXLinesBuffer.js +27 -0
  38. package/src/viewer/scene/model/dtx/lines/DTXLinesLayer.js +897 -0
  39. package/src/viewer/scene/model/dtx/lines/DTXLinesState.js +46 -0
  40. package/src/viewer/scene/model/dtx/lines/DTXLinesTextureFactory.js +411 -0
  41. package/src/viewer/scene/model/dtx/lines/dataTextureRamStats.js +49 -0
  42. package/src/viewer/scene/model/dtx/lines/rebucketPositions.js +208 -0
  43. package/src/viewer/scene/model/dtx/lines/renderers/DTXLinesColorRenderer.js +389 -0
  44. package/src/viewer/scene/model/dtx/lines/renderers/DTXLinesRenderers.js +65 -0
  45. package/src/viewer/scene/model/dtx/triangles/DTXTrianglesLayer.js +1399 -0
  46. package/src/viewer/scene/model/dtx/triangles/lib/DTXTrianglesBuffer.js +46 -0
  47. package/src/viewer/scene/model/dtx/triangles/lib/DTXTrianglesState.js +250 -0
  48. package/src/viewer/scene/model/dtx/triangles/lib/DTXTrianglesTextureFactory.js +518 -0
  49. package/src/viewer/scene/model/dtx/triangles/lib/dataTextureRamStats.js +54 -0
  50. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesColorRenderer.js +639 -0
  51. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesDepthRenderer.js +464 -0
  52. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesEdgesColorRenderer.js +423 -0
  53. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesEdgesRenderer.js +431 -0
  54. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesNormalsRenderer.js +345 -0
  55. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesOcclusionRenderer.js +436 -0
  56. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesPickDepthRenderer.js +466 -0
  57. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesPickMeshRenderer.js +437 -0
  58. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesPickNormalsFlatRenderer.js +460 -0
  59. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesPickNormalsRenderer.js +437 -0
  60. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesRenderers.js +307 -0
  61. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesSilhouetteRenderer.js +472 -0
  62. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesSnapInitRenderer.js +474 -0
  63. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesSnapRenderer.js +435 -0
  64. package/src/viewer/scene/model/vbo/ScratchMemory.js +63 -0
  65. package/src/viewer/scene/model/vbo/VBORenderer.js +664 -0
  66. package/src/viewer/scene/model/vbo/batching/lines/VBOBatchingLinesLayer.js +704 -0
  67. package/src/viewer/scene/model/vbo/batching/lines/lib/VBOBatchingLinesBuffer.js +19 -0
  68. package/src/viewer/scene/model/vbo/batching/lines/renderers/VBOBatchingLineSnapInitRenderer.js +318 -0
  69. package/src/viewer/scene/model/vbo/batching/lines/renderers/VBOBatchingLinesColorRenderer.js +114 -0
  70. package/src/viewer/scene/model/vbo/batching/lines/renderers/VBOBatchingLinesRenderers.js +99 -0
  71. package/src/viewer/scene/model/vbo/batching/lines/renderers/VBOBatchingLinesSilhouetteRenderer.js +124 -0
  72. package/src/viewer/scene/model/vbo/batching/lines/renderers/VBOBatchingLinesSnapInitRenderer.js +313 -0
  73. package/src/viewer/scene/model/vbo/batching/lines/renderers/VBOBatchingLinesSnapRenderer.js +311 -0
  74. package/src/viewer/scene/model/vbo/batching/lines/renderers/VBOSceneModelLineBatchingRenderer.js +24 -0
  75. package/src/viewer/scene/model/vbo/batching/points/VBOBatchingPointsLayer.js +688 -0
  76. package/src/viewer/scene/model/vbo/batching/points/VBOBatchingPointsRenderer.js +24 -0
  77. package/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsColorRenderer.js +168 -0
  78. package/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsOcclusionRenderer.js +136 -0
  79. package/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsPickDepthRenderer.js +156 -0
  80. package/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsPickMeshRenderer.js +148 -0
  81. package/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsRenderers.js +144 -0
  82. package/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsShadowRenderer.js +107 -0
  83. package/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsSilhouetteRenderer.js +146 -0
  84. package/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsSnapInitRenderer.js +315 -0
  85. package/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsSnapRenderer.js +305 -0
  86. package/src/viewer/scene/model/vbo/batching/triangles/VBOBatchingTrianglesBuffer.js +24 -0
  87. package/src/viewer/scene/model/vbo/batching/triangles/VBOBatchingTrianglesLayer.js +1346 -0
  88. package/src/viewer/scene/model/vbo/batching/triangles/renderers/EdgesColorRenderer.js +131 -0
  89. package/src/viewer/scene/model/vbo/batching/triangles/renderers/EdgesEmphasisRenderer.js +135 -0
  90. package/src/viewer/scene/model/vbo/batching/triangles/renderers/EdgesRenderer.js +12 -0
  91. package/src/viewer/scene/model/vbo/batching/triangles/renderers/Renderers.js +403 -0
  92. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesBatchingRenderer.js +35 -0
  93. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesColorRenderer.js +252 -0
  94. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesColorTextureRenderer.js +294 -0
  95. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesDepthRenderer.js +115 -0
  96. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesFlatColorRenderer.js +246 -0
  97. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesNormalsRenderer.js +139 -0
  98. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesOcclusionRenderer.js +125 -0
  99. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesPBRRenderer.js +561 -0
  100. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesPickDepthRenderer.js +144 -0
  101. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesPickMeshRenderer.js +130 -0
  102. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesPickNormalsFlatRenderer.js +121 -0
  103. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesPickNormalsRenderer.js +131 -0
  104. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesShadowRenderer.js +107 -0
  105. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesSilhouetteRenderer.js +144 -0
  106. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesSnapInitRenderer.js +313 -0
  107. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesSnapRenderer.js +312 -0
  108. package/src/viewer/scene/model/vbo/float16.js +760 -0
  109. package/src/viewer/scene/model/vbo/instancing/lines/VBOInstancingLinesLayer.js +711 -0
  110. package/src/viewer/scene/model/vbo/instancing/lines/renderers/VBOInstancingLinesColorRenderer.js +148 -0
  111. package/src/viewer/scene/model/vbo/instancing/lines/renderers/VBOInstancingLinesRenderer.js +26 -0
  112. package/src/viewer/scene/model/vbo/instancing/lines/renderers/VBOInstancingLinesRenderers.js +139 -0
  113. package/src/viewer/scene/model/vbo/instancing/lines/renderers/VBOInstancingLinesSilhouetteRenderer.js +127 -0
  114. package/src/viewer/scene/model/vbo/instancing/lines/renderers/VBOInstancingLinesSnapInitRenderer.js +308 -0
  115. package/src/viewer/scene/model/vbo/instancing/lines/renderers/VBOInstancingLinesSnapRenderer.js +299 -0
  116. package/src/viewer/scene/model/vbo/instancing/points/VBOInstancingPointsLayer.js +733 -0
  117. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsColorRenderer.js +174 -0
  118. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsDepthRenderer.js +156 -0
  119. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsOcclusionRenderer.js +149 -0
  120. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsPickDepthRenderer.js +170 -0
  121. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsPickMeshRenderer.js +152 -0
  122. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsRenderer.js +26 -0
  123. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsRenderers.js +174 -0
  124. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsShadowRenderer.js +119 -0
  125. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsSilhouetteRenderer.js +154 -0
  126. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsSnapInitRenderer.js +307 -0
  127. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsSnapRenderer.js +293 -0
  128. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingTrianglesRenderer.js +150 -0
  129. package/src/viewer/scene/model/vbo/instancing/triangles/VBOInstancingTrianglesLayer.js +1289 -0
  130. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/EdgesColorRenderer.js +135 -0
  131. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/EdgesEmphasisRenderer.js +137 -0
  132. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/EdgesRenderer.js +12 -0
  133. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/Renderers.js +403 -0
  134. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesColorRenderer.js +267 -0
  135. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesColorTextureRenderer.js +299 -0
  136. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesDepthRenderer.js +126 -0
  137. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesFlatColorRenderer.js +255 -0
  138. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesFlatNormalsRenderer.js +130 -0
  139. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesInstancingRenderer.js +32 -0
  140. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesNormalsRenderer.js +138 -0
  141. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesOcclusionRenderer.js +128 -0
  142. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesPBRRenderer.js +561 -0
  143. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesPickDepthRenderer.js +149 -0
  144. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesPickMeshRenderer.js +136 -0
  145. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesPickNormalsFlatRenderer.js +130 -0
  146. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesPickNormalsRenderer.js +145 -0
  147. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesShadowRenderer.js +113 -0
  148. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesSilhouetteRenderer.js +148 -0
  149. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesSnapInitRenderer.js +319 -0
  150. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesSnapRenderer.js +310 -0
  151. package/src/viewer/scene/scene/Scene.js +38 -21
  152. package/src/viewer/scene/webgl/ArrayBuf.js +20 -5
  153. package/src/viewer/scene/webgl/Attribute.js +23 -0
  154. package/src/viewer/scene/webgl/FrameContext.js +86 -14
  155. package/src/viewer/scene/webgl/Program.js +181 -0
  156. package/src/viewer/scene/webgl/RenderBuffer.js +262 -62
  157. package/src/viewer/scene/webgl/RenderBufferManager.js +34 -0
  158. package/src/viewer/scene/webgl/Renderer.js +843 -880
  159. package/src/viewer/scene/webgl/Sampler.js +18 -0
  160. package/src/viewer/scene/webgl/Shader.js +49 -0
  161. package/src/viewer/scene/webgl/occlusion/OcclusionLayer.js +132 -60
  162. package/src/viewer/scene/webgl/occlusion/OcclusionTester.js +328 -167
  163. package/src/viewer/scene/webgl/sao/SAODepthLimitedBlurRenderer.js +324 -0
  164. package/src/viewer/scene/webgl/sao/SAOOcclusionRenderer.js +384 -0
  165. package/src/viewer/utils/os.js +9 -0
  166. package/src/viewer/scene/mesh/draw/LambertShaderSource.js +0 -35
  167. package/src/viewer/scene/mesh/emphasis/EmphasisShaderSource.js +0 -34
  168. package/src/viewer/scene/model/layer/DTXLayer.js +0 -940
  169. package/src/viewer/scene/model/layer/Layer.js +0 -786
  170. package/src/viewer/scene/model/layer/VBOLayer.js +0 -1019
  171. package/src/viewer/scene/model/layer/programs/ColorProgram.js +0 -35
  172. package/src/viewer/scene/model/layer/programs/ColorTextureProgram.js +0 -46
  173. package/src/viewer/scene/model/layer/programs/DepthProgram.js +0 -11
  174. package/src/viewer/scene/model/layer/programs/EdgesProgram.js +0 -12
  175. package/src/viewer/scene/model/layer/programs/FlatColorProgram.js +0 -24
  176. package/src/viewer/scene/model/layer/programs/OcclusionProgram.js +0 -12
  177. package/src/viewer/scene/model/layer/programs/PBRProgram.js +0 -180
  178. package/src/viewer/scene/model/layer/programs/PickDepthProgram.js +0 -30
  179. package/src/viewer/scene/model/layer/programs/PickMeshProgram.js +0 -12
  180. package/src/viewer/scene/model/layer/programs/PickNormalsProgram.js +0 -18
  181. package/src/viewer/scene/model/layer/programs/ShadowProgram.js +0 -23
  182. package/src/viewer/scene/model/layer/programs/SilhouetteProgram.js +0 -15
  183. package/src/viewer/scene/model/layer/programs/SnapProgram.js +0 -28
  184. package/src/viewer/scene/webgl/WebGLRenderer.js +0 -612
@@ -0,0 +1,181 @@
1
+ import {Map} from "../utils/Map.js";
2
+ import {Shader} from "./Shader.js";
3
+ import {Sampler} from "./Sampler.js";
4
+ import {Attribute} from "./Attribute.js";
5
+
6
+ const ids = new Map({});
7
+
8
+ function joinSansComments(srcLines) {
9
+ const src = [];
10
+ let line;
11
+ let n;
12
+ for (let i = 0, len = srcLines.length; i < len; i++) {
13
+ line = srcLines[i];
14
+ n = line.indexOf("/");
15
+ if (n > 0) {
16
+ if (line.charAt(n + 1) === "/") {
17
+ line = line.substring(0, n);
18
+ }
19
+ }
20
+ src.push(line);
21
+ }
22
+ return src.join("\n");
23
+ }
24
+
25
+ function logErrors(errors) {
26
+ console.error(errors.join("\n"));
27
+ }
28
+
29
+ /**
30
+ * @desc Represents a WebGL program.
31
+ * @private
32
+ */
33
+ class Program {
34
+
35
+ constructor(gl, shaderSource) {
36
+ this.id = ids.addItem({});
37
+ this.source = shaderSource;
38
+ this.init(gl);
39
+ }
40
+
41
+ init(gl) {
42
+ this.gl = gl;
43
+ this.allocated = false;
44
+ this.compiled = false;
45
+ this.linked = false;
46
+ this.validated = false;
47
+ this.errors = null;
48
+ this.uniforms = {};
49
+ this.samplers = {};
50
+ this.attributes = {};
51
+ this._vertexShader = new Shader(gl, gl.VERTEX_SHADER, joinSansComments(this.source.vertex));
52
+ this._fragmentShader = new Shader(gl, gl.FRAGMENT_SHADER, joinSansComments(this.source.fragment));
53
+ if (!this._vertexShader.allocated) {
54
+ this.errors = ["Vertex shader failed to allocate"].concat(this._vertexShader.errors);
55
+ logErrors(this.errors);
56
+ return;
57
+ }
58
+ if (!this._fragmentShader.allocated) {
59
+ this.errors = ["Fragment shader failed to allocate"].concat(this._fragmentShader.errors);
60
+ logErrors(this.errors);
61
+ return;
62
+ }
63
+ this.allocated = true;
64
+ if (!this._vertexShader.compiled) {
65
+ this.errors = ["Vertex shader failed to compile"].concat(this._vertexShader.errors);
66
+ logErrors(this.errors);
67
+ return;
68
+ }
69
+ if (!this._fragmentShader.compiled) {
70
+ this.errors = ["Fragment shader failed to compile"].concat(this._fragmentShader.errors);
71
+ logErrors(this.errors);
72
+ return;
73
+ }
74
+ this.compiled = true;
75
+ let a;
76
+ let i;
77
+ let u;
78
+ let uName;
79
+ let location;
80
+ this.handle = gl.createProgram();
81
+ if (!this.handle) {
82
+ this.errors = ["Failed to allocate program"];
83
+ return;
84
+ }
85
+ gl.attachShader(this.handle, this._vertexShader.handle);
86
+ gl.attachShader(this.handle, this._fragmentShader.handle);
87
+ gl.linkProgram(this.handle);
88
+ this.linked = gl.getProgramParameter(this.handle, gl.LINK_STATUS);
89
+ // HACK: Disable validation temporarily
90
+ // Perhaps we should defer validation until render-time, when the program has values set for all inputs?
91
+ this.validated = true;
92
+ if (!this.linked || !this.validated) {
93
+ this.errors = [];
94
+ this.errors.push("");
95
+ this.errors.push(gl.getProgramInfoLog(this.handle));
96
+ this.errors.push("\nVertex shader:\n");
97
+ this.errors = this.errors.concat(this.source.vertex);
98
+ this.errors.push("\nFragment shader:\n");
99
+ this.errors = this.errors.concat(this.source.fragment);
100
+ logErrors(this.errors);
101
+ return;
102
+ }
103
+ const numUniforms = gl.getProgramParameter(this.handle, gl.ACTIVE_UNIFORMS);
104
+ for (i = 0; i < numUniforms; ++i) {
105
+ u = gl.getActiveUniform(this.handle, i);
106
+ if (u) {
107
+ uName = u.name;
108
+ if (uName[uName.length - 1] === "\u0000") {
109
+ uName = uName.substr(0, uName.length - 1);
110
+ }
111
+ location = gl.getUniformLocation(this.handle, uName);
112
+ if ((u.type === gl.SAMPLER_2D) || (u.type === gl.SAMPLER_CUBE) || (u.type === 35682)) {
113
+ this.samplers[uName] = new Sampler(gl, location);
114
+ } else if (gl instanceof WebGL2RenderingContext && (u.type === gl.UNSIGNED_INT_SAMPLER_2D || u.type === gl.INT_SAMPLER_2D)) {
115
+ this.samplers[uName] = new Sampler(gl, location);
116
+ } else {
117
+ this.uniforms[uName] = location;
118
+ }
119
+ }
120
+ }
121
+ const numAttribs = gl.getProgramParameter(this.handle, gl.ACTIVE_ATTRIBUTES);
122
+ for (i = 0; i < numAttribs; i++) {
123
+ a = gl.getActiveAttrib(this.handle, i);
124
+ if (a) {
125
+ location = gl.getAttribLocation(this.handle, a.name);
126
+ this.attributes[a.name] = new Attribute(gl, location);
127
+ }
128
+ }
129
+ this.allocated = true;
130
+ }
131
+
132
+ bind() {
133
+ if (!this.allocated) {
134
+ return;
135
+ }
136
+ this.gl.useProgram(this.handle);
137
+ }
138
+
139
+ getLocation(name) {
140
+ if (!this.allocated) {
141
+ return;
142
+ }
143
+ return this.uniforms[name];
144
+ }
145
+
146
+ getAttribute(name) {
147
+ if (!this.allocated) {
148
+ return;
149
+ }
150
+ return this.attributes[name];
151
+ }
152
+
153
+ bindTexture(name, texture, unit) {
154
+ if (!this.allocated) {
155
+ return false;
156
+ }
157
+ const sampler = this.samplers[name];
158
+ if (sampler) {
159
+ return sampler.bindTexture(texture, unit);
160
+ } else {
161
+ return false;
162
+ }
163
+ }
164
+
165
+ destroy() {
166
+ if (!this.allocated) {
167
+ return;
168
+ }
169
+ ids.removeItem(this.id);
170
+ this.gl.deleteProgram(this.handle);
171
+ this.gl.deleteShader(this._vertexShader.handle);
172
+ this.gl.deleteShader(this._fragmentShader.handle);
173
+ this.handle = null;
174
+ this.attributes = null;
175
+ this.uniforms = null;
176
+ this.samplers = null;
177
+ this.allocated = false;
178
+ }
179
+ }
180
+
181
+ export {Program};
@@ -4,65 +4,117 @@
4
4
  */
5
5
  class RenderBuffer {
6
6
 
7
- constructor(gl, colorFormats, hasDepthTexture) {
7
+ constructor(canvas, gl, options) {
8
+ options = options || {};
8
9
  /** @type {WebGL2RenderingContext} */
9
10
  this.gl = gl;
10
11
  this.allocated = false;
12
+ this.canvas = canvas;
11
13
  this.buffer = null;
12
14
  this.bound = false;
13
- this._colorFormats = colorFormats;
14
- this._hasDepthTexture = hasDepthTexture;
15
+ this.size = options.size;
16
+ this._hasDepthTexture = !!options.depthTexture;
15
17
  }
16
18
 
17
19
  setSize(size) {
18
20
  this.size = size;
19
21
  }
20
22
 
21
- bind() {
22
- const width = this.size[0];
23
- const height = this.size[1];
23
+ webglContextRestored(gl) {
24
+ this.gl = gl;
25
+ this.buffer = null;
26
+ this.allocated = false;
27
+ this.bound = false;
28
+ }
24
29
 
25
- if (this.buffer && ((this.buffer.width !== width) || (this.buffer.height !== height))) {
26
- this.buffer.cleanup();
27
- this.buffer = null;
30
+ bind(...internalformats) {
31
+ this._touch(...internalformats);
32
+ if (this.bound) {
33
+ return;
28
34
  }
35
+ const gl = this.gl;
36
+ gl.bindFramebuffer(gl.FRAMEBUFFER, this.buffer.framebuf);
37
+ this.bound = true;
38
+ }
29
39
 
30
- if (! this.buffer) {
31
- this._allocateBuffer(width, height);
32
- this.bound = false;
33
- }
40
+ /**
41
+ * Create and specify a WebGL texture image.
42
+ *
43
+ * @param { number } width
44
+ * @param { number } height
45
+ * @param { GLenum } [internalformat=null]
46
+ *
47
+ * @returns { WebGLTexture }
48
+ */
49
+ createTexture(width, height, internalformat = null) {
50
+ const gl = this.gl;
34
51
 
35
- if (! this.bound) {
36
- const gl = this.gl;
37
- gl.bindFramebuffer(gl.FRAMEBUFFER, this.buffer.framebuf);
38
- this.bound = true;
52
+ const colorTexture = gl.createTexture();
53
+ gl.bindTexture(gl.TEXTURE_2D, colorTexture);
54
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
55
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
56
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
57
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
58
+
59
+ if (internalformat) {
60
+ gl.texStorage2D(gl.TEXTURE_2D, 1, internalformat, width, height);
61
+ } else {
62
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
39
63
  }
64
+
65
+ return colorTexture;
40
66
  }
41
67
 
42
- _allocateBuffer(width, height) {
43
- const internalformats = this._colorFormats || [];
68
+ /**
69
+ *
70
+ * @param {number[]} [internalformats=[]]
71
+ * @returns
72
+ */
73
+ _touch(...internalformats) {
44
74
 
75
+ let width;
76
+ let height;
45
77
  const gl = this.gl;
46
78
 
47
- const createTexture = () => {
48
- const tex = gl.createTexture();
49
- gl.bindTexture(gl.TEXTURE_2D, tex);
50
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
51
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
52
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
53
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
54
- return tex;
55
- };
79
+ if (this.size) {
80
+ width = this.size[0];
81
+ height = this.size[1];
82
+
83
+ } else {
84
+ width = gl.drawingBufferWidth;
85
+ height = gl.drawingBufferHeight;
86
+ }
87
+
88
+ if (this.buffer) {
89
+
90
+ if (this.buffer.width === width && this.buffer.height === height) {
91
+ return;
56
92
 
57
- const colorTextures = ((internalformats.length > 0) ? internalformats : [ null ]).map(internalformat => {
58
- const tex = createTexture();
59
- if (internalformat) {
60
- gl.texStorage2D(gl.TEXTURE_2D, 1, internalformat, width, height);
61
93
  } else {
62
- gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
94
+ this.buffer.textures.forEach(texture => gl.deleteTexture(texture));
95
+ gl.deleteFramebuffer(this.buffer.framebuf);
96
+ gl.deleteRenderbuffer(this.buffer.renderbuf);
63
97
  }
64
- return tex;
65
- });
98
+ }
99
+
100
+ const colorTextures = [];
101
+ if (internalformats.length > 0) {
102
+ colorTextures.push(...internalformats.map(internalformat => this.createTexture(width, height, internalformat)));
103
+ } else {
104
+ colorTextures.push(this.createTexture(width, height));
105
+ }
106
+
107
+ let depthTexture;
108
+
109
+ if (this._hasDepthTexture) {
110
+ depthTexture = gl.createTexture();
111
+ gl.bindTexture(gl.TEXTURE_2D, depthTexture);
112
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
113
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
114
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
115
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
116
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT32F, width, height, 0, gl.DEPTH_COMPONENT, gl.FLOAT, null);
117
+ }
66
118
 
67
119
  const renderbuf = gl.createRenderbuffer();
68
120
  gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuf);
@@ -77,9 +129,7 @@ class RenderBuffer {
77
129
  gl.drawBuffers(colorTextures.map((_, i) => gl.COLOR_ATTACHMENT0 + i));
78
130
  }
79
131
 
80
- const depthTexture = this._hasDepthTexture && createTexture();
81
- if (depthTexture) {
82
- gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT32F, width, height, 0, gl.DEPTH_COMPONENT, gl.FLOAT, null);
132
+ if (this._hasDepthTexture) {
83
133
  gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, depthTexture, 0);
84
134
  } else {
85
135
  gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, renderbuf);
@@ -121,57 +171,207 @@ class RenderBuffer {
121
171
  }
122
172
 
123
173
  this.buffer = {
124
- cleanup: () => {
125
- colorTextures.forEach(texture => gl.deleteTexture(texture));
126
- depthTexture && gl.deleteTexture(depthTexture);
127
- gl.deleteFramebuffer(framebuf);
128
- gl.deleteRenderbuffer(renderbuf);
129
- },
130
174
  framebuf: framebuf,
175
+ renderbuf: renderbuf,
176
+ texture: colorTextures[0],
177
+ textures: colorTextures,
178
+ depthTexture: depthTexture,
131
179
  width: width,
132
180
  height: height
133
181
  };
134
182
 
135
- this.colorTextures = colorTextures.map(tex => ({
136
- bind: function(unit) {
137
- gl.activeTexture(gl["TEXTURE" + unit]);
138
- gl.bindTexture(gl.TEXTURE_2D, tex);
139
- return true;
140
- }
141
- }));
183
+ this.bound = false;
184
+ }
142
185
 
143
- this.depthTexture = depthTexture && {
144
- bind: function(unit) {
145
- gl.activeTexture(gl["TEXTURE" + unit]);
146
- gl.bindTexture(gl.TEXTURE_2D, depthTexture);
147
- return true;
148
- }
149
- };
186
+ clear() {
187
+ if (!this.bound) {
188
+ throw "Render buffer not bound";
189
+ }
190
+ const gl = this.gl;
191
+ gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
150
192
  }
151
193
 
152
194
  read(pickX, pickY, glFormat = null, glType = null, arrayType = Uint8Array, arrayMultiplier = 4, colorBufferIndex = 0) {
195
+ const x = pickX;
196
+ const y = this.buffer.height ? (this.buffer.height - pickY - 1) : (this.gl.drawingBufferHeight - pickY);
153
197
  const pix = new arrayType(arrayMultiplier);
154
198
  const gl = this.gl;
155
199
  gl.readBuffer(gl.COLOR_ATTACHMENT0 + colorBufferIndex);
156
- gl.readPixels(pickX, this.buffer.height - pickY - 1, 1, 1, glFormat || gl.RGBA, glType || gl.UNSIGNED_BYTE, pix, 0);
200
+ gl.readPixels(x, y, 1, 1, glFormat || gl.RGBA, glType || gl.UNSIGNED_BYTE, pix, 0);
157
201
  return pix;
158
202
  }
159
203
 
204
+ readArray(glFormat = null, glType = null, arrayType = Uint8Array, arrayMultiplier = 4, colorBufferIndex = 0) {
205
+ const pix = new arrayType(this.buffer.width*this.buffer.height * arrayMultiplier);
206
+ const gl = this.gl;
207
+ gl.readBuffer(gl.COLOR_ATTACHMENT0 + colorBufferIndex);
208
+ gl.readPixels(0, 0, this.buffer.width, this.buffer.height, glFormat || gl.RGBA, glType || gl.UNSIGNED_BYTE, pix, 0);
209
+ return pix;
210
+ }
211
+
212
+ /**
213
+ * Returns an HTMLCanvas containing the contents of the RenderBuffer as an image.
214
+ *
215
+ * - The HTMLCanvas has a CanvasRenderingContext2D.
216
+ * - Expects the caller to draw more things on the HTMLCanvas (annotations etc).
217
+ *
218
+ * @returns {HTMLCanvasElement}
219
+ */
220
+ readImageAsCanvas() {
221
+ const gl = this.gl;
222
+ const imageDataCache = this._getImageDataCache();
223
+ const pixelData = imageDataCache.pixelData;
224
+ const canvas = imageDataCache.canvas;
225
+ const imageData = imageDataCache.imageData;
226
+ const context = imageDataCache.context;
227
+ gl.readPixels(0, 0, this.buffer.width, this.buffer.height, gl.RGBA, gl.UNSIGNED_BYTE, pixelData);
228
+ const width = this.buffer.width;
229
+ const height = this.buffer.height;
230
+ const halfHeight = height / 2 | 0; // the | 0 keeps the result an int
231
+ const bytesPerRow = width * 4;
232
+ const temp = new Uint8Array(width * 4);
233
+ for (let y = 0; y < halfHeight; ++y) {
234
+ const topOffset = y * bytesPerRow;
235
+ const bottomOffset = (height - y - 1) * bytesPerRow;
236
+ temp.set(pixelData.subarray(topOffset, topOffset + bytesPerRow));
237
+ pixelData.copyWithin(topOffset, bottomOffset, bottomOffset + bytesPerRow);
238
+ pixelData.set(temp, bottomOffset);
239
+ }
240
+ imageData.data.set(pixelData);
241
+ context.putImageData(imageData, 0, 0);
242
+ return canvas;
243
+ }
244
+
245
+ readImage(params) {
246
+ const gl = this.gl;
247
+ const imageDataCache = this._getImageDataCache();
248
+ const pixelData = imageDataCache.pixelData;
249
+ const canvas = imageDataCache.canvas;
250
+ const imageData = imageDataCache.imageData;
251
+ const context = imageDataCache.context;
252
+ const { width, height } = this.buffer;
253
+ gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixelData);
254
+ imageData.data.set(pixelData);
255
+ context.putImageData(imageData, 0, 0);
256
+
257
+ // flip Y
258
+ context.save();
259
+ context.globalCompositeOperation = 'copy';
260
+ context.scale(1, -1);
261
+ context.drawImage(canvas, 0, -height, width, height);
262
+ context.restore();
263
+
264
+ let format = params.format || "png";
265
+ if (format !== "jpeg" && format !== "png" && format !== "bmp") {
266
+ console.error("Unsupported image format: '" + format + "' - supported types are 'jpeg', 'bmp' and 'png' - defaulting to 'png'");
267
+ format = "png";
268
+ }
269
+ return canvas.toDataURL(`image/${format}`);
270
+ }
271
+
272
+ _getImageDataCache(type = Uint8Array, multiplier = 4) {
273
+
274
+ const bufferWidth = this.buffer.width;
275
+ const bufferHeight = this.buffer.height;
276
+
277
+ let imageDataCache = this._imageDataCache;
278
+
279
+ if (imageDataCache) {
280
+ if (imageDataCache.width !== bufferWidth || imageDataCache.height !== bufferHeight) {
281
+ this._imageDataCache = null;
282
+ imageDataCache = null;
283
+ }
284
+ }
285
+
286
+ if (!imageDataCache) {
287
+ const canvas = document.createElement('canvas');
288
+ const context = canvas.getContext('2d');
289
+ canvas.width = bufferWidth;
290
+ canvas.height = bufferHeight;
291
+ imageDataCache = {
292
+ pixelData: new type(bufferWidth * bufferHeight * multiplier),
293
+ canvas: canvas,
294
+ context: context,
295
+ imageData: context.createImageData(bufferWidth, bufferHeight),
296
+ width: bufferWidth,
297
+ height: bufferHeight
298
+ };
299
+
300
+ this._imageDataCache = imageDataCache;
301
+ }
302
+ imageDataCache.context.resetTransform(); // Prevents strange scale-accumulation effect with html2canvas
303
+ return imageDataCache;
304
+ }
305
+
160
306
  unbind() {
161
307
  const gl = this.gl;
162
308
  gl.bindFramebuffer(gl.FRAMEBUFFER, null);
163
309
  this.bound = false;
164
310
  }
165
311
 
312
+ getTexture(index = 0) {
313
+ const self = this;
314
+ return this._texture || (this._texture = {
315
+ renderBuffer: this,
316
+ bind: function (unit) {
317
+ if (self.buffer && self.buffer.textures[index]) {
318
+ self.gl.activeTexture(self.gl["TEXTURE" + unit]);
319
+ self.gl.bindTexture(self.gl.TEXTURE_2D, self.buffer.textures[index]);
320
+ return true;
321
+ }
322
+ return false;
323
+ },
324
+ unbind: function (unit) {
325
+ if (self.buffer && self.buffer.textures[index]) {
326
+ self.gl.activeTexture(self.gl["TEXTURE" + unit]);
327
+ self.gl.bindTexture(self.gl.TEXTURE_2D, null);
328
+ }
329
+ }
330
+ });
331
+ }
332
+
333
+ hasDepthTexture() {
334
+ return this._hasDepthTexture;
335
+ }
336
+
337
+ getDepthTexture() {
338
+ if (!this._hasDepthTexture) {
339
+ return null;
340
+ }
341
+ const self = this;
342
+ return this._depthTexture || (this._dethTexture = {
343
+ renderBuffer: this,
344
+ bind: function (unit) {
345
+ if (self.buffer && self.buffer.depthTexture) {
346
+ self.gl.activeTexture(self.gl["TEXTURE" + unit]);
347
+ self.gl.bindTexture(self.gl.TEXTURE_2D, self.buffer.depthTexture);
348
+ return true;
349
+ }
350
+ return false;
351
+ },
352
+ unbind: function (unit) {
353
+ if (self.buffer && self.buffer.depthTexture) {
354
+ self.gl.activeTexture(self.gl["TEXTURE" + unit]);
355
+ self.gl.bindTexture(self.gl.TEXTURE_2D, null);
356
+ }
357
+ }
358
+ });
359
+ }
360
+
166
361
  destroy() {
167
362
  if (this.allocated) {
168
- this.buffer.cleanup();
363
+ const gl = this.gl;
364
+ this.buffer.textures.forEach(texture => gl.deleteTexture(texture));
365
+ gl.deleteTexture(this.buffer.depthTexture);
366
+ gl.deleteFramebuffer(this.buffer.framebuf);
367
+ gl.deleteRenderbuffer(this.buffer.renderbuf);
169
368
  this.allocated = false;
170
369
  this.buffer = null;
171
370
  this.bound = false;
172
371
  }
173
- this.colorTextures = null;
174
- this.depthTexture = null;
372
+ this._imageDataCache = null;
373
+ this._texture = null;
374
+ this._depthTexture = null;
175
375
  }
176
376
  }
177
377
 
@@ -0,0 +1,34 @@
1
+ import {RenderBuffer} from "./RenderBuffer.js";
2
+
3
+ /**
4
+ * @private
5
+ */
6
+ class RenderBufferManager {
7
+
8
+ constructor(scene) {
9
+ this.scene = scene;
10
+ this._renderBuffersBasic = {};
11
+ this._renderBuffersScaled = {};
12
+ }
13
+
14
+ getRenderBuffer(id, options) {
15
+ const renderBuffers = (this.scene.canvas.resolutionScale === 1.0) ? this._renderBuffersBasic : this._renderBuffersScaled;
16
+ let renderBuffer = renderBuffers[id];
17
+ if (!renderBuffer) {
18
+ renderBuffer = new RenderBuffer(this.scene.canvas.canvas, this.scene.canvas.gl, options);
19
+ renderBuffers[id] = renderBuffer;
20
+ }
21
+ return renderBuffer;
22
+ }
23
+
24
+ destroy() {
25
+ for (let id in this._renderBuffersBasic) {
26
+ this._renderBuffersBasic[id].destroy();
27
+ }
28
+ for (let id in this._renderBuffersScaled) {
29
+ this._renderBuffersScaled[id].destroy();
30
+ }
31
+ }
32
+ }
33
+
34
+ export {RenderBufferManager};