melonjs 14.5.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 (195) hide show
  1. package/LICENSE.md +1 -1
  2. package/README.md +2 -2
  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 +2 -4
  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 +1 -1
  19. package/dist/melonjs.mjs/geometries/ellipse.js +1 -1
  20. package/dist/melonjs.mjs/geometries/line.js +1 -1
  21. package/dist/melonjs.mjs/geometries/path2d.js +4 -4
  22. package/dist/melonjs.mjs/geometries/point.js +1 -1
  23. package/dist/melonjs.mjs/geometries/poly.js +1 -1
  24. package/dist/melonjs.mjs/geometries/rectangle.js +1 -1
  25. package/dist/melonjs.mjs/geometries/roundrect.js +1 -1
  26. package/dist/melonjs.mjs/index.js +5 -3
  27. package/dist/melonjs.mjs/input/gamepad.js +1 -1
  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 +2 -2
  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 +1 -1
  35. package/dist/melonjs.mjs/level/tiled/TMXGroup.js +1 -1
  36. package/dist/melonjs.mjs/level/tiled/TMXLayer.js +1 -1
  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 +1 -1
  40. package/dist/melonjs.mjs/level/tiled/TMXTileset.js +1 -1
  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 +1 -1
  51. package/dist/melonjs.mjs/loader/loader.js +1 -1
  52. package/dist/melonjs.mjs/loader/loadingscreen.js +1 -1
  53. package/dist/melonjs.mjs/loader/melonjs_logo.png.js +1 -1
  54. package/dist/melonjs.mjs/loader/parser.js +1 -1
  55. package/dist/melonjs.mjs/loader/settings.js +1 -1
  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 +1 -1
  59. package/dist/melonjs.mjs/math/matrix3.js +1 -1
  60. package/dist/melonjs.mjs/math/observable_vector2.js +1 -1
  61. package/dist/melonjs.mjs/math/observable_vector3.js +1 -1
  62. package/dist/melonjs.mjs/math/vector2.js +1 -1
  63. package/dist/melonjs.mjs/math/vector3.js +1 -1
  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 +1 -1
  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 +1 -1
  76. package/dist/melonjs.mjs/physics/bounds.js +1 -1
  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 +1 -1
  87. package/dist/melonjs.mjs/renderable/dragndrop.js +1 -1
  88. package/dist/melonjs.mjs/renderable/imagelayer.js +1 -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 +25 -3
  92. package/dist/melonjs.mjs/renderable/sprite.js +1 -1
  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 +1 -1
  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 +1 -1
  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 +1 -1
  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 +1 -1
  120. package/dist/melonjs.mjs/utils/utils.js +1 -1
  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 +3 -9
  124. package/dist/melonjs.mjs/video/texture/cache.js +1 -1
  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 +1 -1
  128. package/dist/melonjs.mjs/video/webgl/buffer/vertex.js +21 -17
  129. package/dist/melonjs.mjs/video/webgl/compositors/compositor.js +77 -77
  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/compositors/webgl_compositor.js +1 -1
  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 +25111 -25202
  145. package/dist/types/entity/entity.d.ts +1 -1
  146. package/dist/types/index.d.ts +4 -2
  147. package/dist/types/renderable/renderable.d.ts +6 -0
  148. package/dist/types/renderable/ui/uitextbutton.d.ts +0 -1
  149. package/dist/types/text/text.d.ts +6 -20
  150. package/dist/types/text/textstyle.d.ts +1 -1
  151. package/dist/types/video/canvas/canvas_renderer.d.ts +0 -5
  152. package/dist/types/video/renderer.d.ts +1 -5
  153. package/dist/types/video/webgl/buffer/vertex.d.ts +3 -3
  154. package/dist/types/video/webgl/compositors/compositor.d.ts +38 -32
  155. package/dist/types/video/webgl/compositors/primitive_compositor.d.ts +22 -0
  156. package/dist/types/video/webgl/compositors/quad_compositor.d.ts +72 -0
  157. package/dist/types/video/webgl/webgl_renderer.d.ts +34 -28
  158. package/package.json +13 -14
  159. package/src/audio/audio.js +1 -3
  160. package/src/geometries/path2d.js +3 -3
  161. package/src/index.js +6 -2
  162. package/src/math/color.js +8 -7
  163. package/src/polyfill/index.js +0 -2
  164. package/src/renderable/renderable.js +24 -2
  165. package/src/renderable/ui/uitextbutton.js +0 -2
  166. package/src/system/device.js +1 -1
  167. package/src/text/text.js +55 -85
  168. package/src/text/textstyle.js +3 -5
  169. package/src/video/canvas/canvas_renderer.js +5 -9
  170. package/src/video/renderer.js +0 -11
  171. package/src/video/texture/atlas.js +2 -8
  172. package/src/video/webgl/buffer/vertex.js +20 -16
  173. package/src/video/webgl/compositors/compositor.js +76 -77
  174. package/src/video/webgl/compositors/primitive_compositor.js +68 -0
  175. package/src/video/webgl/compositors/{webgl_compositor.js → quad_compositor.js} +38 -98
  176. package/src/video/webgl/shaders/primitive.vert +2 -5
  177. package/src/video/webgl/shaders/quad.vert +3 -1
  178. package/src/video/webgl/webgl_renderer.js +137 -147
  179. package/dist/melonjs.mjs/_virtual/make-built-in.js +0 -10
  180. package/dist/melonjs.mjs/_virtual/object-define-property.js +0 -10
  181. package/dist/melonjs.mjs/_virtual/object-get-own-property-descriptor.js +0 -10
  182. package/dist/melonjs.mjs/_virtual/object-get-own-property-names.js +0 -10
  183. package/dist/melonjs.mjs/_virtual/object-get-own-property-symbols.js +0 -10
  184. package/dist/melonjs.mjs/_virtual/object-property-is-enumerable.js +0 -10
  185. package/dist/melonjs.mjs/_virtual/shared.js +0 -10
  186. package/dist/melonjs.mjs/game.js +0 -29
  187. package/dist/melonjs.mjs/polyfill/console.js +0 -18
  188. package/dist/melonjs.mjs/polyfill/performance.js +0 -27
  189. package/dist/melonjs.mjs/polyfill/requestAnimationFrame.js +0 -46
  190. package/dist/melonjs.mjs/polyfill/roundrect.js +0 -242
  191. package/dist/melonjs.mjs/renderable/re_container.js +0 -1016
  192. package/dist/melonjs.mjs/video/utils/resize.js +0 -116
  193. package/dist/melonjs.mjs/video/webgl/webgl_compositor.js +0 -494
  194. package/src/polyfill/performance.js +0 -20
  195. package/src/polyfill/requestAnimationFrame.js +0 -39
