@scratch/scratch-render 12.1.0-localte-selection → 12.1.0-login-from-editor
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/dist/node/scratch-render.js +34674 -34577
- package/dist/node/scratch-render.js.map +1 -1
- package/dist/web/scratch-render.js +77 -16
- package/dist/web/scratch-render.js.map +1 -1
- package/dist/web/scratch-render.min.js +77 -16
- package/dist/web/scratch-render.min.js.map +1 -1
- package/package.json +9 -9
- package/src/RenderWebGL.js +48 -0
|
@@ -13465,7 +13465,7 @@ module.exports = /*#__PURE__*/JSON.parse('{"name":"css-tree","version":"1.1.3","
|
|
|
13465
13465
|
/***/ (function(module) {
|
|
13466
13466
|
|
|
13467
13467
|
"use strict";
|
|
13468
|
-
/*! @license DOMPurify 3.2.
|
|
13468
|
+
/*! @license DOMPurify 3.2.7 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.7/LICENSE */
|
|
13469
13469
|
|
|
13470
13470
|
|
|
13471
13471
|
|
|
@@ -13496,12 +13496,18 @@ if (!seal) {
|
|
|
13496
13496
|
};
|
|
13497
13497
|
}
|
|
13498
13498
|
if (!apply) {
|
|
13499
|
-
apply = function apply(
|
|
13500
|
-
|
|
13499
|
+
apply = function apply(func, thisArg) {
|
|
13500
|
+
for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
|
|
13501
|
+
args[_key - 2] = arguments[_key];
|
|
13502
|
+
}
|
|
13503
|
+
return func.apply(thisArg, args);
|
|
13501
13504
|
};
|
|
13502
13505
|
}
|
|
13503
13506
|
if (!construct) {
|
|
13504
|
-
construct = function construct(Func
|
|
13507
|
+
construct = function construct(Func) {
|
|
13508
|
+
for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
|
|
13509
|
+
args[_key2 - 1] = arguments[_key2];
|
|
13510
|
+
}
|
|
13505
13511
|
return new Func(...args);
|
|
13506
13512
|
};
|
|
13507
13513
|
}
|
|
@@ -13530,8 +13536,8 @@ function unapply(func) {
|
|
|
13530
13536
|
if (thisArg instanceof RegExp) {
|
|
13531
13537
|
thisArg.lastIndex = 0;
|
|
13532
13538
|
}
|
|
13533
|
-
for (var
|
|
13534
|
-
args[
|
|
13539
|
+
for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
|
|
13540
|
+
args[_key3 - 1] = arguments[_key3];
|
|
13535
13541
|
}
|
|
13536
13542
|
return apply(func, thisArg, args);
|
|
13537
13543
|
};
|
|
@@ -13542,12 +13548,12 @@ function unapply(func) {
|
|
|
13542
13548
|
* @param func - The constructor function to be wrapped and called.
|
|
13543
13549
|
* @returns A new function that constructs an instance of the given constructor function with the provided arguments.
|
|
13544
13550
|
*/
|
|
13545
|
-
function unconstruct(
|
|
13551
|
+
function unconstruct(Func) {
|
|
13546
13552
|
return function () {
|
|
13547
|
-
for (var
|
|
13548
|
-
args[
|
|
13553
|
+
for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
|
|
13554
|
+
args[_key4] = arguments[_key4];
|
|
13549
13555
|
}
|
|
13550
|
-
return construct(
|
|
13556
|
+
return construct(Func, args);
|
|
13551
13557
|
};
|
|
13552
13558
|
}
|
|
13553
13559
|
/**
|
|
@@ -13646,8 +13652,8 @@ function lookupGetter(object, prop) {
|
|
|
13646
13652
|
return fallbackValue;
|
|
13647
13653
|
}
|
|
13648
13654
|
|
|
13649
|
-
const html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'section', 'select', 'shadow', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);
|
|
13650
|
-
const svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);
|
|
13655
|
+
const html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'search', 'section', 'select', 'shadow', 'slot', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);
|
|
13656
|
+
const svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'enterkeyhint', 'exportparts', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'inputmode', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'part', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'slot', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);
|
|
13651
13657
|
const svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']);
|
|
13652
13658
|
// List of SVG elements that are disallowed by default.
|
|
13653
13659
|
// We still need to know them so that we can do namespace
|
|
@@ -13660,7 +13666,7 @@ const mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mgly
|
|
|
13660
13666
|
const mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);
|
|
13661
13667
|
const text = freeze(['#text']);
|
|
13662
13668
|
|
|
13663
|
-
const html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'pattern', 'placeholder', 'playsinline', 'popover', 'popovertarget', 'popovertargetaction', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'wrap', 'xmlns', 'slot']);
|
|
13669
|
+
const html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'exportparts', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inert', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'part', 'pattern', 'placeholder', 'playsinline', 'popover', 'popovertarget', 'popovertargetaction', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'slot', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'wrap', 'xmlns', 'slot']);
|
|
13664
13670
|
const svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'amplitude', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'exponent', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'intercept', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'slope', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'tablevalues', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);
|
|
13665
13671
|
const mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnsalign', 'columnlines', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lspace', 'lquote', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);
|
|
13666
13672
|
const xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);
|
|
@@ -13768,7 +13774,7 @@ const _createHooksMap = function _createHooksMap() {
|
|
|
13768
13774
|
function createDOMPurify() {
|
|
13769
13775
|
let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();
|
|
13770
13776
|
const DOMPurify = root => createDOMPurify(root);
|
|
13771
|
-
DOMPurify.version = '3.2.
|
|
13777
|
+
DOMPurify.version = '3.2.7';
|
|
13772
13778
|
DOMPurify.removed = [];
|
|
13773
13779
|
if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) {
|
|
13774
13780
|
// Not running in a browser, provide a factory function
|
|
@@ -14465,7 +14471,7 @@ function createDOMPurify() {
|
|
|
14465
14471
|
// First condition does a very basic check if a) it's basically a valid custom element tagname AND
|
|
14466
14472
|
// b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck
|
|
14467
14473
|
// and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck
|
|
14468
|
-
_isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName)) ||
|
|
14474
|
+
_isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName, lcTag)) ||
|
|
14469
14475
|
// Alternative, second condition checks if it's an `is`-attribute, AND
|
|
14470
14476
|
// the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck
|
|
14471
14477
|
lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else {
|
|
@@ -14544,7 +14550,12 @@ function createDOMPurify() {
|
|
|
14544
14550
|
value = SANITIZE_NAMED_PROPS_PREFIX + value;
|
|
14545
14551
|
}
|
|
14546
14552
|
/* Work around a security issue with comments inside attributes */
|
|
14547
|
-
if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\/(style|title)/i, value)) {
|
|
14553
|
+
if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\/(style|title|textarea)/i, value)) {
|
|
14554
|
+
_removeAttribute(name, currentNode);
|
|
14555
|
+
continue;
|
|
14556
|
+
}
|
|
14557
|
+
/* Make sure we cannot easily use animated hrefs, even if animations are allowed */
|
|
14558
|
+
if (lcName === 'attributename' && stringMatch(value, 'href')) {
|
|
14548
14559
|
_removeAttribute(name, currentNode);
|
|
14549
14560
|
continue;
|
|
14550
14561
|
}
|
|
@@ -34508,6 +34519,56 @@ var RenderWebGL = /*#__PURE__*/function (_EventEmitter) {
|
|
|
34508
34519
|
return false;
|
|
34509
34520
|
}
|
|
34510
34521
|
|
|
34522
|
+
/**
|
|
34523
|
+
* Determine if the drawable is touching a rectangle.
|
|
34524
|
+
*
|
|
34525
|
+
* @param {int} drawableID The ID of the drawable to check.
|
|
34526
|
+
* @param {int} left - The left X coordinate of the rectangle.
|
|
34527
|
+
* @param {int} top - The top Y coordinate of the rectangle.
|
|
34528
|
+
* @param {int} right - The right X coordinate of the rectangle.
|
|
34529
|
+
* @param {int} bottom - The bottom Y coordinate of the rectangle.
|
|
34530
|
+
* @returns {boolean} If the drawable has any pixels that would draw in the rectangle area
|
|
34531
|
+
*/
|
|
34532
|
+
}, {
|
|
34533
|
+
key: "drawableTouchingScratchRect",
|
|
34534
|
+
value: function drawableTouchingScratchRect(drawableID, left, top, right, bottom) {
|
|
34535
|
+
var drawable = this._allDrawables[drawableID];
|
|
34536
|
+
if (!drawable) {
|
|
34537
|
+
return false;
|
|
34538
|
+
}
|
|
34539
|
+
var bounds = new Rectangle();
|
|
34540
|
+
bounds.initFromBounds(left, right, bottom, top);
|
|
34541
|
+
var worldPos = twgl.v3.create();
|
|
34542
|
+
drawable.updateCPURenderAttributes();
|
|
34543
|
+
for (worldPos[1] = bounds.bottom; worldPos[1] <= bounds.top; worldPos[1]++) {
|
|
34544
|
+
for (worldPos[0] = bounds.left; worldPos[0] <= bounds.right; worldPos[0]++) {
|
|
34545
|
+
if (drawable.isTouching(worldPos)) {
|
|
34546
|
+
return true;
|
|
34547
|
+
}
|
|
34548
|
+
}
|
|
34549
|
+
}
|
|
34550
|
+
return false;
|
|
34551
|
+
}
|
|
34552
|
+
|
|
34553
|
+
/**
|
|
34554
|
+
* Determine if the drawable is touching a point in the Scratch coordinate system
|
|
34555
|
+
*
|
|
34556
|
+
* @param {int} drawableID The ID of the drawable to check.
|
|
34557
|
+
* @param {int} x The x coordinate of the point.
|
|
34558
|
+
* @param {int} y The y coordinate of the point.
|
|
34559
|
+
* @returns {boolean} If the drawable is touching the point
|
|
34560
|
+
*/
|
|
34561
|
+
}, {
|
|
34562
|
+
key: "drawableTouchingScratchPoint",
|
|
34563
|
+
value: function drawableTouchingScratchPoint(drawableID, x, y) {
|
|
34564
|
+
var drawable = this._allDrawables[drawableID];
|
|
34565
|
+
if (!drawable) {
|
|
34566
|
+
return false;
|
|
34567
|
+
}
|
|
34568
|
+
drawable.updateCPURenderAttributes();
|
|
34569
|
+
return drawable.isTouching([x, y]);
|
|
34570
|
+
}
|
|
34571
|
+
|
|
34511
34572
|
/**
|
|
34512
34573
|
* Detect which sprite, if any, is at the given location.
|
|
34513
34574
|
* This function will pick all drawables that are visible, unless specific
|