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

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 (367) hide show
  1. package/dist/adapter/converters/device-parameters.js +199 -136
  2. package/dist/adapter/converters/renderbuffer-formats.d.ts +1 -1
  3. package/dist/adapter/converters/renderbuffer-formats.d.ts.map +1 -1
  4. package/dist/adapter/converters/renderbuffer-formats.js +62 -176
  5. package/dist/adapter/converters/sampler-parameters.js +149 -206
  6. package/dist/adapter/converters/texture-formats.d.ts +2 -2
  7. package/dist/adapter/converters/texture-formats.d.ts.map +1 -1
  8. package/dist/adapter/converters/texture-formats.js +437 -890
  9. package/dist/adapter/converters/vertex-formats.js +15 -33
  10. package/dist/adapter/device-helpers/device-features.js +119 -100
  11. package/dist/adapter/device-helpers/device-limits.d.ts +1 -1
  12. package/dist/adapter/device-helpers/device-limits.d.ts.map +1 -1
  13. package/dist/adapter/device-helpers/device-limits.js +88 -86
  14. package/dist/adapter/device-helpers/get-device-info.js +42 -43
  15. package/dist/adapter/device-helpers/is-old-ie.js +9 -6
  16. package/dist/adapter/helpers/attribute-utils.js +50 -74
  17. package/dist/adapter/helpers/get-shader-info.d.ts +9 -0
  18. package/dist/adapter/helpers/get-shader-info.d.ts.map +1 -0
  19. package/dist/adapter/helpers/get-shader-info.js +27 -0
  20. package/dist/adapter/helpers/get-shader-layout.js +307 -296
  21. package/dist/adapter/helpers/parse-shader-compiler-log.d.ts +1 -1
  22. package/dist/adapter/helpers/parse-shader-compiler-log.d.ts.map +1 -1
  23. package/dist/adapter/helpers/parse-shader-compiler-log.js +32 -33
  24. package/dist/adapter/helpers/set-uniform.js +67 -110
  25. package/dist/adapter/helpers/uniforms.js +80 -85
  26. package/dist/adapter/objects/constants-to-keys.js +33 -33
  27. package/dist/adapter/objects/webgl-renderbuffer.d.ts +1 -1
  28. package/dist/adapter/objects/webgl-renderbuffer.d.ts.map +1 -1
  29. package/dist/adapter/objects/webgl-renderbuffer.js +67 -86
  30. package/dist/adapter/objects/webgl-resource.js +213 -205
  31. package/dist/adapter/objects/webgl-vertex-array-object.d.ts +1 -1
  32. package/dist/adapter/objects/webgl-vertex-array-object.d.ts.map +1 -1
  33. package/dist/adapter/objects/webgl-vertex-array-object.js +74 -76
  34. package/dist/adapter/resources/webgl-buffer.js +150 -147
  35. package/dist/adapter/resources/webgl-command-buffer.d.ts +5 -5
  36. package/dist/adapter/resources/webgl-command-buffer.d.ts.map +1 -1
  37. package/dist/adapter/resources/webgl-command-buffer.js +39 -55
  38. package/dist/adapter/resources/webgl-command-encoder.js +25 -49
  39. package/dist/adapter/resources/webgl-external-texture.js +91 -1
  40. package/dist/adapter/resources/webgl-framebuffer.d.ts +2 -2
  41. package/dist/adapter/resources/webgl-framebuffer.d.ts.map +1 -1
  42. package/dist/adapter/resources/webgl-framebuffer.js +231 -258
  43. package/dist/adapter/resources/webgl-render-pass.d.ts +1 -1
  44. package/dist/adapter/resources/webgl-render-pass.d.ts.map +1 -1
  45. package/dist/adapter/resources/webgl-render-pass.js +8 -18
  46. package/dist/adapter/resources/webgl-render-pipeline.js +316 -378
  47. package/dist/adapter/resources/webgl-sampler.js +42 -47
  48. package/dist/adapter/resources/webgl-shader.d.ts +1 -2
  49. package/dist/adapter/resources/webgl-shader.d.ts.map +1 -1
  50. package/dist/adapter/resources/webgl-shader.js +58 -68
  51. package/dist/adapter/resources/webgl-texture.d.ts +5 -5
  52. package/dist/adapter/resources/webgl-texture.d.ts.map +1 -1
  53. package/dist/adapter/resources/webgl-texture.js +661 -815
  54. package/dist/adapter/webgl-canvas-context.js +55 -49
  55. package/dist/adapter/webgl-device.js +288 -338
  56. package/dist/bundle.js +1 -2
  57. package/dist/classic/accessor.js +120 -127
  58. package/dist/classic/buffer.d.ts +1 -1
  59. package/dist/classic/buffer.d.ts.map +1 -1
  60. package/dist/classic/buffer.js +325 -356
  61. package/dist/classic/typed-array-utils.d.ts +1 -1
  62. package/dist/classic/typed-array-utils.d.ts.map +1 -1
  63. package/dist/classic/typed-array-utils.js +91 -101
  64. package/dist/context/context/create-browser-context.d.ts +1 -2
  65. package/dist/context/context/create-browser-context.d.ts.map +1 -1
  66. package/dist/context/context/create-browser-context.js +61 -52
  67. package/dist/context/context/create-headless-context.d.ts +1 -1
  68. package/dist/context/context/create-headless-context.d.ts.map +1 -1
  69. package/dist/context/context/create-headless-context.js +26 -33
  70. package/dist/context/context/webgl-checks.js +25 -20
  71. package/dist/context/debug/spector.d.ts +1 -2
  72. package/dist/context/debug/spector.d.ts.map +1 -1
  73. package/dist/context/debug/spector.js +53 -62
  74. package/dist/context/debug/webgl-developer-tools.d.ts +1 -1
  75. package/dist/context/debug/webgl-developer-tools.d.ts.map +1 -1
  76. package/dist/context/debug/webgl-developer-tools.js +106 -93
  77. package/dist/context/parameters/unified-parameter-api.js +91 -55
  78. package/dist/context/parameters/webgl-parameter-tables.d.ts +1 -1
  79. package/dist/context/parameters/webgl-parameter-tables.d.ts.map +1 -1
  80. package/dist/context/parameters/webgl-parameter-tables.js +462 -423
  81. package/dist/context/polyfill/context-data.js +16 -12
  82. package/dist/context/polyfill/get-parameter-polyfill.js +91 -76
  83. package/dist/context/polyfill/polyfill-context.js +75 -80
  84. package/dist/context/polyfill/polyfill-table.js +133 -139
  85. package/dist/context/polyfill/polyfill-vertex-array-object.js +255 -297
  86. package/dist/context/state-tracker/deep-array-equal.js +16 -18
  87. package/dist/context/state-tracker/track-context-state.js +183 -161
  88. package/dist/context/state-tracker/with-parameters.js +43 -35
  89. package/dist/dist.min.js +1 -0
  90. package/dist/es5/adapter/converters/device-parameters.js +3 -38
  91. package/dist/es5/adapter/converters/device-parameters.js.map +1 -1
  92. package/dist/es5/adapter/converters/renderbuffer-formats.js +2 -14
  93. package/dist/es5/adapter/converters/renderbuffer-formats.js.map +1 -1
  94. package/dist/es5/adapter/converters/sampler-parameters.js +2 -65
  95. package/dist/es5/adapter/converters/sampler-parameters.js.map +1 -1
  96. package/dist/es5/adapter/converters/texture-formats.js +9 -81
  97. package/dist/es5/adapter/converters/texture-formats.js.map +1 -1
  98. package/dist/es5/adapter/converters/vertex-formats.js +0 -12
  99. package/dist/es5/adapter/converters/vertex-formats.js.map +1 -1
  100. package/dist/es5/adapter/device-helpers/device-features.js +6 -40
  101. package/dist/es5/adapter/device-helpers/device-features.js.map +1 -1
  102. package/dist/es5/adapter/device-helpers/device-limits.js +0 -10
  103. package/dist/es5/adapter/device-helpers/device-limits.js.map +1 -1
  104. package/dist/es5/adapter/device-helpers/get-device-info.js +0 -10
  105. package/dist/es5/adapter/device-helpers/get-device-info.js.map +1 -1
  106. package/dist/es5/adapter/device-helpers/is-old-ie.js +0 -1
  107. package/dist/es5/adapter/device-helpers/is-old-ie.js.map +1 -1
  108. package/dist/es5/adapter/helpers/attribute-utils.js +3 -25
  109. package/dist/es5/adapter/helpers/attribute-utils.js.map +1 -1
  110. package/dist/es5/adapter/helpers/get-shader-info.js +31 -0
  111. package/dist/es5/adapter/helpers/get-shader-info.js.map +1 -0
  112. package/dist/es5/adapter/helpers/get-shader-layout.js +23 -101
  113. package/dist/es5/adapter/helpers/get-shader-layout.js.map +1 -1
  114. package/dist/es5/adapter/helpers/parse-shader-compiler-log.js +6 -24
  115. package/dist/es5/adapter/helpers/parse-shader-compiler-log.js.map +1 -1
  116. package/dist/es5/adapter/helpers/set-uniform.js +0 -33
  117. package/dist/es5/adapter/helpers/set-uniform.js.map +1 -1
  118. package/dist/es5/adapter/helpers/uniforms.js +13 -37
  119. package/dist/es5/adapter/helpers/uniforms.js.map +1 -1
  120. package/dist/es5/adapter/objects/constants-to-keys.js +1 -12
  121. package/dist/es5/adapter/objects/constants-to-keys.js.map +1 -1
  122. package/dist/es5/adapter/objects/webgl-renderbuffer.js +5 -33
  123. package/dist/es5/adapter/objects/webgl-renderbuffer.js.map +1 -1
  124. package/dist/es5/adapter/objects/webgl-resource.js +6 -60
  125. package/dist/es5/adapter/objects/webgl-resource.js.map +1 -1
  126. package/dist/es5/adapter/objects/webgl-vertex-array-object.js +7 -35
  127. package/dist/es5/adapter/objects/webgl-vertex-array-object.js.map +1 -1
  128. package/dist/es5/adapter/resources/webgl-buffer.js +20 -66
  129. package/dist/es5/adapter/resources/webgl-buffer.js.map +1 -1
  130. package/dist/es5/adapter/resources/webgl-command-buffer.js +6 -32
  131. package/dist/es5/adapter/resources/webgl-command-buffer.js.map +1 -1
  132. package/dist/es5/adapter/resources/webgl-command-encoder.js +0 -18
  133. package/dist/es5/adapter/resources/webgl-command-encoder.js.map +1 -1
  134. package/dist/es5/adapter/resources/webgl-external-texture.js.map +1 -1
  135. package/dist/es5/adapter/resources/webgl-framebuffer.js +10 -82
  136. package/dist/es5/adapter/resources/webgl-framebuffer.js.map +1 -1
  137. package/dist/es5/adapter/resources/webgl-render-pass.js +2 -19
  138. package/dist/es5/adapter/resources/webgl-render-pass.js.map +1 -1
  139. package/dist/es5/adapter/resources/webgl-render-pipeline.js +24 -133
  140. package/dist/es5/adapter/resources/webgl-render-pipeline.js.map +1 -1
  141. package/dist/es5/adapter/resources/webgl-sampler.js +2 -28
  142. package/dist/es5/adapter/resources/webgl-sampler.js.map +1 -1
  143. package/dist/es5/adapter/resources/webgl-shader.js +13 -52
  144. package/dist/es5/adapter/resources/webgl-shader.js.map +1 -1
  145. package/dist/es5/adapter/resources/webgl-texture.js +137 -291
  146. package/dist/es5/adapter/resources/webgl-texture.js.map +1 -1
  147. package/dist/es5/adapter/webgl-canvas-context.js +0 -24
  148. package/dist/es5/adapter/webgl-canvas-context.js.map +1 -1
  149. package/dist/es5/adapter/webgl-device.js +40 -127
  150. package/dist/es5/adapter/webgl-device.js.map +1 -1
  151. package/dist/es5/bundle.js +0 -1
  152. package/dist/es5/bundle.js.map +1 -1
  153. package/dist/es5/classic/accessor.js +1 -31
  154. package/dist/es5/classic/accessor.js.map +1 -1
  155. package/dist/es5/classic/buffer.js +32 -102
  156. package/dist/es5/classic/buffer.js.map +1 -1
  157. package/dist/es5/classic/typed-array-utils.js +10 -37
  158. package/dist/es5/classic/typed-array-utils.js.map +1 -1
  159. package/dist/es5/context/context/create-browser-context.js +4 -21
  160. package/dist/es5/context/context/create-browser-context.js.map +1 -1
  161. package/dist/es5/context/context/create-headless-context.js +8 -21
  162. package/dist/es5/context/context/create-headless-context.js.map +1 -1
  163. package/dist/es5/context/context/webgl-checks.js +4 -14
  164. package/dist/es5/context/context/webgl-checks.js.map +1 -1
  165. package/dist/es5/context/debug/spector.js +20 -54
  166. package/dist/es5/context/debug/spector.js.map +1 -1
  167. package/dist/es5/context/debug/webgl-developer-tools.js +19 -65
  168. package/dist/es5/context/debug/webgl-developer-tools.js.map +1 -1
  169. package/dist/es5/context/parameters/unified-parameter-api.js +3 -28
  170. package/dist/es5/context/parameters/unified-parameter-api.js.map +1 -1
  171. package/dist/es5/context/parameters/webgl-parameter-tables.js +18 -65
  172. package/dist/es5/context/parameters/webgl-parameter-tables.js.map +1 -1
  173. package/dist/es5/context/polyfill/context-data.js +0 -3
  174. package/dist/es5/context/polyfill/context-data.js.map +1 -1
  175. package/dist/es5/context/polyfill/get-parameter-polyfill.js +0 -12
  176. package/dist/es5/context/polyfill/get-parameter-polyfill.js.map +1 -1
  177. package/dist/es5/context/polyfill/polyfill-context.js +8 -33
  178. package/dist/es5/context/polyfill/polyfill-context.js.map +1 -1
  179. package/dist/es5/context/polyfill/polyfill-table.js +3 -27
  180. package/dist/es5/context/polyfill/polyfill-table.js.map +1 -1
  181. package/dist/es5/context/polyfill/polyfill-vertex-array-object.js +0 -70
  182. package/dist/es5/context/polyfill/polyfill-vertex-array-object.js.map +1 -1
  183. package/dist/es5/context/state-tracker/deep-array-equal.js +0 -5
  184. package/dist/es5/context/state-tracker/deep-array-equal.js.map +1 -1
  185. package/dist/es5/context/state-tracker/track-context-state.js +10 -53
  186. package/dist/es5/context/state-tracker/track-context-state.js.map +1 -1
  187. package/dist/es5/context/state-tracker/with-parameters.js +1 -13
  188. package/dist/es5/context/state-tracker/with-parameters.js.map +1 -1
  189. package/dist/es5/index.js +72 -99
  190. package/dist/es5/index.js.map +1 -1
  191. package/dist/es5/init.js +0 -3
  192. package/dist/es5/init.js.map +1 -1
  193. package/dist/es5/types/webgl.js +0 -1
  194. package/dist/es5/types/webgl.js.map +1 -1
  195. package/dist/es5/types.js.map +1 -1
  196. package/dist/esm/adapter/converters/device-parameters.js +0 -20
  197. package/dist/esm/adapter/converters/device-parameters.js.map +1 -1
  198. package/dist/esm/adapter/converters/renderbuffer-formats.js +0 -4
  199. package/dist/esm/adapter/converters/renderbuffer-formats.js.map +1 -1
  200. package/dist/esm/adapter/converters/sampler-parameters.js +2 -57
  201. package/dist/esm/adapter/converters/sampler-parameters.js.map +1 -1
  202. package/dist/esm/adapter/converters/texture-formats.js +8 -52
  203. package/dist/esm/adapter/converters/texture-formats.js.map +1 -1
  204. package/dist/esm/adapter/converters/vertex-formats.js +0 -9
  205. package/dist/esm/adapter/converters/vertex-formats.js.map +1 -1
  206. package/dist/esm/adapter/device-helpers/device-features.js +2 -19
  207. package/dist/esm/adapter/device-helpers/device-features.js.map +1 -1
  208. package/dist/esm/adapter/device-helpers/device-limits.js +0 -3
  209. package/dist/esm/adapter/device-helpers/device-limits.js.map +1 -1
  210. package/dist/esm/adapter/device-helpers/get-device-info.js +0 -6
  211. package/dist/esm/adapter/device-helpers/get-device-info.js.map +1 -1
  212. package/dist/esm/adapter/device-helpers/is-old-ie.js +2 -1
  213. package/dist/esm/adapter/device-helpers/is-old-ie.js.map +1 -1
  214. package/dist/esm/adapter/helpers/attribute-utils.js +0 -17
  215. package/dist/esm/adapter/helpers/attribute-utils.js.map +1 -1
  216. package/dist/esm/adapter/helpers/get-shader-info.js +25 -0
  217. package/dist/esm/adapter/helpers/get-shader-info.js.map +1 -0
  218. package/dist/esm/adapter/helpers/get-shader-layout.js +2 -48
  219. package/dist/esm/adapter/helpers/get-shader-layout.js.map +1 -1
  220. package/dist/esm/adapter/helpers/parse-shader-compiler-log.js +0 -7
  221. package/dist/esm/adapter/helpers/parse-shader-compiler-log.js.map +1 -1
  222. package/dist/esm/adapter/helpers/set-uniform.js +0 -30
  223. package/dist/esm/adapter/helpers/set-uniform.js.map +1 -1
  224. package/dist/esm/adapter/helpers/uniforms.js +0 -10
  225. package/dist/esm/adapter/helpers/uniforms.js.map +1 -1
  226. package/dist/esm/adapter/objects/constants-to-keys.js +0 -7
  227. package/dist/esm/adapter/objects/constants-to-keys.js.map +1 -1
  228. package/dist/esm/adapter/objects/webgl-renderbuffer.js +2 -18
  229. package/dist/esm/adapter/objects/webgl-renderbuffer.js.map +1 -1
  230. package/dist/esm/adapter/objects/webgl-resource.js +10 -57
  231. package/dist/esm/adapter/objects/webgl-resource.js.map +1 -1
  232. package/dist/esm/adapter/objects/webgl-vertex-array-object.js +5 -15
  233. package/dist/esm/adapter/objects/webgl-vertex-array-object.js.map +1 -1
  234. package/dist/esm/adapter/resources/webgl-buffer.js +12 -40
  235. package/dist/esm/adapter/resources/webgl-buffer.js.map +1 -1
  236. package/dist/esm/adapter/resources/webgl-command-buffer.js +2 -17
  237. package/dist/esm/adapter/resources/webgl-command-buffer.js.map +1 -1
  238. package/dist/esm/adapter/resources/webgl-command-encoder.js +0 -12
  239. package/dist/esm/adapter/resources/webgl-command-encoder.js.map +1 -1
  240. package/dist/esm/adapter/resources/webgl-external-texture.js.map +1 -1
  241. package/dist/esm/adapter/resources/webgl-framebuffer.js +0 -60
  242. package/dist/esm/adapter/resources/webgl-framebuffer.js.map +1 -1
  243. package/dist/esm/adapter/resources/webgl-render-pass.js +1 -8
  244. package/dist/esm/adapter/resources/webgl-render-pass.js.map +1 -1
  245. package/dist/esm/adapter/resources/webgl-render-pipeline.js +0 -89
  246. package/dist/esm/adapter/resources/webgl-render-pipeline.js.map +1 -1
  247. package/dist/esm/adapter/resources/webgl-sampler.js +0 -12
  248. package/dist/esm/adapter/resources/webgl-sampler.js.map +1 -1
  249. package/dist/esm/adapter/resources/webgl-shader.js +2 -16
  250. package/dist/esm/adapter/resources/webgl-shader.js.map +1 -1
  251. package/dist/esm/adapter/resources/webgl-texture.js +36 -154
  252. package/dist/esm/adapter/resources/webgl-texture.js.map +1 -1
  253. package/dist/esm/adapter/webgl-canvas-context.js +0 -14
  254. package/dist/esm/adapter/webgl-canvas-context.js.map +1 -1
  255. package/dist/esm/adapter/webgl-device.js +19 -89
  256. package/dist/esm/adapter/webgl-device.js.map +1 -1
  257. package/dist/esm/bundle.js +0 -1
  258. package/dist/esm/bundle.js.map +1 -1
  259. package/dist/esm/classic/accessor.js +10 -34
  260. package/dist/esm/classic/accessor.js.map +1 -1
  261. package/dist/esm/classic/buffer.js +15 -71
  262. package/dist/esm/classic/buffer.js.map +1 -1
  263. package/dist/esm/classic/typed-array-utils.js +0 -20
  264. package/dist/esm/classic/typed-array-utils.js.map +1 -1
  265. package/dist/esm/context/context/create-browser-context.js +6 -14
  266. package/dist/esm/context/context/create-browser-context.js.map +1 -1
  267. package/dist/esm/context/context/create-headless-context.js +2 -6
  268. package/dist/esm/context/context/create-headless-context.js.map +1 -1
  269. package/dist/esm/context/context/webgl-checks.js +0 -3
  270. package/dist/esm/context/context/webgl-checks.js.map +1 -1
  271. package/dist/esm/context/debug/spector.js +2 -14
  272. package/dist/esm/context/debug/spector.js.map +1 -1
  273. package/dist/esm/context/debug/webgl-developer-tools.js +4 -22
  274. package/dist/esm/context/debug/webgl-developer-tools.js.map +1 -1
  275. package/dist/esm/context/parameters/unified-parameter-api.js +2 -13
  276. package/dist/esm/context/parameters/unified-parameter-api.js.map +1 -1
  277. package/dist/esm/context/parameters/webgl-parameter-tables.js +0 -19
  278. package/dist/esm/context/parameters/webgl-parameter-tables.js.map +1 -1
  279. package/dist/esm/context/polyfill/context-data.js +0 -2
  280. package/dist/esm/context/polyfill/context-data.js.map +1 -1
  281. package/dist/esm/context/polyfill/get-parameter-polyfill.js +0 -5
  282. package/dist/esm/context/polyfill/get-parameter-polyfill.js.map +1 -1
  283. package/dist/esm/context/polyfill/polyfill-context.js +14 -21
  284. package/dist/esm/context/polyfill/polyfill-context.js.map +1 -1
  285. package/dist/esm/context/polyfill/polyfill-table.js +0 -23
  286. package/dist/esm/context/polyfill/polyfill-table.js.map +1 -1
  287. package/dist/esm/context/polyfill/polyfill-vertex-array-object.js +0 -70
  288. package/dist/esm/context/polyfill/polyfill-vertex-array-object.js.map +1 -1
  289. package/dist/esm/context/state-tracker/deep-array-equal.js +0 -4
  290. package/dist/esm/context/state-tracker/deep-array-equal.js.map +1 -1
  291. package/dist/esm/context/state-tracker/track-context-state.js +11 -45
  292. package/dist/esm/context/state-tracker/track-context-state.js.map +1 -1
  293. package/dist/esm/context/state-tracker/with-parameters.js +0 -6
  294. package/dist/esm/context/state-tracker/with-parameters.js.map +1 -1
  295. package/dist/esm/index.js.map +1 -1
  296. package/dist/esm/init.js.map +1 -1
  297. package/dist/esm/types/webgl.js.map +1 -1
  298. package/dist/esm/types.js.map +1 -1
  299. package/dist/index.js +39 -25
  300. package/dist/init.js +1 -2
  301. package/dist/types/webgl.d.ts +20 -20
  302. package/dist/types/webgl.d.ts.map +1 -1
  303. package/dist/types/webgl.js +0 -1
  304. package/dist/types.d.ts +1 -1
  305. package/dist/types.d.ts.map +1 -1
  306. package/dist/types.js +0 -1
  307. package/package.json +8 -8
  308. package/src/adapter/helpers/get-shader-info.ts +37 -0
  309. package/src/adapter/helpers/parse-shader-compiler-log.ts +1 -1
  310. package/src/adapter/resources/webgl-render-pass.ts +1 -1
  311. package/src/adapter/resources/webgl-shader.ts +2 -2
  312. package/src/adapter/webgl-device.ts +1 -1
  313. package/src/context/debug/webgl-developer-tools.ts +0 -1
  314. package/src/types/webgl.ts +4 -4
  315. package/dist/adapter/converters/device-parameters.js.map +0 -1
  316. package/dist/adapter/converters/renderbuffer-formats.js.map +0 -1
  317. package/dist/adapter/converters/sampler-parameters.js.map +0 -1
  318. package/dist/adapter/converters/texture-formats.js.map +0 -1
  319. package/dist/adapter/converters/vertex-formats.js.map +0 -1
  320. package/dist/adapter/device-helpers/device-features.js.map +0 -1
  321. package/dist/adapter/device-helpers/device-limits.js.map +0 -1
  322. package/dist/adapter/device-helpers/get-device-info.js.map +0 -1
  323. package/dist/adapter/device-helpers/is-old-ie.js.map +0 -1
  324. package/dist/adapter/helpers/attribute-utils.js.map +0 -1
  325. package/dist/adapter/helpers/get-shader-layout.js.map +0 -1
  326. package/dist/adapter/helpers/parse-shader-compiler-log.js.map +0 -1
  327. package/dist/adapter/helpers/set-uniform.js.map +0 -1
  328. package/dist/adapter/helpers/uniforms.js.map +0 -1
  329. package/dist/adapter/objects/constants-to-keys.js.map +0 -1
  330. package/dist/adapter/objects/webgl-renderbuffer.js.map +0 -1
  331. package/dist/adapter/objects/webgl-resource.js.map +0 -1
  332. package/dist/adapter/objects/webgl-vertex-array-object.js.map +0 -1
  333. package/dist/adapter/resources/webgl-buffer.js.map +0 -1
  334. package/dist/adapter/resources/webgl-command-buffer.js.map +0 -1
  335. package/dist/adapter/resources/webgl-command-encoder.js.map +0 -1
  336. package/dist/adapter/resources/webgl-external-texture.js.map +0 -1
  337. package/dist/adapter/resources/webgl-framebuffer.js.map +0 -1
  338. package/dist/adapter/resources/webgl-render-pass.js.map +0 -1
  339. package/dist/adapter/resources/webgl-render-pipeline.js.map +0 -1
  340. package/dist/adapter/resources/webgl-sampler.js.map +0 -1
  341. package/dist/adapter/resources/webgl-shader.js.map +0 -1
  342. package/dist/adapter/resources/webgl-texture.js.map +0 -1
  343. package/dist/adapter/webgl-canvas-context.js.map +0 -1
  344. package/dist/adapter/webgl-device.js.map +0 -1
  345. package/dist/bundle.js.map +0 -1
  346. package/dist/classic/accessor.js.map +0 -1
  347. package/dist/classic/buffer.js.map +0 -1
  348. package/dist/classic/typed-array-utils.js.map +0 -1
  349. package/dist/context/context/create-browser-context.js.map +0 -1
  350. package/dist/context/context/create-headless-context.js.map +0 -1
  351. package/dist/context/context/webgl-checks.js.map +0 -1
  352. package/dist/context/debug/spector.js.map +0 -1
  353. package/dist/context/debug/webgl-developer-tools.js.map +0 -1
  354. package/dist/context/parameters/unified-parameter-api.js.map +0 -1
  355. package/dist/context/parameters/webgl-parameter-tables.js.map +0 -1
  356. package/dist/context/polyfill/context-data.js.map +0 -1
  357. package/dist/context/polyfill/get-parameter-polyfill.js.map +0 -1
  358. package/dist/context/polyfill/polyfill-context.js.map +0 -1
  359. package/dist/context/polyfill/polyfill-table.js.map +0 -1
  360. package/dist/context/polyfill/polyfill-vertex-array-object.js.map +0 -1
  361. package/dist/context/state-tracker/deep-array-equal.js.map +0 -1
  362. package/dist/context/state-tracker/track-context-state.js.map +0 -1
  363. package/dist/context/state-tracker/with-parameters.js.map +0 -1
  364. package/dist/index.js.map +0 -1
  365. package/dist/init.js.map +0 -1
  366. package/dist/types/webgl.js.map +0 -1
  367. package/dist/types.js.map +0 -1
