@luma.gl/webgl 9.0.0-alpha.16 → 9.0.0-alpha.19

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 (417) hide show
  1. package/dist/adapter/converters/device-parameters.d.ts.map +1 -1
  2. package/dist/adapter/converters/device-parameters.js +117 -200
  3. package/dist/adapter/converters/device-parameters.js.map +1 -0
  4. package/dist/adapter/converters/renderbuffer-formats.d.ts +1 -1
  5. package/dist/adapter/converters/renderbuffer-formats.d.ts.map +1 -1
  6. package/dist/adapter/converters/renderbuffer-formats.js +172 -62
  7. package/dist/adapter/converters/renderbuffer-formats.js.map +1 -0
  8. package/dist/adapter/converters/sampler-parameters.d.ts.map +1 -1
  9. package/dist/adapter/converters/sampler-parameters.js +151 -149
  10. package/dist/adapter/converters/sampler-parameters.js.map +1 -0
  11. package/dist/adapter/converters/texture-formats.d.ts +2 -2
  12. package/dist/adapter/converters/texture-formats.d.ts.map +1 -1
  13. package/dist/adapter/converters/texture-formats.js +847 -438
  14. package/dist/adapter/converters/texture-formats.js.map +1 -0
  15. package/dist/adapter/converters/vertex-formats.js +24 -15
  16. package/dist/adapter/converters/vertex-formats.js.map +1 -0
  17. package/dist/adapter/device-helpers/device-features.js +84 -120
  18. package/dist/adapter/device-helpers/device-features.js.map +1 -0
  19. package/dist/adapter/device-helpers/device-limits.d.ts +1 -1
  20. package/dist/adapter/device-helpers/device-limits.d.ts.map +1 -1
  21. package/dist/adapter/device-helpers/device-limits.js +83 -88
  22. package/dist/adapter/device-helpers/device-limits.js.map +1 -0
  23. package/dist/adapter/device-helpers/get-device-info.js +37 -42
  24. package/dist/adapter/device-helpers/get-device-info.js.map +1 -0
  25. package/dist/adapter/device-helpers/is-old-ie.js +8 -10
  26. package/dist/adapter/device-helpers/is-old-ie.js.map +1 -0
  27. package/dist/adapter/helpers/attribute-utils.js +57 -50
  28. package/dist/adapter/helpers/attribute-utils.js.map +1 -0
  29. package/dist/adapter/helpers/get-shader-info.d.ts +1 -1
  30. package/dist/adapter/helpers/get-shader-info.d.ts.map +1 -1
  31. package/dist/adapter/helpers/get-shader-info.js +19 -21
  32. package/dist/adapter/helpers/get-shader-info.js.map +1 -0
  33. package/dist/adapter/helpers/get-shader-layout.js +251 -310
  34. package/dist/adapter/helpers/get-shader-layout.js.map +1 -0
  35. package/dist/adapter/helpers/parse-shader-compiler-log.js +26 -32
  36. package/dist/adapter/helpers/parse-shader-compiler-log.js.map +1 -0
  37. package/dist/adapter/helpers/set-uniform.d.ts.map +1 -1
  38. package/dist/adapter/helpers/set-uniform.js +80 -67
  39. package/dist/adapter/helpers/set-uniform.js.map +1 -0
  40. package/dist/adapter/helpers/uniforms.js +75 -80
  41. package/dist/adapter/helpers/uniforms.js.map +1 -0
  42. package/dist/adapter/objects/constants-to-keys.js +26 -33
  43. package/dist/adapter/objects/constants-to-keys.js.map +1 -0
  44. package/dist/adapter/objects/webgl-renderbuffer.d.ts +1 -1
  45. package/dist/adapter/objects/webgl-renderbuffer.d.ts.map +1 -1
  46. package/dist/adapter/objects/webgl-renderbuffer.js +70 -67
  47. package/dist/adapter/objects/webgl-renderbuffer.js.map +1 -0
  48. package/dist/adapter/objects/webgl-resource.d.ts.map +1 -1
  49. package/dist/adapter/objects/webgl-resource.js +158 -213
  50. package/dist/adapter/objects/webgl-resource.js.map +1 -0
  51. package/dist/adapter/objects/webgl-vertex-array-object.d.ts +1 -1
  52. package/dist/adapter/objects/webgl-vertex-array-object.d.ts.map +1 -1
  53. package/dist/adapter/objects/webgl-vertex-array-object.js +66 -74
  54. package/dist/adapter/objects/webgl-vertex-array-object.js.map +1 -0
  55. package/dist/adapter/resources/webgl-buffer.d.ts.map +1 -1
  56. package/dist/adapter/resources/webgl-buffer.js +118 -150
  57. package/dist/adapter/resources/webgl-buffer.js.map +1 -0
  58. package/dist/adapter/resources/webgl-command-buffer.d.ts +5 -5
  59. package/dist/adapter/resources/webgl-command-buffer.d.ts.map +1 -1
  60. package/dist/adapter/resources/webgl-command-buffer.js +41 -40
  61. package/dist/adapter/resources/webgl-command-buffer.js.map +1 -0
  62. package/dist/adapter/resources/webgl-command-encoder.js +37 -26
  63. package/dist/adapter/resources/webgl-command-encoder.js.map +1 -0
  64. package/dist/adapter/resources/webgl-external-texture.js +1 -91
  65. package/dist/adapter/resources/webgl-external-texture.js.map +1 -0
  66. package/dist/adapter/resources/webgl-framebuffer.d.ts +2 -2
  67. package/dist/adapter/resources/webgl-framebuffer.d.ts.map +1 -1
  68. package/dist/adapter/resources/webgl-framebuffer.js +198 -231
  69. package/dist/adapter/resources/webgl-framebuffer.js.map +1 -0
  70. package/dist/adapter/resources/webgl-render-pass.js +11 -8
  71. package/dist/adapter/resources/webgl-render-pass.js.map +1 -0
  72. package/dist/adapter/resources/webgl-render-pipeline.d.ts.map +1 -1
  73. package/dist/adapter/resources/webgl-render-pipeline.js +289 -316
  74. package/dist/adapter/resources/webgl-render-pipeline.js.map +1 -0
  75. package/dist/adapter/resources/webgl-sampler.js +35 -42
  76. package/dist/adapter/resources/webgl-sampler.js.map +1 -0
  77. package/dist/adapter/resources/webgl-shader.d.ts.map +1 -1
  78. package/dist/adapter/resources/webgl-shader.js +53 -57
  79. package/dist/adapter/resources/webgl-shader.js.map +1 -0
  80. package/dist/adapter/resources/webgl-texture.d.ts +4 -4
  81. package/dist/adapter/resources/webgl-texture.d.ts.map +1 -1
  82. package/dist/adapter/resources/webgl-texture.js +697 -661
  83. package/dist/adapter/resources/webgl-texture.js.map +1 -0
  84. package/dist/adapter/webgl-canvas-context.d.ts.map +1 -1
  85. package/dist/adapter/webgl-canvas-context.js +35 -55
  86. package/dist/adapter/webgl-canvas-context.js.map +1 -0
  87. package/dist/adapter/webgl-device.d.ts +5 -0
  88. package/dist/adapter/webgl-device.d.ts.map +1 -1
  89. package/dist/adapter/webgl-device.js +270 -287
  90. package/dist/adapter/webgl-device.js.map +1 -0
  91. package/dist/classic/accessor.js +103 -120
  92. package/dist/classic/accessor.js.map +1 -0
  93. package/dist/classic/buffer.d.ts +1 -1
  94. package/dist/classic/buffer.d.ts.map +1 -1
  95. package/dist/classic/buffer.js +300 -325
  96. package/dist/classic/buffer.js.map +1 -0
  97. package/dist/classic/typed-array-utils.d.ts +1 -1
  98. package/dist/classic/typed-array-utils.d.ts.map +1 -1
  99. package/dist/classic/typed-array-utils.js +81 -91
  100. package/dist/classic/typed-array-utils.js.map +1 -0
  101. package/dist/context/context/create-browser-context.d.ts +3 -1
  102. package/dist/context/context/create-browser-context.d.ts.map +1 -1
  103. package/dist/context/context/create-browser-context.js +49 -66
  104. package/dist/context/context/create-browser-context.js.map +1 -0
  105. package/dist/context/context/create-headless-context.d.ts +1 -1
  106. package/dist/context/context/create-headless-context.d.ts.map +1 -1
  107. package/dist/context/context/create-headless-context.js +30 -24
  108. package/dist/context/context/create-headless-context.js.map +1 -0
  109. package/dist/context/context/webgl-checks.js +17 -25
  110. package/dist/context/context/webgl-checks.js.map +1 -0
  111. package/dist/context/debug/spector.d.ts +3 -1
  112. package/dist/context/debug/spector.d.ts.map +1 -1
  113. package/dist/context/debug/spector.js +50 -53
  114. package/dist/context/debug/spector.js.map +1 -0
  115. package/dist/context/debug/webgl-developer-tools.d.ts +1 -1
  116. package/dist/context/debug/webgl-developer-tools.d.ts.map +1 -1
  117. package/dist/context/debug/webgl-developer-tools.js +76 -107
  118. package/dist/context/debug/webgl-developer-tools.js.map +1 -0
  119. package/dist/context/parameters/unified-parameter-api.js +46 -93
  120. package/dist/context/parameters/unified-parameter-api.js.map +1 -0
  121. package/dist/context/parameters/webgl-parameter-tables.d.ts +1 -1
  122. package/dist/context/parameters/webgl-parameter-tables.d.ts.map +1 -1
  123. package/dist/context/parameters/webgl-parameter-tables.js +404 -462
  124. package/dist/context/parameters/webgl-parameter-tables.js.map +1 -0
  125. package/dist/context/polyfill/context-data.js +10 -16
  126. package/dist/context/polyfill/context-data.js.map +1 -0
  127. package/dist/context/polyfill/get-parameter-polyfill.js +71 -91
  128. package/dist/context/polyfill/get-parameter-polyfill.js.map +1 -0
  129. package/dist/context/polyfill/polyfill-context.js +73 -75
  130. package/dist/context/polyfill/polyfill-context.js.map +1 -0
  131. package/dist/context/polyfill/polyfill-table.d.ts.map +1 -1
  132. package/dist/context/polyfill/polyfill-table.js +116 -133
  133. package/dist/context/polyfill/polyfill-table.js.map +1 -0
  134. package/dist/context/polyfill/polyfill-vertex-array-object.d.ts.map +1 -1
  135. package/dist/context/polyfill/polyfill-vertex-array-object.js +227 -255
  136. package/dist/context/polyfill/polyfill-vertex-array-object.js.map +1 -0
  137. package/dist/context/state-tracker/deep-array-equal.js +14 -16
  138. package/dist/context/state-tracker/deep-array-equal.js.map +1 -0
  139. package/dist/context/state-tracker/track-context-state.d.ts.map +1 -1
  140. package/dist/context/state-tracker/track-context-state.js +127 -183
  141. package/dist/context/state-tracker/track-context-state.js.map +1 -0
  142. package/dist/context/state-tracker/with-parameters.d.ts.map +1 -1
  143. package/dist/context/state-tracker/with-parameters.js +29 -43
  144. package/dist/context/state-tracker/with-parameters.js.map +1 -0
  145. package/dist/dist.dev.js +9205 -0
  146. package/dist/index.cjs +5948 -0
  147. package/dist/index.d.ts +0 -2
  148. package/dist/index.d.ts.map +1 -1
  149. package/dist/index.js +25 -41
  150. package/dist/index.js.map +1 -0
  151. package/dist/types/webgl.d.ts +16 -16
  152. package/dist/types/webgl.d.ts.map +1 -1
  153. package/dist/types/webgl.js +1 -0
  154. package/dist/types/webgl.js.map +1 -0
  155. package/dist/types.d.ts +1 -1
  156. package/dist/types.d.ts.map +1 -1
  157. package/dist/types.js +1 -0
  158. package/dist/types.js.map +1 -0
  159. package/dist.min.js +36 -0
  160. package/package.json +18 -9
  161. package/src/adapter/converters/device-parameters.ts +5 -2
  162. package/src/adapter/converters/sampler-parameters.ts +4 -2
  163. package/src/adapter/converters/texture-formats.ts +3 -1
  164. package/src/adapter/device-helpers/get-device-info.ts +8 -8
  165. package/src/adapter/helpers/get-shader-info.ts +1 -1
  166. package/src/adapter/helpers/get-shader-layout.ts +4 -4
  167. package/src/adapter/helpers/parse-shader-compiler-log.ts +1 -1
  168. package/src/adapter/helpers/set-uniform.ts +2 -0
  169. package/src/adapter/objects/webgl-renderbuffer.ts +1 -1
  170. package/src/adapter/objects/webgl-resource.ts +1 -1
  171. package/src/adapter/objects/webgl-vertex-array-object.ts +1 -1
  172. package/src/adapter/resources/webgl-buffer.ts +6 -6
  173. package/src/adapter/resources/webgl-command-encoder.ts +1 -1
  174. package/src/adapter/resources/webgl-framebuffer.ts +3 -4
  175. package/src/adapter/resources/webgl-render-pipeline.ts +19 -20
  176. package/src/adapter/resources/webgl-shader.ts +1 -1
  177. package/src/adapter/resources/webgl-texture.ts +8 -9
  178. package/src/adapter/webgl-canvas-context.ts +2 -2
  179. package/src/adapter/webgl-device.ts +12 -2
  180. package/src/classic/accessor.ts +1 -1
  181. package/src/classic/buffer.ts +3 -3
  182. package/src/classic/typed-array-utils.ts +1 -1
  183. package/src/context/context/create-browser-context.ts +4 -2
  184. package/src/context/context/create-headless-context.ts +2 -2
  185. package/src/context/debug/spector.ts +5 -4
  186. package/src/context/debug/webgl-developer-tools.ts +1 -0
  187. package/src/context/polyfill/polyfill-table.ts +1 -0
  188. package/src/context/polyfill/polyfill-vertex-array-object.ts +2 -0
  189. package/src/context/state-tracker/track-context-state.ts +6 -5
  190. package/src/context/state-tracker/with-parameters.ts +1 -1
  191. package/src/index.ts +1 -5
  192. package/src/types/webgl.ts +2 -0
  193. package/dist/bundle.d.ts +0 -2
  194. package/dist/bundle.d.ts.map +0 -1
  195. package/dist/bundle.js +0 -4
  196. package/dist/dist.min.js +0 -1
  197. package/dist/es5/adapter/converters/device-parameters.js +0 -139
  198. package/dist/es5/adapter/converters/device-parameters.js.map +0 -1
  199. package/dist/es5/adapter/converters/renderbuffer-formats.js +0 -151
  200. package/dist/es5/adapter/converters/renderbuffer-formats.js.map +0 -1
  201. package/dist/es5/adapter/converters/sampler-parameters.js +0 -182
  202. package/dist/es5/adapter/converters/sampler-parameters.js.map +0 -1
  203. package/dist/es5/adapter/converters/texture-formats.js +0 -950
  204. package/dist/es5/adapter/converters/texture-formats.js.map +0 -1
  205. package/dist/es5/adapter/converters/vertex-formats.js +0 -36
  206. package/dist/es5/adapter/converters/vertex-formats.js.map +0 -1
  207. package/dist/es5/adapter/device-helpers/device-features.js +0 -121
  208. package/dist/es5/adapter/device-helpers/device-features.js.map +0 -1
  209. package/dist/es5/adapter/device-helpers/device-limits.js +0 -54
  210. package/dist/es5/adapter/device-helpers/device-limits.js.map +0 -1
  211. package/dist/es5/adapter/device-helpers/get-device-info.js +0 -49
  212. package/dist/es5/adapter/device-helpers/get-device-info.js.map +0 -1
  213. package/dist/es5/adapter/device-helpers/is-old-ie.js +0 -15
  214. package/dist/es5/adapter/device-helpers/is-old-ie.js.map +0 -1
  215. package/dist/es5/adapter/helpers/attribute-utils.js +0 -69
  216. package/dist/es5/adapter/helpers/attribute-utils.js.map +0 -1
  217. package/dist/es5/adapter/helpers/get-shader-info.js +0 -31
  218. package/dist/es5/adapter/helpers/get-shader-info.js.map +0 -1
  219. package/dist/es5/adapter/helpers/get-shader-layout.js +0 -311
  220. package/dist/es5/adapter/helpers/get-shader-layout.js.map +0 -1
  221. package/dist/es5/adapter/helpers/parse-shader-compiler-log.js +0 -54
  222. package/dist/es5/adapter/helpers/parse-shader-compiler-log.js.map +0 -1
  223. package/dist/es5/adapter/helpers/set-uniform.js +0 -92
  224. package/dist/es5/adapter/helpers/set-uniform.js.map +0 -1
  225. package/dist/es5/adapter/helpers/uniforms.js +0 -88
  226. package/dist/es5/adapter/helpers/uniforms.js.map +0 -1
  227. package/dist/es5/adapter/objects/constants-to-keys.js +0 -43
  228. package/dist/es5/adapter/objects/constants-to-keys.js.map +0 -1
  229. package/dist/es5/adapter/objects/webgl-renderbuffer.js +0 -122
  230. package/dist/es5/adapter/objects/webgl-renderbuffer.js.map +0 -1
  231. package/dist/es5/adapter/objects/webgl-resource.js +0 -233
  232. package/dist/es5/adapter/objects/webgl-resource.js.map +0 -1
  233. package/dist/es5/adapter/objects/webgl-vertex-array-object.js +0 -109
  234. package/dist/es5/adapter/objects/webgl-vertex-array-object.js.map +0 -1
  235. package/dist/es5/adapter/resources/webgl-buffer.js +0 -196
  236. package/dist/es5/adapter/resources/webgl-buffer.js.map +0 -1
  237. package/dist/es5/adapter/resources/webgl-command-buffer.js +0 -70
  238. package/dist/es5/adapter/resources/webgl-command-buffer.js.map +0 -1
  239. package/dist/es5/adapter/resources/webgl-command-encoder.js +0 -80
  240. package/dist/es5/adapter/resources/webgl-command-encoder.js.map +0 -1
  241. package/dist/es5/adapter/resources/webgl-external-texture.js +0 -2
  242. package/dist/es5/adapter/resources/webgl-external-texture.js.map +0 -1
  243. package/dist/es5/adapter/resources/webgl-framebuffer.js +0 -275
  244. package/dist/es5/adapter/resources/webgl-framebuffer.js.map +0 -1
  245. package/dist/es5/adapter/resources/webgl-render-pass.js +0 -45
  246. package/dist/es5/adapter/resources/webgl-render-pass.js.map +0 -1
  247. package/dist/es5/adapter/resources/webgl-render-pipeline.js +0 -385
  248. package/dist/es5/adapter/resources/webgl-render-pipeline.js.map +0 -1
  249. package/dist/es5/adapter/resources/webgl-sampler.js +0 -75
  250. package/dist/es5/adapter/resources/webgl-sampler.js.map +0 -1
  251. package/dist/es5/adapter/resources/webgl-shader.js +0 -111
  252. package/dist/es5/adapter/resources/webgl-shader.js.map +0 -1
  253. package/dist/es5/adapter/resources/webgl-texture.js +0 -826
  254. package/dist/es5/adapter/resources/webgl-texture.js.map +0 -1
  255. package/dist/es5/adapter/webgl-canvas-context.js +0 -72
  256. package/dist/es5/adapter/webgl-canvas-context.js.map +0 -1
  257. package/dist/es5/adapter/webgl-device.js +0 -387
  258. package/dist/es5/adapter/webgl-device.js.map +0 -1
  259. package/dist/es5/bundle.js +0 -6
  260. package/dist/es5/bundle.js.map +0 -1
  261. package/dist/es5/classic/accessor.js +0 -151
  262. package/dist/es5/classic/accessor.js.map +0 -1
  263. package/dist/es5/classic/buffer.js +0 -398
  264. package/dist/es5/classic/buffer.js.map +0 -1
  265. package/dist/es5/classic/typed-array-utils.js +0 -99
  266. package/dist/es5/classic/typed-array-utils.js.map +0 -1
  267. package/dist/es5/context/context/create-browser-context.js +0 -66
  268. package/dist/es5/context/context/create-browser-context.js.map +0 -1
  269. package/dist/es5/context/context/create-headless-context.js +0 -47
  270. package/dist/es5/context/context/create-headless-context.js.map +0 -1
  271. package/dist/es5/context/context/webgl-checks.js +0 -44
  272. package/dist/es5/context/context/webgl-checks.js.map +0 -1
  273. package/dist/es5/context/debug/spector.js +0 -99
  274. package/dist/es5/context/debug/spector.js.map +0 -1
  275. package/dist/es5/context/debug/webgl-developer-tools.js +0 -146
  276. package/dist/es5/context/debug/webgl-developer-tools.js.map +0 -1
  277. package/dist/es5/context/parameters/unified-parameter-api.js +0 -76
  278. package/dist/es5/context/parameters/unified-parameter-api.js.map +0 -1
  279. package/dist/es5/context/parameters/webgl-parameter-tables.js +0 -346
  280. package/dist/es5/context/parameters/webgl-parameter-tables.js.map +0 -1
  281. package/dist/es5/context/polyfill/context-data.js +0 -18
  282. package/dist/es5/context/polyfill/context-data.js.map +0 -1
  283. package/dist/es5/context/polyfill/get-parameter-polyfill.js +0 -69
  284. package/dist/es5/context/polyfill/get-parameter-polyfill.js.map +0 -1
  285. package/dist/es5/context/polyfill/polyfill-context.js +0 -109
  286. package/dist/es5/context/polyfill/polyfill-context.js.map +0 -1
  287. package/dist/es5/context/polyfill/polyfill-table.js +0 -143
  288. package/dist/es5/context/polyfill/polyfill-table.js.map +0 -1
  289. package/dist/es5/context/polyfill/polyfill-vertex-array-object.js +0 -271
  290. package/dist/es5/context/polyfill/polyfill-vertex-array-object.js.map +0 -1
  291. package/dist/es5/context/state-tracker/deep-array-equal.js +0 -23
  292. package/dist/es5/context/state-tracker/deep-array-equal.js.map +0 -1
  293. package/dist/es5/context/state-tracker/track-context-state.js +0 -167
  294. package/dist/es5/context/state-tracker/track-context-state.js.map +0 -1
  295. package/dist/es5/context/state-tracker/with-parameters.js +0 -40
  296. package/dist/es5/context/state-tracker/with-parameters.js.map +0 -1
  297. package/dist/es5/index.js +0 -249
  298. package/dist/es5/index.js.map +0 -1
  299. package/dist/es5/init.js +0 -7
  300. package/dist/es5/init.js.map +0 -1
  301. package/dist/es5/types/webgl.js +0 -5
  302. package/dist/es5/types/webgl.js.map +0 -1
  303. package/dist/es5/types.js +0 -2
  304. package/dist/es5/types.js.map +0 -1
  305. package/dist/esm/adapter/converters/device-parameters.js +0 -137
  306. package/dist/esm/adapter/converters/device-parameters.js.map +0 -1
  307. package/dist/esm/adapter/converters/renderbuffer-formats.js +0 -181
  308. package/dist/esm/adapter/converters/renderbuffer-formats.js.map +0 -1
  309. package/dist/esm/adapter/converters/sampler-parameters.js +0 -172
  310. package/dist/esm/adapter/converters/sampler-parameters.js.map +0 -1
  311. package/dist/esm/adapter/converters/texture-formats.js +0 -901
  312. package/dist/esm/adapter/converters/texture-formats.js.map +0 -1
  313. package/dist/esm/adapter/converters/vertex-formats.js +0 -29
  314. package/dist/esm/adapter/converters/vertex-formats.js.map +0 -1
  315. package/dist/esm/adapter/device-helpers/device-features.js +0 -95
  316. package/dist/esm/adapter/device-helpers/device-features.js.map +0 -1
  317. package/dist/esm/adapter/device-helpers/device-limits.js +0 -88
  318. package/dist/esm/adapter/device-helpers/device-limits.js.map +0 -1
  319. package/dist/esm/adapter/device-helpers/get-device-info.js +0 -42
  320. package/dist/esm/adapter/device-helpers/get-device-info.js.map +0 -1
  321. package/dist/esm/adapter/device-helpers/is-old-ie.js +0 -9
  322. package/dist/esm/adapter/device-helpers/is-old-ie.js.map +0 -1
  323. package/dist/esm/adapter/helpers/attribute-utils.js +0 -64
  324. package/dist/esm/adapter/helpers/attribute-utils.js.map +0 -1
  325. package/dist/esm/adapter/helpers/get-shader-info.js +0 -25
  326. package/dist/esm/adapter/helpers/get-shader-info.js.map +0 -1
  327. package/dist/esm/adapter/helpers/get-shader-layout.js +0 -282
  328. package/dist/esm/adapter/helpers/get-shader-layout.js.map +0 -1
  329. package/dist/esm/adapter/helpers/parse-shader-compiler-log.js +0 -30
  330. package/dist/esm/adapter/helpers/parse-shader-compiler-log.js.map +0 -1
  331. package/dist/esm/adapter/helpers/set-uniform.js +0 -85
  332. package/dist/esm/adapter/helpers/set-uniform.js.map +0 -1
  333. package/dist/esm/adapter/helpers/uniforms.js +0 -89
  334. package/dist/esm/adapter/helpers/uniforms.js.map +0 -1
  335. package/dist/esm/adapter/objects/constants-to-keys.js +0 -35
  336. package/dist/esm/adapter/objects/constants-to-keys.js.map +0 -1
  337. package/dist/esm/adapter/objects/webgl-renderbuffer.js +0 -78
  338. package/dist/esm/adapter/objects/webgl-renderbuffer.js.map +0 -1
  339. package/dist/esm/adapter/objects/webgl-resource.js +0 -163
  340. package/dist/esm/adapter/objects/webgl-resource.js.map +0 -1
  341. package/dist/esm/adapter/objects/webgl-vertex-array-object.js +0 -74
  342. package/dist/esm/adapter/objects/webgl-vertex-array-object.js.map +0 -1
  343. package/dist/esm/adapter/resources/webgl-buffer.js +0 -134
  344. package/dist/esm/adapter/resources/webgl-buffer.js.map +0 -1
  345. package/dist/esm/adapter/resources/webgl-command-buffer.js +0 -50
  346. package/dist/esm/adapter/resources/webgl-command-buffer.js.map +0 -1
  347. package/dist/esm/adapter/resources/webgl-command-encoder.js +0 -41
  348. package/dist/esm/adapter/resources/webgl-command-encoder.js.map +0 -1
  349. package/dist/esm/adapter/resources/webgl-external-texture.js +0 -2
  350. package/dist/esm/adapter/resources/webgl-external-texture.js.map +0 -1
  351. package/dist/esm/adapter/resources/webgl-framebuffer.js +0 -207
  352. package/dist/esm/adapter/resources/webgl-framebuffer.js.map +0 -1
  353. package/dist/esm/adapter/resources/webgl-render-pass.js +0 -14
  354. package/dist/esm/adapter/resources/webgl-render-pass.js.map +0 -1
  355. package/dist/esm/adapter/resources/webgl-render-pipeline.js +0 -311
  356. package/dist/esm/adapter/resources/webgl-render-pipeline.js.map +0 -1
  357. package/dist/esm/adapter/resources/webgl-sampler.js +0 -42
  358. package/dist/esm/adapter/resources/webgl-sampler.js.map +0 -1
  359. package/dist/esm/adapter/resources/webgl-shader.js +0 -62
  360. package/dist/esm/adapter/resources/webgl-shader.js.map +0 -1
  361. package/dist/esm/adapter/resources/webgl-texture.js +0 -714
  362. package/dist/esm/adapter/resources/webgl-texture.js.map +0 -1
  363. package/dist/esm/adapter/webgl-canvas-context.js +0 -41
  364. package/dist/esm/adapter/webgl-canvas-context.js.map +0 -1
  365. package/dist/esm/adapter/webgl-device.js +0 -276
  366. package/dist/esm/adapter/webgl-device.js.map +0 -1
  367. package/dist/esm/bundle.js +0 -4
  368. package/dist/esm/bundle.js.map +0 -1
  369. package/dist/esm/classic/accessor.js +0 -120
  370. package/dist/esm/classic/accessor.js.map +0 -1
  371. package/dist/esm/classic/buffer.js +0 -327
  372. package/dist/esm/classic/buffer.js.map +0 -1
  373. package/dist/esm/classic/typed-array-utils.js +0 -92
  374. package/dist/esm/classic/typed-array-utils.js.map +0 -1
  375. package/dist/esm/context/context/create-browser-context.js +0 -53
  376. package/dist/esm/context/context/create-browser-context.js.map +0 -1
  377. package/dist/esm/context/context/create-headless-context.js +0 -39
  378. package/dist/esm/context/context/create-headless-context.js.map +0 -1
  379. package/dist/esm/context/context/webgl-checks.js +0 -31
  380. package/dist/esm/context/context/webgl-checks.js.map +0 -1
  381. package/dist/esm/context/debug/spector.js +0 -64
  382. package/dist/esm/context/debug/spector.js.map +0 -1
  383. package/dist/esm/context/debug/webgl-developer-tools.js +0 -97
  384. package/dist/esm/context/debug/webgl-developer-tools.js.map +0 -1
  385. package/dist/esm/context/parameters/unified-parameter-api.js +0 -55
  386. package/dist/esm/context/parameters/unified-parameter-api.js.map +0 -1
  387. package/dist/esm/context/parameters/webgl-parameter-tables.js +0 -427
  388. package/dist/esm/context/parameters/webgl-parameter-tables.js.map +0 -1
  389. package/dist/esm/context/polyfill/context-data.js +0 -12
  390. package/dist/esm/context/polyfill/context-data.js.map +0 -1
  391. package/dist/esm/context/polyfill/get-parameter-polyfill.js +0 -86
  392. package/dist/esm/context/polyfill/get-parameter-polyfill.js.map +0 -1
  393. package/dist/esm/context/polyfill/polyfill-context.js +0 -84
  394. package/dist/esm/context/polyfill/polyfill-context.js.map +0 -1
  395. package/dist/esm/context/polyfill/polyfill-table.js +0 -138
  396. package/dist/esm/context/polyfill/polyfill-table.js.map +0 -1
  397. package/dist/esm/context/polyfill/polyfill-vertex-array-object.js +0 -265
  398. package/dist/esm/context/polyfill/polyfill-vertex-array-object.js.map +0 -1
  399. package/dist/esm/context/state-tracker/deep-array-equal.js +0 -17
  400. package/dist/esm/context/state-tracker/deep-array-equal.js.map +0 -1
  401. package/dist/esm/context/state-tracker/track-context-state.js +0 -148
  402. package/dist/esm/context/state-tracker/track-context-state.js.map +0 -1
  403. package/dist/esm/context/state-tracker/with-parameters.js +0 -34
  404. package/dist/esm/context/state-tracker/with-parameters.js.map +0 -1
  405. package/dist/esm/index.js +0 -27
  406. package/dist/esm/index.js.map +0 -1
  407. package/dist/esm/init.js +0 -4
  408. package/dist/esm/init.js.map +0 -1
  409. package/dist/esm/types/webgl.js +0 -2
  410. package/dist/esm/types/webgl.js.map +0 -1
  411. package/dist/esm/types.js +0 -2
  412. package/dist/esm/types.js.map +0 -1
  413. package/dist/init.d.ts +0 -2
  414. package/dist/init.d.ts.map +0 -1
  415. package/dist/init.js +0 -3
  416. package/src/bundle.ts +0 -4
  417. package/src/init.ts +0 -4