@@ -1,5 +1,5 @@
1
- import * as event from "../../../system/event.js";
2
-
1
+ import VertexArrayBuffer from "../buffer/vertex.js";
2
+ import GLShader from "../glshader.js";
3
3
 
4
4
  /**
5
5
  * @classdesc
@@ -8,19 +8,26 @@ import * as event from "../../../system/event.js";
8
8
  export default class Compositor {
9
9
  /**
10
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
11
21
  */
12
- constructor (renderer) {
13
- this.init(renderer);
22
+ constructor (renderer, settings) {
23
+ this.init(renderer, settings);
14
24
  }
15
25
 
16
26
  /**
17
27
  * Initialize the compositor
18
28
  * @ignore
19
29
  */
20
- init (renderer) {
21
- // local reference
22
- var gl = renderer.gl;
23
-
30
+ init (renderer, settings) {
24
31
  // the associated renderer
25
32
  this.renderer = renderer;
26
33
 
@@ -34,17 +41,23 @@ import * as event from "../../../system/event.js";
34
41
  this.viewMatrix = renderer.currentTransform;
35
42
 
36
43
  /**
37
- * a reference to the active WebGL shader
44
+ * the default shader created by this compositor
38
45
  * @type {GLShader}
39
46
  */
40
- this.activeShader = null;
47
+ this.defaultShader = undefined;
48
+
49
+ /**
50
+ * the shader currently used by this compositor
51
+ * @type {GLShader}
52
+ */
53
+ this.currentShader = undefined;
41
54
 
42
55
  /**
43
56
  * primitive type to render (gl.POINTS, gl.LINE_STRIP, gl.LINE_LOOP, gl.LINES, gl.TRIANGLE_STRIP, gl.TRIANGLE_FAN, gl.TRIANGLES)
44
57
  * @type {number}
45
58
  * @default gl.TRIANGLES
46
59
  */
47
- this.mode = gl.TRIANGLES;
60
+ this.mode = this.gl.TRIANGLES;
48
61
 
49
62
  /**
50
63
  * an array of vertex attribute properties
@@ -69,11 +82,28 @@ import * as event from "../../../system/event.js";
69
82
  */
70
83
  this.vertexSize = 0;
71
84
 
72
- // register to the CANVAS resize channel
73
- event.on(event.CANVAS_ONRESIZE, (width, height) => {
74
- this.flush();
75
- this.setViewport(0, 0, width, height);
76
- });
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
+ }
77
107
  }
78
108
 
79
109
  /**
@@ -84,17 +114,35 @@ import * as event from "../../../system/event.js";
84
114
  // WebGL context
85
115
  this.gl = this.renderer.gl;
86
116
 
87
- this.flush();
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
+ }
88
130
 
89
- // initial viewport size
90
- this.setViewport(
91
- 0, 0,
92
- this.renderer.getCanvas().width,
93
- this.renderer.getCanvas().height
94
- );
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);
95
142
 
96
- // Initialize clear color
97
- this.clearColor(0.0, 0.0, 0.0, 0.0);
143
+ this.currentShader = shader;
144
+ this.renderer.currentProgram = this.currentShader.program;
145
+ }
98
146
  }
99
147
 
100
148
  /**
@@ -142,46 +190,20 @@ import * as event from "../../../system/event.js";
142
190
  this.vertexSize = this.vertexByteSize / Float32Array.BYTES_PER_ELEMENT;
143
191
  }
144
192
 
145
- /**
146
- * Sets the viewport
147
- * @param {number} x - x position of viewport
148
- * @param {number} y - y position of viewport
149
- * @param {number} w - width of viewport
150
- * @param {number} h - height of viewport
151
- */
152
- setViewport(x, y, w, h) {
153
- this.gl.viewport(x, y, w, h);
154
- }
155
-
156
193
  /**
157
194
  * set/change the current projection matrix
158
195
  * @param {Matrix3d} matrix
159
196
  */
160
197
  setProjection(matrix) {
161
- this.activeShader.setUniform("uProjectionMatrix", matrix);
198
+ this.currentShader.setUniform("uProjectionMatrix", matrix);
162
199
  }
163
200
 
164
201
  /**
165
- * Select the shader to use for compositing
166
- * @see GLShader
167
- * @param {GLShader} shader - a reference to a GLShader instance
168
- */
169
- useShader(shader) {
170
- if (this.activeShader !== shader) {
171
- this.flush();
172
- this.activeShader = shader;
173
- this.activeShader.bind();
174
- this.activeShader.setUniform("uProjectionMatrix", this.renderer.projectionMatrix);
175
- this.activeShader.setVertexAttributes(this.gl, this.attributes, this.vertexByteSize);
176
- }
177
- }
178
-
179
- /**
180
- * Flush batched texture operations to the GPU
202
+ * Flush batched vertex data to the GPU
181
203
  * @param {number} [mode=gl.TRIANGLES] - the GL drawing mode
182
204
  */
183
205
  flush(mode = this.mode) {
184
- var vertex = this.vertexBuffer;
206
+ var vertex = this.vertexData;
185
207
  var vertexCount = vertex.vertexCount;
186
208
 
187
209
  if (vertexCount > 0) {
@@ -201,27 +223,4 @@ import * as event from "../../../system/event.js";
201
223
  vertex.clear();
202
224
  }
203
225
  }
204
-
205
- /**
206
- * Clear the frame buffer
207
- * @param {number} [alpha = 0.0] - the alpha value used when clearing the framebuffer
208
- */
209
- clear(alpha = 0) {
210
- var gl = this.gl;
211
- gl.clearColor(0, 0, 0, alpha);
212
- gl.clear(gl.COLOR_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);
213
- }
214
-
215
- /**
216
- * Specify the color values used when clearing color buffers. The values are clamped between 0 and 1.
217
- * @param {number} [r = 0] - the red color value used when the color buffers are cleared
218
- * @param {number} [g = 0] - the green color value used when the color buffers are cleared
219
- * @param {number} [b = 0] - the blue color value used when the color buffers are cleared
220
- * @param {number} [a = 0] - the alpha color value used when the color buffers are cleared
221
- */
222
- clearColor(r = 0, g = 0, b = 0, a = 0) {
223
- var gl = this.gl;
224
- gl.clearColor(r, g, b, a);
225
- gl.clear(gl.COLOR_BUFFER_BIT);
226
- }
227
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
+ }
@@ -1,9 +1,5 @@
1
1
  import Vector2d from "../../../math/vector2.js";
