@scratch/scratch-render 11.0.0-beta.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/.nvmrc +1 -0
- package/CHANGELOG.md +2281 -0
- package/LICENSE +12 -0
- package/README.md +87 -0
- package/TRADEMARK +1 -0
- package/commitlint.config.js +4 -0
- package/docs/Rectangle-AABB-Matrix.md +192 -0
- package/package.json +84 -0
- package/release.config.js +10 -0
- package/src/BitmapSkin.js +120 -0
- package/src/Drawable.js +734 -0
- package/src/EffectTransform.js +197 -0
- package/src/PenSkin.js +350 -0
- package/src/Rectangle.js +196 -0
- package/src/RenderConstants.js +34 -0
- package/src/RenderWebGL.js +2029 -0
- package/src/SVGSkin.js +239 -0
- package/src/ShaderManager.js +187 -0
- package/src/Silhouette.js +257 -0
- package/src/Skin.js +235 -0
- package/src/TextBubbleSkin.js +284 -0
- package/src/index.js +7 -0
- package/src/playground/getMousePosition.js +37 -0
- package/src/playground/index.html +41 -0
- package/src/playground/playground.js +202 -0
- package/src/playground/queryPlayground.html +73 -0
- package/src/playground/queryPlayground.js +196 -0
- package/src/playground/style.css +11 -0
- package/src/shaders/sprite.frag +249 -0
- package/src/shaders/sprite.vert +75 -0
- package/src/util/canvas-measurement-provider.js +41 -0
- package/src/util/color-conversions.js +97 -0
- package/src/util/log.js +4 -0
- package/src/util/text-wrapper.js +112 -0
package/src/Rectangle.js
ADDED
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
class Rectangle {
|
|
2
|
+
/**
|
|
3
|
+
* A utility for creating and comparing axis-aligned rectangles.
|
|
4
|
+
* Rectangles are always initialized to the "largest possible rectangle";
|
|
5
|
+
* use one of the init* methods below to set up a particular rectangle.
|
|
6
|
+
* @constructor
|
|
7
|
+
*/
|
|
8
|
+
constructor () {
|
|
9
|
+
this.left = -Infinity;
|
|
10
|
+
this.right = Infinity;
|
|
11
|
+
this.bottom = -Infinity;
|
|
12
|
+
this.top = Infinity;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Initialize a Rectangle from given Scratch-coordinate bounds.
|
|
17
|
+
* @param {number} left Left bound of the rectangle.
|
|
18
|
+
* @param {number} right Right bound of the rectangle.
|
|
19
|
+
* @param {number} bottom Bottom bound of the rectangle.
|
|
20
|
+
* @param {number} top Top bound of the rectangle.
|
|
21
|
+
*/
|
|
22
|
+
initFromBounds (left, right, bottom, top) {
|
|
23
|
+
this.left = left;
|
|
24
|
+
this.right = right;
|
|
25
|
+
this.bottom = bottom;
|
|
26
|
+
this.top = top;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Initialize a Rectangle to the minimum AABB around a set of points.
|
|
31
|
+
* @param {Array<Array<number>>} points Array of [x, y] points.
|
|
32
|
+
*/
|
|
33
|
+
initFromPointsAABB (points) {
|
|
34
|
+
this.left = Infinity;
|
|
35
|
+
this.right = -Infinity;
|
|
36
|
+
this.top = -Infinity;
|
|
37
|
+
this.bottom = Infinity;
|
|
38
|
+
|
|
39
|
+
for (let i = 0; i < points.length; i++) {
|
|
40
|
+
const x = points[i][0];
|
|
41
|
+
const y = points[i][1];
|
|
42
|
+
if (x < this.left) {
|
|
43
|
+
this.left = x;
|
|
44
|
+
}
|
|
45
|
+
if (x > this.right) {
|
|
46
|
+
this.right = x;
|
|
47
|
+
}
|
|
48
|
+
if (y > this.top) {
|
|
49
|
+
this.top = y;
|
|
50
|
+
}
|
|
51
|
+
if (y < this.bottom) {
|
|
52
|
+
this.bottom = y;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Initialize a Rectangle to a 1 unit square centered at 0 x 0 transformed
|
|
59
|
+
* by a model matrix.
|
|
60
|
+
* @param {Array.<number>} m A 4x4 matrix to transform the rectangle by.
|
|
61
|
+
* @tutorial Rectangle-AABB-Matrix
|
|
62
|
+
*/
|
|
63
|
+
initFromModelMatrix (m) {
|
|
64
|
+
// In 2D space, we will soon use the 2x2 "top left" scale and rotation
|
|
65
|
+
// submatrix, while we store and the 1x2 "top right" that position
|
|
66
|
+
// vector.
|
|
67
|
+
const m30 = m[(3 * 4) + 0];
|
|
68
|
+
const m31 = m[(3 * 4) + 1];
|
|
69
|
+
|
|
70
|
+
// "Transform" a (0.5, 0.5) vector by the scale and rotation matrix but
|
|
71
|
+
// sum the absolute of each component instead of use the signed values.
|
|
72
|
+
const x = Math.abs(0.5 * m[(0 * 4) + 0]) + Math.abs(0.5 * m[(1 * 4) + 0]);
|
|
73
|
+
const y = Math.abs(0.5 * m[(0 * 4) + 1]) + Math.abs(0.5 * m[(1 * 4) + 1]);
|
|
74
|
+
|
|
75
|
+
// And adding them to the position components initializes our Rectangle.
|
|
76
|
+
this.left = -x + m30;
|
|
77
|
+
this.right = x + m30;
|
|
78
|
+
this.top = y + m31;
|
|
79
|
+
this.bottom = -y + m31;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Determine if this Rectangle intersects some other.
|
|
84
|
+
* Note that this is a comparison assuming the Rectangle was
|
|
85
|
+
* initialized with Scratch-space bounds or points.
|
|
86
|
+
* @param {!Rectangle} other Rectangle to check if intersecting.
|
|
87
|
+
* @return {boolean} True if this Rectangle intersects other.
|
|
88
|
+
*/
|
|
89
|
+
intersects (other) {
|
|
90
|
+
return (
|
|
91
|
+
this.left <= other.right &&
|
|
92
|
+
other.left <= this.right &&
|
|
93
|
+
this.top >= other.bottom &&
|
|
94
|
+
other.top >= this.bottom
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Determine if this Rectangle fully contains some other.
|
|
100
|
+
* Note that this is a comparison assuming the Rectangle was
|
|
101
|
+
* initialized with Scratch-space bounds or points.
|
|
102
|
+
* @param {!Rectangle} other Rectangle to check if fully contained.
|
|
103
|
+
* @return {boolean} True if this Rectangle fully contains other.
|
|
104
|
+
*/
|
|
105
|
+
contains (other) {
|
|
106
|
+
return (
|
|
107
|
+
other.left > this.left &&
|
|
108
|
+
other.right < this.right &&
|
|
109
|
+
other.top < this.top &&
|
|
110
|
+
other.bottom > this.bottom
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Clamp a Rectangle to bounds.
|
|
116
|
+
* @param {number} left Left clamp.
|
|
117
|
+
* @param {number} right Right clamp.
|
|
118
|
+
* @param {number} bottom Bottom clamp.
|
|
119
|
+
* @param {number} top Top clamp.
|
|
120
|
+
*/
|
|
121
|
+
clamp (left, right, bottom, top) {
|
|
122
|
+
this.left = Math.max(this.left, left);
|
|
123
|
+
this.right = Math.min(this.right, right);
|
|
124
|
+
this.bottom = Math.max(this.bottom, bottom);
|
|
125
|
+
this.top = Math.min(this.top, top);
|
|
126
|
+
|
|
127
|
+
this.left = Math.min(this.left, right);
|
|
128
|
+
this.right = Math.max(this.right, left);
|
|
129
|
+
this.bottom = Math.min(this.bottom, top);
|
|
130
|
+
this.top = Math.max(this.top, bottom);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Push out the Rectangle to integer bounds.
|
|
135
|
+
*/
|
|
136
|
+
snapToInt () {
|
|
137
|
+
this.left = Math.floor(this.left);
|
|
138
|
+
this.right = Math.ceil(this.right);
|
|
139
|
+
this.bottom = Math.floor(this.bottom);
|
|
140
|
+
this.top = Math.ceil(this.top);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Compute the intersection of two bounding Rectangles.
|
|
145
|
+
* Could be an impossible box if they don't intersect.
|
|
146
|
+
* @param {Rectangle} a One rectangle
|
|
147
|
+
* @param {Rectangle} b Other rectangle
|
|
148
|
+
* @param {?Rectangle} result A resulting storage rectangle (safe to pass
|
|
149
|
+
* a or b if you want to overwrite one)
|
|
150
|
+
* @returns {Rectangle} resulting rectangle
|
|
151
|
+
*/
|
|
152
|
+
static intersect (a, b, result = new Rectangle()) {
|
|
153
|
+
result.left = Math.max(a.left, b.left);
|
|
154
|
+
result.right = Math.min(a.right, b.right);
|
|
155
|
+
result.top = Math.min(a.top, b.top);
|
|
156
|
+
result.bottom = Math.max(a.bottom, b.bottom);
|
|
157
|
+
|
|
158
|
+
return result;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Compute the union of two bounding Rectangles.
|
|
163
|
+
* @param {Rectangle} a One rectangle
|
|
164
|
+
* @param {Rectangle} b Other rectangle
|
|
165
|
+
* @param {?Rectangle} result A resulting storage rectangle (safe to pass
|
|
166
|
+
* a or b if you want to overwrite one)
|
|
167
|
+
* @returns {Rectangle} resulting rectangle
|
|
168
|
+
*/
|
|
169
|
+
static union (a, b, result = new Rectangle()) {
|
|
170
|
+
result.left = Math.min(a.left, b.left);
|
|
171
|
+
result.right = Math.max(a.right, b.right);
|
|
172
|
+
// Scratch Space - +y is up
|
|
173
|
+
result.top = Math.max(a.top, b.top);
|
|
174
|
+
result.bottom = Math.min(a.bottom, b.bottom);
|
|
175
|
+
return result;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Width of the Rectangle.
|
|
180
|
+
* @return {number} Width of rectangle.
|
|
181
|
+
*/
|
|
182
|
+
get width () {
|
|
183
|
+
return Math.abs(this.left - this.right);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Height of the Rectangle.
|
|
188
|
+
* @return {number} Height of rectangle.
|
|
189
|
+
*/
|
|
190
|
+
get height () {
|
|
191
|
+
return Math.abs(this.top - this.bottom);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
module.exports = Rectangle;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** @module RenderConstants */
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Various constants meant for use throughout the renderer.
|
|
5
|
+
* @enum
|
|
6
|
+
*/
|
|
7
|
+
module.exports = {
|
|
8
|
+
/**
|
|
9
|
+
* The ID value to use for "no item" or when an object has been disposed.
|
|
10
|
+
* @const {int}
|
|
11
|
+
*/
|
|
12
|
+
ID_NONE: -1,
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Optimize for fewer than this number of Drawables sharing the same Skin.
|
|
16
|
+
* Going above this may cause middleware warnings or a performance penalty but should otherwise behave correctly.
|
|
17
|
+
* @const {int}
|
|
18
|
+
*/
|
|
19
|
+
SKIN_SHARE_SOFT_LIMIT: 301,
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @enum {string}
|
|
23
|
+
*/
|
|
24
|
+
Events: {
|
|
25
|
+
/**
|
|
26
|
+
* NativeSizeChanged event
|
|
27
|
+
*
|
|
28
|
+
* @event RenderWebGL#event:NativeSizeChanged
|
|
29
|
+
* @type {object}
|
|
30
|
+
* @property {Array<int>} newSize - the new size of the renderer
|
|
31
|
+
*/
|
|
32
|
+
NativeSizeChanged: 'NativeSizeChanged'
|
|
33
|
+
}
|
|
34
|
+
};
|