melonjs 14.0.2 → 14.1.1

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 (219) hide show
  1. package/README.md +2 -0
  2. package/dist/melonjs.mjs/_virtual/_commonjsHelpers.js +10 -0
  3. package/dist/melonjs.mjs/_virtual/arraymultimap.js +10 -0
  4. package/dist/melonjs.mjs/_virtual/earcut.js +10 -0
  5. package/dist/melonjs.mjs/_virtual/howler.js +10 -0
  6. package/dist/melonjs.mjs/_virtual/index.js +10 -0
  7. package/dist/melonjs.mjs/_virtual/index2.js +10 -0
  8. package/dist/melonjs.mjs/_virtual/multimap.js +10 -0
  9. package/dist/melonjs.mjs/_virtual/setmultimap.js +10 -0
  10. package/dist/melonjs.mjs/application/application.js +238 -0
  11. package/dist/melonjs.mjs/audio/audio.js +536 -0
  12. package/dist/melonjs.mjs/camera/camera2d.js +731 -0
  13. package/dist/melonjs.mjs/entity/entity.js +247 -0
  14. package/dist/melonjs.mjs/game.js +29 -0
  15. package/dist/melonjs.mjs/geometries/ellipse.js +274 -0
  16. package/dist/melonjs.mjs/geometries/line.js +115 -0
  17. package/dist/melonjs.mjs/geometries/path2d.js +318 -0
  18. package/dist/melonjs.mjs/geometries/point.js +88 -0
  19. package/dist/melonjs.mjs/geometries/poly.js +498 -0
  20. package/dist/melonjs.mjs/geometries/rectangle.js +374 -0
  21. package/dist/melonjs.mjs/geometries/roundrect.js +167 -0
  22. package/dist/melonjs.mjs/index.js +248 -0
  23. package/dist/melonjs.mjs/input/gamepad.js +501 -0
  24. package/dist/melonjs.mjs/input/input.js +26 -0
  25. package/dist/melonjs.mjs/input/keyboard.js +470 -0
  26. package/dist/melonjs.mjs/input/pointer.js +393 -0
  27. package/dist/melonjs.mjs/input/pointerevent.js +818 -0
  28. package/dist/melonjs.mjs/lang/deprecated.js +157 -0
  29. package/dist/melonjs.mjs/level/level.js +297 -0
  30. package/dist/melonjs.mjs/level/tiled/TMXGroup.js +141 -0
  31. package/dist/melonjs.mjs/level/tiled/TMXLayer.js +446 -0
  32. package/dist/melonjs.mjs/level/tiled/TMXObject.js +355 -0
  33. package/dist/melonjs.mjs/level/tiled/TMXTile.js +193 -0
  34. package/dist/melonjs.mjs/level/tiled/TMXTileMap.js +636 -0
  35. package/dist/melonjs.mjs/level/tiled/TMXTileset.js +309 -0
  36. package/dist/melonjs.mjs/level/tiled/TMXTilesetGroup.js +81 -0
  37. package/dist/melonjs.mjs/level/tiled/TMXUtils.js +367 -0
  38. package/dist/melonjs.mjs/level/tiled/renderer/TMXHexagonalRenderer.js +504 -0
  39. package/dist/melonjs.mjs/level/tiled/renderer/TMXIsometricRenderer.js +218 -0
  40. package/dist/melonjs.mjs/level/tiled/renderer/TMXOrthogonalRenderer.js +155 -0
  41. package/dist/melonjs.mjs/level/tiled/renderer/TMXRenderer.js +124 -0
  42. package/dist/melonjs.mjs/level/tiled/renderer/TMXStaggeredRenderer.js +107 -0
  43. package/dist/melonjs.mjs/loader/loader.js +801 -0
  44. package/dist/melonjs.mjs/loader/loadingscreen.js +120 -0
  45. package/dist/melonjs.mjs/loader/melonjs_logo.png.js +11 -0
  46. package/dist/melonjs.mjs/math/color.js +616 -0
  47. package/dist/melonjs.mjs/math/math.js +218 -0
  48. package/dist/melonjs.mjs/math/matrix2.js +501 -0
  49. package/dist/melonjs.mjs/math/matrix3.js +679 -0
  50. package/dist/melonjs.mjs/math/observable_vector2.js +469 -0
  51. package/dist/melonjs.mjs/math/observable_vector3.js +559 -0
  52. package/dist/melonjs.mjs/math/vector2.js +526 -0
  53. package/dist/melonjs.mjs/math/vector3.js +567 -0
  54. package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/src/arraymultimap.js +73 -0
  55. package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/src/index.js +21 -0
  56. package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/src/multimap.js +324 -0
  57. package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/src/setmultimap.js +69 -0
  58. package/dist/melonjs.mjs/node_modules/earcut/src/earcut.js +691 -0
  59. package/dist/melonjs.mjs/node_modules/eventemitter3/index.js +350 -0
  60. package/dist/melonjs.mjs/node_modules/howler/dist/howler.js +3241 -0
  61. package/dist/melonjs.mjs/particles/emitter.js +265 -0
  62. package/dist/melonjs.mjs/particles/particle.js +186 -0
  63. package/dist/melonjs.mjs/particles/settings.js +319 -0
  64. package/dist/melonjs.mjs/physics/body.js +702 -0
  65. package/dist/melonjs.mjs/physics/bounds.js +459 -0
  66. package/dist/melonjs.mjs/physics/collision.js +132 -0
  67. package/dist/melonjs.mjs/physics/detector.js +194 -0
  68. package/dist/melonjs.mjs/physics/quadtree.js +394 -0
  69. package/dist/melonjs.mjs/physics/response.js +57 -0
  70. package/dist/melonjs.mjs/physics/sat.js +483 -0
  71. package/dist/melonjs.mjs/physics/world.js +219 -0
  72. package/dist/melonjs.mjs/plugin/plugin.js +141 -0
  73. package/dist/melonjs.mjs/renderable/collectable.js +60 -0
  74. package/dist/melonjs.mjs/renderable/colorlayer.js +78 -0
  75. package/dist/melonjs.mjs/renderable/container.js +1016 -0
  76. package/dist/melonjs.mjs/renderable/dragndrop.js +224 -0
  77. package/dist/melonjs.mjs/renderable/imagelayer.js +305 -0
  78. package/dist/melonjs.mjs/renderable/light2d.js +155 -0
  79. package/dist/melonjs.mjs/renderable/nineslicesprite.js +246 -0
  80. package/dist/melonjs.mjs/renderable/renderable.js +781 -0
  81. package/dist/melonjs.mjs/renderable/sprite.js +653 -0
  82. package/dist/melonjs.mjs/renderable/trigger.js +156 -0
  83. package/dist/melonjs.mjs/renderable/ui/uibaseelement.js +212 -0
  84. package/dist/melonjs.mjs/renderable/ui/uispriteelement.js +225 -0
  85. package/dist/melonjs.mjs/renderable/ui/uitextbutton.js +127 -0
  86. package/dist/melonjs.mjs/state/stage.js +236 -0
  87. package/dist/melonjs.mjs/state/state.js +596 -0
  88. package/dist/melonjs.mjs/system/device.js +909 -0
  89. package/dist/melonjs.mjs/system/dom.js +78 -0
  90. package/dist/melonjs.mjs/system/event.js +537 -0
  91. package/dist/melonjs.mjs/system/platform.js +41 -0
  92. package/dist/melonjs.mjs/system/pooling.js +209 -0
  93. package/dist/melonjs.mjs/system/save.js +157 -0
  94. package/dist/melonjs.mjs/system/timer.js +286 -0
  95. package/dist/melonjs.mjs/text/bitmaptext.js +363 -0
  96. package/dist/melonjs.mjs/text/bitmaptextdata.js +198 -0
  97. package/dist/melonjs.mjs/text/glyph.js +65 -0
  98. package/dist/melonjs.mjs/text/text.js +452 -0
  99. package/dist/melonjs.mjs/text/textmetrics.js +175 -0
  100. package/dist/melonjs.mjs/text/textstyle.js +23 -0
  101. package/dist/melonjs.mjs/tweens/easing.js +336 -0
  102. package/dist/melonjs.mjs/tweens/interpolation.js +112 -0
  103. package/dist/melonjs.mjs/tweens/tween.js +479 -0
  104. package/dist/melonjs.mjs/utils/agent.js +76 -0
  105. package/dist/melonjs.mjs/utils/array.js +63 -0
  106. package/dist/melonjs.mjs/utils/file.js +42 -0
  107. package/dist/melonjs.mjs/utils/function.js +70 -0
  108. package/dist/melonjs.mjs/utils/string.js +82 -0
  109. package/dist/melonjs.mjs/utils/utils.js +173 -0
  110. package/dist/melonjs.mjs/video/canvas/canvas_renderer.js +806 -0
  111. package/dist/melonjs.mjs/video/renderer.js +410 -0
  112. package/dist/melonjs.mjs/video/texture/atlas.js +519 -0
  113. package/dist/melonjs.mjs/video/texture/cache.js +143 -0
  114. package/dist/melonjs.mjs/video/texture/canvas_texture.js +144 -0
  115. package/dist/melonjs.mjs/video/video.js +462 -0
  116. package/dist/melonjs.mjs/video/webgl/buffer/vertex.js +142 -0
  117. package/dist/melonjs.mjs/video/webgl/glshader.js +167 -0
  118. package/dist/melonjs.mjs/video/webgl/shaders/primitive.frag.js +10 -0
  119. package/dist/melonjs.mjs/video/webgl/shaders/primitive.vert.js +10 -0
  120. package/dist/melonjs.mjs/video/webgl/shaders/quad.frag.js +10 -0
  121. package/dist/melonjs.mjs/video/webgl/shaders/quad.vert.js +10 -0
  122. package/dist/melonjs.mjs/video/webgl/utils/attributes.js +25 -0
  123. package/dist/melonjs.mjs/video/webgl/utils/precision.js +20 -0
  124. package/dist/melonjs.mjs/video/webgl/utils/program.js +67 -0
  125. package/dist/melonjs.mjs/video/webgl/utils/string.js +25 -0
  126. package/dist/melonjs.mjs/video/webgl/utils/uniforms.js +92 -0
  127. package/dist/melonjs.mjs/video/webgl/webgl_compositor.js +494 -0
  128. package/dist/melonjs.mjs/video/webgl/webgl_renderer.js +1035 -0
  129. package/dist/melonjs.module.d.ts +1298 -1359
  130. package/dist/melonjs.module.js +2072 -3520
  131. package/package.json +21 -16
  132. package/src/application/application.js +4 -5
  133. package/src/audio/audio.js +32 -32
  134. package/src/camera/camera2d.js +32 -33
  135. package/src/entity/entity.js +18 -19
  136. package/src/geometries/ellipse.js +17 -18
  137. package/src/geometries/line.js +6 -7
  138. package/src/geometries/path2d.js +33 -34
  139. package/src/geometries/point.js +1 -2
  140. package/src/geometries/poly.js +16 -18
  141. package/src/geometries/rectangle.js +19 -20
  142. package/src/geometries/roundrect.js +9 -10
  143. package/src/input/gamepad.js +15 -15
  144. package/src/input/keyboard.js +12 -12
  145. package/src/input/pointer.js +6 -6
  146. package/src/input/pointerevent.js +12 -12
  147. package/src/lang/deprecated.js +12 -12
  148. package/src/level/level.js +25 -25
  149. package/src/level/tiled/TMXLayer.js +23 -24
  150. package/src/level/tiled/TMXTile.js +6 -7
  151. package/src/level/tiled/TMXTileMap.js +8 -10
  152. package/src/level/tiled/TMXTileset.js +3 -4
  153. package/src/level/tiled/TMXTilesetGroup.js +1 -2
  154. package/src/level/tiled/TMXUtils.js +5 -5
  155. package/src/level/tiled/renderer/TMXHexagonalRenderer.js +3 -4
  156. package/src/level/tiled/renderer/TMXIsometricRenderer.js +3 -4
  157. package/src/level/tiled/renderer/TMXOrthogonalRenderer.js +2 -3
  158. package/src/level/tiled/renderer/TMXRenderer.js +20 -21
  159. package/src/level/tiled/renderer/TMXStaggeredRenderer.js +1 -2
  160. package/src/loader/loader.js +20 -20
  161. package/src/math/color.js +21 -22
  162. package/src/math/math.js +16 -16
  163. package/src/math/matrix2.js +17 -18
  164. package/src/math/matrix3.js +26 -27
  165. package/src/math/observable_vector2.js +15 -16
  166. package/src/math/observable_vector3.js +17 -18
  167. package/src/math/vector2.js +10 -11
  168. package/src/math/vector3.js +11 -12
  169. package/src/particles/emitter.js +7 -8
  170. package/src/particles/particle.js +3 -4
  171. package/src/physics/body.js +29 -30
  172. package/src/physics/bounds.js +10 -10
  173. package/src/physics/collision.js +2 -2
  174. package/src/physics/detector.js +6 -6
  175. package/src/physics/quadtree.js +18 -23
  176. package/src/physics/sat.js +31 -31
  177. package/src/physics/world.js +6 -7
  178. package/src/plugin/plugin.js +5 -5
  179. package/src/renderable/collectable.js +4 -6
  180. package/src/renderable/colorlayer.js +6 -8
  181. package/src/renderable/container.js +25 -27
  182. package/src/renderable/dragndrop.js +14 -14
  183. package/src/renderable/imagelayer.js +14 -15
  184. package/src/renderable/light2d.js +4 -5
  185. package/src/renderable/nineslicesprite.js +17 -18
  186. package/src/renderable/renderable.js +26 -28
  187. package/src/renderable/sprite.js +29 -30
  188. package/src/renderable/trigger.js +16 -17
  189. package/src/renderable/ui/uibaseelement.js +8 -9
  190. package/src/renderable/ui/uispriteelement.js +8 -8
  191. package/src/renderable/ui/uitextbutton.js +15 -15
  192. package/src/state/stage.js +8 -9
  193. package/src/state/state.js +17 -17
  194. package/src/system/device.js +11 -11
  195. package/src/system/event.js +10 -10
  196. package/src/system/pooling.js +9 -9
  197. package/src/system/save.js +2 -2
  198. package/src/system/timer.js +10 -10
  199. package/src/text/bitmaptext.js +19 -20
  200. package/src/text/bitmaptextdata.js +3 -4
  201. package/src/text/glyph.js +1 -2
  202. package/src/text/text.js +24 -25
  203. package/src/text/textmetrics.js +9 -10
  204. package/src/tweens/tween.js +20 -21
  205. package/src/utils/agent.js +5 -5
  206. package/src/utils/array.js +4 -4
  207. package/src/utils/file.js +2 -2
  208. package/src/utils/function.js +6 -6
  209. package/src/utils/string.js +5 -5
  210. package/src/utils/utils.js +4 -4
  211. package/src/video/canvas/canvas_renderer.js +72 -73
  212. package/src/video/renderer.js +27 -28
  213. package/src/video/texture/atlas.js +22 -22
  214. package/src/video/texture/canvas_texture.js +9 -9
  215. package/src/video/video.js +17 -17
  216. package/src/video/webgl/buffer/vertex.js +1 -2
  217. package/src/video/webgl/glshader.js +12 -12
  218. package/src/video/webgl/webgl_compositor.js +42 -43
  219. package/src/video/webgl/webgl_renderer.js +76 -77