@@ -1,832 +1,678 @@
1
- import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
1
+ // luma.gl, MIT license
2
+ // Texture class.
3
+ // @todo
4
+ // - [ ] cube texture init params
5
+ // - [ ] video (external) textures
2
6
  import { isObjectEmpty } from '@luma.gl/api';
3
7
  import { Texture, cast, log, assert, isPowerOfTwo, loadImage } from '@luma.gl/api';
4
8
  import GL from '@luma.gl/constants';
5
- import { withParameters } from '../../context/state-tracker/with-parameters';
6
- import { getWebGLTextureFormat, getWebGLTextureParameters, getTextureFormatBytesPerPixel } from '../converters/texture-formats';
7
- import { convertSamplerParametersToWebGL, updateSamplerParametersForNPOT } from '../converters/sampler-parameters';
8
- import WEBGLBuffer from './webgl-buffer';
9
- import WEBGLSampler from './webgl-sampler';
10
- export default class WEBGLTexture extends Texture {
11
- constructor(device, props) {
12
- var _this$props;
13
-
14
- super(device, {
15
- format: GL.RGBA,
16
- ...props
17
- });
18
-
19
- _defineProperty(this, "MAX_ATTRIBUTES", void 0);
20
-
21
- _defineProperty(this, "device", void 0);
22
-
23
- _defineProperty(this, "gl", void 0);
24
-
25
- _defineProperty(this, "gl2", void 0);
26
-
27
- _defineProperty(this, "handle", void 0);
28
-
29
- _defineProperty(this, "data", void 0);
30
-
31
- _defineProperty(this, "width", undefined);
32
-
33
- _defineProperty(this, "height", undefined);
34
-
35
- _defineProperty(this, "depth", undefined);
36
-
37
- _defineProperty(this, "format", undefined);
38
-
39
- _defineProperty(this, "type", undefined);
40
-
41
- _defineProperty(this, "dataFormat", undefined);
42
-
43
- _defineProperty(this, "mipmaps", undefined);
44
-
45
- _defineProperty(this, "target", void 0);
46
-
47
- _defineProperty(this, "textureUnit", undefined);
48
-
49
- _defineProperty(this, "sampler", undefined);
50
-
51
- _defineProperty(this, "loaded", false);
52
-
53
- _defineProperty(this, "_video", void 0);
54
-
55
- this.device = cast(device);
56
- this.gl = this.device.gl;
57
- this.gl2 = this.device.gl2;
58
- this.handle = this.props.handle || this.gl.createTexture();
59
- this.handle.__SPECTOR_Metadata = { ...this.props,
60
- data: typeof this.props.data
61
- };
62
- this.target = getWebGLTextureTarget(this.props);
63
- this.loaded = false;
64
-
65
- if (typeof ((_this$props = this.props) === null || _this$props === void 0 ? void 0 : _this$props.data) === 'string') {
66
- Object.assign(this.props, {
67
- data: loadImage(this.props.data)
68
- });
69
- }
70
-
71
- this.initialize(this.props);
72
- Object.seal(this);
73
- }
74
-
75
- destroy() {
76
- if (this.handle) {
77
- this.gl.deleteTexture(this.handle);
78
- this.removeStats();
79
- this.trackDeallocatedMemory('Texture');
80
- this.destroyed = true;
81
- }
82
- }
83
-
84
- toString() {
85
- return "Texture(".concat(this.id, ",").concat(this.width, "x").concat(this.height, ")");
86
- }
87
-
88
- initialize(props = {}) {
89
- if (this.props.dimension === 'cube') {
90
- return this.initializeCube(props);
91
- }
92
-
93
- let data = props.data;
94
-
95
- if (data instanceof Promise) {
96
- data.then(resolvedImageData => this.initialize(Object.assign({}, props, {
97
- pixels: resolvedImageData,
98
- data: resolvedImageData
99
- })));
100
- return this;
101
- }
102
-
103
- const isVideo = typeof HTMLVideoElement !== 'undefined' && data instanceof HTMLVideoElement;
104
-
105
- if (isVideo && data.readyState < HTMLVideoElement.HAVE_METADATA) {
106
- this._video = null;
107
- data.addEventListener('loadeddata', () => this.initialize(props));
108
- return this;
109
- }
110
-
111
- let {
112
- parameters = {}
113
- } = props;
114
- const {
115
- pixels = null,
116
- recreate = false,
117
- pixelStore = {},
118
- textureUnit = undefined
119
- } = props;
120
-
121
- if (!data) {
122
- data = pixels;
123
- }
124
-
125
- let {
126
- width,
127
- height,
128
- dataFormat,
129
- type,
130
- compressed = false,
131
- mipmaps = true
132
- } = props;
133
- const {
134
- depth = 0
135
- } = props;
136
- ({
137
- width,
138
- height,
139
- compressed,
140
- dataFormat,
141
- type
142
- } = this._deduceParameters({
143
- format: props.format,
144
- type,
145
- dataFormat,
146
- compressed,
147
- data,
148
- width,
149
- height
150
- }));
151
- const format = getWebGLTextureFormat(this.gl, props.format);
152
- this.width = width;
153
- this.height = height;
154
- this.depth = depth;
155
- this.format = format;
156
- this.type = type;
157
- this.dataFormat = dataFormat;
158
- this.textureUnit = textureUnit;
159
-
160
- if (Number.isFinite(this.textureUnit)) {
161
- this.gl.activeTexture(GL.TEXTURE0 + this.textureUnit);
162
- this.gl.bindTexture(this.target, this.handle);
163
- }
164
-
165
- if (mipmaps && this.device.isWebGL1 && isNPOT(this.width, this.height)) {
166
- log.warn("texture: ".concat(this, " is Non-Power-Of-Two, disabling mipmaps"))();
167
- mipmaps = false;
168
- }
169
-
170
- this.mipmaps = mipmaps;
171
- this.setImageData({
172
- data,
173
- width,
174
- height,
175
- depth,
176
- format,
177
- type,
178
- dataFormat,
179
- parameters: pixelStore,
180
- compressed
181
- });
182
- this.setSampler(props.sampler);
183
-
184
- this._setSamplerParameters(parameters);
185
-
186
- if (mipmaps) {
187
- this.generateMipmap();
188
- }
189
-
190
- if (recreate) {
191
- this.data = data;
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
+ }
192
58
  }
193
-
194
- if (isVideo) {
195
- this._video = {
196
- video: data,
197
- parameters,
198
- lastTime: data.readyState >= HTMLVideoElement.HAVE_CURRENT_DATA ? data.currentTime : -1
199
- };
59
+ toString() {
60
+ return `Texture(${this.id},${this.width}x${this.height})`;
200
61
  }
201
-
202
- return this;
203
- }
204
-
205
- initializeCube(props) {
206
- const {
207
- mipmaps = true,
208
- parameters = {}
209
- } = props;
210
- this.setCubeMapImageData(props).then(() => {
211
- this.loaded = true;
212
-
213
- if (mipmaps) {
214
- this.generateMipmap(props);
215
- }
216
-
217
- this.setSampler(props.sampler);
218
-
219
- this._setSamplerParameters(parameters);
220
- });
221
- return this;
222
- }
223
-
224
- setSampler(sampler = {}) {
225
- let samplerProps;
226
-
227
- if (sampler instanceof WEBGLSampler) {
228
- this.sampler = sampler;
229
- samplerProps = sampler.props;
230
- } else {
231
- this.sampler = new WEBGLSampler(this.device, sampler);
232
- samplerProps = sampler;
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
+ }
233
222
  }
234
-
235
- const parameters = convertSamplerParametersToWebGL(samplerProps);
236
-
237
- this._setSamplerParameters(parameters);
238
-
239
- return this;
240
- }
241
-
242
- resize(options) {
243
- const {
244
- height,
245
- width,
246
- mipmaps = false
247
- } = options;
248
-
249
- if (width !== this.width || height !== this.height) {
250
- return this.initialize({
251
- width,
252
- height,
253
- format: this.format,
254
- type: this.type,
255
- dataFormat: this.dataFormat,
256
- mipmaps
257
- });
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;
258
426
  }
259
-
260
- return this;
261
- }
262
-
263
- update() {
264
- if (this._video) {
265
- const {
266
- video,
267
- parameters,
268
- lastTime
269
- } = this._video;
270
-
271
- if (lastTime === video.currentTime || video.readyState < HTMLVideoElement.HAVE_CURRENT_DATA) {
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);
272
614
  return;
273
- }
274
-
275
- this.setSubImageData({
276
- data: video,
277
- parameters
278
- });
279
-
280
- if (this.mipmaps) {
281
- this.generateMipmap();
282
- }
283
-
284
- this._video.lastTime = video.currentTime;
285
- }
286
- }
287
-
288
- generateMipmap(params = {}) {
289
- if (this.device.isWebGL1 && isNPOT(this.width, this.height)) {
290
- log.warn("texture: ".concat(this, " is Non-Power-Of-Two, disabling mipmaping"))();
291
- return this;
292
- }
293
-
294
- this.mipmaps = true;
295
- this.gl.bindTexture(this.target, this.handle);
296
- withParameters(this.gl, params, () => {
297
- this.gl.generateMipmap(this.target);
298
- });
299
- this.gl.bindTexture(this.target, null);
300
- return this;
301
- }
302
-
303
- setImageData(options) {
304
- if (this.props.dimension === '3d') {
305
- return this.setImageData3D(options);
306
- }
307
-
308
- this.trackDeallocatedMemory('Texture');
309
- const {
310
- target = this.target,
311
- pixels = null,
312
- level = 0,
313
- format = this.format,
314
- offset = 0,
315
- parameters = {}
316
- } = options;
317
- let {
318
- data = null,
319
- type = this.type,
320
- width = this.width,
321
- height = this.height,
322
- dataFormat = this.dataFormat,
323
- compressed = false
324
- } = options;
325
-
326
- if (!data) {
327
- data = pixels;
328
- }
329
-
330
- ({
331
- type,
332
- dataFormat,
333
- compressed,
334
- width,
335
- height
336
- } = this._deduceParameters({
337
- format: this.props.format,
338
- type,
339
- dataFormat,
340
- compressed,
341
- data,
342
- width,
343
- height
344
- }));
345
- const {
346
- gl
347
- } = this;
348
- gl.bindTexture(this.target, this.handle);
349
- let dataType = null;
350
- ({
351
- data,
352
- dataType
353
- } = this._getDataType({
354
- data,
355
- compressed
356
- }));
357
- let gl2;
358
- withParameters(this.gl, parameters, () => {
359
- switch (dataType) {
360
- case 'null':
361
- gl.texImage2D(target, level, format, width, height, 0, dataFormat, type, data);
362
- break;
363
-
364
- case 'typed-array':
365
- gl.texImage2D(target, level, format, width, height, 0, dataFormat, type, data, offset);
366
- break;
367
-
368
- case 'buffer':
369
- gl2 = this.device.assertWebGL2();
370
- gl2.bindBuffer(GL.PIXEL_UNPACK_BUFFER, data.handle || data);
371
- gl2.texImage2D(target, level, format, width, height, 0, dataFormat, type, offset);
372
- gl2.bindBuffer(GL.PIXEL_UNPACK_BUFFER, null);
373
- break;
374
-
375
- case 'browser-object':
376
- if (this.device.isWebGL2) {
377
- gl.texImage2D(target, level, format, width, height, 0, dataFormat, type, data);
378
- } else {
379
- gl.texImage2D(target, level, format, dataFormat, type, data);
380
- }
381
-
382
- break;
383
-
384
- case 'compressed':
385
- for (const [levelIndex, levelData] of data.entries()) {
386
- gl.compressedTexImage2D(target, levelIndex, levelData.format, levelData.width, levelData.height, 0, levelData.data);
387
- }
388
-
389
- break;
390
-
391
- default:
392
- assert(false, 'Unknown image data type');
393
- }
394
- });
395
-
396
- if (data && data.byteLength) {
397
- this.trackAllocatedMemory(data.byteLength, 'Texture');
398
- } else {
399
- const bytesPerPixel = getTextureFormatBytesPerPixel(this.gl, this.props.format);
400
- this.trackAllocatedMemory(this.width * this.height * bytesPerPixel, 'Texture');
401
- }
402
-
403
- this.loaded = true;
404
- return this;
405
- }
406
-
407
- setSubImageData({
408
- target = this.target,
409
- pixels = null,
410
- data = null,
411
- x = 0,
412
- y = 0,
413
- width = this.width,
414
- height = this.height,
415
- level = 0,
416
- format = this.format,
417
- type = this.type,
418
- dataFormat = this.dataFormat,
419
- compressed = false,
420
- offset = 0,
421
- parameters = {}
422
- }) {
423
- ({
424
- type,
425
- dataFormat,
426
- compressed,
427
- width,
428
- height
429
- } = this._deduceParameters({
430
- format: this.props.format,
431
- type,
432
- dataFormat,
433
- compressed,
434
- data,
435
- width,
436
- height
437
- }));
438
- assert(this.depth === 1, 'texSubImage not supported for 3D textures');
439
-
440
- if (!data) {
441
- data = pixels;
442
- }
443
-
444
- if (data && data.data) {
445
- const ndarray = data;
446
- data = ndarray.data;
447
- width = ndarray.shape[0];
448
- height = ndarray.shape[1];
449
615
  }
450
-
451
- if (data instanceof WEBGLBuffer) {
452
- data = data.handle;
453
- }
454
-
455
- this.gl.bindTexture(this.target, this.handle);
456
- withParameters(this.gl, parameters, () => {
457
- if (compressed) {
458
- this.gl.compressedTexSubImage2D(target, level, x, y, width, height, format, data);
459
- } else if (data === null) {
460
- this.gl.texSubImage2D(target, level, x, y, width, height, dataFormat, type, null);
461
- } else if (ArrayBuffer.isView(data)) {
462
- this.gl.texSubImage2D(target, level, x, y, width, height, dataFormat, type, data, offset);
463
- } else if (typeof WebGLBuffer !== 'undefined' && data instanceof WebGLBuffer) {
464
- const gl2 = this.device.assertWebGL2();
465
- gl2.bindBuffer(GL.PIXEL_UNPACK_BUFFER, data);
466
- gl2.texSubImage2D(target, level, x, y, width, height, dataFormat, type, offset);
467
- gl2.bindBuffer(GL.PIXEL_UNPACK_BUFFER, null);
468
- } else if (this.device.isWebGL2) {
469
- const gl2 = this.device.assertWebGL2();
470
- gl2.texSubImage2D(target, level, x, y, width, height, dataFormat, type, data);
471
- } else {
472
- this.gl.texSubImage2D(target, level, x, y, dataFormat, type, data);
473
- }
474
- });
475
- this.gl.bindTexture(this.target, null);
476
- }
477
-
478
- copyFramebuffer(opts = {}) {
479
- log.error('Texture.copyFramebuffer({...}) is no logner supported, use copyToTexture(source, target, opts})')();
480
- return null;
481
- }
482
-
483
- getActiveUnit() {
484
- return this.gl.getParameter(GL.ACTIVE_TEXTURE) - GL.TEXTURE0;
485
- }
486
-
487
- bind(textureUnit = this.textureUnit) {
488
- const {
489
- gl
490
- } = this;
491
-
492
- if (textureUnit !== undefined) {
493
- this.textureUnit = textureUnit;
494
- gl.activeTexture(gl.TEXTURE0 + textureUnit);
495
- }
496
-
497
- gl.bindTexture(this.target, this.handle);
498
- return textureUnit;
499
- }
500
-
501
- unbind(textureUnit = this.textureUnit) {
502
- const {
503
- gl
504
- } = this;
505
-
506
- if (textureUnit !== undefined) {
507
- this.textureUnit = textureUnit;
508
- gl.activeTexture(gl.TEXTURE0 + textureUnit);
509
- }
510
-
511
- gl.bindTexture(this.target, null);
512
- return textureUnit;
513
- }
514
-
515
- _getDataType({
516
- data,
517
- compressed = false
518
- }) {
519
- if (compressed) {
520
- return {
521
- data,
522
- dataType: 'compressed'
523
- };
524
- }
525
-
526
- if (data === null) {
527
- return {
528
- data,
529
- dataType: 'null'
530
- };
531
- }
532
-
533
- if (ArrayBuffer.isView(data)) {
534
- return {
535
- data,
536
- dataType: 'typed-array'
537
- };
538
- }
539
-
540
- if (data instanceof WEBGLBuffer) {
541
- return {
542
- data: data.handle,
543
- dataType: 'buffer'
544
- };
545
- }
546
-
547
- if (typeof WebGLBuffer !== 'undefined' && data instanceof WebGLBuffer) {
548
- return {
549
- data,
550
- dataType: 'buffer'
551
- };
552
- }
553
-
554
- return {
555
- data,
556
- dataType: 'browser-object'
557
- };
558
- }
559
-
560
- _deduceParameters(opts) {
561
- const {
562
- format,
563
- data
564
- } = opts;
565
- let {
566
- width,
567
- height,
568
- dataFormat,
569
- type,
570
- compressed
571
- } = opts;
572
- const parameters = getWebGLTextureParameters(this.gl, format);
573
- dataFormat = dataFormat || parameters.dataFormat;
574
- type = type || parameters.type;
575
- compressed = compressed || parameters.compressed;
576
- ({
577
- width,
578
- height
579
- } = this._deduceImageSize(data, width, height));
580
- return {
581
- dataFormat,
582
- type,
583
- compressed,
584
- width,
585
- height,
586
- format,
587
- data
588
- };
589
- }
590
-
591
- _deduceImageSize(data, width, height) {
592
- let size;
593
-
594
- if (typeof ImageData !== 'undefined' && data instanceof ImageData) {
595
- size = {
596
- width: data.width,
597
- height: data.height
598
- };
599
- } else if (typeof HTMLImageElement !== 'undefined' && data instanceof HTMLImageElement) {
600
- size = {
601
- width: data.naturalWidth,
602
- height: data.naturalHeight
603
- };
604
- } else if (typeof HTMLCanvasElement !== 'undefined' && data instanceof HTMLCanvasElement) {
605
- size = {
606
- width: data.width,
607
- height: data.height
608
- };
609
- } else if (typeof ImageBitmap !== 'undefined' && data instanceof ImageBitmap) {
610
- size = {
611
- width: data.width,
612
- height: data.height
613
- };
614
- } else if (typeof HTMLVideoElement !== 'undefined' && data instanceof HTMLVideoElement) {
615
- size = {
616
- width: data.videoWidth,
617
- height: data.videoHeight
618
- };
619
- } else if (!data) {
620
- size = {
621
- width: width >= 0 ? width : 1,
622
- height: height >= 0 ? height : 1
623
- };
624
- } else {
625
- size = {
626
- width,
627
- height
628
- };
629
- }
630
-
631
- assert(size, 'Could not deduced texture size');
632
- assert(width === undefined || size.width === width, 'Deduced texture width does not match supplied width');
633
- assert(height === undefined || size.height === height, 'Deduced texture height does not match supplied height');
634
- return size;
635
- }
636
-
637
- async setCubeMapImageData(options) {
638
- const {
639
- gl
640
- } = this;
641
- const {
642
- width,
643
- height,
644
- pixels,
645
- data,
646
- format = GL.RGBA,
647
- type = GL.UNSIGNED_BYTE
648
- } = options;
649
- const imageDataMap = pixels || data;
650
- const resolvedFaces = await Promise.all(WEBGLTexture.FACES.map(face => {
651
- const facePixels = imageDataMap[face];
652
- return Promise.all(Array.isArray(facePixels) ? facePixels : [facePixels]);
653
- }));
654
- this.bind();
655
- WEBGLTexture.FACES.forEach((face, index) => {
656
- if (resolvedFaces[index].length > 1 && this.props.mipmaps !== false) {
657
- log.warn("".concat(this.id, " has mipmap and multiple LODs."))();
658
- }
659
-
660
- resolvedFaces[index].forEach((image, lodLevel) => {
661
- if (width && height) {
662
- gl.texImage2D(face, lodLevel, format, width, height, 0, format, type, image);
663
- } else {
664
- gl.texImage2D(face, lodLevel, format, format, type, image);
665
- }
666
- });
667
- });
668
- this.unbind();
669
- }
670
-
671
- setImageDataForFace(options) {
672
- const {
673
- face,
674
- width,
675
- height,
676
- pixels,
677
- data,
678
- format = GL.RGBA,
679
- type = GL.UNSIGNED_BYTE
680
- } = options;
681
- const {
682
- gl
683
- } = this;
684
- const imageData = pixels || data;
685
- this.bind();
686
-
687
- if (imageData instanceof Promise) {
688
- imageData.then(resolvedImageData => this.setImageDataForFace(Object.assign({}, options, {
689
- face,
690
- data: resolvedImageData,
691
- pixels: resolvedImageData
692
- })));
693
- } else if (this.width || this.height) {
694
- gl.texImage2D(face, 0, format, width, height, 0, format, type, imageData);
695
- } else {
696
- gl.texImage2D(face, 0, format, format, type, imageData);
697
- }
698
-
699
- return this;
700
- }
701
-
702
- setImageData3D(options) {
703
- const {
704
- level = 0,
705
- dataFormat,
706
- format,
707
- type,
708
- width,
709
- height,
710
- depth = 1,
711
- offset = 0,
712
- data,
713
- parameters = {}
714
- } = options;
715
- this.trackDeallocatedMemory('Texture');
716
- this.gl.bindTexture(this.target, this.handle);
717
- const webglTextureFormat = getWebGLTextureParameters(this.gl, format);
718
- withParameters(this.gl, parameters, () => {
719
- if (ArrayBuffer.isView(data)) {
720
- this.gl.texImage3D(this.target, level, webglTextureFormat.format, width, height, depth, 0, webglTextureFormat.dataFormat, webglTextureFormat.type, data);
721
- }
722
-
723
- if (data instanceof WEBGLBuffer) {
724
- this.gl.bindBuffer(GL.PIXEL_UNPACK_BUFFER, data.handle);
725
- this.gl.texImage3D(this.target, level, dataFormat, width, height, depth, 0, format, type, offset);
726
- }
727
- });
728
-
729
- if (data && data.byteLength) {
730
- this.trackAllocatedMemory(data.byteLength, 'Texture');
731
- } else {
732
- const bytesPerPixel = getTextureFormatBytesPerPixel(this.gl, this.props.format);
733
- this.trackAllocatedMemory(this.width * this.height * this.depth * bytesPerPixel, 'Texture');
734
- }
735
-
736
- this.loaded = true;
737
- return this;
738
- }
739
-
740
- _setSamplerParameters(parameters) {
741
- if (this.device.isWebGL1 && isNPOT(this.width, this.height)) {
742
- parameters = updateSamplerParametersForNPOT(parameters);
743
- }
744
-
745
- if (isObjectEmpty(parameters)) {
746
- return;
747
- }
748
-
749
- logParameters(parameters);
750
- this.gl.bindTexture(this.target, this.handle);
751
-
752
- for (const [pname, pvalue] of Object.entries(parameters)) {
753
- const param = Number(pname);
754
- let value = pvalue;
755
-
756
- switch (param) {
757
- case GL.TEXTURE_MIN_LOD:
758
- case GL.TEXTURE_MAX_LOD:
759
- this.gl.texParameterf(this.target, param, value);
760
- break;
761
-
762
- default:
763
- this.gl.texParameteri(this.target, param, value);
764
- break;
765
- }
766
- }
767
-
768
- this.gl.bindTexture(this.target, null);
769
- return;
770
- }
771
-
772
- _getWebGL1NPOTParameterOverride(pname, value) {
773
- const npot = this.device.isWebGL1 && isNPOT(this.width, this.height);
774
-
775
- if (npot) {
776
- switch (pname) {
777
- case GL.TEXTURE_MIN_FILTER:
778
- if (value !== GL.LINEAR && value !== GL.NEAREST) {
779
- return GL.LINEAR;
780
- }
781
-
782
- break;
783
-
784
- case GL.TEXTURE_WRAP_S:
785
- case GL.TEXTURE_WRAP_T:
786
- return GL.CLAMP_TO_EDGE;
787
-
788
- default:
789
- break;
790
- }
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;
791
637
  }
792
-
793
- return value;
794
- }
795
-
796
638
  }
797
-
798
- _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]);
799
-
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
800
650
  function getWebGLTextureTarget(props) {
801
- switch (props.dimension) {
802
- case '2d':
803
- return GL.TEXTURE_2D;
804
-
805
- case 'cube':
806
- return GL.TEXTURE_CUBE_MAP;
807
-
808
- case '2d-array':
809
- return GL.TEXTURE_2D_ARRAY;
810
-
811
- case '3d':
812
- return GL.TEXTURE_3D;
813
-
814
- case '1d':
815
- case 'cube-array':
816
- default:
817
- throw new Error(props.dimension);
818
- }
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':
665
+ default:
666
+ throw new Error(props.dimension);
667
+ }
819
668
  }
820
-
821
669
  function isNPOT(width, height) {
822
- if (!width || !height) {
823
- return false;
824
- }
825
-
826
- return !isPowerOfTwo(width) || !isPowerOfTwo(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);
827
675
  }
828
-
829
676
  function logParameters(parameters) {
830
- log.log(1, 'texture sampler parameters', parameters)();
677
+ log.log(1, 'texture sampler parameters', parameters)();
831
678
  }
832
- //# sourceMappingURL=webgl-texture.js.map