@turbowarp/types 0.0.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/.github/workflows/validate.yml +24 -0
- package/LICENSE +202 -0
- package/README.md +87 -0
- package/index.d.ts +40 -0
- package/package.json +28 -0
- package/tests/blockly.ts +15 -0
- package/tests/cjs-es6.js +4 -0
- package/tests/cjs-js.js +3 -0
- package/tests/deprecated.js +4 -0
- package/tests/events.ts +15 -0
- package/tests/render.ts +8 -0
- package/tests/ts-es6.ts +4 -0
- package/tests/ts-require.ts +4 -0
- package/tests/vm.ts +49 -0
- package/tsconfig.json +18 -0
- package/types/events.d.ts +14 -0
- package/types/immutable.d.ts +6 -0
- package/types/jszip.d.ts +10 -0
- package/types/scratch-audio.d.ts +29 -0
- package/types/scratch-blocks.d.ts +183 -0
- package/types/scratch-parser.d.ts +6 -0
- package/types/scratch-render-fonts.d.ts +6 -0
- package/types/scratch-render.d.ts +686 -0
- package/types/scratch-storage.d.ts +20 -0
- package/types/scratch-svg-renderer.d.ts +6 -0
- package/types/scratch-vm.d.ts +1460 -0
- package/types/twgl.d.ts +21 -0
|
@@ -0,0 +1,686 @@
|
|
|
1
|
+
// Type definitions for scratch-render
|
|
2
|
+
// Project: https://github.com/LLK/scratch-render
|
|
3
|
+
|
|
4
|
+
/// <reference path="./twgl.d.ts" />
|
|
5
|
+
/// <reference path="./events.d.ts" />
|
|
6
|
+
|
|
7
|
+
declare namespace RenderWebGL {
|
|
8
|
+
type AnyWebGLContext = WebGLRenderingContext | WebGL2RenderingContext;
|
|
9
|
+
|
|
10
|
+
type BitmapResolution = 1 | 2;
|
|
11
|
+
|
|
12
|
+
type BitmapData = ImageData | ImageBitmap | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement;
|
|
13
|
+
|
|
14
|
+
const enum LayerGroup {
|
|
15
|
+
// The renderer can be configured to use any strings as group names, but these are the groups
|
|
16
|
+
// that scratch-vm uses, listed in order.
|
|
17
|
+
Background = 'background',
|
|
18
|
+
Video = 'video',
|
|
19
|
+
Pen = 'pen',
|
|
20
|
+
Sprite = 'sprite'
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const enum UseGpuModes {
|
|
24
|
+
Automatic = 'Automatic',
|
|
25
|
+
ForceGPU = 'ForceGPU',
|
|
26
|
+
ForceCPU = 'ForceCPU'
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const enum Effect {
|
|
30
|
+
Color = 'color',
|
|
31
|
+
Fisheye = 'fisheye',
|
|
32
|
+
Whirl = 'whirl',
|
|
33
|
+
Pixelate = 'pixelate',
|
|
34
|
+
Brightness = 'brightness',
|
|
35
|
+
Ghost = 'ghost'
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// TODO: document bit masks
|
|
39
|
+
type EffectMask = number;
|
|
40
|
+
|
|
41
|
+
const enum DrawMode {
|
|
42
|
+
Default = 'default',
|
|
43
|
+
StraightAlpha = 'straightAlpha',
|
|
44
|
+
Silhouette = 'silhouette',
|
|
45
|
+
ColorMask = 'colorMask',
|
|
46
|
+
Line = 'line',
|
|
47
|
+
Background = 'background'
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
interface Rectangle {
|
|
51
|
+
left: number;
|
|
52
|
+
right: number;
|
|
53
|
+
bottom: number;
|
|
54
|
+
top: number;
|
|
55
|
+
width: number;
|
|
56
|
+
height: number;
|
|
57
|
+
intersects(other: Rectangle): boolean;
|
|
58
|
+
contains(other: Rectangle): boolean;
|
|
59
|
+
initFromBounds(left: number, right: number, bottom: number, top: number): void;
|
|
60
|
+
initFromPointsAABB(points: [number, number][]): void;
|
|
61
|
+
initFromModelMatrix(matrix4x4: number[]): void;
|
|
62
|
+
clamp(left: number, right: number, bottom: number, top: number): void;
|
|
63
|
+
snapToInt(): void;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Suggested properties of a drawing region. Strictly, this can really be whatever you want it to be.
|
|
68
|
+
*/
|
|
69
|
+
interface DrawingRegion {
|
|
70
|
+
enter?(): void;
|
|
71
|
+
exit?(): void;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
interface Shader {
|
|
75
|
+
// TODO
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
class ShaderManager {
|
|
79
|
+
static EFFECT_INFO: Record<Effect, {
|
|
80
|
+
uniformName: string;
|
|
81
|
+
mask: number;
|
|
82
|
+
converter(rawEffect: number): number;
|
|
83
|
+
shapeChanges: boolean;
|
|
84
|
+
}>;
|
|
85
|
+
static EFFECTS: Effect[];
|
|
86
|
+
static DRAW_MODE: Record<DrawMode, DrawMode>;
|
|
87
|
+
|
|
88
|
+
_gl: AnyWebGLContext;
|
|
89
|
+
_shaderCache: Record<DrawMode, Record<EffectMask, twgl.ProgramInfo[]>>;
|
|
90
|
+
_buildShader(drawMode: DrawMode, effectMask: EffectMask): twgl.ProgramInfo;
|
|
91
|
+
getShader(drawMode: DrawMode, effectMask: EffectMask): twgl.ProgramInfo;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
class Silhouette {
|
|
95
|
+
static _updateCanvas(): HTMLCanvasElement;
|
|
96
|
+
|
|
97
|
+
_width: number;
|
|
98
|
+
_height: number;
|
|
99
|
+
_colorData: Uint8ClampedArray | null;
|
|
100
|
+
|
|
101
|
+
_getColor(silhouette: Silhouette, x: number, y: number, destination?: Uint8ClampedArray): Uint8ClampedArray;
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* @param image Image data
|
|
105
|
+
* @param isPremultiplied Whether alpha is premultiplied. Defaults to false.
|
|
106
|
+
*/
|
|
107
|
+
update(image: BitmapData, isPremultiplied?: boolean): void;
|
|
108
|
+
|
|
109
|
+
colorAtNearest(textureCoordinate: twgl.V3, destination?: Uint8ClampedArray): Uint8ClampedArray;
|
|
110
|
+
colorAtLinear(textureCoordinate: twgl.V3, destination?: Uint8ClampedArray): Uint8ClampedArray;
|
|
111
|
+
|
|
112
|
+
isTouchingNearest(textureCoordinate: twgl.V3): void;
|
|
113
|
+
isTouchingLinear(textureCoordinate: twgl.V3): void;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
interface SkinEventMap {
|
|
117
|
+
WasAltered: void;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
class Skin extends EventEmitter<SkinEventMap> {
|
|
121
|
+
_id: number;
|
|
122
|
+
get id(): number;
|
|
123
|
+
|
|
124
|
+
get size(): [number, number];
|
|
125
|
+
|
|
126
|
+
_rotationCenter: twgl.V3;
|
|
127
|
+
get rotationCenter(): twgl.V3;
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Always returns the middle of the skin (size / 2).
|
|
131
|
+
* No relation to Skin._rotationCenter or Skin.rotationCenter.
|
|
132
|
+
*/
|
|
133
|
+
calculateRotationCenter(): [number, number];
|
|
134
|
+
|
|
135
|
+
_texture: WebGLTexture | null;
|
|
136
|
+
|
|
137
|
+
_uniforms: {
|
|
138
|
+
u_skinSize: [number, number];
|
|
139
|
+
u_skin: WebGLTexture | null;
|
|
140
|
+
};
|
|
141
|
+
getUniforms(): Skin['_uniforms'];
|
|
142
|
+
|
|
143
|
+
_silhouette: Silhouette;
|
|
144
|
+
updateSilhouette(): void;
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* @see {Silhouette.isTouchingNearest}
|
|
148
|
+
*/
|
|
149
|
+
isTouchingNearest(textureCoordinate: twgl.V3): boolean;
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* @see {Silhouette.isTouchingLinear}
|
|
153
|
+
*/
|
|
154
|
+
isTouchingLinear(textureCoordinate: twgl.V3): boolean;
|
|
155
|
+
|
|
156
|
+
useNearest(scale: [number, number], drawable: Drawable): boolean;
|
|
157
|
+
|
|
158
|
+
getTexture(scale: [number, number]): WebGLTexture;
|
|
159
|
+
_setTexture(image: BitmapData): void;
|
|
160
|
+
setEmptyImageData(): void;
|
|
161
|
+
|
|
162
|
+
getFenceBounds(): Rectangle;
|
|
163
|
+
|
|
164
|
+
dispose(): void;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
class BitmapSkin extends Skin {
|
|
168
|
+
static _getBitmapSize(image: BitmapData): [number, number];
|
|
169
|
+
|
|
170
|
+
_renderer: RenderWebGL;
|
|
171
|
+
|
|
172
|
+
_costumeResolution: BitmapResolution;
|
|
173
|
+
_textureSize: [number, number];
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Synchronously update the content of the skin.
|
|
177
|
+
* @param image The new image.
|
|
178
|
+
* @param bitmapResolution Defaults to 2.
|
|
179
|
+
* @param rotationCenter Defaults to the center of the image.
|
|
180
|
+
*/
|
|
181
|
+
setBitmap(image: BitmapData, bitmapResolution?: BitmapResolution, rotationCenter?: [number, number]): void;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
class SVGSkin extends Skin {
|
|
185
|
+
_renderer: RenderWebGL;
|
|
186
|
+
|
|
187
|
+
_svgImage: HTMLImageElement;
|
|
188
|
+
_svgImageLoaded: boolean;
|
|
189
|
+
_size: [number, number];
|
|
190
|
+
_canvas: HTMLCanvasElement;
|
|
191
|
+
_context: CanvasRenderingContext2D;
|
|
192
|
+
_scaledMIPs: WebGLTexture[];
|
|
193
|
+
_largestMIPScale: number;
|
|
194
|
+
_maxTextureScale: number;
|
|
195
|
+
|
|
196
|
+
createMIP(scale: number): WebGLTexture;
|
|
197
|
+
resetMIPs(): void;
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Asynchronously update the content of the skin. May take a couple frames for changes to appear.
|
|
201
|
+
* @param svgData SVG source code
|
|
202
|
+
* @param rotationCenter Defaults to the center of the image.
|
|
203
|
+
*/
|
|
204
|
+
setSVG(svgData: string, rotationCenter?: [number, number]): void;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
interface PenAttributes {
|
|
208
|
+
/**
|
|
209
|
+
* Pen color in RGBA from 0-1.
|
|
210
|
+
*/
|
|
211
|
+
color4f: [number, number, number, number];
|
|
212
|
+
diameter: number;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
class PenSkin extends Skin {
|
|
216
|
+
_renderer: RenderWebGL;
|
|
217
|
+
|
|
218
|
+
_size: [number, number];
|
|
219
|
+
_framebuffer: WebGLFramebuffer;
|
|
220
|
+
_silhouetteDirty: boolean;
|
|
221
|
+
_silhouettePixels: Uint8Array;
|
|
222
|
+
_silhouetteImageData: ImageData;
|
|
223
|
+
|
|
224
|
+
_lineOnBufferDrawRegionId: DrawingRegion;
|
|
225
|
+
_enterDrawLineOnBuffer(): void;
|
|
226
|
+
_exitDrawLineOnBuffer(): void;
|
|
227
|
+
_drawLineOnBuffer(attributes: PenAttributes, x1: number, y1: number, x2: number, y2: number): void;
|
|
228
|
+
|
|
229
|
+
_usePenBufferDrawRegionId: DrawingRegion;
|
|
230
|
+
_enterUsePenBuffer(): void;
|
|
231
|
+
_exitUsePenBuffer(): void;
|
|
232
|
+
|
|
233
|
+
_lineBufferInfo: twgl.BufferInfo;
|
|
234
|
+
_lineShader: Shader;
|
|
235
|
+
|
|
236
|
+
clear(): void;
|
|
237
|
+
drawPoint(attributes: PenAttributes, x: number, y: number): void;
|
|
238
|
+
drawLine(attributes: PenAttributes, x1: number, y1: number, x2: number, y2: number): void;
|
|
239
|
+
|
|
240
|
+
onNativeSizeChanged(event: ScratchRenderEventMap['NativeSizeChanged']): void;
|
|
241
|
+
_setCanvasSize(size: [number, number]): void;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
const enum TextBubbleType {
|
|
245
|
+
Say = 'say',
|
|
246
|
+
Think = 'think',
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
class CanvasMeasurementProvider {
|
|
250
|
+
_ctx: CanvasRenderingContext2D;
|
|
251
|
+
_cache: Record<string, number>;
|
|
252
|
+
measureText(text: string): number;
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Does nothing.
|
|
256
|
+
*/
|
|
257
|
+
beginMeasurementSession(): void;
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Does nothing.
|
|
261
|
+
*/
|
|
262
|
+
endMeasurementSession(): void;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
class TextWrapper {
|
|
266
|
+
_measurementProvider: CanvasMeasurementProvider;
|
|
267
|
+
_cache: Record<string, string[]>;
|
|
268
|
+
wrapText(maxWidth: number, text: string): string[];
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
class TextBubbleSkin extends Skin {
|
|
272
|
+
_renderer: RenderWebGL;
|
|
273
|
+
|
|
274
|
+
_canvas: HTMLCanvasElement;
|
|
275
|
+
_size: [number, number];
|
|
276
|
+
_renderedScale: number;
|
|
277
|
+
_lines: string[];
|
|
278
|
+
_textAreaSize: {
|
|
279
|
+
width: number;
|
|
280
|
+
height: number
|
|
281
|
+
};
|
|
282
|
+
_bubbleType: TextBubbleType;
|
|
283
|
+
_pointsLeft: boolean;
|
|
284
|
+
_textDirty: boolean;
|
|
285
|
+
_textureDirty: boolean;
|
|
286
|
+
|
|
287
|
+
measurementProvider: CanvasMeasurementProvider;
|
|
288
|
+
textWrapper: TextWrapper;
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* @param type Type of bubble.
|
|
292
|
+
* @param text Text to display.
|
|
293
|
+
* @param pointsLeft True if this bubble points left, false if this bubble points right.
|
|
294
|
+
*/
|
|
295
|
+
setTextBubble(type: TextBubbleType, text: string, pointsLeft: boolean): void;
|
|
296
|
+
|
|
297
|
+
_restyleCanvas(): void;
|
|
298
|
+
_reflowLines(): void;
|
|
299
|
+
|
|
300
|
+
_renderTextBubble(scale: number): void;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
class Drawable {
|
|
304
|
+
static color4fFromID(id: number): [number, number, number, number];
|
|
305
|
+
static color3bToID(r: number, g: number, b: number): number;
|
|
306
|
+
static sampleColor4b(coordinate: twgl.V3, drawable :Drawable, destination: Uint8ClampedArray, effectMask?: EffectMask): Uint8ClampedArray;
|
|
307
|
+
|
|
308
|
+
_id: number;
|
|
309
|
+
get id(): number;
|
|
310
|
+
|
|
311
|
+
_uniforms: {
|
|
312
|
+
u_modelMatrix: twgl.M4;
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* Only used in some debugging modes.
|
|
316
|
+
*/
|
|
317
|
+
u_silhouetteColor: [number, number, number, number];
|
|
318
|
+
} & Record<Effect, number>;
|
|
319
|
+
getUniforms(): Drawable['_uniforms'];
|
|
320
|
+
|
|
321
|
+
_skin: Skin;
|
|
322
|
+
get skin(): Skin;
|
|
323
|
+
set skin(skin: Skin);
|
|
324
|
+
_skinWasAltered(): void;
|
|
325
|
+
|
|
326
|
+
_position: twgl.V3;
|
|
327
|
+
/**
|
|
328
|
+
* @param position The new position. This will be rounded.
|
|
329
|
+
*/
|
|
330
|
+
updatePosition(position: [number, number]): void;
|
|
331
|
+
|
|
332
|
+
_scale: twgl.V3;
|
|
333
|
+
get scale(): twgl.V3;
|
|
334
|
+
updateScale(scale: number): void;
|
|
335
|
+
|
|
336
|
+
_direction: number;
|
|
337
|
+
updateDirection(direction: number): void;
|
|
338
|
+
|
|
339
|
+
_visible: boolean;
|
|
340
|
+
getVisible(): boolean;
|
|
341
|
+
updateVisible(visible: boolean): void;
|
|
342
|
+
|
|
343
|
+
enabledEffects: EffectMask;
|
|
344
|
+
updateEffect(effect: Effect, value: number): void;
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* @deprecated Use the specific update* methods instead.
|
|
348
|
+
*/
|
|
349
|
+
updateProperties(properties: {
|
|
350
|
+
position?: [number, number];
|
|
351
|
+
direction?: number;
|
|
352
|
+
scale?: number;
|
|
353
|
+
visible?: boolean;
|
|
354
|
+
} | Record<Effect, number>): void;
|
|
355
|
+
|
|
356
|
+
_transformDirty: boolean;
|
|
357
|
+
_calculateTransform(): void;
|
|
358
|
+
|
|
359
|
+
_rotationMatrix: twgl.M4;
|
|
360
|
+
_rotationTransformDirty: boolean;
|
|
361
|
+
|
|
362
|
+
_rotationAdjusted: twgl.V3;
|
|
363
|
+
_rotationCenterDirty: boolean;
|
|
364
|
+
|
|
365
|
+
_skinScale: twgl.V3;
|
|
366
|
+
_skinScaleDirty: boolean;
|
|
367
|
+
|
|
368
|
+
_convexHullPoints: Array<[number, number]>;
|
|
369
|
+
_convexHullDirty: boolean;
|
|
370
|
+
needsConvexHullPoints(): boolean;
|
|
371
|
+
setConvexHullDirty(): boolean;
|
|
372
|
+
setConvexHullPoints(points: Array<[number, number]>): void;
|
|
373
|
+
|
|
374
|
+
_transformedHullPoints: Array<[number, number]>;
|
|
375
|
+
_transformedHullDirty: boolean;
|
|
376
|
+
_getTransformedHullPoints(): Array<[number, number]>;
|
|
377
|
+
|
|
378
|
+
setTransformDirty(): void;
|
|
379
|
+
|
|
380
|
+
_inverseMatrix: twgl.M4;
|
|
381
|
+
_inverseTransformDirty: boolean;
|
|
382
|
+
updateMatrix(): void;
|
|
383
|
+
|
|
384
|
+
getBounds(result?: Rectangle): Rectangle;
|
|
385
|
+
getBoundsForBubble(result?: Rectangle): Rectangle;
|
|
386
|
+
getAABB(result?: Rectangle): Rectangle;
|
|
387
|
+
getFastBounds(result?: Rectangle): Rectangle;
|
|
388
|
+
|
|
389
|
+
updateCPURenderAttributes(): void;
|
|
390
|
+
isTouching(textureCoordinate: twgl.V3): boolean;
|
|
391
|
+
_isTouchingNearest(textureCoordinate: twgl.V3): boolean;
|
|
392
|
+
_isTouchingLinear(textureCoordinate: twgl.V3): boolean;
|
|
393
|
+
_isTouchingNever(textureCoordinate: twgl.V3): false;
|
|
394
|
+
|
|
395
|
+
dispose(): void;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
interface ScratchRenderEventMap {
|
|
399
|
+
NativeSizeChanged: {
|
|
400
|
+
newSize: [number, number];
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
declare class RenderWebGL extends EventEmitter<RenderWebGL.ScratchRenderEventMap> {
|
|
406
|
+
static isSupported(canvas?: HTMLCanvasElement): boolean;
|
|
407
|
+
|
|
408
|
+
/**
|
|
409
|
+
* If WebGL 1 is supported, returns a WebGL 1 context.
|
|
410
|
+
* If WebGL 1 is not supported but WebGL 2 is supported, returns a WebGL 2 context.
|
|
411
|
+
* Otherwise, returns null.
|
|
412
|
+
*/
|
|
413
|
+
static _getContext(canvas: HTMLCanvasElement): RenderWebGL.AnyWebGLContext | null;
|
|
414
|
+
|
|
415
|
+
static sampleColor3b(vector: twgl.V3, drawableIds: number[], destination?: Uint8ClampedArray): Uint8ClampedArray;
|
|
416
|
+
|
|
417
|
+
constructor(canvas: HTMLCanvasElement, xLeft?: number, xRight?: number, yBottom?: number, yTop?: number);
|
|
418
|
+
|
|
419
|
+
get canvas(): HTMLCanvasElement;
|
|
420
|
+
_gl: RenderWebGL.AnyWebGLContext;
|
|
421
|
+
get gl(): RenderWebGL.AnyWebGLContext;
|
|
422
|
+
|
|
423
|
+
_xRight: number;
|
|
424
|
+
_xLeft: number;
|
|
425
|
+
_yTop: number;
|
|
426
|
+
_yBottom: number;
|
|
427
|
+
|
|
428
|
+
setStageSize(xLeft: number, xRight: number, yBottom: number, yTop: number): void;
|
|
429
|
+
resize(width: number, height: number): void;
|
|
430
|
+
|
|
431
|
+
_nativeSize: [number, number];
|
|
432
|
+
getNativeSize(): [number, number];
|
|
433
|
+
_setNativeSize(width: number, height: number): void;
|
|
434
|
+
onNativeSizeChanged(event: RenderWebGL.ScratchRenderEventMap['NativeSizeChanged']): void;
|
|
435
|
+
|
|
436
|
+
/**
|
|
437
|
+
* Renders the stage on the canvas.
|
|
438
|
+
*/
|
|
439
|
+
draw(): void;
|
|
440
|
+
|
|
441
|
+
_drawThese(drawableIds: number[], drawMode: RenderWebGL.DrawMode, projection: twgl.M4, opts?: {
|
|
442
|
+
filter?: (drawableId: number) => boolean;
|
|
443
|
+
extraUniforms?: object;
|
|
444
|
+
effectMask?: RenderWebGL.EffectMask;
|
|
445
|
+
ignoreVisibility?: boolean;
|
|
446
|
+
framebufferWidth?: number;
|
|
447
|
+
framebufferHeight?: number;
|
|
448
|
+
}): void;
|
|
449
|
+
|
|
450
|
+
_drawList: number[];
|
|
451
|
+
_addToDrawList(drawableID: number, group: RenderWebGL.LayerGroup): void;
|
|
452
|
+
_updateOffsets(updateType: 'add' | 'delete', index: number): void;
|
|
453
|
+
get _visibleDrawList(): number[];
|
|
454
|
+
getDrawableOrder(drawableID: number): number | -1;
|
|
455
|
+
setDrawableOrder(drawableID: number, order: number, group: RenderWebGL.LayerGroup, isRelative?: boolean, min?: number): void;
|
|
456
|
+
|
|
457
|
+
_groupOrdering: RenderWebGL.LayerGroup[];
|
|
458
|
+
_layerGroups: Record<RenderWebGL.LayerGroup, {
|
|
459
|
+
groupIndex: number;
|
|
460
|
+
drawListOffset: number
|
|
461
|
+
}>;
|
|
462
|
+
setLayerGroupOrdering(groupOrdering: RenderWebGL.LayerGroup[]): void;
|
|
463
|
+
_endIndexForKnownLayerGroup(layerGroup: RenderWebGL.LayerGroup): number;
|
|
464
|
+
|
|
465
|
+
_nextDrawableId: number;
|
|
466
|
+
_allDrawables: RenderWebGL.Drawable[];
|
|
467
|
+
|
|
468
|
+
createDrawable(group: string): void;
|
|
469
|
+
destroyDrawable(drawableID: number, group: RenderWebGL.LayerGroup): void;
|
|
470
|
+
|
|
471
|
+
_allSkins: RenderWebGL.Skin[];
|
|
472
|
+
_nextSkinId: number;
|
|
473
|
+
|
|
474
|
+
/**
|
|
475
|
+
* @see {RenderWebGL.BitmapSkin.setBitmap}
|
|
476
|
+
*/
|
|
477
|
+
createBitmapSkin(image: RenderWebGL.BitmapData, bitmapResolution?: RenderWebGL.BitmapResolution, rotationCenter?: [number, number]): RenderWebGL.BitmapSkin;
|
|
478
|
+
|
|
479
|
+
/**
|
|
480
|
+
* @see {RenderWebGL.BitmapSkin.setBitmap}
|
|
481
|
+
*/
|
|
482
|
+
updateBitmapSkin(skinId: number, image: RenderWebGL.BitmapData, bitmapResolution?: RenderWebGL.BitmapResolution, rotationCenter?: [number, number]): void;
|
|
483
|
+
|
|
484
|
+
/**
|
|
485
|
+
* @see {RenderWebGL.SVGSkin.setSVG}
|
|
486
|
+
*/
|
|
487
|
+
createSVGSkin(svgData: string, rotationCenter: [number, number]): RenderWebGL.SVGSkin;
|
|
488
|
+
|
|
489
|
+
/**
|
|
490
|
+
* @see {RenderWebGL.SVGSkin.setSVG}
|
|
491
|
+
*/
|
|
492
|
+
updateSVGSkin(skinId: number, svgData: string, rotationCenter: [number, number]): void;
|
|
493
|
+
|
|
494
|
+
/**
|
|
495
|
+
* @see {RenderWebGL.TextBubbleSkin.setTextBubble}
|
|
496
|
+
*/
|
|
497
|
+
createTextSkin(type: RenderWebGL.TextBubbleType, text: string, pointsLeft: boolean): RenderWebGL.TextBubbleSkin;
|
|
498
|
+
|
|
499
|
+
/**
|
|
500
|
+
* @see {RenderWebGL.TextBubbleSkin.setTextBubble}
|
|
501
|
+
*/
|
|
502
|
+
updateTextSkin(skinId: number, type: RenderWebGL.TextBubbleType, text: string, pointsLeft: boolean): void;
|
|
503
|
+
|
|
504
|
+
createPenSkin(): RenderWebGL.PenSkin;
|
|
505
|
+
|
|
506
|
+
destroySkin(skinId: number): void;
|
|
507
|
+
|
|
508
|
+
_reskin(skinId: number, newSkin: RenderWebGL.Skin): void;
|
|
509
|
+
|
|
510
|
+
getBounds(drawableId: number): RenderWebGL.Rectangle;
|
|
511
|
+
getBoundsForBubble(drawableId: number): RenderWebGL.Rectangle;
|
|
512
|
+
|
|
513
|
+
_getConvexHullPointsForDrawable(drawableID: number): Array<[number, number]>;
|
|
514
|
+
|
|
515
|
+
getCurrentSkinSize(drawableId: number): [number, number];
|
|
516
|
+
getSkinSize(skinId: number): [number, number];
|
|
517
|
+
getSkinRotationCenter(skinId: number): [number, number];
|
|
518
|
+
|
|
519
|
+
/**
|
|
520
|
+
* Determine if a drawable is touching a color or if a certain color of the drawable is touching a color.
|
|
521
|
+
* @param color RGB color from 0-255
|
|
522
|
+
* @param mask RGB color from 0-255. Used by "is color touching color" block.
|
|
523
|
+
*/
|
|
524
|
+
isTouchingColor(drawableId: number, color: [number, number, number], mask?: [number, number, number]): boolean;
|
|
525
|
+
|
|
526
|
+
_isTouchingColorGpuStart(drawableId: number, candidateIds: number[], bounds: RenderWebGL.Rectangle, color: [number, number, number], mask?: [number, number, number]): void;
|
|
527
|
+
_isTouchingColorGpuFin(bounds: RenderWebGL.Rectangle, color: [number, number, number], stop: number): boolean;
|
|
528
|
+
|
|
529
|
+
/**
|
|
530
|
+
* Determine if a drawable is intersecting a set of other drawables.
|
|
531
|
+
* @param drawableId ID of the target drawable
|
|
532
|
+
* @param candidateIds The IDs of the drawables to test for collision with the target drawable. Defaults to all drawables.
|
|
533
|
+
*/
|
|
534
|
+
isTouchingDrawables(drawableId: number, candidateIds?: number[]): boolean;
|
|
535
|
+
|
|
536
|
+
/**
|
|
537
|
+
* @param centerX X coordinate in client space
|
|
538
|
+
* @param centerY Y coordinate in client space
|
|
539
|
+
* @param width Defaults to 1
|
|
540
|
+
* @param height Defaults to 1
|
|
541
|
+
*/
|
|
542
|
+
clientSpaceToScratchBounds(centerX: number, centerY: number, width?: number, height?: number): RenderWebGL.Rectangle;
|
|
543
|
+
|
|
544
|
+
/**
|
|
545
|
+
* Determine if a drawable is touching a point.
|
|
546
|
+
* @param drawableId ID of the target drawable
|
|
547
|
+
* @param centerX X coordinate in client space
|
|
548
|
+
* @param centerY Y coordinate in client space
|
|
549
|
+
* @param width Defaults to 1
|
|
550
|
+
* @param height Defaults to 1
|
|
551
|
+
*/
|
|
552
|
+
drawableTouching(drawableId: number, centerX: number, centerY: number, width?: number, height?: number): boolean;
|
|
553
|
+
|
|
554
|
+
/**
|
|
555
|
+
* Determine the top-most drawable at a point.
|
|
556
|
+
* @param centerX X coordinate in client space
|
|
557
|
+
* @param centerY Y coordinate in client space
|
|
558
|
+
* @param width Defaults to 1
|
|
559
|
+
* @param height Defaults to 1
|
|
560
|
+
* @param candidateIds Defaults to all drawables
|
|
561
|
+
* @returns The ID of the top-most drawable, or -1 or false if there is none.
|
|
562
|
+
*/
|
|
563
|
+
pick(centerX: number, centerY: number, width?: number, height?: number, candidateIds?: number[]): number | -1 | false;
|
|
564
|
+
|
|
565
|
+
extractDrawableScreenSpace(drawableId: number): {
|
|
566
|
+
data: ImageData;
|
|
567
|
+
x: number;
|
|
568
|
+
y: number;
|
|
569
|
+
width: number;
|
|
570
|
+
height: number;
|
|
571
|
+
};
|
|
572
|
+
|
|
573
|
+
/**
|
|
574
|
+
* :3
|
|
575
|
+
* @see {RenderWebGL.extractDrawableScreenSpace}
|
|
576
|
+
*/
|
|
577
|
+
canHazPixels(drawableID: number): ReturnType<RenderWebGL['extractDrawableScreenSpace']>;
|
|
578
|
+
|
|
579
|
+
/**
|
|
580
|
+
* @param x X coordinate in client space
|
|
581
|
+
* @param y Y coordinate in client space
|
|
582
|
+
* @param radius "Radius" of the square, in pixels
|
|
583
|
+
* @returns Data about the pixels in a square around the coordinates. Color channels are RGBA from 0-255
|
|
584
|
+
*/
|
|
585
|
+
extractColor(x: number, y: number, radius: number): {
|
|
586
|
+
data: Uint8Array;
|
|
587
|
+
width: number;
|
|
588
|
+
height: number;
|
|
589
|
+
color: {
|
|
590
|
+
r: number;
|
|
591
|
+
g: number;
|
|
592
|
+
b: number;
|
|
593
|
+
a: number;
|
|
594
|
+
}
|
|
595
|
+
};
|
|
596
|
+
|
|
597
|
+
/**
|
|
598
|
+
* Get the "candidate bounding box" to use for "touching" queries.
|
|
599
|
+
* @returns The rectangle, or null if the drawable is offscreen or has no skin.
|
|
600
|
+
*/
|
|
601
|
+
_touchingBounds(drawableId: number): RenderWebGL.Rectangle | null;
|
|
602
|
+
|
|
603
|
+
_candidatesTouching(drawableId: number, candidateIds: number[]): Array<{
|
|
604
|
+
id: number;
|
|
605
|
+
drawable: RenderWebGL.Drawable;
|
|
606
|
+
intersection: RenderWebGL.Rectangle;
|
|
607
|
+
}>;
|
|
608
|
+
|
|
609
|
+
_candidatesBounds(candidates: ReturnType<RenderWebGL['_candidatesTouching']>): RenderWebGL.Rectangle;
|
|
610
|
+
|
|
611
|
+
updateDrawableSkinId(drawableId: number, skinId: number): void;
|
|
612
|
+
updateDrawablePosition(drawableId: number, position: [number, number]): void;
|
|
613
|
+
updateDrawableDirection(drawableId: number, direction: number): void;
|
|
614
|
+
updateDrawableScale(drawableId: number, scale: number): void;
|
|
615
|
+
updateDrawableDirectionScale(drawableId: number, direction: number, scale: number): void;
|
|
616
|
+
updateDrawableVisible(drawableId: number, visible: boolean): void;
|
|
617
|
+
updateDrawableEffect(drawableId: number, effectName: RenderWebGL.Effect, value: number): void;
|
|
618
|
+
/**
|
|
619
|
+
* @deprecated Use the individual updateDrawable* methods instead.
|
|
620
|
+
*/
|
|
621
|
+
updateDrawableProperties(drawableId: number, properties: {
|
|
622
|
+
skinId?: number;
|
|
623
|
+
position?: [number, number];
|
|
624
|
+
direction?: number;
|
|
625
|
+
scale?: number;
|
|
626
|
+
visible?: number;
|
|
627
|
+
} | Record<RenderWebGL.Effect, number>): void;
|
|
628
|
+
|
|
629
|
+
getFencedPositionOfDrawable(drawableId: number, position: [number, number]): [number, number];
|
|
630
|
+
|
|
631
|
+
penClear(penSkinId: number): void;
|
|
632
|
+
penPoint(penSkinId: number, penAttributes: RenderWebGL.PenAttributes, x: number, y: number): void;
|
|
633
|
+
penLine(penSkinId: number, penAttributes: RenderWebGL.PenAttributes, x1: number, y1: number, x2: number, y2: number): void;
|
|
634
|
+
penStamp(penSkinId: number, stampDrawableId: number): void;
|
|
635
|
+
|
|
636
|
+
_projection: twgl.M4;
|
|
637
|
+
|
|
638
|
+
_shaderManager: RenderWebGL.ShaderManager;
|
|
639
|
+
|
|
640
|
+
_regionId: unknown | null;
|
|
641
|
+
_exitRegion: Function | null;
|
|
642
|
+
|
|
643
|
+
/**
|
|
644
|
+
* Enter a drawing region.
|
|
645
|
+
* @param regionId Any arbitrary unique object.
|
|
646
|
+
* @param enter Called when entering the drawing region (which is what this function does). Defaults to regionId.enter.
|
|
647
|
+
* @param exit Called when leaving the drawing region. Defaults to regionId.exit.
|
|
648
|
+
*/
|
|
649
|
+
enterDrawRegion(regionId: unknown, enter?: Function, exit?: Function): void;
|
|
650
|
+
|
|
651
|
+
_doExitDrawRegion(): void;
|
|
652
|
+
|
|
653
|
+
_backgroundDrawRegionId: RenderWebGL.DrawingRegion;
|
|
654
|
+
_enterDrawBackground(): void;
|
|
655
|
+
_exitDrawBackground(): void;
|
|
656
|
+
|
|
657
|
+
/**
|
|
658
|
+
* RGBA from 0-1
|
|
659
|
+
*/
|
|
660
|
+
_backgroundColor4f: [number, number, number, number];
|
|
661
|
+
|
|
662
|
+
/**
|
|
663
|
+
* RGB from 0-255
|
|
664
|
+
*/
|
|
665
|
+
_backgroundColor3b: [number, number, number];
|
|
666
|
+
|
|
667
|
+
/**
|
|
668
|
+
* @param red Red from 0-1
|
|
669
|
+
* @param green Green from 0-1
|
|
670
|
+
* @param blue Blue from 0-1
|
|
671
|
+
*/
|
|
672
|
+
setBackgroundColor(red: number, green: number, blue: number): void;
|
|
673
|
+
|
|
674
|
+
_snapshotCallbacks: Array<(dataURL: string) => void>;
|
|
675
|
+
requestSnapshot(callback: (dataURL: string) => void): void;
|
|
676
|
+
|
|
677
|
+
_useGpuMode: RenderWebGL.UseGpuModes;
|
|
678
|
+
setUseGpuMode(useGpuMode: RenderWebGL.UseGpuModes): void;
|
|
679
|
+
_getMaxPixelsForCPU(): number;
|
|
680
|
+
|
|
681
|
+
_debugCanvas?: HTMLCanvasElement;
|
|
682
|
+
setDebugCanvas(canvas: HTMLCanvasElement): void;
|
|
683
|
+
|
|
684
|
+
_bufferInfo: twgl.BufferInfo;
|
|
685
|
+
_createGeometry(): void;
|
|
686
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Type definitions for scratch-storage
|
|
2
|
+
// Project: https://github.com/LLK/scratch-storage
|
|
3
|
+
|
|
4
|
+
declare namespace ScratchStorage {
|
|
5
|
+
interface Asset {
|
|
6
|
+
// TODO
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
declare class ScratchStorage {
|
|
11
|
+
// TODO
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Modified version of ScratchStorage used by scratch-gui.
|
|
16
|
+
*/
|
|
17
|
+
declare class GUIScratchStorage extends ScratchStorage {
|
|
18
|
+
projectToken?: string;
|
|
19
|
+
setProjectToken(token: string): void;
|
|
20
|
+
}
|