2
- import GLShader from "../glshader.js";
3
- import VertexArrayBuffer from "../buffer/vertex.js";
4
2
  import { isPowerOfTwo } from "../../../math/math.js";
5
- import primitiveVertex from "./../shaders/primitive.vert";
6
- import primitiveFragment from "./../shaders/primitive.frag";
7
3
  import quadVertex from "./../shaders/quad.vert";
8
4
  import quadFragment from "./../shaders/quad.frag";
9
5
  import Compositor from "./compositor.js";
@@ -22,33 +18,27 @@ var V_ARRAY = [
22
18
  * Pushes texture regions or shape geometry into WebGL buffers, automatically flushes to GPU
23
19
  * @augments Compositor
24
20
  */
25
- export default class WebGLCompositor extends Compositor {
21
+ export default class QuadCompositor extends Compositor {
26
22
 
27
23
  /**
28
24
  * Initialize the compositor
29
25
  * @ignore
30
26
  */
31
27
  init (renderer) {
32
- super.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
+ });
33
38
 
34
39
  // list of active texture units
35
40
  this.currentTextureUnit = -1;
36
41
  this.boundTextures = [];
37
-
38
- // Load and create shader programs
39
- this.primitiveShader = new GLShader(this.gl, primitiveVertex, primitiveFragment);
40
- this.quadShader = new GLShader(this.gl, quadVertex, quadFragment);
41
-
42
- /// define all vertex attributes
43
- this.addAttribute("aVertex", 2, this.gl.FLOAT, false, 0 * Float32Array.BYTES_PER_ELEMENT); // 0
44
- this.addAttribute("aRegion", 2, this.gl.FLOAT, false, 2 * Float32Array.BYTES_PER_ELEMENT); // 1
45
- this.addAttribute("aColor", 4, this.gl.UNSIGNED_BYTE, true, 4 * Float32Array.BYTES_PER_ELEMENT); // 2
46
-
47
- this.vertexBuffer = new VertexArrayBuffer(this.vertexSize, 6); // 6 vertices per quad
48
-
49
- // vertex buffer
50
- this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.gl.createBuffer());
51
- this.gl.bufferData(this.gl.ARRAY_BUFFER, this.vertexBuffer.buffer, this.gl.STREAM_DRAW);
52
42
  }
