From f3ac83b3e6048649ee7cc1432aff4808f27043b0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Nov 2024 22:08:38 -0500 Subject: [PATCH 1/9] build(deps-dev): bump eslint from 9.12.0 to 9.13.0 (#1730) --- package-lock.json | 24 ++++++++++++------------ package.json | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1a405b5603..1439b077bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "markdown-it": "^14.1.0" }, "devDependencies": { - "eslint": "^9.12.0", + "eslint": "^9.13.0", "espree": "^9.6.1", "esquery": "^1.6.0", "prettier": "^3.3.3", @@ -75,9 +75,9 @@ } }, "node_modules/@eslint/core": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz", - "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz", + "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -136,9 +136,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.12.0.tgz", - "integrity": "sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==", + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.13.0.tgz", + "integrity": "sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -679,17 +679,17 @@ } }, "node_modules/eslint": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.12.0.tgz", - "integrity": "sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==", + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.13.0.tgz", + "integrity": "sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.11.0", "@eslint/config-array": "^0.18.0", - "@eslint/core": "^0.6.0", + "@eslint/core": "^0.7.0", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.12.0", + "@eslint/js": "9.13.0", "@eslint/plugin-kit": "^0.2.0", "@humanfs/node": "^0.16.5", "@humanwhocodes/module-importer": "^1.0.1", diff --git a/package.json b/package.json index 6a31f4358e..3f96152ac0 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "markdown-it": "^14.1.0" }, "devDependencies": { - "eslint": "^9.12.0", + "eslint": "^9.13.0", "espree": "^9.6.1", "esquery": "^1.6.0", "prettier": "^3.3.3", From 0e127cf52f17389a03b3635ae27d02134f86ccb1 Mon Sep 17 00:00:00 2001 From: Muffin Date: Sat, 2 Nov 2024 11:29:36 -0500 Subject: [PATCH 2/9] Lily/lmsutils: fix != <= >= (#1739) --- extensions/Lily/lmsutils.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/extensions/Lily/lmsutils.js b/extensions/Lily/lmsutils.js index d99c229878..35836fa371 100644 --- a/extensions/Lily/lmsutils.js +++ b/extensions/Lily/lmsutils.js @@ -1240,19 +1240,20 @@ } equalsExactly(args) { + // Intentionally not using Cast return args.ONE === args.TWO; } notEqualTo(args) { - return args.INPUTA != args.INPUTB; + return Scratch.Cast.compare(args.INPUTA, args.INPUTB) !== 0; } moreThanEqual(args) { - return args.INPUTA >= args.INPUTB; + return Scratch.Cast.compare(args.INPUTA, args.INPUTB) >= 0; } lessThanEqual(args) { - return args.INPUTA <= args.INPUTB; + return Scratch.Cast.compare(args.INPUTA, args.INPUTB) <= 0; } stringCheckBoolean(args) { From 2e9eb5af777b15e3b7b698a38e566f57791f47ff Mon Sep 17 00:00:00 2001 From: Xeltalliv <90340988+Xeltalliv@users.noreply.github.com> Date: Sat, 2 Nov 2024 18:31:03 +0200 Subject: [PATCH 3/9] Xeltalliv/simple3D: Feature update v1.2.0 (#1738) https://github.com/user-attachments/assets/4478d675-cea1-40b4-bf72-cd0ae6d7de03 **This update:** Changes the way bone transforms blocks handle cases when not supplied all the necessary data or the data mismatches in length. Technically not backwards compatible, but considering both the fact that no-one seems to know how to use this and the fact it only changes what happens when the feature is misused, this should be fine. Makes bone transforms inheritable, which they weren't due to an oversight. In the documentation adds an external link to the tutorial. Adds a block for limiting amount of drawn instances. Adds 2 blocks for specifying and clearing viewport, clipping and pixel readback boxes. Adds 3 new options into mesh property reported for estimating VRAM usage. Adds a warning for exceeding vertex index limit. Speeds up m4.js Removes unnecessary screen refreshes. Adds a 90 second limit for model decoder. After that, it gets restarted. Cancels all the queued model importing upon the call to "reset everything" . Adds it's own `i_will_not_ask_for_help_when_these_break` exports. --- docs/Xeltalliv/simple3D.md | 51 ++- extensions/Xeltalliv/simple3D.js | 569 ++++++++++++++++++++++++------- 2 files changed, 495 insertions(+), 125 deletions(-) diff --git a/docs/Xeltalliv/simple3D.md b/docs/Xeltalliv/simple3D.md index 2f96c0b1e3..8fb8612456 100644 --- a/docs/Xeltalliv/simple3D.md +++ b/docs/Xeltalliv/simple3D.md @@ -20,6 +20,7 @@ 7. [Integration with other extensions](#ext-integration) 7.1. [Augmented Reality extension](#ar-integration) + ## What is this **Simple 3D** is an extension by [Vadik1](https://scratch.mit.edu/users/Vadik1) meant to enable creation of GPU accelerated 3D projects. It is not designed for making graphically complex 3D projects (for that, see [Pen+ v7](https://github.com/TurboWarp/extensions/pull/1377) and [WebGL2](https://github.com/TurboWarp/extensions/discussions/378) extensions, both with programmable shaders) and instead it's main focus is allowing people to create 3D projects easily and quickly. Nevertheless, despite lack of programmable shaders, it is still quite powerful. It covers the wide range of usages from something as high level as making an [AR project in less than 20 blocks](#ar-example) with models loaded from OBJ files, to something more low level like doing all the calculations on CPU and streaming transformed polygons every frame (like [Pen+](https://extensions.turbowarp.org/obviousAlexC/penPlus.js)). And of course everything in-between. @@ -41,6 +42,8 @@ So in short, **this extension does not have any kind of scenes, objects, cameras 3D models consist of vertices which together form primitives (points, lines, triangles). Each vertex has either 2D (XY) or 3D (XYZ) location described with 2 or 3 numbers respectively. Before drawing the mesh, you would usually set up transformation, which tells how to take those initial locations and transform them to correct location on your 2D screen. The typical way to do it, is to chain multiple simple transformations together. Simple transformations can be translation (offsetting), rotation, scaling, mirroring, skewing, etc. ## Drawing things +**Note:** For a more complete tutorial, see [here](https://xeltalliv.github.io/simple3d-extension/examples/) (external link). + For now let's not worry about transformations and just draw something as is. First step would be to clear the screen: ```scratch @@ -450,11 +453,12 @@ Length of supplied indices and weights lists have to match and be divisible by " --- ```scratch set [my mesh] [original v] transforms [listTransforms v] :: sensing +set [my mesh] [current v] transforms [listTransforms v] :: sensing ``` Used for setting original and current transforms of each bone. Transforms on how to get from original to current will be calculated and applied to vertices based on their bone indices and weights. Supplied list of transforms must have length divisible by 16. If not, operation fails. -When setting one of the transforms, while the other one is not defined or has different length, the one being set will be set to both. +Setting original transforms is optional. Missing original transforms are treated as empty transforms. --- ```scratch @@ -668,7 +672,19 @@ Use partial updates to add any extra polygons after the range that is being draw To remove polygons, move the ones from the end of the drawing range to location of the remove one and then shring the drawing range at the end. -Deafult for mesh is not set. Once set, cannot be undone. +Default for mesh is not set. Once set, cannot be undone. + +--- +```scratch +set [my mesh] instance draw limit (10) :: sensing +``` +Normally, how many instances are drawn is determined by the length of supplied lists. +This block can be used to limit the amount of instances drawn to an even lower number. +This can be useful together with partial list updates to be able to dynamically change amount of drawn instances without having to reupload the entire list. That is, preallocating space for some amount of instances in advance, but drawing less. When new instance needs to be added, using partial updates to update the instance data of the next unused instance and then increasing the limit by 1. To remove an instance, the last instance can be moved in it's place and then the limit reduced by 1. + +Setting to any value below 1 is equivalent to setting it to Infinity. + +Default for mesh is Infinity. --- ```scratch @@ -903,6 +919,37 @@ Internally extension stores everything with premultiplied alpha. When reading th ``` Allows reading properties of the current render target. +--- +```scratch +set [viewport box v] to X1:(0) Y1:(0) X2:(100) Y2:(100) :: sensing +set [clipping box v] to X1:(0) Y1:(0) X2:(100) Y2:(100) :: sensing +set [readback box v] to X1:(0) Y1:(0) X2:(100) Y2:(100) :: sensing +``` +Configures custom rectangular areas for different purposes for the currently active render target. +Viewport box specifies the area to which the rendered image will be stretched to cover from it's normal -1 to 1 range. +Clipping box specifies the area in which pixels are allowed to be modified. +Readback box specifies the area from which reading to list and reading to data URI blocks will read the pixels. + +Note: coordinates are specified in **real pixels** starting from the bottom left corner, **not scratch units**. You can get the size of the Simple3D layer in pixels from either: +```scratch +(stage width :: sensing) +(stage height :: sensing) + +(render target [width v] :: sensing) +(render target [height v] :: sensing) +``` +And while it may match scratch units while the high quality pen is disabled, when **high quality pen is on**, the resolution will often be higher. Your projects need to account for that. + +Note: Those custom areas can either be set or not set. When they aren't set, they use X1:`0` Y1:`0` X2:`render target width` Y2:`render target height` and automatically update with resolution changes. If you set them to custom values, you need to handle rescaling manually. + +--- +```scratch +clear [viewport box v] :: sensing +clear [clipping box v] :: sensing +clear [readback box v] :: sensing +``` +Removes the custom rectangular areas configured by the block described above. + ### Tinting and fog ```scratch diff --git a/extensions/Xeltalliv/simple3D.js b/extensions/Xeltalliv/simple3D.js index cc465f1983..93511b5e6f 100644 --- a/extensions/Xeltalliv/simple3D.js +++ b/extensions/Xeltalliv/simple3D.js @@ -3,7 +3,7 @@ // Description: Make GPU accelerated 3D projects easily. // By: Vadik1 // License: MPL-2.0 AND BSD-3-Clause -// Version: 1.1.0 +// Version: 1.2.0 (function (Scratch) { "use strict"; @@ -67,67 +67,112 @@ 0, 0, b, 1 ]; }, - translation(tx, ty, tz) { + translate(m, tx, ty, tz) { return [ - 1, 0, 0, 0, - 0, 1, 0, 0, - 0, 0, 1, 0, - tx, ty, tz, 1, + m[0], + m[1], + m[2], + m[3], + m[4], + m[5], + m[6], + m[7], + m[8], + m[9], + m[10], + m[11], + tx * m[0] + ty * m[4] + tz * m[8] + m[12], + tx * m[1] + ty * m[5] + tz * m[9] + m[13], + tx * m[2] + ty * m[6] + tz * m[10] + m[14], + tx * m[3] + ty * m[7] + tz * m[11] + m[15], ]; }, - xRotation(angleInRadians) { + xRotate(m, angleInRadians) { const c = Math.cos(angleInRadians); const s = Math.sin(angleInRadians); return [ - 1, 0, 0, 0, - 0, c, s, 0, - 0, -s, c, 0, - 0, 0, 0, 1, + m[0], + m[1], + m[2], + m[3], + c * m[4] + s * m[8], + c * m[5] + s * m[9], + c * m[6] + s * m[10], + c * m[7] + s * m[11], + c * m[8] - s * m[4], + c * m[9] - s * m[5], + c * m[10] - s * m[6], + c * m[11] - s * m[7], + m[12], + m[13], + m[14], + m[15], ]; }, - yRotation(angleInRadians) { + yRotate(m, angleInRadians) { const c = Math.cos(angleInRadians); const s = Math.sin(angleInRadians); return [ - c, 0, -s, 0, - 0, 1, 0, 0, - s, 0, c, 0, - 0, 0, 0, 1, + c * m[0] - s * m[8], + c * m[1] - s * m[9], + c * m[2] - s * m[10], + c * m[3] - s * m[11], + m[4], + m[5], + m[6], + m[7], + s * m[0] + c * m[8], + s * m[1] + c * m[9], + s * m[2] + c * m[10], + s * m[3] + c * m[11], + m[12], + m[13], + m[14], + m[15], ]; }, - zRotation(angleInRadians) { + zRotate(m, angleInRadians) { const c = Math.cos(angleInRadians); const s = Math.sin(angleInRadians); return [ - c, s, 0, 0, - -s, c, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1, + c * m[0] + s * m[4], + c * m[1] + s * m[5], + c * m[2] + s * m[6], + c * m[3] + s * m[7], + c * m[4] - s * m[0], + c * m[5] - s * m[1], + c * m[6] - s * m[2], + c * m[7] - s * m[3], + m[8], + m[9], + m[10], + m[11], + m[12], + m[13], + m[14], + m[15], ]; }, - scaling(sx, sy, sz) { + scale(m, sx, sy, sz) { return [ - sx, 0, 0, 0, - 0, sy, 0, 0, - 0, 0, sz, 0, - 0, 0, 0, 1, + sx * m[0], + sx * m[1], + sx * m[2], + sx * m[3], + sy * m[4], + sy * m[5], + sy * m[6], + sy * m[7], + sz * m[8], + sz * m[9], + sz * m[10], + sz * m[11], + m[12], + m[13], + m[14], + m[15], ]; }, - translate(m, tx, ty, tz) { - return m4.multiply(m, m4.translation(tx, ty, tz)); - }, - xRotate(m, angleInRadians) { - return m4.multiply(m, m4.xRotation(angleInRadians)); - }, - yRotate(m, angleInRadians) { - return m4.multiply(m, m4.yRotation(angleInRadians)); - }, - zRotate(m, angleInRadians) { - return m4.multiply(m, m4.zRotation(angleInRadians)); - }, - scale(m, sx, sy, sz) { - return m4.multiply(m, m4.scaling(sx, sy, sz)); - }, multiply(a, b) { const a00 = a[0 * 4 + 0]; const a01 = a[0 * 4 + 1]; @@ -197,10 +242,10 @@ const a31 = a[3 * 4 + 1]; const a32 = a[3 * 4 + 2]; const a33 = a[3 * 4 + 3]; - const b00 = b[0 * 4 + 0]; - const b01 = b[0 * 4 + 1]; - const b02 = b[0 * 4 + 2]; - const b03 = b[0 * 4 + 3]; + const b00 = b[0]; + const b01 = b[1]; + const b02 = b[2]; + const b03 = b[3]; return [ b00 * a00 + b01 * a10 + b02 * a20 + b03 * a30, b00 * a01 + b01 * a11 + b02 * a21 + b03 * a31, @@ -225,23 +270,24 @@ ]; }, inverse: function(m) { - const inv = m4.zero(); - inv[0] = m[5] * m[10] * m[15] - m[5] * m[11] * m[14] - m[9] * m[6] * m[15] + m[9] * m[7] * m[14] + m[13] * m[6] * m[11] - m[13] * m[7] * m[10]; - inv[4] = -m[4] * m[10] * m[15] + m[4] * m[11] * m[14] + m[8] * m[6] * m[15] - m[8] * m[7] * m[14] - m[12] * m[6] * m[11] + m[12] * m[7] * m[10]; - inv[8] = m[4] * m[9] * m[15] - m[4] * m[11] * m[13] - m[8] * m[5] * m[15] + m[8] * m[7] * m[13] + m[12] * m[5] * m[11] - m[12] * m[7] * m[9]; - inv[12] = -m[4] * m[9] * m[14] + m[4] * m[10] * m[13] + m[8] * m[5] * m[14] - m[8] * m[6] * m[13] - m[12] * m[5] * m[10] + m[12] * m[6] * m[9]; - inv[1] = -m[1] * m[10] * m[15] + m[1] * m[11] * m[14] + m[9] * m[2] * m[15] - m[9] * m[3] * m[14] - m[13] * m[2] * m[11] + m[13] * m[3] * m[10]; - inv[5] = m[0] * m[10] * m[15] - m[0] * m[11] * m[14] - m[8] * m[2] * m[15] + m[8] * m[3] * m[14] + m[12] * m[2] * m[11] - m[12] * m[3] * m[10]; - inv[9] = -m[0] * m[9] * m[15] + m[0] * m[11] * m[13] + m[8] * m[1] * m[15] - m[8] * m[3] * m[13] - m[12] * m[1] * m[11] + m[12] * m[3] * m[9]; - inv[13] = m[0] * m[9] * m[14] - m[0] * m[10] * m[13] - m[8] * m[1] * m[14] + m[8] * m[2] * m[13] + m[12] * m[1] * m[10] - m[12] * m[2] * m[9]; - inv[2] = m[1] * m[6] * m[15] - m[1] * m[7] * m[14] - m[5] * m[2] * m[15] + m[5] * m[3] * m[14] + m[13] * m[2] * m[7] - m[13] * m[3] * m[6]; - inv[6] = -m[0] * m[6] * m[15] + m[0] * m[7] * m[14] + m[4] * m[2] * m[15] - m[4] * m[3] * m[14] - m[12] * m[2] * m[7] + m[12] * m[3] * m[6]; - inv[10] = m[0] * m[5] * m[15] - m[0] * m[7] * m[13] - m[4] * m[1] * m[15] + m[4] * m[3] * m[13] + m[12] * m[1] * m[7] - m[12] * m[3] * m[5]; - inv[14] = -m[0] * m[5] * m[14] + m[0] * m[6] * m[13] + m[4] * m[1] * m[14] - m[4] * m[2] * m[13] - m[12] * m[1] * m[6] + m[12] * m[2] * m[5]; - inv[3] = -m[1] * m[6] * m[11] + m[1] * m[7] * m[10] + m[5] * m[2] * m[11] - m[5] * m[3] * m[10] - m[9] * m[2] * m[7] + m[9] * m[3] * m[6]; - inv[7] = m[0] * m[6] * m[11] - m[0] * m[7] * m[10] - m[4] * m[2] * m[11] + m[4] * m[3] * m[10] + m[8] * m[2] * m[7] - m[8] * m[3] * m[6]; - inv[11] = -m[0] * m[5] * m[11] + m[0] * m[7] * m[9] + m[4] * m[1] * m[11] - m[4] * m[3] * m[9] - m[8] * m[1] * m[7] + m[8] * m[3] * m[5]; - inv[15] = m[0] * m[5] * m[10] - m[0] * m[6] * m[9] - m[4] * m[1] * m[10] + m[4] * m[2] * m[9] + m[8] * m[1] * m[6] - m[8] * m[2] * m[5]; + const inv = [ + m[5] * m[10] * m[15] - m[5] * m[11] * m[14] - m[9] * m[6] * m[15] + m[9] * m[7] * m[14] + m[13] * m[6] * m[11] - m[13] * m[7] * m[10], + -m[1] * m[10] * m[15] + m[1] * m[11] * m[14] + m[9] * m[2] * m[15] - m[9] * m[3] * m[14] - m[13] * m[2] * m[11] + m[13] * m[3] * m[10], + m[1] * m[6] * m[15] - m[1] * m[7] * m[14] - m[5] * m[2] * m[15] + m[5] * m[3] * m[14] + m[13] * m[2] * m[7] - m[13] * m[3] * m[6], + -m[1] * m[6] * m[11] + m[1] * m[7] * m[10] + m[5] * m[2] * m[11] - m[5] * m[3] * m[10] - m[9] * m[2] * m[7] + m[9] * m[3] * m[6], + -m[4] * m[10] * m[15] + m[4] * m[11] * m[14] + m[8] * m[6] * m[15] - m[8] * m[7] * m[14] - m[12] * m[6] * m[11] + m[12] * m[7] * m[10], + m[0] * m[10] * m[15] - m[0] * m[11] * m[14] - m[8] * m[2] * m[15] + m[8] * m[3] * m[14] + m[12] * m[2] * m[11] - m[12] * m[3] * m[10], + -m[0] * m[6] * m[15] + m[0] * m[7] * m[14] + m[4] * m[2] * m[15] - m[4] * m[3] * m[14] - m[12] * m[2] * m[7] + m[12] * m[3] * m[6], + m[0] * m[6] * m[11] - m[0] * m[7] * m[10] - m[4] * m[2] * m[11] + m[4] * m[3] * m[10] + m[8] * m[2] * m[7] - m[8] * m[3] * m[6], + m[4] * m[9] * m[15] - m[4] * m[11] * m[13] - m[8] * m[5] * m[15] + m[8] * m[7] * m[13] + m[12] * m[5] * m[11] - m[12] * m[7] * m[9], + -m[0] * m[9] * m[15] + m[0] * m[11] * m[13] + m[8] * m[1] * m[15] - m[8] * m[3] * m[13] - m[12] * m[1] * m[11] + m[12] * m[3] * m[9], + m[0] * m[5] * m[15] - m[0] * m[7] * m[13] - m[4] * m[1] * m[15] + m[4] * m[3] * m[13] + m[12] * m[1] * m[7] - m[12] * m[3] * m[5], + -m[0] * m[5] * m[11] + m[0] * m[7] * m[9] + m[4] * m[1] * m[11] - m[4] * m[3] * m[9] - m[8] * m[1] * m[7] + m[8] * m[3] * m[5], + -m[4] * m[9] * m[14] + m[4] * m[10] * m[13] + m[8] * m[5] * m[14] - m[8] * m[6] * m[13] - m[12] * m[5] * m[10] + m[12] * m[6] * m[9], + m[0] * m[9] * m[14] - m[0] * m[10] * m[13] - m[8] * m[1] * m[14] + m[8] * m[2] * m[13] + m[12] * m[1] * m[10] - m[12] * m[2] * m[9], + -m[0] * m[5] * m[14] + m[0] * m[6] * m[13] + m[4] * m[1] * m[14] - m[4] * m[2] * m[13] - m[12] * m[1] * m[6] + m[12] * m[2] * m[5], + m[0] * m[5] * m[10] - m[0] * m[6] * m[9] - m[4] * m[1] * m[10] + m[4] * m[2] * m[9] + m[8] * m[1] * m[6] - m[8] * m[2] * m[5] + ]; const det = m[0] * inv[0] + m[1] * inv[4] + m[2] * inv[8] + m[3] * inv[12]; if (det == 0) return m4.zero(); const invDet = 1 / det; @@ -276,15 +322,35 @@ class RenderTarget { constructor() { this.destroyed = false; + this.viewport = null; + this.scissors = null; + this.readarea = null; } setAsRenderTarget() { currentRenderTarget = this; gl.bindFramebuffer(gl.FRAMEBUFFER, this.getFramebuffer()); this.updateViewport(); this.updateDepth(); + this.updateScissorsEnabled(); + } + updateScissorsEnabled() { + if (this.scissors) { + gl.enable(gl.SCISSOR_TEST); + } else { + gl.disable(gl.SCISSOR_TEST); + } } updateViewport() { - gl.viewport(0, 0, this.width, this.height); + const a = this.viewport; + const b = this.scissors; + if (a) { + gl.viewport(a.x, a.y, a.w, a.h); + } else { + gl.viewport(0, 0, this.width, this.height); + } + if (b) { + gl.scissor(b.x, b.y, b.w, b.h); + } } updateDepth() { if (this.depthTest == "everything" && !this.depthWrite) { @@ -651,6 +717,25 @@ if (length == -1) return false; return true; } + estimateListVRAM() { + let sum = 0; + for (const name in this.myBuffers) { + const buffer = this.myBuffers[name]; + sum += buffer.length * buffer.size * buffer.bytesPerEl; + } + return sum; + } + estimateTextureVRAM() { + const texture = this.myData.texture; + if (!texture) return 0; + let pixelsVRAM = texture.width * texture.height * 4; + if (texture.hasDepthBuffer) pixelsVRAM *= 2; + if (texture instanceof TextureCube) pixelsVRAM *= 6; + return pixelsVRAM; + } + estimateVRAM() { + return this.estimateListVRAM() + this.estimateTextureVRAM(); + } destroy() { for (let name in this.myBuffers) { this.myBuffers[name].destroy(); @@ -713,10 +798,14 @@ mesh.data.drawRange && mesh.data.drawRange[0] + mesh.data.drawRange[1], "vertex draw range length": (mesh) => mesh.data.drawRange && mesh.data.drawRange[1], + "instance draw limit": (mesh) => mesh.data.maxInstances ?? Infinity, "partial list update enabled": (mesh) => mesh.uploadOffset >= 0, + "estimate own VRAM usage": (mesh) => mesh.estimateVRAM(), + "estimate own list VRAM usage": (mesh) => mesh.estimateListVRAM(), + "estimate own texture VRAM usage": (mesh) => mesh.estimateTextureVRAM(), }; - const workerSrc = ` + let workerSrc = ` class OffModelImporter { constructor(dataRaw) { const dataStr = dataRaw.map(str => str.split("#")[0].replaceAll("\t", " ").trim()).filter(str => str.length); @@ -880,30 +969,71 @@ class ModelDecoder { constructor() { this.worker = null; - this.last = new Promise((res) => res()); + this.timeout = -1; this.resolveFn = null; + this.queue = []; + this.timeLimit = 90000; + this.boundHandle = this.handle.bind(this); } - async decode(type, array, importMatrix) { + decode(type, array, importMatrix) { + return new Promise((resolve) => { + this.queue.push({ data: { type, array, importMatrix }, resolve }); + this.tryMoveQueue(); + }); + } + tryMoveQueue() { + if (this.busy) return; + if (this.queue.length == 0) return; if (!this.worker) { this.worker = new Worker( `data:text/javascript;base64,${btoa(workerSrc)}` ); - this.worker.onmessage = this.handle.bind(this); + this.worker.addEventListener("message", this.boundHandle); } - let onceDone; - const previous = this.last; - this.last = new Promise((res) => (onceDone = res)); - await previous; - this.worker.postMessage({ type, array, importMatrix }); - const output = await new Promise((res) => (this.resolveFn = res)); - onceDone(); - return output; + const { data, resolve } = this.queue.shift(); + this.resolveFn = resolve; + this.busy = true; + this.worker.postMessage(data); + this.timeout = setTimeout(this.restartWorker.bind(this), this.timeLimit); } handle(output) { + if (this.timeout !== -1) { + clearTimeout(this.timeout); + this.timeout = -1; + } this.resolveFn(output.data); + this.resolveFn = null; + this.busy = false; + this.tryMoveQueue(); + } + clear() { + for (const { resolve } of this.queue) { + resolve(null); + } + this.queue = []; } destroy() { - if (this.worker) this.worker.terminate(); + this.clear(); + this.destroyWorker(); + } + destroyWorker() { + if (this.resolveFn) { + this.resolveFn(null); + this.resolveFn = null; + } + if (this.worker) { + this.worker.removeEventListener("message", this.boundHandle); + this.worker.terminate(); + this.worker = null; + this.busy = false; + } + } + restartWorker() { + console.warn( + "Simple3D: Worker took too long to decode the model and was terminated" + ); + this.destroyWorker(); + this.tryMoveQueue(); } } class SimpleSkin extends Scratch.vm.renderer.exports.Skin { @@ -1014,8 +1144,10 @@ } publicApi.redraw = function () { - skin.updateContent(canvas); - runtime.requestRedraw(); + if (canvasDirty) { + skin.updateContent(canvas); + canvasDirty = false; + } }; publicApi.redraw(); } @@ -1036,7 +1168,7 @@ } publicApi.redraw = null; } - const vshSrc = ` + let vshSrc = ` #ifdef MSAA_CENTROID #define INTERPOLATION centroid #endif @@ -1209,7 +1341,7 @@ void main() { #endif } `; - const fshSrc = ` + let fshSrc = ` #ifdef MSAA_CENTROID #define INTERPOLATION centroid #endif @@ -1477,7 +1609,7 @@ void main() { let value = []; let restarts = []; for (let i = 0; i < list.value.length; i++) { - let num = Cast.toNumber(list.value[i]) - 1; + let num = Math.floor(Cast.toNumber(list.value[i]) - 1); if (num < 0) { restarts.push(i); } else if (num > maxNum) { @@ -1486,6 +1618,11 @@ void main() { value.push(num); } let restartIndex, typedArray; + if (maxNum > 4294967294) { + alert( + `Simple3D error: Found vertex index ${maxNum}. The maximum supported value is 4294967295.` + ); + } if (maxNum > 65534) { typedArray = Uint32Array; restartIndex = 4294967295; @@ -1536,6 +1673,13 @@ void main() { ); } } + function chunkArray(array, size) { + const chunkedArray = []; + for (let i = 0; i < array.length; i += size) { + chunkedArray.push(array.slice(i, i + size)); + } + return chunkedArray; + } if (!Scratch.extensions.unsandboxed) throw new Error("Simple 3D extension must be run unsandboxed"); @@ -1548,6 +1692,7 @@ void main() { const runtime = vm.runtime; const extensionId = "xeltallivSimple3D"; + let canvasDirty = true; let canvas = document.createElement("canvas"); let gl = canvas.getContext("webgl2"); if (!gl) @@ -1672,6 +1817,8 @@ void main() { } meshes.clear(); programs.clear(); + modelDecoder.clear(); + canvasDirty = true; renderer.dirty = true; runtime.requestRedraw(); } @@ -1737,8 +1884,11 @@ void main() { gl.clear(ClearLayers[LAYERS]); gl.depthMask(false); } - renderer.dirty = true; //TODO: only do this when rendering to - runtime.requestRedraw(); //TODO: main canvas, not to framebuffers + if (currentRenderTarget === canvasRenderTarget) { + canvasDirty = true; // Telling extension to update texture + renderer.dirty = true; // Telling renderer to redraw the screen + runtime.requestRedraw(); // Telling sequencer to yield in loops + } }, }, { @@ -2332,33 +2482,50 @@ void main() { }, def: function ({ NAME, TRANSFORMS, MATRIXES }, { target }) { const mesh = meshes.get(Cast.toString(NAME)); + const myData = mesh.myData; const list = target.lookupVariableByNameAndType( Cast.toString(MATRIXES), "list" ); if (!mesh || !list) return; const value = list.value.map(Cast.toNumber); - const value2 = []; - for (let i = 0; i < value.length; i += 16) { - value2.push(value.slice(i, i + 16)); + + if (TRANSFORMS == "original") { + myData.bonesOrig = chunkArray(value, 16).map(m4.inverse); + if (!myData.bonesCurr) { + if (myData.bonesCurrRaw) { + myData.bonesCurr = chunkArray(myData.bonesCurrRaw, 16); + myData.bonesCurrRaw = null; + } else { + myData.bonesCurr = chunkArray(value, 16); + } + } } - if ( - TRANSFORMS == "original" || - !mesh.bonesOrig || - mesh.bonesOrig.length !== value2.length - ) - mesh.bonesOrig = value2.map(m4.inverse); - if ( - TRANSFORMS == "current" || - !mesh.bonesCurr || - mesh.bonesCurr.length !== value2.length - ) - mesh.bonesCurr = value2; - const diff = []; - for (let i = 0; i < mesh.bonesCurr.length; i++) { - diff.push(m4.multiply(mesh.bonesCurr[i], mesh.bonesOrig[i])); + if (TRANSFORMS == "current") { + if (myData.bonesOrig) { + myData.bonesCurr = chunkArray(value, 16); + myData.bonesCurrRaw = null; + } else { + myData.bonesCurrRaw = value; + } + } + if (myData.bonesOrig) { + const diff = []; + const end = Math.min( + myData.bonesCurr.length, + myData.bonesOrig.length + ); + let i = 0; + for (; i < end; i++) { + diff.push(m4.multiply(myData.bonesCurr[i], myData.bonesOrig[i])); + } + for (; i < myData.bonesCurr.length; i++) { + diff.push(myData.bonesCurr[i]); + } + myData.bonesDiff = diff.flat(); + } else { + myData.bonesDiff = myData.bonesCurrRaw; } - mesh.bonesDiff = diff.flat(); mesh.update(); }, }, @@ -2767,6 +2934,29 @@ void main() { mesh.update(); }, }, + { + opcode: "setMeshInstanceLimit", + blockType: BlockType.COMMAND, + text: "set [NAME] instance draw limit [END]", + arguments: { + NAME: { + type: ArgumentType.STRING, + defaultValue: "my mesh", + }, + END: { + type: ArgumentType.NUMBER, + defaultValue: 10, + }, + }, + def: function ({ NAME, END }, { target }) { + const mesh = meshes.get(Cast.toString(NAME)); + let end = Math.floor(Cast.toNumber(END)); + if (end < 1) end = Infinity; + if (!mesh) return; + mesh.myData.maxInstances = end; + mesh.update(); + }, + }, { opcode: "setMeshTexCoordOffsetUV", blockType: BlockType.COMMAND, @@ -2835,9 +3025,9 @@ void main() { if (fogSpace == "model space") flags.push("FOG_IN_MODEL_SPACE"); if (fogPosition) flags.push("FOG_POS"); } - if (mesh.buffers.boneIndices && mesh.bonesDiff) { + if (mesh.buffers.boneIndices && mesh.data.bonesDiff) { flags.push(`SKINNING ${mesh.buffers.boneIndices.size}`); - flags.push(`BONE_COUNT ${mesh.bonesDiff.length / 16}`); + flags.push(`BONE_COUNT ${mesh.data.bonesDiff.length / 16}`); } if (mesh.data.interpolation) flags.push(mesh.data.interpolation); if (mesh.data.alphaTest > 0) flags.push("ALPHATEST"); @@ -3069,8 +3259,8 @@ void main() { gl.uniform1f(program.uloc.u_alpha_threshold, mesh.data.alphaTest); } - if (mesh.bonesDiff) { - gl.uniformMatrix4fv(program.uloc.u_bones, false, mesh.bonesDiff); + if (mesh.data.bonesDiff) { + gl.uniformMatrix4fv(program.uloc.u_bones, false, mesh.data.bonesDiff); } if (mesh.data.uvOffset) { gl.uniform2fv(program.uloc.u_uvOffset, mesh.data.uvOffset); @@ -3104,6 +3294,13 @@ void main() { amount = end - mesh.data.drawRange[0]; } if (mesh.buffers.instanceTransforms) { + let instanceCount = mesh.buffers.instanceTransforms.length; + if ( + mesh.data.maxInstances && + mesh.data.maxInstances < instanceCount + ) { + instanceCount = mesh.data.maxInstances; + } if (mesh.buffers.indices) { const indexTypes = [ null, @@ -3117,14 +3314,14 @@ void main() { amount, indexTypes[mesh.buffers.indices.bytesPerEl], start, - mesh.buffers.instanceTransforms.length + instanceCount ); } else { gl.drawArraysInstanced( mesh.data.primitives ?? gl.TRIANGLES, start, amount, - mesh.buffers.instanceTransforms.length + instanceCount ); } } else { @@ -3146,8 +3343,11 @@ void main() { gl.drawArrays(mesh.data.primitives ?? gl.TRIANGLES, start, amount); } } - renderer.dirty = true; //TODO: only do this when rendering to - runtime.requestRedraw(); //TODO: main canvas, not to framebuffers + if (currentRenderTarget === canvasRenderTarget) { + canvasDirty = true; // Telling extension to update texture + renderer.dirty = true; // Telling renderer to redraw the screen + runtime.requestRedraw(); // Telling sequencer to yield in loops + } if (mesh.buffers.colors) { gl.disableVertexAttribArray(program.aloc.a_color); @@ -4110,11 +4310,10 @@ void main() { ); if (!list) return; if (!currentRenderTarget.checkIfValid()) return; - const width = currentRenderTarget.width; - const height = currentRenderTarget.height; - if (width == 0 || height == 0) return; - const pixels = new Uint8ClampedArray(width * height * 4); - gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels); + const { x, y, w, h } = currentRenderTarget.readarea; + if (w == 0 || h == 0) return; + const pixels = new Uint8ClampedArray(w * h * 4); + gl.readPixels(x, y, w, h, gl.RGBA, gl.UNSIGNED_BYTE, pixels); list.value = Array.from(pixels); list._monitorUpToDate = false; }, @@ -4145,11 +4344,10 @@ void main() { return currentRenderTarget.hasDepthBuffer; if (PROPERTY == "image as data URI") { if (!currentRenderTarget.checkIfValid()) return ""; - const width = currentRenderTarget.width; - const height = currentRenderTarget.height; - if (width == 0 || height == 0) return ""; - const pixels = new Uint8ClampedArray(width * height * 4); - gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels); + const { x, y, w, h } = currentRenderTarget.readarea; + if (w == 0 || h == 0) return ""; + const pixels = new Uint8ClampedArray(w * h * 4); + gl.readPixels(x, y, w, h, gl.RGBA, gl.UNSIGNED_BYTE, pixels); for (let i = 0; i < pixels.length; i += 4) { // Internally we store everything with permultiplied alpha. Undoing it const alpha = pixels[i + 3] / 255; @@ -4158,18 +4356,96 @@ void main() { pixels[i + 2] /= alpha; } const canv = document.createElement("canvas"); - canv.width = width; - canv.height = height; + canv.width = w; + canv.height = h; const ctx = canv.getContext("2d"); - const imgData = new ImageData(pixels, width, height); + const imgData = new ImageData(pixels, w, h); ctx.putImageData(imgData, 0, 0); return canv.toDataURL(); } if (PROPERTY == "is valid for being drawn to") return currentRenderTarget.checkIfValid(); + if (PROPERTY == "has viewport box") + return currentRenderTarget.viewport !== null; + if (PROPERTY == "has clipping box") + return currentRenderTarget.scissors !== null; + if (PROPERTY == "has readback box") + return currentRenderTarget.readarea !== null; return ""; }, }, + { + opcode: "setRenderTargetBox", + blockType: BlockType.COMMAND, + text: "set [BOXTYPE] to X1:[X1] Y1:[Y1] X2:[X2] Y2:[Y2]", + arguments: { + BOXTYPE: { + type: ArgumentType.STRING, + menu: "boxType", + }, + X1: { + type: ArgumentType.NUMBER, + defaultValue: 0, + }, + Y1: { + type: ArgumentType.NUMBER, + defaultValue: 0, + }, + X2: { + type: ArgumentType.NUMBER, + defaultValue: 100, + }, + Y2: { + type: ArgumentType.NUMBER, + defaultValue: 100, + }, + }, + def: function ({ BOXTYPE, X1, Y1, X2, Y2 }) { + X1 = Cast.toNumber(X1); + Y1 = Cast.toNumber(Y1); + X2 = Cast.toNumber(X2); + Y2 = Cast.toNumber(Y2); + const x = Math.min(X1, X2); + const y = Math.min(Y1, Y2); + const w = Math.max(X1, X2) - x; + const h = Math.max(Y1, Y2) - y; + if (BOXTYPE == "viewport box") { + currentRenderTarget.viewport = { x, y, w, h }; + } + if (BOXTYPE == "clipping box") { + currentRenderTarget.scissors = { x, y, w, h }; + currentRenderTarget.updateScissorsEnabled(); + } + if (BOXTYPE == "readback box") { + currentRenderTarget.readarea = { x, y, w, h }; + } + currentRenderTarget.updateViewport(); + }, + }, + { + opcode: "clearRenderTargetBox", + blockType: BlockType.COMMAND, + text: "clear [BOXTYPE]", + arguments: { + BOXTYPE: { + type: ArgumentType.STRING, + menu: "boxType", + }, + }, + def: function ({ BOXTYPE }) { + if (BOXTYPE == "viewport box") { + currentRenderTarget.viewport = null; + } + if (BOXTYPE == "clipping box") { + currentRenderTarget.scissors = null; + currentRenderTarget.updateScissorsEnabled(); + } + if (BOXTYPE == "readback box") { + currentRenderTarget.readarea = null; + } + currentRenderTarget.updateViewport(); + }, + }, { blockType: BlockType.LABEL, text: "Tinting and fog", @@ -4511,6 +4787,9 @@ void main() { "has depth storage", "image as data URI", "is valid for being drawn to", + "has viewport box", + "has clipping box", + "has readback box", ], }, powersOfTwo: { @@ -4537,6 +4816,10 @@ void main() { "separately for each sample", ], }, + boxType: { + acceptReporters: false, + items: ["viewport box", "clipping box", "readback box"], + }, }, }; @@ -4645,5 +4928,45 @@ void main() { } gl.__proto__ = ogl; //*/ + publicApi.i_will_not_ask_for_help_when_these_break = () => { + console.warn( + "WARNING: You are accessing Simple3D internals. Expect them to change frequently with no regard to backwards compatibility. WHEN your code breaks, do not expect help.\n\nProper stable APIs will be added later." + ); + return { + canvas, + gl, + definitions, + meshes, + programs, + modelDecoder, + uploadBuffer, + getFshSrc: () => fshSrc, + setFshSrc: (src) => { + fshSrc = src; + }, + getVshSrc: () => vshSrc, + setVshSrc: (src) => { + vshSrc = src; + }, + canvasRenderTarget, + resetEverything, + getTransforms: () => transforms, + setTransforms: (t) => { + transforms = t; + }, + getSelectedTransform: () => selectedTransform, + setSelectedTransform: (t) => { + selectedTransform = t; + }, + getWorkerSrc: () => workerSrc, + setWorkerSrc: (src) => { + workerSrc = src; + }, + extInfo, + Extension, + Blendings, + }; + }; + Scratch.extensions.register(new Extension()); })(Scratch); From 399a894c712ee4604b2fab0a06a6864d5c8b69a1 Mon Sep 17 00:00:00 2001 From: Muffin Date: Sat, 2 Nov 2024 11:40:16 -0500 Subject: [PATCH 4/9] Update chokidar to v4 (#1740) closes https://github.com/TurboWarp/extensions/pull/1696 --- development/builder.js | 12 ++-- package-lock.json | 155 +++++------------------------------------ package.json | 2 +- 3 files changed, 25 insertions(+), 144 deletions(-) diff --git a/development/builder.js b/development/builder.js index 2b2bdf8a84..0a91fab6b5 100644 --- a/development/builder.js +++ b/development/builder.js @@ -860,12 +860,12 @@ class Builder { chokidar .watch( [ - `${this.extensionsRoot}/**/*`, - `${this.imagesRoot}/**/*`, - `${this.websiteRoot}/**/*`, - `${this.docsRoot}/**/*`, - `${this.samplesRoot}/**/*`, - `${this.translationsRoot}/**/*`, + this.extensionsRoot, + this.imagesRoot, + this.websiteRoot, + this.docsRoot, + this.samplesRoot, + this.translationsRoot, ], { ignoreInitial: true, diff --git a/package-lock.json b/package-lock.json index 1439b077bb..87202a96b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@turbowarp/scratchblocks": "^3.6.5", "@turbowarp/types": "git+https://github.com/TurboWarp/types-tw.git#tw", "adm-zip": "^0.5.16", - "chokidar": "^3.6.0", + "chokidar": "^4.0.1", "ejs": "^3.1.10", "express": "^4.21.1", "image-size": "^1.1.1", @@ -312,18 +312,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -344,14 +332,6 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "engines": { - "node": ">=8" - } - }, "node_modules/body-parser": { "version": "1.20.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", @@ -397,17 +377,6 @@ "concat-map": "0.0.1" } }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -459,26 +428,18 @@ } }, "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", + "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 14.16.0" }, "funding": { "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" } }, "node_modules/color-convert": { @@ -985,17 +946,6 @@ "node": ">=10" } }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/finalhandler": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", @@ -1077,19 +1027,6 @@ "node": ">= 0.6" } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -1116,17 +1053,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", @@ -1289,21 +1215,11 @@ "node": ">= 0.10" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -1312,6 +1228,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -1319,14 +1236,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -1537,14 +1446,6 @@ "node": ">= 0.6" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-inspect": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", @@ -1657,17 +1558,6 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -1766,14 +1656,16 @@ } }, "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "license": "MIT", "engines": { - "node": ">=8.10.0" + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/resolve-from": { @@ -1990,17 +1882,6 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", diff --git a/package.json b/package.json index 3f96152ac0..2c779b57f3 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "@turbowarp/scratchblocks": "^3.6.5", "@turbowarp/types": "git+https://github.com/TurboWarp/types-tw.git#tw", "adm-zip": "^0.5.16", - "chokidar": "^3.6.0", + "chokidar": "^4.0.1", "ejs": "^3.1.10", "express": "^4.21.1", "image-size": "^1.1.1", From c8c2a10c89b068ad6f1037ce51dadfa2bc165607 Mon Sep 17 00:00:00 2001 From: Muffin Date: Sat, 2 Nov 2024 11:49:09 -0500 Subject: [PATCH 5/9] XeroName/Deltatime: don't report delta time of 0 (#1741) If projects do things like "5 / delta time", they'll break horribly when delta time is 0, so let's not return that. --- extensions/XeroName/Deltatime.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/extensions/XeroName/Deltatime.js b/extensions/XeroName/Deltatime.js index bb99cc01dc..07c6b3eb3d 100644 --- a/extensions/XeroName/Deltatime.js +++ b/extensions/XeroName/Deltatime.js @@ -21,7 +21,15 @@ vm.runtime.on("BEFORE_EXECUTE", () => { const now = performance.now(); - deltaTime = previousTime === 0 ? 0 : (now - previousTime) / 1000; + + if (previousTime === 0) { + // First frame. We used to always return 0 here, but that can break projects that + // expect delta time to always be non-zero. Instead we'll make our best guess. + deltaTime = 1 / vm.runtime.frameLoop.framerate; + } else { + deltaTime = (now - previousTime) / 1000; + } + previousTime = now; }); From b89f3055b21d1c7057fd1d8f6d70dfa16d7c1687 Mon Sep 17 00:00:00 2001 From: Muffin Date: Sat, 2 Nov 2024 22:13:34 -0500 Subject: [PATCH 6/9] Add links for qxsck & Skyhigh173 (#1742) for https://github.com/TurboWarp/scratch-gui/pull/962 --- extensions/Skyhigh173/bigint.js | 2 +- extensions/Skyhigh173/json.js | 2 +- extensions/qxsck/data-analysis.js | 2 +- extensions/qxsck/var-and-list.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/Skyhigh173/bigint.js b/extensions/Skyhigh173/bigint.js index ac0dfa140e..8983ecda4d 100644 --- a/extensions/Skyhigh173/bigint.js +++ b/extensions/Skyhigh173/bigint.js @@ -1,7 +1,7 @@ // Name: BigInt // ID: skyhigh173BigInt // Description: Math blocks that work on infinitely large integers (no decimals). -// By: Skyhigh173 +// By: Skyhigh173 // License: MIT // Context: BigInt is short for "Big Integer" which can be infinitely big. "number" refers to normal numbers that have limits. diff --git a/extensions/Skyhigh173/json.js b/extensions/Skyhigh173/json.js index 638df3ada1..172aa27293 100644 --- a/extensions/Skyhigh173/json.js +++ b/extensions/Skyhigh173/json.js @@ -1,7 +1,7 @@ // Name: JSON // ID: skyhigh173JSON // Description: Handle JSON strings and arrays. -// By: Skyhigh173 +// By: Skyhigh173 // License: MIT (function (Scratch) { diff --git a/extensions/qxsck/data-analysis.js b/extensions/qxsck/data-analysis.js index c193076687..1660818a77 100644 --- a/extensions/qxsck/data-analysis.js +++ b/extensions/qxsck/data-analysis.js @@ -1,7 +1,7 @@ // Name: Data Analysis // ID: qxsckdataanalysis // Description: Blocks to compute means, medians, maximums, minimums, variances, and modes. -// By: qxsck +// By: qxsck // License: MIT (function (Scratch) { diff --git a/extensions/qxsck/var-and-list.js b/extensions/qxsck/var-and-list.js index e87e28bf03..d9dfa24df3 100644 --- a/extensions/qxsck/var-and-list.js +++ b/extensions/qxsck/var-and-list.js @@ -1,7 +1,7 @@ // Name: Variable and list // ID: qxsckvarandlist // Description: More blocks related to variables and lists. -// By: qxsck +// By: qxsck // License: MIT (function (Scratch) { From 8d1adfc9c4ef75dfae0739494eae03c46aeacddd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 2 Nov 2024 22:21:46 -0500 Subject: [PATCH 7/9] build(deps-dev): bump eslint from 9.13.0 to 9.14.0 (#1744) --- package-lock.json | 95 +++++++++++++++++++++++++++-------------------- package.json | 2 +- 2 files changed, 55 insertions(+), 42 deletions(-) diff --git a/package-lock.json b/package-lock.json index 87202a96b4..85f5ef5303 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "markdown-it": "^14.1.0" }, "devDependencies": { - "eslint": "^9.13.0", + "eslint": "^9.14.0", "espree": "^9.6.1", "esquery": "^1.6.0", "prettier": "^3.3.3", @@ -52,9 +52,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -136,9 +136,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.13.0.tgz", - "integrity": "sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==", + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.14.0.tgz", + "integrity": "sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -166,27 +166,40 @@ } }, "node_modules/@humanfs/core": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz", - "integrity": "sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, "engines": { "node": ">=18.18.0" } }, "node_modules/@humanfs/node": { - "version": "0.16.5", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.5.tgz", - "integrity": "sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==", + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, "dependencies": { - "@humanfs/core": "^0.19.0", + "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" }, "engines": { "node": ">=18.18.0" } }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -201,9 +214,9 @@ } }, "node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.0.tgz", + "integrity": "sha512-xnRgu9DxZbkWak/te3fcytNyp8MTbuiZIaueg2rgEvBuN55n04nwLYLU9TX/VVlusc9L2ZNXi99nUFNkHXtr5g==", "dev": true, "engines": { "node": ">=18.18" @@ -254,9 +267,9 @@ } }, "node_modules/acorn": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", - "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -640,21 +653,21 @@ } }, "node_modules/eslint": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.13.0.tgz", - "integrity": "sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==", + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.14.0.tgz", + "integrity": "sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.11.0", + "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.18.0", "@eslint/core": "^0.7.0", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.13.0", + "@eslint/js": "9.14.0", "@eslint/plugin-kit": "^0.2.0", - "@humanfs/node": "^0.16.5", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.3.1", + "@humanwhocodes/retry": "^0.4.0", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", @@ -662,9 +675,9 @@ "cross-spawn": "^7.0.2", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.1.0", - "eslint-visitor-keys": "^4.1.0", - "espree": "^10.2.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -700,9 +713,9 @@ } }, "node_modules/eslint-scope": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", - "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -728,9 +741,9 @@ } }, "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", - "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -740,14 +753,14 @@ } }, "node_modules/eslint/node_modules/espree": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz", - "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, "dependencies": { - "acorn": "^8.12.0", + "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.1.0" + "eslint-visitor-keys": "^4.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" diff --git a/package.json b/package.json index 2c779b57f3..72fe33bfc1 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "markdown-it": "^14.1.0" }, "devDependencies": { - "eslint": "^9.13.0", + "eslint": "^9.14.0", "espree": "^9.6.1", "esquery": "^1.6.0", "prettier": "^3.3.3", From 5daee2d361a6d357dade050a6294faca7a5e14cf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 2 Nov 2024 22:21:57 -0500 Subject: [PATCH 8/9] build(deps): bump @turbowarp/types from `da53338` to `1f85881` (#1743) --- package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 85f5ef5303..acdc0fcd84 100644 --- a/package-lock.json +++ b/package-lock.json @@ -238,8 +238,8 @@ }, "node_modules/@turbowarp/types": { "version": "0.0.12", - "resolved": "git+ssh://git@github.com/TurboWarp/types-tw.git#da533389791e5eace0fbb8d3a66b5eb79b186ee4", - "integrity": "sha512-CNfaI0MxTEr9fbXk7DHmcdmYscmn8e1rGuqiX+25fFV2DH9cD0CJSzzVIGm2Lwf24RdcAAF1lDAmogs/gHIy6A==", + "resolved": "git+ssh://git@github.com/TurboWarp/types-tw.git#1f858811919809efa4dbd789d27f8e513a32ee75", + "integrity": "sha512-OsBAn//X6giPsnBQ2ycA8ZRlMBXhnrWo89/qe5gWEaT0oHSqEN+leGNQJylR28UdbNddSTTjkcnAZ0cptHwKnA==", "license": "Apache-2.0" }, "node_modules/@types/estree": { From fedbe62912a10aa1b0a3748a5f621d8da55d22c0 Mon Sep 17 00:00:00 2001 From: Muffin Date: Sat, 2 Nov 2024 23:41:48 -0500 Subject: [PATCH 9/9] SharkPool/Font-Manager: updates (#1745) - use the new validation APIs from https://github.com/TurboWarp/scratch-vm/pull/231, otherwise adding system font "Arial" will be broken once that goes live - make the default add custom font block actually do something - add Chinese, Japanese, Korean fallback fonts - rename "Scratch" fallback font --- extensions/SharkPool/Font-Manager.js | 63 ++++++++++++++---- licenses/OFL-Lobster.txt | 93 +++++++++++++++++++++++++++ website/Lobster.woff2 | Bin 0 -> 101532 bytes 3 files changed, 143 insertions(+), 13 deletions(-) create mode 100644 licenses/OFL-Lobster.txt create mode 100644 website/Lobster.woff2 diff --git a/extensions/SharkPool/Font-Manager.js b/extensions/SharkPool/Font-Manager.js index aa5a1df672..3df722e047 100644 --- a/extensions/SharkPool/Font-Manager.js +++ b/extensions/SharkPool/Font-Manager.js @@ -114,11 +114,11 @@ arguments: { NAME: { type: Scratch.ArgumentType.STRING, - defaultValue: "Pusab", + defaultValue: "Lobster", }, URL: { type: Scratch.ArgumentType.STRING, - defaultValue: "", + defaultValue: "https://extensions.turbowarp.org/Lobster.woff2", }, BACKUP: { type: Scratch.ArgumentType.STRING, @@ -236,15 +236,52 @@ }, ], }, - FALLBACKS: [ - "Sans Serif", - "Serif", - "Handwriting", - "Marker", - "Curly", - "Pixel", - "Scratch", - ], + FALLBACKS: { + acceptReporters: false, + items: [ + { + text: "Sans Serif", + value: "Sans Serif", + }, + { + text: "Serif", + value: "Serif", + }, + { + text: "Handwriting", + value: "Handwriting", + }, + { + text: "Marker", + value: "Marker", + }, + { + text: "Curly", + value: "Curly", + }, + { + text: "Pixel", + value: "Pixel", + }, + { + text: "Mopeds", + value: "Scratch", + }, + { + text: "中文", + value: '"Microsoft YaHei", "微软雅黑", STXihei, "华文细黑"', + }, + { + text: "한국어", + value: "Malgun Gothic", + }, + { + text: "日本語", + value: + '"ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", Osaka, "メイリオ", Meiryo, "MS Pゴシック", "MS PGothic"', + }, + ], + }, FILES: { acceptReporters: true, items: FONT_EXTENSIONS.map((i) => `.${i}`), @@ -280,14 +317,14 @@ addSystemFont(args) { const name = Scratch.Cast.toString(args.NAME); - if (fontManager.isValidFamily(name)) { + if (fontManager.isValidSystemFont(name)) { fontManager.addSystemFont(name, Scratch.Cast.toString(args.BACKUP)); } } async addCustomFont(args) { const name = Scratch.Cast.toString(args.NAME); - if (!fontManager.isValidFamily(name)) { + if (!fontManager.isValidCustomFont(name)) { return; } diff --git a/licenses/OFL-Lobster.txt b/licenses/OFL-Lobster.txt new file mode 100644 index 0000000000..a47998e563 --- /dev/null +++ b/licenses/OFL-Lobster.txt @@ -0,0 +1,93 @@ +Copyright 2010 The Lobster Project Authors (https://github.com/impallari/The-Lobster-Font), with Reserved Font Name "Lobster". + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/website/Lobster.woff2 b/website/Lobster.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ffd81705ff671588e10c4cbf836347952e102ca0 GIT binary patch literal 101532 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 QUF^5$p!=6Iy8-nc0F9&ofB*mh literal 0 HcmV?d00001