melonjs 14.4.0 → 15.0.0

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 (245) hide show
  1. package/LICENSE.md +1 -1
  2. package/README.md +13 -57
  3. package/dist/melonjs.mjs/_virtual/_commonjsHelpers.js +1 -1
  4. package/dist/melonjs.mjs/_virtual/arraymultimap.js +1 -1
  5. package/dist/melonjs.mjs/_virtual/earcut.js +1 -1
  6. package/dist/melonjs.mjs/_virtual/howler.js +1 -1
  7. package/dist/melonjs.mjs/_virtual/index.js +1 -1
  8. package/dist/melonjs.mjs/_virtual/index2.js +1 -1
  9. package/dist/melonjs.mjs/_virtual/multimap.js +1 -1
  10. package/dist/melonjs.mjs/_virtual/setmultimap.js +1 -1
  11. package/dist/melonjs.mjs/application/application.js +1 -1
  12. package/dist/melonjs.mjs/application/header.js +1 -1
  13. package/dist/melonjs.mjs/application/resize.js +1 -1
  14. package/dist/melonjs.mjs/application/settings.js +1 -1
  15. package/dist/melonjs.mjs/audio/audio.js +5 -7
  16. package/dist/melonjs.mjs/camera/camera2d.js +1 -1
  17. package/dist/melonjs.mjs/const.js +1 -1
  18. package/dist/melonjs.mjs/entity/entity.js +43 -9
  19. package/dist/melonjs.mjs/geometries/ellipse.js +2 -3
  20. package/dist/melonjs.mjs/geometries/line.js +1 -1
  21. package/dist/melonjs.mjs/geometries/path2d.js +20 -44
  22. package/dist/melonjs.mjs/geometries/point.js +1 -6
  23. package/dist/melonjs.mjs/geometries/poly.js +2 -5
  24. package/dist/melonjs.mjs/geometries/rectangle.js +13 -9
  25. package/dist/melonjs.mjs/geometries/roundrect.js +1 -1
  26. package/dist/melonjs.mjs/index.js +10 -6
  27. package/dist/melonjs.mjs/input/gamepad.js +10 -16
  28. package/dist/melonjs.mjs/input/input.js +1 -1
  29. package/dist/melonjs.mjs/input/keyboard.js +1 -1
  30. package/dist/melonjs.mjs/input/pointer.js +1 -1
  31. package/dist/melonjs.mjs/input/pointerevent.js +3 -17
  32. package/dist/melonjs.mjs/lang/console.js +1 -1
  33. package/dist/melonjs.mjs/lang/deprecated.js +1 -1
  34. package/dist/melonjs.mjs/level/level.js +3 -3
  35. package/dist/melonjs.mjs/level/tiled/TMXGroup.js +1 -1
  36. package/dist/melonjs.mjs/level/tiled/TMXLayer.js +1 -8
  37. package/dist/melonjs.mjs/level/tiled/TMXObject.js +1 -1
  38. package/dist/melonjs.mjs/level/tiled/TMXTile.js +1 -1
  39. package/dist/melonjs.mjs/level/tiled/TMXTileMap.js +8 -4
  40. package/dist/melonjs.mjs/level/tiled/TMXTileset.js +5 -5
  41. package/dist/melonjs.mjs/level/tiled/TMXTilesetGroup.js +1 -1
  42. package/dist/melonjs.mjs/level/tiled/TMXUtils.js +1 -1
  43. package/dist/melonjs.mjs/level/tiled/constants.js +1 -1
  44. package/dist/melonjs.mjs/level/tiled/renderer/TMXHexagonalRenderer.js +1 -1
  45. package/dist/melonjs.mjs/level/tiled/renderer/TMXIsometricRenderer.js +1 -1
  46. package/dist/melonjs.mjs/level/tiled/renderer/TMXOrthogonalRenderer.js +1 -1
  47. package/dist/melonjs.mjs/level/tiled/renderer/TMXRenderer.js +1 -1
  48. package/dist/melonjs.mjs/level/tiled/renderer/TMXStaggeredRenderer.js +1 -1
  49. package/dist/melonjs.mjs/level/tiled/renderer/autodetect.js +1 -1
  50. package/dist/melonjs.mjs/loader/cache.js +24 -0
  51. package/dist/melonjs.mjs/loader/loader.js +331 -716
  52. package/dist/melonjs.mjs/loader/loadingscreen.js +4 -4
  53. package/dist/melonjs.mjs/loader/melonjs_logo.png.js +1 -1
  54. package/dist/melonjs.mjs/loader/parser.js +281 -0
  55. package/dist/melonjs.mjs/loader/settings.js +91 -0
  56. package/dist/melonjs.mjs/math/color.js +9 -8
  57. package/dist/melonjs.mjs/math/math.js +1 -1
  58. package/dist/melonjs.mjs/math/matrix2.js +7 -9
  59. package/dist/melonjs.mjs/math/matrix3.js +18 -21
  60. package/dist/melonjs.mjs/math/observable_vector2.js +3 -3
  61. package/dist/melonjs.mjs/math/observable_vector3.js +3 -4
  62. package/dist/melonjs.mjs/math/vector2.js +3 -3
  63. package/dist/melonjs.mjs/math/vector3.js +3 -4
  64. package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/src/arraymultimap.js +1 -1
  65. package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/src/index.js +1 -1
  66. package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/src/multimap.js +1 -1
  67. package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/src/setmultimap.js +1 -1
  68. package/dist/melonjs.mjs/node_modules/earcut/src/earcut.js +1 -1
  69. package/dist/melonjs.mjs/node_modules/eventemitter3/index.js +1 -1
  70. package/dist/melonjs.mjs/node_modules/eventemitter3/index2.js +1 -1
  71. package/dist/melonjs.mjs/node_modules/howler/dist/howler.js +1 -1
  72. package/dist/melonjs.mjs/particles/emitter.js +3 -3
  73. package/dist/melonjs.mjs/particles/particle.js +1 -1
  74. package/dist/melonjs.mjs/particles/settings.js +1 -1
  75. package/dist/melonjs.mjs/physics/body.js +18 -14
  76. package/dist/melonjs.mjs/physics/bounds.js +18 -70
  77. package/dist/melonjs.mjs/physics/collision.js +1 -1
  78. package/dist/melonjs.mjs/physics/detector.js +1 -1
  79. package/dist/melonjs.mjs/physics/quadtree.js +1 -1
  80. package/dist/melonjs.mjs/physics/response.js +1 -1
  81. package/dist/melonjs.mjs/physics/sat.js +1 -1
  82. package/dist/melonjs.mjs/physics/world.js +1 -1
  83. package/dist/melonjs.mjs/plugin/plugin.js +3 -3
  84. package/dist/melonjs.mjs/renderable/collectable.js +1 -1
  85. package/dist/melonjs.mjs/renderable/colorlayer.js +1 -1
  86. package/dist/melonjs.mjs/renderable/container.js +25 -19
  87. package/dist/melonjs.mjs/renderable/dragndrop.js +1 -1
  88. package/dist/melonjs.mjs/renderable/imagelayer.js +7 -1
  89. package/dist/melonjs.mjs/renderable/light2d.js +1 -1
  90. package/dist/melonjs.mjs/renderable/nineslicesprite.js +1 -1
  91. package/dist/melonjs.mjs/renderable/renderable.js +148 -105
  92. package/dist/melonjs.mjs/renderable/sprite.js +33 -54
  93. package/dist/melonjs.mjs/renderable/trigger.js +1 -1
  94. package/dist/melonjs.mjs/renderable/ui/uibaseelement.js +1 -1
  95. package/dist/melonjs.mjs/renderable/ui/uispriteelement.js +1 -1
  96. package/dist/melonjs.mjs/renderable/ui/uitextbutton.js +1 -3
  97. package/dist/melonjs.mjs/state/stage.js +1 -1
  98. package/dist/melonjs.mjs/state/state.js +2 -2
  99. package/dist/melonjs.mjs/system/device.js +2 -2
  100. package/dist/melonjs.mjs/system/dom.js +1 -1
  101. package/dist/melonjs.mjs/system/event.js +1 -1
  102. package/dist/melonjs.mjs/system/platform.js +1 -1
  103. package/dist/melonjs.mjs/system/pooling.js +8 -18
  104. package/dist/melonjs.mjs/system/save.js +1 -1
  105. package/dist/melonjs.mjs/system/timer.js +1 -1
  106. package/dist/melonjs.mjs/text/bitmaptext.js +66 -8
  107. package/dist/melonjs.mjs/text/bitmaptextdata.js +1 -1
  108. package/dist/melonjs.mjs/text/glyph.js +1 -1
  109. package/dist/melonjs.mjs/text/text.js +56 -86
  110. package/dist/melonjs.mjs/text/textmetrics.js +1 -1
  111. package/dist/melonjs.mjs/text/textstyle.js +4 -6
  112. package/dist/melonjs.mjs/tweens/easing.js +1 -1
  113. package/dist/melonjs.mjs/tweens/interpolation.js +1 -1
  114. package/dist/melonjs.mjs/tweens/tween.js +1 -1
  115. package/dist/melonjs.mjs/utils/agent.js +1 -1
  116. package/dist/melonjs.mjs/utils/array.js +1 -1
  117. package/dist/melonjs.mjs/utils/file.js +1 -1
  118. package/dist/melonjs.mjs/utils/function.js +1 -1
  119. package/dist/melonjs.mjs/utils/string.js +2 -2
  120. package/dist/melonjs.mjs/utils/utils.js +2 -4
  121. package/dist/melonjs.mjs/video/canvas/canvas_renderer.js +7 -11
  122. package/dist/melonjs.mjs/video/renderer.js +2 -13
  123. package/dist/melonjs.mjs/video/texture/atlas.js +12 -17
  124. package/dist/melonjs.mjs/video/texture/cache.js +3 -3
  125. package/dist/melonjs.mjs/video/texture/canvas_texture.js +1 -1
  126. package/dist/melonjs.mjs/video/utils/autodetect.js +1 -1
  127. package/dist/melonjs.mjs/video/video.js +2 -2
  128. package/dist/melonjs.mjs/video/webgl/buffer/vertex.js +21 -17
  129. package/dist/melonjs.mjs/video/webgl/compositors/compositor.js +235 -0
  130. package/dist/melonjs.mjs/video/webgl/compositors/primitive_compositor.js +77 -0
  131. package/dist/melonjs.mjs/video/webgl/compositors/quad_compositor.js +249 -0
  132. package/dist/melonjs.mjs/video/webgl/{webgl_compositor.js → compositors/webgl_compositor.js} +20 -205
  133. package/dist/melonjs.mjs/video/webgl/glshader.js +1 -1
  134. package/dist/melonjs.mjs/video/webgl/shaders/primitive.frag.js +1 -1
  135. package/dist/melonjs.mjs/video/webgl/shaders/primitive.vert.js +2 -2
  136. package/dist/melonjs.mjs/video/webgl/shaders/quad.frag.js +1 -1
  137. package/dist/melonjs.mjs/video/webgl/shaders/quad.vert.js +2 -2
  138. package/dist/melonjs.mjs/video/webgl/utils/attributes.js +1 -1
  139. package/dist/melonjs.mjs/video/webgl/utils/precision.js +1 -1
  140. package/dist/melonjs.mjs/video/webgl/utils/program.js +1 -1
  141. package/dist/melonjs.mjs/video/webgl/utils/string.js +1 -1
  142. package/dist/melonjs.mjs/video/webgl/utils/uniforms.js +1 -1
  143. package/dist/melonjs.mjs/video/webgl/webgl_renderer.js +139 -149
  144. package/dist/melonjs.module.js +26320 -26376
  145. package/dist/types/entity/entity.d.ts +3 -3
  146. package/dist/types/geometries/path2d.d.ts +5 -31
  147. package/dist/types/geometries/point.d.ts +2 -7
  148. package/dist/types/geometries/poly.d.ts +0 -1
  149. package/dist/types/index.d.ts +5 -3
  150. package/dist/types/loader/cache.d.ts +7 -0
  151. package/dist/types/loader/loader.d.ts +166 -181
  152. package/dist/types/loader/parser.d.ts +41 -0
  153. package/dist/types/loader/settings.d.ts +57 -0
  154. package/dist/types/particles/emitter.d.ts +4 -4
  155. package/dist/types/physics/bounds.d.ts +29 -84
  156. package/dist/types/renderable/container.d.ts +0 -11
  157. package/dist/types/renderable/renderable.d.ts +43 -31
  158. package/dist/types/renderable/sprite.d.ts +3 -3
  159. package/dist/types/renderable/ui/uitextbutton.d.ts +0 -1
  160. package/dist/types/state/state.d.ts +1 -1
  161. package/dist/types/system/pooling.d.ts +2 -2
  162. package/dist/types/text/text.d.ts +6 -20
  163. package/dist/types/text/textstyle.d.ts +1 -1
  164. package/dist/types/video/canvas/canvas_renderer.d.ts +0 -5
  165. package/dist/types/video/renderer.d.ts +1 -5
  166. package/dist/types/video/webgl/buffer/vertex.d.ts +3 -3
  167. package/dist/types/video/webgl/compositors/compositor.d.ts +107 -0
  168. package/dist/types/video/webgl/compositors/primitive_compositor.d.ts +22 -0
  169. package/dist/types/video/webgl/compositors/quad_compositor.d.ts +72 -0
  170. package/dist/types/video/webgl/compositors/webgl_compositor.d.ts +86 -0
  171. package/dist/types/video/webgl/webgl_compositor.d.ts +2 -3
  172. package/dist/types/video/webgl/webgl_renderer.d.ts +34 -28
  173. package/package.json +18 -18
  174. package/src/audio/audio.js +4 -6
  175. package/src/entity/entity.js +42 -8
  176. package/src/geometries/ellipse.js +1 -2
  177. package/src/geometries/path2d.js +19 -43
  178. package/src/geometries/point.js +0 -5
  179. package/src/geometries/poly.js +1 -4
  180. package/src/geometries/rectangle.js +12 -8
  181. package/src/index.js +7 -3
  182. package/src/input/gamepad.js +9 -15
  183. package/src/input/pointerevent.js +1 -15
  184. package/src/level/level.js +2 -2
  185. package/src/level/tiled/TMXLayer.js +0 -7
  186. package/src/level/tiled/TMXTileMap.js +7 -3
  187. package/src/level/tiled/TMXTileset.js +4 -4
  188. package/src/loader/cache.js +16 -0
  189. package/src/loader/loader.js +339 -711
  190. package/src/loader/loadingscreen.js +3 -3
  191. package/src/loader/parser.js +279 -0
  192. package/src/loader/settings.js +85 -0
  193. package/src/math/color.js +8 -7
  194. package/src/math/matrix2.js +6 -8
  195. package/src/math/matrix3.js +17 -20
  196. package/src/math/observable_vector2.js +2 -2
  197. package/src/math/observable_vector3.js +2 -3
  198. package/src/math/vector2.js +2 -2
  199. package/src/math/vector3.js +2 -3
  200. package/src/particles/emitter.js +2 -2
  201. package/src/physics/body.js +17 -13
  202. package/src/physics/bounds.js +17 -69
  203. package/src/polyfill/index.js +0 -2
  204. package/src/renderable/container.js +24 -18
  205. package/src/renderable/imagelayer.js +6 -0
  206. package/src/renderable/renderable.js +147 -104
  207. package/src/renderable/sprite.js +32 -53
  208. package/src/renderable/ui/uitextbutton.js +0 -2
  209. package/src/state/state.js +1 -1
  210. package/src/system/device.js +1 -1
  211. package/src/system/pooling.js +7 -17
  212. package/src/text/bitmaptext.js +65 -7
  213. package/src/text/text.js +55 -85
  214. package/src/text/textstyle.js +3 -5
  215. package/src/utils/string.js +1 -1
  216. package/src/utils/utils.js +1 -3
  217. package/src/video/canvas/canvas_renderer.js +5 -9
  218. package/src/video/renderer.js +0 -11
  219. package/src/video/texture/atlas.js +11 -16
  220. package/src/video/texture/cache.js +2 -2
  221. package/src/video/video.js +1 -1
  222. package/src/video/webgl/buffer/vertex.js +20 -16
  223. package/src/video/webgl/compositors/compositor.js +226 -0
  224. package/src/video/webgl/compositors/primitive_compositor.js +68 -0
  225. package/src/video/webgl/compositors/quad_compositor.js +240 -0
  226. package/src/video/webgl/shaders/primitive.vert +2 -5
  227. package/src/video/webgl/shaders/quad.vert +3 -1
  228. package/src/video/webgl/webgl_renderer.js +137 -147
  229. package/dist/melonjs.mjs/_virtual/make-built-in.js +0 -10
  230. package/dist/melonjs.mjs/_virtual/object-define-property.js +0 -10
  231. package/dist/melonjs.mjs/_virtual/object-get-own-property-descriptor.js +0 -10
  232. package/dist/melonjs.mjs/_virtual/object-get-own-property-names.js +0 -10
  233. package/dist/melonjs.mjs/_virtual/object-get-own-property-symbols.js +0 -10
  234. package/dist/melonjs.mjs/_virtual/object-property-is-enumerable.js +0 -10
  235. package/dist/melonjs.mjs/_virtual/shared.js +0 -10
  236. package/dist/melonjs.mjs/game.js +0 -29
  237. package/dist/melonjs.mjs/polyfill/console.js +0 -18
  238. package/dist/melonjs.mjs/polyfill/performance.js +0 -27
  239. package/dist/melonjs.mjs/polyfill/requestAnimationFrame.js +0 -46
  240. package/dist/melonjs.mjs/polyfill/roundrect.js +0 -242
  241. package/dist/melonjs.mjs/renderable/re_container.js +0 -1016
  242. package/dist/melonjs.mjs/video/utils/resize.js +0 -116
  243. package/src/polyfill/performance.js +0 -20
  244. package/src/polyfill/requestAnimationFrame.js +0 -39
  245. package/src/video/webgl/webgl_compositor.js +0 -486