@@ -0,0 +1,144 @@
1
+ /*!
2
+ * melonJS Game Engine - v14.1.1
3
+ * http://www.melonjs.org
4
+ * melonjs is licensed under the MIT License.
5
+ * http://www.opensource.org/licenses/mit-license
6
+ * @copyright (C) 2011 - 2022 Olivier Biot (AltByte Pte Ltd)
7
+ */
8
+ import { createCanvas } from '../video.js';
9
+ import { setPrefixed } from '../../utils/agent.js';
10
+
11
+ // default canvas settings
12
+ var defaultAttributes = {
13
+ offscreenCanvas : false,
14
+ willReadFrequently : false,
15
+ antiAlias : false,
16
+ context: "2d"
17
+ };
18
+
19
+ /**
20
+ * Creates a Canvas Texture of the given size
21
+ */
22
+ class CanvasTexture {
23
+ /**
24
+ * @param {number} width - the desired width of the canvas
25
+ * @param {number} height - the desired height of the canvas
26
+ * @param {object} attributes - The attributes to create both the canvas and context
27
+ * @param {boolean} [attributes.context="2d"] - the context type to be created ("2d", "webgl", "webgl2")
28
+ * @param {boolean} [attributes.offscreenCanvas=false] - will create an offscreenCanvas if true instead of a standard canvas
29
+ * @param {boolean} [attributes.willReadFrequently=false] - Indicates whether or not a lot of read-back operations are planned
30
+ * @param {boolean} [attributes.antiAlias=false] - Whether to enable anti-aliasing, use false (default) for a pixelated effect.
31
+ */
32
+ constructor(width, height, attributes = defaultAttributes) {
33
+
34
+ // clean up the given attributes
35
+ attributes = Object.assign(defaultAttributes, attributes || {});
36
+
37
+ /**
38
+ * the canvas created for this CanvasTexture
39
+ * @type {HTMLCanvasElement|OffscreenCanvas}
40
+ */
41
+ this.canvas = createCanvas(width, height, attributes.offscreenCanvas);
42
+
43
+ /**
44
+ * the rendering context of this CanvasTexture
45
+ * @type {CanvasRenderingContext2D}
46
+ */
47
+ this.context = this.canvas.getContext("2d", { willReadFrequently: attributes.willReadFrequently });
48
+
49
+ // enable or disable antiAlias if specified
50
+ this.setAntiAlias(attributes.antiAlias);
51
+ }
52
+
53
+ /**
54
+ * @ignore
55
+ */
56
+ onResetEvent(width, height) {
57
+ this.clear();
58
+ this.resize(width, height);
59
+ }
60
+
61
+ /**
62
+ * Clears the content of the canvas texture
63
+ */
64
+ clear() {
65
+ this.context.setTransform(1, 0, 0, 1, 0, 0);
66
+ this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
67
+ }
68
+
69
+ /**
70
+ * enable/disable image smoothing (scaling interpolation)
71
+ * @param {boolean} [enable=false]
72
+ */
73
+ setAntiAlias(enable = false) {
74
+ var canvas = this.canvas;
75
+
76
+ // enable/disable antialias on the given Context2d object
77
+ setPrefixed("imageSmoothingEnabled", enable, this.context);
78
+
79
+ // set antialias CSS property on the main canvas
80
+ if (typeof canvas.style !== "undefined") {
81
+ if (enable !== true) {
82
+ // https://developer.mozilla.org/en-US/docs/Web/CSS/image-rendering
83
+ canvas.style["image-rendering"] = "optimizeSpeed"; // legal fallback
84
+ canvas.style["image-rendering"] = "-moz-crisp-edges"; // Firefox
85
+ canvas.style["image-rendering"] = "-o-crisp-edges"; // Opera
86
+ canvas.style["image-rendering"] = "-webkit-optimize-contrast"; // Safari
87
+ canvas.style["image-rendering"] = "optimize-contrast"; // CSS 3
88
+ canvas.style["image-rendering"] = "crisp-edges"; // CSS 4
89
+ canvas.style["image-rendering"] = "pixelated"; // CSS 4
90
+ canvas.style.msInterpolationMode = "nearest-neighbor"; // IE8+
91
+ } else {
92
+ canvas.style["image-rendering"] = "auto";
93
+ }
94
+ }
95
+ }
96
+
97
+ /**
98
+ * Resizes the canvas texture to the given width and height.
99
+ * @param {number} width - the desired width
100
+ * @param {number} height - the desired height
101
+ */
102
+ resize(width, height) {
103
+ this.canvas.width = Math.round(width);
104
+ this.canvas.height = Math.round(height);
105
+ }
106
+
107
+ /**
108
+ * @ignore
109
+ */
110
+ destroy() {
111
+ this.context = undefined;
112
+ this.canvas = undefined;
113
+ }
114
+
115
+ /**
116
+ * The width of this canvas texture in pixels
117
+ * @public
118
+ * @type {number}
119
+ */
120
+ get width() {
121
+ return this.canvas.width;
122
+ }
123
+
124
+ set width(val) {
125
+ this.canvas.width = Math.round(val);
126
+ }
127
+
128
+ /**
129
+ * The height of this canvas texture in pixels
130
+ * @public
131
+ * @type {number}
132
+ */
133
+ get height() {
134
+ return this.canvas.height;
135
+ }
136
+
137
+ set height(val) {
138
+ this.canvas.height = Math.round(val);
139
+ }
140
+ }
141
+
142
+ var CanvasTexture$1 = CanvasTexture;
143
+
144
+ export { CanvasTexture$1 as default };
@@ -0,0 +1,462 @@
1
+ /*!
2
+ * melonJS Game Engine - v14.1.1
3
+ * http://www.melonjs.org
4
+ * melonjs is licensed under the MIT License.
5
+ * http://www.opensource.org/licenses/mit-license
6
+ * @copyright (C) 2011 - 2022 Olivier Biot (AltByte Pte Ltd)
7
+ */
8
+ import Vector2d from '../math/vector2.js';
9
+ import WebGLRenderer from './webgl/webgl_renderer.js';
10
+ import CanvasRenderer from './canvas/canvas_renderer.js';
11
+ import utils from '../utils/utils.js';
12
+ import { emit, WINDOW_ONRESIZE, WINDOW_ONORIENTATION_CHANGE, WINDOW_ONSCROLL, on, VIDEO_INIT } from '../system/event.js';
13
+ import game from '../game.js';
14
+ import { offscreenCanvas, screenOrientation, getElement, platform, enableSwipe, devicePixelRatio, getScreenOrientation, language, isWebGLSupported, getParentBounds, hasWebAudio } from '../system/device.js';
15
+ import { initialized, version } from '../index.js';
16
+
17
+ /**
18
+ * video functions
19
+ * @namespace video
20
+ */
21
+
22
+ var designRatio = 1;
23
+ var designWidth = 0;
24
+ var designHeight = 0;
25
+
26
+ // default video settings
27
+ var settings = {
28
+ parent : undefined,
29
+ renderer : 2, // AUTO
30
+ autoScale : false,
31
+ scale : 1.0,
32
+ scaleMethod : "manual",
33
+ transparent : false,
34
+ premultipliedAlpha: true,
35
+ blendMode : "normal",
36
+ antiAlias : false,
37
+ failIfMajorPerformanceCaveat : true,
38
+ subPixel : false,
39
+ preferWebGL1 : false,
40
+ powerPreference : "default",
41
+ verbose : false,
42
+ consoleHeader : true
43
+ };
44
+
45
+ /**
46
+ * Auto-detect the best renderer to use
47
+ * @ignore
48
+ */
49
+ function autoDetectRenderer(options) {
50
+ try {
51
+ if (isWebGLSupported(options)) {
52
+ return new WebGLRenderer(options);
53
+ }
54
+ } catch (e) {
55
+ console.log("Error creating WebGL renderer :" + e.message);
56
+ }
57
+ return new CanvasRenderer(options);
58
+ }
59
+
60
+ /**
61
+ * callback for window resize event
62
+ * @ignore
63
+ */
64
+ function onresize() {
65
+ var settings = renderer.settings;
66
+ var scaleX = 1, scaleY = 1;
67
+
68
+ if (settings.autoScale) {
69
+
70
+ // set max the canvas max size if CSS values are defined
71
+ var canvasMaxWidth = Infinity;
72
+ var canvasMaxHeight = Infinity;
73
+
74
+ if (globalThis.getComputedStyle) {
75
+ var style = globalThis.getComputedStyle(renderer.getCanvas(), null);
76
+ canvasMaxWidth = parseInt(style.maxWidth, 10) || Infinity;
77
+ canvasMaxHeight = parseInt(style.maxHeight, 10) || Infinity;
78
+ }
79
+
80
+ // get the maximum canvas size within the parent div containing the canvas container
81
+ var nodeBounds = getParentBounds(getParent());
82
+
83
+ var _max_width = Math.min(canvasMaxWidth, nodeBounds.width);
84
+ var _max_height = Math.min(canvasMaxHeight, nodeBounds.height);
85
+
86
+ // calculate final canvas width & height
87
+ var screenRatio = _max_width / _max_height;
88
+
89
+ if ((settings.scaleMethod === "fill-min" && screenRatio > designRatio) ||
90
+ (settings.scaleMethod === "fill-max" && screenRatio < designRatio) ||
91
+ (settings.scaleMethod === "flex-width")
92
+ ) {
93
+ // resize the display canvas to fill the parent container
94
+ var sWidth = Math.min(canvasMaxWidth, designHeight * screenRatio);
95
+ scaleX = scaleY = _max_width / sWidth;
96
+ renderer.resize(Math.floor(sWidth), designHeight);
97
+ }
98
+ else if ((settings.scaleMethod === "fill-min" && screenRatio < designRatio) ||
99
+ (settings.scaleMethod === "fill-max" && screenRatio > designRatio) ||
100
+ (settings.scaleMethod === "flex-height")
101
+ ) {
102
+ // resize the display canvas to fill the parent container
103
+ var sHeight = Math.min(canvasMaxHeight, designWidth * (_max_height / _max_width));
104
+ scaleX = scaleY = _max_height / sHeight;
105
+ renderer.resize(designWidth, Math.floor(sHeight));
106
+ }
107
+ else if (settings.scaleMethod === "flex") {
108
+ // resize the display canvas to fill the parent container
109
+ renderer.resize(Math.floor(_max_width), Math.floor(_max_height));
110
+ }
111
+ else if (settings.scaleMethod === "stretch") {
112
+ // scale the display canvas to fit with the parent container
113
+ scaleX = _max_width / designWidth;
114
+ scaleY = _max_height / designHeight;
115
+ }
116
+ else {
117
+ // scale the display canvas to fit the parent container
118
+ // make sure we maintain the original aspect ratio
119
+ if (screenRatio < designRatio) {
120
+ scaleX = scaleY = _max_width / designWidth;
121
+ }
122
+ else {
123
+ scaleX = scaleY = _max_height / designHeight;
124
+ }
125
+ }
126
+
127
+ // adjust scaling ratio based on the new scaling ratio
128
+ scale(scaleX, scaleY);
129
+ } else {
130
+ // adjust scaling ratio based on the given settings
131
+ scale(settings.scale, settings.scale);
132
+ }
133
+ }
134
+
135
+ /**
136
+ * Select the HTML5 Canvas renderer
137
+ * @name CANVAS
138
+ * @memberof video
139
+ * @constant
140
+ */
141
+ const CANVAS = 0;
142
+
143
+ /**
144
+ * Select the WebGL renderer
145
+ * @name WEBGL
146
+ * @memberof video
147
+ * @constant
148
+ */
149
+ const WEBGL = 1;
150
+
151
+ /**
152
+ * Auto-select the renderer (Attempt WebGL first, with fallback to Canvas)
153
+ * @name AUTO
154
+ * @memberof video
155
+ * @constant
156
+ */
157
+ const AUTO = 2;
158
+
159
+ /**
160
+ * the parent container of the main canvas element
161
+ * @ignore
162
+ * @type {HTMLElement}
163
+ * @readonly
164
+ * @name parent
165
+ * @memberof video
166
+ */
167
+ let parent = null;
168
+
169
+ /**
170
+ * the scaling ratio to be applied to the display canvas
171
+ * @name scaleRatio
172
+ * @type {Vector2d}
173
+ * @default <1,1>
174
+ * @memberof video
175
+ */
176
+ let scaleRatio = new Vector2d(1, 1);
177
+
178
+ /**
179
+ * A reference to the active Canvas or WebGL active renderer renderer
180
+ * @name renderer
181
+ * @type {CanvasRenderer|WebGLRenderer}
182
+ * @memberof video
183
+ */
184
+ let renderer = null;
185
+
186
+ /**
187
+ * Initialize the "video" system (create a canvas based on the given arguments, and the related renderer). <br>
188
+ * melonJS support various scaling mode, that can be enabled <u>once the scale option is set to <b>`auto`</b></u> : <br>
189
+ * - <i><b>`fit`</b></i> : Letterboxed; content is scaled to design aspect ratio <br>
190
+ * <center><img src="images/scale-fit.png"/></center><br>
191
+ * - <i><b>`fill-min`</b></i> : Canvas is resized to fit minimum design resolution; content is scaled to design aspect ratio <br>
192
+ * <center><img src="images/scale-fill-min.png"/></center><br>
193
+ * - <i><b>`fill-max`</b></i> : Canvas is resized to fit maximum design resolution; content is scaled to design aspect ratio <br>
194
+ * <center><img src="images/scale-fill-max.png"/></center><br>
195
+ * - <i><b>`flex`</b><</i> : Canvas width & height is resized to fit; content is scaled to design aspect ratio <br>
196
+ * <center><img src="images/scale-flex.png"/></center><br>
197
+ * - <i><b>`flex-width`</b></i> : Canvas width is resized to fit; content is scaled to design aspect ratio <br>
198
+ * <center><img src="images/scale-flex-width.png"/></center><br>
199
+ * - <i><b>`flex-height`</b></i> : Canvas height is resized to fit; content is scaled to design aspect ratio <br>
200
+ * <center><img src="images/scale-flex-height.png"/></center><br>
201
+ * - <i><b>`stretch`</b></i> : Canvas is resized to fit; content is scaled to screen aspect ratio
202
+ * <center><img src="images/scale-stretch.png"/></center><br>
203
+ * @function video.init
204
+ * @param {number} width - The width of the canvas viewport
205
+ * @param {number} height - The height of the canvas viewport
206
+ * @param {object} [options] - The optional video/renderer parameters.<br> (see Renderer(s) documentation for further specific options)
207
+ * @param {string|HTMLElement} [options.parent=document.body] - the DOM parent element to hold the canvas in the HTML file
208
+ * @param {number} [options.renderer=video.AUTO] - renderer to use (me.video.CANVAS, me.video.WEBGL, me.video.AUTO)
209
+ * @param {number|string} [options.scale=1.0] - enable scaling of the canvas ('auto' for automatic scaling)
210
+ * @param {string} [options.scaleMethod="fit"] - screen scaling modes ('fit','fill-min','fill-max','flex','flex-width','flex-height','stretch')
211
+ * @param {boolean} [options.preferWebGL1=false] - if true the renderer will only use WebGL 1
212
+ * @param {string} [options.powerPreference="default"] - a hint to the user agent indicating what configuration of GPU is suitable for the WebGL context ("default", "high-performance", "low-power"). To be noted that Safari and Chrome (since version 80) both default to "low-power" to save battery life and improve the user experience on these dual-GPU machines.
213
+ * @param {boolean} [options.transparent=false] - whether to allow transparent pixels in the front buffer (screen).
214
+ * @param {boolean} [options.antiAlias=false] - whether to enable or not video scaling interpolation
215
+ * @param {boolean} [options.consoleHeader=true] - whether to display melonJS version and basic device information in the console
216
+ * @returns {boolean} false if initialization failed (canvas not supported)
217
+ * @example
218
+ * // init the video with a 640x480 canvas
219
+ * me.video.init(640, 480, {
220
+ * parent : "screen",
221
+ * renderer : me.video.AUTO,
222
+ * scale : "auto",
223
+ * scaleMethod : "fit"
224
+ * });
225
+ */
226
+ function init(width, height, options) {
227
+
228
+ // ensure melonjs has been properly initialized
229
+ if (!initialized) {
230
+ throw new Error("me.video.init() called before engine initialization.");
231
+ }
232
+
233
+ // revert to default options if not defined
234
+ settings = Object.assign(settings, options || {});
235
+
236
+ // sanitize potential given parameters
237
+ settings.width = width;
238
+ settings.height = height;
239
+ settings.transparent = !!(settings.transparent);
240
+ settings.antiAlias = !!(settings.antiAlias);
241
+ settings.failIfMajorPerformanceCaveat = !!(settings.failIfMajorPerformanceCaveat);
242
+ settings.subPixel = !!(settings.subPixel);
243
+ settings.verbose = !!(settings.verbose);
244
+ if (settings.scaleMethod.search(/^(fill-(min|max)|fit|flex(-(width|height))?|stretch)$/) !== -1) {
245
+ settings.autoScale = (settings.scale === "auto") || true;
246
+ } else {
247
+ // default scaling method
248
+ settings.scaleMethod = "fit";
249
+ settings.autoScale = (settings.scale === "auto") || false;
250
+ }
251
+
252
+ // display melonJS version
253
+ if (settings.consoleHeader !== false) {
254
+ // output video information in the console
255
+ console.log("melonJS 2 (v" + version + ") | http://melonjs.org" );
256
+ }
257
+
258
+ // override renderer settings if &webgl or &canvas is defined in the URL
259
+ var uriFragment = utils.getUriFragment();
260
+ if (uriFragment.webgl === true || uriFragment.webgl1 === true || uriFragment.webgl2 === true) {
261
+ settings.renderer = WEBGL;
262
+ if (uriFragment.webgl1 === true) {
263
+ settings.preferWebGL1 = true;
264
+ }
265
+ } else if (uriFragment.canvas === true) {
266
+ settings.renderer = CANVAS;
267
+ }
268
+
269
+ // normalize scale
270
+ settings.scale = (settings.autoScale) ? 1.0 : (+settings.scale || 1.0);
271
+ scaleRatio.set(settings.scale, settings.scale);
272
+
273
+ // hold the requested video size ratio
274
+ designRatio = width / height;
275
+ designWidth = width;
276
+ designHeight = height;
277
+
278
+ // default scaled size value
279
+ settings.zoomX = width * scaleRatio.x;
280
+ settings.zoomY = height * scaleRatio.y;
281
+
282
+ //add a channel for the onresize/onorientationchange event
283
+ globalThis.addEventListener(
284
+ "resize",
285
+ utils.function.throttle(
286
+ (e) => {
287
+ emit(WINDOW_ONRESIZE, e);
288
+ }, 100
289
+ ), false
290
+ );
291
+
292
+ // Screen Orientation API
293
+ globalThis.addEventListener(
294
+ "orientationchange",
295
+ (e) => {
296
+ emit(WINDOW_ONORIENTATION_CHANGE, e);
297
+ },
298
+ false
299
+ );
300
+ // pre-fixed implementation on mozzila
301
+ globalThis.addEventListener(
302
+ "onmozorientationchange",
303
+ (e) => {
304
+ emit(WINDOW_ONORIENTATION_CHANGE, e);
305
+ },
306
+ false
307
+ );
308
+
309
+ if (screenOrientation === true) {
310
+ globalThis.screen.orientation.onchange = function (e) {
311
+ emit(WINDOW_ONORIENTATION_CHANGE, e);
312
+ };
313
+ }
314
+
315
+ // Automatically update relative canvas position on scroll
316
+ globalThis.addEventListener("scroll", utils.function.throttle((e) => {
317
+ emit(WINDOW_ONSCROLL, e);
318
+ }, 100), false);
319
+
320
+ // register to the channel
321
+ on(WINDOW_ONRESIZE, onresize, this);
322
+ on(WINDOW_ONORIENTATION_CHANGE, onresize, this);
323
+
324
+ try {
325
+ switch (settings.renderer) {
326
+ case AUTO:
327
+ case WEBGL:
328
+ renderer = autoDetectRenderer(settings);
329
+ break;
330
+ default:
331
+ renderer = new CanvasRenderer(settings);
332
+ break;
333
+ }
334
+ } catch (e) {
335
+ console(e.message);
336
+ // me.video.init() returns false if failing at creating/using a HTML5 canvas
337
+ return false;
338
+ }
339
+
340
+ // add our canvas (default to document.body if settings.parent is undefined)
341
+ parent = getElement(typeof settings.parent !== "undefined" ? settings.parent : document.body);
342
+ parent.appendChild(renderer.getCanvas());
343
+
344
+ // Mobile browser hacks
345
+ if (platform.isMobile) {
346
+ // Prevent the webview from moving on a swipe
347
+ enableSwipe(false);
348
+ }
349
+
350
+ // trigger an initial resize();
351
+ onresize();
352
+
353
+ // add an observer to detect when the dom tree is modified
354
+ if ("MutationObserver" in globalThis) {
355
+ // Create an observer instance linked to the callback function
356
+ var observer = new MutationObserver(onresize.bind(this));
357
+
358
+ // Start observing the target node for configured mutations
359
+ observer.observe(parent, {
360
+ attributes: false, childList: true, subtree: true
361
+ });
362
+ }
363
+
364
+ if (settings.consoleHeader !== false) {
365
+ var renderType = (renderer instanceof CanvasRenderer) ? "CANVAS" : "WebGL" + renderer.WebGLVersion;
366
+ var audioType = hasWebAudio ? "Web Audio" : "HTML5 Audio";
367
+ var gpu_renderer = (typeof renderer.GPURenderer === "string") ? " (" + renderer.GPURenderer + ")" : "";
368
+ // output video information in the console
369
+ console.log(
370
+ renderType + " renderer" + gpu_renderer + " | " +
371
+ audioType + " | " +
372
+ "pixel ratio " + devicePixelRatio + " | " +
373
+ (platform.nodeJS ? "node.js" : platform.isMobile ? "mobile" : "desktop") + " | " +
374
+ getScreenOrientation() + " | " +
375
+ language
376
+ );
377
+ console.log( "resolution: " + "requested " + width + "x" + height +
378
+ ", got " + renderer.getWidth() + "x" + renderer.getHeight()
379
+ );
380
+ }
381
+
382
+ // notify the video has been initialized
383
+ emit(VIDEO_INIT);
384
+
385
+ return true;
386
+ }
387
+
388
+ /**
389
+ * Create and return a new Canvas element
390
+ * @function video.createCanvas
391
+ * @param {number} width - width
392
+ * @param {number} height - height
393
+ * @param {boolean} [returnOffscreenCanvas=false] - will return an OffscreenCanvas if supported
394
+ * @returns {HTMLCanvasElement|OffscreenCanvas}
395
+ */
396
+ function createCanvas(width, height, returnOffscreenCanvas = false) {
397
+ var _canvas;
398
+
399
+ if (width === 0 || height === 0) {
400
+ throw new Error("width or height was zero, Canvas could not be initialized !");
401
+ }
402
+
403
+ if (offscreenCanvas === true && returnOffscreenCanvas === true) {
404
+ _canvas = new globalThis.OffscreenCanvas(0, 0);
405
+ // stubbing style for compatibility,
406
+ // as OffscreenCanvas is detached from the DOM
407
+ if (typeof _canvas.style === "undefined") {
408
+ _canvas.style = {};
409
+ }
410
+ } else {
411
+ // "else" create a "standard" canvas
412
+ _canvas = document.createElement("canvas");
413
+ }
414
+ _canvas.width = width;
415
+ _canvas.height = height;
416
+
417
+ return _canvas;
418
+ }
419
+
420
+ /**
421
+ * return a reference to the parent DOM element holding the main canvas
422
+ * @function video.getParent
423
+ * @returns {HTMLElement}
424
+ */
425
+ function getParent() {
426
+ return parent;
427
+ }
428
+
429
+ /**
430
+ * scale the "displayed" canvas by the given scalar.
431
+ * this will modify the size of canvas element directly.
432
+ * Only use this if you are not using the automatic scaling feature.
433
+ * @function video.scale
434
+ * @see video.init
435
+ * @param {number} x - x scaling multiplier
436
+ * @param {number} y - y scaling multiplier
437
+ */
438
+ function scale(x, y) {
439
+ var canvas = renderer.getCanvas();
440
+ var context = renderer.getContext();
441
+ var settings = renderer.settings;
442
+ var pixelRatio = devicePixelRatio;
443
+
444
+ var w = settings.zoomX = canvas.width * x * pixelRatio;
445
+ var h = settings.zoomY = canvas.height * y * pixelRatio;
446
+
447
+ // update the global scale variable
448
+ scaleRatio.set(x * pixelRatio, y * pixelRatio);
449
+
450
+ // adjust CSS style based on device pixel ratio
451
+ canvas.style.width = (w / pixelRatio) + "px";
452
+ canvas.style.height = (h / pixelRatio) + "px";
453
+
454
+ // if anti-alias and blend mode were resetted (e.g. Canvas mode)
455
+ renderer.setAntiAlias(context, settings.antiAlias);
456
+ renderer.setBlendMode(settings.blendMode, context);
457
+
458
+ // force repaint
459
+ game.repaint();
460
+ }
461
+
462
+ export { AUTO, CANVAS, WEBGL, createCanvas, getParent, init, parent, renderer, scale, scaleRatio };