53
43
 
54
44
  /**
@@ -66,47 +56,46 @@ var V_ARRAY = [
66
56
  }
67
57
  }
68
58
  this.currentTextureUnit = -1;
69
-
70
- // set the quad shader as the default program
71
- this.useShader(this.quadShader);
72
59
  }
73
60
 
74
61
  /**
75
62
  * Create a WebGL texture from an image
76
63
  * @param {number} unit - Destination texture unit
77
- * @param {Image|HTMLCanvasElement|ImageData|Uint8Array[]|Float32Array[]} image - Source image
64
+ * @param {Image|HTMLCanvasElement|ImageData|Uint8Array[]|Float32Array[]} [pixels=null] - Source image
78
65
  * @param {number} filter - gl.LINEAR or gl.NEAREST
79
66
  * @param {string} [repeat="no-repeat"] - Image repeat behavior (see {@link ImageLayer#repeat})
80
- * @param {number} [w] - Source image width (Only use with UInt8Array[] or Float32Array[] source image)
81
- * @param {number} [h] - Source image height (Only use with UInt8Array[] or Float32Array[] source image)
82
- * @param {number} [b] - Source image border (Only use with UInt8Array[] or Float32Array[] source image)
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)
83
69
  * @param {boolean} [premultipliedAlpha=true] - Multiplies the alpha channel into the other color channels
84
70
  * @param {boolean} [mipmap=true] - Whether mipmap levels should be generated for this texture
85
71
  * @returns {WebGLTexture} a WebGL texture
86
72
  */