@@ -0,0 +1,226 @@
1
+ import VertexArrayBuffer from "../buffer/vertex.js";
2
+ import GLShader from "../glshader.js";
3
+
4
+ /**
5
+ * @classdesc
6
+ * A base Compositor object.
7
+ */
8
+ export default class Compositor {
9
+ /**
10
+ * @param {WebGLRenderer} renderer - the current WebGL renderer session
11
+ * @param {Object} settings - additional settings to initialize this compositors
12
+ * @param {object[]} attribute - an array of attributes definition
13
+ * @param {string} attribute.name - name of the attribute in the vertex shader
14
+ * @param {number} attribute.size - number of components per vertex attribute. Must be 1, 2, 3, or 4.
15
+ * @param {GLenum} attribute.type - data type of each component in the array
16
+ * @param {boolean} attribute.normalized - whether integer data values should be normalized into a certain range when being cast to a float
17
+ * @param {number} attribute.offset - offset in bytes of the first component in the vertex attribute array
18
+ * @param {object} shader - an array of attributes definition
19
+ * @param {string} shader.vertex - a string containing the GLSL source code to set
20
+ * @param {string} shader.fragment - a string containing the GLSL source code to set
21
+ */
22
+ constructor (renderer, settings) {
23
+ this.init(renderer, settings);
24
+ }
25
+
26
+ /**
27
+ * Initialize the compositor
28
+ * @ignore
29
+ */
30
+ init (renderer, settings) {
31
+ // the associated renderer
32
+ this.renderer = renderer;
33
+
34
+ // WebGL context
35
+ this.gl = renderer.gl;
36
+
37
+ // Global fill color
38
+ this.color = renderer.currentColor;
39
+
40
+ // Global transformation matrix
41
+ this.viewMatrix = renderer.currentTransform;
42
+
43
+ /**
44
+ * the default shader created by this compositor
45
+ * @type {GLShader}
46
+ */
47
+ this.defaultShader = undefined;
48
+
49
+ /**
50
+ * the shader currently used by this compositor
51
+ * @type {GLShader}
52
+ */
53
+ this.currentShader = undefined;
54
+
55
+ /**
56
+ * primitive type to render (gl.POINTS, gl.LINE_STRIP, gl.LINE_LOOP, gl.LINES, gl.TRIANGLE_STRIP, gl.TRIANGLE_FAN, gl.TRIANGLES)
57
+ * @type {number}
58
+ * @default gl.TRIANGLES
59
+ */
60
+ this.mode = this.gl.TRIANGLES;
61
+
62
+ /**
63
+ * an array of vertex attribute properties
64
+ * @see WebGLCompositor.addAttribute
65
+ * @type {Array}
66
+ */
67
+ this.attributes = [];
68
+
69
+ /**
70
+ * the size of a single vertex in bytes
71
+ * (will automatically be calculated as attributes definitions are added)
72
+ * @see WebGLCompositor.addAttribute
73
+ * @type {number}
74
+ */
75
+ this.vertexByteSize = 0;
76
+
77
+ /**
78
+ * the size of a single vertex in floats
79
+ * (will automatically be calculated as attributes definitions are added)
80
+ * @see WebGLCompositor.addAttribute
81
+ * @type {number}
82
+ */
83
+ this.vertexSize = 0;
84
+
85
+ /**
86
+ * the vertex data buffer used by this compositor
87
+ * @type {VertexArrayBuffer}
88
+ */
89
+ this.vertexData = null;
90
+
91
+ // parse given attibrutes
92
+ if (typeof settings !== "undefined" && Array.isArray(settings.attributes)) {
93
+ settings.attributes.forEach((attr) => {
94
+ this.addAttribute(attr.name, attr.size, attr.type, attr.normalized, attr.offset);
95
+ this.vertexData = new VertexArrayBuffer(this.vertexSize, 6);
96
+ });
97
+ } else {
98
+ throw new Error("attributes definition missing");
99
+ }
100
+
101
+ // parse and instantiate the default shader
102
+ if (typeof settings !== "undefined" && typeof settings.shader !== "undefined") {
103
+ this.defaultShader = new GLShader(this.gl, settings.shader.vertex, settings.shader.fragment);
104
+ } else {
105
+ throw new Error("shader definition missing");
106
+ }
107
+ }
108
+
109
+ /**
110
+ * Reset compositor internal state
111
+ * @ignore
112
+ */
113
+ reset() {
114
+ // WebGL context
115
+ this.gl = this.renderer.gl;
116
+
117
+ // clear the vertex data buffer
118
+ this.vertexData.clear();
119
+ }
120
+
121
+ /**
122
+ * @ignore
123
+ * called by the WebGL renderer when a compositor become the current one
124
+ */
125
+ bind() {
126
+ if (this.renderer.currentProgram !== this.defaultShader.program) {
127
+ this.useShader(this.defaultShader);
128
+ }
129
+ }
130
+
131
+ /**
132
+ * Select the shader to use for compositing
133
+ * @see GLShader
134
+ * @param {GLShader} shader - a reference to a GLShader instance
135
+ */
136
+ useShader(shader) {
137
+ if (this.renderer.currentProgram !== shader.program) {
138
+ this.flush();
139
+ shader.bind();
140
+ shader.setUniform("uProjectionMatrix", this.renderer.projectionMatrix);
141
+ shader.setVertexAttributes(this.gl, this.attributes, this.vertexByteSize);
142
+
143
+ this.currentShader = shader;
144
+ this.renderer.currentProgram = this.currentShader.program;
145
+ }
146
+ }
147
+
148
+ /**
149
+ * add vertex attribute property definition to the compositor
150
+ * @param {string} name - name of the attribute in the vertex shader
151
+ * @param {number} size - number of components per vertex attribute. Must be 1, 2, 3, or 4.
152
+ * @param {GLenum} type - data type of each component in the array
153
+ * @param {boolean} normalized - whether integer data values should be normalized into a certain range when being cast to a float
154
+ * @param {number} offset - offset in bytes of the first component in the vertex attribute array
155
+ */
156
+ addAttribute(name, size, type, normalized, offset) {
157
+ this.attributes.push({
158
+ name: name,
159
+ size: size,
160
+ type: type,
161
+ normalized: normalized,
162
+ offset: offset
163
+ });
164
+
165
+ switch (type) {
166
+ case this.gl.BYTE:
167
+ this.vertexByteSize += size * Int8Array.BYTES_PER_ELEMENT;
168
+ break;
169
+ case this.gl.UNSIGNED_BYTE:
170
+ this.vertexByteSize += size * Uint8Array.BYTES_PER_ELEMENT;
171
+ break;
172
+ case this.gl.SHORT:
173
+ this.vertexByteSize += size * Int16Array.BYTES_PER_ELEMENT;
174
+ break;
175
+ case this.gl.UNSIGNED_SHORT:
176
+ this.vertexByteSize += size * Uint16Array.BYTES_PER_ELEMENT;
177
+ break;
178
+ case this.gl.INT:
179
+ this.vertexByteSize += size * Int32Array.BYTES_PER_ELEMENT;
180
+ break;
181
+ case this.gl.UNSIGNED_INT:
182
+ this.vertexByteSize += size * Uint32Array.BYTES_PER_ELEMENT;
183
+ break;
184
+ case this.gl.FLOAT:
185
+ this.vertexByteSize += size * Float32Array.BYTES_PER_ELEMENT;
186
+ break;
187
+ default:
188
+ throw new Error("Invalid GL Attribute type");
189
+ }
190
+ this.vertexSize = this.vertexByteSize / Float32Array.BYTES_PER_ELEMENT;
191
+ }
192
+
193
+ /**
194
+ * set/change the current projection matrix
195
+ * @param {Matrix3d} matrix
196
+ */
197
+ setProjection(matrix) {
198
+ this.currentShader.setUniform("uProjectionMatrix", matrix);
199
+ }
200
+
201
+ /**
202
+ * Flush batched vertex data to the GPU
203
+ * @param {number} [mode=gl.TRIANGLES] - the GL drawing mode
204
+ */
205
+ flush(mode = this.mode) {
206
+ var vertex = this.vertexData;
207
+ var vertexCount = vertex.vertexCount;
208
+
209
+ if (vertexCount > 0) {
210
+ var gl = this.gl;
211
+ var vertexSize = vertex.vertexSize;
212
+
213
+ // Copy data into stream buffer
214
+ if (this.renderer.WebGLVersion > 1) {
215
+ gl.bufferData(gl.ARRAY_BUFFER, vertex.toFloat32(), gl.STREAM_DRAW, 0, vertexCount * vertexSize);
216
+ } else {
217
+ gl.bufferData(gl.ARRAY_BUFFER, vertex.toFloat32(0, vertexCount * vertexSize), gl.STREAM_DRAW);
218
+ }
219
+
220
+ gl.drawArrays(mode, 0, vertexCount);
221
+
222
+ // clear the vertex buffer
223
+ vertex.clear();
224
+ }
225
+ }
226
+ }
@@ -0,0 +1,68 @@
1
+ import primitiveVertex from "./../shaders/primitive.vert";
2
+ import primitiveFragment from "./../shaders/primitive.frag";
3
+ import Compositor from "./compositor.js";
4
+
5
+ /**
6
+ * @classdesc
7
+ * A WebGL Compositor object. This class handles all of the WebGL state<br>
8
+ * Pushes texture regions or shape geometry into WebGL buffers, automatically flushes to GPU
9
+ * @augments Compositor
10
+ */
11
+ export default class PrimitiveCompositor extends Compositor {
12
+
13
+ /**
14
+ * Initialize the compositor
15
+ * @ignore
16
+ */
17
+ init(renderer) {
18
+ super.init(renderer, {
19
+ attributes: [
20
+ {name: "aVertex", size: 2, type: renderer.gl.FLOAT, normalized: false, offset: 0 * Float32Array.BYTES_PER_ELEMENT},
21
+ {name: "aColor", size: 4, type: renderer.gl.UNSIGNED_BYTE, normalized: true, offset: 2 * Float32Array.BYTES_PER_ELEMENT}
22
+ ],
23
+ shader: {
24
+ vertex: primitiveVertex, fragment: primitiveFragment
25
+ }
26
+ });
27
+ }
28
+
29
+ /**
30
+ * Draw an array of vertices
31
+ * @param {GLenum} mode - primitive type to render (gl.POINTS, gl.LINE_STRIP, gl.LINE_LOOP, gl.LINES, gl.TRIANGLE_STRIP, gl.TRIANGLE_FAN, gl.TRIANGLES)
32
+ * @param {Point[]} verts - an array of vertices
33
+ * @param {number} [vertexCount=verts.length] - amount of points defined in the points array
34
+ */
35
+ drawVertices(mode, verts, vertexCount = verts.length) {
36
+ var viewMatrix = this.viewMatrix;
37
+ var vertexData = this.vertexData;
38
+ var color = this.renderer.currentColor;
39
+ var alpha = this.renderer.getGlobalAlpha();
40
+
41
+ if (vertexData.isFull(vertexCount)) {
42
+ // is the vertex buffer full if we add more vertices
43
+ this.flush();
44
+ }
45
+
46
+ // flush if drawing vertices with a different drawing mode
47
+ if (mode !== this.mode) {
48
+ this.flush(this.mode);
49
+ this.mode = mode;
50
+ }
51
+
52
+ if (!viewMatrix.isIdentity()) {
53
+ verts.forEach((vert) => {
54
+ viewMatrix.apply(vert);
55
+ vertexData.push(vert.x, vert.y, undefined, undefined, color.toUint32(alpha));
56
+ });
57
+ } else {
58
+ verts.forEach((vert) => {
59
+ vertexData.push(vert.x, vert.y, undefined, undefined, color.toUint32(alpha));
60
+ });
61
+ }
62
+
63
+ // force flush for primitive using LINE_STRIP or LINE_LOOP
64
+ if (this.mode === this.gl.LINE_STRIP || this.mode === this.gl.LINE_LOOP) {
65
+ this.flush(this.mode);
66
+ }
67
+ }
68
+ }
@@ -0,0 +1,240 @@
1
+ import Vector2d from "../../../math/vector2.js";
2
+ import { isPowerOfTwo } from "../../../math/math.js";
3
+ import quadVertex from "./../shaders/quad.vert";
4
+ import quadFragment from "./../shaders/quad.frag";
5
+ import Compositor from "./compositor.js";
6
+
7
+ // a pool of resuable vectors
8
+ var V_ARRAY = [
9
+ new Vector2d(),
10
+ new Vector2d(),
11
+ new Vector2d(),
12
+ new Vector2d()
13
+ ];
14
+
15
+ /**
16
+ * @classdesc
17
+ * A WebGL Compositor object. This class handles all of the WebGL state<br>
18
+ * Pushes texture regions or shape geometry into WebGL buffers, automatically flushes to GPU
19
+ * @augments Compositor
20
+ */
21
+ export default class QuadCompositor extends Compositor {
22
+
23
+ /**
24
+ * Initialize the compositor
25
+ * @ignore
26
+ */
27
+ init (renderer) {
28
+ super.init(renderer, {
29
+ attributes: [
30
+ {name: "aVertex", size: 2, type: renderer.gl.FLOAT, normalized: false, offset: 0 * Float32Array.BYTES_PER_ELEMENT},
31
+ {name: "aRegion", size: 2, type: renderer.gl.FLOAT, normalized: false, offset: 2 * Float32Array.BYTES_PER_ELEMENT},
32
+ {name: "aColor", size: 4, type: renderer.gl.UNSIGNED_BYTE, normalized: true, offset: 4 * Float32Array.BYTES_PER_ELEMENT}
33
+ ],
34
+ shader: {
35
+ vertex: quadVertex, fragment: quadFragment
36
+ }
37
+ });
38
+
39
+ // list of active texture units
40
+ this.currentTextureUnit = -1;
41
+ this.boundTextures = [];
42
+ }
43
+
44
+ /**
45
+ * Reset compositor internal state
46
+ * @ignore
47
+ */
48
+ reset() {
49
+ super.reset();
50
+
51
+ // delete all related bound texture
52
+ for (var i = 0; i < this.renderer.maxTextures; i++) {
53
+ var texture2D = this.getTexture2D(i);
54
+ if (typeof texture2D !== "undefined") {
55
+ this.deleteTexture2D(texture2D);
56
+ }
57
+ }
58
+ this.currentTextureUnit = -1;
59
+ }
60
+
61
+ /**
62
+ * Create a WebGL texture from an image
63
+ * @param {number} unit - Destination texture unit
64
+ * @param {Image|HTMLCanvasElement|ImageData|Uint8Array[]|Float32Array[]} [pixels=null] - Source image
65
+ * @param {number} filter - gl.LINEAR or gl.NEAREST
66
+ * @param {string} [repeat="no-repeat"] - Image repeat behavior (see {@link ImageLayer#repeat})
67
+ * @param {number} [w=pixels.width] - Source image width (Only use with UInt8Array[] or Float32Array[] source image)
68
+ * @param {number} [h=pixels.height] - Source image height (Only use with UInt8Array[] or Float32Array[] source image)
69
+ * @param {boolean} [premultipliedAlpha=true] - Multiplies the alpha channel into the other color channels
70
+ * @param {boolean} [mipmap=true] - Whether mipmap levels should be generated for this texture
71
+ * @returns {WebGLTexture} a WebGL texture
72
+ */
73
+ createTexture2D(unit, pixels = null, filter, repeat = "no-repeat", w = pixels.width, h = pixels.height, premultipliedAlpha = true, mipmap = true) {
74
+ var gl = this.gl;
75
+ var isPOT = isPowerOfTwo(w) && isPowerOfTwo(h);
76
+ var rs = (repeat.search(/^repeat(-x)?$/) === 0) && (isPOT || this.renderer.WebGLVersion > 1) ? gl.REPEAT : gl.CLAMP_TO_EDGE;
77
+ var rt = (repeat.search(/^repeat(-y)?$/) === 0) && (isPOT || this.renderer.WebGLVersion > 1) ? gl.REPEAT : gl.CLAMP_TO_EDGE;
78
+
79
+ var texture = gl.createTexture();
80
+
81
+ this.bindTexture2D(texture, unit);
82
+
83
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, rs);
84
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, rt);
85
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);
86
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);
87
+
88
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, premultipliedAlpha);
89
+
90
+ if (pixels === null || typeof pixels.byteLength !== "undefined") {
91
+ // if pixels is undefined, or if it's Uint8Array/Float32Array TypedArray
92
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, w, h, 0, gl.RGBA, gl.UNSIGNED_BYTE, pixels, 0);
93
+ } else {
94
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
95
+ }
96
+
97
+ // generate the sprite mimap (used when scaling) if a PowerOfTwo texture
98
+ if (isPOT && mipmap === true) {
99
+ gl.generateMipmap(gl.TEXTURE_2D);
100
+ }
101
+
102
+ return texture;
103
+ }
104
+
105
+ /**
106
+ * delete the given WebGL texture
107
+ * @param {WebGLTexture} [texture] - a WebGL texture to delete
108
+ * @param {number} [unit] - Texture unit to delete
109
+ */
110
+ deleteTexture2D(texture) {
111
+ this.gl.deleteTexture(texture);
112
+ this.unbindTexture2D(texture);
113
+ }
114
+
115
+ /**
116
+ * returns the WebGL texture associated to the given texture unit
117
+ * @param {number} unit - Texture unit to which a texture is bound
118
+ * @returns {WebGLTexture} texture a WebGL texture
119
+ */
120
+ getTexture2D(unit) {
121
+ return this.boundTextures[unit];
122
+ }
123
+
124
+ /**
125
+ * assign the given WebGL texture to the current batch
126
+ * @param {WebGLTexture} texture - a WebGL texture
127
+ * @param {number} unit - Texture unit to which the given texture is bound
128
+ */
129
+ bindTexture2D(texture, unit) {
130
+ var gl = this.gl;
131
+
132
+ if (texture !== this.boundTextures[unit]) {
133
+ this.flush();
134
+ if (this.currentTextureUnit !== unit) {
135
+ this.currentTextureUnit = unit;
136
+ gl.activeTexture(gl.TEXTURE0 + unit);
137
+ }
138
+
139
+ gl.bindTexture(gl.TEXTURE_2D, texture);
140
+ this.boundTextures[unit] = texture;
141
+
142
+ } else if (this.currentTextureUnit !== unit) {
143
+ this.flush();
144
+ this.currentTextureUnit = unit;
145
+ gl.activeTexture(gl.TEXTURE0 + unit);
146
+ }
147
+ }
148
+
149
+ /**
150
+ * unbind the given WebGL texture, forcing it to be reuploaded
151
+ * @param {WebGLTexture} [texture] - a WebGL texture
152
+ * @param {number} [unit] - a WebGL texture
153
+ * @returns {number} unit the unit number that was associated with the given texture
154
+ */
155
+ unbindTexture2D(texture, unit) {
156
+ if (typeof unit === "undefined") {
157
+ unit = this.boundTextures.indexOf(texture);
158
+ }
159
+ if (unit !== -1) {
160
+ delete this.boundTextures[unit];
161
+ if (unit === this.currentTextureUnit) {
162
+ this.currentTextureUnit = -1;
163
+ }
164
+ }
165
+ return unit;
166
+ }
167
+
168
+ /**
169
+ * @ignore
170
+ */
171
+ uploadTexture(texture, w, h, force = false) {
172
+ var unit = this.renderer.cache.getUnit(texture);
173
+ var texture2D = this.boundTextures[unit];
174
+
175
+ if (typeof texture2D === "undefined" || force) {
176
+ this.createTexture2D(
177
+ unit,
178
+ texture.getTexture(),
179
+ this.renderer.settings.antiAlias ? this.gl.LINEAR : this.gl.NEAREST,
180
+ texture.repeat,
181
+ w,
182
+ h,
183
+ texture.premultipliedAlpha
184
+ );
185
+ } else {
186
+ this.bindTexture2D(texture2D, unit);
187
+ }
188
+
189
+ return this.currentTextureUnit;
190
+ }
191
+
192
+ /**
193
+ * Add a textured quad
194
+ * @param {TextureAtlas} texture - Source texture atlas
195
+ * @param {number} x - Destination x-coordinate
196
+ * @param {number} y - Destination y-coordinate
197
+ * @param {number} w - Destination width
198
+ * @param {number} h - Destination height
199
+ * @param {number} u0 - Texture UV (u0) value.
200
+ * @param {number} v0 - Texture UV (v0) value.
201
+ * @param {number} u1 - Texture UV (u1) value.
202
+ * @param {number} v1 - Texture UV (v1) value.
203
+ * @param {number} tint - tint color to be applied to the texture in UINT32 (argb) format
204
+ */
205
+ addQuad(texture, x, y, w, h, u0, v0, u1, v1, tint) {
206
+ var vertexData = this.vertexData;
207
+
208
+ if (vertexData.isFull(6)) {
209
+ // is the vertex buffer full if we add 6 more vertices
210
+ this.flush();
211
+ }
212
+
213
+ // upload and activate the texture if necessary
214
+ var unit = this.uploadTexture(texture);
215
+
216
+ // set fragment sampler accordingly
217
+ this.currentShader.setUniform("uSampler", unit);
218
+
219
+ // Transform vertices
220
+ var m = this.viewMatrix,
221
+ vec0 = V_ARRAY[0].set(x, y),
222
+ vec1 = V_ARRAY[1].set(x + w, y),
223
+ vec2 = V_ARRAY[2].set(x, y + h),
224
+ vec3 = V_ARRAY[3].set(x + w, y + h);
225
+
226
+ if (!m.isIdentity()) {
227
+ m.apply(vec0);
228
+ m.apply(vec1);
229
+ m.apply(vec2);
230
+ m.apply(vec3);
231
+ }
232
+
233
+ vertexData.push(vec0.x, vec0.y, u0, v0, tint);
234
+ vertexData.push(vec1.x, vec1.y, u1, v0, tint);
235
+ vertexData.push(vec2.x, vec2.y, u0, v1, tint);
236
+ vertexData.push(vec2.x, vec2.y, u0, v1, tint);
237
+ vertexData.push(vec1.x, vec1.y, u1, v0, tint);
238
+ vertexData.push(vec3.x, vec3.y, u1, v1, tint);
239
+ }
240
+ }
@@ -1,18 +1,15 @@
1
1
  // Current vertex point
