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.
- package/README.md +2 -0
- package/dist/melonjs.mjs/_virtual/_commonjsHelpers.js +10 -0
- package/dist/melonjs.mjs/_virtual/arraymultimap.js +10 -0
- package/dist/melonjs.mjs/_virtual/earcut.js +10 -0
- package/dist/melonjs.mjs/_virtual/howler.js +10 -0
- package/dist/melonjs.mjs/_virtual/index.js +10 -0
- package/dist/melonjs.mjs/_virtual/index2.js +10 -0
- package/dist/melonjs.mjs/_virtual/multimap.js +10 -0
- package/dist/melonjs.mjs/_virtual/setmultimap.js +10 -0
- package/dist/melonjs.mjs/application/application.js +238 -0
- package/dist/melonjs.mjs/audio/audio.js +536 -0
- package/dist/melonjs.mjs/camera/camera2d.js +731 -0
- package/dist/melonjs.mjs/entity/entity.js +247 -0
- package/dist/melonjs.mjs/game.js +29 -0
- package/dist/melonjs.mjs/geometries/ellipse.js +274 -0
- package/dist/melonjs.mjs/geometries/line.js +115 -0
- package/dist/melonjs.mjs/geometries/path2d.js +318 -0
- package/dist/melonjs.mjs/geometries/point.js +88 -0
- package/dist/melonjs.mjs/geometries/poly.js +498 -0
- package/dist/melonjs.mjs/geometries/rectangle.js +374 -0
- package/dist/melonjs.mjs/geometries/roundrect.js +167 -0
- package/dist/melonjs.mjs/index.js +248 -0
- package/dist/melonjs.mjs/input/gamepad.js +501 -0
- package/dist/melonjs.mjs/input/input.js +26 -0
- package/dist/melonjs.mjs/input/keyboard.js +470 -0
- package/dist/melonjs.mjs/input/pointer.js +393 -0
- package/dist/melonjs.mjs/input/pointerevent.js +818 -0
- package/dist/melonjs.mjs/lang/deprecated.js +157 -0
- package/dist/melonjs.mjs/level/level.js +297 -0
- package/dist/melonjs.mjs/level/tiled/TMXGroup.js +141 -0
- package/dist/melonjs.mjs/level/tiled/TMXLayer.js +446 -0
- package/dist/melonjs.mjs/level/tiled/TMXObject.js +355 -0
- package/dist/melonjs.mjs/level/tiled/TMXTile.js +193 -0
- package/dist/melonjs.mjs/level/tiled/TMXTileMap.js +636 -0
- package/dist/melonjs.mjs/level/tiled/TMXTileset.js +309 -0
- package/dist/melonjs.mjs/level/tiled/TMXTilesetGroup.js +81 -0
- package/dist/melonjs.mjs/level/tiled/TMXUtils.js +367 -0
- package/dist/melonjs.mjs/level/tiled/renderer/TMXHexagonalRenderer.js +504 -0
- package/dist/melonjs.mjs/level/tiled/renderer/TMXIsometricRenderer.js +218 -0
- package/dist/melonjs.mjs/level/tiled/renderer/TMXOrthogonalRenderer.js +155 -0
- package/dist/melonjs.mjs/level/tiled/renderer/TMXRenderer.js +124 -0
- package/dist/melonjs.mjs/level/tiled/renderer/TMXStaggeredRenderer.js +107 -0
- package/dist/melonjs.mjs/loader/loader.js +801 -0
- package/dist/melonjs.mjs/loader/loadingscreen.js +120 -0
- package/dist/melonjs.mjs/loader/melonjs_logo.png.js +11 -0
- package/dist/melonjs.mjs/math/color.js +616 -0
- package/dist/melonjs.mjs/math/math.js +218 -0
- package/dist/melonjs.mjs/math/matrix2.js +501 -0
- package/dist/melonjs.mjs/math/matrix3.js +679 -0
- package/dist/melonjs.mjs/math/observable_vector2.js +469 -0
- package/dist/melonjs.mjs/math/observable_vector3.js +559 -0
- package/dist/melonjs.mjs/math/vector2.js +526 -0
- package/dist/melonjs.mjs/math/vector3.js +567 -0
- package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/src/arraymultimap.js +73 -0
- package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/src/index.js +21 -0
- package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/src/multimap.js +324 -0
- package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/src/setmultimap.js +69 -0
- package/dist/melonjs.mjs/node_modules/earcut/src/earcut.js +691 -0
- package/dist/melonjs.mjs/node_modules/eventemitter3/index.js +350 -0
- package/dist/melonjs.mjs/node_modules/howler/dist/howler.js +3241 -0
- package/dist/melonjs.mjs/particles/emitter.js +265 -0
- package/dist/melonjs.mjs/particles/particle.js +186 -0
- package/dist/melonjs.mjs/particles/settings.js +319 -0
- package/dist/melonjs.mjs/physics/body.js +702 -0
- package/dist/melonjs.mjs/physics/bounds.js +459 -0
- package/dist/melonjs.mjs/physics/collision.js +132 -0
- package/dist/melonjs.mjs/physics/detector.js +194 -0
- package/dist/melonjs.mjs/physics/quadtree.js +394 -0
- package/dist/melonjs.mjs/physics/response.js +57 -0
- package/dist/melonjs.mjs/physics/sat.js +483 -0
- package/dist/melonjs.mjs/physics/world.js +219 -0
- package/dist/melonjs.mjs/plugin/plugin.js +141 -0
- package/dist/melonjs.mjs/renderable/collectable.js +60 -0
- package/dist/melonjs.mjs/renderable/colorlayer.js +78 -0
- package/dist/melonjs.mjs/renderable/container.js +1016 -0
- package/dist/melonjs.mjs/renderable/dragndrop.js +224 -0
- package/dist/melonjs.mjs/renderable/imagelayer.js +305 -0
- package/dist/melonjs.mjs/renderable/light2d.js +155 -0
- package/dist/melonjs.mjs/renderable/nineslicesprite.js +246 -0
- package/dist/melonjs.mjs/renderable/renderable.js +781 -0
- package/dist/melonjs.mjs/renderable/sprite.js +653 -0
- package/dist/melonjs.mjs/renderable/trigger.js +156 -0
- package/dist/melonjs.mjs/renderable/ui/uibaseelement.js +212 -0
- package/dist/melonjs.mjs/renderable/ui/uispriteelement.js +225 -0
- package/dist/melonjs.mjs/renderable/ui/uitextbutton.js +127 -0
- package/dist/melonjs.mjs/state/stage.js +236 -0
- package/dist/melonjs.mjs/state/state.js +596 -0
- package/dist/melonjs.mjs/system/device.js +909 -0
- package/dist/melonjs.mjs/system/dom.js +78 -0
- package/dist/melonjs.mjs/system/event.js +537 -0
- package/dist/melonjs.mjs/system/platform.js +41 -0
- package/dist/melonjs.mjs/system/pooling.js +209 -0
- package/dist/melonjs.mjs/system/save.js +157 -0
- package/dist/melonjs.mjs/system/timer.js +286 -0
- package/dist/melonjs.mjs/text/bitmaptext.js +363 -0
- package/dist/melonjs.mjs/text/bitmaptextdata.js +198 -0
- package/dist/melonjs.mjs/text/glyph.js +65 -0
- package/dist/melonjs.mjs/text/text.js +452 -0
- package/dist/melonjs.mjs/text/textmetrics.js +175 -0
- package/dist/melonjs.mjs/text/textstyle.js +23 -0
- package/dist/melonjs.mjs/tweens/easing.js +336 -0
- package/dist/melonjs.mjs/tweens/interpolation.js +112 -0
- package/dist/melonjs.mjs/tweens/tween.js +479 -0
- package/dist/melonjs.mjs/utils/agent.js +76 -0
- package/dist/melonjs.mjs/utils/array.js +63 -0
- package/dist/melonjs.mjs/utils/file.js +42 -0
- package/dist/melonjs.mjs/utils/function.js +70 -0
- package/dist/melonjs.mjs/utils/string.js +82 -0
- package/dist/melonjs.mjs/utils/utils.js +173 -0
- package/dist/melonjs.mjs/video/canvas/canvas_renderer.js +806 -0
- package/dist/melonjs.mjs/video/renderer.js +410 -0
- package/dist/melonjs.mjs/video/texture/atlas.js +519 -0
- package/dist/melonjs.mjs/video/texture/cache.js +143 -0
- package/dist/melonjs.mjs/video/texture/canvas_texture.js +144 -0
- package/dist/melonjs.mjs/video/video.js +462 -0
- package/dist/melonjs.mjs/video/webgl/buffer/vertex.js +142 -0
- package/dist/melonjs.mjs/video/webgl/glshader.js +167 -0
- package/dist/melonjs.mjs/video/webgl/shaders/primitive.frag.js +10 -0
- package/dist/melonjs.mjs/video/webgl/shaders/primitive.vert.js +10 -0
- package/dist/melonjs.mjs/video/webgl/shaders/quad.frag.js +10 -0
- package/dist/melonjs.mjs/video/webgl/shaders/quad.vert.js +10 -0
- package/dist/melonjs.mjs/video/webgl/utils/attributes.js +25 -0
- package/dist/melonjs.mjs/video/webgl/utils/precision.js +20 -0
- package/dist/melonjs.mjs/video/webgl/utils/program.js +67 -0
- package/dist/melonjs.mjs/video/webgl/utils/string.js +25 -0
- package/dist/melonjs.mjs/video/webgl/utils/uniforms.js +92 -0
- package/dist/melonjs.mjs/video/webgl/webgl_compositor.js +494 -0
- package/dist/melonjs.mjs/video/webgl/webgl_renderer.js +1035 -0
- package/dist/melonjs.module.d.ts +1298 -1359
- package/dist/melonjs.module.js +2072 -3520
- package/package.json +21 -16
- package/src/application/application.js +4 -5
- package/src/audio/audio.js +32 -32
- package/src/camera/camera2d.js +32 -33
- package/src/entity/entity.js +18 -19
- package/src/geometries/ellipse.js +17 -18
- package/src/geometries/line.js +6 -7
- package/src/geometries/path2d.js +33 -34
- package/src/geometries/point.js +1 -2
- package/src/geometries/poly.js +16 -18
- package/src/geometries/rectangle.js +19 -20
- package/src/geometries/roundrect.js +9 -10
- package/src/input/gamepad.js +15 -15
- package/src/input/keyboard.js +12 -12
- package/src/input/pointer.js +6 -6
- package/src/input/pointerevent.js +12 -12
- package/src/lang/deprecated.js +12 -12
- package/src/level/level.js +25 -25
- package/src/level/tiled/TMXLayer.js +23 -24
- package/src/level/tiled/TMXTile.js +6 -7
- package/src/level/tiled/TMXTileMap.js +8 -10
- package/src/level/tiled/TMXTileset.js +3 -4
- package/src/level/tiled/TMXTilesetGroup.js +1 -2
- package/src/level/tiled/TMXUtils.js +5 -5
- package/src/level/tiled/renderer/TMXHexagonalRenderer.js +3 -4
- package/src/level/tiled/renderer/TMXIsometricRenderer.js +3 -4
- package/src/level/tiled/renderer/TMXOrthogonalRenderer.js +2 -3
- package/src/level/tiled/renderer/TMXRenderer.js +20 -21
- package/src/level/tiled/renderer/TMXStaggeredRenderer.js +1 -2
- package/src/loader/loader.js +20 -20
- package/src/math/color.js +21 -22
- package/src/math/math.js +16 -16
- package/src/math/matrix2.js +17 -18
- package/src/math/matrix3.js +26 -27
- package/src/math/observable_vector2.js +15 -16
- package/src/math/observable_vector3.js +17 -18
- package/src/math/vector2.js +10 -11
- package/src/math/vector3.js +11 -12
- package/src/particles/emitter.js +7 -8
- package/src/particles/particle.js +3 -4
- package/src/physics/body.js +29 -30
- package/src/physics/bounds.js +10 -10
- package/src/physics/collision.js +2 -2
- package/src/physics/detector.js +6 -6
- package/src/physics/quadtree.js +18 -23
- package/src/physics/sat.js +31 -31
- package/src/physics/world.js +6 -7
- package/src/plugin/plugin.js +5 -5
- package/src/renderable/collectable.js +4 -6
- package/src/renderable/colorlayer.js +6 -8
- package/src/renderable/container.js +25 -27
- package/src/renderable/dragndrop.js +14 -14
- package/src/renderable/imagelayer.js +14 -15
- package/src/renderable/light2d.js +4 -5
- package/src/renderable/nineslicesprite.js +17 -18
- package/src/renderable/renderable.js +26 -28
- package/src/renderable/sprite.js +29 -30
- package/src/renderable/trigger.js +16 -17
- package/src/renderable/ui/uibaseelement.js +8 -9
- package/src/renderable/ui/uispriteelement.js +8 -8
- package/src/renderable/ui/uitextbutton.js +15 -15
- package/src/state/stage.js +8 -9
- package/src/state/state.js +17 -17
- package/src/system/device.js +11 -11
- package/src/system/event.js +10 -10
- package/src/system/pooling.js +9 -9
- package/src/system/save.js +2 -2
- package/src/system/timer.js +10 -10
- package/src/text/bitmaptext.js +19 -20
- package/src/text/bitmaptextdata.js +3 -4
- package/src/text/glyph.js +1 -2
- package/src/text/text.js +24 -25
- package/src/text/textmetrics.js +9 -10
- package/src/tweens/tween.js +20 -21
- package/src/utils/agent.js +5 -5
- package/src/utils/array.js +4 -4
- package/src/utils/file.js +2 -2
- package/src/utils/function.js +6 -6
- package/src/utils/string.js +5 -5
- package/src/utils/utils.js +4 -4
- package/src/video/canvas/canvas_renderer.js +72 -73
- package/src/video/renderer.js +27 -28
- package/src/video/texture/atlas.js +22 -22
- package/src/video/texture/canvas_texture.js +9 -9
- package/src/video/video.js +17 -17
- package/src/video/webgl/buffer/vertex.js +1 -2
- package/src/video/webgl/glshader.js +12 -12
- package/src/video/webgl/webgl_compositor.js +42 -43
- 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 };
|