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.
- package/LICENSE.md +1 -1
- package/README.md +2 -2
- package/dist/melonjs.mjs/_virtual/_commonjsHelpers.js +1 -1
- package/dist/melonjs.mjs/_virtual/arraymultimap.js +1 -1
- package/dist/melonjs.mjs/_virtual/earcut.js +1 -1
- package/dist/melonjs.mjs/_virtual/howler.js +1 -1
- package/dist/melonjs.mjs/_virtual/index.js +1 -1
- package/dist/melonjs.mjs/_virtual/index2.js +1 -1
- package/dist/melonjs.mjs/_virtual/multimap.js +1 -1
- package/dist/melonjs.mjs/_virtual/setmultimap.js +1 -1
- package/dist/melonjs.mjs/application/application.js +1 -1
- package/dist/melonjs.mjs/application/header.js +1 -1
- package/dist/melonjs.mjs/application/resize.js +1 -1
- package/dist/melonjs.mjs/application/settings.js +1 -1
- package/dist/melonjs.mjs/audio/audio.js +2 -4
- package/dist/melonjs.mjs/camera/camera2d.js +1 -1
- package/dist/melonjs.mjs/const.js +1 -1
- package/dist/melonjs.mjs/entity/entity.js +1 -1
- package/dist/melonjs.mjs/geometries/ellipse.js +1 -1
- package/dist/melonjs.mjs/geometries/line.js +1 -1
- package/dist/melonjs.mjs/geometries/path2d.js +4 -4
- package/dist/melonjs.mjs/geometries/point.js +1 -1
- package/dist/melonjs.mjs/geometries/poly.js +1 -1
- package/dist/melonjs.mjs/geometries/rectangle.js +1 -1
- package/dist/melonjs.mjs/geometries/roundrect.js +1 -1
- package/dist/melonjs.mjs/index.js +5 -3
- package/dist/melonjs.mjs/input/gamepad.js +1 -1
- package/dist/melonjs.mjs/input/input.js +1 -1
- package/dist/melonjs.mjs/input/keyboard.js +1 -1
- package/dist/melonjs.mjs/input/pointer.js +1 -1
- package/dist/melonjs.mjs/input/pointerevent.js +2 -2
- package/dist/melonjs.mjs/lang/console.js +1 -1
- package/dist/melonjs.mjs/lang/deprecated.js +1 -1
- package/dist/melonjs.mjs/level/level.js +1 -1
- package/dist/melonjs.mjs/level/tiled/TMXGroup.js +1 -1
- package/dist/melonjs.mjs/level/tiled/TMXLayer.js +1 -1
- package/dist/melonjs.mjs/level/tiled/TMXObject.js +1 -1
- package/dist/melonjs.mjs/level/tiled/TMXTile.js +1 -1
- package/dist/melonjs.mjs/level/tiled/TMXTileMap.js +1 -1
- package/dist/melonjs.mjs/level/tiled/TMXTileset.js +1 -1
- package/dist/melonjs.mjs/level/tiled/TMXTilesetGroup.js +1 -1
- package/dist/melonjs.mjs/level/tiled/TMXUtils.js +1 -1
- package/dist/melonjs.mjs/level/tiled/constants.js +1 -1
- package/dist/melonjs.mjs/level/tiled/renderer/TMXHexagonalRenderer.js +1 -1
- package/dist/melonjs.mjs/level/tiled/renderer/TMXIsometricRenderer.js +1 -1
- package/dist/melonjs.mjs/level/tiled/renderer/TMXOrthogonalRenderer.js +1 -1
- package/dist/melonjs.mjs/level/tiled/renderer/TMXRenderer.js +1 -1
- package/dist/melonjs.mjs/level/tiled/renderer/TMXStaggeredRenderer.js +1 -1
- package/dist/melonjs.mjs/level/tiled/renderer/autodetect.js +1 -1
- package/dist/melonjs.mjs/loader/cache.js +1 -1
- package/dist/melonjs.mjs/loader/loader.js +1 -1
- package/dist/melonjs.mjs/loader/loadingscreen.js +1 -1
- package/dist/melonjs.mjs/loader/melonjs_logo.png.js +1 -1
- package/dist/melonjs.mjs/loader/parser.js +1 -1
- package/dist/melonjs.mjs/loader/settings.js +1 -1
- package/dist/melonjs.mjs/math/color.js +9 -8
- package/dist/melonjs.mjs/math/math.js +1 -1
- package/dist/melonjs.mjs/math/matrix2.js +1 -1
- package/dist/melonjs.mjs/math/matrix3.js +1 -1
- package/dist/melonjs.mjs/math/observable_vector2.js +1 -1
- package/dist/melonjs.mjs/math/observable_vector3.js +1 -1
- package/dist/melonjs.mjs/math/vector2.js +1 -1
- package/dist/melonjs.mjs/math/vector3.js +1 -1
- package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/src/arraymultimap.js +1 -1
- package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/src/index.js +1 -1
- package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/src/multimap.js +1 -1
- package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/src/setmultimap.js +1 -1
- package/dist/melonjs.mjs/node_modules/earcut/src/earcut.js +1 -1
- package/dist/melonjs.mjs/node_modules/eventemitter3/index.js +1 -1
- package/dist/melonjs.mjs/node_modules/eventemitter3/index2.js +1 -1
- package/dist/melonjs.mjs/node_modules/howler/dist/howler.js +1 -1
- package/dist/melonjs.mjs/particles/emitter.js +1 -1
- package/dist/melonjs.mjs/particles/particle.js +1 -1
- package/dist/melonjs.mjs/particles/settings.js +1 -1
- package/dist/melonjs.mjs/physics/body.js +1 -1
- package/dist/melonjs.mjs/physics/bounds.js +1 -1
- package/dist/melonjs.mjs/physics/collision.js +1 -1
- package/dist/melonjs.mjs/physics/detector.js +1 -1
- package/dist/melonjs.mjs/physics/quadtree.js +1 -1
- package/dist/melonjs.mjs/physics/response.js +1 -1
- package/dist/melonjs.mjs/physics/sat.js +1 -1
- package/dist/melonjs.mjs/physics/world.js +1 -1
- package/dist/melonjs.mjs/plugin/plugin.js +3 -3
- package/dist/melonjs.mjs/renderable/collectable.js +1 -1
- package/dist/melonjs.mjs/renderable/colorlayer.js +1 -1
- package/dist/melonjs.mjs/renderable/container.js +1 -1
- package/dist/melonjs.mjs/renderable/dragndrop.js +1 -1
- package/dist/melonjs.mjs/renderable/imagelayer.js +1 -1
- package/dist/melonjs.mjs/renderable/light2d.js +1 -1
- package/dist/melonjs.mjs/renderable/nineslicesprite.js +1 -1
- package/dist/melonjs.mjs/renderable/renderable.js +25 -3
- package/dist/melonjs.mjs/renderable/sprite.js +1 -1
- package/dist/melonjs.mjs/renderable/trigger.js +1 -1
- package/dist/melonjs.mjs/renderable/ui/uibaseelement.js +1 -1
- package/dist/melonjs.mjs/renderable/ui/uispriteelement.js +1 -1
- package/dist/melonjs.mjs/renderable/ui/uitextbutton.js +1 -3
- package/dist/melonjs.mjs/state/stage.js +1 -1
- package/dist/melonjs.mjs/state/state.js +1 -1
- package/dist/melonjs.mjs/system/device.js +2 -2
- package/dist/melonjs.mjs/system/dom.js +1 -1
- package/dist/melonjs.mjs/system/event.js +1 -1
- package/dist/melonjs.mjs/system/platform.js +1 -1
- package/dist/melonjs.mjs/system/pooling.js +1 -1
- package/dist/melonjs.mjs/system/save.js +1 -1
- package/dist/melonjs.mjs/system/timer.js +1 -1
- package/dist/melonjs.mjs/text/bitmaptext.js +1 -1
- package/dist/melonjs.mjs/text/bitmaptextdata.js +1 -1
- package/dist/melonjs.mjs/text/glyph.js +1 -1
- package/dist/melonjs.mjs/text/text.js +56 -86
- package/dist/melonjs.mjs/text/textmetrics.js +1 -1
- package/dist/melonjs.mjs/text/textstyle.js +4 -6
- package/dist/melonjs.mjs/tweens/easing.js +1 -1
- package/dist/melonjs.mjs/tweens/interpolation.js +1 -1
- package/dist/melonjs.mjs/tweens/tween.js +1 -1
- package/dist/melonjs.mjs/utils/agent.js +1 -1
- package/dist/melonjs.mjs/utils/array.js +1 -1
- package/dist/melonjs.mjs/utils/file.js +1 -1
- package/dist/melonjs.mjs/utils/function.js +1 -1
- package/dist/melonjs.mjs/utils/string.js +1 -1
- package/dist/melonjs.mjs/utils/utils.js +1 -1
- package/dist/melonjs.mjs/video/canvas/canvas_renderer.js +7 -11
- package/dist/melonjs.mjs/video/renderer.js +2 -13
- package/dist/melonjs.mjs/video/texture/atlas.js +3 -9
- package/dist/melonjs.mjs/video/texture/cache.js +1 -1
- package/dist/melonjs.mjs/video/texture/canvas_texture.js +1 -1
- package/dist/melonjs.mjs/video/utils/autodetect.js +1 -1
- package/dist/melonjs.mjs/video/video.js +1 -1
- package/dist/melonjs.mjs/video/webgl/buffer/vertex.js +21 -17
- package/dist/melonjs.mjs/video/webgl/compositors/compositor.js +77 -77
- package/dist/melonjs.mjs/video/webgl/compositors/primitive_compositor.js +77 -0
- package/dist/melonjs.mjs/video/webgl/compositors/quad_compositor.js +249 -0
- package/dist/melonjs.mjs/video/webgl/compositors/webgl_compositor.js +1 -1
- package/dist/melonjs.mjs/video/webgl/glshader.js +1 -1
- package/dist/melonjs.mjs/video/webgl/shaders/primitive.frag.js +1 -1
- package/dist/melonjs.mjs/video/webgl/shaders/primitive.vert.js +2 -2
- package/dist/melonjs.mjs/video/webgl/shaders/quad.frag.js +1 -1
- package/dist/melonjs.mjs/video/webgl/shaders/quad.vert.js +2 -2
- package/dist/melonjs.mjs/video/webgl/utils/attributes.js +1 -1
- package/dist/melonjs.mjs/video/webgl/utils/precision.js +1 -1
- package/dist/melonjs.mjs/video/webgl/utils/program.js +1 -1
- package/dist/melonjs.mjs/video/webgl/utils/string.js +1 -1
- package/dist/melonjs.mjs/video/webgl/utils/uniforms.js +1 -1
- package/dist/melonjs.mjs/video/webgl/webgl_renderer.js +139 -149
- package/dist/melonjs.module.js +25111 -25202
- package/dist/types/entity/entity.d.ts +1 -1
- package/dist/types/index.d.ts +4 -2
- package/dist/types/renderable/renderable.d.ts +6 -0
- package/dist/types/renderable/ui/uitextbutton.d.ts +0 -1
- package/dist/types/text/text.d.ts +6 -20
- package/dist/types/text/textstyle.d.ts +1 -1
- package/dist/types/video/canvas/canvas_renderer.d.ts +0 -5
- package/dist/types/video/renderer.d.ts +1 -5
- package/dist/types/video/webgl/buffer/vertex.d.ts +3 -3
- package/dist/types/video/webgl/compositors/compositor.d.ts +38 -32
- package/dist/types/video/webgl/compositors/primitive_compositor.d.ts +22 -0
- package/dist/types/video/webgl/compositors/quad_compositor.d.ts +72 -0
- package/dist/types/video/webgl/webgl_renderer.d.ts +34 -28
- package/package.json +13 -14
- package/src/audio/audio.js +1 -3
- package/src/geometries/path2d.js +3 -3
- package/src/index.js +6 -2
- package/src/math/color.js +8 -7
- package/src/polyfill/index.js +0 -2
- package/src/renderable/renderable.js +24 -2
- package/src/renderable/ui/uitextbutton.js +0 -2
- package/src/system/device.js +1 -1
- package/src/text/text.js +55 -85
- package/src/text/textstyle.js +3 -5
- package/src/video/canvas/canvas_renderer.js +5 -9
- package/src/video/renderer.js +0 -11
- package/src/video/texture/atlas.js +2 -8
- package/src/video/webgl/buffer/vertex.js +20 -16
- package/src/video/webgl/compositors/compositor.js +76 -77
- package/src/video/webgl/compositors/primitive_compositor.js +68 -0
- package/src/video/webgl/compositors/{webgl_compositor.js → quad_compositor.js} +38 -98
- package/src/video/webgl/shaders/primitive.vert +2 -5
- package/src/video/webgl/shaders/quad.vert +3 -1
- package/src/video/webgl/webgl_renderer.js +137 -147
- package/dist/melonjs.mjs/_virtual/make-built-in.js +0 -10
- package/dist/melonjs.mjs/_virtual/object-define-property.js +0 -10
- package/dist/melonjs.mjs/_virtual/object-get-own-property-descriptor.js +0 -10
- package/dist/melonjs.mjs/_virtual/object-get-own-property-names.js +0 -10
- package/dist/melonjs.mjs/_virtual/object-get-own-property-symbols.js +0 -10
- package/dist/melonjs.mjs/_virtual/object-property-is-enumerable.js +0 -10
- package/dist/melonjs.mjs/_virtual/shared.js +0 -10
- package/dist/melonjs.mjs/game.js +0 -29
- package/dist/melonjs.mjs/polyfill/console.js +0 -18
- package/dist/melonjs.mjs/polyfill/performance.js +0 -27
- package/dist/melonjs.mjs/polyfill/requestAnimationFrame.js +0 -46
- package/dist/melonjs.mjs/polyfill/roundrect.js +0 -242
- package/dist/melonjs.mjs/renderable/re_container.js +0 -1016
- package/dist/melonjs.mjs/video/utils/resize.js +0 -116
- package/dist/melonjs.mjs/video/webgl/webgl_compositor.js +0 -494
- package/src/polyfill/performance.js +0 -20
- package/src/polyfill/requestAnimationFrame.js +0 -39
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import
|
|
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
|
-
*
|
|
44
|
+
* the default shader created by this compositor
|
|
38
45
|
* @type {GLShader}
|
|
39
46
|
*/
|
|
40
|
-
this.
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
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
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
|
|
97
|
-
|
|
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.
|
|
198
|
+
this.currentShader.setUniform("uProjectionMatrix", matrix);
|
|
162
199
|
}
|
|
163
200
|
|
|
164
201
|
/**
|
|
165
|
-
*
|
|
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.
|
|
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
|
|
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[]}
|
|
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,
|
|
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
|
|
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
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
|
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,
|
|
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 (
|
|
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
|
-
|
|
250
|
-
|
|
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
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
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(
|
|
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
|
-
|
|
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;
|