87
- createTexture2D(unit, image, filter, repeat = "no-repeat", w, h, b, premultipliedAlpha = true, mipmap = true) {
73
+ createTexture2D(unit, pixels = null, filter, repeat = "no-repeat", w = pixels.width, h = pixels.height, premultipliedAlpha = true, mipmap = true) {
88
74
  var gl = this.gl;
89
- var isPOT = isPowerOfTwo(w || image.width) && isPowerOfTwo(h || image.height);
90
- var texture = gl.createTexture();
75
+ var isPOT = isPowerOfTwo(w) && isPowerOfTwo(h);
91
76
  var rs = (repeat.search(/^repeat(-x)?$/) === 0) && (isPOT || this.renderer.WebGLVersion > 1) ? gl.REPEAT : gl.CLAMP_TO_EDGE;
92
77
  var rt = (repeat.search(/^repeat(-y)?$/) === 0) && (isPOT || this.renderer.WebGLVersion > 1) ? gl.REPEAT : gl.CLAMP_TO_EDGE;
93
78
 
79
+ var texture = gl.createTexture();
80
+
94
81
  this.bindTexture2D(texture, unit);
95
82
 
96
83
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, rs);
97
84
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, rt);
98
85
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);
99
86
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);
87
+
100
88
  gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, premultipliedAlpha);
101
- if (w || h || b) {
102
- gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, w, h, b, gl.RGBA, gl.UNSIGNED_BYTE, image);
103
- }
104
- else {
105
- gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
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);
106
95
  }
107
96
 
108
97
  // generate the sprite mimap (used when scaling) if a PowerOfTwo texture