@@ -1,678 +1,714 @@
1
- // luma.gl, MIT license
2
- // Texture class.
3
- // @todo
4
- // - [ ] cube texture init params
5
- // - [ ] video (external) textures
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
6
2
  import { isObjectEmpty } from '@luma.gl/api';
7
3
  import { Texture, cast, log, assert, isPowerOfTwo, loadImage } from '@luma.gl/api';
8
4
  import GL from '@luma.gl/constants';
9
- import { withParameters } from '../../context/state-tracker/with-parameters.js';
10
- import { getWebGLTextureFormat, getWebGLTextureParameters, getTextureFormatBytesPerPixel } from '../converters/texture-formats.js';
11
- import { convertSamplerParametersToWebGL, updateSamplerParametersForNPOT } from '../converters/sampler-parameters.js';
12
- import WEBGLBuffer from './webgl-buffer.js';
13
- import WEBGLSampler from './webgl-sampler.js';
14
- // Polyfill
15
- class WEBGLTexture extends Texture {
16
- constructor(device, props) {
17
- super(device, { format: GL.RGBA, ...props });
18
- this.width = undefined;
19
- this.height = undefined;
20
- this.depth = undefined;
21
- this.format = undefined;
22
- this.type = undefined;
23
- this.dataFormat = undefined;
24
- this.mipmaps = undefined;
25
- this.textureUnit = undefined;
26
- /** Sampler object (currently unused) */
27
- this.sampler = undefined;
28
- /**
29
- * Program.draw() checks the loaded flag of all textures to avoid
30
- * Textures that are still loading from promises
31
- * Set to true as soon as texture has been initialized with valid data
32
- */
33
- this.loaded = false;
34
- this.device = cast(device);
35
- this.gl = this.device.gl;
36
- this.gl2 = this.device.gl2;
37
- this.handle = this.props.handle || this.gl.createTexture();
38
- // @ts-expect-error Per SPECTOR docs
39
- this.handle.__SPECTOR_Metadata = { ...this.props, data: typeof this.props.data }; // {name: this.props.id};
40
- this.target = getWebGLTextureTarget(this.props);
41
- // Program.draw() checks the loaded flag of all textures
42
- this.loaded = false;
43
- // Signature: new Texture2D(gl, {data: url})
44
- if (typeof this.props?.data === 'string') {
45
- Object.assign(this.props, { data: loadImage(this.props.data) });
46
- }
47
- this.initialize(this.props);
48
- Object.seal(this);
49
- }
50
- destroy() {
51
- if (this.handle) {
52
- this.gl.deleteTexture(this.handle);
53
- this.removeStats();
54
- this.trackDeallocatedMemory('Texture');
55
- // this.handle = null;
56
- this.destroyed = true;
57
- }
5
+ import { withParameters } from "../../context/state-tracker/with-parameters.js";
6
+ import { getWebGLTextureFormat, getWebGLTextureParameters, getTextureFormatBytesPerPixel } from "../converters/texture-formats.js";
7
+ import { convertSamplerParametersToWebGL, updateSamplerParametersForNPOT } from "../converters/sampler-parameters.js";
8
+ import WEBGLBuffer from "./webgl-buffer.js";
9
+ import WEBGLSampler from "./webgl-sampler.js";
10
+ export default class WEBGLTexture extends Texture {
11
+ constructor(device, props) {
12
+ var _this$props;
13
+ super(device, {
14
+ format: GL.RGBA,
15
+ ...props
16
+ });
17
+ _defineProperty(this, "MAX_ATTRIBUTES", void 0);
18
+ _defineProperty(this, "device", void 0);
19
+ _defineProperty(this, "gl", void 0);
20
+ _defineProperty(this, "gl2", void 0);
21
+ _defineProperty(this, "handle", void 0);
22
+ _defineProperty(this, "data", void 0);
23
+ _defineProperty(this, "width", undefined);
24
+ _defineProperty(this, "height", undefined);
25
+ _defineProperty(this, "depth", undefined);
26
+ _defineProperty(this, "format", undefined);
27
+ _defineProperty(this, "type", undefined);
28
+ _defineProperty(this, "dataFormat", undefined);
29
+ _defineProperty(this, "mipmaps", undefined);
30
+ _defineProperty(this, "target", void 0);
31
+ _defineProperty(this, "textureUnit", undefined);
32
+ _defineProperty(this, "sampler", undefined);
33
+ _defineProperty(this, "loaded", false);
34
+ _defineProperty(this, "_video", void 0);
35
+ this.device = cast(device);
36
+ this.gl = this.device.gl;
37
+ this.gl2 = this.device.gl2;
38
+ this.handle = this.props.handle || this.gl.createTexture();
39
+ this.device.setSpectorMetadata(this.handle, {
40
+ ...this.props,
41
+ data: typeof this.props.data
42
+ });
43
+ this.target = getWebGLTextureTarget(this.props);
44
+ this.loaded = false;
45
+ if (typeof ((_this$props = this.props) === null || _this$props === void 0 ? void 0 : _this$props.data) === 'string') {
46
+ Object.assign(this.props, {
47
+ data: loadImage(this.props.data)
48
+ });
58
49
  }
59
- toString() {
60
- return `Texture(${this.id},${this.width}x${this.height})`;
50
+ this.initialize(this.props);
51
+ Object.seal(this);
52
+ }
53
+ destroy() {
54
+ if (this.handle) {
55
+ this.gl.deleteTexture(this.handle);
56
+ this.removeStats();
57
+ this.trackDeallocatedMemory('Texture');
58
+ this.destroyed = true;
61
59
  }
62
- // eslint-disable-next-line max-statements
63
- initialize(props = {}) {
64
- // Cube textures
65
- if (this.props.dimension === 'cube') {
66
- return this.initializeCube(props);
67
- }
68
- let data = props.data;
69
- if (data instanceof Promise) {
70
- data.then((resolvedImageData) => this.initialize(Object.assign({}, props, {
71
- pixels: resolvedImageData,
72
- data: resolvedImageData
73
- })));
74
- return this;
75
- }
76
- const isVideo = typeof HTMLVideoElement !== 'undefined' && data instanceof HTMLVideoElement;
77
- // @ts-expect-error
78
- if (isVideo && data.readyState < HTMLVideoElement.HAVE_METADATA) {
79
- this._video = null; // Declare member before the object is sealed
80
- // @ts-expect-error
81
- data.addEventListener('loadeddata', () => this.initialize(props));
82
- return this;
83
- }
84
- let { parameters = {} } = props;
85
- const { pixels = null, recreate = false, pixelStore = {}, textureUnit = undefined } = props;
86
- // pixels variable is for API compatibility purpose
87
- if (!data) {
88
- // TODO - This looks backwards? Commenting out for now until we decide
89
- // which prop to use
90
- // log.deprecated('data', 'pixels')();
91
- data = pixels;
92
- }
93
- let { width, height, dataFormat, type, compressed = false, mipmaps = true } = props;
94
- const { depth = 0 } = props;
95
- // Deduce width and height
96
- ({ width, height, compressed, dataFormat, type } = this._deduceParameters({
97
- format: props.format,
98
- type,
99
- dataFormat,
100
- compressed,
101
- data,
102
- width,
103
- height
104
- }));
105
- const format = getWebGLTextureFormat(this.gl, props.format);
106
- // Store opts for accessors
107
- this.width = width;
108
- this.height = height;
109
- this.depth = depth;
110
- this.format = format;
111
- this.type = type;
112
- this.dataFormat = dataFormat;
113
- this.textureUnit = textureUnit;
114
- if (Number.isFinite(this.textureUnit)) {
115
- this.gl.activeTexture(GL.TEXTURE0 + this.textureUnit);
116
- this.gl.bindTexture(this.target, this.handle);
117
- }
118
- if (mipmaps && this.device.isWebGL1 && isNPOT(this.width, this.height)) {
119
- log.warn(`texture: ${this} is Non-Power-Of-Two, disabling mipmaps`)();
120
- mipmaps = false;
121
- }
122
- this.mipmaps = mipmaps;
123
- this.setImageData({
124
- data,
125
- width,
126
- height,
127
- depth,
128
- format,
129
- type,
130
- dataFormat,
131
- // @ts-expect-error
132
- parameters: pixelStore,
133
- compressed
134
- });
135
- // Set texture sampler parameters
136
- this.setSampler(props.sampler);
137
- this._setSamplerParameters(parameters);
138
- if (mipmaps) {
139
- this.generateMipmap();
140
- }
141
- // TODO - Store data to enable auto recreate on context loss
142
- if (recreate) {
143
- this.data = data;
144
- }
145
- if (isVideo) {
146
- this._video = {
147
- video: data,
148
- parameters,
149
- // @ts-expect-error
150
- lastTime: data.readyState >= HTMLVideoElement.HAVE_CURRENT_DATA ? data.currentTime : -1
151
- };
152
- }
153
- return this;
154
- }
155
- initializeCube(props) {
156
- const { mipmaps = true, parameters = {} } = props;
157
- // Store props for accessors
158
- // this.props = props;
159
- // @ts-expect-error
160
- this.setCubeMapImageData(props).then(() => {
161
- this.loaded = true;
162
- // TODO - should genMipmap() be called on the cubemap or on the faces?
163
- // TODO - without generateMipmap() cube textures do not work at all!!! Why?
164
- if (mipmaps) {
165
- this.generateMipmap(props);
166
- }
167
- this.setSampler(props.sampler);
168
- this._setSamplerParameters(parameters);
169
- });
170
- return this;
171
- }
172
- setSampler(sampler = {}) {
173
- let samplerProps;
174
- if (sampler instanceof WEBGLSampler) {
175
- this.sampler = sampler;
176
- samplerProps = sampler.props;
177
- }
178
- else {
179
- this.sampler = new WEBGLSampler(this.device, sampler);
180
- samplerProps = sampler;
181
- }
182
- // TODO - technically, this is only needed in WebGL1. In WebGL2 we could always use the sampler.
183
- const parameters = convertSamplerParametersToWebGL(samplerProps);
184
- this._setSamplerParameters(parameters);
185
- return this;
186
- }
187
- /**
188
- * If size has changed, reinitializes with current format
189
- * @note note clears image and mipmaps
190
- */
191
- resize(options) {
192
- const { height, width, mipmaps = false } = options;
193
- if (width !== this.width || height !== this.height) {
194
- return this.initialize({
195
- width,
196
- height,
197
- format: this.format,
198
- type: this.type,
199
- dataFormat: this.dataFormat,
200
- mipmaps
201
- });
202
- }
203
- return this;
204
- }
205
- /** Update external texture (video frame) */
206
- update() {
207
- if (this._video) {
208
- const { video, parameters, lastTime } = this._video;
209
- // @ts-expect-error
210
- if (lastTime === video.currentTime || video.readyState < HTMLVideoElement.HAVE_CURRENT_DATA) {
211
- return;
212
- }
213
- this.setSubImageData({
214
- data: video,
215
- parameters
216
- });
217
- if (this.mipmaps) {
218
- this.generateMipmap();
219
- }
220
- this._video.lastTime = video.currentTime;
221
- }
60
+ }
61
+ toString() {
62
+ return "Texture(".concat(this.id, ",").concat(this.width, "x").concat(this.height, ")");
63
+ }
64
+ initialize() {
65
+ let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
66
+ if (this.props.dimension === 'cube') {
67
+ return this.initializeCube(props);
222
68
  }
223
- // Call to regenerate mipmaps after modifying texture(s)
224
- generateMipmap(params = {}) {
225
- if (this.device.isWebGL1 && isNPOT(this.width, this.height)) {
226
- log.warn(`texture: ${this} is Non-Power-Of-Two, disabling mipmaping`)();
227
- return this;
228
- }
229
- this.mipmaps = true;
230
- this.gl.bindTexture(this.target, this.handle);
231
- withParameters(this.gl, params, () => {
232
- this.gl.generateMipmap(this.target);
233
- });
234
- this.gl.bindTexture(this.target, null);
235
- return this;
236
- }
237
- /*
238
- * Allocates storage
239
- * @param {*} pixels -
240
- * null - create empty texture of specified format
241
- * Typed array - init from image data in typed array
242
- * Buffer|WebGLBuffer - (WEBGL2) init from image data in WebGLBuffer
243
- * HTMLImageElement|Image - Inits with content of image. Auto width/height
244
- * HTMLCanvasElement - Inits with contents of canvas. Auto width/height
245
- * HTMLVideoElement - Creates video texture. Auto width/height
246
- *
247
- * @param width -
248
- * @param height -
249
- * @param mipMapLevel -
250
- * @param {GLenum} format - format of image data.
251
- * @param {GLenum} type
252
- * - format of array (autodetect from type) or
253
- * - (WEBGL2) format of buffer
254
- * @param {Number} offset - (WEBGL2) offset from start of buffer
255
- * @parameters - temporary settings to be applied, can be used to supply pixel store settings.
256
- */
257
- // eslint-disable-next-line max-statements, complexity
258
- setImageData(options) {
259
- if (this.props.dimension === '3d') {
260
- return this.setImageData3D(options);
261
- }
262
- this.trackDeallocatedMemory('Texture');
263
- const { target = this.target, pixels = null, level = 0, format = this.format, offset = 0, parameters = {} } = options;
264
- let { data = null, type = this.type, width = this.width, height = this.height, dataFormat = this.dataFormat, compressed = false } = options;
265
- // pixels variable is for API compatibility purpose
266
- if (!data) {
267
- data = pixels;
268
- }
269
- ({ type, dataFormat, compressed, width, height } = this._deduceParameters({
270
- format: this.props.format,
271
- type,
272
- dataFormat,
273
- compressed,
274
- data,
275
- width,
276
- height
277
- }));
278
- const { gl } = this;
279
- gl.bindTexture(this.target, this.handle);
280
- let dataType = null;
281
- ({ data, dataType } = this._getDataType({ data, compressed }));
282
- let gl2;
283
- withParameters(this.gl, parameters, () => {
284
- switch (dataType) {
285
- case 'null':
286
- gl.texImage2D(target, level, format, width, height, 0 /*border*/, dataFormat, type, data);
287
- break;
288
- case 'typed-array':
289
- // Looks like this assert is not necessary, as offset is ignored under WebGL1
290
- // assert((offset === 0 || this.device.isWebGL2), 'offset supported in WebGL2 only');
291
- gl.texImage2D(target, level, format, width, height, 0, // border (must be 0)
292
- dataFormat, type, data,
293
- // @ts-expect-error
294
- offset);
295
- break;
296
- case 'buffer':
297
- // WebGL2 enables creating textures directly from a WebGL buffer
298
- gl2 = this.device.assertWebGL2();
299
- gl2.bindBuffer(GL.PIXEL_UNPACK_BUFFER, data.handle || data);
300
- gl2.texImage2D(target, level, format, width, height, 0 /*border*/, dataFormat, type, offset);
301
- gl2.bindBuffer(GL.PIXEL_UNPACK_BUFFER, null);
302
- break;
303
- case 'browser-object':
304
- if (this.device.isWebGL2) {
305
- gl.texImage2D(target, level, format, width, height, 0 /*border*/, dataFormat, type, data);
306
- }
307
- else {
308
- gl.texImage2D(target, level, format, dataFormat, type, data);
309
- }
310
- break;
311
- case 'compressed':
312
- for (const [levelIndex, levelData] of data.entries()) {
313
- gl.compressedTexImage2D(target, levelIndex, levelData.format, levelData.width, levelData.height, 0 /* border, must be 0 */, levelData.data);
314
- }
315
- break;
316
- default:
317
- assert(false, 'Unknown image data type');
318
- }
319
- });
320
- if (data && data.byteLength) {
321
- this.trackAllocatedMemory(data.byteLength, 'Texture');
322
- }
323
- else {
324
- const bytesPerPixel = getTextureFormatBytesPerPixel(this.gl, this.props.format);
325
- this.trackAllocatedMemory(this.width * this.height * bytesPerPixel, 'Texture');
326
- }
327
- this.loaded = true;
328
- return this;
329
- }
330
- /**
331
- * Redefines an area of an existing texture
332
- * Note: does not allocate storage
333
- * Redefines an area of an existing texture
334
- */
335
- setSubImageData({ target = this.target, pixels = null, data = null, x = 0, y = 0, width = this.width, height = this.height, level = 0, format = this.format, type = this.type, dataFormat = this.dataFormat, compressed = false, offset = 0, parameters = {} }) {
336
- ({ type, dataFormat, compressed, width, height } = this._deduceParameters({
337
- format: this.props.format,
338
- type,
339
- dataFormat,
340
- compressed,
341
- data,
342
- width,
343
- height
344
- }));
345
- assert(this.depth === 1, 'texSubImage not supported for 3D textures');
346
- // pixels variable is for API compatibility purpose
347
- if (!data) {
348
- data = pixels;
349
- }
350
- // Support ndarrays
351
- if (data && data.data) {
352
- const ndarray = data;
353
- data = ndarray.data;
354
- width = ndarray.shape[0];
355
- height = ndarray.shape[1];
356
- }
357
- // Support buffers
358
- if (data instanceof WEBGLBuffer) {
359
- data = data.handle;
360
- }
361
- this.gl.bindTexture(this.target, this.handle);
362
- withParameters(this.gl, parameters, () => {
363
- // TODO - x,y parameters
364
- if (compressed) {
365
- this.gl.compressedTexSubImage2D(target, level, x, y, width, height, format, data);
366
- }
367
- else if (data === null) {
368
- this.gl.texSubImage2D(target, level, x, y, width, height, dataFormat, type, null);
369
- }
370
- else if (ArrayBuffer.isView(data)) {
371
- // const gl2 = this.device.assertWebGL2();
372
- // @ts-expect-error last offset parameter is ignored under WebGL1
373
- this.gl.texSubImage2D(target, level, x, y, width, height, dataFormat, type, data, offset);
374
- }
375
- else if (typeof WebGLBuffer !== 'undefined' && data instanceof WebGLBuffer) {
376
- // WebGL2 allows us to create texture directly from a WebGL buffer
377
- const gl2 = this.device.assertWebGL2();
378
- // This texImage2D signature uses currently bound GL.PIXEL_UNPACK_BUFFER
379
- gl2.bindBuffer(GL.PIXEL_UNPACK_BUFFER, data);
380
- gl2.texSubImage2D(target, level, x, y, width, height, dataFormat, type, offset);
381
- gl2.bindBuffer(GL.PIXEL_UNPACK_BUFFER, null);
382
- }
383
- else if (this.device.isWebGL2) {
384
- // Assume data is a browser supported object (ImageData, Canvas, ...)
385
- const gl2 = this.device.assertWebGL2();
386
- gl2.texSubImage2D(target, level, x, y, width, height, dataFormat, type, data);
387
- }
388
- else {
389
- this.gl.texSubImage2D(target, level, x, y, dataFormat, type, data);
390
- }
391
- });
392
- this.gl.bindTexture(this.target, null);
393
- }
394
- /**
395
- * Defines a two-dimensional texture image or cube-map texture image with
396
- * pixels from the current framebuffer (rather than from client memory).
397
- * (gl.copyTexImage2D wrapper)
398
- *
399
- * Note that binding a texture into a Framebuffer's color buffer and
400
- * rendering can be faster.
401
- */
402
- copyFramebuffer(opts = {}) {
403
- log.error('Texture.copyFramebuffer({...}) is no logner supported, use copyToTexture(source, target, opts})')();
404
- return null;
405
- }
406
- getActiveUnit() {
407
- return this.gl.getParameter(GL.ACTIVE_TEXTURE) - GL.TEXTURE0;
408
- }
409
- bind(textureUnit = this.textureUnit) {
410
- const { gl } = this;
411
- if (textureUnit !== undefined) {
412
- this.textureUnit = textureUnit;
413
- gl.activeTexture(gl.TEXTURE0 + textureUnit);
414
- }
415
- gl.bindTexture(this.target, this.handle);
416
- return textureUnit;
417
- }
418
- unbind(textureUnit = this.textureUnit) {
419
- const { gl } = this;
420
- if (textureUnit !== undefined) {
421
- this.textureUnit = textureUnit;
422
- gl.activeTexture(gl.TEXTURE0 + textureUnit);
423
- }
424
- gl.bindTexture(this.target, null);
425
- return textureUnit;
69
+ let data = props.data;
70
+ if (data instanceof Promise) {
71
+ data.then(resolvedImageData => this.initialize(Object.assign({}, props, {
72
+ pixels: resolvedImageData,
73
+ data: resolvedImageData
74
+ })));
75
+ return this;
426
76
  }
427
- // PRIVATE METHODS
428
- _getDataType({ data, compressed = false }) {
429
- if (compressed) {
430
- return { data, dataType: 'compressed' };
431
- }
432
- if (data === null) {
433
- return { data, dataType: 'null' };
434
- }
435
- if (ArrayBuffer.isView(data)) {
436
- return { data, dataType: 'typed-array' };
437
- }
438
- if (data instanceof WEBGLBuffer) {
439
- return { data: data.handle, dataType: 'buffer' };
440
- }
441
- // Raw WebGL handle (not a luma wrapper)
442
- if (typeof WebGLBuffer !== 'undefined' && data instanceof WebGLBuffer) {
443
- return { data, dataType: 'buffer' };
444
- }
445
- // Assume data is a browser supported object (ImageData, Canvas, ...)
446
- return { data, dataType: 'browser-object' };
447
- }
448
- // HELPER METHODS
449
- _deduceParameters(opts) {
450
- const { format, data } = opts;
451
- let { width, height, dataFormat, type, compressed } = opts;
452
- // Deduce format and type from format
453
- const parameters = getWebGLTextureParameters(this.gl, format);
454
- dataFormat = dataFormat || parameters.dataFormat;
455
- type = type || parameters.type;
456
- compressed = compressed || parameters.compressed;
457
- ({ width, height } = this._deduceImageSize(data, width, height));
458
- return { dataFormat, type, compressed, width, height, format, data };
459
- }
460
- // eslint-disable-next-line complexity
461
- _deduceImageSize(data, width, height) {
462
- let size;
463
- if (typeof ImageData !== 'undefined' && data instanceof ImageData) {
464
- size = { width: data.width, height: data.height };
465
- }
466
- else if (typeof HTMLImageElement !== 'undefined' && data instanceof HTMLImageElement) {
467
- size = { width: data.naturalWidth, height: data.naturalHeight };
468
- }
469
- else if (typeof HTMLCanvasElement !== 'undefined' && data instanceof HTMLCanvasElement) {
470
- size = { width: data.width, height: data.height };
471
- }
472
- else if (typeof ImageBitmap !== 'undefined' && data instanceof ImageBitmap) {
473
- size = { width: data.width, height: data.height };
474
- }
475
- else if (typeof HTMLVideoElement !== 'undefined' && data instanceof HTMLVideoElement) {
476
- size = { width: data.videoWidth, height: data.videoHeight };
477
- }
478
- else if (!data) {
479
- size = { width: width >= 0 ? width : 1, height: height >= 0 ? height : 1 };
480
- }
481
- else {
482
- size = { width, height };
483
- }
484
- assert(size, 'Could not deduced texture size');
485
- assert(width === undefined || size.width === width, 'Deduced texture width does not match supplied width');
486
- assert(height === undefined || size.height === height, 'Deduced texture height does not match supplied height');
487
- return size;
488
- }
489
- // CUBE MAP METHODS
490
- /* eslint-disable max-statements, max-len */
491
- async setCubeMapImageData(options) {
492
- const { gl } = this;
493
- const { width, height, pixels, data, format = GL.RGBA, type = GL.UNSIGNED_BYTE } = options;
494
- const imageDataMap = pixels || data;
495
- // pixel data (imageDataMap) is an Object from Face to Image or Promise.
496
- // For example:
497
- // {
498
- // GL.TEXTURE_CUBE_MAP_POSITIVE_X : Image-or-Promise,
499
- // GL.TEXTURE_CUBE_MAP_NEGATIVE_X : Image-or-Promise,
500
- // ... }
501
- // To provide multiple level-of-details (LODs) this can be Face to Array
502
- // of Image or Promise, like this
503
- // {
504
- // GL.TEXTURE_CUBE_MAP_POSITIVE_X : [Image-or-Promise-LOD-0, Image-or-Promise-LOD-1],
505
- // GL.TEXTURE_CUBE_MAP_NEGATIVE_X : [Image-or-Promise-LOD-0, Image-or-Promise-LOD-1],
506
- // ... }
507
- const resolvedFaces = await Promise.all(WEBGLTexture.FACES.map((face) => {
508
- const facePixels = imageDataMap[face];
509
- return Promise.all(Array.isArray(facePixels) ? facePixels : [facePixels]);
510
- }));
511
- this.bind();
512
- WEBGLTexture.FACES.forEach((face, index) => {
513
- if (resolvedFaces[index].length > 1 && this.props.mipmaps !== false) {
514
- // If the user provides multiple LODs, then automatic mipmap
515
- // generation generateMipmap() should be disabled to avoid overwritting them.
516
- log.warn(`${this.id} has mipmap and multiple LODs.`)();
517
- }
518
- resolvedFaces[index].forEach((image, lodLevel) => {
519
- // TODO: adjust width & height for LOD!
520
- if (width && height) {
521
- gl.texImage2D(face, lodLevel, format, width, height, 0 /*border*/, format, type, image);
522
- }
523
- else {
524
- gl.texImage2D(face, lodLevel, format, format, type, image);
525
- }
526
- });
527
- });
528
- this.unbind();
529
- }
530
- /** @todo update this method to accept LODs */
531
- setImageDataForFace(options) {
532
- const { face, width, height, pixels, data, format = GL.RGBA, type = GL.UNSIGNED_BYTE
533
- // generateMipmap = false // TODO
534
- } = options;
535
- const { gl } = this;
536
- const imageData = pixels || data;
537
- this.bind();
538
- if (imageData instanceof Promise) {
539
- imageData.then((resolvedImageData) => this.setImageDataForFace(Object.assign({}, options, {
540
- face,
541
- data: resolvedImageData,
542
- pixels: resolvedImageData
543
- })));
544
- }
545
- else if (this.width || this.height) {
546
- gl.texImage2D(face, 0, format, width, height, 0 /*border*/, format, type, imageData);
547
- }
548
- else {
549
- gl.texImage2D(face, 0, format, format, type, imageData);
550
- }
551
- return this;
552
- }
553
- /** Image 3D copies from Typed Array or WebGLBuffer */
554
- setImageData3D(options) {
555
- const { level = 0, dataFormat, format, type, // = GL.UNSIGNED_BYTE,
556
- width, height, depth = 1, offset = 0, data, parameters = {} } = options;
557
- this.trackDeallocatedMemory('Texture');
558
- this.gl.bindTexture(this.target, this.handle);
559
- const webglTextureFormat = getWebGLTextureParameters(this.gl, format);
560
- withParameters(this.gl, parameters, () => {
561
- if (ArrayBuffer.isView(data)) {
562
- // @ts-expect-error
563
- this.gl.texImage3D(this.target, level, webglTextureFormat.format, width, height, depth, 0 /* border, must be 0 */, webglTextureFormat.dataFormat, webglTextureFormat.type, // dataType: getWebGL,
564
- data);
565
- }
566
- if (data instanceof WEBGLBuffer) {
567
- this.gl.bindBuffer(GL.PIXEL_UNPACK_BUFFER, data.handle);
568
- // @ts-expect-error
569
- this.gl.texImage3D(this.target, level, dataFormat, width, height, depth, 0 /* border, must be 0 */, format, type, offset);
570
- }
571
- });
572
- if (data && data.byteLength) {
573
- this.trackAllocatedMemory(data.byteLength, 'Texture');
574
- }
575
- else {
576
- const bytesPerPixel = getTextureFormatBytesPerPixel(this.gl, this.props.format);
577
- this.trackAllocatedMemory(this.width * this.height * this.depth * bytesPerPixel, 'Texture');
578
- }
579
- this.loaded = true;
580
- return this;
581
- }
582
- // RESOURCE METHODS
583
- /**
584
- * Sets sampler parameters on texture
585
- * @note: Applies NPOT workaround if appropriate
586
- */
587
- _setSamplerParameters(parameters) {
588
- // Work around WebGL1 sampling restrictions on NPOT textures
589
- if (this.device.isWebGL1 && isNPOT(this.width, this.height)) {
590
- parameters = updateSamplerParametersForNPOT(parameters);
591
- }
592
- // NPOT parameters may populate an empty object
593
- if (isObjectEmpty(parameters)) {
594
- return;
595
- }
596
- logParameters(parameters);
597
- this.gl.bindTexture(this.target, this.handle);
598
- for (const [pname, pvalue] of Object.entries(parameters)) {
599
- const param = Number(pname);
600
- let value = pvalue;
601
- // Apparently there are integer/float conversion issues requires two parameter setting functions in JavaScript.
602
- // For now, pick the float version for parameters specified as GLfloat.
603
- switch (param) {
604
- case GL.TEXTURE_MIN_LOD:
605
- case GL.TEXTURE_MAX_LOD:
606
- this.gl.texParameterf(this.target, param, value);
607
- break;
608
- default:
609
- this.gl.texParameteri(this.target, param, value);
610
- break;
611
- }
612
- }
613
- this.gl.bindTexture(this.target, null);
77
+ const isVideo = typeof HTMLVideoElement !== 'undefined' && data instanceof HTMLVideoElement;
78
+ if (isVideo && data.readyState < HTMLVideoElement.HAVE_METADATA) {
79
+ this._video = null;
80
+ data.addEventListener('loadeddata', () => this.initialize(props));
81
+ return this;
82
+ }
83
+ const {
84
+ parameters = {}
85
+ } = props;
86
+ const {
87
+ pixels = null,
88
+ recreate = false,
89
+ pixelStore = {},
90
+ textureUnit = undefined
91
+ } = props;
92
+ if (!data) {
93
+ data = pixels;
94
+ }
95
+ let {
96
+ width,
97
+ height,
98
+ dataFormat,
99
+ type,
100
+ compressed = false,
101
+ mipmaps = true
102
+ } = props;
103
+ const {
104
+ depth = 0
105
+ } = props;
106
+ ({
107
+ width,
108
+ height,
109
+ compressed,
110
+ dataFormat,
111
+ type
112
+ } = this._deduceParameters({
113
+ format: props.format,
114
+ type,
115
+ dataFormat,
116
+ compressed,
117
+ data,
118
+ width,
119
+ height
120
+ }));
121
+ const format = getWebGLTextureFormat(this.gl, props.format);
122
+ this.width = width;
123
+ this.height = height;
124
+ this.depth = depth;
125
+ this.format = format;
126
+ this.type = type;
127
+ this.dataFormat = dataFormat;
128
+ this.textureUnit = textureUnit;
129
+ if (Number.isFinite(this.textureUnit)) {
130
+ this.gl.activeTexture(GL.TEXTURE0 + this.textureUnit);
131
+ this.gl.bindTexture(this.target, this.handle);
132
+ }
133
+ if (mipmaps && this.device.isWebGL1 && isNPOT(this.width, this.height)) {
134
+ log.warn("texture: ".concat(this, " is Non-Power-Of-Two, disabling mipmaps"))();
135
+ mipmaps = false;
136
+ }
137
+ this.mipmaps = mipmaps;
138
+ this.setImageData({
139
+ data,
140
+ width,
141
+ height,
142
+ depth,
143
+ format,
144
+ type,
145
+ dataFormat,
146
+ parameters: pixelStore,
147
+ compressed
148
+ });
149
+ this.setSampler(props.sampler);
150
+ this._setSamplerParameters(parameters);
151
+ if (mipmaps) {
152
+ this.generateMipmap();
153
+ }
154
+ if (recreate) {
155
+ this.data = data;
156
+ }
157
+ if (isVideo) {
158
+ this._video = {
159
+ video: data,
160
+ parameters,
161
+ lastTime: data.readyState >= HTMLVideoElement.HAVE_CURRENT_DATA ? data.currentTime : -1
162
+ };
163
+ }
164
+ return this;
165
+ }
166
+ initializeCube(props) {
167
+ const {
168
+ mipmaps = true,
169
+ parameters = {}
170
+ } = props;
171
+ this.setCubeMapImageData(props).then(() => {
172
+ this.loaded = true;
173
+ if (mipmaps) {
174
+ this.generateMipmap(props);
175
+ }
176
+ this.setSampler(props.sampler);
177
+ this._setSamplerParameters(parameters);
178
+ });
179
+ return this;
180
+ }
181
+ setSampler() {
182
+ let sampler = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
183
+ let samplerProps;
184
+ if (sampler instanceof WEBGLSampler) {
185
+ this.sampler = sampler;
186
+ samplerProps = sampler.props;
187
+ } else {
188
+ this.sampler = new WEBGLSampler(this.device, sampler);
189
+ samplerProps = sampler;
190
+ }
191
+ const parameters = convertSamplerParametersToWebGL(samplerProps);
192
+ this._setSamplerParameters(parameters);
193
+ return this;
194
+ }
195
+ resize(options) {
196
+ const {
197
+ height,
198
+ width,
199
+ mipmaps = false
200
+ } = options;
201
+ if (width !== this.width || height !== this.height) {
202
+ return this.initialize({
203
+ width,
204
+ height,
205
+ format: this.format,
206
+ type: this.type,
207
+ dataFormat: this.dataFormat,
208
+ mipmaps
209
+ });
210
+ }
211
+ return this;
212
+ }
213
+ update() {
214
+ if (this._video) {
215
+ const {
216
+ video,
217
+ parameters,
218
+ lastTime
219
+ } = this._video;
220
+ if (lastTime === video.currentTime || video.readyState < HTMLVideoElement.HAVE_CURRENT_DATA) {
614
221
  return;
222
+ }
223
+ this.setSubImageData({
224
+ data: video,
225
+ parameters
226
+ });
227
+ if (this.mipmaps) {
228
+ this.generateMipmap();
229
+ }
230
+ this._video.lastTime = video.currentTime;
615
231
  }
616
- /** @deprecated For LegacyTexture subclass */
617
- _getWebGL1NPOTParameterOverride(pname, value) {
618
- // NOTE: Apply NPOT workaround
619
- const npot = this.device.isWebGL1 && isNPOT(this.width, this.height);
620
- if (npot) {
621
- switch (pname) {
622
- case GL.TEXTURE_MIN_FILTER:
623
- if (value !== GL.LINEAR && value !== GL.NEAREST) {
624
- // log.warn(`texture: ${this} is Non-Power-Of-Two, forcing TEXTURE_MIN_FILTER to LINEAR`)();
625
- return GL.LINEAR;
626
- }
627
- break;
628
- case GL.TEXTURE_WRAP_S:
629
- case GL.TEXTURE_WRAP_T:
630
- // if (value !== GL.CLAMP_TO_EDGE) { log.warn(`texture: ${this} is Non-Power-Of-Two, ${getKey(this.gl, pname)} to CLAMP_TO_EDGE`)(); }
631
- return GL.CLAMP_TO_EDGE;
632
- default:
633
- break;
634
- }
635
- }
636
- return value;
232
+ }
233
+ generateMipmap() {
234
+ let params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
235
+ if (this.device.isWebGL1 && isNPOT(this.width, this.height)) {
236
+ log.warn("texture: ".concat(this, " is Non-Power-Of-Two, disabling mipmaping"))();
237
+ return this;
637
238
  }
638
- }
639
- // TODO - remove?
640
- WEBGLTexture.FACES = [
641
- GL.TEXTURE_CUBE_MAP_POSITIVE_X,
642
- GL.TEXTURE_CUBE_MAP_NEGATIVE_X,
643
- GL.TEXTURE_CUBE_MAP_POSITIVE_Y,
644
- GL.TEXTURE_CUBE_MAP_NEGATIVE_Y,
645
- GL.TEXTURE_CUBE_MAP_POSITIVE_Z,
646
- GL.TEXTURE_CUBE_MAP_NEGATIVE_Z
647
- ];
648
- export default WEBGLTexture;
649
- // HELPERS
650
- function getWebGLTextureTarget(props) {
651
- switch (props.dimension) {
652
- // supported in WebGL
653
- case '2d':
654
- return GL.TEXTURE_2D;
655
- case 'cube':
656
- return GL.TEXTURE_CUBE_MAP;
657
- // supported in WebGL2
658
- case '2d-array':
659
- return GL.TEXTURE_2D_ARRAY;
660
- case '3d':
661
- return GL.TEXTURE_3D;
662
- // not supported in any WebGL version
663
- case '1d':
664
- case 'cube-array':
239
+ this.mipmaps = true;
240
+ this.gl.bindTexture(this.target, this.handle);
241
+ withParameters(this.gl, params, () => {
242
+ this.gl.generateMipmap(this.target);
243
+ });
244
+ this.gl.bindTexture(this.target, null);
245
+ return this;
246
+ }
247
+ setImageData(options) {
248
+ if (this.props.dimension === '3d') {
249
+ return this.setImageData3D(options);
250
+ }
251
+ this.trackDeallocatedMemory('Texture');
252
+ const {
253
+ target = this.target,
254
+ pixels = null,
255
+ level = 0,
256
+ format = this.format,
257
+ offset = 0,
258
+ parameters = {}
259
+ } = options;
260
+ let {
261
+ data = null,
262
+ type = this.type,
263
+ width = this.width,
264
+ height = this.height,
265
+ dataFormat = this.dataFormat,
266
+ compressed = false
267
+ } = options;
268
+ if (!data) {
269
+ data = pixels;
270
+ }
271
+ ({
272
+ type,
273
+ dataFormat,
274
+ compressed,
275
+ width,
276
+ height
277
+ } = this._deduceParameters({
278
+ format: this.props.format,
279
+ type,
280
+ dataFormat,
281
+ compressed,
282
+ data,
283
+ width,
284
+ height
285
+ }));
286
+ const {
287
+ gl
288
+ } = this;
289
+ gl.bindTexture(this.target, this.handle);
290
+ let dataType = null;
291
+ ({
292
+ data,
293
+ dataType
294
+ } = this._getDataType({
295
+ data,
296
+ compressed
297
+ }));
298
+ let gl2;
299
+ withParameters(this.gl, parameters, () => {
300
+ switch (dataType) {
301
+ case 'null':
302
+ gl.texImage2D(target, level, format, width, height, 0, dataFormat, type, data);
303
+ break;
304
+ case 'typed-array':
305
+ gl.texImage2D(target, level, format, width, height, 0, dataFormat, type, data, offset);
306
+ break;
307
+ case 'buffer':
308
+ gl2 = this.device.assertWebGL2();
309
+ gl2.bindBuffer(GL.PIXEL_UNPACK_BUFFER, data.handle || data);
310
+ gl2.texImage2D(target, level, format, width, height, 0, dataFormat, type, offset);
311
+ gl2.bindBuffer(GL.PIXEL_UNPACK_BUFFER, null);
312
+ break;
313
+ case 'browser-object':
314
+ if (this.device.isWebGL2) {
315
+ gl.texImage2D(target, level, format, width, height, 0, dataFormat, type, data);
316
+ } else {
317
+ gl.texImage2D(target, level, format, dataFormat, type, data);
318
+ }
319
+ break;
320
+ case 'compressed':
321
+ for (const [levelIndex, levelData] of data.entries()) {
322
+ gl.compressedTexImage2D(target, levelIndex, levelData.format, levelData.width, levelData.height, 0, levelData.data);
323
+ }
324
+ break;
325
+ default:
326
+ assert(false, 'Unknown image data type');
327
+ }
328
+ });
329
+ if (data && data.byteLength) {
330
+ this.trackAllocatedMemory(data.byteLength, 'Texture');
331
+ } else {
332
+ const bytesPerPixel = getTextureFormatBytesPerPixel(this.gl, this.props.format);
333
+ this.trackAllocatedMemory(this.width * this.height * bytesPerPixel, 'Texture');
334
+ }
335
+ this.loaded = true;
336
+ return this;
337
+ }
338
+ setSubImageData(_ref) {
339
+ let {
340
+ target = this.target,
341
+ pixels = null,
342
+ data = null,
343
+ x = 0,
344
+ y = 0,
345
+ width = this.width,
346
+ height = this.height,
347
+ level = 0,
348
+ format = this.format,
349
+ type = this.type,
350
+ dataFormat = this.dataFormat,
351
+ compressed = false,
352
+ offset = 0,
353
+ parameters = {}
354
+ } = _ref;
355
+ ({
356
+ type,
357
+ dataFormat,
358
+ compressed,
359
+ width,
360
+ height
361
+ } = this._deduceParameters({
362
+ format: this.props.format,
363
+ type,
364
+ dataFormat,
365
+ compressed,
366
+ data,
367
+ width,
368
+ height
369
+ }));
370
+ assert(this.depth === 1, 'texSubImage not supported for 3D textures');
371
+ if (!data) {
372
+ data = pixels;
373
+ }
374
+ if (data && data.data) {
375
+ const ndarray = data;
376
+ data = ndarray.data;
377
+ width = ndarray.shape[0];
378
+ height = ndarray.shape[1];
379
+ }
380
+ if (data instanceof WEBGLBuffer) {
381
+ data = data.handle;
382
+ }
383
+ this.gl.bindTexture(this.target, this.handle);
384
+ withParameters(this.gl, parameters, () => {
385
+ if (compressed) {
386
+ this.gl.compressedTexSubImage2D(target, level, x, y, width, height, format, data);
387
+ } else if (data === null) {
388
+ this.gl.texSubImage2D(target, level, x, y, width, height, dataFormat, type, null);
389
+ } else if (ArrayBuffer.isView(data)) {
390
+ this.gl.texSubImage2D(target, level, x, y, width, height, dataFormat, type, data, offset);
391
+ } else if (typeof WebGLBuffer !== 'undefined' && data instanceof WebGLBuffer) {
392
+ const gl2 = this.device.assertWebGL2();
393
+ gl2.bindBuffer(GL.PIXEL_UNPACK_BUFFER, data);
394
+ gl2.texSubImage2D(target, level, x, y, width, height, dataFormat, type, offset);
395
+ gl2.bindBuffer(GL.PIXEL_UNPACK_BUFFER, null);
396
+ } else if (this.device.isWebGL2) {
397
+ const gl2 = this.device.assertWebGL2();
398
+ gl2.texSubImage2D(target, level, x, y, width, height, dataFormat, type, data);
399
+ } else {
400
+ this.gl.texSubImage2D(target, level, x, y, dataFormat, type, data);
401
+ }
402
+ });
403
+ this.gl.bindTexture(this.target, null);
404
+ }
405
+ copyFramebuffer() {
406
+ let opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
407
+ log.error('Texture.copyFramebuffer({...}) is no logner supported, use copyToTexture(source, target, opts})')();
408
+ return null;
409
+ }
410
+ getActiveUnit() {
411
+ return this.gl.getParameter(GL.ACTIVE_TEXTURE) - GL.TEXTURE0;
412
+ }
413
+ bind() {
414
+ let textureUnit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.textureUnit;
415
+ const {
416
+ gl
417
+ } = this;
418
+ if (textureUnit !== undefined) {
419
+ this.textureUnit = textureUnit;
420
+ gl.activeTexture(gl.TEXTURE0 + textureUnit);
421
+ }
422
+ gl.bindTexture(this.target, this.handle);
423
+ return textureUnit;
424
+ }
425
+ unbind() {
426
+ let textureUnit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.textureUnit;
427
+ const {
428
+ gl
429
+ } = this;
430
+ if (textureUnit !== undefined) {
431
+ this.textureUnit = textureUnit;
432
+ gl.activeTexture(gl.TEXTURE0 + textureUnit);
433
+ }
434
+ gl.bindTexture(this.target, null);
435
+ return textureUnit;
436
+ }
437
+ _getDataType(_ref2) {
438
+ let {
439
+ data,
440
+ compressed = false
441
+ } = _ref2;
442
+ if (compressed) {
443
+ return {
444
+ data,
445
+ dataType: 'compressed'
446
+ };
447
+ }
448
+ if (data === null) {
449
+ return {
450
+ data,
451
+ dataType: 'null'
452
+ };
453
+ }
454
+ if (ArrayBuffer.isView(data)) {
455
+ return {
456
+ data,
457
+ dataType: 'typed-array'
458
+ };
459
+ }
460
+ if (data instanceof WEBGLBuffer) {
461
+ return {
462
+ data: data.handle,
463
+ dataType: 'buffer'
464
+ };
465
+ }
466
+ if (typeof WebGLBuffer !== 'undefined' && data instanceof WebGLBuffer) {
467
+ return {
468
+ data,
469
+ dataType: 'buffer'
470
+ };
471
+ }
472
+ return {
473
+ data,
474
+ dataType: 'browser-object'
475
+ };
476
+ }
477
+ _deduceParameters(opts) {
478
+ const {
479
+ format,
480
+ data
481
+ } = opts;
482
+ let {
483
+ width,
484
+ height,
485
+ dataFormat,
486
+ type,
487
+ compressed
488
+ } = opts;
489
+ const parameters = getWebGLTextureParameters(this.gl, format);
490
+ dataFormat = dataFormat || parameters.dataFormat;
491
+ type = type || parameters.type;
492
+ compressed = compressed || parameters.compressed;
493
+ ({
494
+ width,
495
+ height
496
+ } = this._deduceImageSize(data, width, height));
497
+ return {
498
+ dataFormat,
499
+ type,
500
+ compressed,
501
+ width,
502
+ height,
503
+ format,
504
+ data
505
+ };
506
+ }
507
+ _deduceImageSize(data, width, height) {
508
+ let size;
509
+ if (typeof ImageData !== 'undefined' && data instanceof ImageData) {
510
+ size = {
511
+ width: data.width,
512
+ height: data.height
513
+ };
514
+ } else if (typeof HTMLImageElement !== 'undefined' && data instanceof HTMLImageElement) {
515
+ size = {
516
+ width: data.naturalWidth,
517
+ height: data.naturalHeight
518
+ };
519
+ } else if (typeof HTMLCanvasElement !== 'undefined' && data instanceof HTMLCanvasElement) {
520
+ size = {
521
+ width: data.width,
522
+ height: data.height
523
+ };
524
+ } else if (typeof ImageBitmap !== 'undefined' && data instanceof ImageBitmap) {
525
+ size = {
526
+ width: data.width,
527
+ height: data.height
528
+ };
529
+ } else if (typeof HTMLVideoElement !== 'undefined' && data instanceof HTMLVideoElement) {
530
+ size = {
531
+ width: data.videoWidth,
532
+ height: data.videoHeight
533
+ };
534
+ } else if (!data) {
535
+ size = {
536
+ width: width >= 0 ? width : 1,
537
+ height: height >= 0 ? height : 1
538
+ };
539
+ } else {
540
+ size = {
541
+ width,
542
+ height
543
+ };
544
+ }
545
+ assert(size, 'Could not deduced texture size');
546
+ assert(width === undefined || size.width === width, 'Deduced texture width does not match supplied width');
547
+ assert(height === undefined || size.height === height, 'Deduced texture height does not match supplied height');
548
+ return size;
549
+ }
550
+ async setCubeMapImageData(options) {
551
+ const {
552
+ gl
553
+ } = this;
554
+ const {
555
+ width,
556
+ height,
557
+ pixels,
558
+ data,
559
+ format = GL.RGBA,
560
+ type = GL.UNSIGNED_BYTE
561
+ } = options;
562
+ const imageDataMap = pixels || data;
563
+ const resolvedFaces = await Promise.all(WEBGLTexture.FACES.map(face => {
564
+ const facePixels = imageDataMap[face];
565
+ return Promise.all(Array.isArray(facePixels) ? facePixels : [facePixels]);
566
+ }));
567
+ this.bind();
568
+ WEBGLTexture.FACES.forEach((face, index) => {
569
+ if (resolvedFaces[index].length > 1 && this.props.mipmaps !== false) {
570
+ log.warn("".concat(this.id, " has mipmap and multiple LODs."))();
571
+ }
572
+ resolvedFaces[index].forEach((image, lodLevel) => {
573
+ if (width && height) {
574
+ gl.texImage2D(face, lodLevel, format, width, height, 0, format, type, image);
575
+ } else {
576
+ gl.texImage2D(face, lodLevel, format, format, type, image);
577
+ }
578
+ });
579
+ });
580
+ this.unbind();
581
+ }
582
+ setImageDataForFace(options) {
583
+ const {
584
+ face,
585
+ width,
586
+ height,
587
+ pixels,
588
+ data,
589
+ format = GL.RGBA,
590
+ type = GL.UNSIGNED_BYTE
591
+ } = options;
592
+ const {
593
+ gl
594
+ } = this;
595
+ const imageData = pixels || data;
596
+ this.bind();
597
+ if (imageData instanceof Promise) {
598
+ imageData.then(resolvedImageData => this.setImageDataForFace(Object.assign({}, options, {
599
+ face,
600
+ data: resolvedImageData,
601
+ pixels: resolvedImageData
602
+ })));
603
+ } else if (this.width || this.height) {
604
+ gl.texImage2D(face, 0, format, width, height, 0, format, type, imageData);
605
+ } else {
606
+ gl.texImage2D(face, 0, format, format, type, imageData);
607
+ }
608
+ return this;
609
+ }
610
+ setImageData3D(options) {
611
+ const {
612
+ level = 0,
613
+ dataFormat,
614
+ format,
615
+ type,
616
+ width,
617
+ height,
618
+ depth = 1,
619
+ offset = 0,
620
+ data,
621
+ parameters = {}
622
+ } = options;
623
+ this.trackDeallocatedMemory('Texture');
624
+ this.gl.bindTexture(this.target, this.handle);
625
+ const webglTextureFormat = getWebGLTextureParameters(this.gl, format);
626
+ withParameters(this.gl, parameters, () => {
627
+ if (ArrayBuffer.isView(data)) {
628
+ this.gl.texImage3D(this.target, level, webglTextureFormat.format, width, height, depth, 0, webglTextureFormat.dataFormat, webglTextureFormat.type, data);
629
+ }
630
+ if (data instanceof WEBGLBuffer) {
631
+ this.gl.bindBuffer(GL.PIXEL_UNPACK_BUFFER, data.handle);
632
+ this.gl.texImage3D(this.target, level, dataFormat, width, height, depth, 0, format, type, offset);
633
+ }
634
+ });
635
+ if (data && data.byteLength) {
636
+ this.trackAllocatedMemory(data.byteLength, 'Texture');
637
+ } else {
638
+ const bytesPerPixel = getTextureFormatBytesPerPixel(this.gl, this.props.format);
639
+ this.trackAllocatedMemory(this.width * this.height * this.depth * bytesPerPixel, 'Texture');
640
+ }
641
+ this.loaded = true;
642
+ return this;
643
+ }
644
+ _setSamplerParameters(parameters) {
645
+ if (this.device.isWebGL1 && isNPOT(this.width, this.height)) {
646
+ parameters = updateSamplerParametersForNPOT(parameters);
647
+ }
648
+ if (isObjectEmpty(parameters)) {
649
+ return;
650
+ }
651
+ logParameters(parameters);
652
+ this.gl.bindTexture(this.target, this.handle);
653
+ for (const [pname, pvalue] of Object.entries(parameters)) {
654
+ const param = Number(pname);
655
+ const value = pvalue;
656
+ switch (param) {
657
+ case GL.TEXTURE_MIN_LOD:
658
+ case GL.TEXTURE_MAX_LOD:
659
+ this.gl.texParameterf(this.target, param, value);
660
+ break;
665
661
  default:
666
- throw new Error(props.dimension);
662
+ this.gl.texParameteri(this.target, param, value);
663
+ break;
664
+ }
667
665
  }
666
+ this.gl.bindTexture(this.target, null);
667
+ return;
668
+ }
669
+ _getWebGL1NPOTParameterOverride(pname, value) {
670
+ const npot = this.device.isWebGL1 && isNPOT(this.width, this.height);
671
+ if (npot) {
672
+ switch (pname) {
673
+ case GL.TEXTURE_MIN_FILTER:
674
+ if (value !== GL.LINEAR && value !== GL.NEAREST) {
675
+ return GL.LINEAR;
676
+ }
677
+ break;
678
+ case GL.TEXTURE_WRAP_S:
679
+ case GL.TEXTURE_WRAP_T:
680
+ return GL.CLAMP_TO_EDGE;
681
+ default:
682
+ break;
683
+ }
684
+ }
685
+ return value;
686
+ }
687
+ }
688
+ _defineProperty(WEBGLTexture, "FACES", [GL.TEXTURE_CUBE_MAP_POSITIVE_X, GL.TEXTURE_CUBE_MAP_NEGATIVE_X, GL.TEXTURE_CUBE_MAP_POSITIVE_Y, GL.TEXTURE_CUBE_MAP_NEGATIVE_Y, GL.TEXTURE_CUBE_MAP_POSITIVE_Z, GL.TEXTURE_CUBE_MAP_NEGATIVE_Z]);
689
+ function getWebGLTextureTarget(props) {
690
+ switch (props.dimension) {
691
+ case '2d':
692
+ return GL.TEXTURE_2D;
693
+ case 'cube':
694
+ return GL.TEXTURE_CUBE_MAP;
695
+ case '2d-array':
696
+ return GL.TEXTURE_2D_ARRAY;
697
+ case '3d':
698
+ return GL.TEXTURE_3D;
699
+ case '1d':
700
+ case 'cube-array':
701
+ default:
702
+ throw new Error(props.dimension);
703
+ }
668
704
  }
669
705
  function isNPOT(width, height) {
670
- // Width and height not available, avoid classifying as NPOT texture
671
- if (!width || !height) {
672
- return false;
673
- }
674
- return !isPowerOfTwo(width) || !isPowerOfTwo(height);
706
+ if (!width || !height) {
707
+ return false;
708
+ }
709
+ return !isPowerOfTwo(width) || !isPowerOfTwo(height);
675
710
  }
676
711
  function logParameters(parameters) {
677
- log.log(1, 'texture sampler parameters', parameters)();
712
+ log.log(1, 'texture sampler parameters', parameters)();
678
713
  }
714
+ //# sourceMappingURL=webgl-texture.js.map