2
2
  attribute vec2 aVertex;
3
+ attribute vec4 aColor;
3
4
 
4
5
  // Projection matrix
5
6
  uniform mat4 uProjectionMatrix;
6
7
 
7
- // Vertex color
8
- uniform vec4 uColor;
9
-
10
- // Fragment color
11
8
  varying vec4 vColor;
12
9
 
13
10
  void main(void) {
14
11
  // Transform the vertex position by the projection matrix
15
12
  gl_Position = uProjectionMatrix * vec4(aVertex, 0.0, 1.0);
16
13
  // Pass the remaining attributes to the fragment shader
17
- vColor = vec4(uColor.rgb * uColor.a, uColor.a);
14
+ vColor = vec4(aColor.bgr * aColor.a, aColor.a);
18
15
  }
@@ -1,7 +1,9 @@
1
+ // Current vertex point
1
2
  attribute vec2 aVertex;
2
3
  attribute vec2 aRegion;
3
4
  attribute vec4 aColor;
4
5
 
6
+ // Projection matrix
5
7
  uniform mat4 uProjectionMatrix;
6
8
 
7
9
  varying vec2 vRegion;
@@ -9,7 +11,7 @@ varying vec4 vColor;
9
11
 
10
12
  void main(void) {
11
13
  // Transform the vertex position by the projection matrix
12
- gl_Position = uProjectionMatrix * vec4(aVertex, 0.0, 1.0);
14
+ gl_Position = uProjectionMatrix * vec4(aVertex, 0.0, 1.0);
13
15
  // Pass the remaining attributes to the fragment shader
14
16
  vColor = vec4(aColor.bgr * aColor.a, aColor.a);
15
17
  vRegion = aRegion;