109
- if (isPOT && mipmap !== false) {
98
+ if (isPOT && mipmap === true) {
110
99
  gl.generateMipmap(gl.TEXTURE_2D);
111
100
  }
112
101
 
@@ -179,7 +168,7 @@ var V_ARRAY = [
179
168
  /**
180
169
  * @ignore
181
170
  */
182
- uploadTexture(texture, w, h, b, force = false) {
171
+ uploadTexture(texture, w, h, force = false) {
183
172
  var unit = this.renderer.cache.getUnit(texture);
184
173
  var texture2D = this.boundTextures[unit];
185
174
 
@@ -191,7 +180,6 @@ var V_ARRAY = [
191
180
  texture.repeat,
192
181
  w,
193
182
  h,
194
- b,
195
183
  texture.premultipliedAlpha
196
184
  );
197
185
  } else {
@@ -201,22 +189,6 @@ var V_ARRAY = [
201
189
  return this.currentTextureUnit;
202
190
  }
203
191
 
204
-
205
- /**
206
- * Select the shader to use for compositing
207
- * @see GLShader
208
- * @param {GLShader} shader - a reference to a GLShader instance
209
- */
210
- useShader(shader) {
211
- if (this.activeShader !== shader) {
212
- this.flush();
213
- this.activeShader = shader;
214
- this.activeShader.bind();
215
- this.activeShader.setUniform("uProjectionMatrix", this.renderer.projectionMatrix);
216
- this.activeShader.setVertexAttributes(this.gl, this.attributes, this.vertexByteSize);
217
- }
218
- }
219
-
220
192
  /**
221
193
  * Add a textured quad
222
194
  * @param {TextureAtlas} texture - Source texture atlas
@@ -231,23 +203,18 @@ var V_ARRAY = [
231
203
  * @param {number} tint - tint color to be applied to the texture in UINT32 (argb) format
232
204
  */
233
205
  addQuad(texture, x, y, w, h, u0, v0, u1, v1, tint) {
206
+ var vertexData = this.vertexData;
234
207
 
235
- if (this.color.alpha < 1 / 255) {
236
- // Fast path: don't send fully transparent quads
237
- return;
238
- }
239
-
240
- this.useShader(this.quadShader);
241
-
242
- if (this.vertexBuffer.isFull(6)) {
208
+ if (vertexData.isFull(6)) {
243
209
  // is the vertex buffer full if we add 6 more vertices
244
210
  this.flush();
245
211
  }
246
212
 
247
213
  // upload and activate the texture if necessary
248
214
  var unit = this.uploadTexture(texture);
249
- // set fragement sampler accordingly
250
- this.quadShader.setUniform("uSampler", unit);
215
+
216
+ // set fragment sampler accordingly
217
+ this.currentShader.setUniform("uSampler", unit);
251
218
 
252
219
  // Transform vertices
253
220
  var m = this.viewMatrix,
@@ -263,38 +230,11 @@ var V_ARRAY = [
263
230
  m.apply(vec3);
264
231
  }
265
232
 
266
- this.vertexBuffer.push(vec0.x, vec0.y, u0, v0, tint);
267
- this.vertexBuffer.push(vec1.x, vec1.y, u1, v0, tint);
268
- this.vertexBuffer.push(vec2.x, vec2.y, u0, v1, tint);
269
- this.vertexBuffer.push(vec2.x, vec2.y, u0, v1, tint);
270
- this.vertexBuffer.push(vec1.x, vec1.y, u1, v0, tint);
271
- this.vertexBuffer.push(vec3.x, vec3.y, u1, v1, tint);
272
- }
273
-
274
- /**
275
- * Draw an array of vertices
276
- * @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)
277
- * @param {Point[]} verts - an array of vertices
278
- * @param {number} [vertexCount=verts.length] - amount of points defined in the points array
279
- */
280
- drawVertices(mode, verts, vertexCount = verts.length) {
281
- // use the primitive shader
282
- this.useShader(this.primitiveShader);
283
- // Set the line color
284
- this.primitiveShader.setUniform("uColor", this.color);
285
-
286
- var m = this.viewMatrix;
287
- var vertex = this.vertexBuffer;
288
- var m_isIdentity = m.isIdentity();
289
-
290
- for (var i = 0; i < vertexCount; i++) {
291
- if (!m_isIdentity) {
292
- m.apply(verts[i]);
293
- }
294
- vertex.push(verts[i].x, verts[i].y);
295
- }
296
-
297
- // flush
298
- this.flush(mode);
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);
299
239
  }
300
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;