From 431ef075ad43c969a18bc668c6a7ddc8c46957d3 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Tue, 11 Aug 2020 09:17:27 +1200 Subject: [PATCH 01/74] :bug: Fix user-select CSS parameter on modules' docs panel Closes #216 --- src/styl/tags/docs-panel.styl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/styl/tags/docs-panel.styl b/src/styl/tags/docs-panel.styl index f38039dab..32f20e1f0 100644 --- a/src/styl/tags/docs-panel.styl +++ b/src/styl/tags/docs-panel.styl @@ -20,7 +20,7 @@ docs-panel height 100% padding 1rem 2rem 2rem box-sizing border-box - user-select text + user-select unquote('text') aside ul From 0532e76a6041410a3c3af17ef981e6e6de9a3f86 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Tue, 11 Aug 2020 09:27:56 +1200 Subject: [PATCH 02/74] :bug: Add the missing CSS directive for pixelated projects Closes #211 --- src/node_requires/exporter/index.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/node_requires/exporter/index.js b/src/node_requires/exporter/index.js index 222a7f0a2..f9269534a 100644 --- a/src/node_requires/exporter/index.js +++ b/src/node_requires/exporter/index.js @@ -271,6 +271,10 @@ const exportCtProject = async (project, projdir) => { const html = substituteHtmlVars(await sources['index.html'], project, injects); let css = substituteCssVars(await sources['ct.css'], project, injects); + if (settings.rendering.pixelatedrender) { + css += '#ct canvas{image-rendering: pixelated;}'; + } + css += fonts.css; // Output minified HTML & CSS From 21d29c9e83344704f5d29a719a9b244b10207ffb Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Wed, 12 Aug 2020 10:37:25 +1200 Subject: [PATCH 03/74] :bug: Fix modules' extensions being parsed at the exporter if they have undefined or unset (equal to -1) secondary keys --- src/node_requires/exporter/utils.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/node_requires/exporter/utils.js b/src/node_requires/exporter/utils.js index 5beecce5f..d5544f77c 100644 --- a/src/node_requires/exporter/utils.js +++ b/src/node_requires/exporter/utils.js @@ -18,6 +18,11 @@ const getUnwrappedExtends = function getUnwrappedExtends(exts) { } const postfix = split.pop(); const key = split.join('@@'); + if ((postfix === 'type' || postfix === 'texture') && + (exts[i] === void 0 || exts[i] === -1)) { + // Skip unset values + continue; + } if (postfix === 'type') { try { out[key] = getTypeFromId(exts[i]).name; From f04ae700ee816277616c88860a06ba6db3d7007e Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Wed, 12 Aug 2020 11:14:11 +1200 Subject: [PATCH 04/74] :zap: Improve tile positioning algorithm for the room editor --- src/js/roomTileTools.js | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/js/roomTileTools.js b/src/js/roomTileTools.js index 8ebd72aef..fbf8e0c01 100644 --- a/src/js/roomTileTools.js +++ b/src/js/roomTileTools.js @@ -80,14 +80,14 @@ this.refs.canvas.x.drawImage( img, sx, sy, w, h, - e.offsetX / this.zoomFactor, - e.offsetY / this.zoomFactor, + (e.offsetX) / this.zoomFactor - w / 2, + (e.offsetY) / this.zoomFactor - h / 2, w, h ); } else { // snap coordinates to a grid if it is enabled - const dx = this.xToRoom(e.offsetX), - dy = this.yToRoom(e.offsetY); + const dx = this.xToRoom(e.offsetX - w / 2 * this.zoomFactor), + dy = this.yToRoom(e.offsetY - h / 2 * this.zoomFactor); this.refs.canvas.x.drawImage( img, sx, sy, w, h, @@ -121,12 +121,16 @@ return; } // insert tiles + + const tex = this.currentTileset; + const w = (tex.width + tex.marginx) * this.tileSpanX - tex.marginx, + h = (tex.height + tex.marginy) * this.tileSpanY - tex.marginy; if (Number(this.room.gridX) === 0 || e.altKey) { - if (this.lastTileX !== Math.floor(this.xToRoom(e.offsetX)) || - this.lastTileY !== Math.floor(this.yToRoom(e.offsetY)) + if (this.lastTileX !== Math.floor(this.xToRoom(e.offsetX) - w / 2) || + this.lastTileY !== Math.floor(this.yToRoom(e.offsetY) - h / 2) ) { - this.lastTileX = Math.floor(this.xToRoom(e.offsetX)); - this.lastTileY = Math.floor(this.yToRoom(e.offsetY)); + this.lastTileX = Math.floor(this.xToRoom(e.offsetX) - w / 2); + this.lastTileY = Math.floor(this.yToRoom(e.offsetY) - h / 2); this.currentTileLayer.tiles.push({ x: this.lastTileX, y: this.lastTileY, @@ -135,8 +139,8 @@ }); } } else { - var x = Math.floor(this.xToRoom(e.offsetX)), - y = Math.floor(this.yToRoom(e.offsetY)); + var x = Math.floor(this.xToRoom(e.offsetX - w / 2 * this.zoomFactor)), + y = Math.floor(this.yToRoom(e.offsetY - h / 2 * this.zoomFactor)); if (this.lastTileX !== Math.round(x / this.room.gridX) * this.room.gridX || this.lastTileY !== Math.round(y / this.room.gridY) * this.room.gridY ) { From b1a5a9cb7513856d8fa57495cc4a98b82fffd59a Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Wed, 12 Aug 2020 11:37:23 +1200 Subject: [PATCH 05/74] :sparkles: Toggle UI sounds in the Main menu -> Settings Closes #212 --- app/data/i18n/English.json | 1 + src/js/3rdparty/alertify.js | 61 ++++++++++------------ src/riotTags/debugger/debugger-toolbar.tag | 4 +- src/riotTags/main-menu.tag | 9 ++++ src/riotTags/rooms/room-editor.tag | 4 +- src/riotTags/style-editor.tag | 4 +- src/riotTags/texture-editor.tag | 4 +- src/riotTags/type-editor.tag | 4 +- 8 files changed, 53 insertions(+), 38 deletions(-) diff --git a/app/data/i18n/English.json b/app/data/i18n/English.json index 8426944ab..cc812b4e0 100644 --- a/app/data/i18n/English.json +++ b/app/data/i18n/English.json @@ -167,6 +167,7 @@ "codeFont": "Font for code", "codeLigatures": "Ligatures", "codeDense": "Dense layout", + "disableSounds": "Disable UI sounds", "openIncludeFolder": "Open \"include\" folder", "troubleshooting": "Troubleshooting", "toggleDevTools": "Toggle Dev Tools", diff --git a/src/js/3rdparty/alertify.js b/src/js/3rdparty/alertify.js index 00cd8e9bf..c5329270e 100644 --- a/src/js/3rdparty/alertify.js +++ b/src/js/3rdparty/alertify.js @@ -1,20 +1,22 @@ +/* eslint-disable func-names */ +/* eslint-disable max-lines-per-function */ +/* eslint-disable max-len */ +/* eslint-disable id-length */ /* eslint { 'no-underscore-dangle': 'off', max-params: 'off' } */ -(function() { - +(function alertify() { 'use strict'; var TRANSITION_FALLBACK_DURATION = 500; - var hideElement = function(el) { - + var hideElement = function (el) { if (!el) { return; } - var removeThis = function() { + var removeThis = function () { if (el && el.parentNode) { el.parentNode.removeChild(el); } @@ -26,11 +28,9 @@ // Fallback for no transitions. setTimeout(removeThis, TRANSITION_FALLBACK_DURATION); - }; - var Alertify = function () { - + var Alertify = function Alertify() { /** * Alertify private object * @type {Object} @@ -82,7 +82,6 @@ * @return {String} An HTML string of the message box */ build(item) { - var btnTxt = this.dialogs.buttons.ok; var html = '
' + this.dialogs.message.replace('{{message}}', item.message); @@ -100,7 +99,6 @@ .replace('{{cancel}}', this.cancelLabel); return html; - }, setCloseLogOnClick(bool) { @@ -116,9 +114,8 @@ * @return {undefined} */ close(elem, wait) { - if (this.closeLogOnClick) { - elem.addEventListener('click', function() { + elem.addEventListener('click', function () { hideElement(elem); }); } @@ -128,11 +125,10 @@ if (wait < 0) { hideElement(elem); } else if (wait > 0) { - setTimeout(function() { + setTimeout(function () { hideElement(elem); }, wait); } - }, /** @@ -164,7 +160,6 @@ * @return {void} */ log(message, type, click) { - var existing = document.querySelectorAll('.alertify-logs > div'); if (existing) { var diff = existing.length - this.maxLogItems; @@ -183,7 +178,6 @@ }, setupLogContainer() { - var elLog = document.querySelector('.alertify-logs'); var className = this.logContainerClass; if (!elLog) { @@ -198,7 +192,6 @@ } return elLog; - }, /** @@ -213,7 +206,6 @@ * @return {undefined} */ notify(message, type, click) { - var elLog = this.setupLogContainer(); var log = document.createElement('div'); @@ -230,12 +222,11 @@ } elLog.appendChild(log); - setTimeout(function() { + setTimeout(function () { log.className += ' show'; }, 10); this.close(log, this.delay); - }, /** @@ -246,14 +237,13 @@ * @return {undefined} */ setup(item) { - var el = document.createElement('div'); el.className = 'alertify hide'; el.innerHTML = this.build(item); var btnOK = el.querySelector('.ok'); var btnCancel = el.querySelector('.cancel'); - var input = item.type === 'prompt'? el.querySelector('input') : null; + var input = item.type === 'prompt' ? el.querySelector('input') : null; // Set default value/placeholder of input if (input) { @@ -262,14 +252,16 @@ } } - var setupHandlers = function(resolve) { + var setupHandlers = function (resolve) { if (typeof resolve !== 'function') { // promises are not available so resolve is a no-op - resolve = function () {void 0;}; + resolve = function () { + void 0; + }; } if (btnOK) { - btnOK.addEventListener('click', function(ev) { + btnOK.addEventListener('click', function (ev) { if (item.onOkay && typeof item.onOkay === 'function') { if (input) { item.onOkay(input.value, ev); @@ -296,7 +288,7 @@ } if (btnCancel) { - btnCancel.addEventListener('click', function(ev) { + btnCancel.addEventListener('click', function (ev) { if (item.onCancel && typeof item.onCancel === 'function') { item.onCancel(ev); } @@ -311,7 +303,7 @@ } if (input) { - input.addEventListener('keyup', function(ev) { + input.addEventListener('keyup', function (ev) { if (ev.which === 13) { btnOK.click(); } @@ -328,14 +320,14 @@ } this.parent.appendChild(el); - setTimeout(function() { + setTimeout(function () { el.classList.remove('hide'); if (input && item.type && item.type === 'prompt') { input.select(); input.focus(); } else if (btnOK) { - btnOK.focus(); - } + btnOK.focus(); + } }, 100); return promise; @@ -431,12 +423,16 @@ }, success(message, click) { _alertify.log(message, 'success', click); - soundbox.play('Success'); + if (localStorage.disableSounds !== 'on') { + soundbox.play('Success'); + } return this; }, error(message, click) { _alertify.log(message, 'error', click); - soundbox.play('Failure'); + if (localStorage.disableSounds !== 'on') { + soundbox.play('Failure'); + } return this; }, cancelBtn(label) { @@ -484,7 +480,6 @@ }; window.alertify = new Alertify(); - }()); window.alertify.reset(); diff --git a/src/riotTags/debugger/debugger-toolbar.tag b/src/riotTags/debugger/debugger-toolbar.tag index 7d0c28b3b..cd564f45c 100644 --- a/src/riotTags/debugger/debugger-toolbar.tag +++ b/src/riotTags/debugger/debugger-toolbar.tag @@ -159,7 +159,9 @@ debugger-toolbar const buff = new Buffer(shotBase64, 'base64'); const stream = fs.createWriteStream(fullPath); stream.on('finish', () => { - window.soundbox.play('Success'); + if (localStorage.disableSounds !== 'on') { + window.soundbox.play('Success'); + } // eslint-disable-next-line no-new new Notification('Done!', { body: `Saved to ${fullPath} 👌`, diff --git a/src/riotTags/main-menu.tag b/src/riotTags/main-menu.tag index 5dbf60bbd..a3013204f 100644 --- a/src/riotTags/main-menu.tag +++ b/src/riotTags/main-menu.tag @@ -424,6 +424,15 @@ main-menu.flexcol } }, { type: 'separator' + }, { + label: window.languageJSON.menu.disableSounds, + type: 'checkbox', + checked: () => localStorage.disableSounds === 'on', + click: () => { + localStorage.disableSounds = (localStorage.disableSounds || 'off') === 'off' ? 'on' : 'off'; + } + }, { + type: 'separator' }, { label: window.languageJSON.common.zoomIn, icon: 'zoom-in', diff --git a/src/riotTags/rooms/room-editor.tag b/src/riotTags/rooms/room-editor.tag index bf51862f8..ec9246f27 100644 --- a/src/riotTags/rooms/room-editor.tag +++ b/src/riotTags/rooms/room-editor.tag @@ -432,7 +432,9 @@ room-editor.panel.view if (this.nameTaken) { // animate the error notice require('./data/node_requires/jellify')(this.refs.errorNotice); - window.soundbox.play('Failure'); + if (localStorage.disableSounds !== 'on') { + window.soundbox.play('Failure'); + } return false; } this.room.lastmod = Number(new Date()); diff --git a/src/riotTags/style-editor.tag b/src/riotTags/style-editor.tag index 919b7f830..3146ea18b 100644 --- a/src/riotTags/style-editor.tag +++ b/src/riotTags/style-editor.tag @@ -260,7 +260,9 @@ style-editor.panel.view if (this.nameTaken) { // animate the error notice require('./data/node_requires/jellify')(this.refs.errorNotice); - soundbox.play('Failure'); + if (localStorage.disableSounds !== 'on') { + soundbox.play('Failure'); + } return false; } this.styleobj.lastmod = Number(new Date()); diff --git a/src/riotTags/texture-editor.tag b/src/riotTags/texture-editor.tag index 43990c8d6..a4b59de6c 100644 --- a/src/riotTags/texture-editor.tag +++ b/src/riotTags/texture-editor.tag @@ -757,7 +757,9 @@ texture-editor.panel.view if (this.nameTaken) { // animate the error notice require('./data/node_requires/jellify')(this.refs.errorNotice); - soundbox.play('Failure'); + if (localStorage.disableSounds !== 'on') { + soundbox.play('Failure'); + } return false; } this.parent.fillTextureMap(); diff --git a/src/riotTags/type-editor.tag b/src/riotTags/type-editor.tag index bd648d3db..5c1583d39 100644 --- a/src/riotTags/type-editor.tag +++ b/src/riotTags/type-editor.tag @@ -192,7 +192,9 @@ type-editor.panel.view.flexrow if (this.nameTaken) { // animate the error notice require('./data/node_requires/jellify')(this.refs.errorNotice); - soundbox.play('Failure'); + if (localStorage.disableSounds !== 'on') { + soundbox.play('Failure'); + } return false; } glob.modified = true; From a894d8b70c7a26d611a4de670b590e062797ea61 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Wed, 12 Aug 2020 13:19:33 +1200 Subject: [PATCH 06/74] :construction: Let's add nightly builds to ct.js --- .travis.yml | 21 ++++++++++++++++++--- buildAssets/icon.png | Bin 0 -> 18544 bytes buildAssets/nightly.icns | Bin 0 -> 111457 bytes buildAssets/nightly.ico | Bin 0 -> 116420 bytes buildAssets/nightly.png | Bin 0 -> 154390 bytes gulpfile.js | 23 +++++++++++++++++++++-- 6 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 buildAssets/icon.png create mode 100644 buildAssets/nightly.icns create mode 100644 buildAssets/nightly.ico create mode 100644 buildAssets/nightly.png diff --git a/.travis.yml b/.travis.yml index 5c69a2899..c60abcf5f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,12 +14,13 @@ stages: - name: lint - name: build - name: pack - if: tag IS present - - name: deploy - if: tag IS present + if: (tag IS present) AND (type != cron) + - name: packNightly + if: (branch = develop) AND (type = cron) jobs: include: + - stage: lint script: - gulp lint @@ -28,6 +29,7 @@ jobs: script: - gulp build skip_cleanup: true + - stage: pack script: - gulp -f devSetup.gulpfile.js @@ -48,5 +50,18 @@ jobs: - provider: script script: gulp deployOnly skip_cleanup: true + on: + all_branches: true + + - stage: packNightly + script: + - gulp -f devSetup.gulpfile.js + - gulp packages --nightly --buildNum=$TRAVIS_BUILD_NUMBER + skip_cleanup: true + deploy: + # Push to comigo.itch.io/ct + - provider: script + script: gulp deployOnly --nightly --buildNum=$TRAVIS_BUILD_NUMBER + skip_cleanup: true on: all_branches: true \ No newline at end of file diff --git a/buildAssets/icon.png b/buildAssets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..38bbc14507911f9dcc73a9ad236727c6dc490691 GIT binary patch literal 18544 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⩔8J-E!{wU~r1y0bvUY5Fp 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 DjYKZP literal 0 HcmV?d00001 diff --git a/buildAssets/nightly.ico b/buildAssets/nightly.ico new file mode 100644 index 0000000000000000000000000000000000000000..435204b3da2e2e3652042e29fe33e42d4cca8517 GIT binary patch literal 116420 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 a+7L%xLpW(MOs`lK&*6Ezm)o*Jh5rK%akB9M literal 0 HcmV?d00001 diff --git a/buildAssets/nightly.png b/buildAssets/nightly.png new file mode 100644 index 0000000000000000000000000000000000000000..b02a3795ed6691b6175d5fbbbf8c2277cf97a45c GIT binary patch literal 154390 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

$j;ccB{87=*Qw9pGknuVIInkY#)>C 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

yBdv|3UidWoijr_`xfTdSLxLWS=nRZZ+SO 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 literal 0 HcmV?d00001 diff --git a/gulpfile.js b/gulpfile.js index b8eef81a6..e1ecf82dc 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -33,7 +33,13 @@ const npm = (/^win/).test(process.platform) ? 'npm.cmd' : 'npm'; const pack = require('./app/package.json'); var channelPostfix = argv.channel || false, - fixEnabled = argv.fix || false; + fixEnabled = argv.fix || false, + nightly = argv.nightly || false, + buildNumber = argv.buildNum || false; + +if (nightly) { + channelPostfix = 'nightly'; +} let errorBoxShown = false; const showErrorBox = function () { @@ -390,6 +396,12 @@ const build = gulp.parallel([ const bakePackages = async () => { const NwBuilder = require('nw-builder'); + // Use the appropriate icon for each release channel + if (nightly) { + await fs.copy('./buildAssets/icon.png', './app/ct_ide.png'); + } else { + await fs.copy('./buildAssets/nightly.png', './app/ct_ide.png'); + } await fs.remove(path.join('./build', `ctjs - v${pack.version}`)); var nw = new NwBuilder({ files: nwFiles, @@ -399,7 +411,7 @@ const bakePackages = async () => { buildType: 'versioned', // forceDownload: true, zip: false, - macIcns: './buildAssets/icon.icns' + macIcns: nightly ? './buildAssets/nightly.icns' : './buildAssets/icon.icns' }); await nw.build(); console.log('Built to this location:', path.join('./build', `ctjs - v${pack.version}`)); @@ -527,6 +539,13 @@ const packages = gulp.series([ const deployOnly = () => { console.log(`For channel ${channelPostfix}`); + if (nightly) { + return spawnise.spawn('./butler', ['push', `./build/ctjs - v${pack.version}/linux32`, `comigo/ct:linux32${channelPostfix ? '-' + channelPostfix : ''}`, '--userversion', buildNumber]) + .then(() => spawnise.spawn('./butler', ['push', `./build/ctjs - v${pack.version}/linux64`, `comigo/ct:linux64${channelPostfix ? '-' + channelPostfix : ''}`, '--userversion', buildNumber])) + .then(() => spawnise.spawn('./butler', ['push', `./build/ctjs - v${pack.version}/osx64`, `comigo/ct:osx64${channelPostfix ? '-' + channelPostfix : ''}`, '--userversion', buildNumber])) + .then(() => spawnise.spawn('./butler', ['push', `./build/ctjs - v${pack.version}/win32`, `comigo/ct:win32${channelPostfix ? '-' + channelPostfix : ''}`, '--userversion', buildNumber])) + .then(() => spawnise.spawn('./butler', ['push', `./build/ctjs - v${pack.version}/win64`, `comigo/ct:win64${channelPostfix ? '-' + channelPostfix : ''}`, '--userversion', buildNumber])); + } return spawnise.spawn('./butler', ['push', `./build/ctjs - v${pack.version}/linux32`, `comigo/ct:linux32${channelPostfix ? '-' + channelPostfix : ''}`, '--userversion', pack.version]) .then(() => spawnise.spawn('./butler', ['push', `./build/ctjs - v${pack.version}/linux64`, `comigo/ct:linux64${channelPostfix ? '-' + channelPostfix : ''}`, '--userversion', pack.version])) .then(() => spawnise.spawn('./butler', ['push', `./build/ctjs - v${pack.version}/osx64`, `comigo/ct:osx64${channelPostfix ? '-' + channelPostfix : ''}`, '--userversion', pack.version])) From e9e234115198cbabe5b73aa7c4424cf07c829d8d Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Wed, 12 Aug 2020 14:58:47 +1200 Subject: [PATCH 07/74] :zap: Push nightly builds to comigo.itch.io/ct-nightly --- gulpfile.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index e1ecf82dc..e8c858b60 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -540,11 +540,11 @@ const packages = gulp.series([ const deployOnly = () => { console.log(`For channel ${channelPostfix}`); if (nightly) { - return spawnise.spawn('./butler', ['push', `./build/ctjs - v${pack.version}/linux32`, `comigo/ct:linux32${channelPostfix ? '-' + channelPostfix : ''}`, '--userversion', buildNumber]) - .then(() => spawnise.spawn('./butler', ['push', `./build/ctjs - v${pack.version}/linux64`, `comigo/ct:linux64${channelPostfix ? '-' + channelPostfix : ''}`, '--userversion', buildNumber])) - .then(() => spawnise.spawn('./butler', ['push', `./build/ctjs - v${pack.version}/osx64`, `comigo/ct:osx64${channelPostfix ? '-' + channelPostfix : ''}`, '--userversion', buildNumber])) - .then(() => spawnise.spawn('./butler', ['push', `./build/ctjs - v${pack.version}/win32`, `comigo/ct:win32${channelPostfix ? '-' + channelPostfix : ''}`, '--userversion', buildNumber])) - .then(() => spawnise.spawn('./butler', ['push', `./build/ctjs - v${pack.version}/win64`, `comigo/ct:win64${channelPostfix ? '-' + channelPostfix : ''}`, '--userversion', buildNumber])); + return spawnise.spawn('./butler', ['push', `./build/ctjs - v${pack.version}/linux32`, `comigo/ct-nightly:linux32${channelPostfix ? '-' + channelPostfix : ''}`, '--userversion', buildNumber]) + .then(() => spawnise.spawn('./butler', ['push', `./build/ctjs - v${pack.version}/linux64`, `comigo/ct-nightly:linux64${channelPostfix ? '-' + channelPostfix : ''}`, '--userversion', buildNumber])) + .then(() => spawnise.spawn('./butler', ['push', `./build/ctjs - v${pack.version}/osx64`, `comigo/ct-nightly:osx64${channelPostfix ? '-' + channelPostfix : ''}`, '--userversion', buildNumber])) + .then(() => spawnise.spawn('./butler', ['push', `./build/ctjs - v${pack.version}/win32`, `comigo/ct-nightly:win32${channelPostfix ? '-' + channelPostfix : ''}`, '--userversion', buildNumber])) + .then(() => spawnise.spawn('./butler', ['push', `./build/ctjs - v${pack.version}/win64`, `comigo/ct-nightly:win64${channelPostfix ? '-' + channelPostfix : ''}`, '--userversion', buildNumber])); } return spawnise.spawn('./butler', ['push', `./build/ctjs - v${pack.version}/linux32`, `comigo/ct:linux32${channelPostfix ? '-' + channelPostfix : ''}`, '--userversion', pack.version]) .then(() => spawnise.spawn('./butler', ['push', `./build/ctjs - v${pack.version}/linux64`, `comigo/ct:linux64${channelPostfix ? '-' + channelPostfix : ''}`, '--userversion', pack.version])) From 6094708499186dffbd253d4f48ca24911b48e456 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Thu, 13 Aug 2020 10:55:59 +1200 Subject: [PATCH 08/74] :bug: A workaround for 'oncancel' not being fired on input(type="file") tags. Fixes an issue with invisible inputs overlaying the main menu --- src/js/additionalShellHandiness.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/js/additionalShellHandiness.js b/src/js/additionalShellHandiness.js index a524bb9ad..022cf4af4 100644 --- a/src/js/additionalShellHandiness.js +++ b/src/js/additionalShellHandiness.js @@ -17,6 +17,9 @@ window.showOpenDialog = function showOpenDialog(options = {}) { const input = document.createElement('input'); input.setAttribute('type', 'file'); input.style.opacity = 0; + input.style.position = 'fixed'; + input.style.right = '100%'; + input.style.bottom = '100%'; document.body.appendChild(input); if (options.openDirectory) { input.setAttribute('nwdirectory', 'nwdirectory'); From 13964ce22ea3393df9067e183c102fc37c32ec5c Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Fri, 14 Aug 2020 11:04:52 +1200 Subject: [PATCH 09/74] :zap: More consistent and DRY code for getting an export dir Closes #213 --- src/node_requires/platformUtils.js | 18 +++++++++++++++++- src/riotTags/export-panel.tag | 9 ++++----- src/riotTags/main-menu.tag | 4 ++-- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/node_requires/platformUtils.js b/src/node_requires/platformUtils.js index c6ccb5444..a26ac3442 100644 --- a/src/node_requires/platformUtils.js +++ b/src/node_requires/platformUtils.js @@ -66,7 +66,10 @@ const mod = { }; { - let exportDir, exportDirPromise; + let exportDir, + exportDirPromise, + buildDir, + buildDirPromise; // We compute a directory once and store it forever mod.getExportDir = () => { if (exportDir) { @@ -81,6 +84,19 @@ const mod = { }); return exportDirPromise; }; + mod.getBuildDir = () => { + if (buildDir) { + return Promise.resolve(buildDir); + } + if (buildDirPromise) { + return buildDirPromise; + } + buildDirPromise = mod.getWritableDir().then(dir => { + buildDir = require('path').join(dir, 'build'); + return buildDir; + }); + return buildDirPromise; + }; } module.exports = mod; diff --git a/src/riotTags/export-panel.tag b/src/riotTags/export-panel.tag index 3a3eea072..9f94f2d6f 100644 --- a/src/riotTags/export-panel.tag +++ b/src/riotTags/export-panel.tag @@ -92,12 +92,11 @@ export-panel this.working = true; this.update(); - const {getWritableDir} = require('./data/node_requires/platformUtils'); + const {getBuildDir, getExportDir} = require('./data/node_requires/platformUtils'); const runCtExport = require('./data/node_requires/exporter'); - const writable = await getWritableDir(), - projectDir = global.projdir, - exportDir = path.join(writable, 'export'), - buildDir = path.join(writable, 'builds'); + const projectDir = global.projdir, + exportDir = await getExportDir(), + buildDir = await getBuildDir(); this.log.push('Exporting the project…'); this.update(); diff --git a/src/riotTags/main-menu.tag b/src/riotTags/main-menu.tag index a3013204f..83b1a0d51 100644 --- a/src/riotTags/main-menu.tag +++ b/src/riotTags/main-menu.tag @@ -241,11 +241,11 @@ main-menu.flexcol } }; this.zipExport = async () => { - const {getWritableDir} = require('./data/node_requires/platformUtils'); + const {getWritableDir, getExportDir} = require('./data/node_requires/platformUtils'); const writable = await getWritableDir(); const runCtExport = require('./data/node_requires/exporter'); const exportFile = path.join(writable, '/export.zip'), - inDir = path.join(writable, '/export/'); + inDir = await getExportDir(); await fs.remove(exportFile); runCtExport(global.currentProject, global.projdir) .then(() => { From d69a26fb2047ea3b7ea56a9071ba68d3c4878aa8 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Fri, 14 Aug 2020 11:45:27 +1200 Subject: [PATCH 10/74] :sparkles: Quickly fix backgrounds at the room editor if their texture is not marked for tiled use Closes #217 --- app/data/i18n/English.json | 5 +++- .../rooms/room-backgrounds-editor.tag | 25 +++++++++++++++++-- src/styl/themeHorizon.styl | 4 +++ 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/app/data/i18n/English.json b/app/data/i18n/English.json index cc812b4e0..eef9063f7 100644 --- a/app/data/i18n/English.json +++ b/app/data/i18n/English.json @@ -499,7 +499,10 @@ "parallax": "Parallax (X, Y):", "repeat": "Repeat:", "scale": "Scaling (X, Y):", - "shift": "Shift (X, Y):" + "shift": "Shift (X, Y):", + "notBackgroundTextureWarning": "This texture is not marked as a background. It will have gaps when exported.", + "fixBackground": "Fix it.", + "dismissWarning": "Dismiss." }, "roomtiles": { "moveTileLayer": "Move to a new depth", diff --git a/src/riotTags/rooms/room-backgrounds-editor.tag b/src/riotTags/rooms/room-backgrounds-editor.tag index 4d78d9bd6..6ef81a14f 100644 --- a/src/riotTags/rooms/room-backgrounds-editor.tag +++ b/src/riotTags/rooms/room-backgrounds-editor.tag @@ -1,13 +1,20 @@ room-backgrounds-editor.room-editor-Backgrounds.tabbed.tall ul li.bg(each="{background, ind in opts.room.backgrounds}" oncontextmenu="{onContextMenu}") - img(src="{background.texture === -1? 'data/img/notexture.png' : (glob.texturemap[background.texture].src.split('?')[0] + '_prev.png?' + glob.texturemap[background.texture].g.lastmod)}" onclick="{onChangeBgTexture}") + img(src="{getTexturePreview(background.texture)}" onclick="{onChangeBgTexture}") span span(class="{active: detailedBackground === background}" onclick="{editBackground}") svg.feather use(xlink:href="data/icons.svg#settings") - | {glob.texturemap[background.texture].g.name} ({background.depth}) + | {getTextureFromId(background.texture).name} ({background.depth}) .clear + .anErrorNotice(if="{background.texture && background.texture !== -1 && !getTextureFromId(background.texture).tiled && !getTextureFromId(background.texture).ignoreTiledUse}") + | {voc.notBackgroundTextureWarning} + | + span.a(onclick="{fixTexture(background)}") {voc.fixBackground} + | + | + span.a(onclick="{dismissWarning(background)}") {voc.dismissWarning} div(if="{detailedBackground === background}") .clear label @@ -59,6 +66,11 @@ room-backgrounds-editor.room-editor-Backgrounds.tabbed.tall script. const glob = require('./data/node_requires/glob'); this.glob = glob; + + const {getTextureFromId, getTexturePreview} = require('./data/node_requires/resources/textures'); + this.getTextureFromId = getTextureFromId; + this.getTexturePreview = getTexturePreview; + this.pickingBackground = false; this.namespace = 'roombackgrounds'; this.mixin(window.riotVoc); @@ -134,4 +146,13 @@ room-backgrounds-editor.room-editor-Backgrounds.tabbed.tall this.detailedBackground.extends = {}; } } + }; + + this.fixTexture = background => e => { + const tex = getTextureFromId(background.texture); + tex.tiled = true; + }; + this.dismissWarning = background => e => { + const tex = getTextureFromId(background.texture); + tex.ignoreTiledUse = true; }; \ No newline at end of file diff --git a/src/styl/themeHorizon.styl b/src/styl/themeHorizon.styl index 7bb0b26dd..75da61fc7 100644 --- a/src/styl/themeHorizon.styl +++ b/src/styl/themeHorizon.styl @@ -79,6 +79,10 @@ input[type="reset"], @require 'tags/**/*.styl' +.anErrorNotice + a, .a + text-decoration underline + gradCore = #733041 gradTransition = #2e2233 gradOuter = #1c1e26 From ceeb84465159d3abf110f78f29b2f4c3071b8be8 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Fri, 14 Aug 2020 11:46:32 +1200 Subject: [PATCH 11/74] :bug: Fix linter warnings at room-backgrounds-editor --- src/riotTags/rooms/room-backgrounds-editor.tag | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/riotTags/rooms/room-backgrounds-editor.tag b/src/riotTags/rooms/room-backgrounds-editor.tag index 6ef81a14f..452632ab1 100644 --- a/src/riotTags/rooms/room-backgrounds-editor.tag +++ b/src/riotTags/rooms/room-backgrounds-editor.tag @@ -148,11 +148,11 @@ room-backgrounds-editor.room-editor-Backgrounds.tabbed.tall } }; - this.fixTexture = background => e => { + this.fixTexture = background => () => { const tex = getTextureFromId(background.texture); tex.tiled = true; }; - this.dismissWarning = background => e => { + this.dismissWarning = background => () => { const tex = getTextureFromId(background.texture); tex.ignoreTiledUse = true; }; \ No newline at end of file From 0a8321f58d6ce2121c9fe1eb3d4ae581c7bc2314 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Fri, 14 Aug 2020 15:16:14 +1200 Subject: [PATCH 12/74] :bug: Fix checkboxes at extensions and module settings not showing the actual value's state --- src/riotTags/shared/extensions-editor.tag | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/riotTags/shared/extensions-editor.tag b/src/riotTags/shared/extensions-editor.tag index cecf2b194..98c1f1b47 100644 --- a/src/riotTags/shared/extensions-editor.tag +++ b/src/riotTags/shared/extensions-editor.tag @@ -50,7 +50,7 @@ extensions-editor input.nogrow( if="{ext.type === 'checkbox'}" type="checkbox" - value="{parent.opts.entity[ext.key] || ext.default}" + checked="{parent.opts.entity[ext.key] || ext.default}" onchange="{wire('this.opts.entity.'+ ext.key)}" ) span {ext.name} From 8433008cfca2811738513ae0c5d4601dfe50391d Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Fri, 14 Aug 2020 17:09:00 +1200 Subject: [PATCH 13/74] :construction: ct.3d module --- .../ct.libs/3d/includes/pixi.projection.js | 3753 +++++++++++++++++ app/data/ct.libs/3d/index.js | 1 + app/data/ct.libs/3d/injects/beforedraw.js | 5 + .../ct.libs/3d/injects/beforeroomoncreate.js | 12 + app/data/ct.libs/3d/injects/htmlbottom.html | 1 + app/data/ct.libs/3d/injects/onbeforecreate.js | 24 + app/data/ct.libs/3d/injects/oncreate.js | 3 + app/data/ct.libs/3d/module.json | 58 + app/data/ct.libs/3d/projection.ict | 406 ++ .../i059e8892-2ffd-40c8-a97b-7645b40b3db5.png | Bin 0 -> 17739 bytes ...2-2ffd-40c8-a97b-7645b40b3db5.png_prev.png | Bin 0 -> 2095 bytes ...2ffd-40c8-a97b-7645b40b3db5.png_prev@2.png | Bin 0 -> 6229 bytes .../i2b15568d-6e42-4ecc-a301-e580291e0a9b.png | Bin 0 -> 11252 bytes ...d-6e42-4ecc-a301-e580291e0a9b.png_prev.png | Bin 0 -> 975 bytes ...6e42-4ecc-a301-e580291e0a9b.png_prev@2.png | Bin 0 -> 2909 bytes .../i33bda9f8-75f1-4255-b86d-e5973350fd2b.png | Bin 0 -> 2127 bytes ...8-75f1-4255-b86d-e5973350fd2b.png_prev.png | Bin 0 -> 697 bytes ...75f1-4255-b86d-e5973350fd2b.png_prev@2.png | Bin 0 -> 1808 bytes .../i8217ffc8-5969-4237-8506-a5458d4d5e6c.png | Bin 0 -> 5366 bytes ...8-5969-4237-8506-a5458d4d5e6c.png_prev.png | Bin 0 -> 1283 bytes ...5969-4237-8506-a5458d4d5e6c.png_prev@2.png | Bin 0 -> 3443 bytes .../ia91db6dd-3773-4b88-8d5c-e80080cb0b82.png | Bin 0 -> 45351 bytes ...d-3773-4b88-8d5c-e80080cb0b82.png_prev.png | Bin 0 -> 3705 bytes ...3773-4b88-8d5c-e80080cb0b82.png_prev@2.png | Bin 0 -> 11710 bytes .../3d/projection/img/r6ab031e8b734.png | Bin 0 -> 14104 bytes .../3d/projection/img/re2209288edd5.png | Bin 0 -> 14104 bytes app/data/ct.libs/3d/projection/img/splash.png | Bin 0 -> 14104 bytes app/data/ct.libs/3d/types.d.ts | 625 +++ 28 files changed, 4888 insertions(+) create mode 100644 app/data/ct.libs/3d/includes/pixi.projection.js create mode 100644 app/data/ct.libs/3d/index.js create mode 100644 app/data/ct.libs/3d/injects/beforedraw.js create mode 100644 app/data/ct.libs/3d/injects/beforeroomoncreate.js create mode 100644 app/data/ct.libs/3d/injects/htmlbottom.html create mode 100644 app/data/ct.libs/3d/injects/onbeforecreate.js create mode 100644 app/data/ct.libs/3d/injects/oncreate.js create mode 100644 app/data/ct.libs/3d/module.json create mode 100644 app/data/ct.libs/3d/projection.ict create mode 100644 app/data/ct.libs/3d/projection/img/i059e8892-2ffd-40c8-a97b-7645b40b3db5.png create mode 100644 app/data/ct.libs/3d/projection/img/i059e8892-2ffd-40c8-a97b-7645b40b3db5.png_prev.png create mode 100644 app/data/ct.libs/3d/projection/img/i059e8892-2ffd-40c8-a97b-7645b40b3db5.png_prev@2.png create mode 100644 app/data/ct.libs/3d/projection/img/i2b15568d-6e42-4ecc-a301-e580291e0a9b.png create mode 100644 app/data/ct.libs/3d/projection/img/i2b15568d-6e42-4ecc-a301-e580291e0a9b.png_prev.png create mode 100644 app/data/ct.libs/3d/projection/img/i2b15568d-6e42-4ecc-a301-e580291e0a9b.png_prev@2.png create mode 100644 app/data/ct.libs/3d/projection/img/i33bda9f8-75f1-4255-b86d-e5973350fd2b.png create mode 100644 app/data/ct.libs/3d/projection/img/i33bda9f8-75f1-4255-b86d-e5973350fd2b.png_prev.png create mode 100644 app/data/ct.libs/3d/projection/img/i33bda9f8-75f1-4255-b86d-e5973350fd2b.png_prev@2.png create mode 100644 app/data/ct.libs/3d/projection/img/i8217ffc8-5969-4237-8506-a5458d4d5e6c.png create mode 100644 app/data/ct.libs/3d/projection/img/i8217ffc8-5969-4237-8506-a5458d4d5e6c.png_prev.png create mode 100644 app/data/ct.libs/3d/projection/img/i8217ffc8-5969-4237-8506-a5458d4d5e6c.png_prev@2.png create mode 100644 app/data/ct.libs/3d/projection/img/ia91db6dd-3773-4b88-8d5c-e80080cb0b82.png create mode 100644 app/data/ct.libs/3d/projection/img/ia91db6dd-3773-4b88-8d5c-e80080cb0b82.png_prev.png create mode 100644 app/data/ct.libs/3d/projection/img/ia91db6dd-3773-4b88-8d5c-e80080cb0b82.png_prev@2.png create mode 100644 app/data/ct.libs/3d/projection/img/r6ab031e8b734.png create mode 100644 app/data/ct.libs/3d/projection/img/re2209288edd5.png create mode 100644 app/data/ct.libs/3d/projection/img/splash.png create mode 100644 app/data/ct.libs/3d/types.d.ts diff --git a/app/data/ct.libs/3d/includes/pixi.projection.js b/app/data/ct.libs/3d/includes/pixi.projection.js new file mode 100644 index 000000000..15cdc03aa --- /dev/null +++ b/app/data/ct.libs/3d/includes/pixi.projection.js @@ -0,0 +1,3753 @@ +var pixi_projection; +(function (pixi_projection) { + var utils; + (function (utils) { + function getIntersectionFactor(p1, p2, p3, p4, out) { + var A1 = p2.x - p1.x, B1 = p3.x - p4.x, C1 = p3.x - p1.x; + var A2 = p2.y - p1.y, B2 = p3.y - p4.y, C2 = p3.y - p1.y; + var D = A1 * B2 - A2 * B1; + if (Math.abs(D) < 1e-7) { + out.x = A1; + out.y = A2; + return 0; + } + var T = C1 * B2 - C2 * B1; + var U = A1 * C2 - A2 * C1; + var t = T / D, u = U / D; + if (u < (1e-6) || u - 1 > -1e-6) { + return -1; + } + out.x = p1.x + t * (p2.x - p1.x); + out.y = p1.y + t * (p2.y - p1.y); + return 1; + } + utils.getIntersectionFactor = getIntersectionFactor; + function getPositionFromQuad(p, anchor, out) { + out = out || new PIXI.Point(); + var a1 = 1.0 - anchor.x, a2 = 1.0 - a1; + var b1 = 1.0 - anchor.y, b2 = 1.0 - b1; + out.x = (p[0].x * a1 + p[1].x * a2) * b1 + (p[3].x * a1 + p[2].x * a2) * b2; + out.y = (p[0].y * a1 + p[1].y * a2) * b1 + (p[3].y * a1 + p[2].y * a2) * b2; + return out; + } + utils.getPositionFromQuad = getPositionFromQuad; + })(utils = pixi_projection.utils || (pixi_projection.utils = {})); +})(pixi_projection || (pixi_projection = {})); +PIXI.projection = pixi_projection; +var pixi_projection; +(function (pixi_projection) { + var AbstractProjection = (function () { + function AbstractProjection(legacy, enable) { + if (enable === void 0) { enable = true; } + this._enabled = false; + this.legacy = legacy; + if (enable) { + this.enabled = true; + } + this.legacy.proj = this; + } + Object.defineProperty(AbstractProjection.prototype, "enabled", { + get: function () { + return this._enabled; + }, + set: function (value) { + this._enabled = value; + }, + enumerable: false, + configurable: true + }); + AbstractProjection.prototype.clear = function () { + }; + return AbstractProjection; + }()); + pixi_projection.AbstractProjection = AbstractProjection; + var TRANSFORM_STEP; + (function (TRANSFORM_STEP) { + TRANSFORM_STEP[TRANSFORM_STEP["NONE"] = 0] = "NONE"; + TRANSFORM_STEP[TRANSFORM_STEP["BEFORE_PROJ"] = 4] = "BEFORE_PROJ"; + TRANSFORM_STEP[TRANSFORM_STEP["PROJ"] = 5] = "PROJ"; + TRANSFORM_STEP[TRANSFORM_STEP["ALL"] = 9] = "ALL"; + })(TRANSFORM_STEP = pixi_projection.TRANSFORM_STEP || (pixi_projection.TRANSFORM_STEP = {})); +})(pixi_projection || (pixi_projection = {})); +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var pixi_projection; +(function (pixi_projection) { + function transformHack(parentTransform) { + var proj = this.proj; + var ta = this; + var pwid = parentTransform._worldID; + var lt = ta.localTransform; + var scaleAfterAffine = proj.scaleAfterAffine && proj.affine >= 2; + if (ta._localID !== ta._currentLocalID) { + if (scaleAfterAffine) { + lt.a = ta._cx; + lt.b = ta._sx; + lt.c = ta._cy; + lt.d = ta._sy; + lt.tx = ta.position._x; + lt.ty = ta.position._y; + } + else { + lt.a = ta._cx * ta.scale._x; + lt.b = ta._sx * ta.scale._x; + lt.c = ta._cy * ta.scale._y; + lt.d = ta._sy * ta.scale._y; + lt.tx = ta.position._x - ((ta.pivot._x * lt.a) + (ta.pivot._y * lt.c)); + lt.ty = ta.position._y - ((ta.pivot._x * lt.b) + (ta.pivot._y * lt.d)); + } + ta._currentLocalID = ta._localID; + proj._currentProjID = -1; + } + var _matrixID = proj._projID; + if (proj._currentProjID !== _matrixID) { + proj._currentProjID = _matrixID; + proj.updateLocalTransform(lt); + ta._parentID = -1; + } + if (ta._parentID !== pwid) { + var pp = parentTransform.proj; + if (pp && !pp._affine) { + proj.world.setToMult(pp.world, proj.local); + } + else { + proj.world.setToMultLegacy(parentTransform.worldTransform, proj.local); + } + var wa = ta.worldTransform; + proj.world.copyTo(wa, proj._affine, proj.affinePreserveOrientation); + if (scaleAfterAffine) { + wa.a *= ta.scale._x; + wa.b *= ta.scale._x; + wa.c *= ta.scale._y; + wa.d *= ta.scale._y; + wa.tx -= ((ta.pivot._x * wa.a) + (ta.pivot._y * wa.c)); + wa.ty -= ((ta.pivot._x * wa.b) + (ta.pivot._y * wa.d)); + } + ta._parentID = pwid; + ta._worldID++; + } + } + var LinearProjection = (function (_super) { + __extends(LinearProjection, _super); + function LinearProjection() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._projID = 0; + _this._currentProjID = -1; + _this._affine = pixi_projection.AFFINE.NONE; + _this.affinePreserveOrientation = false; + _this.scaleAfterAffine = true; + return _this; + } + LinearProjection.prototype.updateLocalTransform = function (lt) { + }; + Object.defineProperty(LinearProjection.prototype, "affine", { + get: function () { + return this._affine; + }, + set: function (value) { + if (this._affine == value) + return; + this._affine = value; + this._currentProjID = -1; + this.legacy._currentLocalID = -1; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(LinearProjection.prototype, "enabled", { + set: function (value) { + if (value === this._enabled) { + return; + } + this._enabled = value; + if (value) { + this.legacy.updateTransform = transformHack; + this.legacy._parentID = -1; + } + else { + this.legacy.updateTransform = PIXI.Transform.prototype.updateTransform; + this.legacy._parentID = -1; + } + }, + enumerable: false, + configurable: true + }); + LinearProjection.prototype.clear = function () { + this._currentProjID = -1; + this._projID = 0; + }; + return LinearProjection; + }(pixi_projection.AbstractProjection)); + pixi_projection.LinearProjection = LinearProjection; +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + var TYPES = PIXI.TYPES; + var premultiplyTint = PIXI.utils.premultiplyTint; + var shaderVert = "precision highp float;\nattribute vec3 aVertexPosition;\nattribute vec2 aTextureCoord;\nattribute vec4 aColor;\nattribute float aTextureId;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\nvarying vec4 vColor;\nvarying float vTextureId;\n\nvoid main(void){\n\tgl_Position.xyw = projectionMatrix * aVertexPosition;\n\tgl_Position.z = 0.0;\n\n\tvTextureCoord = aTextureCoord;\n\tvTextureId = aTextureId;\n\tvColor = aColor;\n}\n"; + var shaderFrag = "\nvarying vec2 vTextureCoord;\nvarying vec4 vColor;\nvarying float vTextureId;\nuniform sampler2D uSamplers[%count%];\n\nvoid main(void){\nvec4 color;\n%forloop%\ngl_FragColor = color * vColor;\n}"; + var Batch3dGeometry = (function (_super) { + __extends(Batch3dGeometry, _super); + function Batch3dGeometry(_static) { + if (_static === void 0) { _static = false; } + var _this = _super.call(this) || this; + _this._buffer = new PIXI.Buffer(null, _static, false); + _this._indexBuffer = new PIXI.Buffer(null, _static, true); + _this.addAttribute('aVertexPosition', _this._buffer, 3, false, TYPES.FLOAT) + .addAttribute('aTextureCoord', _this._buffer, 2, false, TYPES.FLOAT) + .addAttribute('aColor', _this._buffer, 4, true, TYPES.UNSIGNED_BYTE) + .addAttribute('aTextureId', _this._buffer, 1, true, TYPES.FLOAT) + .addIndex(_this._indexBuffer); + return _this; + } + return Batch3dGeometry; + }(PIXI.Geometry)); + pixi_projection.Batch3dGeometry = Batch3dGeometry; + var Batch2dPluginFactory = (function () { + function Batch2dPluginFactory() { + } + Batch2dPluginFactory.create = function (options) { + var _a = Object.assign({ + vertex: shaderVert, + fragment: shaderFrag, + geometryClass: Batch3dGeometry, + vertexSize: 7, + }, options), vertex = _a.vertex, fragment = _a.fragment, vertexSize = _a.vertexSize, geometryClass = _a.geometryClass; + return (function (_super) { + __extends(BatchPlugin, _super); + function BatchPlugin(renderer) { + var _this = _super.call(this, renderer) || this; + _this.shaderGenerator = new PIXI.BatchShaderGenerator(vertex, fragment); + _this.geometryClass = geometryClass; + _this.vertexSize = vertexSize; + return _this; + } + BatchPlugin.prototype.packInterleavedGeometry = function (element, attributeBuffer, indexBuffer, aIndex, iIndex) { + var uint32View = attributeBuffer.uint32View, float32View = attributeBuffer.float32View; + var p = aIndex / this.vertexSize; + var uvs = element.uvs; + var indices = element.indices; + var vertexData = element.vertexData; + var vertexData2d = element.vertexData2d; + var textureId = element._texture.baseTexture._batchLocation; + var alpha = Math.min(element.worldAlpha, 1.0); + var argb = alpha < 1.0 && element._texture.baseTexture.alphaMode ? premultiplyTint(element._tintRGB, alpha) + : element._tintRGB + (alpha * 255 << 24); + if (vertexData2d) { + var j = 0; + for (var i = 0; i < vertexData2d.length; i += 3, j += 2) { + float32View[aIndex++] = vertexData2d[i]; + float32View[aIndex++] = vertexData2d[i + 1]; + float32View[aIndex++] = vertexData2d[i + 2]; + float32View[aIndex++] = uvs[j]; + float32View[aIndex++] = uvs[j + 1]; + uint32View[aIndex++] = argb; + float32View[aIndex++] = textureId; + } + } + else { + for (var i = 0; i < vertexData.length; i += 2) { + float32View[aIndex++] = vertexData[i]; + float32View[aIndex++] = vertexData[i + 1]; + float32View[aIndex++] = 1.0; + float32View[aIndex++] = uvs[i]; + float32View[aIndex++] = uvs[i + 1]; + uint32View[aIndex++] = argb; + float32View[aIndex++] = textureId; + } + } + for (var i = 0; i < indices.length; i++) { + indexBuffer[iIndex++] = p + indices[i]; + } + }; + return BatchPlugin; + }(PIXI.AbstractBatchRenderer)); + }; + return Batch2dPluginFactory; + }()); + pixi_projection.Batch2dPluginFactory = Batch2dPluginFactory; + PIXI.Renderer.registerPlugin('batch2d', Batch2dPluginFactory.create({})); +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + var AbstractBatchRenderer = PIXI.AbstractBatchRenderer; + var premultiplyBlendMode = PIXI.utils.premultiplyBlendMode; + var UniformBatchRenderer = (function (_super) { + __extends(UniformBatchRenderer, _super); + function UniformBatchRenderer() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.forceMaxTextures = 0; + _this.defUniforms = {}; + return _this; + } + UniformBatchRenderer.prototype.getUniforms = function (sprite) { + return this.defUniforms; + }; + UniformBatchRenderer.prototype.syncUniforms = function (obj) { + if (!obj) + return; + var sh = this._shader; + for (var key in obj) { + sh.uniforms[key] = obj[key]; + } + }; + UniformBatchRenderer.prototype.buildDrawCalls = function (texArray, start, finish) { + var thisAny = this; + var _a = this, elements = _a._bufferedElements, _attributeBuffer = _a._attributeBuffer, _indexBuffer = _a._indexBuffer, vertexSize = _a.vertexSize; + var drawCalls = AbstractBatchRenderer._drawCallPool; + var dcIndex = this._dcIndex; + var aIndex = this._aIndex; + var iIndex = this._iIndex; + var drawCall = drawCalls[dcIndex]; + drawCall.start = this._iIndex; + drawCall.texArray = texArray; + for (var i = start; i < finish; ++i) { + var sprite = elements[i]; + var tex = sprite._texture.baseTexture; + var spriteBlendMode = premultiplyBlendMode[tex.alphaMode ? 1 : 0][sprite.blendMode]; + var uniforms = this.getUniforms(sprite); + elements[i] = null; + if (start < i && (drawCall.blend !== spriteBlendMode || drawCall.uniforms !== uniforms)) { + drawCall.size = iIndex - drawCall.start; + start = i; + drawCall = drawCalls[++dcIndex]; + drawCall.texArray = texArray; + drawCall.start = iIndex; + } + this.packInterleavedGeometry(sprite, _attributeBuffer, _indexBuffer, aIndex, iIndex); + aIndex += sprite.vertexData.length / 2 * vertexSize; + iIndex += sprite.indices.length; + drawCall.blend = spriteBlendMode; + drawCall.uniforms = uniforms; + } + if (start < finish) { + drawCall.size = iIndex - drawCall.start; + ++dcIndex; + } + thisAny._dcIndex = dcIndex; + thisAny._aIndex = aIndex; + thisAny._iIndex = iIndex; + }; + UniformBatchRenderer.prototype.drawBatches = function () { + var dcCount = this._dcIndex; + var _a = this.renderer, gl = _a.gl, stateSystem = _a.state, shaderSystem = _a.shader; + var drawCalls = AbstractBatchRenderer._drawCallPool; + var curUniforms = null; + var curTexArray = null; + for (var i = 0; i < dcCount; i++) { + var _b = drawCalls[i], texArray = _b.texArray, type = _b.type, size = _b.size, start = _b.start, blend = _b.blend, uniforms = _b.uniforms; + if (curTexArray !== texArray) { + curTexArray = texArray; + this.bindAndClearTexArray(texArray); + } + if (curUniforms !== uniforms) { + curUniforms = uniforms; + this.syncUniforms(uniforms); + shaderSystem.syncUniformGroup(this._shader.uniformGroup); + } + this.state.blendMode = blend; + stateSystem.set(this.state); + gl.drawElements(type, size, gl.UNSIGNED_SHORT, start * 2); + } + }; + UniformBatchRenderer.prototype.contextChange = function () { + if (!this.forceMaxTextures) { + _super.prototype.contextChange.call(this); + this.syncUniforms(this.defUniforms); + return; + } + var gl = this.renderer.gl; + var thisAny = this; + thisAny.MAX_TEXTURES = this.forceMaxTextures; + this._shader = thisAny.shaderGenerator.generateShader(this.MAX_TEXTURES); + this.syncUniforms(this.defUniforms); + for (var i = 0; i < thisAny._packedGeometryPoolSize; i++) { + thisAny._packedGeometries[i] = new (this.geometryClass)(); + } + this.initFlushBuffers(); + }; + return UniformBatchRenderer; + }(AbstractBatchRenderer)); + pixi_projection.UniformBatchRenderer = UniformBatchRenderer; +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + var p = [new PIXI.Point(), new PIXI.Point(), new PIXI.Point(), new PIXI.Point()]; + var a = [0, 0, 0, 0]; + var Surface = (function () { + function Surface() { + this.surfaceID = "default"; + this._updateID = 0; + this.vertexSrc = ""; + this.fragmentSrc = ""; + } + Surface.prototype.fillUniforms = function (uniforms) { + }; + Surface.prototype.clear = function () { + }; + Surface.prototype.boundsQuad = function (v, out, after) { + var minX = out[0], minY = out[1]; + var maxX = out[0], maxY = out[1]; + for (var i = 2; i < 8; i += 2) { + if (minX > out[i]) + minX = out[i]; + if (maxX < out[i]) + maxX = out[i]; + if (minY > out[i + 1]) + minY = out[i + 1]; + if (maxY < out[i + 1]) + maxY = out[i + 1]; + } + p[0].set(minX, minY); + this.apply(p[0], p[0]); + p[1].set(maxX, minY); + this.apply(p[1], p[1]); + p[2].set(maxX, maxY); + this.apply(p[2], p[2]); + p[3].set(minX, maxY); + this.apply(p[3], p[3]); + if (after) { + after.apply(p[0], p[0]); + after.apply(p[1], p[1]); + after.apply(p[2], p[2]); + after.apply(p[3], p[3]); + out[0] = p[0].x; + out[1] = p[0].y; + out[2] = p[1].x; + out[3] = p[1].y; + out[4] = p[2].x; + out[5] = p[2].y; + out[6] = p[3].x; + out[7] = p[3].y; + } + else { + for (var i = 1; i <= 3; i++) { + if (p[i].y < p[0].y || p[i].y == p[0].y && p[i].x < p[0].x) { + var t = p[0]; + p[0] = p[i]; + p[i] = t; + } + } + for (var i = 1; i <= 3; i++) { + a[i] = Math.atan2(p[i].y - p[0].y, p[i].x - p[0].x); + } + for (var i = 1; i <= 3; i++) { + for (var j = i + 1; j <= 3; j++) { + if (a[i] > a[j]) { + var t = p[i]; + p[i] = p[j]; + p[j] = t; + var t2 = a[i]; + a[i] = a[j]; + a[j] = t2; + } + } + } + out[0] = p[0].x; + out[1] = p[0].y; + out[2] = p[1].x; + out[3] = p[1].y; + out[4] = p[2].x; + out[5] = p[2].y; + out[6] = p[3].x; + out[7] = p[3].y; + if ((p[3].x - p[2].x) * (p[1].y - p[2].y) - (p[1].x - p[2].x) * (p[3].y - p[2].y) < 0) { + out[4] = p[3].x; + out[5] = p[3].y; + return; + } + } + }; + return Surface; + }()); + pixi_projection.Surface = Surface; +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + var tempMat = new PIXI.Matrix(); + var tempRect = new PIXI.Rectangle(); + var tempPoint = new PIXI.Point(); + var BilinearSurface = (function (_super) { + __extends(BilinearSurface, _super); + function BilinearSurface() { + var _this = _super.call(this) || this; + _this.distortion = new PIXI.Point(); + return _this; + } + BilinearSurface.prototype.clear = function () { + this.distortion.set(0, 0); + }; + BilinearSurface.prototype.apply = function (pos, newPos) { + newPos = newPos || new PIXI.Point(); + var d = this.distortion; + var m = pos.x * pos.y; + newPos.x = pos.x + d.x * m; + newPos.y = pos.y + d.y * m; + return newPos; + }; + BilinearSurface.prototype.applyInverse = function (pos, newPos) { + newPos = newPos || new PIXI.Point(); + var vx = pos.x, vy = pos.y; + var dx = this.distortion.x, dy = this.distortion.y; + if (dx == 0.0) { + newPos.x = vx; + newPos.y = vy / (1.0 + dy * vx); + } + else if (dy == 0.0) { + newPos.y = vy; + newPos.x = vx / (1.0 + dx * vy); + } + else { + var b = (vy * dx - vx * dy + 1.0) * 0.5 / dy; + var d = b * b + vx / dy; + if (d <= 0.00001) { + newPos.set(NaN, NaN); + return newPos; + } + if (dy > 0.0) { + newPos.x = -b + Math.sqrt(d); + } + else { + newPos.x = -b - Math.sqrt(d); + } + newPos.y = (vx / newPos.x - 1.0) / dx; + } + return newPos; + }; + BilinearSurface.prototype.mapSprite = function (sprite, quad, outTransform) { + var tex = sprite.texture; + tempRect.x = -sprite.anchor.x * tex.orig.width; + tempRect.y = -sprite.anchor.y * tex.orig.height; + tempRect.width = tex.orig.width; + tempRect.height = tex.orig.height; + return this.mapQuad(tempRect, quad, outTransform || sprite.transform); + }; + BilinearSurface.prototype.mapQuad = function (rect, quad, outTransform) { + var ax = -rect.x / rect.width; + var ay = -rect.y / rect.height; + var ax2 = (1.0 - rect.x) / rect.width; + var ay2 = (1.0 - rect.y) / rect.height; + var up1x = (quad[0].x * (1.0 - ax) + quad[1].x * ax); + var up1y = (quad[0].y * (1.0 - ax) + quad[1].y * ax); + var up2x = (quad[0].x * (1.0 - ax2) + quad[1].x * ax2); + var up2y = (quad[0].y * (1.0 - ax2) + quad[1].y * ax2); + var down1x = (quad[3].x * (1.0 - ax) + quad[2].x * ax); + var down1y = (quad[3].y * (1.0 - ax) + quad[2].y * ax); + var down2x = (quad[3].x * (1.0 - ax2) + quad[2].x * ax2); + var down2y = (quad[3].y * (1.0 - ax2) + quad[2].y * ax2); + var x00 = up1x * (1.0 - ay) + down1x * ay; + var y00 = up1y * (1.0 - ay) + down1y * ay; + var x10 = up2x * (1.0 - ay) + down2x * ay; + var y10 = up2y * (1.0 - ay) + down2y * ay; + var x01 = up1x * (1.0 - ay2) + down1x * ay2; + var y01 = up1y * (1.0 - ay2) + down1y * ay2; + var x11 = up2x * (1.0 - ay2) + down2x * ay2; + var y11 = up2y * (1.0 - ay2) + down2y * ay2; + var mat = tempMat; + mat.tx = x00; + mat.ty = y00; + mat.a = x10 - x00; + mat.b = y10 - y00; + mat.c = x01 - x00; + mat.d = y01 - y00; + tempPoint.set(x11, y11); + mat.applyInverse(tempPoint, tempPoint); + this.distortion.set(tempPoint.x - 1, tempPoint.y - 1); + outTransform.setFromMatrix(mat); + return this; + }; + BilinearSurface.prototype.fillUniforms = function (uniforms) { + uniforms.distortion = uniforms.distortion || new Float32Array([0, 0, 0, 0]); + var ax = Math.abs(this.distortion.x); + var ay = Math.abs(this.distortion.y); + uniforms.distortion[0] = ax * 10000 <= ay ? 0 : this.distortion.x; + uniforms.distortion[1] = ay * 10000 <= ax ? 0 : this.distortion.y; + uniforms.distortion[2] = 1.0 / uniforms.distortion[0]; + uniforms.distortion[3] = 1.0 / uniforms.distortion[1]; + }; + return BilinearSurface; + }(pixi_projection.Surface)); + pixi_projection.BilinearSurface = BilinearSurface; +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + var Container2s = (function (_super) { + __extends(Container2s, _super); + function Container2s() { + var _this = _super.call(this) || this; + _this.proj = new pixi_projection.ProjectionSurface(_this.transform); + return _this; + } + Object.defineProperty(Container2s.prototype, "worldTransform", { + get: function () { + return this.proj; + }, + enumerable: false, + configurable: true + }); + return Container2s; + }(PIXI.Container)); + pixi_projection.Container2s = Container2s; +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + var fun = PIXI.Transform.prototype.updateTransform; + function transformHack(parentTransform) { + var proj = this.proj; + var pp = parentTransform.proj; + var ta = this; + if (!pp) { + fun.call(this, parentTransform); + proj._activeProjection = null; + return; + } + if (pp._surface) { + proj._activeProjection = pp; + this.updateLocalTransform(); + this.localTransform.copyTo(this.worldTransform); + if (ta._parentID < 0) { + ++ta._worldID; + } + return; + } + fun.call(this, parentTransform); + proj._activeProjection = pp._activeProjection; + } + var ProjectionSurface = (function (_super) { + __extends(ProjectionSurface, _super); + function ProjectionSurface(legacy, enable) { + var _this = _super.call(this, legacy, enable) || this; + _this._surface = null; + _this._activeProjection = null; + _this._currentSurfaceID = -1; + _this._currentLegacyID = -1; + _this._lastUniforms = null; + return _this; + } + Object.defineProperty(ProjectionSurface.prototype, "enabled", { + set: function (value) { + if (value === this._enabled) { + return; + } + this._enabled = value; + if (value) { + this.legacy.updateTransform = transformHack; + this.legacy._parentID = -1; + } + else { + this.legacy.updateTransform = PIXI.Transform.prototype.updateTransform; + this.legacy._parentID = -1; + } + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ProjectionSurface.prototype, "surface", { + get: function () { + return this._surface; + }, + set: function (value) { + if (this._surface == value) { + return; + } + this._surface = value || null; + this.legacy._parentID = -1; + }, + enumerable: false, + configurable: true + }); + ProjectionSurface.prototype.applyPartial = function (pos, newPos) { + if (this._activeProjection !== null) { + newPos = this.legacy.worldTransform.apply(pos, newPos); + return this._activeProjection.surface.apply(newPos, newPos); + } + if (this._surface !== null) { + return this.surface.apply(pos, newPos); + } + return this.legacy.worldTransform.apply(pos, newPos); + }; + ProjectionSurface.prototype.apply = function (pos, newPos) { + if (this._activeProjection !== null) { + newPos = this.legacy.worldTransform.apply(pos, newPos); + this._activeProjection.surface.apply(newPos, newPos); + return this._activeProjection.legacy.worldTransform.apply(newPos, newPos); + } + if (this._surface !== null) { + newPos = this.surface.apply(pos, newPos); + return this.legacy.worldTransform.apply(newPos, newPos); + } + return this.legacy.worldTransform.apply(pos, newPos); + }; + ProjectionSurface.prototype.applyInverse = function (pos, newPos) { + if (this._activeProjection !== null) { + newPos = this._activeProjection.legacy.worldTransform.applyInverse(pos, newPos); + this._activeProjection._surface.applyInverse(newPos, newPos); + return this.legacy.worldTransform.applyInverse(newPos, newPos); + } + if (this._surface !== null) { + newPos = this.legacy.worldTransform.applyInverse(pos, newPos); + return this._surface.applyInverse(newPos, newPos); + } + return this.legacy.worldTransform.applyInverse(pos, newPos); + }; + ProjectionSurface.prototype.mapBilinearSprite = function (sprite, quad) { + if (!(this._surface instanceof pixi_projection.BilinearSurface)) { + this.surface = new pixi_projection.BilinearSurface(); + } + this.surface.mapSprite(sprite, quad, this.legacy); + }; + ProjectionSurface.prototype.clear = function () { + if (this.surface) { + this.surface.clear(); + } + }; + Object.defineProperty(ProjectionSurface.prototype, "uniforms", { + get: function () { + if (this._currentLegacyID === this.legacy._worldID && + this._currentSurfaceID === this.surface._updateID) { + return this._lastUniforms; + } + this._lastUniforms = this._lastUniforms || {}; + this._lastUniforms.translationMatrix = this.legacy.worldTransform; + this._surface.fillUniforms(this._lastUniforms); + return this._lastUniforms; + }, + enumerable: false, + configurable: true + }); + return ProjectionSurface; + }(pixi_projection.AbstractProjection)); + pixi_projection.ProjectionSurface = ProjectionSurface; +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + var TYPES = PIXI.TYPES; + var premultiplyTint = PIXI.utils.premultiplyTint; + var shaderVert = "precision highp float;\nattribute vec2 aVertexPosition;\nattribute vec3 aTrans1;\nattribute vec3 aTrans2;\nattribute vec2 aSamplerSize;\nattribute vec4 aFrame;\nattribute vec4 aColor;\nattribute float aTextureId;\n\nuniform mat3 projectionMatrix;\nuniform mat3 translationMatrix;\n\nvarying vec2 vertexPosition;\nvarying vec3 vTrans1;\nvarying vec3 vTrans2;\nvarying vec2 vSamplerSize;\nvarying vec4 vFrame;\nvarying vec4 vColor;\nvarying float vTextureId;\n\nvoid main(void){\n\tgl_Position.xyw = projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0);\n\tgl_Position.z = 0.0;\n\n\tvertexPosition = aVertexPosition;\n\tvTrans1 = aTrans1;\n\tvTrans2 = aTrans2;\n\tvTextureId = aTextureId;\n\tvColor = aColor;\n\tvSamplerSize = aSamplerSize;\n\tvFrame = aFrame;\n}\n"; + var shaderFrag = "precision highp float;\nvarying vec2 vertexPosition;\nvarying vec3 vTrans1;\nvarying vec3 vTrans2;\nvarying vec2 vSamplerSize;\nvarying vec4 vFrame;\nvarying vec4 vColor;\nvarying float vTextureId;\n\nuniform sampler2D uSamplers[%count%];\nuniform vec4 distortion;\n\nvoid main(void){\nvec2 surface;\nvec2 surface2;\n\nfloat vx = vertexPosition.x;\nfloat vy = vertexPosition.y;\nfloat dx = distortion.x;\nfloat dy = distortion.y;\nfloat revx = distortion.z;\nfloat revy = distortion.w;\n\nif (distortion.x == 0.0) {\n\tsurface.x = vx;\n\tsurface.y = vy / (1.0 + dy * vx);\n\tsurface2 = surface;\n} else\nif (distortion.y == 0.0) {\n\tsurface.y = vy;\n\tsurface.x = vx / (1.0 + dx * vy);\n\tsurface2 = surface;\n} else {\n\tfloat c = vy * dx - vx * dy;\n\tfloat b = (c + 1.0) * 0.5;\n\tfloat b2 = (-c + 1.0) * 0.5;\n\tfloat d = b * b + vx * dy;\n\tif (d < -0.00001) {\n\t discard;\n\t}\n\td = sqrt(max(d, 0.0));\n\tsurface.x = (- b + d) * revy;\n\tsurface2.x = (- b - d) * revy;\n\tsurface.y = (- b2 + d) * revx;\n\tsurface2.y = (- b2 - d) * revx;\n}\n\nvec2 uv;\nuv.x = vTrans1.x * surface.x + vTrans1.y * surface.y + vTrans1.z;\nuv.y = vTrans2.x * surface.x + vTrans2.y * surface.y + vTrans2.z;\n\nvec2 pixels = uv * vSamplerSize;\n\nif (pixels.x < vFrame.x || pixels.x > vFrame.z ||\n\tpixels.y < vFrame.y || pixels.y > vFrame.w) {\n\tuv.x = vTrans1.x * surface2.x + vTrans1.y * surface2.y + vTrans1.z;\n\tuv.y = vTrans2.x * surface2.x + vTrans2.y * surface2.y + vTrans2.z;\n\tpixels = uv * vSamplerSize;\n\n if (pixels.x < vFrame.x || pixels.x > vFrame.z ||\n pixels.y < vFrame.y || pixels.y > vFrame.w) {\n discard;\n }\n}\n\nvec4 edge;\nedge.xy = clamp(pixels - vFrame.xy + 0.5, vec2(0.0, 0.0), vec2(1.0, 1.0));\nedge.zw = clamp(vFrame.zw - pixels + 0.5, vec2(0.0, 0.0), vec2(1.0, 1.0));\n\nfloat alpha = 1.0; //edge.x * edge.y * edge.z * edge.w;\nvec4 rColor = vColor * alpha;\n\nfloat textureId = floor(vTextureId+0.5);\nvec2 vTextureCoord = uv;\nvec4 color;\n%forloop%\ngl_FragColor = color * rColor;\n}"; + var BatchBilineardGeometry = (function (_super) { + __extends(BatchBilineardGeometry, _super); + function BatchBilineardGeometry(_static) { + if (_static === void 0) { _static = false; } + var _this = _super.call(this) || this; + _this._buffer = new PIXI.Buffer(null, _static, false); + _this._indexBuffer = new PIXI.Buffer(null, _static, true); + _this.addAttribute('aVertexPosition', _this._buffer, 2, false, TYPES.FLOAT) + .addAttribute('aTrans1', _this._buffer, 3, false, TYPES.FLOAT) + .addAttribute('aTrans2', _this._buffer, 3, false, TYPES.FLOAT) + .addAttribute('aSamplerSize', _this._buffer, 2, false, TYPES.FLOAT) + .addAttribute('aFrame', _this._buffer, 4, false, TYPES.FLOAT) + .addAttribute('aColor', _this._buffer, 4, true, TYPES.UNSIGNED_BYTE) + .addAttribute('aTextureId', _this._buffer, 1, true, TYPES.FLOAT) + .addIndex(_this._indexBuffer); + return _this; + } + return BatchBilineardGeometry; + }(PIXI.Geometry)); + pixi_projection.BatchBilineardGeometry = BatchBilineardGeometry; + var BatchBilinearPluginFactory = (function () { + function BatchBilinearPluginFactory() { + } + BatchBilinearPluginFactory.create = function (options) { + var _a = Object.assign({ + vertex: shaderVert, + fragment: shaderFrag, + geometryClass: BatchBilineardGeometry, + vertexSize: 16, + }, options), vertex = _a.vertex, fragment = _a.fragment, vertexSize = _a.vertexSize, geometryClass = _a.geometryClass; + return (function (_super) { + __extends(BatchPlugin, _super); + function BatchPlugin(renderer) { + var _this = _super.call(this, renderer) || this; + _this.defUniforms = { + translationMatrix: new PIXI.Matrix(), + distortion: new Float32Array([0, 0, Infinity, Infinity]) + }; + _this.size = 1000; + _this.forceMaxTextures = 1; + _this.shaderGenerator = new PIXI.BatchShaderGenerator(vertex, fragment); + _this.geometryClass = geometryClass; + _this.vertexSize = vertexSize; + return _this; + } + BatchPlugin.prototype.getUniforms = function (sprite) { + var proj = sprite.proj; + if (proj.surface !== null) { + return proj.uniforms; + } + if (proj._activeProjection !== null) { + return proj._activeProjection.uniforms; + } + return this.defUniforms; + }; + BatchPlugin.prototype.packInterleavedGeometry = function (element, attributeBuffer, indexBuffer, aIndex, iIndex) { + var uint32View = attributeBuffer.uint32View, float32View = attributeBuffer.float32View; + var p = aIndex / this.vertexSize; + var indices = element.indices; + var vertexData = element.vertexData; + var tex = element._texture; + var frame = tex._frame; + var aTrans = element.aTrans; + var _a = element._texture.baseTexture, _batchLocation = _a._batchLocation, realWidth = _a.realWidth, realHeight = _a.realHeight, resolution = _a.resolution; + var alpha = Math.min(element.worldAlpha, 1.0); + var argb = alpha < 1.0 && element._texture.baseTexture.alphaMode ? premultiplyTint(element._tintRGB, alpha) + : element._tintRGB + (alpha * 255 << 24); + for (var i = 0; i < vertexData.length; i += 2) { + float32View[aIndex] = vertexData[i]; + float32View[aIndex + 1] = vertexData[i + 1]; + float32View[aIndex + 2] = aTrans.a; + float32View[aIndex + 3] = aTrans.c; + float32View[aIndex + 4] = aTrans.tx; + float32View[aIndex + 5] = aTrans.b; + float32View[aIndex + 6] = aTrans.d; + float32View[aIndex + 7] = aTrans.ty; + float32View[aIndex + 8] = realWidth; + float32View[aIndex + 9] = realHeight; + float32View[aIndex + 10] = frame.x * resolution; + float32View[aIndex + 11] = frame.y * resolution; + float32View[aIndex + 12] = (frame.x + frame.width) * resolution; + float32View[aIndex + 13] = (frame.y + frame.height) * resolution; + uint32View[aIndex + 14] = argb; + float32View[aIndex + 15] = _batchLocation; + aIndex += 16; + } + for (var i = 0; i < indices.length; i++) { + indexBuffer[iIndex++] = p + indices[i]; + } + }; + return BatchPlugin; + }(pixi_projection.UniformBatchRenderer)); + }; + return BatchBilinearPluginFactory; + }()); + pixi_projection.BatchBilinearPluginFactory = BatchBilinearPluginFactory; + PIXI.Renderer.registerPlugin('batch_bilinear', BatchBilinearPluginFactory.create({})); +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + var Sprite2s = (function (_super) { + __extends(Sprite2s, _super); + function Sprite2s(texture) { + var _this = _super.call(this, texture) || this; + _this.aTrans = new PIXI.Matrix(); + _this.proj = new pixi_projection.ProjectionSurface(_this.transform); + _this.pluginName = 'batch_bilinear'; + return _this; + } + Sprite2s.prototype._calculateBounds = function () { + this.calculateTrimmedVertices(); + this._bounds.addQuad(this.vertexTrimmedData); + }; + Sprite2s.prototype.calculateVertices = function () { + var wid = this.transform._worldID; + var tuid = this._texture._updateID; + if (this._transformID === wid && this._textureID === tuid) { + return; + } + this._transformID = wid; + this._textureID = tuid; + var texture = this._texture; + var vertexData = this.vertexData; + var trim = texture.trim; + var orig = texture.orig; + var anchor = this._anchor; + var w0 = 0; + var w1 = 0; + var h0 = 0; + var h1 = 0; + if (trim) { + w1 = trim.x - (anchor._x * orig.width); + w0 = w1 + trim.width; + h1 = trim.y - (anchor._y * orig.height); + h0 = h1 + trim.height; + } + else { + w1 = -anchor._x * orig.width; + w0 = w1 + orig.width; + h1 = -anchor._y * orig.height; + h0 = h1 + orig.height; + } + if (this.proj._surface) { + vertexData[0] = w1; + vertexData[1] = h1; + vertexData[2] = w0; + vertexData[3] = h1; + vertexData[4] = w0; + vertexData[5] = h0; + vertexData[6] = w1; + vertexData[7] = h0; + this.proj._surface.boundsQuad(vertexData, vertexData); + } + else { + var wt = this.transform.worldTransform; + var a = wt.a; + var b = wt.b; + var c = wt.c; + var d = wt.d; + var tx = wt.tx; + var ty = wt.ty; + vertexData[0] = (a * w1) + (c * h1) + tx; + vertexData[1] = (d * h1) + (b * w1) + ty; + vertexData[2] = (a * w0) + (c * h1) + tx; + vertexData[3] = (d * h1) + (b * w0) + ty; + vertexData[4] = (a * w0) + (c * h0) + tx; + vertexData[5] = (d * h0) + (b * w0) + ty; + vertexData[6] = (a * w1) + (c * h0) + tx; + vertexData[7] = (d * h0) + (b * w1) + ty; + if (this.proj._activeProjection) { + this.proj._activeProjection.surface.boundsQuad(vertexData, vertexData); + } + } + if (!texture.uvMatrix) { + texture.uvMatrix = new PIXI.TextureMatrix(texture); + } + texture.uvMatrix.update(); + var aTrans = this.aTrans; + aTrans.set(orig.width, 0, 0, orig.height, w1, h1); + if (this.proj._surface === null) { + aTrans.prepend(this.transform.worldTransform); + } + aTrans.invert(); + aTrans.prepend(texture.uvMatrix.mapCoord); + }; + Sprite2s.prototype.calculateTrimmedVertices = function () { + var wid = this.transform._worldID; + var tuid = this._texture._updateID; + if (!this.vertexTrimmedData) { + this.vertexTrimmedData = new Float32Array(8); + } + else if (this._transformTrimmedID === wid && this._textureTrimmedID === tuid) { + return; + } + this._transformTrimmedID = wid; + this._textureTrimmedID = tuid; + var texture = this._texture; + var vertexData = this.vertexTrimmedData; + var orig = texture.orig; + var anchor = this._anchor; + var w1 = -anchor._x * orig.width; + var w0 = w1 + orig.width; + var h1 = -anchor._y * orig.height; + var h0 = h1 + orig.height; + if (this.proj._surface) { + vertexData[0] = w1; + vertexData[1] = h1; + vertexData[2] = w0; + vertexData[3] = h1; + vertexData[4] = w0; + vertexData[5] = h0; + vertexData[6] = w1; + vertexData[7] = h0; + this.proj._surface.boundsQuad(vertexData, vertexData, this.transform.worldTransform); + } + else { + var wt = this.transform.worldTransform; + var a = wt.a; + var b = wt.b; + var c = wt.c; + var d = wt.d; + var tx = wt.tx; + var ty = wt.ty; + vertexData[0] = (a * w1) + (c * h1) + tx; + vertexData[1] = (d * h1) + (b * w1) + ty; + vertexData[2] = (a * w0) + (c * h1) + tx; + vertexData[3] = (d * h1) + (b * w0) + ty; + vertexData[4] = (a * w0) + (c * h0) + tx; + vertexData[5] = (d * h0) + (b * w0) + ty; + vertexData[6] = (a * w1) + (c * h0) + tx; + vertexData[7] = (d * h0) + (b * w1) + ty; + if (this.proj._activeProjection) { + this.proj._activeProjection.surface.boundsQuad(vertexData, vertexData, this.proj._activeProjection.legacy.worldTransform); + } + } + }; + Object.defineProperty(Sprite2s.prototype, "worldTransform", { + get: function () { + return this.proj; + }, + enumerable: false, + configurable: true + }); + return Sprite2s; + }(PIXI.Sprite)); + pixi_projection.Sprite2s = Sprite2s; +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + var Text2s = (function (_super) { + __extends(Text2s, _super); + function Text2s(text, style, canvas) { + var _this = _super.call(this, text, style, canvas) || this; + _this.aTrans = new PIXI.Matrix(); + _this.proj = new pixi_projection.ProjectionSurface(_this.transform); + _this.pluginName = 'batch_bilinear'; + return _this; + } + Object.defineProperty(Text2s.prototype, "worldTransform", { + get: function () { + return this.proj; + }, + enumerable: false, + configurable: true + }); + return Text2s; + }(PIXI.Text)); + pixi_projection.Text2s = Text2s; + Text2s.prototype.calculateVertices = pixi_projection.Sprite2s.prototype.calculateVertices; + Text2s.prototype.calculateTrimmedVertices = pixi_projection.Sprite2s.prototype.calculateTrimmedVertices; + Text2s.prototype._calculateBounds = pixi_projection.Sprite2s.prototype._calculateBounds; +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + PIXI.Sprite.prototype.convertTo2s = function () { + if (this.proj) + return; + this.pluginName = 'sprite_bilinear'; + this.aTrans = new PIXI.Matrix(); + this.calculateVertices = pixi_projection.Sprite2s.prototype.calculateVertices; + this.calculateTrimmedVertices = pixi_projection.Sprite2s.prototype.calculateTrimmedVertices; + this._calculateBounds = pixi_projection.Sprite2s.prototype._calculateBounds; + PIXI.Container.prototype.convertTo2s.call(this); + }; + PIXI.Container.prototype.convertTo2s = function () { + if (this.proj) + return; + this.proj = new pixi_projection.Projection2d(this.transform); + Object.defineProperty(this, "worldTransform", { + get: function () { + return this.proj; + }, + enumerable: true, + configurable: true + }); + }; + PIXI.Container.prototype.convertSubtreeTo2s = function () { + this.convertTo2s(); + for (var i = 0; i < this.children.length; i++) { + this.children[i].convertSubtreeTo2s(); + } + }; +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + function container2dWorldTransform() { + return this.proj.affine ? this.transform.worldTransform : this.proj.world; + } + pixi_projection.container2dWorldTransform = container2dWorldTransform; + var Container2d = (function (_super) { + __extends(Container2d, _super); + function Container2d() { + var _this = _super.call(this) || this; + _this.proj = new pixi_projection.Projection2d(_this.transform); + return _this; + } + Container2d.prototype.toLocal = function (position, from, point, skipUpdate, step) { + if (step === void 0) { step = pixi_projection.TRANSFORM_STEP.ALL; } + if (from) { + position = from.toGlobal(position, point, skipUpdate); + } + if (!skipUpdate) { + this._recursivePostUpdateTransform(); + } + if (step >= pixi_projection.TRANSFORM_STEP.PROJ) { + if (!skipUpdate) { + this.displayObjectUpdateTransform(); + } + if (this.proj.affine) { + return this.transform.worldTransform.applyInverse(position, point); + } + return this.proj.world.applyInverse(position, point); + } + if (this.parent) { + point = this.parent.worldTransform.applyInverse(position, point); + } + else { + point.copyFrom(position); + } + if (step === pixi_projection.TRANSFORM_STEP.NONE) { + return point; + } + return this.transform.localTransform.applyInverse(point, point); + }; + Object.defineProperty(Container2d.prototype, "worldTransform", { + get: function () { + return this.proj.affine ? this.transform.worldTransform : this.proj.world; + }, + enumerable: false, + configurable: true + }); + return Container2d; + }(PIXI.Container)); + pixi_projection.Container2d = Container2d; + pixi_projection.container2dToLocal = Container2d.prototype.toLocal; +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + var Point = PIXI.Point; + var mat3id = [1, 0, 0, 0, 1, 0, 0, 0, 1]; + var AFFINE; + (function (AFFINE) { + AFFINE[AFFINE["NONE"] = 0] = "NONE"; + AFFINE[AFFINE["FREE"] = 1] = "FREE"; + AFFINE[AFFINE["AXIS_X"] = 2] = "AXIS_X"; + AFFINE[AFFINE["AXIS_Y"] = 3] = "AXIS_Y"; + AFFINE[AFFINE["POINT"] = 4] = "POINT"; + AFFINE[AFFINE["AXIS_XR"] = 5] = "AXIS_XR"; + })(AFFINE = pixi_projection.AFFINE || (pixi_projection.AFFINE = {})); + var Matrix2d = (function () { + function Matrix2d(backingArray) { + this.floatArray = null; + this.mat3 = new Float64Array(backingArray || mat3id); + } + Object.defineProperty(Matrix2d.prototype, "a", { + get: function () { + return this.mat3[0] / this.mat3[8]; + }, + set: function (value) { + this.mat3[0] = value * this.mat3[8]; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Matrix2d.prototype, "b", { + get: function () { + return this.mat3[1] / this.mat3[8]; + }, + set: function (value) { + this.mat3[1] = value * this.mat3[8]; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Matrix2d.prototype, "c", { + get: function () { + return this.mat3[3] / this.mat3[8]; + }, + set: function (value) { + this.mat3[3] = value * this.mat3[8]; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Matrix2d.prototype, "d", { + get: function () { + return this.mat3[4] / this.mat3[8]; + }, + set: function (value) { + this.mat3[4] = value * this.mat3[8]; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Matrix2d.prototype, "tx", { + get: function () { + return this.mat3[6] / this.mat3[8]; + }, + set: function (value) { + this.mat3[6] = value * this.mat3[8]; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Matrix2d.prototype, "ty", { + get: function () { + return this.mat3[7] / this.mat3[8]; + }, + set: function (value) { + this.mat3[7] = value * this.mat3[8]; + }, + enumerable: false, + configurable: true + }); + Matrix2d.prototype.set = function (a, b, c, d, tx, ty) { + var mat3 = this.mat3; + mat3[0] = a; + mat3[1] = b; + mat3[2] = 0; + mat3[3] = c; + mat3[4] = d; + mat3[5] = 0; + mat3[6] = tx; + mat3[7] = ty; + mat3[8] = 1; + return this; + }; + Matrix2d.prototype.toArray = function (transpose, out) { + if (!this.floatArray) { + this.floatArray = new Float32Array(9); + } + var array = out || this.floatArray; + var mat3 = this.mat3; + if (transpose) { + array[0] = mat3[0]; + array[1] = mat3[1]; + array[2] = mat3[2]; + array[3] = mat3[3]; + array[4] = mat3[4]; + array[5] = mat3[5]; + array[6] = mat3[6]; + array[7] = mat3[7]; + array[8] = mat3[8]; + } + else { + array[0] = mat3[0]; + array[1] = mat3[3]; + array[2] = mat3[6]; + array[3] = mat3[1]; + array[4] = mat3[4]; + array[5] = mat3[7]; + array[6] = mat3[2]; + array[7] = mat3[5]; + array[8] = mat3[8]; + } + return array; + }; + Matrix2d.prototype.apply = function (pos, newPos) { + newPos = newPos || new PIXI.Point(); + var mat3 = this.mat3; + var x = pos.x; + var y = pos.y; + var z = 1.0 / (mat3[2] * x + mat3[5] * y + mat3[8]); + newPos.x = z * (mat3[0] * x + mat3[3] * y + mat3[6]); + newPos.y = z * (mat3[1] * x + mat3[4] * y + mat3[7]); + return newPos; + }; + Matrix2d.prototype.translate = function (tx, ty) { + var mat3 = this.mat3; + mat3[0] += tx * mat3[2]; + mat3[1] += ty * mat3[2]; + mat3[3] += tx * mat3[5]; + mat3[4] += ty * mat3[5]; + mat3[6] += tx * mat3[8]; + mat3[7] += ty * mat3[8]; + return this; + }; + Matrix2d.prototype.scale = function (x, y) { + var mat3 = this.mat3; + mat3[0] *= x; + mat3[1] *= y; + mat3[3] *= x; + mat3[4] *= y; + mat3[6] *= x; + mat3[7] *= y; + return this; + }; + Matrix2d.prototype.scaleAndTranslate = function (scaleX, scaleY, tx, ty) { + var mat3 = this.mat3; + mat3[0] = scaleX * mat3[0] + tx * mat3[2]; + mat3[1] = scaleY * mat3[1] + ty * mat3[2]; + mat3[3] = scaleX * mat3[3] + tx * mat3[5]; + mat3[4] = scaleY * mat3[4] + ty * mat3[5]; + mat3[6] = scaleX * mat3[6] + tx * mat3[8]; + mat3[7] = scaleY * mat3[7] + ty * mat3[8]; + }; + Matrix2d.prototype.applyInverse = function (pos, newPos) { + newPos = newPos || new Point(); + var a = this.mat3; + var x = pos.x; + var y = pos.y; + var a00 = a[0], a01 = a[3], a02 = a[6], a10 = a[1], a11 = a[4], a12 = a[7], a20 = a[2], a21 = a[5], a22 = a[8]; + var newX = (a22 * a11 - a12 * a21) * x + (-a22 * a01 + a02 * a21) * y + (a12 * a01 - a02 * a11); + var newY = (-a22 * a10 + a12 * a20) * x + (a22 * a00 - a02 * a20) * y + (-a12 * a00 + a02 * a10); + var newZ = (a21 * a10 - a11 * a20) * x + (-a21 * a00 + a01 * a20) * y + (a11 * a00 - a01 * a10); + newPos.x = newX / newZ; + newPos.y = newY / newZ; + return newPos; + }; + Matrix2d.prototype.invert = function () { + var a = this.mat3; + var a00 = a[0], a01 = a[1], a02 = a[2], a10 = a[3], a11 = a[4], a12 = a[5], a20 = a[6], a21 = a[7], a22 = a[8], b01 = a22 * a11 - a12 * a21, b11 = -a22 * a10 + a12 * a20, b21 = a21 * a10 - a11 * a20; + var det = a00 * b01 + a01 * b11 + a02 * b21; + if (!det) { + return this; + } + det = 1.0 / det; + a[0] = b01 * det; + a[1] = (-a22 * a01 + a02 * a21) * det; + a[2] = (a12 * a01 - a02 * a11) * det; + a[3] = b11 * det; + a[4] = (a22 * a00 - a02 * a20) * det; + a[5] = (-a12 * a00 + a02 * a10) * det; + a[6] = b21 * det; + a[7] = (-a21 * a00 + a01 * a20) * det; + a[8] = (a11 * a00 - a01 * a10) * det; + return this; + }; + Matrix2d.prototype.identity = function () { + var mat3 = this.mat3; + mat3[0] = 1; + mat3[1] = 0; + mat3[2] = 0; + mat3[3] = 0; + mat3[4] = 1; + mat3[5] = 0; + mat3[6] = 0; + mat3[7] = 0; + mat3[8] = 1; + return this; + }; + Matrix2d.prototype.clone = function () { + return new Matrix2d(this.mat3); + }; + Matrix2d.prototype.copyTo2dOr3d = function (matrix) { + var mat3 = this.mat3; + var ar2 = matrix.mat3; + ar2[0] = mat3[0]; + ar2[1] = mat3[1]; + ar2[2] = mat3[2]; + ar2[3] = mat3[3]; + ar2[4] = mat3[4]; + ar2[5] = mat3[5]; + ar2[6] = mat3[6]; + ar2[7] = mat3[7]; + ar2[8] = mat3[8]; + return matrix; + }; + Matrix2d.prototype.copyTo = function (matrix, affine, preserveOrientation) { + var mat3 = this.mat3; + var d = 1.0 / mat3[8]; + var tx = mat3[6] * d, ty = mat3[7] * d; + matrix.a = (mat3[0] - mat3[2] * tx) * d; + matrix.b = (mat3[1] - mat3[2] * ty) * d; + matrix.c = (mat3[3] - mat3[5] * tx) * d; + matrix.d = (mat3[4] - mat3[5] * ty) * d; + matrix.tx = tx; + matrix.ty = ty; + if (affine >= 2) { + var D = matrix.a * matrix.d - matrix.b * matrix.c; + if (!preserveOrientation) { + D = Math.abs(D); + } + if (affine === AFFINE.POINT) { + if (D > 0) { + D = 1; + } + else + D = -1; + matrix.a = D; + matrix.b = 0; + matrix.c = 0; + matrix.d = D; + } + else if (affine === AFFINE.AXIS_X) { + D /= Math.sqrt(matrix.b * matrix.b + matrix.d * matrix.d); + matrix.c = 0; + matrix.d = D; + } + else if (affine === AFFINE.AXIS_Y) { + D /= Math.sqrt(matrix.a * matrix.a + matrix.c * matrix.c); + matrix.a = D; + matrix.c = 0; + } + else if (affine === AFFINE.AXIS_XR) { + matrix.a = matrix.d * D; + matrix.c = -matrix.b * D; + } + } + return matrix; + }; + Matrix2d.prototype.copyFrom = function (matrix) { + var mat3 = this.mat3; + mat3[0] = matrix.a; + mat3[1] = matrix.b; + mat3[2] = 0; + mat3[3] = matrix.c; + mat3[4] = matrix.d; + mat3[5] = 0; + mat3[6] = matrix.tx; + mat3[7] = matrix.ty; + mat3[8] = 1.0; + return this; + }; + Matrix2d.prototype.setToMultLegacy = function (pt, lt) { + var out = this.mat3; + var b = lt.mat3; + var a00 = pt.a, a01 = pt.b, a10 = pt.c, a11 = pt.d, a20 = pt.tx, a21 = pt.ty, b00 = b[0], b01 = b[1], b02 = b[2], b10 = b[3], b11 = b[4], b12 = b[5], b20 = b[6], b21 = b[7], b22 = b[8]; + out[0] = b00 * a00 + b01 * a10 + b02 * a20; + out[1] = b00 * a01 + b01 * a11 + b02 * a21; + out[2] = b02; + out[3] = b10 * a00 + b11 * a10 + b12 * a20; + out[4] = b10 * a01 + b11 * a11 + b12 * a21; + out[5] = b12; + out[6] = b20 * a00 + b21 * a10 + b22 * a20; + out[7] = b20 * a01 + b21 * a11 + b22 * a21; + out[8] = b22; + return this; + }; + Matrix2d.prototype.setToMultLegacy2 = function (pt, lt) { + var out = this.mat3; + var a = pt.mat3; + var a00 = a[0], a01 = a[1], a02 = a[2], a10 = a[3], a11 = a[4], a12 = a[5], a20 = a[6], a21 = a[7], a22 = a[8], b00 = lt.a, b01 = lt.b, b10 = lt.c, b11 = lt.d, b20 = lt.tx, b21 = lt.ty; + out[0] = b00 * a00 + b01 * a10; + out[1] = b00 * a01 + b01 * a11; + out[2] = b00 * a02 + b01 * a12; + out[3] = b10 * a00 + b11 * a10; + out[4] = b10 * a01 + b11 * a11; + out[5] = b10 * a02 + b11 * a12; + out[6] = b20 * a00 + b21 * a10 + a20; + out[7] = b20 * a01 + b21 * a11 + a21; + out[8] = b20 * a02 + b21 * a12 + a22; + return this; + }; + Matrix2d.prototype.setToMult = function (pt, lt) { + var out = this.mat3; + var a = pt.mat3, b = lt.mat3; + var a00 = a[0], a01 = a[1], a02 = a[2], a10 = a[3], a11 = a[4], a12 = a[5], a20 = a[6], a21 = a[7], a22 = a[8], b00 = b[0], b01 = b[1], b02 = b[2], b10 = b[3], b11 = b[4], b12 = b[5], b20 = b[6], b21 = b[7], b22 = b[8]; + out[0] = b00 * a00 + b01 * a10 + b02 * a20; + out[1] = b00 * a01 + b01 * a11 + b02 * a21; + out[2] = b00 * a02 + b01 * a12 + b02 * a22; + out[3] = b10 * a00 + b11 * a10 + b12 * a20; + out[4] = b10 * a01 + b11 * a11 + b12 * a21; + out[5] = b10 * a02 + b11 * a12 + b12 * a22; + out[6] = b20 * a00 + b21 * a10 + b22 * a20; + out[7] = b20 * a01 + b21 * a11 + b22 * a21; + out[8] = b20 * a02 + b21 * a12 + b22 * a22; + return this; + }; + Matrix2d.prototype.prepend = function (lt) { + if (lt.mat3) { + return this.setToMult(lt, this); + } + else { + return this.setToMultLegacy(lt, this); + } + }; + Matrix2d.IDENTITY = new Matrix2d(); + Matrix2d.TEMP_MATRIX = new Matrix2d(); + return Matrix2d; + }()); + pixi_projection.Matrix2d = Matrix2d; +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + var t0 = new PIXI.Point(); + var tt = [new PIXI.Point(), new PIXI.Point(), new PIXI.Point(), new PIXI.Point()]; + var tempRect = new PIXI.Rectangle(); + var tempMat = new pixi_projection.Matrix2d(); + var Projection2d = (function (_super) { + __extends(Projection2d, _super); + function Projection2d(legacy, enable) { + var _this = _super.call(this, legacy, enable) || this; + _this.matrix = new pixi_projection.Matrix2d(); + _this.pivot = new PIXI.ObservablePoint(_this.onChange, _this, 0, 0); + _this.reverseLocalOrder = false; + _this.local = new pixi_projection.Matrix2d(); + _this.world = new pixi_projection.Matrix2d(); + return _this; + } + Projection2d.prototype.onChange = function () { + var pivot = this.pivot; + var mat3 = this.matrix.mat3; + mat3[6] = -(pivot._x * mat3[0] + pivot._y * mat3[3]); + mat3[7] = -(pivot._x * mat3[1] + pivot._y * mat3[4]); + this._projID++; + }; + Projection2d.prototype.setAxisX = function (p, factor) { + if (factor === void 0) { factor = 1; } + var x = p.x, y = p.y; + var d = Math.sqrt(x * x + y * y); + var mat3 = this.matrix.mat3; + mat3[0] = x / d; + mat3[1] = y / d; + mat3[2] = factor / d; + this.onChange(); + }; + Projection2d.prototype.setAxisY = function (p, factor) { + if (factor === void 0) { factor = 1; } + var x = p.x, y = p.y; + var d = Math.sqrt(x * x + y * y); + var mat3 = this.matrix.mat3; + mat3[3] = x / d; + mat3[4] = y / d; + mat3[5] = factor / d; + this.onChange(); + }; + Projection2d.prototype.mapSprite = function (sprite, quad) { + var tex = sprite.texture; + tempRect.x = -sprite.anchor.x * tex.orig.width; + tempRect.y = -sprite.anchor.y * tex.orig.height; + tempRect.width = tex.orig.width; + tempRect.height = tex.orig.height; + return this.mapQuad(tempRect, quad); + }; + Projection2d.prototype.mapQuad = function (rect, p) { + tt[0].set(rect.x, rect.y); + tt[1].set(rect.x + rect.width, rect.y); + tt[2].set(rect.x + rect.width, rect.y + rect.height); + tt[3].set(rect.x, rect.y + rect.height); + var k1 = 1, k2 = 2, k3 = 3; + var f = pixi_projection.utils.getIntersectionFactor(p[0], p[2], p[1], p[3], t0); + if (f !== 0) { + k1 = 1; + k2 = 3; + k3 = 2; + } + else { + return; + } + var d0 = Math.sqrt((p[0].x - t0.x) * (p[0].x - t0.x) + (p[0].y - t0.y) * (p[0].y - t0.y)); + var d1 = Math.sqrt((p[k1].x - t0.x) * (p[k1].x - t0.x) + (p[k1].y - t0.y) * (p[k1].y - t0.y)); + var d2 = Math.sqrt((p[k2].x - t0.x) * (p[k2].x - t0.x) + (p[k2].y - t0.y) * (p[k2].y - t0.y)); + var d3 = Math.sqrt((p[k3].x - t0.x) * (p[k3].x - t0.x) + (p[k3].y - t0.y) * (p[k3].y - t0.y)); + var q0 = (d0 + d3) / d3; + var q1 = (d1 + d2) / d2; + var q2 = (d1 + d2) / d1; + var mat3 = this.matrix.mat3; + mat3[0] = tt[0].x * q0; + mat3[1] = tt[0].y * q0; + mat3[2] = q0; + mat3[3] = tt[k1].x * q1; + mat3[4] = tt[k1].y * q1; + mat3[5] = q1; + mat3[6] = tt[k2].x * q2; + mat3[7] = tt[k2].y * q2; + mat3[8] = q2; + this.matrix.invert(); + mat3 = tempMat.mat3; + mat3[0] = p[0].x; + mat3[1] = p[0].y; + mat3[2] = 1; + mat3[3] = p[k1].x; + mat3[4] = p[k1].y; + mat3[5] = 1; + mat3[6] = p[k2].x; + mat3[7] = p[k2].y; + mat3[8] = 1; + this.matrix.setToMult(tempMat, this.matrix); + this._projID++; + }; + Projection2d.prototype.updateLocalTransform = function (lt) { + if (this._projID !== 0) { + if (this.reverseLocalOrder) { + this.local.setToMultLegacy2(this.matrix, lt); + } + else { + this.local.setToMultLegacy(lt, this.matrix); + } + } + else { + this.local.copyFrom(lt); + } + }; + Projection2d.prototype.clear = function () { + _super.prototype.clear.call(this); + this.matrix.identity(); + this.pivot.set(0, 0); + }; + return Projection2d; + }(pixi_projection.LinearProjection)); + pixi_projection.Projection2d = Projection2d; +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + var Mesh2d = (function (_super) { + __extends(Mesh2d, _super); + function Mesh2d(geometry, shader, state, drawMode) { + var _this = _super.call(this, geometry, shader, state, drawMode) || this; + _this.vertexData2d = null; + _this.proj = new pixi_projection.Projection2d(_this.transform); + return _this; + } + Mesh2d.prototype.calculateVertices = function () { + if (this.proj._affine) { + this.vertexData2d = null; + _super.prototype.calculateVertices.call(this); + return; + } + var geometry = this.geometry; + var vertices = geometry.buffers[0].data; + var thisAny = this; + if (geometry.vertexDirtyId === thisAny.vertexDirty && thisAny._transformID === thisAny.transform._worldID) { + return; + } + thisAny._transformID = thisAny.transform._worldID; + if (thisAny.vertexData.length !== vertices.length) { + thisAny.vertexData = new Float32Array(vertices.length); + } + if (!this.vertexData2d || this.vertexData2d.length !== vertices.length * 3 / 2) { + this.vertexData2d = new Float32Array(vertices.length * 3); + } + var wt = this.proj.world.mat3; + var vertexData2d = this.vertexData2d; + var vertexData = thisAny.vertexData; + for (var i = 0; i < vertexData.length / 2; i++) { + var x = vertices[(i * 2)]; + var y = vertices[(i * 2) + 1]; + var xx = (wt[0] * x) + (wt[3] * y) + wt[6]; + var yy = (wt[1] * x) + (wt[4] * y) + wt[7]; + var ww = (wt[2] * x) + (wt[5] * y) + wt[8]; + vertexData2d[i * 3] = xx; + vertexData2d[i * 3 + 1] = yy; + vertexData2d[i * 3 + 2] = ww; + vertexData[(i * 2)] = xx / ww; + vertexData[(i * 2) + 1] = yy / ww; + } + thisAny.vertexDirty = geometry.vertexDirtyId; + }; + Mesh2d.prototype._renderDefault = function (renderer) { + var shader = this.shader; + shader.alpha = this.worldAlpha; + if (shader.update) { + shader.update(); + } + renderer.batch.flush(); + if (shader.program.uniformData.translationMatrix) { + shader.uniforms.translationMatrix = this.worldTransform.toArray(true); + } + renderer.shader.bind(shader, false); + renderer.state.set(this.state); + renderer.geometry.bind(this.geometry, shader); + renderer.geometry.draw(this.drawMode, this.size, this.start, this.geometry.instanceCount); + }; + Mesh2d.prototype.toLocal = function (position, from, point, skipUpdate, step) { + if (step === void 0) { step = pixi_projection.TRANSFORM_STEP.ALL; } + return pixi_projection.container2dToLocal.call(this, position, from, point, skipUpdate, step); + }; + Object.defineProperty(Mesh2d.prototype, "worldTransform", { + get: function () { + return this.proj.affine ? this.transform.worldTransform : this.proj.world; + }, + enumerable: false, + configurable: true + }); + Mesh2d.defaultVertexShader = "precision highp float;\nattribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\nuniform mat3 translationMatrix;\nuniform mat3 uTextureMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n\tgl_Position.xyw = projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0);\n\tgl_Position.z = 0.0;\n\n\tvTextureCoord = (uTextureMatrix * vec3(aTextureCoord, 1.0)).xy;\n}\n"; + Mesh2d.defaultFragmentShader = "\nvarying vec2 vTextureCoord;\nuniform vec4 uColor;\n\nuniform sampler2D uSampler;\n\nvoid main(void)\n{\n\tgl_FragColor = texture2D(uSampler, vTextureCoord) * uColor;\n}"; + return Mesh2d; + }(PIXI.Mesh)); + pixi_projection.Mesh2d = Mesh2d; + var SimpleMesh2d = (function (_super) { + __extends(SimpleMesh2d, _super); + function SimpleMesh2d(texture, vertices, uvs, indices, drawMode) { + var _this = _super.call(this, new PIXI.MeshGeometry(vertices, uvs, indices), new PIXI.MeshMaterial(texture, { + program: PIXI.Program.from(Mesh2d.defaultVertexShader, Mesh2d.defaultFragmentShader), + pluginName: 'batch2d' + }), null, drawMode) || this; + _this.autoUpdate = true; + _this.geometry.getBuffer('aVertexPosition').static = false; + return _this; + } + Object.defineProperty(SimpleMesh2d.prototype, "vertices", { + get: function () { + return this.geometry.getBuffer('aVertexPosition').data; + }, + set: function (value) { + this.geometry.getBuffer('aVertexPosition').data = value; + }, + enumerable: false, + configurable: true + }); + SimpleMesh2d.prototype._render = function (renderer) { + if (this.autoUpdate) { + this.geometry.getBuffer('aVertexPosition').update(); + } + _super.prototype._render.call(this, renderer); + }; + return SimpleMesh2d; + }(Mesh2d)); + pixi_projection.SimpleMesh2d = SimpleMesh2d; +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + var Sprite2d = (function (_super) { + __extends(Sprite2d, _super); + function Sprite2d(texture) { + var _this = _super.call(this, texture) || this; + _this.vertexData2d = null; + _this.proj = new pixi_projection.Projection2d(_this.transform); + _this.pluginName = 'batch2d'; + return _this; + } + Sprite2d.prototype._calculateBounds = function () { + this.calculateTrimmedVertices(); + this._bounds.addQuad(this.vertexTrimmedData); + }; + Sprite2d.prototype.calculateVertices = function () { + var texture = this._texture; + if (this.proj._affine) { + this.vertexData2d = null; + _super.prototype.calculateVertices.call(this); + return; + } + if (!this.vertexData2d) { + this.vertexData2d = new Float32Array(12); + } + var wid = this.transform._worldID; + var tuid = texture._updateID; + if (this._transformID === wid && this._textureID === tuid) { + return; + } + if (this._textureID !== tuid) { + this.uvs = texture._uvs.uvsFloat32; + } + this._transformID = wid; + this._textureID = tuid; + var wt = this.proj.world.mat3; + var vertexData2d = this.vertexData2d; + var vertexData = this.vertexData; + var trim = texture.trim; + var orig = texture.orig; + var anchor = this._anchor; + var w0 = 0; + var w1 = 0; + var h0 = 0; + var h1 = 0; + if (trim) { + w1 = trim.x - (anchor._x * orig.width); + w0 = w1 + trim.width; + h1 = trim.y - (anchor._y * orig.height); + h0 = h1 + trim.height; + } + else { + w1 = -anchor._x * orig.width; + w0 = w1 + orig.width; + h1 = -anchor._y * orig.height; + h0 = h1 + orig.height; + } + vertexData2d[0] = (wt[0] * w1) + (wt[3] * h1) + wt[6]; + vertexData2d[1] = (wt[1] * w1) + (wt[4] * h1) + wt[7]; + vertexData2d[2] = (wt[2] * w1) + (wt[5] * h1) + wt[8]; + vertexData2d[3] = (wt[0] * w0) + (wt[3] * h1) + wt[6]; + vertexData2d[4] = (wt[1] * w0) + (wt[4] * h1) + wt[7]; + vertexData2d[5] = (wt[2] * w0) + (wt[5] * h1) + wt[8]; + vertexData2d[6] = (wt[0] * w0) + (wt[3] * h0) + wt[6]; + vertexData2d[7] = (wt[1] * w0) + (wt[4] * h0) + wt[7]; + vertexData2d[8] = (wt[2] * w0) + (wt[5] * h0) + wt[8]; + vertexData2d[9] = (wt[0] * w1) + (wt[3] * h0) + wt[6]; + vertexData2d[10] = (wt[1] * w1) + (wt[4] * h0) + wt[7]; + vertexData2d[11] = (wt[2] * w1) + (wt[5] * h0) + wt[8]; + vertexData[0] = vertexData2d[0] / vertexData2d[2]; + vertexData[1] = vertexData2d[1] / vertexData2d[2]; + vertexData[2] = vertexData2d[3] / vertexData2d[5]; + vertexData[3] = vertexData2d[4] / vertexData2d[5]; + vertexData[4] = vertexData2d[6] / vertexData2d[8]; + vertexData[5] = vertexData2d[7] / vertexData2d[8]; + vertexData[6] = vertexData2d[9] / vertexData2d[11]; + vertexData[7] = vertexData2d[10] / vertexData2d[11]; + }; + Sprite2d.prototype.calculateTrimmedVertices = function () { + if (this.proj._affine) { + _super.prototype.calculateTrimmedVertices.call(this); + return; + } + var wid = this.transform._worldID; + var tuid = this._texture._updateID; + if (!this.vertexTrimmedData) { + this.vertexTrimmedData = new Float32Array(8); + } + else if (this._transformTrimmedID === wid && this._textureTrimmedID === tuid) { + return; + } + this._transformTrimmedID = wid; + this._textureTrimmedID = tuid; + var texture = this._texture; + var vertexData = this.vertexTrimmedData; + var orig = texture.orig; + var anchor = this._anchor; + var wt = this.proj.world.mat3; + var w1 = -anchor._x * orig.width; + var w0 = w1 + orig.width; + var h1 = -anchor._y * orig.height; + var h0 = h1 + orig.height; + var z = 1.0 / (wt[2] * w1 + wt[5] * h1 + wt[8]); + vertexData[0] = z * ((wt[0] * w1) + (wt[3] * h1) + wt[6]); + vertexData[1] = z * ((wt[1] * w1) + (wt[4] * h1) + wt[7]); + z = 1.0 / (wt[2] * w0 + wt[5] * h1 + wt[8]); + vertexData[2] = z * ((wt[0] * w0) + (wt[3] * h1) + wt[6]); + vertexData[3] = z * ((wt[1] * w0) + (wt[4] * h1) + wt[7]); + z = 1.0 / (wt[2] * w0 + wt[5] * h0 + wt[8]); + vertexData[4] = z * ((wt[0] * w0) + (wt[3] * h0) + wt[6]); + vertexData[5] = z * ((wt[1] * w0) + (wt[4] * h0) + wt[7]); + z = 1.0 / (wt[2] * w1 + wt[5] * h0 + wt[8]); + vertexData[6] = z * ((wt[0] * w1) + (wt[3] * h0) + wt[6]); + vertexData[7] = z * ((wt[1] * w1) + (wt[4] * h0) + wt[7]); + }; + Sprite2d.prototype.toLocal = function (position, from, point, skipUpdate, step) { + if (step === void 0) { step = pixi_projection.TRANSFORM_STEP.ALL; } + return pixi_projection.container2dToLocal.call(this, position, from, point, skipUpdate, step); + }; + Object.defineProperty(Sprite2d.prototype, "worldTransform", { + get: function () { + return this.proj.affine ? this.transform.worldTransform : this.proj.world; + }, + enumerable: false, + configurable: true + }); + return Sprite2d; + }(PIXI.Sprite)); + pixi_projection.Sprite2d = Sprite2d; +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + var Text2d = (function (_super) { + __extends(Text2d, _super); + function Text2d(text, style, canvas) { + var _this = _super.call(this, text, style, canvas) || this; + _this.vertexData2d = null; + _this.proj = new pixi_projection.Projection2d(_this.transform); + _this.pluginName = 'batch2d'; + return _this; + } + Object.defineProperty(Text2d.prototype, "worldTransform", { + get: function () { + return this.proj.affine ? this.transform.worldTransform : this.proj.world; + }, + enumerable: false, + configurable: true + }); + return Text2d; + }(PIXI.Text)); + pixi_projection.Text2d = Text2d; + Text2d.prototype.calculateVertices = pixi_projection.Sprite2d.prototype.calculateVertices; + Text2d.prototype.calculateTrimmedVertices = pixi_projection.Sprite2d.prototype.calculateTrimmedVertices; + Text2d.prototype._calculateBounds = pixi_projection.Sprite2d.prototype._calculateBounds; +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + function convertTo2d() { + if (this.proj) + return; + this.proj = new pixi_projection.Projection2d(this.transform); + this.toLocal = pixi_projection.Container2d.prototype.toLocal; + Object.defineProperty(this, "worldTransform", { + get: pixi_projection.container2dWorldTransform, + enumerable: true, + configurable: true + }); + } + PIXI.Container.prototype.convertTo2d = convertTo2d; + PIXI.Sprite.prototype.convertTo2d = function () { + if (this.proj) + return; + this.calculateVertices = pixi_projection.Sprite2d.prototype.calculateVertices; + this.calculateTrimmedVertices = pixi_projection.Sprite2d.prototype.calculateTrimmedVertices; + this._calculateBounds = pixi_projection.Sprite2d.prototype._calculateBounds; + this.pluginName = 'batch2d'; + convertTo2d.call(this); + }; + PIXI.Container.prototype.convertSubtreeTo2d = function () { + this.convertTo2d(); + for (var i = 0; i < this.children.length; i++) { + this.children[i].convertSubtreeTo2d(); + } + }; + if (PIXI.SimpleMesh) { + PIXI.SimpleMesh.prototype.convertTo2d = + PIXI.SimpleRope.prototype.convertTo2d = + function () { + if (this.proj) + return; + this.calculateVertices = pixi_projection.Mesh2d.prototype.calculateVertices; + this._renderDefault = pixi_projection.Mesh2d.prototype._renderDefault; + if (this.material.pluginName !== 'batch2d') { + this.material = new PIXI.MeshMaterial(this.material.texture, { + program: PIXI.Program.from(pixi_projection.Mesh2d.defaultVertexShader, pixi_projection.Mesh2d.defaultFragmentShader), + pluginName: 'batch2d' + }); + } + convertTo2d.call(this); + }; + } +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + var tempTransform = new PIXI.Transform(); + var TilingSprite2d = (function (_super) { + __extends(TilingSprite2d, _super); + function TilingSprite2d(texture, width, height) { + var _this = _super.call(this, texture, width, height) || this; + _this.tileProj = new pixi_projection.Projection2d(_this.tileTransform); + _this.tileProj.reverseLocalOrder = true; + _this.proj = new pixi_projection.Projection2d(_this.transform); + _this.pluginName = 'tilingSprite2d'; + _this.uvRespectAnchor = true; + return _this; + } + Object.defineProperty(TilingSprite2d.prototype, "worldTransform", { + get: function () { + return this.proj.affine ? this.transform.worldTransform : this.proj.world; + }, + enumerable: false, + configurable: true + }); + TilingSprite2d.prototype.toLocal = function (position, from, point, skipUpdate, step) { + if (step === void 0) { step = pixi_projection.TRANSFORM_STEP.ALL; } + return pixi_projection.container2dToLocal.call(this, position, from, point, skipUpdate, step); + }; + TilingSprite2d.prototype._render = function (renderer) { + var texture = this._texture; + if (!texture || !texture.valid) { + return; + } + this.tileTransform.updateTransform(tempTransform); + this.uvMatrix.update(); + renderer.batch.setObjectRenderer(renderer.plugins[this.pluginName]); + renderer.plugins[this.pluginName].render(this); + }; + return TilingSprite2d; + }(PIXI.TilingSprite)); + pixi_projection.TilingSprite2d = TilingSprite2d; +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + var shaderVert = "attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\nuniform mat3 translationMatrix;\nuniform mat3 uTransform;\n\nvarying vec3 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position.xyw = projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0);\n\n vTextureCoord = uTransform * vec3(aTextureCoord, 1.0);\n}\n"; + var shaderFrag = "\nvarying vec3 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform vec4 uColor;\nuniform mat3 uMapCoord;\nuniform vec4 uClampFrame;\nuniform vec2 uClampOffset;\n\nvoid main(void)\n{\n vec2 coord = mod(vTextureCoord.xy / vTextureCoord.z - uClampOffset, vec2(1.0, 1.0)) + uClampOffset;\n coord = (uMapCoord * vec3(coord, 1.0)).xy;\n coord = clamp(coord, uClampFrame.xy, uClampFrame.zw);\n\n vec4 sample = texture2D(uSampler, coord);\n gl_FragColor = sample * uColor;\n}\n"; + var shaderSimpleFrag = "\n\tvarying vec3 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform vec4 uColor;\n\nvoid main(void)\n{\n vec4 sample = texture2D(uSampler, vTextureCoord.xy / vTextureCoord.z);\n gl_FragColor = sample * uColor;\n}\n"; + var tempMat = new pixi_projection.Matrix2d(); + var WRAP_MODES = PIXI.WRAP_MODES; + var utils = PIXI.utils; + var TilingSprite2dRenderer = (function (_super) { + __extends(TilingSprite2dRenderer, _super); + function TilingSprite2dRenderer(renderer) { + var _this = _super.call(this, renderer) || this; + _this.quad = new PIXI.QuadUv(); + var uniforms = { globals: _this.renderer.globalUniforms }; + _this.shader = PIXI.Shader.from(shaderVert, shaderFrag, uniforms); + _this.simpleShader = PIXI.Shader.from(shaderVert, shaderSimpleFrag, uniforms); + return _this; + } + TilingSprite2dRenderer.prototype.render = function (ts) { + var renderer = this.renderer; + var quad = this.quad; + var vertices = quad.vertices; + vertices[0] = vertices[6] = (ts._width) * -ts.anchor.x; + vertices[1] = vertices[3] = ts._height * -ts.anchor.y; + vertices[2] = vertices[4] = (ts._width) * (1.0 - ts.anchor.x); + vertices[5] = vertices[7] = ts._height * (1.0 - ts.anchor.y); + if (ts.uvRespectAnchor) { + vertices = quad.uvs; + vertices[0] = vertices[6] = -ts.anchor.x; + vertices[1] = vertices[3] = -ts.anchor.y; + vertices[2] = vertices[4] = 1.0 - ts.anchor.x; + vertices[5] = vertices[7] = 1.0 - ts.anchor.y; + } + quad.invalidate(); + var tex = ts._texture; + var baseTex = tex.baseTexture; + var lt = ts.tileProj.world; + var uv = ts.uvMatrix; + var isSimple = baseTex.isPowerOfTwo + && tex.frame.width === baseTex.width && tex.frame.height === baseTex.height; + if (isSimple) { + if (!baseTex._glTextures[renderer.CONTEXT_UID]) { + if (baseTex.wrapMode === WRAP_MODES.CLAMP) { + baseTex.wrapMode = WRAP_MODES.REPEAT; + } + } + else { + isSimple = baseTex.wrapMode !== WRAP_MODES.CLAMP; + } + } + var shader = isSimple ? this.simpleShader : this.shader; + tempMat.identity(); + tempMat.scale(tex.width, tex.height); + tempMat.prepend(lt); + tempMat.scale(1.0 / ts._width, 1.0 / ts._height); + tempMat.invert(); + if (isSimple) { + tempMat.prepend(uv.mapCoord); + } + else { + shader.uniforms.uMapCoord = uv.mapCoord.toArray(true); + shader.uniforms.uClampFrame = uv.uClampFrame; + shader.uniforms.uClampOffset = uv.uClampOffset; + } + shader.uniforms.uTransform = tempMat.toArray(true); + shader.uniforms.uColor = utils.premultiplyTintToRgba(ts.tint, ts.worldAlpha, shader.uniforms.uColor, baseTex.premultiplyAlpha); + shader.uniforms.translationMatrix = ts.transform.worldTransform.toArray(true); + shader.uniforms.uSampler = tex; + renderer.shader.bind(shader, false); + renderer.geometry.bind(quad, undefined); + renderer.state.setBlendMode(utils.correctBlendMode(ts.blendMode, baseTex.premultiplyAlpha)); + renderer.geometry.draw(PIXI.DRAW_MODES.TRIANGLES, 6, 0); + }; + return TilingSprite2dRenderer; + }(PIXI.ObjectRenderer)); + pixi_projection.TilingSprite2dRenderer = TilingSprite2dRenderer; + PIXI.Renderer.registerPlugin('tilingSprite2d', TilingSprite2dRenderer); +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + PIXI.systems.MaskSystem.prototype.pushSpriteMask = function (maskData) { + var maskObject = maskData.maskObject; + var target = maskData._target; + var alphaMaskFilter = this.alphaMaskPool[this.alphaMaskIndex]; + if (!alphaMaskFilter) { + alphaMaskFilter = this.alphaMaskPool[this.alphaMaskIndex] = [new pixi_projection.SpriteMaskFilter2d(maskObject)]; + } + alphaMaskFilter[0].resolution = this.renderer.resolution; + alphaMaskFilter[0].maskSprite = maskObject; + var stashFilterArea = target.filterArea; + target.filterArea = maskObject.getBounds(true); + this.renderer.filter.push(target, alphaMaskFilter); + target.filterArea = stashFilterArea; + this.alphaMaskIndex++; + }; +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + var spriteMaskVert = "\nattribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\nuniform mat3 otherMatrix;\n\nvarying vec3 vMaskCoord;\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n\tgl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n\n\tvTextureCoord = aTextureCoord;\n\tvMaskCoord = otherMatrix * vec3( aTextureCoord, 1.0);\n}\n"; + var spriteMaskFrag = "\nvarying vec3 vMaskCoord;\nvarying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform sampler2D mask;\nuniform float alpha;\nuniform vec4 maskClamp;\n\nvoid main(void)\n{\n vec2 uv = vMaskCoord.xy / vMaskCoord.z;\n\n float clip = step(3.5,\n step(maskClamp.x, uv.x) +\n step(maskClamp.y, uv.y) +\n step(uv.x, maskClamp.z) +\n step(uv.y, maskClamp.w));\n\n vec4 original = texture2D(uSampler, vTextureCoord);\n vec4 masky = texture2D(mask, uv);\n\n original *= (masky.r * masky.a * alpha * clip);\n\n gl_FragColor = original;\n}\n"; + var tempMat = new pixi_projection.Matrix2d(); + var SpriteMaskFilter2d = (function (_super) { + __extends(SpriteMaskFilter2d, _super); + function SpriteMaskFilter2d(sprite) { + var _this = _super.call(this, spriteMaskVert, spriteMaskFrag) || this; + _this.maskMatrix = new pixi_projection.Matrix2d(); + sprite.renderable = false; + _this.maskSprite = sprite; + return _this; + } + SpriteMaskFilter2d.prototype.apply = function (filterManager, input, output, clearMode) { + var maskSprite = this.maskSprite; + var tex = this.maskSprite.texture; + if (!tex.valid) { + return; + } + if (!tex.uvMatrix) { + tex.uvMatrix = new PIXI.TextureMatrix(tex, 0.0); + } + tex.uvMatrix.update(); + this.uniforms.npmAlpha = tex.baseTexture.alphaMode ? 0.0 : 1.0; + this.uniforms.mask = maskSprite.texture; + this.uniforms.otherMatrix = SpriteMaskFilter2d.calculateSpriteMatrix(input, this.maskMatrix, maskSprite) + .prepend(tex.uvMatrix.mapCoord); + this.uniforms.alpha = maskSprite.worldAlpha; + this.uniforms.maskClamp = tex.uvMatrix.uClampFrame; + filterManager.applyFilter(this, input, output, clearMode); + }; + SpriteMaskFilter2d.calculateSpriteMatrix = function (input, mappedMatrix, sprite) { + var proj = sprite.proj; + var filterArea = input.filterFrame; + var worldTransform = proj && !proj._affine ? proj.world.copyTo2dOr3d(tempMat) : tempMat.copyFrom(sprite.transform.worldTransform); + var texture = sprite.texture.orig; + mappedMatrix.set(input.width, 0, 0, input.height, filterArea.x, filterArea.y); + worldTransform.invert(); + mappedMatrix.setToMult(worldTransform, mappedMatrix); + mappedMatrix.scaleAndTranslate(1.0 / texture.width, 1.0 / texture.height, sprite.anchor.x, sprite.anchor.y); + return mappedMatrix; + }; + return SpriteMaskFilter2d; + }(PIXI.Filter)); + pixi_projection.SpriteMaskFilter2d = SpriteMaskFilter2d; +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + function container3dWorldTransform() { + return this.proj.affine ? this.transform.worldTransform : this.proj.world; + } + pixi_projection.container3dWorldTransform = container3dWorldTransform; + var Container3d = (function (_super) { + __extends(Container3d, _super); + function Container3d() { + var _this = _super.call(this) || this; + _this.proj = new pixi_projection.Projection3d(_this.transform); + return _this; + } + Container3d.prototype.isFrontFace = function (forceUpdate) { + if (forceUpdate === void 0) { forceUpdate = false; } + if (forceUpdate) { + this._recursivePostUpdateTransform(); + this.displayObjectUpdateTransform(); + } + var mat = this.proj.world.mat4; + var dx1 = mat[0] * mat[15] - mat[3] * mat[12]; + var dy1 = mat[1] * mat[15] - mat[3] * mat[13]; + var dx2 = mat[4] * mat[15] - mat[7] * mat[12]; + var dy2 = mat[5] * mat[15] - mat[7] * mat[13]; + return dx1 * dy2 - dx2 * dy1 > 0; + }; + Container3d.prototype.getDepth = function (forceUpdate) { + if (forceUpdate === void 0) { forceUpdate = false; } + if (forceUpdate) { + this._recursivePostUpdateTransform(); + this.displayObjectUpdateTransform(); + } + var mat4 = this.proj.world.mat4; + return mat4[14] / mat4[15]; + }; + Container3d.prototype.toLocal = function (position, from, point, skipUpdate, step) { + if (step === void 0) { step = pixi_projection.TRANSFORM_STEP.ALL; } + if (from) { + position = from.toGlobal(position, point, skipUpdate); + } + if (!skipUpdate) { + this._recursivePostUpdateTransform(); + } + if (step === pixi_projection.TRANSFORM_STEP.ALL) { + if (!skipUpdate) { + this.displayObjectUpdateTransform(); + } + if (this.proj.affine) { + return this.transform.worldTransform.applyInverse(position, point); + } + return this.proj.world.applyInverse(position, point); + } + if (this.parent) { + point = this.parent.worldTransform.applyInverse(position, point); + } + else { + point.copyFrom(position); + } + if (step === pixi_projection.TRANSFORM_STEP.NONE) { + return point; + } + point = this.transform.localTransform.applyInverse(point, point); + if (step === pixi_projection.TRANSFORM_STEP.PROJ && this.proj.cameraMode) { + point = this.proj.cameraMatrix.applyInverse(point, point); + } + return point; + }; + Object.defineProperty(Container3d.prototype, "worldTransform", { + get: function () { + return this.proj.affine ? this.transform.worldTransform : this.proj.world; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Container3d.prototype, "position3d", { + get: function () { + return this.proj.position; + }, + set: function (value) { + this.proj.position.copyFrom(value); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Container3d.prototype, "scale3d", { + get: function () { + return this.proj.scale; + }, + set: function (value) { + this.proj.scale.copyFrom(value); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Container3d.prototype, "euler", { + get: function () { + return this.proj.euler; + }, + set: function (value) { + this.proj.euler.copyFrom(value); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Container3d.prototype, "pivot3d", { + get: function () { + return this.proj.pivot; + }, + set: function (value) { + this.proj.pivot.copyFrom(value); + }, + enumerable: false, + configurable: true + }); + return Container3d; + }(PIXI.Container)); + pixi_projection.Container3d = Container3d; + pixi_projection.container3dToLocal = Container3d.prototype.toLocal; + pixi_projection.container3dGetDepth = Container3d.prototype.getDepth; + pixi_projection.container3dIsFrontFace = Container3d.prototype.isFrontFace; +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + var Camera3d = (function (_super) { + __extends(Camera3d, _super); + function Camera3d() { + var _this = _super.call(this) || this; + _this._far = 0; + _this._near = 0; + _this._focus = 0; + _this._orthographic = false; + _this.proj.cameraMode = true; + _this.setPlanes(400, 10, 10000, false); + return _this; + } + Object.defineProperty(Camera3d.prototype, "far", { + get: function () { + return this._far; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Camera3d.prototype, "near", { + get: function () { + return this._near; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Camera3d.prototype, "focus", { + get: function () { + return this._focus; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Camera3d.prototype, "ortographic", { + get: function () { + return this._orthographic; + }, + enumerable: false, + configurable: true + }); + Camera3d.prototype.setPlanes = function (focus, near, far, orthographic) { + if (near === void 0) { near = 10; } + if (far === void 0) { far = 10000; } + if (orthographic === void 0) { orthographic = false; } + this._focus = focus; + this._near = near; + this._far = far; + this._orthographic = orthographic; + var proj = this.proj; + var mat4 = proj.cameraMatrix.mat4; + proj._projID++; + mat4[10] = 1.0 / (far - near); + mat4[14] = (focus - near) / (far - near); + if (this._orthographic) { + mat4[11] = 0; + } + else { + mat4[11] = 1.0 / focus; + } + }; + return Camera3d; + }(pixi_projection.Container3d)); + pixi_projection.Camera3d = Camera3d; +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + var Euler = (function () { + function Euler(x, y, z) { + this._quatUpdateId = -1; + this._quatDirtyId = 0; + this._sign = 1; + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this.quaternion = new Float64Array(4); + this.quaternion[3] = 1; + this.update(); + } + Object.defineProperty(Euler.prototype, "x", { + get: function () { + return this._x; + }, + set: function (value) { + if (this._x !== value) { + this._x = value; + this._quatDirtyId++; + } + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Euler.prototype, "y", { + get: function () { + return this._y; + }, + set: function (value) { + if (this._y !== value) { + this._y = value; + this._quatDirtyId++; + } + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Euler.prototype, "z", { + get: function () { + return this._z; + }, + set: function (value) { + if (this._z !== value) { + this._z = value; + this._quatDirtyId++; + } + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Euler.prototype, "pitch", { + get: function () { + return this._x; + }, + set: function (value) { + if (this._x !== value) { + this._x = value; + this._quatDirtyId++; + } + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Euler.prototype, "yaw", { + get: function () { + return this._y; + }, + set: function (value) { + if (this._y !== value) { + this._y = value; + this._quatDirtyId++; + } + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Euler.prototype, "roll", { + get: function () { + return this._z; + }, + set: function (value) { + if (this._z !== value) { + this._z = value; + this._quatDirtyId++; + } + }, + enumerable: false, + configurable: true + }); + Euler.prototype.set = function (x, y, z) { + var _x = x || 0; + var _y = y || 0; + var _z = z || 0; + if (this._x !== _x || this._y !== _y || this._z !== _z) { + this._x = _x; + this._y = _y; + this._z = _z; + this._quatDirtyId++; + } + }; + ; + Euler.prototype.copyFrom = function (euler) { + var _x = euler.x; + var _y = euler.y; + var _z = euler.z; + if (this._x !== _x || this._y !== _y || this._z !== _z) { + this._x = _x; + this._y = _y; + this._z = _z; + this._quatDirtyId++; + } + }; + Euler.prototype.copyTo = function (p) { + p.set(this._x, this._y, this._z); + return p; + }; + Euler.prototype.equals = function (euler) { + return this._x === euler.x + && this._y === euler.y + && this._z === euler.z; + }; + Euler.prototype.clone = function () { + return new Euler(this._x, this._y, this._z); + }; + Euler.prototype.update = function () { + if (this._quatUpdateId === this._quatDirtyId) { + return false; + } + this._quatUpdateId = this._quatDirtyId; + var c1 = Math.cos(this._x / 2); + var c2 = Math.cos(this._y / 2); + var c3 = Math.cos(this._z / 2); + var s = this._sign; + var s1 = s * Math.sin(this._x / 2); + var s2 = s * Math.sin(this._y / 2); + var s3 = s * Math.sin(this._z / 2); + var q = this.quaternion; + q[0] = s1 * c2 * c3 + c1 * s2 * s3; + q[1] = c1 * s2 * c3 - s1 * c2 * s3; + q[2] = c1 * c2 * s3 + s1 * s2 * c3; + q[3] = c1 * c2 * c3 - s1 * s2 * s3; + return true; + }; + return Euler; + }()); + pixi_projection.Euler = Euler; +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + var mat4id = [1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1]; + var Matrix3d = (function () { + function Matrix3d(backingArray) { + this.floatArray = null; + this._dirtyId = 0; + this._updateId = -1; + this._mat4inv = null; + this.cacheInverse = false; + this.mat4 = new Float64Array(backingArray || mat4id); + } + Object.defineProperty(Matrix3d.prototype, "a", { + get: function () { + return this.mat4[0] / this.mat4[15]; + }, + set: function (value) { + this.mat4[0] = value * this.mat4[15]; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Matrix3d.prototype, "b", { + get: function () { + return this.mat4[1] / this.mat4[15]; + }, + set: function (value) { + this.mat4[1] = value * this.mat4[15]; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Matrix3d.prototype, "c", { + get: function () { + return this.mat4[4] / this.mat4[15]; + }, + set: function (value) { + this.mat4[4] = value * this.mat4[15]; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Matrix3d.prototype, "d", { + get: function () { + return this.mat4[5] / this.mat4[15]; + }, + set: function (value) { + this.mat4[5] = value * this.mat4[15]; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Matrix3d.prototype, "tx", { + get: function () { + return this.mat4[12] / this.mat4[15]; + }, + set: function (value) { + this.mat4[12] = value * this.mat4[15]; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Matrix3d.prototype, "ty", { + get: function () { + return this.mat4[13] / this.mat4[15]; + }, + set: function (value) { + this.mat4[13] = value * this.mat4[15]; + }, + enumerable: false, + configurable: true + }); + Matrix3d.prototype.set = function (a, b, c, d, tx, ty) { + var mat4 = this.mat4; + mat4[0] = a; + mat4[1] = b; + mat4[2] = 0; + mat4[3] = 0; + mat4[4] = c; + mat4[5] = d; + mat4[6] = 0; + mat4[7] = 0; + mat4[8] = 0; + mat4[9] = 0; + mat4[10] = 1; + mat4[11] = 0; + mat4[12] = tx; + mat4[13] = ty; + mat4[14] = 0; + mat4[15] = 1; + return this; + }; + Matrix3d.prototype.toArray = function (transpose, out) { + if (!this.floatArray) { + this.floatArray = new Float32Array(9); + } + var array = out || this.floatArray; + var mat3 = this.mat4; + if (transpose) { + array[0] = mat3[0]; + array[1] = mat3[1]; + array[2] = mat3[3]; + array[3] = mat3[4]; + array[4] = mat3[5]; + array[5] = mat3[7]; + array[6] = mat3[12]; + array[7] = mat3[13]; + array[8] = mat3[15]; + } + else { + array[0] = mat3[0]; + array[1] = mat3[4]; + array[2] = mat3[12]; + array[3] = mat3[2]; + array[4] = mat3[6]; + array[5] = mat3[13]; + array[6] = mat3[3]; + array[7] = mat3[7]; + array[8] = mat3[15]; + } + return array; + }; + Matrix3d.prototype.setToTranslation = function (tx, ty, tz) { + var mat4 = this.mat4; + mat4[0] = 1; + mat4[1] = 0; + mat4[2] = 0; + mat4[3] = 0; + mat4[4] = 0; + mat4[5] = 1; + mat4[6] = 0; + mat4[7] = 0; + mat4[8] = 0; + mat4[9] = 0; + mat4[10] = 1; + mat4[11] = 0; + mat4[12] = tx; + mat4[13] = ty; + mat4[14] = tz; + mat4[15] = 1; + }; + Matrix3d.prototype.setToRotationTranslationScale = function (quat, tx, ty, tz, sx, sy, sz) { + var out = this.mat4; + var x = quat[0], y = quat[1], z = quat[2], w = quat[3]; + var x2 = x + x; + var y2 = y + y; + var z2 = z + z; + var xx = x * x2; + var xy = x * y2; + var xz = x * z2; + var yy = y * y2; + var yz = y * z2; + var zz = z * z2; + var wx = w * x2; + var wy = w * y2; + var wz = w * z2; + out[0] = (1 - (yy + zz)) * sx; + out[1] = (xy + wz) * sx; + out[2] = (xz - wy) * sx; + out[3] = 0; + out[4] = (xy - wz) * sy; + out[5] = (1 - (xx + zz)) * sy; + out[6] = (yz + wx) * sy; + out[7] = 0; + out[8] = (xz + wy) * sz; + out[9] = (yz - wx) * sz; + out[10] = (1 - (xx + yy)) * sz; + out[11] = 0; + out[12] = tx; + out[13] = ty; + out[14] = tz; + out[15] = 1; + return out; + }; + Matrix3d.prototype.apply = function (pos, newPos) { + newPos = newPos || new pixi_projection.Point3d(); + var mat4 = this.mat4; + var x = pos.x; + var y = pos.y; + var z = pos.z || 0; + var w = 1.0 / (mat4[3] * x + mat4[7] * y + mat4[11] * z + mat4[15]); + newPos.x = w * (mat4[0] * x + mat4[4] * y + mat4[8] * z + mat4[12]); + newPos.y = w * (mat4[1] * x + mat4[5] * y + mat4[9] * z + mat4[13]); + newPos.z = w * (mat4[2] * x + mat4[6] * y + mat4[10] * z + mat4[14]); + return newPos; + }; + Matrix3d.prototype.translate = function (tx, ty, tz) { + var a = this.mat4; + a[12] = a[0] * tx + a[4] * ty + a[8] * tz + a[12]; + a[13] = a[1] * tx + a[5] * ty + a[9] * tz + a[13]; + a[14] = a[2] * tx + a[6] * ty + a[10] * tz + a[14]; + a[15] = a[3] * tx + a[7] * ty + a[11] * tz + a[15]; + return this; + }; + Matrix3d.prototype.scale = function (x, y, z) { + var mat4 = this.mat4; + mat4[0] *= x; + mat4[1] *= x; + mat4[2] *= x; + mat4[3] *= x; + mat4[4] *= y; + mat4[5] *= y; + mat4[6] *= y; + mat4[7] *= y; + if (z !== undefined) { + mat4[8] *= z; + mat4[9] *= z; + mat4[10] *= z; + mat4[11] *= z; + } + return this; + }; + Matrix3d.prototype.scaleAndTranslate = function (scaleX, scaleY, scaleZ, tx, ty, tz) { + var mat4 = this.mat4; + mat4[0] = scaleX * mat4[0] + tx * mat4[3]; + mat4[1] = scaleY * mat4[1] + ty * mat4[3]; + mat4[2] = scaleZ * mat4[2] + tz * mat4[3]; + mat4[4] = scaleX * mat4[4] + tx * mat4[7]; + mat4[5] = scaleY * mat4[5] + ty * mat4[7]; + mat4[6] = scaleZ * mat4[6] + tz * mat4[7]; + mat4[8] = scaleX * mat4[8] + tx * mat4[11]; + mat4[9] = scaleY * mat4[9] + ty * mat4[11]; + mat4[10] = scaleZ * mat4[10] + tz * mat4[11]; + mat4[12] = scaleX * mat4[12] + tx * mat4[15]; + mat4[13] = scaleY * mat4[13] + ty * mat4[15]; + mat4[14] = scaleZ * mat4[14] + tz * mat4[15]; + }; + Matrix3d.prototype.applyInverse = function (pos, newPos) { + newPos = newPos || new pixi_projection.Point3d(); + if (!this._mat4inv) { + this._mat4inv = new Float64Array(16); + } + var mat4 = this._mat4inv; + var a = this.mat4; + var x = pos.x; + var y = pos.y; + var z = pos.z || 0; + if (!this.cacheInverse || this._updateId !== this._dirtyId) { + this._updateId = this._dirtyId; + Matrix3d.glMatrixMat4Invert(mat4, a); + } + var w1 = 1.0 / (mat4[3] * x + mat4[7] * y + mat4[11] * z + mat4[15]); + var x1 = w1 * (mat4[0] * x + mat4[4] * y + mat4[8] * z + mat4[12]); + var y1 = w1 * (mat4[1] * x + mat4[5] * y + mat4[9] * z + mat4[13]); + var z1 = w1 * (mat4[2] * x + mat4[6] * y + mat4[10] * z + mat4[14]); + z += 1.0; + var w2 = 1.0 / (mat4[3] * x + mat4[7] * y + mat4[11] * z + mat4[15]); + var x2 = w2 * (mat4[0] * x + mat4[4] * y + mat4[8] * z + mat4[12]); + var y2 = w2 * (mat4[1] * x + mat4[5] * y + mat4[9] * z + mat4[13]); + var z2 = w2 * (mat4[2] * x + mat4[6] * y + mat4[10] * z + mat4[14]); + if (Math.abs(z1 - z2) < 1e-10) { + newPos.set(NaN, NaN, 0); + } + var alpha = (0 - z1) / (z2 - z1); + newPos.set((x2 - x1) * alpha + x1, (y2 - y1) * alpha + y1, 0.0); + return newPos; + }; + Matrix3d.prototype.invert = function () { + Matrix3d.glMatrixMat4Invert(this.mat4, this.mat4); + return this; + }; + Matrix3d.prototype.invertCopyTo = function (matrix) { + if (!this._mat4inv) { + this._mat4inv = new Float64Array(16); + } + var mat4 = this._mat4inv; + var a = this.mat4; + if (!this.cacheInverse || this._updateId !== this._dirtyId) { + this._updateId = this._dirtyId; + Matrix3d.glMatrixMat4Invert(mat4, a); + } + matrix.mat4.set(mat4); + }; + Matrix3d.prototype.identity = function () { + var mat3 = this.mat4; + mat3[0] = 1; + mat3[1] = 0; + mat3[2] = 0; + mat3[3] = 0; + mat3[4] = 0; + mat3[5] = 1; + mat3[6] = 0; + mat3[7] = 0; + mat3[8] = 0; + mat3[9] = 0; + mat3[10] = 1; + mat3[11] = 0; + mat3[12] = 0; + mat3[13] = 0; + mat3[14] = 0; + mat3[15] = 1; + return this; + }; + Matrix3d.prototype.clone = function () { + return new Matrix3d(this.mat4); + }; + Matrix3d.prototype.copyTo3d = function (matrix) { + var mat3 = this.mat4; + var ar2 = matrix.mat4; + ar2[0] = mat3[0]; + ar2[1] = mat3[1]; + ar2[2] = mat3[2]; + ar2[3] = mat3[3]; + ar2[4] = mat3[4]; + ar2[5] = mat3[5]; + ar2[6] = mat3[6]; + ar2[7] = mat3[7]; + ar2[8] = mat3[8]; + return matrix; + }; + Matrix3d.prototype.copyTo2d = function (matrix) { + var mat3 = this.mat4; + var ar2 = matrix.mat3; + ar2[0] = mat3[0]; + ar2[1] = mat3[1]; + ar2[2] = mat3[3]; + ar2[3] = mat3[4]; + ar2[4] = mat3[5]; + ar2[5] = mat3[7]; + ar2[6] = mat3[12]; + ar2[7] = mat3[13]; + ar2[8] = mat3[15]; + return matrix; + }; + Matrix3d.prototype.copyTo2dOr3d = function (matrix) { + if (matrix instanceof pixi_projection.Matrix2d) { + return this.copyTo2d(matrix); + } + else { + return this.copyTo3d(matrix); + } + }; + Matrix3d.prototype.copyTo = function (matrix, affine, preserveOrientation) { + var mat3 = this.mat4; + var d = 1.0 / mat3[15]; + var tx = mat3[12] * d, ty = mat3[13] * d; + matrix.a = (mat3[0] - mat3[3] * tx) * d; + matrix.b = (mat3[1] - mat3[3] * ty) * d; + matrix.c = (mat3[4] - mat3[7] * tx) * d; + matrix.d = (mat3[5] - mat3[7] * ty) * d; + matrix.tx = tx; + matrix.ty = ty; + if (affine >= 2) { + var D = matrix.a * matrix.d - matrix.b * matrix.c; + if (!preserveOrientation) { + D = Math.abs(D); + } + if (affine === pixi_projection.AFFINE.POINT) { + if (D > 0) { + D = 1; + } + else + D = -1; + matrix.a = D; + matrix.b = 0; + matrix.c = 0; + matrix.d = D; + } + else if (affine === pixi_projection.AFFINE.AXIS_X) { + D /= Math.sqrt(matrix.b * matrix.b + matrix.d * matrix.d); + matrix.c = 0; + matrix.d = D; + } + else if (affine === pixi_projection.AFFINE.AXIS_Y) { + D /= Math.sqrt(matrix.a * matrix.a + matrix.c * matrix.c); + matrix.a = D; + matrix.c = 0; + } + } + return matrix; + }; + Matrix3d.prototype.copyFrom = function (matrix) { + var mat3 = this.mat4; + mat3[0] = matrix.a; + mat3[1] = matrix.b; + mat3[2] = 0; + mat3[3] = 0; + mat3[4] = matrix.c; + mat3[5] = matrix.d; + mat3[6] = 0; + mat3[7] = 0; + mat3[8] = 0; + mat3[9] = 0; + mat3[10] = 1; + mat3[11] = 0; + mat3[12] = matrix.tx; + mat3[13] = matrix.ty; + mat3[14] = 0; + mat3[15] = 1; + this._dirtyId++; + return this; + }; + Matrix3d.prototype.setToMultLegacy = function (pt, lt) { + var out = this.mat4; + var b = lt.mat4; + var a00 = pt.a, a01 = pt.b, a10 = pt.c, a11 = pt.d, a30 = pt.tx, a31 = pt.ty; + var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; + out[0] = b0 * a00 + b1 * a10 + b3 * a30; + out[1] = b0 * a01 + b1 * a11 + b3 * a31; + out[2] = b2; + out[3] = b3; + b0 = b[4]; + b1 = b[5]; + b2 = b[6]; + b3 = b[7]; + out[4] = b0 * a00 + b1 * a10 + b3 * a30; + out[5] = b0 * a01 + b1 * a11 + b3 * a31; + out[6] = b2; + out[7] = b3; + b0 = b[8]; + b1 = b[9]; + b2 = b[10]; + b3 = b[11]; + out[8] = b0 * a00 + b1 * a10 + b3 * a30; + out[9] = b0 * a01 + b1 * a11 + b3 * a31; + out[10] = b2; + out[11] = b3; + b0 = b[12]; + b1 = b[13]; + b2 = b[14]; + b3 = b[15]; + out[12] = b0 * a00 + b1 * a10 + b3 * a30; + out[13] = b0 * a01 + b1 * a11 + b3 * a31; + out[14] = b2; + out[15] = b3; + this._dirtyId++; + return this; + }; + Matrix3d.prototype.setToMultLegacy2 = function (pt, lt) { + var out = this.mat4; + var a = pt.mat4; + var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3]; + var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; + var b00 = lt.a, b01 = lt.b, b10 = lt.c, b11 = lt.d, b30 = lt.tx, b31 = lt.ty; + out[0] = b00 * a00 + b01 * a10; + out[1] = b00 * a01 + b01 * a11; + out[2] = b00 * a02 + b01 * a12; + out[3] = b00 * a03 + b01 * a13; + out[4] = b10 * a00 + b11 * a10; + out[5] = b10 * a01 + b11 * a11; + out[6] = b10 * a02 + b11 * a12; + out[7] = b10 * a03 + b11 * a13; + out[8] = a[8]; + out[9] = a[9]; + out[10] = a[10]; + out[11] = a[11]; + out[12] = b30 * a00 + b31 * a10 + a[12]; + out[13] = b30 * a01 + b31 * a11 + a[13]; + out[14] = b30 * a02 + b31 * a12 + a[14]; + out[15] = b30 * a03 + b31 * a13 + a[15]; + this._dirtyId++; + return this; + }; + Matrix3d.prototype.setToMult = function (pt, lt) { + Matrix3d.glMatrixMat4Multiply(this.mat4, pt.mat4, lt.mat4); + this._dirtyId++; + return this; + }; + Matrix3d.prototype.prepend = function (lt) { + if (lt.mat4) { + this.setToMult(lt, this); + } + else { + this.setToMultLegacy(lt, this); + } + }; + Matrix3d.glMatrixMat4Invert = function (out, a) { + var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3]; + var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; + var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11]; + var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; + var b00 = a00 * a11 - a01 * a10; + var b01 = a00 * a12 - a02 * a10; + var b02 = a00 * a13 - a03 * a10; + var b03 = a01 * a12 - a02 * a11; + var b04 = a01 * a13 - a03 * a11; + var b05 = a02 * a13 - a03 * a12; + var b06 = a20 * a31 - a21 * a30; + var b07 = a20 * a32 - a22 * a30; + var b08 = a20 * a33 - a23 * a30; + var b09 = a21 * a32 - a22 * a31; + var b10 = a21 * a33 - a23 * a31; + var b11 = a22 * a33 - a23 * a32; + var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; + if (!det) { + return null; + } + det = 1.0 / det; + out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; + out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det; + out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det; + out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det; + out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det; + out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det; + out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det; + out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det; + out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det; + out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det; + out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det; + out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det; + out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det; + out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det; + out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det; + out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det; + return out; + }; + Matrix3d.glMatrixMat4Multiply = function (out, a, b) { + var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3]; + var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; + var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11]; + var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; + var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; + out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; + out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; + out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; + out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; + b0 = b[4]; + b1 = b[5]; + b2 = b[6]; + b3 = b[7]; + out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; + out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; + out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; + out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; + b0 = b[8]; + b1 = b[9]; + b2 = b[10]; + b3 = b[11]; + out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; + out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; + out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; + out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; + b0 = b[12]; + b1 = b[13]; + b2 = b[14]; + b3 = b[15]; + out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; + out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; + out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; + out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; + return out; + }; + Matrix3d.IDENTITY = new Matrix3d(); + Matrix3d.TEMP_MATRIX = new Matrix3d(); + return Matrix3d; + }()); + pixi_projection.Matrix3d = Matrix3d; +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + var ObservableEuler = (function () { + function ObservableEuler(cb, scope, x, y, z) { + this.cb = cb; + this.scope = scope; + this._quatUpdateId = -1; + this._quatDirtyId = 0; + this._sign = 1; + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this.quaternion = new Float64Array(4); + this.quaternion[3] = 1; + this.update(); + } + Object.defineProperty(ObservableEuler.prototype, "x", { + get: function () { + return this._x; + }, + set: function (value) { + if (this._x !== value) { + this._x = value; + this._quatDirtyId++; + this.cb.call(this.scope); + } + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ObservableEuler.prototype, "y", { + get: function () { + return this._y; + }, + set: function (value) { + if (this._y !== value) { + this._y = value; + this._quatDirtyId++; + this.cb.call(this.scope); + } + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ObservableEuler.prototype, "z", { + get: function () { + return this._z; + }, + set: function (value) { + if (this._z !== value) { + this._z = value; + this._quatDirtyId++; + this.cb.call(this.scope); + } + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ObservableEuler.prototype, "pitch", { + get: function () { + return this._x; + }, + set: function (value) { + if (this._x !== value) { + this._x = value; + this._quatDirtyId++; + this.cb.call(this.scope); + } + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ObservableEuler.prototype, "yaw", { + get: function () { + return this._y; + }, + set: function (value) { + if (this._y !== value) { + this._y = value; + this._quatDirtyId++; + this.cb.call(this.scope); + } + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ObservableEuler.prototype, "roll", { + get: function () { + return this._z; + }, + set: function (value) { + if (this._z !== value) { + this._z = value; + this._quatDirtyId++; + this.cb.call(this.scope); + } + }, + enumerable: false, + configurable: true + }); + ObservableEuler.prototype.set = function (x, y, z) { + var _x = x || 0; + var _y = y || 0; + var _z = z || 0; + if (this._x !== _x || this._y !== _y || this._z !== _z) { + this._x = _x; + this._y = _y; + this._z = _z; + this._quatDirtyId++; + this.cb.call(this.scope); + } + }; + ; + ObservableEuler.prototype.copyFrom = function (euler) { + var _x = euler.x; + var _y = euler.y; + var _z = euler.z; + if (this._x !== _x || this._y !== _y || this._z !== _z) { + this._x = _x; + this._y = _y; + this._z = _z; + this._quatDirtyId++; + this.cb.call(this.scope); + } + }; + ObservableEuler.prototype.copyTo = function (p) { + p.set(this._x, this._y, this._z); + return p; + }; + ObservableEuler.prototype.equals = function (euler) { + return this._x === euler.x + && this._y === euler.y + && this._z === euler.z; + }; + ObservableEuler.prototype.clone = function () { + return new pixi_projection.Euler(this._x, this._y, this._z); + }; + ObservableEuler.prototype.update = function () { + if (this._quatUpdateId === this._quatDirtyId) { + return false; + } + this._quatUpdateId = this._quatDirtyId; + var c1 = Math.cos(this._x / 2); + var c2 = Math.cos(this._y / 2); + var c3 = Math.cos(this._z / 2); + var s = this._sign; + var s1 = s * Math.sin(this._x / 2); + var s2 = s * Math.sin(this._y / 2); + var s3 = s * Math.sin(this._z / 2); + var q = this.quaternion; + q[0] = s1 * c2 * c3 + c1 * s2 * s3; + q[1] = c1 * s2 * c3 - s1 * c2 * s3; + q[2] = c1 * c2 * s3 + s1 * s2 * c3; + q[3] = c1 * c2 * c3 - s1 * s2 * s3; + return true; + }; + return ObservableEuler; + }()); + pixi_projection.ObservableEuler = ObservableEuler; +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + var Point3d = (function (_super) { + __extends(Point3d, _super); + function Point3d(x, y, z) { + var _this = _super.call(this, x, y) || this; + _this.z = z; + return _this; + } + Point3d.prototype.set = function (x, y, z) { + this.x = x || 0; + this.y = (y === undefined) ? this.x : (y || 0); + this.z = (y === undefined) ? this.x : (z || 0); + return this; + }; + Point3d.prototype.copyFrom = function (p) { + this.set(p.x, p.y, p.z || 0); + return this; + }; + Point3d.prototype.copyTo = function (p) { + p.set(this.x, this.y, this.z); + return p; + }; + return Point3d; + }(PIXI.Point)); + pixi_projection.Point3d = Point3d; + var ObservablePoint3d = (function (_super) { + __extends(ObservablePoint3d, _super); + function ObservablePoint3d() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._z = 0; + return _this; + } + Object.defineProperty(ObservablePoint3d.prototype, "z", { + get: function () { + return this._z; + }, + set: function (value) { + if (this._z !== value) { + this._z = value; + this.cb.call(this.scope); + } + }, + enumerable: false, + configurable: true + }); + ObservablePoint3d.prototype.set = function (x, y, z) { + var _x = x || 0; + var _y = (y === undefined) ? _x : (y || 0); + var _z = (y === undefined) ? _x : (z || 0); + if (this._x !== _x || this._y !== _y || this._z !== _z) { + this._x = _x; + this._y = _y; + this._z = _z; + this.cb.call(this.scope); + } + return this; + }; + ObservablePoint3d.prototype.copyFrom = function (p) { + this.set(p.x, p.y, p.z || 0); + return this; + }; + ObservablePoint3d.prototype.copyTo = function (p) { + p.set(this._x, this._y, this._z); + return p; + }; + return ObservablePoint3d; + }(PIXI.ObservablePoint)); + pixi_projection.ObservablePoint3d = ObservablePoint3d; +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + var tempMat = new pixi_projection.Matrix3d(); + var Projection3d = (function (_super) { + __extends(Projection3d, _super); + function Projection3d(legacy, enable) { + var _this = _super.call(this, legacy, enable) || this; + _this.cameraMatrix = null; + _this._cameraMode = false; + _this.position = new pixi_projection.ObservablePoint3d(_this.onChange, _this, 0, 0); + _this.scale = new pixi_projection.ObservablePoint3d(_this.onChange, _this, 1, 1); + _this.euler = new pixi_projection.ObservableEuler(_this.onChange, _this, 0, 0, 0); + _this.pivot = new pixi_projection.ObservablePoint3d(_this.onChange, _this, 0, 0); + _this.local = new pixi_projection.Matrix3d(); + _this.world = new pixi_projection.Matrix3d(); + _this.local.cacheInverse = true; + _this.world.cacheInverse = true; + _this.position._z = 0; + _this.scale._z = 1; + _this.pivot._z = 0; + return _this; + } + Object.defineProperty(Projection3d.prototype, "cameraMode", { + get: function () { + return this._cameraMode; + }, + set: function (value) { + if (this._cameraMode === value) { + return; + } + this._cameraMode = value; + this.euler._sign = this._cameraMode ? -1 : 1; + this.euler._quatDirtyId++; + if (value) { + this.cameraMatrix = new pixi_projection.Matrix3d(); + } + }, + enumerable: false, + configurable: true + }); + Projection3d.prototype.onChange = function () { + this._projID++; + }; + Projection3d.prototype.clear = function () { + if (this.cameraMatrix) { + this.cameraMatrix.identity(); + } + this.position.set(0, 0, 0); + this.scale.set(1, 1, 1); + this.euler.set(0, 0, 0); + this.pivot.set(0, 0, 0); + _super.prototype.clear.call(this); + }; + Projection3d.prototype.updateLocalTransform = function (lt) { + if (this._projID === 0) { + this.local.copyFrom(lt); + return; + } + var matrix = this.local; + var euler = this.euler; + var pos = this.position; + var scale = this.scale; + var pivot = this.pivot; + euler.update(); + if (!this.cameraMode) { + matrix.setToRotationTranslationScale(euler.quaternion, pos._x, pos._y, pos._z, scale._x, scale._y, scale._z); + matrix.translate(-pivot._x, -pivot._y, -pivot._z); + matrix.setToMultLegacy(lt, matrix); + return; + } + matrix.setToMultLegacy(lt, this.cameraMatrix); + matrix.translate(pivot._x, pivot._y, pivot._z); + matrix.scale(1.0 / scale._x, 1.0 / scale._y, 1.0 / scale._z); + tempMat.setToRotationTranslationScale(euler.quaternion, 0, 0, 0, 1, 1, 1); + matrix.setToMult(matrix, tempMat); + matrix.translate(-pos._x, -pos._y, -pos._z); + this.local._dirtyId++; + }; + return Projection3d; + }(pixi_projection.LinearProjection)); + pixi_projection.Projection3d = Projection3d; +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + var Mesh3d2d = (function (_super) { + __extends(Mesh3d2d, _super); + function Mesh3d2d(geometry, shader, state, drawMode) { + var _this = _super.call(this, geometry, shader, state, drawMode) || this; + _this.vertexData2d = null; + _this.proj = new pixi_projection.Projection3d(_this.transform); + return _this; + } + Mesh3d2d.prototype.calculateVertices = function () { + if (this.proj._affine) { + this.vertexData2d = null; + _super.prototype.calculateVertices.call(this); + return; + } + var geometry = this.geometry; + var vertices = geometry.buffers[0].data; + var thisAny = this; + if (geometry.vertexDirtyId === thisAny.vertexDirty && thisAny._transformID === thisAny.transform._worldID) { + return; + } + thisAny._transformID = thisAny.transform._worldID; + if (thisAny.vertexData.length !== vertices.length) { + thisAny.vertexData = new Float32Array(vertices.length); + } + if (!this.vertexData2d || this.vertexData2d.length !== vertices.length * 3 / 2) { + this.vertexData2d = new Float32Array(vertices.length * 3); + } + var wt = this.proj.world.mat4; + var vertexData2d = this.vertexData2d; + var vertexData = thisAny.vertexData; + for (var i = 0; i < vertexData.length / 2; i++) { + var x = vertices[(i * 2)]; + var y = vertices[(i * 2) + 1]; + var xx = (wt[0] * x) + (wt[4] * y) + wt[12]; + var yy = (wt[1] * x) + (wt[5] * y) + wt[13]; + var ww = (wt[3] * x) + (wt[7] * y) + wt[15]; + vertexData2d[i * 3] = xx; + vertexData2d[i * 3 + 1] = yy; + vertexData2d[i * 3 + 2] = ww; + vertexData[(i * 2)] = xx / ww; + vertexData[(i * 2) + 1] = yy / ww; + } + thisAny.vertexDirty = geometry.vertexDirtyId; + }; + Object.defineProperty(Mesh3d2d.prototype, "worldTransform", { + get: function () { + return this.proj.affine ? this.transform.worldTransform : this.proj.world; + }, + enumerable: false, + configurable: true + }); + Mesh3d2d.prototype.toLocal = function (position, from, point, skipUpdate, step) { + if (step === void 0) { step = pixi_projection.TRANSFORM_STEP.ALL; } + return pixi_projection.container3dToLocal.call(this, position, from, point, skipUpdate, step); + }; + Mesh3d2d.prototype.isFrontFace = function (forceUpdate) { + return pixi_projection.container3dIsFrontFace.call(this, forceUpdate); + }; + Mesh3d2d.prototype.getDepth = function (forceUpdate) { + return pixi_projection.container3dGetDepth.call(this, forceUpdate); + }; + Object.defineProperty(Mesh3d2d.prototype, "position3d", { + get: function () { + return this.proj.position; + }, + set: function (value) { + this.proj.position.copyFrom(value); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Mesh3d2d.prototype, "scale3d", { + get: function () { + return this.proj.scale; + }, + set: function (value) { + this.proj.scale.copyFrom(value); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Mesh3d2d.prototype, "euler", { + get: function () { + return this.proj.euler; + }, + set: function (value) { + this.proj.euler.copyFrom(value); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Mesh3d2d.prototype, "pivot3d", { + get: function () { + return this.proj.pivot; + }, + set: function (value) { + this.proj.pivot.copyFrom(value); + }, + enumerable: false, + configurable: true + }); + return Mesh3d2d; + }(PIXI.Mesh)); + pixi_projection.Mesh3d2d = Mesh3d2d; + Mesh3d2d.prototype._renderDefault = pixi_projection.Mesh2d.prototype._renderDefault; + var SimpleMesh3d2d = (function (_super) { + __extends(SimpleMesh3d2d, _super); + function SimpleMesh3d2d(texture, vertices, uvs, indices, drawMode) { + var _this = _super.call(this, new PIXI.MeshGeometry(vertices, uvs, indices), new PIXI.MeshMaterial(texture, { + program: PIXI.Program.from(pixi_projection.Mesh2d.defaultVertexShader, pixi_projection.Mesh2d.defaultFragmentShader), + pluginName: 'batch2d' + }), null, drawMode) || this; + _this.autoUpdate = true; + _this.geometry.getBuffer('aVertexPosition').static = false; + return _this; + } + Object.defineProperty(SimpleMesh3d2d.prototype, "vertices", { + get: function () { + return this.geometry.getBuffer('aVertexPosition').data; + }, + set: function (value) { + this.geometry.getBuffer('aVertexPosition').data = value; + }, + enumerable: false, + configurable: true + }); + SimpleMesh3d2d.prototype._render = function (renderer) { + if (this.autoUpdate) { + this.geometry.getBuffer('aVertexPosition').update(); + } + _super.prototype._render.call(this, renderer); + }; + return SimpleMesh3d2d; + }(Mesh3d2d)); + pixi_projection.SimpleMesh3d2d = SimpleMesh3d2d; +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + var Sprite3d = (function (_super) { + __extends(Sprite3d, _super); + function Sprite3d(texture) { + var _this = _super.call(this, texture) || this; + _this.vertexData2d = null; + _this.culledByFrustrum = false; + _this.trimmedCulledByFrustrum = false; + _this.proj = new pixi_projection.Projection3d(_this.transform); + _this.pluginName = 'batch2d'; + return _this; + } + Sprite3d.prototype.calculateVertices = function () { + var texture = this._texture; + if (this.proj._affine) { + this.vertexData2d = null; + _super.prototype.calculateVertices.call(this); + return; + } + if (!this.vertexData2d) { + this.vertexData2d = new Float32Array(12); + } + var wid = this.transform._worldID; + var tuid = texture._updateID; + if (this._transformID === wid && this._textureID === tuid) { + return; + } + if (this._textureID !== tuid) { + this.uvs = texture._uvs.uvsFloat32; + } + this._transformID = wid; + this._textureID = tuid; + var wt = this.proj.world.mat4; + var vertexData2d = this.vertexData2d; + var vertexData = this.vertexData; + var trim = texture.trim; + var orig = texture.orig; + var anchor = this._anchor; + var w0 = 0; + var w1 = 0; + var h0 = 0; + var h1 = 0; + if (trim) { + w1 = trim.x - (anchor._x * orig.width); + w0 = w1 + trim.width; + h1 = trim.y - (anchor._y * orig.height); + h0 = h1 + trim.height; + } + else { + w1 = -anchor._x * orig.width; + w0 = w1 + orig.width; + h1 = -anchor._y * orig.height; + h0 = h1 + orig.height; + } + var culled = false; + var z; + vertexData2d[0] = (wt[0] * w1) + (wt[4] * h1) + wt[12]; + vertexData2d[1] = (wt[1] * w1) + (wt[5] * h1) + wt[13]; + z = (wt[2] * w1) + (wt[6] * h1) + wt[14]; + vertexData2d[2] = (wt[3] * w1) + (wt[7] * h1) + wt[15]; + culled = culled || z < 0; + vertexData2d[3] = (wt[0] * w0) + (wt[4] * h1) + wt[12]; + vertexData2d[4] = (wt[1] * w0) + (wt[5] * h1) + wt[13]; + z = (wt[2] * w0) + (wt[6] * h1) + wt[14]; + vertexData2d[5] = (wt[3] * w0) + (wt[7] * h1) + wt[15]; + culled = culled || z < 0; + vertexData2d[6] = (wt[0] * w0) + (wt[4] * h0) + wt[12]; + vertexData2d[7] = (wt[1] * w0) + (wt[5] * h0) + wt[13]; + z = (wt[2] * w0) + (wt[6] * h0) + wt[14]; + vertexData2d[8] = (wt[3] * w0) + (wt[7] * h0) + wt[15]; + culled = culled || z < 0; + vertexData2d[9] = (wt[0] * w1) + (wt[4] * h0) + wt[12]; + vertexData2d[10] = (wt[1] * w1) + (wt[5] * h0) + wt[13]; + z = (wt[2] * w1) + (wt[6] * h0) + wt[14]; + vertexData2d[11] = (wt[3] * w1) + (wt[7] * h0) + wt[15]; + culled = culled || z < 0; + this.culledByFrustrum = culled; + vertexData[0] = vertexData2d[0] / vertexData2d[2]; + vertexData[1] = vertexData2d[1] / vertexData2d[2]; + vertexData[2] = vertexData2d[3] / vertexData2d[5]; + vertexData[3] = vertexData2d[4] / vertexData2d[5]; + vertexData[4] = vertexData2d[6] / vertexData2d[8]; + vertexData[5] = vertexData2d[7] / vertexData2d[8]; + vertexData[6] = vertexData2d[9] / vertexData2d[11]; + vertexData[7] = vertexData2d[10] / vertexData2d[11]; + }; + Sprite3d.prototype.calculateTrimmedVertices = function () { + if (this.proj._affine) { + _super.prototype.calculateTrimmedVertices.call(this); + return; + } + var wid = this.transform._worldID; + var tuid = this._texture._updateID; + if (!this.vertexTrimmedData) { + this.vertexTrimmedData = new Float32Array(8); + } + else if (this._transformTrimmedID === wid && this._textureTrimmedID === tuid) { + return; + } + this._transformTrimmedID = wid; + this._textureTrimmedID = tuid; + var texture = this._texture; + var vertexData = this.vertexTrimmedData; + var orig = texture.orig; + var anchor = this._anchor; + var wt = this.proj.world.mat4; + var w1 = -anchor._x * orig.width; + var w0 = w1 + orig.width; + var h1 = -anchor._y * orig.height; + var h0 = h1 + orig.height; + var culled = false; + var z; + var w = 1.0 / ((wt[3] * w1) + (wt[7] * h1) + wt[15]); + vertexData[0] = w * ((wt[0] * w1) + (wt[4] * h1) + wt[12]); + vertexData[1] = w * ((wt[1] * w1) + (wt[5] * h1) + wt[13]); + z = (wt[2] * w1) + (wt[6] * h1) + wt[14]; + culled = culled || z < 0; + w = 1.0 / ((wt[3] * w0) + (wt[7] * h1) + wt[15]); + vertexData[2] = w * ((wt[0] * w0) + (wt[4] * h1) + wt[12]); + vertexData[3] = w * ((wt[1] * w0) + (wt[5] * h1) + wt[13]); + z = (wt[2] * w0) + (wt[6] * h1) + wt[14]; + culled = culled || z < 0; + w = 1.0 / ((wt[3] * w0) + (wt[7] * h0) + wt[15]); + vertexData[4] = w * ((wt[0] * w0) + (wt[4] * h0) + wt[12]); + vertexData[5] = w * ((wt[1] * w0) + (wt[5] * h0) + wt[13]); + z = (wt[2] * w0) + (wt[6] * h0) + wt[14]; + culled = culled || z < 0; + w = 1.0 / ((wt[3] * w1) + (wt[7] * h0) + wt[15]); + vertexData[6] = w * ((wt[0] * w1) + (wt[4] * h0) + wt[12]); + vertexData[7] = w * ((wt[1] * w1) + (wt[5] * h0) + wt[13]); + z = (wt[2] * w1) + (wt[6] * h0) + wt[14]; + culled = culled || z < 0; + this.culledByFrustrum = culled; + }; + Sprite3d.prototype._calculateBounds = function () { + this.calculateVertices(); + if (this.culledByFrustrum) { + return; + } + var trim = this._texture.trim; + var orig = this._texture.orig; + if (!trim || (trim.width === orig.width && trim.height === orig.height)) { + this._bounds.addQuad(this.vertexData); + return; + } + this.calculateTrimmedVertices(); + if (!this.trimmedCulledByFrustrum) { + this._bounds.addQuad(this.vertexTrimmedData); + } + }; + Sprite3d.prototype._render = function (renderer) { + this.calculateVertices(); + if (this.culledByFrustrum) { + return; + } + renderer.batch.setObjectRenderer(renderer.plugins[this.pluginName]); + renderer.plugins[this.pluginName].render(this); + }; + Sprite3d.prototype.containsPoint = function (point) { + if (this.culledByFrustrum) { + return false; + } + return _super.prototype.containsPoint.call(this, point); + }; + Object.defineProperty(Sprite3d.prototype, "worldTransform", { + get: function () { + return this.proj.affine ? this.transform.worldTransform : this.proj.world; + }, + enumerable: false, + configurable: true + }); + Sprite3d.prototype.toLocal = function (position, from, point, skipUpdate, step) { + if (step === void 0) { step = pixi_projection.TRANSFORM_STEP.ALL; } + return pixi_projection.container3dToLocal.call(this, position, from, point, skipUpdate, step); + }; + Sprite3d.prototype.isFrontFace = function (forceUpdate) { + return pixi_projection.container3dIsFrontFace.call(this, forceUpdate); + }; + Sprite3d.prototype.getDepth = function (forceUpdate) { + return pixi_projection.container3dGetDepth.call(this, forceUpdate); + }; + Object.defineProperty(Sprite3d.prototype, "position3d", { + get: function () { + return this.proj.position; + }, + set: function (value) { + this.proj.position.copyFrom(value); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Sprite3d.prototype, "scale3d", { + get: function () { + return this.proj.scale; + }, + set: function (value) { + this.proj.scale.copyFrom(value); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Sprite3d.prototype, "euler", { + get: function () { + return this.proj.euler; + }, + set: function (value) { + this.proj.euler.copyFrom(value); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Sprite3d.prototype, "pivot3d", { + get: function () { + return this.proj.pivot; + }, + set: function (value) { + this.proj.pivot.copyFrom(value); + }, + enumerable: false, + configurable: true + }); + return Sprite3d; + }(PIXI.Sprite)); + pixi_projection.Sprite3d = Sprite3d; +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + var Text3d = (function (_super) { + __extends(Text3d, _super); + function Text3d(text, style, canvas) { + var _this = _super.call(this, text, style, canvas) || this; + _this.vertexData2d = null; + _this.proj = new pixi_projection.Projection3d(_this.transform); + _this.pluginName = 'batch2d'; + return _this; + } + Object.defineProperty(Text3d.prototype, "worldTransform", { + get: function () { + return this.proj.affine ? this.transform.worldTransform : this.proj.world; + }, + enumerable: false, + configurable: true + }); + Text3d.prototype.toLocal = function (position, from, point, skipUpdate, step) { + if (step === void 0) { step = pixi_projection.TRANSFORM_STEP.ALL; } + return pixi_projection.container3dToLocal.call(this, position, from, point, skipUpdate, step); + }; + Text3d.prototype.isFrontFace = function (forceUpdate) { + return pixi_projection.container3dIsFrontFace.call(this, forceUpdate); + }; + Text3d.prototype.getDepth = function (forceUpdate) { + return pixi_projection.container3dGetDepth.call(this, forceUpdate); + }; + Object.defineProperty(Text3d.prototype, "position3d", { + get: function () { + return this.proj.position; + }, + set: function (value) { + this.proj.position.copyFrom(value); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Text3d.prototype, "scale3d", { + get: function () { + return this.proj.scale; + }, + set: function (value) { + this.proj.scale.copyFrom(value); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Text3d.prototype, "euler", { + get: function () { + return this.proj.euler; + }, + set: function (value) { + this.proj.euler.copyFrom(value); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Text3d.prototype, "pivot3d", { + get: function () { + return this.proj.pivot; + }, + set: function (value) { + this.proj.pivot.copyFrom(value); + }, + enumerable: false, + configurable: true + }); + return Text3d; + }(PIXI.Text)); + pixi_projection.Text3d = Text3d; + Text3d.prototype.calculateVertices = pixi_projection.Sprite3d.prototype.calculateVertices; + Text3d.prototype.calculateTrimmedVertices = pixi_projection.Sprite3d.prototype.calculateTrimmedVertices; + Text3d.prototype._calculateBounds = pixi_projection.Sprite3d.prototype._calculateBounds; + Text3d.prototype.containsPoint = pixi_projection.Sprite3d.prototype.containsPoint; + Text3d.prototype._render = pixi_projection.Sprite3d.prototype._render; +})(pixi_projection || (pixi_projection = {})); +var pixi_projection; +(function (pixi_projection) { + var containerProps = { + worldTransform: { + get: pixi_projection.container3dWorldTransform, + enumerable: true, + configurable: true + }, + position3d: { + get: function () { return this.proj.position; }, + set: function (value) { this.proj.position.copy(value); } + }, + scale3d: { + get: function () { return this.proj.scale; }, + set: function (value) { this.proj.scale.copy(value); } + }, + pivot3d: { + get: function () { return this.proj.pivot; }, + set: function (value) { this.proj.pivot.copy(value); } + }, + euler: { + get: function () { return this.proj.euler; }, + set: function (value) { this.proj.euler.copy(value); } + } + }; + function convertTo3d() { + if (this.proj) + return; + this.proj = new pixi_projection.Projection3d(this.transform); + this.toLocal = pixi_projection.Container3d.prototype.toLocal; + this.isFrontFace = pixi_projection.Container3d.prototype.isFrontFace; + this.getDepth = pixi_projection.Container3d.prototype.getDepth; + Object.defineProperties(this, containerProps); + } + PIXI.Container.prototype.convertTo3d = convertTo3d; + PIXI.Sprite.prototype.convertTo3d = function () { + if (this.proj) + return; + this.calculateVertices = pixi_projection.Sprite3d.prototype.calculateVertices; + this.calculateTrimmedVertices = pixi_projection.Sprite3d.prototype.calculateTrimmedVertices; + this._calculateBounds = pixi_projection.Sprite3d.prototype._calculateBounds; + this.containsPoint = pixi_projection.Sprite3d.prototype.containsPoint; + this.pluginName = 'batch2d'; + convertTo3d.call(this); + }; + PIXI.Container.prototype.convertSubtreeTo3d = function () { + this.convertTo3d(); + for (var i = 0; i < this.children.length; i++) { + this.children[i].convertSubtreeTo3d(); + } + }; + if (PIXI.SimpleMesh) { + PIXI.SimpleMesh.prototype.convertTo3d = + PIXI.SimpleRope.prototype.convertTo3d = + function () { + if (this.proj) + return; + this.calculateVertices = pixi_projection.Mesh3d2d.prototype.calculateVertices; + this._renderDefault = pixi_projection.Mesh3d2d.prototype._renderDefault; + if (this.material.pluginName !== 'batch2d') { + this.material = new PIXI.MeshMaterial(this.material.texture, { + program: PIXI.Program.from(pixi_projection.Mesh2d.defaultVertexShader, pixi_projection.Mesh2d.defaultFragmentShader), + pluginName: 'batch2d' + }); + } + convertTo3d.call(this); + }; + } +})(pixi_projection || (pixi_projection = {})); \ No newline at end of file diff --git a/app/data/ct.libs/3d/index.js b/app/data/ct.libs/3d/index.js new file mode 100644 index 000000000..6c05fb964 --- /dev/null +++ b/app/data/ct.libs/3d/index.js @@ -0,0 +1 @@ +ct.camera3d = null; diff --git a/app/data/ct.libs/3d/injects/beforedraw.js b/app/data/ct.libs/3d/injects/beforedraw.js new file mode 100644 index 000000000..c6fd3f13d --- /dev/null +++ b/app/data/ct.libs/3d/injects/beforedraw.js @@ -0,0 +1,5 @@ +if (this.threeDEnabled && this.threeDOrientation === 'faceCamera') { + this.euler.x = ct.camera3d.euler.x; + this.euler.y = ct.camera3d.euler.y; + this.euler.z = ct.camera3d.euler.z; +} diff --git a/app/data/ct.libs/3d/injects/beforeroomoncreate.js b/app/data/ct.libs/3d/injects/beforeroomoncreate.js new file mode 100644 index 000000000..ea8e9f6fb --- /dev/null +++ b/app/data/ct.libs/3d/injects/beforeroomoncreate.js @@ -0,0 +1,12 @@ +if (ct.camera3d) { + ct.camera3d.destroy(); +} +ct.camera3d = new PIXI.projection.Camera3d(); +// Disable alignment by 2D camera +ct.camera3d.isUi = true; +ct.camera3d.position.set(ct.camera.width / 2, ct.camera.height / 2); +ct.camera3d.position3d.set(ct.camera.width / 2, ct.camera.height / 2, ct.room.threeDCameraZ); +ct.camera3d.setPlanes(1000, 10, 10000, false); +ct.pixiApp.stage.addChild(ct.camera3d); +ct.camera3d.room = new PIXI.projection.Container3d(); +ct.camera3d.addChild(ct.camera3d.room); diff --git a/app/data/ct.libs/3d/injects/htmlbottom.html b/app/data/ct.libs/3d/injects/htmlbottom.html new file mode 100644 index 000000000..7e62e9f97 --- /dev/null +++ b/app/data/ct.libs/3d/injects/htmlbottom.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/data/ct.libs/3d/injects/onbeforecreate.js b/app/data/ct.libs/3d/injects/onbeforecreate.js new file mode 100644 index 000000000..13d2d52ba --- /dev/null +++ b/app/data/ct.libs/3d/injects/onbeforecreate.js @@ -0,0 +1,24 @@ +if (this.threeDEnabled) { + this.convertTo3d(); + if (this.threeDOrientation === 'xPositive') { + this.euler.y = Math.PI / 2; + } else if (this.threeDOrientation === 'xNegative') { + this.euler.y = -Math.PI / 2; + } else if (this.threeDOrientation === 'yPositive') { + this.euler.x = Math.PI / 2; + } else if (this.threeDOrientation === 'yNegative') { + this.euler.x = -Math.PI / 2; + } else if (this.threeDOrientation === 'zNegative') { + this.euler.x = Math.PI; + } else { + this.euler.x = ct.camera3d.euler.x; + this.euler.y = ct.camera3d.euler.y; + this.euler.z = ct.camera3d.euler.z; + } + if (!ct.room.threeDFlipYZ) { + this.position3d.set(this.x, this.y, this.depth); + } else { + this.position3d.set(this.x, this.depth, this.y); + } + this.position.set(0); +} diff --git a/app/data/ct.libs/3d/injects/oncreate.js b/app/data/ct.libs/3d/injects/oncreate.js new file mode 100644 index 000000000..ed153cbeb --- /dev/null +++ b/app/data/ct.libs/3d/injects/oncreate.js @@ -0,0 +1,3 @@ +if (this.threeDEnabled) { + ct.camera3d.room.addChild(this); +} diff --git a/app/data/ct.libs/3d/module.json b/app/data/ct.libs/3d/module.json new file mode 100644 index 000000000..f80471f7b --- /dev/null +++ b/app/data/ct.libs/3d/module.json @@ -0,0 +1,58 @@ +{ + "main": { + "name": "Pseudo-3D", + "tagline": "Create a 3D-ish world from a 2D game!", + "version": "0.0.0", + "authors": [{ + "name": "Cosmo Myzrail Gorynych", + "mail": "admin@nersta.ru" + }], + "categories": [ + "fx" + ] + }, + "typeExtends": [{ + "name": "3D enabled", + "type": "checkbox", + "default": false, + "key": "threeDEnabled" + }, { + "name": "3D orientation", + "type": "radio", + "default": "zPositive", + "key": "threeDOrientation", + "options": [{ + "value": "xPositive", + "name": "X positive" + }, { + "value": "xNegative", + "name": "X negative" + }, { + "value": "yPositive", + "name": "Y positive" + }, { + "value": "yNegative", + "name": "Y negative" + }, { + "value": "zPositive", + "name": "Z positive" + }, { + "value": "zNegative", + "name": "Z negative" + }, { + "value": "faceCamera", + "name": "Face camera" + }] + }], + "roomExtends": [{ + "name": "Camera Z position", + "type": "number", + "default": 500, + "key": "threeDCameraZ" + }, { + "name": "Flip Y and Z (use it when you design 2D view as a top-down map)", + "type": "checkbox", + "default": false, + "key": "threeDFlipYZ" + }] +} diff --git a/app/data/ct.libs/3d/projection.ict b/app/data/ct.libs/3d/projection.ict new file mode 100644 index 000000000..6e4415da9 --- /dev/null +++ b/app/data/ct.libs/3d/projection.ict @@ -0,0 +1,406 @@ +ctjsVersion: 1.4.1 +notes: /* empty */ +libs: + place: + gridX: 1024 + gridY: 1024 + fittoscreen: + mode: scaleFit + mouse: {} + keyboard: {} + keyboard.polyfill: {} + sound.howler: {} + 3d: {} +textures: + - name: PlayerShip + untill: 0 + grid: + - 1 + - 1 + axis: + - 150 + - 150 + marginx: 0 + marginy: 0 + imgWidth: 300 + imgHeight: 300 + width: 300 + height: 300 + offx: 0 + offy: 0 + origname: ia91db6dd-3773-4b88-8d5c-e80080cb0b82.png + source: /home/comigo/Desktop/PlayerShip.png + shape: rect + left: 150 + right: 150 + top: 150 + bottom: 150 + uid: a91db6dd-3773-4b88-8d5c-e80080cb0b82 + padding: 1 + lastmod: 1597371073697 + - name: Comigo_Standing + untill: 0 + grid: + - 1 + - 1 + axis: + - 83 + - 373 + marginx: 0 + marginy: 0 + imgWidth: 189 + imgHeight: 394 + width: 189 + height: 394 + offx: 0 + offy: 0 + origname: i059e8892-2ffd-40c8-a97b-7645b40b3db5.png + source: /home/comigo/Downloads/Comigo_Standing.png + shape: rect + left: 83 + right: 106 + top: 373 + bottom: 21 + uid: 059e8892-2ffd-40c8-a97b-7645b40b3db5 + padding: 1 + lastmod: 1597376745239 + - name: LightPost + untill: 0 + grid: + - 1 + - 1 + axis: + - 90 + - 492 + marginx: 0 + marginy: 0 + imgWidth: 171 + imgHeight: 544 + width: 171 + height: 544 + offx: 0 + offy: 0 + origname: i2b15568d-6e42-4ecc-a301-e580291e0a9b.png + source: /home/comigo/Downloads/LightPost.png + shape: rect + left: 90 + right: 81 + top: 492 + bottom: 52 + uid: 2b15568d-6e42-4ecc-a301-e580291e0a9b + padding: 1 + lastmod: 1597376750753 + - name: SandCell + untill: 0 + grid: + - 1 + - 1 + axis: + - 128 + - 32 + marginx: 0 + marginy: 0 + imgWidth: 256 + imgHeight: 64 + width: 256 + height: 64 + offx: 0 + offy: 0 + origname: i33bda9f8-75f1-4255-b86d-e5973350fd2b.png + source: /home/comigo/Downloads/SandCell(2).png + shape: rect + left: 128 + right: 128 + top: 32 + bottom: 32 + uid: 33bda9f8-75f1-4255-b86d-e5973350fd2b + padding: 1 + lastmod: 1597379213488 + - name: SandCellSquare + untill: 0 + grid: + - 1 + - 1 + axis: + - 128 + - 128 + marginx: 0 + marginy: 0 + imgWidth: 256 + imgHeight: 256 + width: 256 + height: 256 + offx: 0 + offy: 0 + origname: i8217ffc8-5969-4237-8506-a5458d4d5e6c.png + source: /home/comigo/Downloads/SandCell.png + shape: rect + left: 128 + right: 128 + top: 128 + bottom: 128 + uid: 8217ffc8-5969-4237-8506-a5458d4d5e6c + padding: 1 + lastmod: 1597380952030 +skeletons: [] +types: + - name: Sand + depth: 0 + oncreate: this.depth = (Math.random() - 0.5) * 20; + onstep: this.move(); + ondraw: '' + ondestroy: '' + texture: 33bda9f8-75f1-4255-b86d-e5973350fd2b + extends: + threeDOrientation: zPositive + threeDEnabled: true + uid: 0ae31f06-ea0f-446a-9caa-22dba4d7cad9 + lastmod: 1597380836327 + - name: Comigo + depth: 20 + oncreate: '' + onstep: this.move(); + ondraw: '' + ondestroy: '' + texture: 059e8892-2ffd-40c8-a97b-7645b40b3db5 + extends: + threeDEnabled: true + threeDOrientation: faceCamera + uid: 312c8e4f-52cb-4f54-a3a6-9711048504d2 + lastmod: 1597381479959 + - name: Lamp + depth: 20 + oncreate: '' + onstep: this.move(); + ondraw: '' + ondestroy: '' + texture: 2b15568d-6e42-4ecc-a301-e580291e0a9b + extends: + threeDOrientation: xNegative + threeDEnabled: true + uid: 93de9f6e-dc74-4277-a778-b9b9ded16c37 + lastmod: 1597379858109 + - name: SandCellSquare + depth: 0 + oncreate: '' + onstep: this.move(); + ondraw: '' + ondestroy: '' + texture: 8217ffc8-5969-4237-8506-a5458d4d5e6c + extends: + threeDEnabled: true + threeDOrientation: yPositive + uid: 69835ba5-5fb8-49f3-bbdf-039611ba03d4 + lastmod: 1597381468223 +sounds: [] +styles: [] +rooms: + - name: Room_SideView + oncreate: '' + onstep: '' + ondraw: >- + ct.camera3d.euler.yaw += ct.delta * 0.02; + + //ct.camera3d.euler.roll = ct.u.degToRad(90); + + //ct.camera3d.euler.pitch = ct.u.degToRad(30); + + ct.camera3d.position3d.x = ct.u.ldx(1000, + ct.u.radToDeg(-ct.camera3d.euler.yaw) + 90) + ct.camera.width / 2; + + ct.camera3d.position3d.z = ct.u.ldy(1000, + ct.u.radToDeg(-ct.camera3d.euler.yaw) + 90) + ct.camera.height / 2; + onleave: '' + width: 1280 + height: 720 + backgrounds: [] + copies: + - x: 192 + 'y': 640 + uid: 0ae31f06-ea0f-446a-9caa-22dba4d7cad9 + - x: 448 + 'y': 640 + uid: 0ae31f06-ea0f-446a-9caa-22dba4d7cad9 + - x: 704 + 'y': 640 + uid: 0ae31f06-ea0f-446a-9caa-22dba4d7cad9 + - x: 960 + 'y': 640 + uid: 0ae31f06-ea0f-446a-9caa-22dba4d7cad9 + - x: 1216 + 'y': 640 + uid: 0ae31f06-ea0f-446a-9caa-22dba4d7cad9 + - x: 192 + 'y': 576 + uid: 0ae31f06-ea0f-446a-9caa-22dba4d7cad9 + - x: 192 + 'y': 512 + uid: 0ae31f06-ea0f-446a-9caa-22dba4d7cad9 + - x: 192 + 'y': 448 + uid: 0ae31f06-ea0f-446a-9caa-22dba4d7cad9 + - x: 192 + 'y': 384 + uid: 0ae31f06-ea0f-446a-9caa-22dba4d7cad9 + - x: 192 + 'y': 320 + uid: 0ae31f06-ea0f-446a-9caa-22dba4d7cad9 + - x: 192 + 'y': 256 + uid: 0ae31f06-ea0f-446a-9caa-22dba4d7cad9 + - x: 192 + 'y': 192 + uid: 0ae31f06-ea0f-446a-9caa-22dba4d7cad9 + - x: 192 + 'y': 128 + uid: 0ae31f06-ea0f-446a-9caa-22dba4d7cad9 + - x: 192 + 'y': 64 + uid: 0ae31f06-ea0f-446a-9caa-22dba4d7cad9 + - x: 448 + 'y': 64 + uid: 0ae31f06-ea0f-446a-9caa-22dba4d7cad9 + - x: 704 + 'y': 64 + uid: 0ae31f06-ea0f-446a-9caa-22dba4d7cad9 + - x: 960 + 'y': 64 + uid: 0ae31f06-ea0f-446a-9caa-22dba4d7cad9 + - x: 1216 + 'y': 64 + uid: 0ae31f06-ea0f-446a-9caa-22dba4d7cad9 + - x: 1216 + 'y': 128 + uid: 0ae31f06-ea0f-446a-9caa-22dba4d7cad9 + - x: 1216 + 'y': 192 + uid: 0ae31f06-ea0f-446a-9caa-22dba4d7cad9 + - x: 1216 + 'y': 256 + uid: 0ae31f06-ea0f-446a-9caa-22dba4d7cad9 + - x: 1216 + 'y': 320 + uid: 0ae31f06-ea0f-446a-9caa-22dba4d7cad9 + - x: 1216 + 'y': 384 + uid: 0ae31f06-ea0f-446a-9caa-22dba4d7cad9 + - x: 1216 + 'y': 448 + uid: 0ae31f06-ea0f-446a-9caa-22dba4d7cad9 + - x: 1216 + 'y': 576 + uid: 0ae31f06-ea0f-446a-9caa-22dba4d7cad9 + - x: 1216 + 'y': 512 + uid: 0ae31f06-ea0f-446a-9caa-22dba4d7cad9 + - x: 411 + 'y': 609 + uid: 312c8e4f-52cb-4f54-a3a6-9711048504d2 + - x: 994 + 'y': 592 + uid: 93de9f6e-dc74-4277-a778-b9b9ded16c37 + tiles: + - depth: -10 + tiles: [] + extends: {} + uid: 30515cf2-9b52-401c-8dc0-6ab031e8b734 + thumbnail: 6ab031e8b734 + extends: + twoPointFiveDEnabled: true + threeDCameraZ: 320 + threeDFlipYZ: false + gridX: 64 + gridY: 64 + lastmod: 1597381077221 + - name: Room_TopView + oncreate: '' + onstep: '' + ondraw: >- + ct.camera3d.euler.yaw += ct.delta * 0.02; + + //ct.camera3d.euler.roll = ct.u.degToRad(90); + + //ct.camera3d.euler.pitch = ct.u.degToRad(30); + + ct.camera3d.position3d.y = -400; + + ct.camera3d.position3d.x = ct.u.ldx(1000, + ct.u.radToDeg(-ct.camera3d.euler.yaw) + 90) + ct.camera.width / 2; + + ct.camera3d.position3d.z = ct.u.ldy(1000, + ct.u.radToDeg(-ct.camera3d.euler.yaw) + 90) + ct.camera.height / 2; + onleave: '' + width: 1280 + height: 720 + backgrounds: [] + copies: + - x: 576 + 'y': 128 + uid: 69835ba5-5fb8-49f3-bbdf-039611ba03d4 + - x: 576 + 'y': 384 + uid: 69835ba5-5fb8-49f3-bbdf-039611ba03d4 + - x: 576 + 'y': 640 + uid: 69835ba5-5fb8-49f3-bbdf-039611ba03d4 + - x: 320 + 'y': 256 + uid: 69835ba5-5fb8-49f3-bbdf-039611ba03d4 + - x: 320 + 'y': 512 + uid: 69835ba5-5fb8-49f3-bbdf-039611ba03d4 + - x: 832 + 'y': 512 + uid: 69835ba5-5fb8-49f3-bbdf-039611ba03d4 + - x: 832 + 'y': 256 + uid: 69835ba5-5fb8-49f3-bbdf-039611ba03d4 + - x: 704 + 'y': 256 + uid: 93de9f6e-dc74-4277-a778-b9b9ded16c37 + - x: 384 + 'y': 512 + uid: 312c8e4f-52cb-4f54-a3a6-9711048504d2 + tiles: + - depth: -10 + tiles: [] + extends: {} + uid: ec52dfa5-9395-44df-b2b5-e2209288edd5 + thumbnail: e2209288edd5 + extends: + twoPointFiveDEnabled: true + threeDCameraZ: -400 + threeDFlipYZ: true + gridX: 64 + gridY: 64 + lastmod: 1597381569664 +actions: [] +emitterTandems: [] +scripts: [] +starting: 0 +settings: + authoring: + author: '' + site: '' + title: '' + version: + - 0 + - 0 + - 0 + versionPostfix: '' + rendering: + usePixiLegacy: true + maxFPS: 60 + pixelatedrender: false + highDensity: true + desktopMode: maximized + export: + windows: true + linux: true + mac: true + branding: + icon: -1 + accent: '#446adb' + invertPreloaderScheme: true + fps: 30 +fonts: [] diff --git a/app/data/ct.libs/3d/projection/img/i059e8892-2ffd-40c8-a97b-7645b40b3db5.png b/app/data/ct.libs/3d/projection/img/i059e8892-2ffd-40c8-a97b-7645b40b3db5.png new file mode 100644 index 0000000000000000000000000000000000000000..ffc0138b915d9e281bf9594be4f6258dd2802902 GIT binary patch literal 17739 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

$j;ccB{87=*Qw9pGknuVIInkY#)>C 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

yBdv|3UidWoijr_`xfTdSLxLWS=nRZZ+SO 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 literal 18544 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 '' @@ -67,12 +105,21 @@ class Hotkeys { event(); } } - const elts = this.document.querySelectorAll(`[data-hotkey="${code.replace(/"/g, '\\"')}"]`); + + // querySelectorAll returns a NodeList, which is not a sortable array. Convert by spreading. + const elts = [...this.document.querySelectorAll(`[data-hotkey="${code.replace(/"/g, '\\"')}"]`)]; + + elts.sort((a, b) => getPriority(b) - getPriority(a)); if (this.scopeStack.length) { // walk from the most recent scope to the last one for (let i = this.scopeStack.length - 1; i >= 0; i--) { const scope = this.scopeStack[i]; for (const elt of elts) { + if (elt.hasAttribute('data-hotkey-require-scope') && + elt.getAttribute('data-hotkey-require-scope') !== scope + ) { + continue; + } if (!elt.closest(`[data-hotkey-scope="${scope}"]`)) { continue; } @@ -88,6 +135,9 @@ class Hotkeys { // Look for all the elements if no scope // is specified or no scoped elements were found for (const elt of elts) { + if (elt.hasAttribute('data-hotkey-require-scope')) { + continue; + } if (isFormField(elt)) { elt.focus(); } else { diff --git a/src/node_requires/resources/textures.js b/src/node_requires/resources/textures.js index 8ce205d53..ef766c2ab 100644 --- a/src/node_requires/resources/textures.js +++ b/src/node_requires/resources/textures.js @@ -218,7 +218,7 @@ const texturePostfixParser = /_(?\d+)x(?\d+)(?:@(?\d+))?$/; const isBgPostfixTester = /@bg$/; /** * Tries to load an image, then adds it to the projects and creates a thumbnail - * @param {string} src A path to the source image + * @param {string|Buffer} src A path to the source image, or a Buffer of an already read image. * @returns {Promise} A promise that resolves into the resulting texture object. */ const importImageToTexture = async src => { @@ -226,8 +226,14 @@ const importImageToTexture = async src => { path = require('path'), generateGUID = require('./../generateGUID'); const id = generateGUID(); - const dest = path.join(global.projdir, 'img', `i${id}${path.extname(src)}`); - await fs.copy(src, dest); + let dest; + if (src instanceof Buffer) { + dest = path.join(global.projdir, 'img', `i${id}.png}`); + await fs.writeFile(dest, src); + } else { + dest = path.join(global.projdir, 'img', `i${id}${path.extname(src)}`); + await fs.copy(src, dest); + } const image = document.createElement('img'); // Wait while the image is loading await new Promise((resolve, reject) => { @@ -240,9 +246,14 @@ const importImageToTexture = async src => { }; image.src = 'file://' + dest + '?' + Math.random(); }); - const texName = path.basename(src) - .replace(/\.(jpg|gif|png|jpeg)/gi, '') - .replace(/\s/g, '_'); + let texName; + if (src instanceof Buffer) { + texName = 'NewTexture'; + } else { + texName = path.basename(src) + .replace(/\.(jpg|gif|png|jpeg)/gi, '') + .replace(/\s/g, '_'); + } const obj = { name: texName, untill: 0, diff --git a/src/riotTags/texture-editor.tag b/src/riotTags/texture-editor.tag index a0044b858..e52709e1f 100644 --- a/src/riotTags/texture-editor.tag +++ b/src/riotTags/texture-editor.tag @@ -115,7 +115,21 @@ texture-editor.panel.view svg.feather use(xlink:href="data/icons.svg#folder") span {voc.replacetexture} - .button.inline(title="{voc.reimport}" if="{opts.texture.source}" onclick="{reimport}") + .button.inline( + title="{voc.updateFromClipboard} (Control+V)" + onclick="{paste}" + data-hotkey="Control+v" + data-hotkey-require-scope="texture" + data-hotkey-priority="10" + ) + svg.feather + use(xlink:href="data/icons.svg#clipboard") + .button.inline( + if="{opts.texture.source}" + title="{voc.reimport} (Control+R)" + onclick="{reimport}" + data-hotkey="Control+r" + ) svg.feather use(xlink:href="data/icons.svg#refresh-ccw") .textureview-zoom @@ -271,7 +285,6 @@ texture-editor.panel.view const val = this.refs.textureReplacer.files[0].path; if (/\.(jpg|gif|png|jpeg)/gi.test(val)) { this.loadImg( - this.texture.uid, val, global.projdir + '/img/i' + this.texture.uid + path.extname(val) ); @@ -283,22 +296,37 @@ texture-editor.panel.view }; this.reimport = () => { this.loadImg( - this.texture.uid, this.texture.source, global.projdir + '/img/i' + this.texture.uid + path.extname(this.texture.source) ); }; + this.paste = async () => { + const png = nw.Clipboard.get().get('png'); + if (!png) { + alertify.error(this.vocGlob.couldNotLoadFromClipboard); + return; + } + const imageBase64 = png.replace(/^data:image\/\w+;base64,/, ''); + const imageBuffer = new Buffer(imageBase64, 'base64'); + this.loadImg( + imageBuffer, + global.projdir + '/img/i' + this.texture.uid + '.png' + ); + alertify.success(this.vocGlob.pastedFromClipboard); + }; /** - * Загружает изображение в редактор и генерирует квадратную превьюху из исходного изображения - * @param {Number} uid Идентификатор изображения - * @param {String} filename Путь к исходному изображению - * @param {Sting} dest Путь к изображению в папке проекта + * Loads an image into the project, generating thumbnails and updating the preview. + * @param {String|Buffer} filename A source image. It can be either a full path in a file system, + * or a buffer. + * @param {Sting} dest The path to write to. */ - this.loadImg = (uid, filename, dest) => { - fs.copy(filename, dest, e => { - if (e) { - throw e; + this.loadImg = async (filename, dest) => { + try { + if (filename instanceof Buffer) { + await fs.writeFile(dest, filename); + } else { + await fs.copy(filename, dest); } const image = document.createElement('img'); image.onload = () => { @@ -332,7 +360,11 @@ texture-editor.panel.view alertify.error(e); }; image.src = 'file://' + dest + '?' + Math.random(); - }); + + } catch (e) { + alertify.error(e); + throw e; + } }; this.textureToggleZoom = zoom => () => { diff --git a/src/riotTags/textures-panel.tag b/src/riotTags/textures-panel.tag index 9cad9837a..f055d16bb 100644 --- a/src/riotTags/textures-panel.tag +++ b/src/riotTags/textures-panel.tag @@ -10,7 +10,7 @@ textures-panel.panel.view thumbnails="{thumbnails}" ref="textures" ) - label.file.flexfix-header + label.file.inlineblock input(type="file" multiple accept=".png,.jpg,.jpeg,.bmp,.gif,.json" onchange="{parent.textureImport}") @@ -18,6 +18,14 @@ textures-panel.panel.view svg.feather use(xlink:href="data/icons.svg#download") span {voc.import} + button( + onclick="{parent.pasteTexture}" + title="{voc.importFromClipboard}" + data-hotkey="Control+v" + data-hotkey-require-scope="texture" + ) + svg.feather + use(xlink:href="data/icons.svg#clipboard") asset-viewer( collection="{global.currentProject.skeletons}" contextmenu="{showSkeletonPopup}" @@ -138,6 +146,19 @@ textures-panel.panel.view e.preventDefault(); }; + this.pasteTexture = () => { + const png = nw.Clipboard.get().get('png'); + if (!png) { + alertify.error(this.vocGlob.couldNotLoadFromClipboard); + return; + } + const imageBase64 = png.replace(/^data:image\/\w+;base64,/, ''); + const imageBuffer = new Buffer(imageBase64, 'base64'); + const {importImageToTexture} = require('./data/node_requires/resources/textures'); + importImageToTexture(imageBuffer); + alertify.success(this.vocGlob.pastedFromClipboard); + }; + this.loadSkeleton = (uid, filename, dest) => { fs.copy(filename, dest) .then(() => fs.copy(filename.replace('_ske.json', '_tex.json'), dest.replace('_ske.json', '_tex.json'))) diff --git a/src/styl/hvost.styl b/src/styl/hvost.styl index f6097ed57..f16476735 100644 --- a/src/styl/hvost.styl +++ b/src/styl/hvost.styl @@ -112,13 +112,14 @@ textarea border-radius 100% /* display modifiers */ -.block +/* use double-classing to ensure higher priority over other user-defined CSS rules */ +.block.block display block -.inline +.inline.inline display inline -.inlineblock +.inlineblock.inlineblock display inline-block -.relative +.relative.relative position relative /* color modifiers */ .red From 18e15d7cbdcb4652a7f8adc79b96dc2dddab43d0 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Thu, 20 Aug 2020 17:26:46 +1200 Subject: [PATCH 37/74] :pencil: Add a readme.md to ct.3d --- app/data/ct.libs/3d/README.md | 41 +++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 app/data/ct.libs/3d/README.md diff --git a/app/data/ct.libs/3d/README.md b/app/data/ct.libs/3d/README.md new file mode 100644 index 000000000..78cea4eb0 --- /dev/null +++ b/app/data/ct.libs/3d/README.md @@ -0,0 +1,41 @@ +# 3D Projection + +> Warning: this module is in its early stages, it is more a proof of concept than a thing to be used. +> It does render stuff, but doesn't hide items behind the camera. +> It also has a drawback: as ct.js v1.x uses AnimatedSprite for everything and the underlying projection module +> doesn't support them, all the copies are transfromed as parallelograms. + +> Oh, and there is still no `ct.place3d` or such. + +> And no support for tiles. Yet. + +## The Axes + +Initially, the camera looks along the Z axis. + +* X points to the right; +* Y points downwards; +* Z points forwards. + +## The Idea + +Rooms are still designed in 2D space. Making a full-featured room editor would be a pain. +The module needs to transform these 2D rooms into 3D space. A number of rules are applied: + +* X coordinate is remained as is. +* If the 2D room is a side-view level, Y is left as is, and Z coordinate is set by the Depth property. +* If the 2D room is a top-down level, 2D Y axis becomes Z, and Y in 3D is set by the negated Depth property. + +You can set whether a room is a side-view or a top-down level in a room's settings tab. + +## 3D Camera + +A new object `ct.camera3d` is added. Use it to position the camera in the 3D world. It has all the properties listed below. + +## 3D transforms + +`this.x`, `this.y`, `this.position`, `this.rotation` and `this.scale` still exist, but they should not be used. Instead, + +* Use `this.position3d` with `x`, `y` and `z` parameters to position objects. +* Use `this.euler` with `pitch`, `yaw` and `roll` parameters to rotate them. +* Use `this.scale3d` with `x`, `y` and `z` parameters to scale stuff. \ No newline at end of file From 4213fccb546e7301c8e6b847060e412661940bcf Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Thu, 20 Aug 2020 17:27:13 +1200 Subject: [PATCH 38/74] :bento: Bump various catmods' versions --- app/data/ct.libs/fittoscreen/module.json | 2 +- app/data/ct.libs/flow/module.json | 2 +- app/data/ct.libs/keyboard.legacy/module.json | 1 + app/data/ct.libs/mouse.legacy/module.json | 1 + app/data/ct.libs/place.legacy/module.json | 1 + app/data/ct.libs/tween/module.json | 2 +- app/data/ct.libs/yarn/module.json | 2 +- 7 files changed, 7 insertions(+), 4 deletions(-) diff --git a/app/data/ct.libs/fittoscreen/module.json b/app/data/ct.libs/fittoscreen/module.json index e22a4d6a5..988bc26dc 100644 --- a/app/data/ct.libs/fittoscreen/module.json +++ b/app/data/ct.libs/fittoscreen/module.json @@ -2,7 +2,7 @@ "main": { "name": "Fit to Screen", "tagline": "Do nothing and watch your game adapt to any resolution :)", - "version": "4.0.0", + "version": "4.1.0", "authors": [{ "name": "Cosmo Myzrail Gorynych", "mail": "admin@nersta.ru" diff --git a/app/data/ct.libs/flow/module.json b/app/data/ct.libs/flow/module.json index 887978bc4..3e368f29b 100644 --- a/app/data/ct.libs/flow/module.json +++ b/app/data/ct.libs/flow/module.json @@ -2,7 +2,7 @@ "main": { "name": "Flow control and timing", "tagline": "Add high-level methods for asynchronous events, e.g. gate, cumulative delay, retriggerable delay.", - "version": "0.0.0", + "version": "1.0.0", "authors": [{ "name": "Cosmo Myzrail Gorynych", "mail": "admin@nersta.ru" diff --git a/app/data/ct.libs/keyboard.legacy/module.json b/app/data/ct.libs/keyboard.legacy/module.json index da667b9d9..46153202d 100644 --- a/app/data/ct.libs/keyboard.legacy/module.json +++ b/app/data/ct.libs/keyboard.legacy/module.json @@ -3,6 +3,7 @@ "name": "Keyboard (legacy)", "tagline": "The old implementation of ct.keyboard that did not support Actions system.", "version": "2.0.0", + "deprecated": true, "authors": [{ "name": "Cosmo Myzrail Gorynych", "mail": "admin@nersta.ru" diff --git a/app/data/ct.libs/mouse.legacy/module.json b/app/data/ct.libs/mouse.legacy/module.json index 77c461732..cebc3e311 100644 --- a/app/data/ct.libs/mouse.legacy/module.json +++ b/app/data/ct.libs/mouse.legacy/module.json @@ -3,6 +3,7 @@ "name": "Mouse Input (legacy)", "tagline": "A deprecated module to listen to mouse events; does not work with Actions system.", "version": "1.0.0", + "deprecated": true, "authors": [{ "name": "Cosmo Myzrail Gorynych", "mail": "admin@nersta.ru" diff --git a/app/data/ct.libs/place.legacy/module.json b/app/data/ct.libs/place.legacy/module.json index 9fe373b9d..e50bace58 100644 --- a/app/data/ct.libs/place.legacy/module.json +++ b/app/data/ct.libs/place.legacy/module.json @@ -3,6 +3,7 @@ "name": "ct.place", "tagline": "Old, unoptimized version of collision library.", "version": "2.1.0", + "deprecated": true, "authors": [{ "name": "Cosmo Myzrail Gorynych", "mail": "admin@nersta.ru" diff --git a/app/data/ct.libs/tween/module.json b/app/data/ct.libs/tween/module.json index 7dd9a3f5b..17695dd82 100644 --- a/app/data/ct.libs/tween/module.json +++ b/app/data/ct.libs/tween/module.json @@ -2,7 +2,7 @@ "main": { "name": "ct.tween", "tagline": "Animate values through time with different interpolation curves.", - "version": "0.0.1", + "version": "1.0.0", "authors": [{ "name": "Cosmo Myzrail Gorynych", "mail": "admin@nersta.ru" diff --git a/app/data/ct.libs/yarn/module.json b/app/data/ct.libs/yarn/module.json index 428675dde..473242e44 100644 --- a/app/data/ct.libs/yarn/module.json +++ b/app/data/ct.libs/yarn/module.json @@ -2,7 +2,7 @@ "main": { "name": "ct.yarn", "tagline": "Use YarnSpinner projects to create interactive dialogues in your game.", - "version": "0.0.0", + "version": "1.0.0", "authors": [{ "name": "Cosmo Myzrail Gorynych", "mail": "admin@nersta.ru" From 3c0e68dd6f1f247947d1a00ce830aaa50bf0738a Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Thu, 20 Aug 2020 17:52:24 +1200 Subject: [PATCH 39/74] :sparkles: Seeded random for ct.random module Closes #187 --- app/data/ct.libs/random/README.md | 39 ++++++++++++--- app/data/ct.libs/random/index.js | 76 +++++++++++++++++++----------- app/data/ct.libs/random/types.d.ts | 9 ++++ 3 files changed, 89 insertions(+), 35 deletions(-) diff --git a/app/data/ct.libs/random/README.md b/app/data/ct.libs/random/README.md index 16c94c049..359f75ce2 100644 --- a/app/data/ct.libs/random/README.md +++ b/app/data/ct.libs/random/README.md @@ -1,21 +1,46 @@ # ct.random - This module contains handy functions for generating something random. -## `ct.random(x)` +## Basic methods + +### `ct.random(x)` Returns a random float value between 0 and x, exclusive. -## `ct.random.dice(dice1,dice2,...diceN)` +### `ct.random.dice(dice1,dice2,...diceN)` Returns a random given argument. -## `ct.random.range(x1, x2)` +### `ct.random.range(x1, x2)` Returns a random float value between `x1` and `x2`, exclusive. -## `ct.random.deg()` +### `ct.random.deg()` Returns a random float value between 0 and 360, exclusive. -## `ct.random.coord()` +### `ct.random.coord()` Returns a pair of random coordinates from 0 to a corresponding room side. -## `ct.random.chance(x[, y])` +### `ct.random.chance(x[, y])` When given both `x` and `y`, randomly returns `true` approximately `x` times out of `y`. When given only a value between 0…100, returns `true` approximately `x` times out of 100. E.g. `ct.random.chance(30)` means a 30% success rate. + +## Seeded random + +`ct.random` has an initialized seeded random number generator that is persistent across systems and game runs, and also allows creating new random number generators that won't affect the global one. They all use Mulberry32 under the hood. + +### `ct.random.seeded()` + +Returns next seeded random number. + +### `ct.random.setSeed(seed)` + +Sets the seed of the `ct.random.seeded()` method. + +### `ct.random.createSeededRandomizer(startingSeed)` + +Creates a new seeded random number generator. It is a function that you can store and use in the same way as `ct.random.seeded()`: + +```js +this.randomizer = ct.random.createSeededRandomizer(456852); +// Will output the same numbers on each run +console.log(this.randomizer()); +console.log(this.randomizer()); +console.log(this.randomizer()); +``` \ No newline at end of file diff --git a/app/data/ct.libs/random/index.js b/app/data/ct.libs/random/index.js index fdb7c0a66..96c38ba81 100644 --- a/app/data/ct.libs/random/index.js +++ b/app/data/ct.libs/random/index.js @@ -1,28 +1,48 @@ -/* global ct */ - -ct.random = function (x) { - return Math.random()*x; -}; -ct.u.ext(ct.random,{ - dice() { - return arguments[Math.floor(Math.random() * arguments.length)]; - }, - range(x1, x2) { - return x1 + Math.random() * (x2-x1); - }, - deg() { - return Math.random()*360; - }, - coord() { - return [Math.floor(Math.random()*ct.width),Math.floor(Math.random()*ct.height)]; - }, - chance(x, y) { - if (y) { - return (Math.random()*y < x); - } - return (Math.random()*100 < x); - }, - from(arr) { - return arr[Math.floor(Math.random() * arr.length)]; - } -}); +/* eslint-disable no-mixed-operators */ +/* eslint-disable no-bitwise */ +ct.random = function random(x) { + return Math.random() * x; +}; +ct.u.ext(ct.random, { + dice(...variants) { + return variants[Math.floor(Math.random() * variants.length)]; + }, + range(x1, x2) { + return x1 + Math.random() * (x2 - x1); + }, + deg() { + return Math.random() * 360; + }, + coord() { + return [Math.floor(Math.random() * ct.width), Math.floor(Math.random() * ct.height)]; + }, + chance(x, y) { + if (y) { + return (Math.random() * y < x); + } + return (Math.random() * 100 < x); + }, + from(arr) { + return arr[Math.floor(Math.random() * arr.length)]; + }, + // Mulberry32, by bryc from https://stackoverflow.com/a/47593316 + createSeededRandomizer(a) { + return function seededRandomizer() { + var t = a += 0x6D2B79F5; + t = Math.imul(t ^ t >>> 15, t | 1); + t ^= t + Math.imul(t ^ t >>> 7, t | 61); + return ((t ^ t >>> 14) >>> 0) / 4294967296; + }; + } +}); +{ + const handle = {}; + handle.currentRootRandomizer = ct.random.createSeededRandomizer(456852); + ct.random.seeded = function seeded() { + return handle.currentRootRandomizer(); + }; + ct.random.setSeed = function setSeed(seed) { + handle.currentRootRandomizer = ct.random.createSeededRandomizer(seed); + }; + ct.random.setSeed(9323846264); +} diff --git a/app/data/ct.libs/random/types.d.ts b/app/data/ct.libs/random/types.d.ts index 10517a17d..cf71a9654 100644 --- a/app/data/ct.libs/random/types.d.ts +++ b/app/data/ct.libs/random/types.d.ts @@ -23,5 +23,14 @@ declare namespace ct { /** When given both `x` and `y`, randomly returns `true` approximately `x` times out of `y`. When given only a value between 0…100, returns `true` approximately `x` times out of 100. E.g. `ct.random.chance(30)` means a 30% success rate. */ function chance(x: number, y?: number): boolean; + + /** Returns next seeded random number. */ + function seeded(): number; + + /** Sets the seed of the `ct.random.seeded()` method. */ + function setSeed(seed: number): void; + + /** Creates a new seeded random number generator. It is a function that you can store and use in the same way as `ct.random.seeded()`. */ + function createSeededRandomizer(seed: number): Function; } } \ No newline at end of file From 9b43737aec309858ad0317d1bbb32a137386f8bf Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Thu, 20 Aug 2020 18:57:51 +1200 Subject: [PATCH 40/74] :construction: ct.camera3d.follow --- app/data/ct.libs/3d/injects/beforeroomdraw.js | 8 ++++++++ .../ct.libs/3d/injects/beforeroomoncreate.js | 3 +++ app/data/ct.libs/3d/injects/onbeforecreate.js | 4 ++-- app/data/ct.libs/3d/projection.ict | 19 ++++++++++-------- .../3d/projection/img/r6ab031e8b734.png | Bin 14104 -> 19599 bytes .../3d/projection/img/re2209288edd5.png | Bin 14104 -> 15543 bytes app/data/ct.libs/3d/projection/img/splash.png | Bin 14104 -> 15543 bytes app/data/ct.libs/3d/types.d.ts | 4 ++++ 8 files changed, 28 insertions(+), 10 deletions(-) diff --git a/app/data/ct.libs/3d/injects/beforeroomdraw.js b/app/data/ct.libs/3d/injects/beforeroomdraw.js index 7fcdfef6b..fa592500d 100644 --- a/app/data/ct.libs/3d/injects/beforeroomdraw.js +++ b/app/data/ct.libs/3d/injects/beforeroomdraw.js @@ -5,4 +5,12 @@ if (this === ct.room) { ct.camera3d.room.children.sort(function sortByDepth(a, b) { return b.distanceToCamera - a.distanceToCamera; }); + if (ct.camera3d.follow) { + const {follow} = ct.camera3d; + ct.camera3d.position3d.set( + follow.x + ct.camera3d.shiftX, + follow.y + ct.camera3d.shiftY, + follow.z + ct.camera3d.shiftZ + ); + } } diff --git a/app/data/ct.libs/3d/injects/beforeroomoncreate.js b/app/data/ct.libs/3d/injects/beforeroomoncreate.js index ea8e9f6fb..51144b1ed 100644 --- a/app/data/ct.libs/3d/injects/beforeroomoncreate.js +++ b/app/data/ct.libs/3d/injects/beforeroomoncreate.js @@ -6,6 +6,9 @@ ct.camera3d = new PIXI.projection.Camera3d(); ct.camera3d.isUi = true; ct.camera3d.position.set(ct.camera.width / 2, ct.camera.height / 2); ct.camera3d.position3d.set(ct.camera.width / 2, ct.camera.height / 2, ct.room.threeDCameraZ); +ct.camera3d.follow = null; +ct.camera3d.shiftX = ct.camera3d.shiftY = ct.camera3d.shiftY = 0; +console.log('heyoo'); ct.camera3d.setPlanes(1000, 10, 10000, false); ct.pixiApp.stage.addChild(ct.camera3d); ct.camera3d.room = new PIXI.projection.Container3d(); diff --git a/app/data/ct.libs/3d/injects/onbeforecreate.js b/app/data/ct.libs/3d/injects/onbeforecreate.js index 13d2d52ba..d32d0594b 100644 --- a/app/data/ct.libs/3d/injects/onbeforecreate.js +++ b/app/data/ct.libs/3d/injects/onbeforecreate.js @@ -16,9 +16,9 @@ if (this.threeDEnabled) { this.euler.z = ct.camera3d.euler.z; } if (!ct.room.threeDFlipYZ) { - this.position3d.set(this.x, this.y, this.depth); + this.position3d.set(this.x, this.y, -this.depth); } else { - this.position3d.set(this.x, this.depth, this.y); + this.position3d.set(this.x, -this.depth, this.y); } this.position.set(0); } diff --git a/app/data/ct.libs/3d/projection.ict b/app/data/ct.libs/3d/projection.ict index 347bcfc2a..e3cefaabf 100644 --- a/app/data/ct.libs/3d/projection.ict +++ b/app/data/ct.libs/3d/projection.ict @@ -155,9 +155,9 @@ types: threeDOrientation: zPositive threeDEnabled: true uid: 0ae31f06-ea0f-446a-9caa-22dba4d7cad9 - lastmod: 1597380836327 + lastmod: 1597543642495 - name: Comigo - depth: -40 + depth: 20 oncreate: '' onstep: this.move(); ondraw: '' @@ -167,9 +167,9 @@ types: threeDEnabled: true threeDOrientation: faceCamera uid: 312c8e4f-52cb-4f54-a3a6-9711048504d2 - lastmod: 1597381479959 + lastmod: 1597543647148 - name: Lamp - depth: -40 + depth: 40 oncreate: '' onstep: this.move(); ondraw: '' @@ -179,7 +179,7 @@ types: threeDOrientation: xNegative threeDEnabled: true uid: 93de9f6e-dc74-4277-a778-b9b9ded16c37 - lastmod: 1597541560523 + lastmod: 1597543640263 - name: SandCellSquare depth: 0 oncreate: '' @@ -191,7 +191,7 @@ types: threeDEnabled: true threeDOrientation: yPositive uid: 69835ba5-5fb8-49f3-bbdf-039611ba03d4 - lastmod: 1597381468223 + lastmod: 1597543644918 sounds: [] styles: [] rooms: @@ -311,7 +311,8 @@ rooms: threeDFlipYZ: false gridX: 64 gridY: 64 - lastmod: 1597381077221 + lastmod: 1597543621151 + backgroundColor: '#85C2FF' - name: Room_TopView oncreate: '' onstep: '' @@ -373,7 +374,8 @@ rooms: threeDFlipYZ: true gridX: 64 gridY: 64 - lastmod: 1597381569664 + lastmod: 1597543695973 + backgroundColor: '#72A0AB' actions: [] emitterTandems: [] scripts: [] @@ -404,3 +406,4 @@ settings: invertPreloaderScheme: true fps: 30 fonts: [] +palette: [] diff --git a/app/data/ct.libs/3d/projection/img/r6ab031e8b734.png b/app/data/ct.libs/3d/projection/img/r6ab031e8b734.png index 57a09843e75a23547cf29cc658759ddc94278814..6cf1625644ed15af0790e3c5aa8d0297ada25a50 100644 GIT binary patch literal 19599 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 literal 14104 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⪻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 SDda#hii(1Ue7UT}`~L%j7>2C? literal 14104 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⪻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 SDda#hii(1Ue7UT}`~L%j7>2C? literal 14104 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⪻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, anchor: IPoint, out: IPoint): IPoint; } + +namespace ct { + camera3d: Camera3d +} From fe1ef7f766f56656ba5858370b44323596fecf76 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Thu, 20 Aug 2020 19:00:20 +1200 Subject: [PATCH 41/74] :bug: Fix linter warnings --- src/riotTags/texture-editor.tag | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/riotTags/texture-editor.tag b/src/riotTags/texture-editor.tag index e52709e1f..ce2a37852 100644 --- a/src/riotTags/texture-editor.tag +++ b/src/riotTags/texture-editor.tag @@ -300,7 +300,7 @@ texture-editor.panel.view global.projdir + '/img/i' + this.texture.uid + path.extname(this.texture.source) ); }; - this.paste = async () => { + this.paste = () => { const png = nw.Clipboard.get().get('png'); if (!png) { alertify.error(this.vocGlob.couldNotLoadFromClipboard); @@ -360,7 +360,6 @@ texture-editor.panel.view alertify.error(e); }; image.src = 'file://' + dest + '?' + Math.random(); - } catch (e) { alertify.error(e); throw e; From 6697a217b75dc8dff8dd2a2834abb2c6bf193f31 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Fri, 21 Aug 2020 18:08:37 +1200 Subject: [PATCH 42/74] :zap: Update Russian UI translation --- app/data/i18n/Russian.json | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/app/data/i18n/Russian.json b/app/data/i18n/Russian.json index 6754787d8..84b488b65 100644 --- a/app/data/i18n/Russian.json +++ b/app/data/i18n/Russian.json @@ -15,6 +15,7 @@ "contribute": "Внести вклад в разработку", "copy": "Копировать", "copyName": "Скопировать название", + "couldNotLoadFromClipboard": "Не получилось загрузить данные из буфера обмена", "ctsite": "Домашняя страница ct.js", "cut": "Вырезать", "delete": "Удалить", @@ -38,6 +39,7 @@ "open": "Открыть", "openproject": "Открыть проект…", "paste": "Вставить", + "pastedFromClipboard": "Добавлено из буфера обмена", "reallyexit": "Вы уверены, что хотите выйти? Все несохранённые данные будут потеряны!", "rename": "Переименовать", "save": "Сохранить", @@ -154,7 +156,8 @@ "restart": "Перезапустить", "themeLucasDracula": "Люкас Дракула", "openProject": "Открыть проект…", - "openExample": "Открыть пример…" + "openExample": "Открыть пример…", + "disableSounds": "Отключить звуки интерфейса" }, "onboarding": { "hoorayHeader": "Ух-ты! Мы сделали новый проект!", @@ -201,6 +204,7 @@ "highDensity": "Поддерживать высокую плотность пикселей (напр. на ретина-экранах)", "maxFPS": "Максмальная частота кадров:", "pixelatedrender": "Здесь и в проекте отключать сглаживание (сохранять пиксели)", + "hideCursor": "Спрятать системный курсор", "usePixiLegacy": "Добавить рендерер на HTMLCanvas для поддержки старых браузеров и видеокарт (добавляет ~20kb к весу игры)", "desktopBuilds": "Сборки для ПК", "launchMode": "Запустить в режиме:", @@ -258,7 +262,8 @@ "create": "Создать", "import": "Импорт", "skeletons": "Скелетная анимация", - "createType": "Создать тип с этой текстурой" + "createType": "Создать тип с этой текстурой", + "importFromClipboard": "Импортировать из буфера обмена" }, "textureview": { "bgcolor": "Сменить цвет фона", @@ -278,6 +283,7 @@ "speed": "Скорость превью:", "tiled": "Использовать как фон?", "replacetexture": "Заменить…", + "updateFromClipboard": "Обновить из буфера обмена", "corrupted": "Файл изображения повреждён или отсутствует! Невозможно открыть спрайт.", "showmask": "Показать маску", "width": "Ширина:", @@ -295,7 +301,8 @@ "reimport": "Обновить", "symmetryTool": "Симметрия", "padding": "Отбивка:", - "paddingNotice": "Влияет на то, как текстура экспортируется: дублирует пиксели по краям, чтобы избежать артефактов грязных краёв на повторяющихся и уменьшенных изображениях. Обычно значения по-умолчанию достаточно, но если сильно уменьшить текстуру в игре, эффект может вернуться. Увеличьте значение этого поля, если замечаете грязные края у этой текстуры в игре." + "paddingNotice": "Влияет на то, как текстура экспортируется: дублирует пиксели по краям, чтобы избежать артефактов грязных краёв на повторяющихся и уменьшенных изображениях. Обычно значения по-умолчанию достаточно, но если сильно уменьшить текстуру в игре, эффект может вернуться. Увеличьте значение этого поля, если замечаете грязные края у этой текстуры в игре.", + "previewAnimationNotice": "Это предпросмотр. Чтобы изменить скорость анимации у настоящих копий, используйте this.animationSpeed." }, "sounds": { "create": "Создать" @@ -463,7 +470,10 @@ "parallax": "Параллакс (по X, Y):", "repeat": "Повторять:", "scale": "Размер (по X, Y):", - "shift": "Сдвиг (по X, Y):" + "shift": "Сдвиг (по X, Y):", + "notBackgroundTextureWarning": "Эта текстура не отмечена как фон. В игре у неё будут повторяющиеся разрывы.", + "fixBackground": "Исправить.", + "dismissWarning": "Скрыть предупреждение." }, "roomtiles": { "moveTileLayer": "Переместить на другую глубину", @@ -478,6 +488,7 @@ "events": "События комнаты", "copies": "Копии", "backgrounds": "Фоны", + "backgroundColor": "Цвет фона", "tiles": "Плитки", "add": "Добавить", "none": "Ничего", From 7f04e301a95d52f7e0f0d6936ea95e686524aed6 Mon Sep 17 00:00:00 2001 From: Julian Webb Date: Sun, 23 Aug 2020 14:39:45 -0700 Subject: [PATCH 43/74] :zap: Change ct.fs to use app data directories for Linux, Windows, macOS (#226 by @JulianWebb) --- app/data/ct.libs/fs/DOCS.md | 3 ++ app/data/ct.libs/fs/README.md | 17 ++++++-- app/data/ct.libs/fs/index.js | 72 +++++++++++++++++++++++++++++----- app/data/ct.libs/fs/types.d.ts | 10 +++++ 4 files changed, 89 insertions(+), 13 deletions(-) diff --git a/app/data/ct.libs/fs/DOCS.md b/app/data/ct.libs/fs/DOCS.md index c30bd3db3..5a6428916 100644 --- a/app/data/ct.libs/fs/DOCS.md +++ b/app/data/ct.libs/fs/DOCS.md @@ -3,6 +3,9 @@ When set to `true`, any operations towards files outside the game's save directory will fail. Set to `true` by default. +## `ct.fs.isAvailable: boolean` +When set to `false`, the game is running in a way that disallows access to the filesystem (such as a web release) + ## `ct.fs.save(filename: string, data: object|Array): Promise` Saves an object/array to a file. diff --git a/app/data/ct.libs/fs/README.md b/app/data/ct.libs/fs/README.md index 3dc9785bf..5216f29a4 100644 --- a/app/data/ct.libs/fs/README.md +++ b/app/data/ct.libs/fs/README.md @@ -1,12 +1,21 @@ -A module that provides a uniform API for storing and loading data for your desktop games. +A module that provides a uniform API for storing and loading data for games exported for desktop. It allows you to easily save and load JSON objects, as well as plain text data. -JSON objects are regular JavaScript objects, but without functions, Date objects, RegExps, circular references, and some other advanced stuff. If your variable consists of other objects, arrays, strings, numbers and boolean, it can be safely stored, and loaded later in the same form. Thus, they are great for saving your game state. +[JSON objects](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON) are regular JavaScript objects, but without functions, Date objects, RegExps, circular references, and some other advanced stuff. If your variable consists of other objects, arrays, strings, numbers and boolean, it can be safely stored, and loaded later in the same form. Thus, they are great for saving your game state. -By default, all the file operations will be performed relative to a special directory created for your game, which is templated as a `${User's home directory}/${Author name from the settings tab}/${Project's name from the same tab}`, e.g. `/home/comigo/Cosmo Myzrail Gorynych/Platformer complete tutorial` on a Linux machine. You can inspect this behavior by calling `ct.fs.getPath(...)`, or simply by reading ct.fs.gameFolder parameter. +By default, all file operations will be done under the application data directory on the player's system. For Windows this will be `%AppData%`, Linux will be `$XDG_DATA_HOME` (or `$HOME/.local/share` if unset), and macOS will be `$HOME/Library/Application Support`. For other operating systems, the player's home directory will be used instead. -This behavior can be changed by setting `ct.fs.gameFolder`, but it's not recommended unless you changed your meta fields and need to preserved user's data. +Within the application directory, ct.js will create a path using the defined Author Name and Project Name. If both are set, then the path would be `${Application Data Path}/${Author Name}/${Project Name}`, if only the Project Name is set, it would be `${Application Data Path}/${Project Name}`. + +> **For Example**: If a player with the name `naturecodevoid` was running the game `jettyCat` by `comigo` on Linux, the default directory would be: + `/home/naturecodevoid/.local/share/comigo/jettyCat` + + You can verify this by calling `ct.fs.getPath('')` or by checking the variable `ct.fs.gameFolder`. + +It is not recommended, but you can set `ct.fs.gameFolder` to a different directory. This is useful if your meta fields (Author Name, Project Name) have changed, but you wish to preserve user data. + +Also to note, operations outside of the game folder are not recommended and by default are not allowed, causing an error to appear in the game's console. To allow operations outside of the game folder set `ct.fs.forceLocal` to `false` first. Every action in `ct.fs` is asynchronous so that a game stays responsive even on heavy loads, and thus you have to use JS Promises. This is not hard, though: diff --git a/app/data/ct.libs/fs/index.js b/app/data/ct.libs/fs/index.js index cac14b7e7..9611a5480 100644 --- a/app/data/ct.libs/fs/index.js +++ b/app/data/ct.libs/fs/index.js @@ -2,21 +2,74 @@ /* eslint-disable no-console */ try { + // This will fail when in a browser so no browser checking required const fs = require('fs').promises; const path = require('path'); + // Like an enum, but not. + const operatingSystems = { + Windows: 'win', + macOS: 'mac', + ChromeOS: 'cros', + Linux: 'linux', + iOS: 'ios', + Android: 'android' + }; + // The `HOME` variable is not always available in ct.js on Windows const home = process.env.HOME || ((process.env.HOMEDRIVE || '') + process.env.HOMEPATH); + // Borrowed from keyboard.polyfill + const contains = function contains(s, ss) { + return String(s).indexOf(ss) !== -1; + }; + + const operatingSystem = (function getOperatingSystem() { + if (contains(navigator.platform, 'Win')) { + return operatingSystems.Windows; + } + if (contains(navigator.platform, 'Mac')) { + return operatingSystems.macOS; + } + if (contains(navigator.platform, 'CrOS')) { + return operatingSystems.ChromeOS; + } + if (contains(navigator.platform, 'Linux')) { + return operatingSystems.Linux; + } + if (contains(navigator.userAgent, 'iPad') || contains(navigator.platform, 'iPod') || contains(navigator.platform, 'iPhone')) { + return operatingSystems.iOS; + } + return ''; + }()); + + + const getAppData = (home, operatingSystem) => { + switch (operatingSystem) { + case operatingSystems.Windows: + return process.env.AppData; + case operatingSystems.macOS: + return `${home}/Library/Application Support`; + case operatingSystems.Linux: + return process.env.XDG_DATA_HOME || `${home}/.local/share`; + // Don't know what to do for ChromeOS or iOS, do they use AppData or + // Should those default to LocalStorage? + default: + return home; + } + }; + + const appData = getAppData(home, operatingSystem); + const getPath = dest => { - const d = path.isAbsolute(dest)? dest : path.join(ct.fs.gameFolder, dest); + const absoluteDest = path.isAbsolute(dest) ? dest : path.join(ct.fs.gameFolder, dest); if (ct.fs.forceLocal) { - if (d.indexOf(ct.fs.gameFolder) !== 0) { + if (absoluteDest.indexOf(ct.fs.gameFolder) !== 0) { throw new Error('[ct.fs] Operations outside the save directory are not permitted by default due to safety concerns. If you do need to work outside the save directory, change `ct.fs.forceLocal` to `false`. ' + - `The save directory: "${ct.fs.gameFolder}", the target directory: "${dest}", which resolves into "${d}".`); + `The save directory: "${ct.fs.gameFolder}", the target directory: "${dest}", which resolves into "${absoluteDest}".`); } } - return d; + return absoluteDest; }; const ensureParents = async dest => { const parents = path.dirname(getPath(dest)); @@ -25,19 +78,20 @@ try { }); }; + ct.fs = { isAvailable: true, - gameFolder: path.join(home, ct.meta.author || '', ct.meta.name || 'Ct.js game'), + gameFolder: path.join(appData, ct.meta.author || '', ct.meta.name || 'Ct.js game'), forceLocal: true, - async save(filename, data) { + async save(filename, jsonData) { await ensureParents(filename); - await fs.writeFile(getPath(filename), JSON.stringify(data), 'utf8'); + await fs.writeFile(getPath(filename), JSON.stringify(jsonData), 'utf8'); return void 0; }, async load(filename) { - const data = await fs.readFile(getPath(filename), 'utf8'); - return JSON.parse(data); + const textData = await fs.readFile(getPath(filename), 'utf8'); + return JSON.parse(textData); }, async saveText(filename, text) { if (!text && text !== '') { diff --git a/app/data/ct.libs/fs/types.d.ts b/app/data/ct.libs/fs/types.d.ts index 9e0f20f19..cb396a608 100644 --- a/app/data/ct.libs/fs/types.d.ts +++ b/app/data/ct.libs/fs/types.d.ts @@ -36,6 +36,16 @@ declare namespace ct { */ var forceLocal: boolean; + /** + * When set to `false`, the game is running in a way that disallows access to the filesystem (such as a web release) + */ + var isAvailable: boolean; + + /** + * The base location for application data. Not for normal usage. + */ + var gameFolder: string; + /** Saves an object/array to a file. */ function save(filename: string, data: object|any[]): Promise; From f00de1a3d3e599f4f21c892dbbdde46e5699d860 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Mon, 24 Aug 2020 16:18:55 +1200 Subject: [PATCH 44/74] :zap: Add dnd-processor tag that solves edge cases with drag-and-drop behavior and allows dropping any supported files on any tab --- src/js/loadProject.js | 66 +++++----- src/js/preventDnDNavigation.js | 16 +++ src/node_requires/resources/fonts/index.js | 95 ++++++++++++++ src/node_requires/resources/skeletons.js | 106 ++++++++++++++++ src/riotTags/dnd-processor.tag | 68 ++++++++++ src/riotTags/fonts-panel.tag | 135 ++------------------ src/riotTags/root-tag.tag | 15 ++- src/riotTags/texture-editor.tag | 4 +- src/riotTags/textures-panel.tag | 138 ++------------------- src/styl/inputs.styl | 22 ++-- 10 files changed, 362 insertions(+), 303 deletions(-) create mode 100644 src/js/preventDnDNavigation.js create mode 100644 src/node_requires/resources/fonts/index.js create mode 100644 src/node_requires/resources/skeletons.js create mode 100644 src/riotTags/dnd-processor.tag diff --git a/src/js/loadProject.js b/src/js/loadProject.js index ee813f4ba..681dc2a62 100644 --- a/src/js/loadProject.js +++ b/src/js/loadProject.js @@ -119,8 +119,6 @@ lastProjects.pop(); } localStorage.lastProjects = lastProjects.join(';'); - window.signals.trigger('hideProjectSelector'); - window.signals.trigger('projectLoaded'); if (global.currentProject.settings.title) { document.title = global.currentProject.settings.title + ' — ct.js'; @@ -138,6 +136,7 @@ resetTypedefs(); loadAllTypedefs(); + window.signals.trigger('projectLoaded'); setTimeout(() => { window.riot.update(); }, 0); @@ -187,7 +186,7 @@ } }; - window.loadProject = proj => { + window.loadProject = async proj => { if (!proj) { const baseMessage = 'An attempt to open a project with an empty path.'; alertify.error(baseMessage + ' See the console for the call stack.'); @@ -197,36 +196,37 @@ sessionStorage.projname = path.basename(proj); global.projdir = path.dirname(proj) + path.sep + path.basename(proj, '.ict'); - fs.stat(proj + '.recovery', (err, stat) => { - if (!err && stat.isFile()) { - var targetStat = fs.statSync(proj), - voc = window.languageJSON.intro.recovery; - window.alertify - .okBtn(voc.loadRecovery) - .cancelBtn(voc.loadTarget) - /* {0} — target file date - {1} — target file state (newer/older) - {2} — recovery file date - {3} — recovery file state (newer/older) - */ - .confirm(voc.message - .replace('{0}', targetStat.mtime.toLocaleString()) - .replace('{1}', targetStat.mtime < stat.mtime ? voc.older : voc.newer) - .replace('{2}', stat.mtime.toLocaleString()) - .replace('{3}', stat.mtime < targetStat.mtime ? voc.older : voc.newer)) - .then(e => { - if (e.buttonClicked === 'ok') { - loadProjectFile(proj + '.recovery'); - } else { - loadProjectFile(proj); - } - window.alertify - .okBtn(window.languageJSON.common.ok) - .cancelBtn(window.languageJSON.common.cancel); - }); - } else { - loadProjectFile(proj); + let recoveryStat; + try { + recoveryStat = await fs.stat(proj + '.recovery'); + } catch (err) { + // no recovery file found + void 0; + } + if (recoveryStat && recoveryStat.isFile()) { + const targetStat = await fs.stat(proj); + const voc = window.languageJSON.intro.recovery; + const userResponse = await window.alertify + .okBtn(voc.loadRecovery) + .cancelBtn(voc.loadTarget) + /* {0} — target file date + {1} — target file state (newer/older) + {2} — recovery file date + {3} — recovery file state (newer/older) + */ + .confirm(voc.message + .replace('{0}', targetStat.mtime.toLocaleString()) + .replace('{1}', targetStat.mtime < recoveryStat.mtime ? voc.older : voc.newer) + .replace('{2}', recoveryStat.mtime.toLocaleString()) + .replace('{3}', recoveryStat.mtime < targetStat.mtime ? voc.older : voc.newer)); + window.alertify + .okBtn(window.languageJSON.common.ok) + .cancelBtn(window.languageJSON.common.cancel); + if (userResponse.buttonClicked === 'ok') { + return loadProjectFile(proj + '.recovery'); } - }); + return loadProjectFile(proj); + } + return loadProjectFile(proj); }; })(this); diff --git a/src/js/preventDnDNavigation.js b/src/js/preventDnDNavigation.js new file mode 100644 index 000000000..1220e8a8c --- /dev/null +++ b/src/js/preventDnDNavigation.js @@ -0,0 +1,16 @@ +/* + * This file prevents opening an image or such when a file was dragged into + * ct.js window and it was not catched by other listeners + */ + +{ + const draghHandler = function draghHandler(e) { + if (e.target.nodeName === 'INPUT' && e.target.type === 'file') { + return; + } + e.preventDefault(); + }; + document.addEventListener('dragenter', draghHandler); + document.addEventListener('dragover', draghHandler); + document.addEventListener('drop', draghHandler); +} diff --git a/src/node_requires/resources/fonts/index.js b/src/node_requires/resources/fonts/index.js new file mode 100644 index 000000000..a44153e63 --- /dev/null +++ b/src/node_requires/resources/fonts/index.js @@ -0,0 +1,95 @@ +/** + * @param {object|string} font The font object in ct.js project, or its UID. + * @param {boolean} fs If set to `true`, returns a clean path in a file system. + * Otherwise, returns an URL. + */ +const getPathToTtf = function getPathToTtf(font, fs) { + const path = require('path'); + if (fs) { + return path.join(global.projdir, 'fonts', font.origname); + } + return `file://${global.projdir}/fonts/${font.origname}`; +}; + +/** + * @param {object|string} font The font object in ct.js project, or its UID. + * @param {boolean} fs If set to `true`, returns a clean path in a file system. + * Otherwise, returns an URL. + */ +const getFontPreview = function getFontPreview(font, fs) { + const path = require('path'); + if (fs) { + return path.join(global.projdir, 'fonts', `${font.origname}_prev.png`); + } + return `file://${global.projdir}/fonts/${font.origname}_prev.png?cache=${font.lastmod}`; +}; + +const fontGenPreview = async function fontGenPreview(font) { + const template = { + weight: font.weight, + style: font.italic ? 'italic' : 'normal' + }; + const fs = require('fs-extra'); + const face = new FontFace('CTPROJFONT' + font.typefaceName, `url(${getPathToTtf(font)})`, template); + + // Trigger font loading by creating an invisible label with this font + // const elt = document.createElement('span'); + // elt.innerHTML = 'testString'; + // elt.style.position = 'fixed'; + // elt.style.right = '200%'; + // elt.style.fontFamily = 'CTPROJFONT' + font.typefaceName; + // document.body.appendChild(elt); + + const loaded = await face.load(); + loaded.external = true; + loaded.ctId = face.ctId = font.uid; + document.fonts.add(loaded); + // document.body.removeChild(elt); + + const c = document.createElement('canvas'); + c.x = c.getContext('2d'); + c.width = c.height = 64; + c.x.clearRect(0, 0, 64, 64); + c.x.font = `${font.italic ? 'italic ' : ''}${font.weight} ${Math.floor(64 * 0.75)}px "${loaded.family}"`; + c.x.fillStyle = '#000'; + c.x.fillText('Aa', 64 * 0.05, 64 * 0.75); + + // strip off the data:image url prefix to get just the base64-encoded bytes + const dataURL = c.toDataURL(); + const previewBuffer = dataURL.replace(/^data:image\/\w+;base64,/, ''); + const buf = new Buffer(previewBuffer, 'base64'); + await fs.writeFile(getFontPreview(font, true), buf); +}; + +const importTtfToFont = async function importTtfToFont(src) { + const fs = require('fs-extra'), + path = require('path'); + if (path.extname(src) !== '.ttf') { + throw new Error(`[resources/fonts] Rejecting a file as it does not have a .ttf extension: ${src}`); + } + const generateGUID = require('./../../generateGUID'); + const uid = generateGUID(); + await fs.copy(src, path.join(global.projdir, '/fonts/f' + uid + '.ttf')); + const obj = { + typefaceName: path.basename(src).replace('.ttf', ''), + weight: 400, + italic: false, + origname: `f${uid}.ttf`, + lastmod: Number(new Date()), + pixelFont: false, + pixelFontSize: 16, + pixelFontLineHeight: 18, + charsets: ['allInFont'], + customCharset: '', + uid + }; + global.currentProject.fonts.push(obj); + await fontGenPreview(obj); + window.signals.trigger('fontCreated'); +}; +module.exports = { + importTtfToFont, + fontGenPreview, + getFontPreview, + getPathToTtf +}; diff --git a/src/node_requires/resources/skeletons.js b/src/node_requires/resources/skeletons.js new file mode 100644 index 000000000..51248a3d6 --- /dev/null +++ b/src/node_requires/resources/skeletons.js @@ -0,0 +1,106 @@ +const path = require('path'); + +const getSkeletonData = function getSkeletonData(skeleton, fs) { + if (fs) { + return path.join(global.projdir, 'img', skeleton.origname); + } + return `file://${global.projdir}/img/${skeleton.origname}`; +}; +const getSkeletonTextureData = function getSkeletonTextureData(skeleton, fs) { + const slice = skeleton.origname.replace('_ske.json', ''); + if (fs) { + return path.join(global.projdir, 'img', `${slice}_tex.json`); + } + return `file://${global.projdir}/img/${slice}_tex.json`; +}; +const getSkeletonTexture = function getSkeletonTexture(skeleton, fs) { + const slice = skeleton.origname.replace('_ske.json', ''); + if (fs) { + return path.join(global.projdir, 'img', `${slice}_tex.png`); + } + return `file://${global.projdir}/img/${slice}_tex.png`; +}; + +const getSkeletonPreview = function getSkeletonPreview(skeleton, fs) { + if (fs) { + return path.join(global.projdir, 'img', `${skeleton.origname}_prev.png`); + } + return `file://${global.projdir}/img/${skeleton.origname}_prev.png`; +}; + +/** + * Generates a square thumbnail of a given skeleton + * @param {String} skeleton The skeleton object to generate a preview for. + * @returns {Promise} Resolves after creating a thumbnail. + */ +const skeletonGenPreview = function (skeleton) { + const loader = new PIXI.loaders.Loader(), + dbf = dragonBones.PixiFactory.factory; + const fs = require('fs-extra'); + return new Promise((resolve, reject) => { + // Draw the armature on a canvas/in a Pixi.js app + const skelData = getSkeletonData(skeleton), + texData = getSkeletonTextureData(skeleton), + tex = getSkeletonTexture(skeleton); + loader.add(skelData, skelData) + .add(texData, texData) + .add(tex, tex); + loader.load(() => { + dbf.parseDragonBonesData(loader.resources[skelData].data); + dbf.parseTextureAtlasData( + loader.resources[texData].data, + loader.resources[tex].texture + ); + const skel = dbf.buildArmatureDisplay('Armature', loader.resources[skelData].data.name); + + const app = new PIXI.Application(); + + const rawSkelBase64 = app.renderer.plugins.extract.base64(skel); + const skelBase64 = rawSkelBase64.replace(/^data:image\/\w+;base64,/, ''); + const buf = new Buffer(skelBase64, 'base64'); + + fs.writeFile(getSkeletonPreview(skeleton, true), buf) + .then(() => { + // Clean memory from DragonBones' armatures + // eslint-disable-next-line no-underscore-dangle + delete dbf._dragonBonesDataMap[loader.resources[skelData].data.name]; + // eslint-disable-next-line no-underscore-dangle + delete dbf._textureAtlasDataMap[loader.resources[skelData].data.name]; + }) + .then(resolve) + .catch(reject); + }); + }); +}; + +const importSkeleton = async function importSkeleton(source) { + const generateGUID = require('./../generateGUID'); + const fs = require('fs-extra'); + + const uid = generateGUID(); + const partialDest = path.join(global.projdir + '/img/skdb' + uid); + + await Promise.all([ + fs.copy(source, partialDest + '_ske.json'), + fs.copy(source.replace('_ske.json', '_tex.json'), partialDest + '_tex.json'), + fs.copy(source.replace('_ske.json', '_tex.png'), partialDest + '_tex.png') + ]); + const skel = { + name: path.basename(source).replace('_ske.json', ''), + origname: path.basename(partialDest + '_ske.json'), + from: 'dragonbones', + uid + }; + await skeletonGenPreview(skel); + global.currentProject.skeletons.push(skel); + window.signals.trigger('skeletonImported', skel); +}; + +module.exports = { + getSkeletonData, + getSkeletonTextureData, + getSkeletonTexture, + getSkeletonPreview, + skeletonGenPreview, + importSkeleton +}; diff --git a/src/riotTags/dnd-processor.tag b/src/riotTags/dnd-processor.tag new file mode 100644 index 000000000..e1f6074a1 --- /dev/null +++ b/src/riotTags/dnd-processor.tag @@ -0,0 +1,68 @@ +dnd-processor + .aDropzone(if="{dropping}") + .middleinner + svg.feather + use(xlink:href="data/icons.svg#download") + h2 {languageJSON.common.fastimport} + input( + type="file" multiple + accept=".png,.jpg,.jpeg,.bmp,.gif,.json,.ttf" + onchange="{dndImport}" + ) + script. + this.dndImport = e => { + const files = [...e.target.files].map(file => file.path); + for (let i = 0; i < files.length; i++) { + if (/\.(jpg|gif|png|jpeg)/gi.test(files[i])) { + const {importImageToTexture} = require('./data/node_requires/resources/textures'); + importImageToTexture(files[i]); + } else if (/_ske\.json/i.test(files[i])) { + const {importSkeleton} = require('./data/node_requires/resources/skeletons'); + importSkeleton(files[i]); + } else if (/\.ttf/gi.test(files[i])) { + const {importTtfToFont} = require('./data/node_requires/resources/fonts'); + importTtfToFont(files[i]); + } else { + alertify.log(`Skipped ${files[i]} as it is not supported by drag-and-drop importer.`); + } + } + e.srcElement.value = ''; + this.dropping = false; + e.preventDefault(); + }; + + /* + * drag-n-drop handling + */ + let dragTimer; + this.onDragOver = e => { + var dt = e.dataTransfer; + if (dt.types && (dt.types.indexOf ? dt.types.indexOf('Files') !== -1 : dt.types.contains('Files'))) { + this.dropping = true; + this.update(); + window.clearTimeout(dragTimer); + } + e.preventDefault(); + e.stopPropagation(); + }; + this.onDrop = e => { + e.stopPropagation(); + }; + this.onDragLeave = e => { + dragTimer = window.setTimeout(() => { + this.dropping = false; + this.update(); + }, 25); + e.preventDefault(); + e.stopPropagation(); + }; + this.on('mount', () => { + document.addEventListener('dragover', this.onDragOver); + document.addEventListener('dragleave', this.onDragLeave); + document.addEventListener('drop', this.onDrop); + }); + this.on('unmount', () => { + document.removeEventListener('dragover', this.onDragOver); + document.removeEventListener('dragleave', this.onDragLeave); + document.removeEventListener('drop', this.onDrop); + }); \ No newline at end of file diff --git a/src/riotTags/fonts-panel.tag b/src/riotTags/fonts-panel.tag index 740ecde5a..50b377c61 100644 --- a/src/riotTags/fonts-panel.tag +++ b/src/riotTags/fonts-panel.tag @@ -20,14 +20,6 @@ fonts-panel.flexfix.tall.fifty svg.feather use(xlink:href="data/icons.svg#download") span {voc.import} - .aDropzone(if="{dropping}") - .middleinner - svg.feather - use(xlink:href="data/icons.svg#download") - h2 {languageJSON.common.fastimport} - input(type="file" multiple - accept=".ttf" - onchange="{fontImport}") context-menu(menu="{fontMenu}" ref="fontMenu") font-editor(if="{editingFont}" fontobj="{editedFont}") script. @@ -36,10 +28,8 @@ fonts-panel.flexfix.tall.fifty this.fonts = global.currentProject.fonts; this.namespace = 'fonts'; this.mixin(window.riotVoc); - const fs = require('fs-extra'), - path = require('path'); - this.thumbnails = font => `file://${window.global.projdir}/fonts/${font.origname}_prev.png?cache=${font.lastmod}`; + this.thumbnails = require('./data/node_requires/resources/fonts').getFontPreview; this.names = font => `${font.typefaceName} ${font.weight} ${font.italic ? this.voc.italic : ''}`; this.setUpPanel = () => { @@ -121,130 +111,31 @@ fonts-panel.flexfix.tall.fifty * The event of importing a font through a file manager */ this.fontImport = e => { // e.target:input[type="file"] - const generateGUID = require('./data/node_requires/generateGUID'); const files = [...e.target.files].map(file => file.path); e.target.value = ''; + const {importTtfToFont} = require('./data/node_requires/resources/fonts'); for (let i = 0; i < files.length; i++) { if (/\.ttf/gi.test(files[i])) { - const id = generateGUID(); - this.loadFont( - id, - files[i], - path.join(global.projdir, '/fonts/f' + id + '.ttf'), - true - ); - } else { - alertify.log(`Skipped ${files[i]} as it is not a .ttf file.`); - void 0; - } - } - this.dropping = false; - e.srcElement.value = ''; // clear input value that prevent to upload the same filename again - e.preventDefault(); - }; - this.loadFont = (uid, filename, dest) => { - fs.copy(filename, dest, e => { - if (e) { - throw e; - } - var obj = { - typefaceName: path.basename(filename).replace('.ttf', ''), - weight: 400, - italic: false, - origname: path.basename(dest), - lastmod: Number(new Date()), - pixelFont: false, - pixelFontSize: 16, - pixelFontLineHeight: 18, - charsets: ['allInFont'], - customCharset: '', - uid - }; - global.currentProject.fonts.push(obj); - setTimeout(() => { - this.fontGenPreview(dest, dest + '_prev.png', 64, obj) + importTtfToFont(files[i]) .then(() => { this.refs.fonts.updateList(); this.update(); }); - }, 250); - }); - }; - this.fontGenPreview = (source, destFile, size, obj) => new Promise((resolve, reject) => { - const template = { - weight: obj.weight, - style: obj.italic ? 'italic' : 'normal' - }; - // we clean the source url from the possible space and the \ to / (windows specific) - const cleanedSource = source.replace(/ /g, '%20').replace(/\\/g, '/'); - const face = new FontFace('CTPROJFONT' + obj.typefaceName, `url(file://${cleanedSource})`, template); - const elt = document.createElement('span'); - elt.innerHTML = 'testString'; - elt.style.fontFamily = obj.typefaceName; - document.body.appendChild(elt); - face.load() - .then(loaded => { - loaded.external = true; - loaded.ctId = face.ctId = obj.uid; - document.fonts.add(loaded); - const c = document.createElement('canvas'); - c.x = c.getContext('2d'); - c.width = c.height = size; - c.x.clearRect(0, 0, size, size); - c.x.font = `${obj.italic ? 'italic ' : ''}${obj.weight} ${Math.floor(size * 0.75)}px "${loaded.family}"`; - c.x.fillStyle = '#000'; - c.x.fillText('Aa', size * 0.05, size * 0.75); - // strip off the data:image url prefix to get just the base64-encoded bytes - const dataURL = c.toDataURL(); - const previewBuffer = dataURL.replace(/^data:image\/\w+;base64,/, ''); - const buf = new Buffer(previewBuffer, 'base64'); - const stream = fs.createWriteStream(destFile); - stream.on('finish', () => { - setTimeout(() => { // WHY THE HECK I EVER NEED THIS?! - resolve(destFile); - }, 100); - }); - stream.on('error', err => { - reject(err); - }); - stream.end(buf); - }) - .catch(reject); - }); - /* - * Additions for drag-n-drop - */ - var dragTimer; - this.onDragOver = e => { - var dt = e.dataTransfer; - if (dt.types && (dt.types.indexOf ? dt.types.indexOf('Files') !== -1 : dt.types.contains('Files'))) { - this.dropping = true; - this.update(); - window.clearTimeout(dragTimer); + } else { + alertify.log(`Skipped ${files[i]} as it is not a .ttf file.`); + } } + e.srcElement.value = ''; // clear input value that prevent to upload the same filename again e.preventDefault(); - e.stopPropagation(); }; - this.onDrop = e => { - e.stopPropagation(); - }; - this.onDragLeave = e => { - dragTimer = window.setTimeout(() => { - this.dropping = false; - this.update(); - }, 25); - e.preventDefault(); - e.stopPropagation(); + + const updatePanels = () => { + this.refs.fonts.updateList(); + this.update(); }; - this.on('mount', () => { - document.addEventListener('dragover', this.onDragOver); - document.addEventListener('dragleave', this.onDragLeave); - document.addEventListener('drop', this.onDrop); - }); + window.signals.on('fontCreated', updatePanels); this.on('unmount', () => { - document.removeEventListener('dragover', this.onDragOver); - document.removeEventListener('dragleave', this.onDragLeave); - document.removeEventListener('drop', this.onDrop); + window.signals.off('fontCreated', updatePanels); }); this.loadFonts = () => { diff --git a/src/riotTags/root-tag.tag b/src/riotTags/root-tag.tag index cb1cf2611..f94b461fa 100644 --- a/src/riotTags/root-tag.tag +++ b/src/riotTags/root-tag.tag @@ -1,14 +1,19 @@ root-tag - main-menu(if="{!selectorVisible}") - notepad-panel(if="{!selectorVisible}") - project-selector(if="{selectorVisible}") + main-menu(if="{projectOpened}") + notepad-panel(if="{projectOpened}") + dnd-processor(if="{projectOpened}") + project-selector(if="{!projectOpened}") script. - this.selectorVisible = true; + this.projectOpened = false; window.signals.on('resetAll', () => { global.currentProject = false; - this.selectorVisible = true; + this.projectOpened = false; riot.update(); }); + window.signals.on('projectLoaded', () => { + this.projectOpened = true; + this.update(); + }); const stylesheet = document.createElement('style'); document.head.appendChild(stylesheet); diff --git a/src/riotTags/texture-editor.tag b/src/riotTags/texture-editor.tag index ce2a37852..a607a6286 100644 --- a/src/riotTags/texture-editor.tag +++ b/src/riotTags/texture-editor.tag @@ -300,7 +300,7 @@ texture-editor.panel.view global.projdir + '/img/i' + this.texture.uid + path.extname(this.texture.source) ); }; - this.paste = () => { + this.paste = async () => { const png = nw.Clipboard.get().get('png'); if (!png) { alertify.error(this.vocGlob.couldNotLoadFromClipboard); @@ -308,7 +308,7 @@ texture-editor.panel.view } const imageBase64 = png.replace(/^data:image\/\w+;base64,/, ''); const imageBuffer = new Buffer(imageBase64, 'base64'); - this.loadImg( + await this.loadImg( imageBuffer, global.projdir + '/img/i' + this.texture.uid + '.png' ); diff --git a/src/riotTags/textures-panel.tag b/src/riotTags/textures-panel.tag index f055d16bb..a92f5872b 100644 --- a/src/riotTags/textures-panel.tag +++ b/src/riotTags/textures-panel.tag @@ -7,7 +7,7 @@ textures-panel.panel.view vocspace="texture" namespace="textures" click="{openTexture}" - thumbnails="{thumbnails}" + thumbnails="{textureThumbnails}" ref="textures" ) label.file.inlineblock @@ -31,7 +31,7 @@ textures-panel.panel.view contextmenu="{showSkeletonPopup}" vocspace="texture" namespace="skeletons" - thumbnails="{thumbnails}" + thumbnails="{skelThumbnails}" ref="skeletons" ) h2 @@ -45,31 +45,17 @@ textures-panel.panel.view svg.feather use(xlink:href="data/icons.svg#download") span {voc.import} - - .aDropzone(if="{dropping}") - .middleinner - svg.feather - use(xlink:href="data/icons.svg#download") - h2 {languageJSON.common.fastimport} - input(type="file" multiple - accept=".png,.jpg,.jpeg,.bmp,.gif,.json" - onchange="{textureImport}") - texture-editor(if="{editing}" texture="{currentTexture}") context-menu(menu="{textureMenu}" ref="textureMenu") script. - const fs = require('fs-extra'), - path = require('path'); const glob = require('./data/node_requires/glob'); - const generateGUID = require('./data/node_requires/generateGUID'); this.namespace = 'texture'; this.mixin(window.riotVoc); this.editing = false; this.dropping = false; - const {getTexturePreview} = require('./data/node_requires/resources/textures'); - // this.thumbnails = texture => `file://${global.projdir}/img/${texture.origname}_prev.png?cache=${texture.lastmod}`; - this.thumbnails = getTexturePreview; + this.textureThumbnails = require('./data/node_requires/resources/textures').getTexturePreview; + this.skelThumbnails = require('./data/node_requires/resources/skeletons').getSkeletonPreview; this.fillTextureMap = () => { glob.texturemap = {}; @@ -116,10 +102,12 @@ textures-panel.panel.view window.signals.on('projectLoaded', this.setUpPanel); window.signals.on('textureImported', this.updateTextureData); + window.signals.on('skeletonImported', this.updateTextureData); this.on('mount', this.setUpPanel); this.on('unmount', () => { window.signals.off('projectLoaded', this.setUpPanel); window.signals.off('textureImported', this.updateTextureData); + window.signals.off('skeletonImported', this.updateTextureData); }); /** @@ -133,16 +121,11 @@ textures-panel.panel.view if (/\.(jpg|gif|png|jpeg)/gi.test(files[i])) { importImageToTexture(files[i]); } else if (/_ske\.json/i.test(files[i])) { - const id = generateGUID(); - this.loadSkeleton( - id, - files[i], - global.projdir + '/img/skdb' + id + '_ske.json' - ); + const {importSkeleton} = require('./data/node_requires/resources/skeletons'); + importSkeleton(files[i]); } } e.srcElement.value = ''; - this.dropping = false; e.preventDefault(); }; @@ -159,75 +142,6 @@ textures-panel.panel.view alertify.success(this.vocGlob.pastedFromClipboard); }; - this.loadSkeleton = (uid, filename, dest) => { - fs.copy(filename, dest) - .then(() => fs.copy(filename.replace('_ske.json', '_tex.json'), dest.replace('_ske.json', '_tex.json'))) - .then(() => fs.copy(filename.replace('_ske.json', '_tex.png'), dest.replace('_ske.json', '_tex.png'))) - .then(() => { - global.currentProject.skeletons.push({ - name: path.basename(filename).replace('_ske.json', ''), - origname: path.basename(dest), - from: 'dragonbones', - uid - }); - this.skelGenPreview(dest, dest + '_prev.png', [64, 128]) - .then(() => { - this.refs.skeletons.updateList(); - this.update(); - }); - }); - }; - - /** - * Generates a square preview for a given skeleton - * @param {String} source Path to the source _ske.json file - * @param {String} destFile Path to the destinating image - * @param {Array} sizes Size of the square thumbnail, in pixels - * @returns {Promise} Resolves after creating a thumbnail. On success, - * passes data-url of the created thumbnail. - */ - this.skelGenPreview = (source, destFile, sizes) => { - // TODO: Actually generate previews of different sizes - const loader = new PIXI.loaders.Loader(), - dbf = dragonBones.PixiFactory.factory; - const slice = 'file://' + source.replace('_ske.json', ''); - return new Promise((resolve, reject) => { - loader.add(`${slice}_ske.json`, `${slice}_ske.json`) - .add(`${slice}_tex.json`, `${slice}_tex.json`) - .add(`${slice}_tex.png`, `${slice}_tex.png`); - loader.load(() => { - dbf.parseDragonBonesData(loader.resources[`${slice}_ske.json`].data); - dbf.parseTextureAtlasData(loader.resources[`${slice}_tex.json`].data, loader.resources[`${slice}_tex.png`].texture); - const skel = dbf.buildArmatureDisplay('Armature', loader.resources[`${slice}_ske.json`].data.name); - const promises = sizes.map(() => new Promise((resolve, reject) => { - const app = new PIXI.Application(); - const rawSkelBase64 = app.renderer.plugins.extract.base64(skel); - const skelBase64 = rawSkelBase64.replace(/^data:image\/\w+;base64,/, ''); - const buf = new Buffer(skelBase64, 'base64'); - const stream = fs.createWriteStream(destFile); - stream.on('finish', () => { - setTimeout(() => { // WHY THE HECK I EVER NEED THIS?! - resolve(destFile); - }, 100); - }); - stream.on('error', err => { - reject(err); - }); - stream.end(buf); - })); - Promise.all(promises) - .then(() => { - // eslint-disable-next-line no-underscore-dangle - delete dbf._dragonBonesDataMap[loader.resources[`${slice}_ske.json`].data.name]; - // eslint-disable-next-line no-underscore-dangle - delete dbf._textureAtlasDataMap[loader.resources[`${slice}_ske.json`].data.name]; - }) - .then(resolve) - .catch(reject); - }); - }); - }; - const deleteCurrentTexture = () => { for (const type of global.currentProject.types) { if (type.texture === this.currentTexture.uid) { @@ -363,39 +277,3 @@ textures-panel.panel.view this.currentTextureId = global.currentProject.textures.indexOf(texture); this.editing = true; }; - - /* - * drag-n-drop handling - */ - var dragTimer; - this.onDragOver = e => { - var dt = e.dataTransfer; - if (dt.types && (dt.types.indexOf ? dt.types.indexOf('Files') !== -1 : dt.types.contains('Files'))) { - this.dropping = true; - this.update(); - window.clearTimeout(dragTimer); - } - e.preventDefault(); - e.stopPropagation(); - }; - this.onDrop = e => { - e.stopPropagation(); - }; - this.onDragLeave = e => { - dragTimer = window.setTimeout(() => { - this.dropping = false; - this.update(); - }, 25); - e.preventDefault(); - e.stopPropagation(); - }; - this.on('mount', () => { - document.addEventListener('dragover', this.onDragOver); - document.addEventListener('dragleave', this.onDragLeave); - document.addEventListener('drop', this.onDrop); - }); - this.on('unmount', () => { - document.removeEventListener('dragover', this.onDragOver); - document.removeEventListener('dragleave', this.onDragLeave); - document.removeEventListener('drop', this.onDrop); - }); diff --git a/src/styl/inputs.styl b/src/styl/inputs.styl index da3753ada..465d43915 100644 --- a/src/styl/inputs.styl +++ b/src/styl/inputs.styl @@ -391,20 +391,14 @@ input[type="range"] top 0 bottom 0 background rgba(background, 0.65) - // @stylint off - background-image: - linear-gradient(to right, accent1 0, accent1 35%, transparent 35%, transparent 100%), - linear-gradient(to left, accent1 0, accent1 35%, transparent 35%, transparent 100%), - linear-gradient(to bottom, accent1 0, accent1 35%, transparent 35%, transparent 100%), - linear-gradient(to top, accent1 0, accent1 35%, transparent 35%, transparent 100%) - // @stylint on - background-size 5rem 0.5rem, 5rem 0.5rem, 0.5rem 5rem, 0.5rem 5rem - background-repeat repeat-x, repeat-x, repeat-y, repeat-y - background-position 0 0, 0 bottom, right 0, 0 0 + border 0.5rem solid act + animation aDropzonePulsate 1.25s ease-in-out infinite text-align center svg - font-size 5rem color accent1 + width 5rem + height 5rem + stroke-width 1px h2 font-size 2rem input @@ -416,6 +410,12 @@ input[type="range"] opacity 0 cursor -webkit-grabbing +@keyframes aDropzonePulsate + 0%, 100% + border 0.5rem solid act + 50% + border 0.5rem solid rgba(act, 0.35) + .aResizer background backgroundDeeper if (darkTheme) From 3ba237a7b436b2e16019fa5f78a889d2bce58db5 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Mon, 24 Aug 2020 16:50:21 +1200 Subject: [PATCH 45/74] :bug: Fix .itch.toml, package it separately for each platform Closes #222 --- app/.itch.toml | 22 ---------------------- buildAssets/linux.itch.toml | 3 +++ buildAssets/mac.itch.toml | 3 +++ buildAssets/windows.itch.toml | 3 +++ gulpfile.js | 20 ++++++++++++++++++++ 5 files changed, 29 insertions(+), 22 deletions(-) delete mode 100644 app/.itch.toml create mode 100644 buildAssets/linux.itch.toml create mode 100644 buildAssets/mac.itch.toml create mode 100644 buildAssets/windows.itch.toml diff --git a/app/.itch.toml b/app/.itch.toml deleted file mode 100644 index dbe88a0d1..000000000 --- a/app/.itch.toml +++ /dev/null @@ -1,22 +0,0 @@ -[[actions]] -name = "play" -path = "ctjs.exe" -platform = "windows" - -[[actions]] -name = "play" -path = "ctjs" -platform = "linux" - -[[actions]] -name = "play" -path = "ctjs.app" -platform = "osx" - -[[actions]] -name = "manual" -path = "https://docs.ctjs.rocks/" - -[[actions]] -name = "Discord" -path = "https://discord.gg/CggbPkb" \ No newline at end of file diff --git a/buildAssets/linux.itch.toml b/buildAssets/linux.itch.toml new file mode 100644 index 000000000..8701c7114 --- /dev/null +++ b/buildAssets/linux.itch.toml @@ -0,0 +1,3 @@ +[[actions]] +name = "play" +path = "ctjs" \ No newline at end of file diff --git a/buildAssets/mac.itch.toml b/buildAssets/mac.itch.toml new file mode 100644 index 000000000..1d714bf2d --- /dev/null +++ b/buildAssets/mac.itch.toml @@ -0,0 +1,3 @@ +[[actions]] +name = "play" +path = "ctjs.app" \ No newline at end of file diff --git a/buildAssets/windows.itch.toml b/buildAssets/windows.itch.toml new file mode 100644 index 000000000..a5dafe36e --- /dev/null +++ b/buildAssets/windows.itch.toml @@ -0,0 +1,3 @@ +[[actions]] +name = "play" +path = "ctjs.exe" \ No newline at end of file diff --git a/gulpfile.js b/gulpfile.js index e8c858b60..835759603 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -414,6 +414,26 @@ const bakePackages = async () => { macIcns: nightly ? './buildAssets/nightly.icns' : './buildAssets/icon.icns' }); await nw.build(); + + // Copy .itch.toml files for each target platform + await Promise.all(platforms.map(platform => { + if (platform.indexOf('win') === 0) { + return fs.copy( + './buildAssets/windows.itch.toml', + path.join(`./build/ctjs - v${pack.version}`, platform, '.itch.toml') + ); + } + if (platform === 'osx64') { + return fs.copy( + './buildAssets/mac.itch.toml', + path.join(`./build/ctjs - v${pack.version}`, platform, '.itch.toml') + ); + } + return fs.copy( + './buildAssets/linux.itch.toml', + path.join(`./build/ctjs - v${pack.version}`, platform, '.itch.toml') + ); + })); console.log('Built to this location:', path.join('./build', `ctjs - v${pack.version}`)); }; From f4df6581b425406af9b0cbbbe8a1bb0ed4b86c86 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Tue, 25 Aug 2020 14:57:25 +1200 Subject: [PATCH 46/74] :zap: Change build, projects', export folders to be stored under `~/ct.js/` directory --- src/node_requires/platformUtils.js | 57 ++++++++++++++----- src/node_requires/resources/projects/index.js | 8 ++- src/riotTags/main-menu.tag | 11 ++-- src/riotTags/project-selector.tag | 3 +- 4 files changed, 57 insertions(+), 22 deletions(-) diff --git a/src/node_requires/platformUtils.js b/src/node_requires/platformUtils.js index a26ac3442..9b63ad1bd 100644 --- a/src/node_requires/platformUtils.js +++ b/src/node_requires/platformUtils.js @@ -7,6 +7,7 @@ const isMac = !(isWin || isLinux); const mod = { isWin, + isWindows: isWin, isLinux, isMac, @@ -48,17 +49,22 @@ const mod = { return new Promise((resolve, reject) => { // writing to an exec path on Mac is not a good idea, // as it will be hidden inside an app's directory, which is shown as one file. - if (isMac || !(execWritable)) { - if (!homeWritable) { - reject(new Error(`Could not write to folders ${home} and ${exec}.`)); - } else { - fs.ensureDir(path.join(home, 'ct.js')) - .then(() => { - resolve(path.join(home, 'ct.js')); - }) - .catch(reject); - } + if (isMac && !homeWritable) { + reject(new Error(`Could not write to folder ${home}. It is needed to create builds and run debugger. Check rights to these folders, and tweak sandbox settings if it is used.`)); + return; + } + // Home directory takes priority + if (homeWritable) { + fs.ensureDir(path.join(home, 'ct.js')) + .then(() => { + resolve(path.join(home, 'ct.js')); + }) + .catch(reject); } else { + if (!execWritable) { + reject(new Error(`Could not write to folders ${home} and ${exec}. A folder is needed to create builds and run debugger. Check access rights to these folders, and tweak sandbox settings if it is used.`)); + return; + } resolve(exec); } }); @@ -69,7 +75,9 @@ const mod = { let exportDir, exportDirPromise, buildDir, - buildDirPromise; + buildDirPromise, + projectsDir, + projectsDirPromise; // We compute a directory once and store it forever mod.getExportDir = () => { if (exportDir) { @@ -78,8 +86,10 @@ const mod = { if (exportDirPromise) { return exportDirPromise; } - exportDirPromise = mod.getWritableDir().then(dir => { - exportDir = require('path').join(dir, 'export'); + exportDirPromise = mod.getWritableDir().then(async ctjsDir => { + const dir = require('path').join(ctjsDir, 'Exported'); + await fs.ensureDir(dir); + exportDir = dir; return exportDir; }); return exportDirPromise; @@ -91,12 +101,29 @@ const mod = { if (buildDirPromise) { return buildDirPromise; } - buildDirPromise = mod.getWritableDir().then(dir => { - buildDir = require('path').join(dir, 'build'); + buildDirPromise = mod.getWritableDir().then(async ctjsDir => { + const dir = require('path').join(ctjsDir, 'Builds'); + await fs.ensureDir(dir); + buildDir = dir; return buildDir; }); return buildDirPromise; }; + mod.getProjectsDir = () => { + if (projectsDir) { + return Promise.resolve(projectsDir); + } + if (projectsDirPromise) { + return projectsDirPromise; + } + projectsDirPromise = mod.getWritableDir().then(async ctjsDir => { + const dir = require('path').join(ctjsDir, 'Projects'); + await fs.ensureDir(dir); + projectsDir = dir; + return projectsDir; + }); + return projectsDirPromise; + }; } module.exports = mod; diff --git a/src/node_requires/resources/projects/index.js b/src/node_requires/resources/projects/index.js index aa0aaee20..7f82278fb 100644 --- a/src/node_requires/resources/projects/index.js +++ b/src/node_requires/resources/projects/index.js @@ -1,8 +1,12 @@ const defaultProject = require('./defaultProject'); +/** + * @returns {Promise} A promise that resolves into the absolute path + * to the projects' directory + */ const getDefaultProjectDir = function () { - const path = require('path'); - return path.join(nw.App.startPath, 'projects'); + const {getProjectsDir} = require('./../../platformUtils'); + return getProjectsDir(); }; const getExamplesDir = function () { diff --git a/src/riotTags/main-menu.tag b/src/riotTags/main-menu.tag index 83b1a0d51..1e04e4337 100644 --- a/src/riotTags/main-menu.tag +++ b/src/riotTags/main-menu.tag @@ -241,11 +241,14 @@ main-menu.flexcol } }; this.zipExport = async () => { - const {getWritableDir, getExportDir} = require('./data/node_requires/platformUtils'); - const writable = await getWritableDir(); + const {getBuildDir, getExportDir} = require('./data/node_requires/platformUtils'); + const buildFolder = await getBuildDir(); const runCtExport = require('./data/node_requires/exporter'); - const exportFile = path.join(writable, '/export.zip'), - inDir = await getExportDir(); + const exportFile = path.join( + buildFolder, + `${currentProject.settings.authoring.title || 'ct.js game'}.zip` + ); + const inDir = await getExportDir(); await fs.remove(exportFile); runCtExport(global.currentProject, global.projdir) .then(() => { diff --git a/src/riotTags/project-selector.tag b/src/riotTags/project-selector.tag index b5bc1eda2..c3bf9b25e 100644 --- a/src/riotTags/project-selector.tag +++ b/src/riotTags/project-selector.tag @@ -136,7 +136,8 @@ project-selector * Handler for a manual search for a project folder, triggered by an input[type="file"] */ this.chooseProjectFolder = async () => { - const defaultProjectDir = require('./data/node_requires/resources/projects').getDefaultProjectDir(); + const {getProjectsDir} = require('./data/node_requires/platformUtils'); + const defaultProjectDir = await getProjectsDir() + '/'; const projPath = await window.showOpenDialog({ title: this.voc.newProject.selectProjectFolder, defaultPath: defaultProjectDir, From 44e9bbe7a53cd17457d103451497d630af60c6c2 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Tue, 25 Aug 2020 16:24:19 +1200 Subject: [PATCH 47/74] :bug: Fix overflow issues and wrong initial values for bitmap font generator Closes #220 --- .../fonts/bitmapFontGenerator/index.js | 28 +++++++++++---- .../fonts/bitmapFontGenerator/util.js | 35 ++++++++++--------- src/node_requires/resources/fonts/index.js | 6 ++-- src/riotTags/main-menu.tag | 2 +- 4 files changed, 43 insertions(+), 28 deletions(-) diff --git a/src/node_requires/resources/fonts/bitmapFontGenerator/index.js b/src/node_requires/resources/fonts/bitmapFontGenerator/index.js index 8a4ff4a67..f48e339ba 100644 --- a/src/node_requires/resources/fonts/bitmapFontGenerator/index.js +++ b/src/node_requires/resources/fonts/bitmapFontGenerator/index.js @@ -5,8 +5,8 @@ const opentype = require('opentype.js'); const draw = function draw(ctx, glyphList, descend, options) { var dict = {}; - var drawX = 0; - var drawY = 0; + var drawX = 1; + var drawY = 1; var drawHeight = options.baseline + descend; var mg; @@ -25,8 +25,8 @@ const draw = function draw(ctx, glyphList, descend, options) { drawWidth = g.width; } if (drawX + drawWidth > ctx.canvas.width) { - drawX = 0; - drawY += drawHeight + options.margin; + drawX = 1; + drawY += drawHeight + options.margin * 2; } var path = g.glyph.getPath(drawX + (drawWidth / 2) - (g.width / 2), drawY + options.baseline, options.height); path.fill = options.fill; @@ -43,7 +43,7 @@ const draw = function draw(ctx, glyphList, descend, options) { }; }); } - drawX += drawWidth + options.margin; + drawX += drawWidth + options.margin * 2; } }); @@ -52,6 +52,7 @@ const draw = function draw(ctx, glyphList, descend, options) { }; }; +// eslint-disable-next-line max-lines-per-function const generateBitmapFont = async function generateBitmapFont(fontSrc, outputPath, options, callback) { const fs = require('fs-extra'); const buffer = await fs.readFile(fontSrc); @@ -66,6 +67,7 @@ const generateBitmapFont = async function generateBitmapFont(fontSrc, outputPath var lostChars = []; var glyphList = []; + Array.from(options.list).forEach((char) => { const [glyph] = font.stringToGlyphs(char); glyph.font = font; @@ -107,9 +109,20 @@ const generateBitmapFont = async function generateBitmapFont(fontSrc, outputPath // Calculate the required canvas size var canvasSize; if (options.width === void 0) { - canvasSize = util.calculateCanvasSizeProp(options.list, glyphList, adjustedHeight, options.baseline + descend); + canvasSize = util.calculateCanvasSizeProp( + options.list, + glyphList, + adjustedHeight, + options.baseline + descend, + options.margin || 1 + ); } else { - canvasSize = util.calculateCanvasSize(options.list, options.width, adjustedHeight); + canvasSize = util.calculateCanvasSize( + options.list, + options.width, + adjustedHeight, + options.margin || 1 + ); } // Check if the created canvas size is valid @@ -141,6 +154,7 @@ const generateBitmapFont = async function generateBitmapFont(fontSrc, outputPath 'Try Using other font or characters.'); } await util.outputBitmapFont(outputPath, canvas, callback); + return { map: drawResult.map, missingGlyph: drawResult.missingGlyph, diff --git a/src/node_requires/resources/fonts/bitmapFontGenerator/util.js b/src/node_requires/resources/fonts/bitmapFontGenerator/util.js index ebbd03c92..7ce3dc8b8 100644 --- a/src/node_requires/resources/fonts/bitmapFontGenerator/util.js +++ b/src/node_requires/resources/fonts/bitmapFontGenerator/util.js @@ -1,7 +1,7 @@ /* eslint-disable max-len */ const fs = require('fs').promises; -const calculateCanvasSize = function calculateCanvasSize(text, charWidth, charHeight) { +const calculateCanvasSize = function calculateCanvasSize(text, charWidth, charHeight, margin) { if (charWidth <= 0 || charHeight <= 0) { return { width: -1, height: -1 @@ -12,13 +12,13 @@ const calculateCanvasSize = function calculateCanvasSize(text, charWidth, charHe var canvasSquareSideSize = 1; // Find the length of the side of a square that can contain characters - while ((canvasSquareSideSize / charWidth) * (canvasSquareSideSize / charHeight) < textSize) { + while ((canvasSquareSideSize / (charWidth + margin * 2)) * (canvasSquareSideSize / (charHeight + margin * 2)) < textSize) { canvasSquareSideSize *= 2; } var canvasWidth = canvasSquareSideSize; // CanvasSquareSideSize cannot be used because it may not be square - var tmpCanvasHeight = Math.ceil(textSize / Math.floor(canvasWidth / charWidth)) * charHeight; + var tmpCanvasHeight = Math.ceil(textSize / Math.floor(canvasWidth / (charWidth + margin * 2))) * (charHeight + margin * 2); var canvasHeight = 1; while (canvasHeight < tmpCanvasHeight) { canvasHeight *= 2; @@ -29,34 +29,35 @@ const calculateCanvasSize = function calculateCanvasSize(text, charWidth, charHe }; }; -const canGoIn = function canGoIn(canvasSize, glyphList, charHeight) { - var drawX = 0; - var drawY = 0; +const canGoIn = function canGoIn(canvasSize, glyphList, charHeight, margin) { + var drawX = 1; + var drawY = 1; glyphList.forEach(glyph => { - if (drawX + glyph.width > canvasSize.width) { - drawX = 0; - drawY += charHeight; + if (drawX + glyph.width + margin * 2 > canvasSize.width) { + drawX = 1; + drawY += charHeight + margin * 2; } - drawX += glyph.width; + drawX += glyph.width + margin * 2; }); - return drawY + charHeight < canvasSize.height; + return drawY + charHeight + margin * 2 < canvasSize.height; }; const calculateCanvasSizeProp = function calculateCanvasSizeProp( text, glyphList, height, - charHeight + charHeight, + margin ) { var widthAverage = 0; var widthMax = 0; glyphList.forEach(glyph => { - if (glyph.width > widthMax) { - widthMax = glyph.width; + if (glyph.width + margin * 2 > widthMax) { + widthMax = glyph.width + margin * 2; } - widthAverage += glyph.width; + widthAverage += glyph.width + margin * 2; }); widthAverage /= glyphList.length; @@ -66,9 +67,9 @@ const calculateCanvasSizeProp = function calculateCanvasSizeProp( }; } // Use the average value to calculate the approximate size - var canvasSize = calculateCanvasSize(text, widthAverage, height); + var canvasSize = calculateCanvasSize(text, widthAverage, height, margin); // Increase the vertical width until the text can be entered - while (!canGoIn(canvasSize, glyphList, charHeight)) { + while (!canGoIn(canvasSize, glyphList, charHeight, margin)) { canvasSize.height *= 2; } return canvasSize; diff --git a/src/node_requires/resources/fonts/index.js b/src/node_requires/resources/fonts/index.js index a44153e63..e2bdc0495 100644 --- a/src/node_requires/resources/fonts/index.js +++ b/src/node_requires/resources/fonts/index.js @@ -76,9 +76,9 @@ const importTtfToFont = async function importTtfToFont(src) { italic: false, origname: `f${uid}.ttf`, lastmod: Number(new Date()), - pixelFont: false, - pixelFontSize: 16, - pixelFontLineHeight: 18, + bitmapFont: false, + bitmapFontSize: 16, + bitmapFontLineHeight: 18, charsets: ['allInFont'], customCharset: '', uid diff --git a/src/riotTags/main-menu.tag b/src/riotTags/main-menu.tag index 1e04e4337..3a6bd81d4 100644 --- a/src/riotTags/main-menu.tag +++ b/src/riotTags/main-menu.tag @@ -246,7 +246,7 @@ main-menu.flexcol const runCtExport = require('./data/node_requires/exporter'); const exportFile = path.join( buildFolder, - `${currentProject.settings.authoring.title || 'ct.js game'}.zip` + `${global.currentProject.settings.authoring.title || 'ct.js game'}.zip` ); const inDir = await getExportDir(); await fs.remove(exportFile); From edba6a4ca13cb86b125aa05222ff253d2867ae0d Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Tue, 25 Aug 2020 16:26:32 +1200 Subject: [PATCH 48/74] :zap: Rename "Author" field at settings into "Developer" (i18n strings only) --- app/data/i18n/English.json | 2 +- app/data/i18n/Russian.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/data/i18n/English.json b/app/data/i18n/English.json index 98dcbaa48..49536bc8c 100644 --- a/app/data/i18n/English.json +++ b/app/data/i18n/English.json @@ -208,7 +208,7 @@ }, "authoring": { "heading": "Authoring", - "author": "Author name:", + "author": "Developer:", "site": "Homepage:", "title": "Name:", "version": "Version:", diff --git a/app/data/i18n/Russian.json b/app/data/i18n/Russian.json index 84b488b65..105cc778b 100644 --- a/app/data/i18n/Russian.json +++ b/app/data/i18n/Russian.json @@ -184,7 +184,7 @@ }, "authoring": { "heading": "Авторство", - "author": "Автор:", + "author": "Разработчик:", "site": "Сайт автора:", "title": "Название:", "version": "Версия:", From d1d7473d7b1360b524347ea17f50259b20d611bc Mon Sep 17 00:00:00 2001 From: yondering <33736622+yonderbread@users.noreply.github.com> Date: Tue, 25 Aug 2020 14:00:10 -0700 Subject: [PATCH 49/74] Fixed broken link :chain: (#228) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d9b8b0803..599f4ced8 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ We have [daily builds at itch.io](https://comigo.itch.io/ct-nightly). This page # Repo structure & tools -* `app` — an [NW.js app](nwjs.io/), with its configs and static files. +* `app` — an [NW.js app](https://nwjs.io/), with its configs and static files. * `data` * `ct.release` — the ct.js game library, aka its "core" * `ct.libs` — catmods (modules) that ship with ct.js. Feel free to create a pull request with your module! From 18350ea5501d528c4c1fdec96716e2d7d1ba1e00 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Thu, 27 Aug 2020 10:23:36 +1200 Subject: [PATCH 50/74] :sparkles: Add texture generator for placeholders --- app/data/i18n/English.json | 16 +- .../{textures.js => textures/index.js} | 16 +- .../{ => textures}/texture-editor.tag | 0 src/riotTags/textures/texture-generator.tag | 137 ++++++++++++++++++ .../{ => textures}/textures-panel.tag | 15 ++ src/styl/tags/textures/texture-generator.styl | 14 ++ 6 files changed, 193 insertions(+), 5 deletions(-) rename src/node_requires/resources/{textures.js => textures/index.js} (95%) rename src/riotTags/{ => textures}/texture-editor.tag (100%) create mode 100644 src/riotTags/textures/texture-generator.tag rename src/riotTags/{ => textures}/textures-panel.tag (95%) create mode 100644 src/styl/tags/textures/texture-generator.styl diff --git a/app/data/i18n/English.json b/app/data/i18n/English.json index 49536bc8c..6caafeca5 100644 --- a/app/data/i18n/English.json +++ b/app/data/i18n/English.json @@ -11,6 +11,7 @@ "cancel": "Cancel", "cannotBeEmpty": "This cannot be empty", "clear": "Clear", + "close": "Close", "confirmDelete": "Are you sure you want to delete {0}? It cannot be undone.", "contribute": "Contribute", "copy": "Copy", @@ -287,7 +288,20 @@ "import": "Import", "skeletons": "Skeletal Animation", "createType": "Create a type from it", - "importFromClipboard": "Import from clipboard" + "importFromClipboard": "Import from clipboard", + "generatePlaceholder": "Generate a placeholder" + }, + "textureGenerator": { + "name": "Texture's name:", + "width": "Width:", + "height": "Height:", + "color": "Background color:", + "label": "Label:", + "optional": "(optional)", + "createAndClose": "Create and close", + "createAndContinue": "Create and add another", + "scalingAtX4": "Scaling by x4 for a small texture", + "generationSuccessMessage": "Successfully added $1 texture to your project." }, "textureview": { "bgcolor": "Change bg color", diff --git a/src/node_requires/resources/textures.js b/src/node_requires/resources/textures/index.js similarity index 95% rename from src/node_requires/resources/textures.js rename to src/node_requires/resources/textures/index.js index ef766c2ab..36a0dff64 100644 --- a/src/node_requires/resources/textures.js +++ b/src/node_requires/resources/textures/index.js @@ -219,12 +219,15 @@ const isBgPostfixTester = /@bg$/; /** * Tries to load an image, then adds it to the projects and creates a thumbnail * @param {string|Buffer} src A path to the source image, or a Buffer of an already read image. + * @param {string} [name] The name of the texture. Optional, defaults to 'NewTexture' + * or file's basename. * @returns {Promise} A promise that resolves into the resulting texture object. */ -const importImageToTexture = async src => { +// eslint-disable-next-line max-lines-per-function +const importImageToTexture = async (src, name) => { const fs = require('fs-extra'), path = require('path'), - generateGUID = require('./../generateGUID'); + generateGUID = require('./../../generateGUID'); const id = generateGUID(); let dest; if (src instanceof Buffer) { @@ -247,13 +250,16 @@ const importImageToTexture = async src => { image.src = 'file://' + dest + '?' + Math.random(); }); let texName; - if (src instanceof Buffer) { + if (name) { + texName = name; + } else if (src instanceof Buffer) { texName = 'NewTexture'; } else { texName = path.basename(src) .replace(/\.(jpg|gif|png|jpeg)/gi, '') .replace(/\s/g, '_'); } + console.log(texName, name); const obj = { name: texName, untill: 0, @@ -268,7 +274,6 @@ const importImageToTexture = async src => { offx: 0, offy: 0, origname: path.basename(dest), - source: src, shape: 'rect', left: 0, right: image.width, @@ -277,6 +282,9 @@ const importImageToTexture = async src => { uid: id, padding: 1 }; + if (!(src instanceof Buffer)) { + obj.source = src; + } // Test if this has a postfix _NxM@K or _NxM const exec = texturePostfixParser.exec(obj.name); diff --git a/src/riotTags/texture-editor.tag b/src/riotTags/textures/texture-editor.tag similarity index 100% rename from src/riotTags/texture-editor.tag rename to src/riotTags/textures/texture-editor.tag diff --git a/src/riotTags/textures/texture-generator.tag b/src/riotTags/textures/texture-generator.tag new file mode 100644 index 000000000..f95ad2b79 --- /dev/null +++ b/src/riotTags/textures/texture-generator.tag @@ -0,0 +1,137 @@ +// + @attribute onclose (riot function) + Called when a user presses the "Close" button. Passes no arguments. +texture-generator.view + .flexcol.tall + .flexrow.tall + .panel.texture-generator-Settings.nogrow + fieldset + label.block + b {voc.name} + input.wide(type="text" oninput="{wire('this.textureName')}" value="{textureName}") + .anErrorNotice(if="{nameTaken}" ref="errorNotice") {vocGlob.nametaken} + fieldset + label.block + b {voc.width} + input.wide(type="number" oninput="{wire('this.textureWidth')}" value="{textureWidth}" min="8" step="8") + label.block + b {voc.height} + input.wide(type="number" oninput="{wire('this.textureHeight')}" value="{textureHeight}" min="8" step="8") + label.block + b {voc.color} + color-input(onchange="{changeColor}" color="{textureColor}") + fieldset + label.block + b {voc.label} + | + | {voc.optional} + input.wide(type="text" oninput="{wire('this.textureLabel')}" value="{textureLabel}") + .texture-generator-aPreview + canvas(ref="canvas" style="image-rendering: {small ? 'pixelated' : 'unset'}; transform: scale({small ? 4 : 1});") + .texture-generator-aScalingNotice(if="{textureWidth < 64 && textureHeight < 64}") + | {voc.scalingAtX4} + .flexrow.nogrow + button(onclick="{close}") + svg.feather + use(xlink:href="data/icons.svg#x") + span {vocGlob.close} + button(onclick="{createAndClose}") + svg.feather + use(xlink:href="data/icons.svg#check") + span {voc.createAndClose} + button(onclick="{create}") + svg.feather + use(xlink:href="data/icons.svg#loader") + span {voc.createAndContinue} + script. + this.namespace = 'textureGenerator'; + this.mixin(window.riotVoc); + this.mixin(window.riotWired); + + this.textureName = 'Placeholder'; + this.textureWidth = this.textureHeight = 64; + this.textureColor = '#446adb'; + this.textureLabel = ''; + + this.changeColor = e => { + this.wire('this.textureColor')(e); + this.update(); + }; + + this.refreshCanvas = () => { + const {canvas} = this.refs; + if (!canvas.x) { + canvas.x = canvas.getContext('2d'); + } + const {x} = canvas; + this.small = this.textureWidth < 64 && this.textureHeight < 64; + canvas.width = this.textureWidth; + canvas.height = this.textureHeight; + x.clearRect(0, 0, canvas.width, canvas.height); + + x.fillStyle = this.textureColor; + x.fillRect(0, 0, canvas.width, canvas.height); + + let label; + if (this.textureLabel.trim()) { + label = this.textureLabel.trim(); + } else { + label = `${canvas.width}×${canvas.height}`; + } + + // Fit the text into 80% of canvas' width + x.font = '100px Iosevka'; + const measure = x.measureText(label).width; + let k = canvas.width * 0.8 / measure; + // Cannot exceed canvas' height + if (k * 100 > canvas.height * 0.8) { + k = canvas.height * 0.8 / 100; + } + + x.font = `${Math.round(k * 100)}px Iosevka`; + x.textBaseline = 'middle'; + x.textAlign = 'center'; + + const dark = window.brehautColor(this.textureColor).getLuminance() < 0.5; + x.fillStyle = dark ? '#fff' : '#000'; + x.fillText(label, canvas.width / 2, canvas.height / 2); + }; + + this.on('mount', this.refreshCanvas); + this.on('update', this.refreshCanvas); + + this.close = () => { + if (this.opts.onclose) { + this.opts.onclose(); + } + }; + this.create = async () => { + const {textures} = global.currentProject; + this.nameTaken = textures.find(texture => this.textureName === texture.name); + + if (this.nameTaken) { + this.update(); + require('./data/node_requires/jellify')(this.refs.errorNotice); + if (localStorage.disableSounds !== 'on') { + soundbox.play('Failure'); + } + return false; + } + + this.refreshCanvas(); + const {canvas} = this.refs; + const {importImageToTexture} = require('./data/node_requires/resources/textures'); + const png = canvas.toDataURL(); + const imageBase64 = png.replace(/^data:image\/\w+;base64,/, ''); + const imageBuffer = new Buffer(imageBase64, 'base64'); + await importImageToTexture(imageBuffer, this.textureName); + window.alertify.success(this.voc.generationSuccessMessage.replace('$1', this.textureName)); + + return true; + }; + this.createAndClose = async () => { + if (!(await this.create())) { + return; + } + this.close(); + }; \ No newline at end of file diff --git a/src/riotTags/textures-panel.tag b/src/riotTags/textures/textures-panel.tag similarity index 95% rename from src/riotTags/textures-panel.tag rename to src/riotTags/textures/textures-panel.tag index a92f5872b..456bd12ba 100644 --- a/src/riotTags/textures-panel.tag +++ b/src/riotTags/textures/textures-panel.tag @@ -26,6 +26,12 @@ textures-panel.panel.view ) svg.feather use(xlink:href="data/icons.svg#clipboard") + button( + onclick="{parent.openGenerator}" + title="{voc.generatePlaceholder}" + ) + svg.feather + use(xlink:href="data/icons.svg#loader") asset-viewer( collection="{global.currentProject.skeletons}" contextmenu="{showSkeletonPopup}" @@ -46,6 +52,7 @@ textures-panel.panel.view use(xlink:href="data/icons.svg#download") span {voc.import} texture-editor(if="{editing}" texture="{currentTexture}") + texture-generator(if="{generating}" onclose="{closeGenerator}") context-menu(menu="{textureMenu}" ref="textureMenu") script. const glob = require('./data/node_requires/glob'); @@ -142,6 +149,14 @@ textures-panel.panel.view alertify.success(this.vocGlob.pastedFromClipboard); }; + this.openGenerator = () => { + this.generating = true; + }; + this.closeGenerator = () => { + this.generating = false; + this.update(); + }; + const deleteCurrentTexture = () => { for (const type of global.currentProject.types) { if (type.texture === this.currentTexture.uid) { diff --git a/src/styl/tags/textures/texture-generator.styl b/src/styl/tags/textures/texture-generator.styl new file mode 100644 index 000000000..555397864 --- /dev/null +++ b/src/styl/tags/textures/texture-generator.styl @@ -0,0 +1,14 @@ +texture-generator + .&-aPreview + padding 1rem + position relative + canvas + transform-origin 0 0 + .&-aScalingNotice + position absolute + bottom 1rem + left 1rem + .&-Settings + border-width 0 1px 0 0 + width 15rem + padding 1rem \ No newline at end of file From e3965e3fe79fbe7c2b68fb1e2157ebe3b2579b2a Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Thu, 27 Aug 2020 11:06:25 +1200 Subject: [PATCH 51/74] :zap: Icons that highlight deprecated and preview modules more clearly --- app/data/i18n/English.json | 3 +++ .../project-settings/modules/module-meta.tag | 14 ++++++++++++-- src/styl/tags/settings/modules/module-meta.styl | 13 +++++++++++-- .../tags/settings/modules/modules-settings.styl | 6 ------ 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/app/data/i18n/English.json b/app/data/i18n/English.json index 6caafeca5..199211b24 100644 --- a/app/data/i18n/English.json +++ b/app/data/i18n/English.json @@ -268,6 +268,9 @@ "enabledModules": "Enabled modules", "availableModules": "Available modules", "filter": "Filter", + "preview": "(preview)", + "previewTooltip": "This module has not yet been released and is for preview purposes.", + "deprecatedTooltip": "This module is deprecated and will be removed in a future version.", "categories": { "customization": "Customization", "utilities": "Utilities", diff --git a/src/riotTags/project-settings/modules/module-meta.tag b/src/riotTags/project-settings/modules/module-meta.tag index b96a68c59..4a6e79e4a 100644 --- a/src/riotTags/project-settings/modules/module-meta.tag +++ b/src/riotTags/project-settings/modules/module-meta.tag @@ -1,8 +1,12 @@ module-meta(onclick="{toggleModule(opts.module.name)}") .flexrow div - h1 {opts.module.manifest.main.name} - code {opts.module.name} v{opts.module.manifest.main.version} + h1.nmt {opts.module.manifest.main.name} + code + | {opts.module.name} v{opts.module.manifest.main.version} + | + span(if="{opts.module.manifest.main.version.indexOf(0) === 0}") {voc.preview} + label.nogrow.bigpower(class="{off: !(opts.module.name in global.currentProject.libs)}") svg.feather use(xlink:href="data/icons.svg#{opts.module.name in global.currentProject.libs? 'check' : 'x'}") @@ -29,6 +33,12 @@ module-meta(onclick="{toggleModule(opts.module.name)}") .filler .flexrow + span.nogrow.module-meta-aWarningIcon(title="{voc.deprecatedTooltip}" if="{opts.module.manifest.main.deprecated}") + svg.feather.error + use(xlink:href="data/icons.svg#alert-circle") + span.nogrow.module-meta-aWarningIcon(title="{voc.previewTooltip}" if="{opts.module.manifest.main.version.indexOf(0) === 0}") + svg.feather.warning + use(xlink:href="data/icons.svg#alert-triangle") .aModuleAuthorList a.external( each="{author in opts.module.manifest.main.authors}" diff --git a/src/styl/tags/settings/modules/module-meta.styl b/src/styl/tags/settings/modules/module-meta.styl index a8820c0e7..0b11e91ad 100644 --- a/src/styl/tags/settings/modules/module-meta.styl +++ b/src/styl/tags/settings/modules/module-meta.styl @@ -1,4 +1,8 @@ module-meta + display flex + flex-flow column nowrap + & > * + flex 0 0 auto h1 margin 0 0 0.35rem .bigpower @@ -10,7 +14,6 @@ module-meta float right opacity 0.65 .aModuleAuthorList - margin-top 0.75rem font-size 90% a margin-right 1rem @@ -28,6 +31,12 @@ module-meta margin-left 1rem flex 0 0 auto align-self flex-end + .&-aWarningIcon + align-self center + margin-right 0.5rem .hsub line-height 1.5 - margin 0.5rem 0 \ No newline at end of file + margin 0.5rem 0 + .filler + flex 1 1 auto + padding-top 0.75rem \ No newline at end of file diff --git a/src/styl/tags/settings/modules/modules-settings.styl b/src/styl/tags/settings/modules/modules-settings.styl index 74aa9c9a1..683c1905f 100644 --- a/src/styl/tags/settings/modules/modules-settings.styl +++ b/src/styl/tags/settings/modules/modules-settings.styl @@ -10,12 +10,6 @@ grid-gap 1rem module-meta height 100% - display flex - flex-flow column nowrap - & > * - flex 0 0 auto - .filler - flex 1 1 auto .aModuleCard @extends .panel padding 1rem 1rem 1rem 1.5rem From be87b43a39815b5db0a1ddb0f9dd1b2d2aae94ca Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Thu, 27 Aug 2020 11:07:16 +1200 Subject: [PATCH 52/74] :bug: Remove leftover console.log statement --- src/node_requires/resources/textures/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/node_requires/resources/textures/index.js b/src/node_requires/resources/textures/index.js index 36a0dff64..824c621b9 100644 --- a/src/node_requires/resources/textures/index.js +++ b/src/node_requires/resources/textures/index.js @@ -259,7 +259,6 @@ const importImageToTexture = async (src, name) => { .replace(/\.(jpg|gif|png|jpeg)/gi, '') .replace(/\s/g, '_'); } - console.log(texName, name); const obj = { name: texName, untill: 0, From add3e9af9d4a0713c6d27f22616eff450afec1c2 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Thu, 27 Aug 2020 11:59:28 +1200 Subject: [PATCH 53/74] :sparkles: slider, sliderAndNumber input types for extensions, and additional settings for them and number inputs --- src/riotTags/shared/extensions-editor.tag | 39 +++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/src/riotTags/shared/extensions-editor.tag b/src/riotTags/shared/extensions-editor.tag index 3b1c7a141..2c4ad460f 100644 --- a/src/riotTags/shared/extensions-editor.tag +++ b/src/riotTags/shared/extensions-editor.tag @@ -4,7 +4,7 @@ @attribute entity (riot object) An object to which apply editing to. - @attribute type (string, 'type'|'tileLayer'|'room') + @attribute type (string, 'type'|'tileLayer'|'room'|'copy') The type of the edited asset. Not needed if customextends is set. @attribute [compact] (atomic) @@ -22,7 +22,8 @@ declare interface IExtensionField { name: string, // the displayed name. // Below 'h1', 'h2', 'h3', 'h4' are purely decorational, for grouping fields. Others denote the type of an input field. - type: 'h1' | 'h2' | 'h3' | 'h4' | 'text' | 'textfield' | 'code' | 'number' | 'point2D' | 'checkbox' | 'radio' | 'texture' | 'type', + type: 'h1' | 'h2' | 'h3' | 'h4' | 'text' | 'textfield' | 'code' | 'number' | + 'slider' | 'sliderAndNumber' | 'point2D' | 'checkbox' | 'radio' | 'texture' | 'type', key?: string, // the name of a JSON key to write into the `opts.entity`. Not needed for hN types, but required otherwise // The key may have special suffixes that tell the exporter to unwrap foreign keys (resources' UIDs) into asset names. // These are supposed to always be used with `'type'` and `'texture'` input types. @@ -117,7 +118,41 @@ extensions-editor type="number" value="{parent.opts.entity[ext.key] || ext.default}" onchange="{wire('this.opts.entity.'+ ext.key)}" + min="{ext.min}" + max="{ext.max}" + step="{ext.step}" ) + .aSliderWrap(if="{ext.type === 'slider'}") + input( + class="{compact: parent.opts.compact, wide: parent.opts.wide}" + type="range" + value="{parent.opts.entity[ext.key] || ext.default}" + onchange="{wire('this.opts.entity.'+ ext.key)}" + min="{ext.min}" + max="{ext.max}" + step="{ext.step}" + ) + .flexrow(if="{ext.type === 'sliderAndNumber'}") + .aSliderWrap + input( + class="{compact: parent.opts.compact}" + type="range" + value="{parent.opts.entity[ext.key] || ext.default}" + onchange="{wire('this.opts.entity.'+ ext.key)}" + min="{ext.min}" + max="{ext.max}" + step="{ext.step}" + ) + .spacer + input( + class="{compact: parent.opts.compact}" + type="number" + value="{parent.opts.entity[ext.key] || ext.default}" + onchange="{wire('this.opts.entity.'+ ext.key)}" + min="{ext.min}" + max="{ext.max}" + step="{ext.step}" + ) label.block.checkbox(if="{ext.type === 'radio'}" each="{option in ext.options}") input( type="radio" From 289281ca516d096ee880309db4ecb83995551d8d Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Thu, 27 Aug 2020 12:50:20 +1200 Subject: [PATCH 54/74] :bug: Fix incorrect drawing of scaled copies --- src/riotTags/rooms/room-editor.tag | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/riotTags/rooms/room-editor.tag b/src/riotTags/rooms/room-editor.tag index 3b8b48c70..c3b9a070a 100644 --- a/src/riotTags/rooms/room-editor.tag +++ b/src/riotTags/rooms/room-editor.tag @@ -581,7 +581,7 @@ room-editor.panel.view canvas.x.drawImage( texture, ox, oy, w, h, - -grax * (copy.tx || 1), -gray * (copy.ty || 1), w, h + -grax, -gray, w, h ); canvas.x.restore(); } else { From 4713c38c858c40743c948f9dcaf094a61dc15343 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Thu, 27 Aug 2020 12:51:14 +1200 Subject: [PATCH 55/74] :sparkles: Add a properties panel for tweaking parameters of an individual copy --- app/data/i18n/English.json | 7 ++- src/riotTags/rooms/room-copy-properties.tag | 59 +++++++++++++++++++ src/riotTags/rooms/room-editor.tag | 6 ++ src/styl/inputs.styl | 36 +++++++++++ src/styl/tags/rooms/room-copy-properties.styl | 9 +++ 5 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 src/riotTags/rooms/room-copy-properties.tag create mode 100644 src/styl/tags/rooms/room-copy-properties.styl diff --git a/app/data/i18n/English.json b/app/data/i18n/English.json index 199211b24..7691847c9 100644 --- a/app/data/i18n/English.json +++ b/app/data/i18n/English.json @@ -571,7 +571,12 @@ "deletetiles": "Delete tiles", "movetilestolayer": "Move to layer", "shifttiles": "Shift tiles", - "findTileset": "Find a tileset" + "findTileset": "Find a tileset", + "copyProperties": { + "position": "Position", + "rotation": "Rotation", + "scale": "Scale" + } }, "notepad": { "local": "Project's notepad", diff --git a/src/riotTags/rooms/room-copy-properties.tag b/src/riotTags/rooms/room-copy-properties.tag new file mode 100644 index 000000000..b9a6e4f8f --- /dev/null +++ b/src/riotTags/rooms/room-copy-properties.tag @@ -0,0 +1,59 @@ +room-copy-properties.panel + b {voc.position}: + .aPoint2DInput.compact.wide + label + span X: + | + input.compact( + step="8" type="number" + oninput="{wire('this.opts.copy.x')}" + value="{opts.copy.x}" + ) + .spacer + label + span.nogrow Y: + | + input.compact( + step="8" type="number" + oninput="{wire('this.opts.copy.y')}" + value="{opts.copy.y}" + ) + b {voc.scale}: + .aPoint2DInput.compact.wide + label + span X: + | + input.compact( + step="0.1" type="number" + oninput="{wire('this.opts.copy.tx')}" + value="{opts.copy.tx === void 0 ? 1 : opts.copy.tx}" + ) + .spacer + label + span.nogrow Y: + | + input.compact( + step="0.1" type="number" + oninput="{wire('this.opts.copy.ty')}" + value="{opts.copy.ty === void 0 ? 1 : opts.copy.ty}" + ) + b {voc.rotation}: + dd + .flexrow + .aSliderWrap + input.compact( + type="range" min="0" max="360" step="1" + value="{opts.copy.tr || 0}" + oninput="{wire('this.opts.copy.tr')}" + ) + .spacer + input.compact( + min="0" max="360" step="1" type="number" + value="{opts.copy.tr || 0}" + oninput="{wire('this.opts.copy.tr')}" + ) + extensions-editor(entity="{opts.copy}" type="copy" compact="yes" wide="yup") + script. + this.namespace = 'roomview.copyProperties'; + this.mixin(window.riotVoc); + this.mixin(window.riotWired); \ No newline at end of file diff --git a/src/riotTags/rooms/room-editor.tag b/src/riotTags/rooms/room-editor.tag index c3b9a070a..e889da43c 100644 --- a/src/riotTags/rooms/room-editor.tag +++ b/src/riotTags/rooms/room-editor.tag @@ -85,6 +85,11 @@ room-editor.panel.view .center button#roomcenter(onclick="{roomToCenter}") {voc.tocenter} span.aMouseCoord(if="{window.innerWidth - sidebarWidth > 470}" ref="mousecoords") ({mouseX}:{mouseY}) + room-copy-properties( + if="{this.selectedCopies && this.selectedCopies.length === 1}" + copy="{this.selectedCopies[0]}" + onchange="{refreshRoomCanvas}" oninput="{refreshRoomCanvas}" + ) room-events-editor(if="{editingCode}" room="{room}") context-menu(menu="{roomCanvasCopiesMenu}" ref="roomCanvasCopiesMenu") context-menu(menu="{roomCanvasMenu}" ref="roomCanvasMenu") @@ -246,6 +251,7 @@ room-editor.panel.view this.tab = 'roomcopies'; this.changeTab = tab => () => { this.tab = tab; + this.selectedCopies = this.selectedTiles = false; if (tab === 'roombackgrounds' || tab === 'properties') { this.roomUnpickType(); } diff --git a/src/styl/inputs.styl b/src/styl/inputs.styl index 465d43915..93dea4870 100644 --- a/src/styl/inputs.styl +++ b/src/styl/inputs.styl @@ -248,6 +248,42 @@ select right 0.5em top 50% + +.aSliderWrap + display flex + align-items center + position relative + width 100% + height 2em + font 1em/1 sans-seri + +.aSliderWrap [type=range] + flex 1 + margin 0 + padding 0 + min-height 1.5em + background transparent + font inherit + +.aSliderWrap [type=range], .aSliderWrap [type=range]::-webkit-slider-thumb + -webkit-appearance none + +.aSliderWrap [type=range]::-webkit-slider-runnable-track + box-sizing border-box + border 1px solid borderBright + width 100% + height 0.5em + background background + +.aSliderWrap [type=range]::-webkit-slider-thumb + margin-top -0.625em + box-sizing border-box + border none + width 1.5em + height 1.5em + border-radius 50% + background act + label, .label & + & margin-top 0.5rem diff --git a/src/styl/tags/rooms/room-copy-properties.styl b/src/styl/tags/rooms/room-copy-properties.styl new file mode 100644 index 000000000..48a758e1c --- /dev/null +++ b/src/styl/tags/rooms/room-copy-properties.styl @@ -0,0 +1,9 @@ +room-copy-properties + display block + padding 1rem + room-editor &.panel + {shadamb} + position absolute + right 1rem + top 4rem + width 20rem \ No newline at end of file From ea193a400a9f3f1b648233b94ff06ec965bf7c68 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Thu, 27 Aug 2020 13:23:02 +1200 Subject: [PATCH 56/74] :sparkles: Sort copies or tiles inside a room with two new buttons at the top-left corner of the room editor. Extremely handy for isometric games! --- app/data/i18n/English.json | 2 ++ src/icons/sort-horizontal.svg | 7 +++++ src/icons/sort-vertical.svg | 7 +++++ src/riotTags/rooms/room-editor.tag | 49 +++++++++++++++++++++++++----- 4 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 src/icons/sort-horizontal.svg create mode 100644 src/icons/sort-vertical.svg diff --git a/app/data/i18n/English.json b/app/data/i18n/English.json index 7691847c9..2d003efdd 100644 --- a/app/data/i18n/English.json +++ b/app/data/i18n/English.json @@ -563,6 +563,8 @@ "deletecopy": "Delete copy {0}", "deleteCopies": "Delete copies", "shiftCopies": "Shift copies", + "sortHorizontally": "Sort horizontally", + "sortVertically": "Sort vertically", "selectAndMove": "Select and Move", "changecopyscale": "Change scale", "changecopyrotation": "Rotate", diff --git a/src/icons/sort-horizontal.svg b/src/icons/sort-horizontal.svg new file mode 100644 index 000000000..6d66400e5 --- /dev/null +++ b/src/icons/sort-horizontal.svg @@ -0,0 +1,7 @@ + + + + + + diff --git a/src/icons/sort-vertical.svg b/src/icons/sort-vertical.svg new file mode 100644 index 000000000..3c708f4d0 --- /dev/null +++ b/src/icons/sort-vertical.svg @@ -0,0 +1,7 @@ + + + + + + diff --git a/src/riotTags/rooms/room-editor.tag b/src/riotTags/rooms/room-editor.tag index e889da43c..8e61207ef 100644 --- a/src/riotTags/rooms/room-editor.tag +++ b/src/riotTags/rooms/room-editor.tag @@ -68,23 +68,37 @@ room-editor.panel.view button.inline.square(title="{voc.shift}" onclick="{roomShift}") svg.feather use(xlink:href="data/icons.svg#move") - span(if="{window.innerWidth - sidebarWidth > 840}") {voc.hotkeysNotice} + button.inline.square( + title="{voc.sortHorizontally}" + onclick="{sortHorizontally}" + if="{tab === 'roomcopies' || tab === 'roomtiles'}" + ) + svg.feather + use(xlink:href="data/icons.svg#sort-horizontal") + button.inline.square( + title="{voc.sortVertically}" + onclick="{sortVertically}" + if="{tab === 'roomcopies' || tab === 'roomtiles'}" + ) + svg.feather + use(xlink:href="data/icons.svg#sort-vertical") + span(if="{window.innerWidth - sidebarWidth > 940}") {voc.hotkeysNotice} .zoom - b(if="{window.innerWidth - sidebarWidth > 840}") {vocGlob.zoom} + b(if="{window.innerWidth - sidebarWidth > 980}") {vocGlob.zoom} div.button-stack - button#roomzoom12.inline(if="{window.innerWidth - sidebarWidth > 470}" onclick="{roomToggleZoom(0.125)}" class="{active: zoomFactor === 0.125}") 12% + button#roomzoom12.inline(if="{window.innerWidth - sidebarWidth > 620}" onclick="{roomToggleZoom(0.125)}" class="{active: zoomFactor === 0.125}") 12% button#roomzoom25.inline(onclick="{roomToggleZoom(0.25)}" class="{active: zoomFactor === 0.25}") 25% - button#roomzoom50.inline(if="{window.innerWidth - sidebarWidth > 470}" onclick="{roomToggleZoom(0.5)}" class="{active: zoomFactor === 0.5}") 50% + button#roomzoom50.inline(if="{window.innerWidth - sidebarWidth > 620}" onclick="{roomToggleZoom(0.5)}" class="{active: zoomFactor === 0.5}") 50% button#roomzoom100.inline(onclick="{roomToggleZoom(1)}" class="{active: zoomFactor === 1}") 100% button#roomzoom200.inline(onclick="{roomToggleZoom(2)}" class="{active: zoomFactor === 2}") 200% - button#roomzoom400.inline(if="{window.innerWidth - sidebarWidth > 470}" onclick="{roomToggleZoom(4)}" class="{active: zoomFactor === 4}") 400% - button#roomzoom800.inline(if="{window.innerWidth - sidebarWidth > 470}" onclick="{roomToggleZoom(8)}" class="{active: zoomFactor === 8}") 800% + button#roomzoom400.inline(if="{window.innerWidth - sidebarWidth > 620}" onclick="{roomToggleZoom(4)}" class="{active: zoomFactor === 4}") 400% + button#roomzoom800.inline(if="{window.innerWidth - sidebarWidth > 620}" onclick="{roomToggleZoom(8)}" class="{active: zoomFactor === 8}") 800% .grid button#roomgrid(onclick="{roomToggleGrid}" class="{active: room.gridX > 0}") span {voc[room.gridX > 0? 'gridoff' : 'grid']} .center button#roomcenter(onclick="{roomToCenter}") {voc.tocenter} - span.aMouseCoord(if="{window.innerWidth - sidebarWidth > 470}" ref="mousecoords") ({mouseX}:{mouseY}) + span.aMouseCoord(show="{window.innerWidth - sidebarWidth > 470}" ref="mousecoords") ({mouseX}:{mouseY}) room-copy-properties( if="{this.selectedCopies && this.selectedCopies.length === 1}" copy="{this.selectedCopies[0]}" @@ -472,6 +486,27 @@ room-editor.panel.view return true; }; + this.sortHorizontally = () => { + if (this.tab === 'roomcopies') { + this.room.copies.sort((a, b) => a.x - b.x); + } else { + // tiles + this.currentTileLayer.tiles.sort((a, b) => a.x - b.x); + } + this.resortRoom(); + this.refreshRoomCanvas(); + }; + this.sortVertically = () => { + if (this.tab === 'roomcopies') { + this.room.copies.sort((a, b) => a.y - b.y); + } else { + // tiles + this.currentTileLayer.tiles.sort((a, b) => a.y - b.y); + } + this.resortRoom(); + this.refreshRoomCanvas(); + }; + this.resortRoom = () => { // Make an array of all the backgrounds, tile layers and copies, and then sort it. this.stack = this.room.copies.concat(this.room.backgrounds).concat(this.room.tiles); From 59304e7139cbebbca82dba3a57e5ed53aa60ec18 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Thu, 27 Aug 2020 14:12:25 +1200 Subject: [PATCH 57/74] :sparkles: Add support for moddable extensions for individual copies --- app/data/ct.release/rooms.js | 4 +++- src/js/migration/1.4.2.js | 17 +++++++++++++++++ src/riotTags/rooms/room-copy-properties.tag | 2 +- 3 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 src/js/migration/1.4.2.js diff --git a/app/data/ct.release/rooms.js b/app/data/ct.release/rooms.js index dfc81becf..98ae47338 100644 --- a/app/data/ct.release/rooms.js +++ b/app/data/ct.release/rooms.js @@ -47,6 +47,7 @@ class Room extends PIXI.Container { this.addChild(tl); } for (let i = 0, li = template.objects.length; i < li; i++) { + const exts = template.objects[i].exts || {}; ct.types.make( template.objects[i].type, template.objects[i].x, @@ -54,7 +55,8 @@ class Room extends PIXI.Container { { tx: template.objects[i].tx, ty: template.objects[i].ty, - tr: template.objects[i].tr + tr: template.objects[i].tr, + ...exts }, this ); diff --git a/src/js/migration/1.4.2.js b/src/js/migration/1.4.2.js new file mode 100644 index 000000000..e8f45854c --- /dev/null +++ b/src/js/migration/1.4.2.js @@ -0,0 +1,17 @@ +window.migrationProcess = window.migrationProcess || []; + +window.migrationProcess.push({ + version: '1.4.2', + process: project => new Promise(resolve => { + /** + * Copies now have their own extensions + */ + for (const room of project.rooms) { + for (const copy of room.copies) { + copy.exts = copy.exts || {}; + } + } + + resolve(); + }) +}); diff --git a/src/riotTags/rooms/room-copy-properties.tag b/src/riotTags/rooms/room-copy-properties.tag index b9a6e4f8f..1a87a0129 100644 --- a/src/riotTags/rooms/room-copy-properties.tag +++ b/src/riotTags/rooms/room-copy-properties.tag @@ -52,7 +52,7 @@ room-copy-properties.panel value="{opts.copy.tr || 0}" oninput="{wire('this.opts.copy.tr')}" ) - extensions-editor(entity="{opts.copy}" type="copy" compact="yes" wide="yup") + extensions-editor(entity="{opts.copy.exts}" type="copy" compact="yes" wide="yup") script. this.namespace = 'roomview.copyProperties'; this.mixin(window.riotVoc); From bdf6e75bb71b4a1ca17d9b29ae43eb5cab29332a Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Thu, 27 Aug 2020 14:12:53 +1200 Subject: [PATCH 58/74] :sparkles: Add 'tag' module, for adding tags for individual copies and rooms --- app/data/ct.libs/tag/module.json | 26 ++++++++++++++++++++++++++ app/data/ct.libs/tag/types.d.ts | 8 ++++++++ 2 files changed, 34 insertions(+) create mode 100644 app/data/ct.libs/tag/module.json create mode 100644 app/data/ct.libs/tag/types.d.ts diff --git a/app/data/ct.libs/tag/module.json b/app/data/ct.libs/tag/module.json new file mode 100644 index 000000000..59026205e --- /dev/null +++ b/app/data/ct.libs/tag/module.json @@ -0,0 +1,26 @@ +{ + "main": { + "name": "Tags", + "tagline": "Add tags (this.tag) to your rooms and individual copies!", + "version": "1.0.0", + "authors": [{ + "name": "Cosmo Myzrail Gorynych", + "mail": "admin@nersta.ru" + }], + "categories": [ + "utilities" + ] + }, + "roomExtends": [{ + "name": "Tag", + "type": "text", + "default": "", + "key": "tag" + }], + "copyExtends": [{ + "name": "Tag", + "type": "text", + "default": "", + "key": "tag" + }] +} diff --git a/app/data/ct.libs/tag/types.d.ts b/app/data/ct.libs/tag/types.d.ts new file mode 100644 index 000000000..51df8b99c --- /dev/null +++ b/app/data/ct.libs/tag/types.d.ts @@ -0,0 +1,8 @@ +interface Copy { + /** The tag of a copy, set inside the room editor. */ + tag: string; +} +interface Room { + /** The tag of a room, set inside the room's properties. */ + tag: string; +} From aab551ab7670767988506e62d30905a647c88a1f Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Thu, 27 Aug 2020 14:19:09 +1200 Subject: [PATCH 59/74] :bug: Fix linter warnings at src/styl/inputs.styl --- src/styl/inputs.styl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/styl/inputs.styl b/src/styl/inputs.styl index 93dea4870..734966f02 100644 --- a/src/styl/inputs.styl +++ b/src/styl/inputs.styl @@ -278,7 +278,7 @@ select .aSliderWrap [type=range]::-webkit-slider-thumb margin-top -0.625em box-sizing border-box - border none + border 0 width 1.5em height 1.5em border-radius 50% From 6646190e87db46ee0354d73aa560aa1b7e64824d Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Thu, 27 Aug 2020 14:39:36 +1200 Subject: [PATCH 60/74] :sparkles: In the room editor, shift+click now selects the nearest copy or tile --- src/js/roomCopyTools.js | 22 ++++++++++++++- src/js/roomTileTools.js | 60 ++++++++++++++++++++++++++++------------- 2 files changed, 63 insertions(+), 19 deletions(-) diff --git a/src/js/roomCopyTools.js b/src/js/roomCopyTools.js index b4fc19cd5..b103939d8 100644 --- a/src/js/roomCopyTools.js +++ b/src/js/roomCopyTools.js @@ -158,11 +158,31 @@ }; // Place a copy on click this.onCanvasClickCopies = e => { - if (Math.hypot(e.offsetX - this.startx, e.offsetY - this.starty) > clickThreshold && + if ( + Math.hypot( + e.offsetX - this.startx, + e.offsetY - this.starty + ) > clickThreshold && !e.shiftKey ) { return; // this looks neither like a regular click nor like a Shift+drag } + if ( + Math.hypot( + e.offsetX - this.startx, + e.offsetY - this.starty + ) <= clickThreshold && + e.shiftKey + ) { + // It is a shift + click. Select the nearest copy + if (!this.room.copies.length) { + return; + } + var copy = selectACopyAt.apply(this, [e]); + this.selectedCopies = [copy]; + this.refreshRoomCanvas(); + return; + } // Cancel copy selection on click if (this.selectedCopies && !this.movingStuff && diff --git a/src/js/roomTileTools.js b/src/js/roomTileTools.js index fbf8e0c01..07031b543 100644 --- a/src/js/roomTileTools.js +++ b/src/js/roomTileTools.js @@ -2,12 +2,30 @@ const clickThreshold = 16; const glob = require('./data/node_requires/glob'); + const selectATileAt = function (e) { + var pos = 0, + length = Infinity, + l, + fromx = this.xToRoom(e.offsetX), + fromy = this.yToRoom(e.offsetY); + for (let i = 0, li = this.currentTileLayer.tiles.length; i < li; i++) { + const xp = this.currentTileLayer.tiles[i].x - fromx, + yp = this.currentTileLayer.tiles[i].y - fromy; + l = Math.sqrt(xp * xp + yp * yp); + if (l < length) { + length = l; + pos = i; + } + } + return this.currentTileLayer.tiles[pos]; + }; + const onCanvasMouseUpTiles = function (e) { if (e.button === 0 && this.currentTileLayer && Math.hypot(e.offsetX - this.startx, e.offsetY - this.starty) > clickThreshold ) { - // Было прямоугольное выделение + // There was a rectangular selection this.selectedTiles = []; var x1 = this.xToRoom(this.startx), y1 = this.yToRoom(this.starty), @@ -101,12 +119,32 @@ const onCanvasClickTiles = function (e) { if ( - Math.hypot(e.offsetX - this.startx, e.offsetY - this.starty) > clickThreshold && + Math.hypot( + e.offsetX - this.startx, + e.offsetY - this.starty + ) > clickThreshold && !e.shiftKey ) { return; // this looks neither like a regular click nor like a Shift+drag } + if ( + Math.hypot( + e.offsetX - this.startx, + e.offsetY - this.starty + ) <= clickThreshold && + e.shiftKey + ) { + // It is a shift + click. Select the nearest copy + if (!this.currentTileLayer.tiles.length) { + return; + } + var tile = selectATileAt.apply(this, [e]); + this.selectedTiles = [tile]; + this.refreshRoomCanvas(); + return; + } + // cancel potential tile selection on click if ( this.selectedTiles && !this.movingStuff && @@ -181,23 +219,9 @@ if (!this.room.tiles.length || !this.currentTileLayer.tiles.length) { return false; } - var pos = 0, - length = Infinity, - l, - fromx = this.xToRoom(e.offsetX), - fromy = this.yToRoom(e.offsetY); - for (let i = 0, li = this.currentTileLayer.tiles.length; i < li; i++) { - const xp = this.currentTileLayer.tiles[i].x - fromx, - yp = this.currentTileLayer.tiles[i].y - fromy; - l = Math.sqrt(xp * xp + yp * yp); - if (l < length) { - length = l; - pos = i; - } - } - var tile = this.currentTileLayer.tiles[pos], + var tile = selectATileAt.apply(this, [e]), tex = glob.texturemap[tile.texture].g; - this.closestPos = pos; + this.closestPos = this.currentTileLayer.tiles.indexOf(tile); // draw the tile preview this.refreshRoomCanvas(); var left = tile.x - 1.5, From 98fc575e138c1389e020b0cf9cea97f590c964b1 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Thu, 27 Aug 2020 14:58:43 +1200 Subject: [PATCH 61/74] :fire: Remove keymage.js, as it is not used anymore --- src/js/3rdparty/keymage.js | 355 ------------------------------------- 1 file changed, 355 deletions(-) delete mode 100644 src/js/3rdparty/keymage.js diff --git a/src/js/3rdparty/keymage.js b/src/js/3rdparty/keymage.js deleted file mode 100644 index 77f4f8870..000000000 --- a/src/js/3rdparty/keymage.js +++ /dev/null @@ -1,355 +0,0 @@ -/** @license - * keymage.js - Javascript keyboard bindings handling - * http://github.com/piranha/keymage - * - * (c) 2012-2016 Alexander Solovyov under terms of ISC License - */ - -(function(define, undefined) { -define(function() { - 'use strict'; - - var VERSION = '1.1.3'; - var isOsx = ~navigator.userAgent.indexOf('Mac OS X'); - - // Defining all keys - var MODPROPS = ['shiftKey', 'ctrlKey', 'altKey', 'metaKey']; - var MODS = { - 'shift': 'shift', - 'ctrl': 'ctrl', 'control': 'ctrl', - 'alt': 'alt', 'option': 'alt', - 'win': 'meta', 'cmd': 'meta', 'super': 'meta', - 'meta': 'meta', - // default modifier for os x is cmd and for others is ctrl - 'defmod': isOsx ? 'meta' : 'ctrl' - }; - var MODORDER = ['shift', 'ctrl', 'alt', 'meta']; - var MODNUMS = [16, 17, 18, 91]; - - var KEYS = { - 'backspace': 8, - 'tab': 9, - 'enter': 13, 'return': 13, - 'pause': 19, - 'caps': 20, 'capslock': 20, - 'escape': 27, 'esc': 27, - 'space': 32, - 'pgup': 33, 'pageup': 33, - 'pgdown': 34, 'pagedown': 34, - 'end': 35, - 'home': 36, - 'ins': 45, 'insert': 45, - 'del': 46, 'delete': 46, - - 'left': 37, - 'up': 38, - 'right': 39, - 'down': 40, - - '*': 106, - '+': 107, 'plus': 107, - 'minus': 109, - ';': 186, - '=': 187, - ',': 188, - '-': 189, - '.': 190, - '/': 191, - 'num/': 111, - '`': 192, - '[': 219, - '\\': 220, - ']': 221, - "'": 222 - }; - - var i; - // numpad - for (i = 0; i < 10; i++) { - KEYS['num' + i] = i + 96; - } - // top row 0-9 - for (i = 0; i < 10; i++) { - KEYS['' + i] = i + 48; - } - // f1-f24 - for (i = 1; i < 25; i++) { - KEYS['f' + i] = i + 111; - } - // alphabet - for (i = 65; i < 91; i++) { - KEYS[String.fromCharCode(i).toLowerCase()] = i; - } - - // Reverse key codes - var KEYREV = {}; - Object.keys(KEYS).forEach(function(k) { - var val = KEYS[k]; - if (!KEYREV[val] || KEYREV[val].length < k.length) { - KEYREV[val] = k; - } - }); - - // ----------------------- - // Actual work is done here - - var currentScope = ''; - var allChains = {}; - - function parseKeyString(keystring) { - var bits = keystring.split(/-(?!$)/); - var button = bits[bits.length - 1]; - var key = {code: KEYS[button]}; - - if (!key.code) { - throw 'Unknown key "' + button + '" in keystring "' + - keystring + '"'; - } - - var mod; - for (var i = 0; i < bits.length - 1; i++) { - button = bits[i]; - mod = MODS[button]; - if (!mod) { - throw 'Unknown modifier "' + button + '" in keystring "' + - keystring + '"'; - } - key[mod] = true; - } - - return key; - } - - function stringifyKey(key) { - var s = ''; - for (var i = 0; i < MODORDER.length; i++) { - if (key[MODORDER[i]]) { - s += MODORDER[i] + '-'; - } - } - s += KEYREV[key.code]; - return s; - } - - function normalizeKeyChain(keychainString) { - var keychain = []; - var keys = keychainString.split(' '); - - for (var i = 0; i < keys.length; i++) { - var key = parseKeyString(keys[i]); - key = stringifyKey(key); - keychain.push(key); - } - - keychain.original = keychainString; - return keychain; - } - - function eventKeyString(e) { - var key = {code: e.keyCode}; - for (var i = 0; i < MODPROPS.length; i++) { - var mod = MODPROPS[i]; - if (e[mod]) { - key[mod.slice(0, mod.length - 3)] = true; - } - } - return stringifyKey(key); - } - - function getNestedChains(chains, scope) { - for (var i = 0; i < scope.length; i++) { - var bit = scope[i]; - - if (bit) { - chains = chains[bit]; - } - - if (!chains) { - break; - } - } - return chains; - } - - var sequence = []; - function dispatch(e) { - // Skip all modifiers - if (~MODNUMS.indexOf(e.keyCode)) { - return; - } - - var seq = sequence.slice(); - seq.push(eventKeyString(e)); - var scope = currentScope.split('.'); - var matched, chains, key; - - for (var i = scope.length; i >= 0; i--) { - chains = getNestedChains(allChains, scope.slice(0, i)); - if (!chains) { - continue; - } - matched = true; - for (var j = 0; j < seq.length; j++) { - key = seq[j]; - if (!chains[key]) { - matched = false; - break; - } - chains = chains[key]; - } - - if (matched) { - break; - } - } - - var definitionScope = scope.slice(0, i).join('.'); - var preventDefault = chains.preventDefault; - - // partial match, save the sequence - if (matched && !chains.handlers) { - sequence = seq; - if (preventDefault) { - e.preventDefault(); - } - return; - } - - if (matched) { - for (i = 0; i < chains.handlers.length; i++) { - var handler = chains.handlers[i]; - var options = handler._keymage; - - var res = handler.call(options.context, e, { - shortcut: options.original, - scope: currentScope, - definitionScope: definitionScope - }); - - if (res === false || preventDefault) { - e.preventDefault(); - } - } - } - - // either matched or not, drop the sequence - sequence = []; - } - - function getHandlers(scope, keychain, fn) { - var bits = scope.split('.'); - var chains = allChains; - bits = bits.concat(keychain); - - for (var i = 0, l = bits.length; i < l; i++) { - var bit = bits[i]; - if (!bit) {continue;} - - chains = chains[bit] || (chains[bit] = {}); - if (fn && fn._keymage.preventDefault) { - chains.preventDefault = true; - } - - if (i === l - 1) { - var handlers = chains.handlers || (chains.handlers = []); - return handlers; - } - } - } - - function assignKey(scope, keychain, fn) { - var handlers = getHandlers(scope, keychain, fn); - handlers.push(fn); - } - - function unassignKey(scope, keychain, fn) { - var handlers = getHandlers(scope, keychain); - var idx = handlers.indexOf(fn); - if (~idx) { - handlers.splice(idx, 1); - } - } - - function parsed(scope, keychain, fn, options) { - if (keychain === undefined && fn === undefined) { - return function(keychain, fn) { - return keymage(scope, keychain, fn); - }; - } - - if (typeof keychain === 'function') { - options = fn; - fn = keychain; - keychain = scope; - scope = ''; - } - - var normalized = normalizeKeyChain(keychain); - - return [scope, normalized, fn, options]; - } - - // optional arguments: scope, options. - function keymage(scope, keychain, fn, options) { - var args = parsed(scope, keychain, fn, options); - fn = args[2]; - options = args[3]; - fn._keymage = options || {}; - fn._keymage.original = keychain; - assignKey.apply(null, args); - - return function () { - unassignKey.apply(null, args); - }; - } - - keymage.unbind = function(scope, keychain, fn) { - var args = parsed(scope, keychain, fn); - unassignKey.apply(null, args); - }; - - keymage.parse = parseKeyString; - keymage.stringify = stringifyKey; - keymage.stringifyEvent = eventKeyString; - - keymage.bindings = allChains; - - keymage.setScope = function(scope) { - currentScope = scope ? scope : ''; - }; - - keymage.getScope = function() { return currentScope; }; - - keymage.pushScope = function(scope) { - currentScope = (currentScope ? currentScope + '.' : '') + scope; - return currentScope; - }; - - keymage.popScope = function(scope) { - var i; - - if (!scope) { - i = currentScope.lastIndexOf('.'); - scope = currentScope.slice(i + 1); - currentScope = i == -1 ? '' : currentScope.slice(0, i); - return scope; - } - - currentScope = currentScope.replace( - new RegExp('(^|\\.)' + scope + '(\\.|$).*'), ''); - return scope; - }; - - keymage.version = VERSION; - - window.addEventListener('keydown', dispatch); - - return keymage; -}); -})(typeof define !== 'undefined' ? define : function(factory) { - if (typeof module !== 'undefined') { - module.exports = factory(); - } else { - window.keymage = factory(); - } -}); From 4498a9076e7e5e468e23089b30d2f4ab274c7d42 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Thu, 27 Aug 2020 15:01:10 +1200 Subject: [PATCH 62/74] :fire: Remove keymaster.js, as it is not used anymore --- src/js/3rdparty/keymaster.js | 299 --------------------------------- src/riotTags/license-panel.tag | 25 +-- 2 files changed, 1 insertion(+), 323 deletions(-) delete mode 100644 src/js/3rdparty/keymaster.js diff --git a/src/js/3rdparty/keymaster.js b/src/js/3rdparty/keymaster.js deleted file mode 100644 index b247d7683..000000000 --- a/src/js/3rdparty/keymaster.js +++ /dev/null @@ -1,299 +0,0 @@ -// keymaster.js -// (c) 2011-2013 Thomas Fuchs -// keymaster.js may be freely distributed under the MIT license. - -;(function(global){ - var k, - _handlers = {}, - _mods = { 16: false, 18: false, 17: false, 91: false }, - _scope = 'all', - // modifier keys - _MODIFIERS = { - '⇧': 16, shift: 16, - '⌥': 18, alt: 18, option: 18, - '⌃': 17, ctrl: 17, control: 17, - '⌘': 91, command: 91 - }, - // special keys - _MAP = { - backspace: 8, tab: 9, clear: 12, - enter: 13, 'return': 13, - esc: 27, escape: 27, space: 32, - left: 37, up: 38, - right: 39, down: 40, - del: 46, 'delete': 46, - home: 36, end: 35, - divide: 111, multiply: 106, subtract: 109, add: 107, - numpad0: '96', numpad1: '97', numpad2: '98', numpad3: '99', numpad4: '100', - numpad5: '101', numpad6: '102', numpad7: '103', numpad8: '104', numpad9: '105', - pageup: 33, pagedown: 34, - ',': 188, '.': 190, '/': 191, - '`': 192, '-': 189, '=': 187, - ';': 186, '\'': 222, - '[': 219, ']': 221, '\\': 220 - }, - code = function(x){ - return _MAP[x] || x.toUpperCase().charCodeAt(0); - }, - _downKeys = []; - - for(k=1;k<20;k++) _MAP['f'+k] = 111+k; - - // IE doesn't support Array#indexOf, so have a simple replacement - function index(array, item){ - var i = array.length; - while(i--) if(array[i]===item) return i; - return -1; - } - - // for comparing mods before unassignment - function compareArray(a1, a2) { - if (a1.length != a2.length) return false; - for (var i = 0; i < a1.length; i++) { - if (a1[i] !== a2[i]) return false; - } - return true; - } - - var modifierMap = { - 16:'shiftKey', - 18:'altKey', - 17:'ctrlKey', - 91:'metaKey' - }; - function updateModifierKey(event) { - for(k in _mods) _mods[k] = event[modifierMap[k]]; - }; - - // handle keydown event - function dispatch(event) { - var key, handler, k, i, modifiersMatch, scope; - key = event.keyCode; - - if (index(_downKeys, key) == -1) { - _downKeys.push(key); - } - - // if a modifier key, set the key. property to true and return - if(key == 93 || key == 224) key = 91; // right command on webkit, command on Gecko - if(key in _mods) { - _mods[key] = true; - // 'assignKey' from inside this closure is exported to window.key - for(k in _MODIFIERS) if(_MODIFIERS[k] == key) assignKey[k] = true; - return; - } - updateModifierKey(event); - - // see if we need to ignore the keypress (filter() can can be overridden) - // by default ignore key presses if a select, textarea, or input is focused - if(!assignKey.filter.call(this, event)) return; - - // abort if no potentially matching shortcuts found - if (!(key in _handlers)) return; - - scope = getScope(); - - // for each potential shortcut - for (i = 0; i < _handlers[key].length; i++) { - handler = _handlers[key][i]; - - // see if it's in the current scope - if(handler.scope == scope || handler.scope == 'all'){ - // check if modifiers match if any - modifiersMatch = handler.mods.length > 0; - for(k in _mods) - if((!_mods[k] && index(handler.mods, +k) > -1) || - (_mods[k] && index(handler.mods, +k) == -1)) modifiersMatch = false; - // call the handler and stop the event if neccessary - if((handler.mods.length == 0 && !_mods[16] && !_mods[18] && !_mods[17] && !_mods[91]) || modifiersMatch){ - if(handler.method(event, handler)===false){ - if(event.preventDefault) event.preventDefault(); - else event.returnValue = false; - if(event.stopPropagation) event.stopPropagation(); - if(event.cancelBubble) event.cancelBubble = true; - } - } - } - } - }; - - // unset modifier keys on keyup - function clearModifier(event){ - var key = event.keyCode, k, - i = index(_downKeys, key); - - // remove key from _downKeys - if (i >= 0) { - _downKeys.splice(i, 1); - } - - if(key == 93 || key == 224) key = 91; - if(key in _mods) { - _mods[key] = false; - for(k in _MODIFIERS) if(_MODIFIERS[k] == key) assignKey[k] = false; - } - }; - - function resetModifiers() { - for(k in _mods) _mods[k] = false; - for(k in _MODIFIERS) assignKey[k] = false; - }; - - // parse and assign shortcut - function assignKey(key, scope, method){ - var keys, mods; - keys = getKeys(key); - if (method === undefined) { - method = scope; - scope = 'all'; - } - - // for each shortcut - for (var i = 0; i < keys.length; i++) { - // set modifier keys if any - mods = []; - key = keys[i].split('+'); - if (key.length > 1){ - mods = getMods(key); - key = [key[key.length-1]]; - } - // convert to keycode and... - key = key[0] - key = code(key); - // ...store handler - if (!(key in _handlers)) _handlers[key] = []; - _handlers[key].push({ shortcut: keys[i], scope: scope, method: method, key: keys[i], mods: mods }); - } - }; - - // unbind all handlers for given key in current scope - function unbindKey(key, scope) { - var multipleKeys, keys, - mods = [], - i, j, obj; - - multipleKeys = getKeys(key); - - for (j = 0; j < multipleKeys.length; j++) { - keys = multipleKeys[j].split('+'); - - if (keys.length > 1) { - mods = getMods(keys); - } - - key = keys[keys.length - 1]; - key = code(key); - - if (scope === undefined) { - scope = getScope(); - } - if (!_handlers[key]) { - return; - } - for (i = 0; i < _handlers[key].length; i++) { - obj = _handlers[key][i]; - // only clear handlers if correct scope and mods match - if (obj.scope === scope && compareArray(obj.mods, mods)) { - _handlers[key][i] = {}; - } - } - } - }; - - // Returns true if the key with code 'keyCode' is currently down - // Converts strings into key codes. - function isPressed(keyCode) { - if (typeof(keyCode)=='string') { - keyCode = code(keyCode); - } - return index(_downKeys, keyCode) != -1; - } - - function getPressedKeyCodes() { - return _downKeys.slice(0); - } - - function filter(event){ - var tagName = (event.target || event.srcElement).tagName; - // ignore keypressed in any elements that support keyboard data input - return !(tagName == 'INPUT' || tagName == 'SELECT' || tagName == 'TEXTAREA'); - } - - // initialize key. to false - for(k in _MODIFIERS) assignKey[k] = false; - - // set current scope (default 'all') - function setScope(scope){ _scope = scope || 'all' }; - function getScope(){ return _scope || 'all' }; - - // delete all handlers for a given scope - function deleteScope(scope){ - var key, handlers, i; - - for (key in _handlers) { - handlers = _handlers[key]; - for (i = 0; i < handlers.length; ) { - if (handlers[i].scope === scope) handlers.splice(i, 1); - else i++; - } - } - }; - - // abstract key logic for assign and unassign - function getKeys(key) { - var keys; - key = key.replace(/\s/g, ''); - keys = key.split(','); - if ((keys[keys.length - 1]) == '') { - keys[keys.length - 2] += ','; - } - return keys; - } - - // abstract mods logic for assign and unassign - function getMods(key) { - var mods = key.slice(0, key.length - 1); - for (var mi = 0; mi < mods.length; mi++) - mods[mi] = _MODIFIERS[mods[mi]]; - return mods; - } - - // cross-browser events - function addEvent(object, event, method) { - if (object.addEventListener) - object.addEventListener(event, method, false); - else if(object.attachEvent) - object.attachEvent('on'+event, function(){ method(window.event) }); - }; - - // set the handlers globally on document - addEvent(document, 'keydown', function(event) { dispatch(event) }); // Passing _scope to a callback to ensure it remains the same by execution. Fixes #48 - addEvent(document, 'keyup', clearModifier); - - // reset modifiers to false whenever the window is (re)focused. - addEvent(window, 'focus', resetModifiers); - - // store previously defined key - var previousKey = global.key; - - // restore previously defined key and return reference to our key object - function noConflict() { - var k = global.key; - global.key = previousKey; - return k; - } - - // set window.key and window.key.set/get/deleteScope, and the default filter - global.key = assignKey; - global.key.setScope = setScope; - global.key.getScope = getScope; - global.key.deleteScope = deleteScope; - global.key.filter = filter; - global.key.isPressed = isPressed; - global.key.getPressedKeyCodes = getPressedKeyCodes; - global.key.noConflict = noConflict; - global.key.unbind = unbindKey; - - if(typeof module !== 'undefined') module.exports = assignKey; - -})(this); diff --git a/src/riotTags/license-panel.tag b/src/riotTags/license-panel.tag index e5d4d791e..446cd5fcf 100644 --- a/src/riotTags/license-panel.tag +++ b/src/riotTags/license-panel.tag @@ -56,7 +56,7 @@ license-panel.modal.pad p | The ct.js' theme called Lucas Dracula is a rough port of a beautiful theme by Lucas Moreira. | You can get this theme for VSCode, too! See - | + | a(href="https://github.com/lucasmsa/arkham-theme") github.com/lucasmsa/arkham-theme | . pre @@ -131,29 +131,6 @@ license-panel.modal.pad COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - h2 keymaster.js - pre - code. - Copyright (c) 2011-2013 Thomas Fuchs - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. h2 Open Sans font by Steve Matteson p Released under #[a(href="http://www.apache.org/licenses/LICENSE-2.0") Apache License 2.0]. From 623b1c60ff18a85094f9f7e69f3487f7d50d5602 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Fri, 28 Aug 2020 11:28:02 +1200 Subject: [PATCH 63/74] :zap: Better zooming controls for room, texture, and emitter editors --- .../particles/emitter-tandem-editor.tag | 52 ++++-------- src/riotTags/rooms/room-editor.tag | 55 ++++--------- src/riotTags/shared/color-picker.tag | 2 +- src/riotTags/shared/zoom-slider.tag | 80 +++++++++++++++++++ src/riotTags/textures/texture-editor.tag | 40 +++------- src/styl/inputs.styl | 74 ++++++++++------- src/styl/tags/rooms/room-editor.styl | 4 +- src/styl/tags/shared/zoom-slider.styl | 3 + src/styl/tags/textures/texture-editor.styl | 4 +- 9 files changed, 176 insertions(+), 138 deletions(-) create mode 100644 src/riotTags/shared/zoom-slider.tag create mode 100644 src/styl/tags/shared/zoom-slider.styl diff --git a/src/riotTags/particles/emitter-tandem-editor.tag b/src/riotTags/particles/emitter-tandem-editor.tag index 25d364e39..cf06dac26 100644 --- a/src/riotTags/particles/emitter-tandem-editor.tag +++ b/src/riotTags/particles/emitter-tandem-editor.tag @@ -45,15 +45,12 @@ emitter-tandem-editor.panel.view.flexrow svg.feather use(xlink:href="data/icons.svg#droplet") span {voc.changeBg} - .zoom - b(if="{window.innerWidth - panelWidth > 500}") {vocGlob.zoom} - div.button-stack - button.inline(if="{window.innerWidth - panelWidth > 320}" onclick="{setZoom(0.125)}" class="{active: zoom === 0.125}") 12% - button.inline(onclick="{setZoom(0.25)}" class="{active: zoom === 0.25}") 25% - button.inline(if="{window.innerWidth - panelWidth > 320}" onclick="{setZoom(0.5)}" class="{active: zoom === 0.5}") 50% - button.inline(onclick="{setZoom(1)}" class="{active: zoom === 1}") 100% - button.inline(onclick="{setZoom(2)}" class="{active: zoom === 2}") 200% - button.inline(if="{window.innerWidth - panelWidth > 320}" onclick="{setZoom(4)}" class="{active: zoom === 4}") 400% + .zoom.flexrow + b(if="{window.innerWidth - panelWidth > 550}") {vocGlob.zoom} + .spacer + b {Math.round(zoom * 100)}% + .spacer + zoom-slider(onchanged="{setZoom}" ref="zoomslider" value="{zoom}") color-picker( ref="previewBackgroundColor" if="{changingPreviewColor}" hidealpha="true" @@ -386,38 +383,11 @@ emitter-tandem-editor.panel.view.flexrow /* Zoom in/out by clicking buttons and scrolling mouse wheel */ this.zoom = 1; - this.setZoom = zoom => () => { + this.setZoom = zoom => { this.zoom = zoom; if (this.emitterContainer) { this.emitterContainer.scale.x = this.emitterContainer.scale.y = this.zoom; } - }; - this.onCanvasWheel = e => { - e.preventUpdate = true; - if (e.wheelDelta > 0) { - // in - if (this.zoom === 2) { - this.zoom = 4; - } else if (this.zoom === 1) { - this.zoom = 2; - } else if (this.zoom === 0.5) { - this.zoom = 1; - } else if (this.zoom === 0.25) { - this.zoom = 0.5; - } else if (this.zoom === 0.125) { - this.zoom = 0.25; - } - } else if (this.zoom === 4) { // out - this.zoom = 2; - } else if (this.zoom === 2) { - this.zoom = 1; - } else if (this.zoom === 1) { - this.zoom = 0.5; - } else if (this.zoom === 0.5) { - this.zoom = 0.25; - } else if (this.zoom === 0.25) { - this.zoom = 0.125; - } this.emitterContainer.scale.x = this.emitterContainer.scale.y = this.visualizersContainer.scale.x = @@ -426,6 +396,14 @@ emitter-tandem-editor.panel.view.flexrow this.previewTexture.scale.y = this.zoom; this.updateGrid(); + this.update(); + }; + this.onCanvasWheel = e => { + if (e.wheelDelta > 0) { + this.refs.zoomslider.zoomIn(); + } else { + this.refs.zoomslider.zoomOut(); + } }; this.onCanvasMove = e => { diff --git a/src/riotTags/rooms/room-editor.tag b/src/riotTags/rooms/room-editor.tag index 8e61207ef..af7972b8c 100644 --- a/src/riotTags/rooms/room-editor.tag +++ b/src/riotTags/rooms/room-editor.tag @@ -83,16 +83,12 @@ room-editor.panel.view svg.feather use(xlink:href="data/icons.svg#sort-vertical") span(if="{window.innerWidth - sidebarWidth > 940}") {voc.hotkeysNotice} - .zoom - b(if="{window.innerWidth - sidebarWidth > 980}") {vocGlob.zoom} - div.button-stack - button#roomzoom12.inline(if="{window.innerWidth - sidebarWidth > 620}" onclick="{roomToggleZoom(0.125)}" class="{active: zoomFactor === 0.125}") 12% - button#roomzoom25.inline(onclick="{roomToggleZoom(0.25)}" class="{active: zoomFactor === 0.25}") 25% - button#roomzoom50.inline(if="{window.innerWidth - sidebarWidth > 620}" onclick="{roomToggleZoom(0.5)}" class="{active: zoomFactor === 0.5}") 50% - button#roomzoom100.inline(onclick="{roomToggleZoom(1)}" class="{active: zoomFactor === 1}") 100% - button#roomzoom200.inline(onclick="{roomToggleZoom(2)}" class="{active: zoomFactor === 2}") 200% - button#roomzoom400.inline(if="{window.innerWidth - sidebarWidth > 620}" onclick="{roomToggleZoom(4)}" class="{active: zoomFactor === 4}") 400% - button#roomzoom800.inline(if="{window.innerWidth - sidebarWidth > 620}" onclick="{roomToggleZoom(8)}" class="{active: zoomFactor === 8}") 800% + .zoom.flexrow + b(if="{window.innerWidth - sidebarWidth > 980}") {vocGlob.zoom}: + .spacer + b {Math.round(zoomFactor * 100)}% + .spacer + zoom-slider(onchanged="{setZoom}" ref="zoomslider" value="{zoomFactor}") .grid button#roomgrid(onclick="{roomToggleGrid}" class="{active: room.gridX > 0}") span {voc[room.gridX > 0? 'gridoff' : 'grid']} @@ -376,40 +372,21 @@ room-editor.panel.view this.updateMouseCoords(e); }; - /** При прокрутке колёсиком меняем фактор зума */ + /** Change zoom on mouse wheel */ this.onCanvasWheel = e => { if (e.wheelDelta > 0) { - // in - if (this.zoomFactor === 4) { - this.zoomFactor = 8; - } else if (this.zoomFactor === 2) { - this.zoomFactor = 4; - } else if (this.zoomFactor === 1) { - this.zoomFactor = 2; - } else if (this.zoomFactor === 0.5) { - this.zoomFactor = 1; - } else if (this.zoomFactor === 0.25) { - this.zoomFactor = 0.5; - } else if (this.zoomFactor === 0.125) { - this.zoomFactor = 0.25; - } - } else if (this.zoomFactor === 8) { - this.zoomFactor = 4; - } else if (this.zoomFactor === 4) { - this.zoomFactor = 2; - } else if (this.zoomFactor === 2) { - this.zoomFactor = 1; - } else if (this.zoomFactor === 1) { - this.zoomFactor = 0.5; - } else if (this.zoomFactor === 0.5) { - this.zoomFactor = 0.25; - } else if (this.zoomFactor === 0.25) { - this.zoomFactor = 0.125; + this.refs.zoomslider.zoomIn(); + } else { + this.refs.zoomslider.zoomOut(); } + }; + this.setZoom = zoom => { + this.zoomFactor = zoom; + this.update(); this.redrawGrid(); - this.refreshRoomCanvas(e); - this.updateMouseCoords(e); + this.refreshRoomCanvas(); }; + this.onCanvasContextMenu = e => { this.dragging = false; this.mouseDown = false; diff --git a/src/riotTags/shared/color-picker.tag b/src/riotTags/shared/color-picker.tag index 287e158e2..501fa7bba 100644 --- a/src/riotTags/shared/color-picker.tag +++ b/src/riotTags/shared/color-picker.tag @@ -35,7 +35,7 @@ color-picker .aSwatch(each="{colr in global.currentProject.palette}" style="background-color: {colr};" onclick="{onSwatchClick}") button.anAddSwatchButton(onclick="{addAsLocal}") | + - .c6.npt.npr.npb + .c6.np .flexrow .aRangePipeStack .pipe.huebar diff --git a/src/riotTags/shared/zoom-slider.tag b/src/riotTags/shared/zoom-slider.tag new file mode 100644 index 000000000..f5d25e28b --- /dev/null +++ b/src/riotTags/shared/zoom-slider.tag @@ -0,0 +1,80 @@ +// + A slider that smoothly transitions between zoom points + + @attribute onchanged (riot function) + Calls the funtion when a user changes the zoom value. + Passes the new zoom value as the one argument. + + @method zoomIn + Call this property to advance the zoom value. This will call opts.onchage callback. + @method zoomOut + Call this property to decrease the zoom value. This will call opts.onchage callback. +zoom-slider + .aSliderWrap + input( + type="range" list="theZoomSnapPoints" + min="-100" step="1" max="100" + ref="zoomslider" + value="{zoomToRaw(opts.value || 1)}" oninput="{setValue}" + ) + datalist#theZoomSnapPoints + option(value="-100") + option(value="-67") + option(value="-33") + option(value="0") + option(value="20") + option(value="40") + option(value="60") + option(value="80") + option(value="100") + .DataTicks + .aDataTick(each="{value in [-67, -33, 0, 20, 40, 60, 80]}" style="left: {(value + 100) / 2}%") + script. + this.sliderPoints = [-100, -67, -33, 0, 20, 40, 60, 80, 100]; + this.zoomPoints = [0.125, 0.25, 0.5, 1, 2, 4, 8, 16, 32]; + + this.zoomToRaw = value => { + value = Number(value); + const anchorPointId = this.zoomPoints.findIndex(p => p >= value); + if (this.zoomPoints[anchorPointId] === 0.125) { + return -100; + } + const ab = value - this.zoomPoints[anchorPointId - 1], + l = this.zoomPoints[anchorPointId] - this.zoomPoints[anchorPointId - 1]; + const alpha = ab / l; + return this.sliderPoints[anchorPointId - 1] + + (this.sliderPoints[anchorPointId] - this.sliderPoints[anchorPointId - 1]) * + alpha; + }; + this.rawToZoom = value => { + value = Number(value); + const anchorPointId = this.sliderPoints.findIndex(p => p >= value); + if (this.sliderPoints[anchorPointId] === -100) { + return 0.125; + } + const ab = value - this.sliderPoints[anchorPointId - 1], + l = this.sliderPoints[anchorPointId] - this.sliderPoints[anchorPointId - 1]; + const alpha = ab / l; + return this.zoomPoints[anchorPointId - 1] + + (this.zoomPoints[anchorPointId] - this.zoomPoints[anchorPointId - 1]) * + alpha; + }; + + this.setValue = e => { + if (this.opts.onchanged) { + this.opts.onchanged(this.rawToZoom(e.target.value)); + } + }; + + this.zoomIn = () => { + const rawValue = Math.min(Number(this.refs.zoomslider.value) + 10, 100); + this.refs.zoomslider.value = rawValue; + this.opts.onchanged(this.rawToZoom(rawValue)); + this.update(); + }; + this.zoomOut = () => { + const rawValue = Math.max(Number(this.refs.zoomslider.value) - 10, -100); + this.refs.zoomslider.value = rawValue; + this.opts.onchanged(this.rawToZoom(rawValue)); + this.update(); + }; diff --git a/src/riotTags/textures/texture-editor.tag b/src/riotTags/textures/texture-editor.tag index a607a6286..7d1999dbb 100644 --- a/src/riotTags/textures/texture-editor.tag +++ b/src/riotTags/textures/texture-editor.tag @@ -132,14 +132,10 @@ texture-editor.panel.view ) svg.feather use(xlink:href="data/icons.svg#refresh-ccw") - .textureview-zoom - div.button-stack.inlineblock - button.inline(onclick="{textureToggleZoom(0.25)}" class="{active: zoomFactor === 0.25}") 25% - button.inline(onclick="{textureToggleZoom(0.5)}" class="{active: zoomFactor === 0.5}") 50% - button.inline(onclick="{textureToggleZoom(1)}" class="{active: zoomFactor === 1}") 100% - button.inline(onclick="{textureToggleZoom(2)}" class="{active: zoomFactor === 2}") 200% - button.inline(onclick="{textureToggleZoom(4)}" class="{active: zoomFactor === 4}") 400% - button.inline(onclick="{textureToggleZoom(8)}" class="{active: zoomFactor === 8}") 800% + .textureview-zoom.flexrow + b {Math.round(zoomFactor * 100)}% + .spacer + zoom-slider(onchanged="{setZoom}" ref="zoomslider" value="{zoomFactor}") .textureview-bg button.inline(onclick="{changePreviewBg}") svg.feather @@ -366,34 +362,16 @@ texture-editor.panel.view } }; - this.textureToggleZoom = zoom => () => { + this.setZoom = zoom => { this.zoomFactor = zoom; + this.update(); }; /** Change zoomFactor on mouse wheel roll */ this.onMouseWheel = e => { if (e.wheelDelta > 0) { - // in - if (this.zoomFactor === 4) { - this.zoomFactor = 8; - } else if (this.zoomFactor === 2) { - this.zoomFactor = 4; - } else if (this.zoomFactor === 1) { - this.zoomFactor = 2; - } else if (this.zoomFactor === 0.5) { - this.zoomFactor = 1; - } else if (this.zoomFactor === 0.25) { - this.zoomFactor = 0.5; - } - } else if (this.zoomFactor === 8) { // out - this.zoomFactor = 4; - } else if (this.zoomFactor === 4) { // out - this.zoomFactor = 2; - } else if (this.zoomFactor === 2) { - this.zoomFactor = 1; - } else if (this.zoomFactor === 1) { - this.zoomFactor = 0.5; - } else if (this.zoomFactor === 0.5) { - this.zoomFactor = 0.25; + this.refs.zoomslider.zoomIn(); + } else { + this.refs.zoomslider.zoomOut(); } e.preventDefault(); this.update(); diff --git a/src/styl/inputs.styl b/src/styl/inputs.styl index 734966f02..280a5ce7b 100644 --- a/src/styl/inputs.styl +++ b/src/styl/inputs.styl @@ -248,6 +248,35 @@ select right 0.5em top 50% +[type=range] + min-height 1.5em + background transparent + font inherit + width 100% +[type=range], [type=range]::-webkit-slider-thumb + -webkit-appearance none + +[type=range]::-webkit-slider-runnable-track + box-sizing border-box + border 1px solid borderBright + border-radius br + width 100% + height 0.75em + background backgroundDeeper + +thumbWidth = 1.5em +[type=range]::-webkit-slider-thumb + margin-top -0.425em + box-sizing border-box + border 0 + width thumbWidth + height thumbWidth + border-radius 50% + background act + z-index 2 + position relative + +// Regular range inputs should be wrapped into .aSliderWrap .aSliderWrap display flex @@ -261,28 +290,20 @@ select flex 1 margin 0 padding 0 - min-height 1.5em - background transparent - font inherit -.aSliderWrap [type=range], .aSliderWrap [type=range]::-webkit-slider-thumb - -webkit-appearance none - -.aSliderWrap [type=range]::-webkit-slider-runnable-track - box-sizing border-box - border 1px solid borderBright - width 100% - height 0.5em - background background - -.aSliderWrap [type=range]::-webkit-slider-thumb - margin-top -0.625em - box-sizing border-box - border 0 - width 1.5em - height 1.5em - border-radius 50% - background act +.DataTicks + position absolute + left (thumbWidth / 2) // pad by half oh thumb's width + right (thumbWidth / 2) + top 50% + margin-top -0.375rem + user-select none + pointer-events none +.aDataTick + width 1px + height 0.75rem + background borderBright + position absolute label, .label & + & @@ -349,9 +370,10 @@ fieldset &:first-child margin-top 0 -input[type="range"] +// Range inputs with stacked backgrounds, for usage with color pickers + +.aRangePipeStack input[type="range"] -webkit-appearance none - width 100% background transparent margin 8px 0 &:focus @@ -361,12 +383,8 @@ input[type="range"] height 24px cursor pointer background backgroundDeeper - if (themeDark) // dark themes use an inverted color scheme in sense of variables - background background border-radius br - border 1px solid borderPale - if (themeDark) - border 1px solid borderBright + border 1px solid borderBright &::-webkit-slider-thumb border 1px solid borderBright height 40px diff --git a/src/styl/tags/rooms/room-editor.styl b/src/styl/tags/rooms/room-editor.styl index fd9739d2b..a09a8e842 100644 --- a/src/styl/tags/rooms/room-editor.styl +++ b/src/styl/tags/rooms/room-editor.styl @@ -52,6 +52,8 @@ room-editor right 0.5rem b text-shadow 0 1px 0 background + zoom-slider + width 20rem .grid position absolute bottom 0.5rem @@ -173,4 +175,4 @@ room-editor .flexfix-footer button margin-bottom 0.25rem select - padding 0.25rem \ No newline at end of file + padding 0.25rem diff --git a/src/styl/tags/shared/zoom-slider.styl b/src/styl/tags/shared/zoom-slider.styl new file mode 100644 index 000000000..215dbe01c --- /dev/null +++ b/src/styl/tags/shared/zoom-slider.styl @@ -0,0 +1,3 @@ +zoom-slider + width 20rem + max-width 100% \ No newline at end of file diff --git a/src/styl/tags/textures/texture-editor.styl b/src/styl/tags/textures/texture-editor.styl index 444988342..2862447cf 100644 --- a/src/styl/tags/textures/texture-editor.styl +++ b/src/styl/tags/textures/texture-editor.styl @@ -59,8 +59,10 @@ texture-editor .textureview-zoom position absolute bottom 0.5em - right 0.5em + right 1em text-align right + zoom-slider + width 20rem .textureview-bg position absolute left 0.5em From c48df4a1a473b2ace39bfdc203a4d8c527cd974f Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Fri, 28 Aug 2020 11:33:46 +1200 Subject: [PATCH 64/74] :bug: Fix issues with camera movement at room editor with extreme zooming factors --- src/riotTags/rooms/room-editor.tag | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/riotTags/rooms/room-editor.tag b/src/riotTags/rooms/room-editor.tag index af7972b8c..aafab76ff 100644 --- a/src/riotTags/rooms/room-editor.tag +++ b/src/riotTags/rooms/room-editor.tag @@ -309,6 +309,9 @@ room-editor.panel.view this.lastTileY = null; if (this.dragging) { this.dragging = false; + this.roomx = Math.round(this.roomx); + this.roomy = Math.round(this.roomy); + this.refreshRoomCanvas(); } else if (this.tab === 'roomtiles') { this.onCanvasMouseUpTiles(e); } else if (this.tab === 'roomcopies') { @@ -353,8 +356,8 @@ room-editor.panel.view e.preventUpdate = true; if (this.dragging && !this.movingStuff) { // Drag the viewport - this.roomx -= Math.round(e.movementX / this.zoomFactor); - this.roomy -= Math.round(e.movementY / this.zoomFactor); + this.roomx -= e.movementX / this.zoomFactor; + this.roomy -= e.movementY / this.zoomFactor; this.refreshRoomCanvas(e); } else if ( // Make more tiles or copies if Shift key is down e.shiftKey && this.mouseDown && From 790fdfc2e36f50f8f4ef31d85de09f96bbf2884c Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Fri, 28 Aug 2020 14:58:23 +1200 Subject: [PATCH 65/74] :bug: Fix ct.mouse returning old coordinates if a camera has moved, but a cursor hasn't. --- app/data/ct.libs/mouse/index.js | 255 +++++++++++++++-------------- app/data/ct.libs/mouse/module.json | 2 +- 2 files changed, 133 insertions(+), 124 deletions(-) diff --git a/app/data/ct.libs/mouse/index.js b/app/data/ct.libs/mouse/index.js index db67bc286..472f08abb 100644 --- a/app/data/ct.libs/mouse/index.js +++ b/app/data/ct.libs/mouse/index.js @@ -1,123 +1,132 @@ -(function () { - var keyPrefix = 'mouse.'; - var setKey = function(key, value) { - ct.inputs.registry[keyPrefix + key] = value; - }; - var buttonMap = { - 0: 'Left', - 1: 'Middle', - 2: 'Right', - 3: 'Special1', - 4: 'Special2', - 5: 'Special3', - 6: 'Special4', - 7: 'Special5', - 8: 'Special6', - unknown: 'Unknown' - }; - - ct.mouse = { - xprev: 0, - yprev: 0, - xuiprev: 0, - yuiprev: 0, - inside: false, - pressed: false, - down: false, - released: false, - button: 0, - hovers(copy) { - if (!copy.shape) { - return false; - } - if (copy.shape.type === 'rect') { - return ct.u.prect(ct.mouse.x, ct.mouse.y, copy); - } - if (copy.shape.type === 'circle') { - return ct.u.pcircle(ct.mouse.x, ct.mouse.y, copy); - } - if (copy.shape.type === 'point') { - return ct.mouse.x === copy.x && ct.mouse.y === copy.y; - } - return false; - }, - hoversUi(copy) { - if (!copy.shape) { - return false; - } - if (copy.shape.type === 'rect') { - return ct.u.prect(ct.mouse.xui, ct.mouse.yui, copy); - } - if (copy.shape.type === 'circle') { - return ct.u.pcircle(ct.mouse.xui, ct.mouse.yui, copy); - } - if (copy.shape.type === 'point') { - return ct.mouse.xui === copy.x && ct.mouse.yui === copy.y; - } - return false; - }, - hide() { - ct.pixiApp.renderer.view.style.cursor = 'none'; - }, - show() { - ct.pixiApp.renderer.view.style.cursor = ''; - } - }; - - ct.mouse.listenerMove = function(e) { - var rect = ct.pixiApp.view.getBoundingClientRect(); - ct.mouse.xui = (e.clientX - rect.left) * ct.camera.width / rect.width; - ct.mouse.yui = (e.clientY - rect.top) * ct.camera.height / rect.height; - [ct.mouse.x, ct.mouse.y] = ct.u.uiToGameCoord(ct.mouse.xui, ct.mouse.yui); - if (ct.mouse.xui > 0 && ct.mouse.yui > 0 && ct.mouse.yui < ct.camera.height && ct.mouse.xui < ct.camera.width) { - ct.mouse.inside = true; - } else { - ct.mouse.inside = false; - } - window.focus(); - }; - ct.mouse.listenerDown = function (e) { - setKey(buttonMap[e.button] || buttonMap.unknown, 1); - ct.mouse.pressed = true; - ct.mouse.down = true; - ct.mouse.button = e.button; - window.focus(); - e.preventDefault(); - }; - ct.mouse.listenerUp = function (e) { - setKey(buttonMap[e.button] || buttonMap.unknown, 0); - ct.mouse.released = true; - ct.mouse.down = false; - ct.mouse.button = e.button; - window.focus(); - e.preventDefault(); - }; - ct.mouse.listenerContextMenu = function (e) { - e.preventDefault(); - }; - ct.mouse.listenerWheel = function (e) { - setKey('Wheel', ((e.wheelDelta || -e.detail) < 0)? -1 : 1); - //e.preventDefault(); - }; - - ct.mouse.setupListeners = function () { - if (document.addEventListener) { - document.addEventListener('mousemove', ct.mouse.listenerMove, false); - document.addEventListener('mouseup', ct.mouse.listenerUp, false); - document.addEventListener('mousedown', ct.mouse.listenerDown, false); - document.addEventListener('wheel', ct.mouse.listenerWheel, false, { - passive: false - }); - document.addEventListener('contextmenu', ct.mouse.listenerContextMenu, false); - document.addEventListener('DOMMouseScroll', ct.mouse.listenerWheel, { - passive: false - }); - } else { // IE? - document.attachEvent('onmousemove', ct.mouse.listenerMove); - document.attachEvent('onmouseup', ct.mouse.listenerUp); - document.attachEvent('onmousedown', ct.mouse.listenerDown); - document.attachEvent('onmousewheel', ct.mouse.listenerWheel); - document.attachEvent('oncontextmenu', ct.mouse.listenerContextMenu); - } - }; -})(); +(function ctMouse() { + var keyPrefix = 'mouse.'; + var setKey = function (key, value) { + ct.inputs.registry[keyPrefix + key] = value; + }; + var buttonMap = { + 0: 'Left', + 1: 'Middle', + 2: 'Right', + 3: 'Special1', + 4: 'Special2', + 5: 'Special3', + 6: 'Special4', + 7: 'Special5', + 8: 'Special6', + unknown: 'Unknown' + }; + + ct.mouse = { + xprev: 0, + yprev: 0, + xuiprev: 0, + yuiprev: 0, + inside: false, + pressed: false, + down: false, + released: false, + button: 0, + hovers(copy) { + if (!copy.shape) { + return false; + } + if (copy.shape.type === 'rect') { + return ct.u.prect(ct.mouse.x, ct.mouse.y, copy); + } + if (copy.shape.type === 'circle') { + return ct.u.pcircle(ct.mouse.x, ct.mouse.y, copy); + } + if (copy.shape.type === 'point') { + return ct.mouse.x === copy.x && ct.mouse.y === copy.y; + } + return false; + }, + hoversUi(copy) { + if (!copy.shape) { + return false; + } + if (copy.shape.type === 'rect') { + return ct.u.prect(ct.mouse.xui, ct.mouse.yui, copy); + } + if (copy.shape.type === 'circle') { + return ct.u.pcircle(ct.mouse.xui, ct.mouse.yui, copy); + } + if (copy.shape.type === 'point') { + return ct.mouse.xui === copy.x && ct.mouse.yui === copy.y; + } + return false; + }, + hide() { + ct.pixiApp.renderer.view.style.cursor = 'none'; + }, + show() { + ct.pixiApp.renderer.view.style.cursor = ''; + }, + get x() { + return ct.u.uiToGameCoord(ct.mouse.xui, ct.mouse.yui)[0]; + }, + get y() { + return ct.u.uiToGameCoord(ct.mouse.xui, ct.mouse.yui)[1]; + } + }; + + ct.mouse.listenerMove = function listenerMove(e) { + var rect = ct.pixiApp.view.getBoundingClientRect(); + ct.mouse.xui = (e.clientX - rect.left) * ct.camera.width / rect.width; + ct.mouse.yui = (e.clientY - rect.top) * ct.camera.height / rect.height; + if (ct.mouse.xui > 0 && + ct.mouse.yui > 0 && + ct.mouse.yui < ct.camera.height && + ct.mouse.xui < ct.camera.width + ) { + ct.mouse.inside = true; + } else { + ct.mouse.inside = false; + } + window.focus(); + }; + ct.mouse.listenerDown = function listenerDown(e) { + setKey(buttonMap[e.button] || buttonMap.unknown, 1); + ct.mouse.pressed = true; + ct.mouse.down = true; + ct.mouse.button = e.button; + window.focus(); + e.preventDefault(); + }; + ct.mouse.listenerUp = function listenerUp(e) { + setKey(buttonMap[e.button] || buttonMap.unknown, 0); + ct.mouse.released = true; + ct.mouse.down = false; + ct.mouse.button = e.button; + window.focus(); + e.preventDefault(); + }; + ct.mouse.listenerContextMenu = function listenerContextMenu(e) { + e.preventDefault(); + }; + ct.mouse.listenerWheel = function listenerWheel(e) { + setKey('Wheel', ((e.wheelDelta || -e.detail) < 0) ? -1 : 1); + //e.preventDefault(); + }; + + ct.mouse.setupListeners = function setupListeners() { + if (document.addEventListener) { + document.addEventListener('mousemove', ct.mouse.listenerMove, false); + document.addEventListener('mouseup', ct.mouse.listenerUp, false); + document.addEventListener('mousedown', ct.mouse.listenerDown, false); + document.addEventListener('wheel', ct.mouse.listenerWheel, false, { + passive: false + }); + document.addEventListener('contextmenu', ct.mouse.listenerContextMenu, false); + document.addEventListener('DOMMouseScroll', ct.mouse.listenerWheel, { + passive: false + }); + } else { // IE? + document.attachEvent('onmousemove', ct.mouse.listenerMove); + document.attachEvent('onmouseup', ct.mouse.listenerUp); + document.attachEvent('onmousedown', ct.mouse.listenerDown); + document.attachEvent('onmousewheel', ct.mouse.listenerWheel); + document.attachEvent('oncontextmenu', ct.mouse.listenerContextMenu); + } + }; +})(); diff --git a/app/data/ct.libs/mouse/module.json b/app/data/ct.libs/mouse/module.json index 8772c3c2b..aa1a5c11f 100644 --- a/app/data/ct.libs/mouse/module.json +++ b/app/data/ct.libs/mouse/module.json @@ -2,7 +2,7 @@ "main": { "name": "Mouse Input", "tagline": "Get mouse position and read its events in Actions system.", - "version": "3.0.0", + "version": "3.0.1", "authors": [{ "name": "Cosmo Myzrail Gorynych", "mail": "admin@nersta.ru" From 7f8825c4371c8fd5a0bc28d7b1ef84603793653a Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Fri, 28 Aug 2020 15:00:33 +1200 Subject: [PATCH 66/74] :zap: Decrease threshold that differentiated clicks and drags in room editor, improving placing behavior of multiple tiles/copies --- src/js/roomCopyTools.js | 2 +- src/js/roomTileTools.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/js/roomCopyTools.js b/src/js/roomCopyTools.js index b103939d8..d0b5886a3 100644 --- a/src/js/roomCopyTools.js +++ b/src/js/roomCopyTools.js @@ -1,5 +1,5 @@ (function roomCopyTools() { - const clickThreshold = 16; + const clickThreshold = 10; const glob = require('./data/node_requires/glob'); const drawInsertPreview = function (e) { diff --git a/src/js/roomTileTools.js b/src/js/roomTileTools.js index 07031b543..ae9cb39ec 100644 --- a/src/js/roomTileTools.js +++ b/src/js/roomTileTools.js @@ -1,5 +1,5 @@ (function roomTileTools() { - const clickThreshold = 16; + const clickThreshold = 10; const glob = require('./data/node_requires/glob'); const selectATileAt = function (e) { From e68d580e1d77d8c5142fbf65cc796104255e1d89 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Fri, 28 Aug 2020 15:00:53 +1200 Subject: [PATCH 67/74] :zap: Improve Hotkeys mount process --- src/pug/index.pug | 1 + src/riotTags/main-menu.tag | 24 +++++++++--------------- src/riotTags/notepad-panel.tag | 7 +++++-- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/pug/index.pug b/src/pug/index.pug index 15db0cf0e..ca62741b4 100644 --- a/src/pug/index.pug +++ b/src/pug/index.pug @@ -87,6 +87,7 @@ html script. 'use strict'; window.signals = window.signals || riot.observable({}); + window.hotkeys = require('./data/node_requires/hotkeys')(document); riot.mount('*'); setTimeout(() => { document.getElementById('loading').classList.add('fadeout'); diff --git a/src/riotTags/main-menu.tag b/src/riotTags/main-menu.tag index 3a6bd81d4..f3b304ef6 100644 --- a/src/riotTags/main-menu.tag +++ b/src/riotTags/main-menu.tag @@ -24,27 +24,27 @@ main-menu.flexcol svg.feather use(xlink:href="data/icons.svg#sliders") span {voc.project} - li(onclick="{changeTab('texture')}" class="{active: tab === 'texture'}" data-hotkey="Control+3" title="Control+3") + li(onclick="{changeTab('texture')}" class="{active: tab === 'texture'}" data-hotkey="Control+2" title="Control+2") svg.feather use(xlink:href="data/icons.svg#texture") span {voc.texture} - li(onclick="{changeTab('ui')}" class="{active: tab === 'ui'}" data-hotkey="Control+4" title="Control+4") + li(onclick="{changeTab('ui')}" class="{active: tab === 'ui'}" data-hotkey="Control+3" title="Control+3") svg.feather use(xlink:href="data/icons.svg#ui") span {voc.ui} - li(onclick="{changeTab('fx')}" class="{active: tab === 'fx'}" data-hotkey="Control+5" title="Control+5") + li(onclick="{changeTab('fx')}" class="{active: tab === 'fx'}" data-hotkey="Control+4" title="Control+4") svg.feather use(xlink:href="data/icons.svg#sparkles") span {voc.fx} - li(onclick="{changeTab('sounds')}" class="{active: tab === 'sounds'}" data-hotkey="Control+6" title="Control+6") + li(onclick="{changeTab('sounds')}" class="{active: tab === 'sounds'}" data-hotkey="Control+5" title="Control+5") svg.feather use(xlink:href="data/icons.svg#headphones") span {voc.sounds} - li(onclick="{changeTab('types')}" class="{active: tab === 'types'}" data-hotkey="Control+7" title="Control+7") + li(onclick="{changeTab('types')}" class="{active: tab === 'types'}" data-hotkey="Control+6" title="Control+6") svg.feather use(xlink:href="data/icons.svg#type") span {voc.types} - li(onclick="{changeTab('rooms')}" class="{active: tab === 'rooms'}" data-hotkey="Control+8" title="Control+8") + li(onclick="{changeTab('rooms')}" class="{active: tab === 'rooms'}" data-hotkey="Control+7" title="Control+7") svg.feather use(xlink:href="data/icons.svg#room") span {voc.rooms} @@ -67,20 +67,14 @@ main-menu.flexcol const archiver = require('archiver'); const glob = require('./data/node_requires/glob'); - // Mounts the hotkey plugins, enabling hotkeys on elements with data-hotkey attributes - const hotkey = require('./data/node_requires/hotkeys')(document); - this.on('unmount', () => { - hotkey.unmount(); - }); - this.namespace = 'menu'; this.mixin(window.riotVoc); this.tab = 'project'; this.changeTab = tab => () => { this.tab = tab; - hotkey.cleanScope(); - hotkey.push(tab); + window.hotkeys.cleanScope(); + window.hotkeys.push(tab); window.signals.trigger('globalTabChanged'); window.signals.trigger(`${tab}Focus`); }; @@ -206,7 +200,7 @@ main-menu.flexcol nw.Shell.openExternal(`http://localhost:${fileServer.address().port}/`); }); }; - hotkey.on('Alt+F5', this.runProjectAlt); + window.hotkeys.on('Alt+F5', this.runProjectAlt); this.zipProject = async () => { try { diff --git a/src/riotTags/notepad-panel.tag b/src/riotTags/notepad-panel.tag index 3218c8b55..84010f7a6 100644 --- a/src/riotTags/notepad-panel.tag +++ b/src/riotTags/notepad-panel.tag @@ -34,7 +34,6 @@ notepad-panel#notepad.panel.dockright(class="{opened: opened}") use(xlink:href="data/icons.svg#{opened? 'chevron-right' : 'chevron-left'}") script. const glob = require('./data/node_requires/glob'); - const hotkey = require('./data/node_requires/hotkeys')(document); this.opened = false; this.namespace = 'notepad'; this.mixin(window.riotVoc); @@ -42,10 +41,14 @@ notepad-panel#notepad.panel.dockright(class="{opened: opened}") this.opened = !this.opened; }; - hotkey.on('F1', () => { + const openHelp = () => { this.opened = true; this.tab = 'helppages'; this.update(); + }; + window.hotkeys.on('F1', openHelp); + this.on('unmount', () => { + window.hotkeys.off('F1', openHelp); }); this.tab = 'notepadlocal'; From ae81f140bc3d81915bf517e622fd190a7bf58351 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Fri, 28 Aug 2020 16:52:58 +1200 Subject: [PATCH 68/74] :zap: Position context menus so that they don't exceed viewport's size --- src/riotTags/shared/context-menu.tag | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/riotTags/shared/context-menu.tag b/src/riotTags/shared/context-menu.tag index 02dd4de81..6ceed903f 100644 --- a/src/riotTags/shared/context-menu.tag +++ b/src/riotTags/shared/context-menu.tag @@ -69,10 +69,19 @@ context-menu(class="{opened: opts.menu.opened}" ref="root" style="{opts.menu.col setTimeout(() => { noFakeClicks = false; }, 100); - y -= this.root.parentNode.getBoundingClientRect().y; + this.root.style.left = this.root.style.top = this.root.style.right = this.root.style.bottom = 'unset'; + this.root.style.position = 'fixed'; if (x !== void 0 && y !== void 0) { - this.root.style.left = x + 'px'; - this.root.style.top = y + 'px'; + if (x < window.innerWidth / 2) { + this.root.style.left = x + 'px'; + } else { + this.root.style.right = (window.innerWidth - x) + 'px'; + } + if (y < window.innerHeight / 2) { + this.root.style.top = y + 'px'; + } else { + this.root.style.bottom = (window.innerHeight - y) + 'px'; + } } this.opts.menu.opened = true; this.update(); From 3f3cbb223ddf986668141f1756a3dcfcd05d5e15 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Sat, 29 Aug 2020 20:16:07 +1200 Subject: [PATCH 69/74] :sparkles: Add PIXI.MultiStyleText module --- .../ct.libs/PIXI.MultiStyleText/README.md | 70 +++++++++++++++++++ app/data/ct.libs/PIXI.MultiStyleText/index.js | 1 + .../ct.libs/PIXI.MultiStyleText/module.json | 16 +++++ .../ct.libs/PIXI.MultiStyleText/types.d.ts | 49 +++++++++++++ 4 files changed, 136 insertions(+) create mode 100644 app/data/ct.libs/PIXI.MultiStyleText/README.md create mode 100644 app/data/ct.libs/PIXI.MultiStyleText/index.js create mode 100644 app/data/ct.libs/PIXI.MultiStyleText/module.json create mode 100644 app/data/ct.libs/PIXI.MultiStyleText/types.d.ts diff --git a/app/data/ct.libs/PIXI.MultiStyleText/README.md b/app/data/ct.libs/PIXI.MultiStyleText/README.md new file mode 100644 index 000000000..74b3aa402 --- /dev/null +++ b/app/data/ct.libs/PIXI.MultiStyleText/README.md @@ -0,0 +1,70 @@ +# Multistyle text for pixi.js + +This module allows **creating** *multistyle* labels in your ***game***. + +## Example + +In the example below, we are defining 4 text styles. +`default` is the default style for the text, and the others matches the tags inside the text. + +```js +this.label = new PIXI.MultiStyleText( + "Let's make some multiline\nand multistyle text for\nct.js!", { + "default": ct.styles.get('Text_Regular'), + "ml": { + fontStyle: "italic", + fill: "#ff8888" + }, + "ms": { + fontStyle: "italic", + fill: "#4488ff" + }, + "ct": { + fontSize: "64px", + fill: "#446adb" + } +}); +this.addChild(this.label); +``` + +You can use ct.js styles as well: + +```js +this.label = new PIXI.MultiStyleText( + 'Let\'s make some fancy and terrifying text styles', { + default: ct.styles.get('Text_Regular'), + comic: ct.styles.get('Text_Comic'), + red: ct.styles.get('Text_Red') +}); +this.addChild(this.label); +``` + +## License + +Original module is distributed under MIT license, and this catmod is released as a part of ct.js, under MIT license. + +Here is the original license: + +``` +The MIT License (MIT) + +Copyright (c) 2014 Tommy Leunen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +``` diff --git a/app/data/ct.libs/PIXI.MultiStyleText/index.js b/app/data/ct.libs/PIXI.MultiStyleText/index.js new file mode 100644 index 000000000..f0a5c7eb5 --- /dev/null +++ b/app/data/ct.libs/PIXI.MultiStyleText/index.js @@ -0,0 +1 @@ +!function(t,e){t.PIXI.MultiStyleText=e(t.PIXI)}(this,function(t){var e=["pointerover","pointerenter","pointerdown","pointermove","pointerup","pointercancel","pointerout","pointerleave","gotpointercapture","lostpointercapture","mouseover","mouseenter","mousedown","mousemove","mouseup","mousecancel","mouseout","mouseleave","touchover","touchenter","touchdown","touchmove","touchup","touchcancel","touchout","touchleave"],i={bbcode:["[","]"],xml:["<",">"]},s=function(s){function o(t,i){var o=this;s.call(this,t),this.styles=i,e.forEach(function(t){o.on(t,function(t){return o.handleInteraction(t)})})}s&&(o.__proto__=s),(o.prototype=Object.create(s&&s.prototype)).constructor=o;var n={styles:{configurable:!0}};return o.prototype.handleInteraction=function(t){var e=t,i=t.data.getLocalPosition(this),s=this.hitboxes.reduce(function(t,e){return void 0!==t?t:e.hitbox.contains(i.x,i.y)?e:void 0},void 0);e.targetTag=void 0===s?void 0:s.tag},n.styles.set=function(e){for(var i in this.textStyles={},this.textStyles.default=this.assign({},o.DEFAULT_TAG_STYLE),e)"default"===i?this.assign(this.textStyles.default,e[i]):this.textStyles[i]=this.assign({},e[i]);"bbcode"===this.textStyles.default.tagStyle&&(this.textStyles.b=this.assign({},{fontStyle:"bold"}),this.textStyles.i=this.assign({},{fontStyle:"italic"}),this.textStyles.color=this.assign({},{fill:""}),this.textStyles.outline=this.assign({},{stroke:"",strokeThickness:6}),this.textStyles.font=this.assign({},{fontFamily:""}),this.textStyles.shadow=this.assign({},{dropShadowColor:"",dropShadow:!0,dropShadowBlur:3,dropShadowDistance:3,dropShadowAngle:2}),this.textStyles.size=this.assign({},{fontSize:"px"}),this.textStyles.spacing=this.assign({},{letterSpacing:""}),this.textStyles.align=this.assign({},{align:""})),this.withPrivateMembers()._style=new t.TextStyle(this.textStyles.default),this.withPrivateMembers().dirty=!0},o.prototype.setTagStyle=function(e,i){e in this.textStyles?this.assign(this.textStyles[e],i):this.textStyles[e]=this.assign({},i),this.withPrivateMembers()._style=new t.TextStyle(this.textStyles.default),this.withPrivateMembers().dirty=!0},o.prototype.deleteTagStyle=function(e){"default"===e?this.textStyles.default=this.assign({},o.DEFAULT_TAG_STYLE):delete this.textStyles[e],this.withPrivateMembers()._style=new t.TextStyle(this.textStyles.default),this.withPrivateMembers().dirty=!0},o.prototype.getTagRegex=function(t,e){var s=Object.keys(this.textStyles).join("|");s=t?"("+s+")":"(?:"+s+")";var o="bbcode"===this.textStyles.default.tagStyle?"\\"+i.bbcode[0]+s+"(?:\\=(?:[A-Za-z0-9_\\-\\#]+|'(?:[^']+|\\\\')*'))*\\s*\\"+i.bbcode[1]+"|\\"+i.bbcode[0]+"\\/"+s+"\\s*\\"+i.bbcode[1]:"\\"+i.xml[0]+s+"(?:\\s+[A-Za-z0-9_\\-]+=(?:\"(?:[^\"]+|\\\\\")*\"|'(?:[^']+|\\\\')*'))*\\s*\\"+i.xml[1]+"|\\"+i.xml[0]+"\\/"+s+"\\s*\\"+i.xml[1];return e&&(o="("+o+")"),new RegExp(o,"g")},o.prototype.getPropertyRegex=function(){return new RegExp("([A-Za-z0-9_\\-]+)=(?:\"((?:[^\"]+|\\\\\")*)\"|'((?:[^']+|\\\\')*)')","g")},o.prototype.getBBcodePropertyRegex=function(){return new RegExp("[A-Za-z0-9_\\-]+=([A-Za-z0-9_\\-\\#]+)","g")},o.prototype._getTextDataPerLine=function(t){for(var e=[],s=this.getTagRegex(!0,!1),o=[this.assign({},this.textStyles.default)],n=[{name:"default",properties:{}}],r=0;rc&&a.push(this.createTextData(t[r].substring(c,h[x].index),o[o.length-1],n[n.length-1])),"/"===h[x][0][1])o.length>1&&(o.pop(),n.pop());else{for(var d={},g=this.getPropertyRegex(),p=void 0;p=g.exec(h[x][0]);)d[p[1]]=p[2]||p[3];if(n.push({name:h[x][1],properties:d}),"bbcode"===this.textStyles.default.tagStyle&&h[x][0].includes("=")&&this.textStyles[h[x][1]]){var u=this.getBBcodePropertyRegex().exec(h[x][0]),f={};Object.entries(this.textStyles[h[x][1]]).forEach(function(t){f[t[0]]="string"!=typeof t[1]?t[1]:u[1]+t[1]}),o.push(this.assign({},o[o.length-1],f))}else o.push(this.assign({},o[o.length-1],this.textStyles[h[x][1]]))}c=h[x].index+h[x][0].length}if(c0&&(d+=f.letterSpacing/2),u0||_>0)&&(k+=F.letterSpacing/2);var j=this.context.measureText(O.charAt(W)).width;w.push({text:O.charAt(W),style:F,x:k,y:B,width:j,ascent:A.ascent,descent:A.descent,tag:D}),k+=j,(Wa){var p=x[d].split("");d>0&&(e+=" ",a-=this.context.measureText(" ").width);for(var u=0;ua?(e+="\n"+p[u],a=o-f):(e+=p[u],a-=f)}}else if(this.withPrivateMembers()._style.breakWords)e+=x[d],a-=g;else{var y=g+(d>0?this.context.measureText(" ").width:0);y>a?(l||(e+="\n"),e+=x[d],a=o-g):(a-=y,d>0&&(e+=" "),e+=x[d])}l=!1}r0;)e[i]=arguments[i+1];for(var s=0,o=e;s Date: Sat, 29 Aug 2020 20:39:36 +1200 Subject: [PATCH 70/74] :bookmark: Bump version number --- app/package.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/package.json b/app/package.json index ffe15215d..0686615bb 100644 --- a/app/package.json +++ b/app/package.json @@ -2,7 +2,7 @@ "main": "index.html", "name": "ctjs", "description": "ct.js — a free 2D game engine", - "version": "1.4.1", + "version": "1.4.2", "homepage": "https://ctjs.rocks/", "author": { "name": "Cosmo Myzrail Gorynych", diff --git a/package.json b/package.json index b713f7472..ba3748e14 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ctjsbuildenvironment", - "version": "1.4.1", + "version": "1.4.2", "description": "", "directories": { "doc": "docs" From bb9907fb1f13d236969f5f1b94f377ba5efb7a87 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Sat, 29 Aug 2020 21:24:39 +1200 Subject: [PATCH 71/74] :pencil: Update changelog --- app/Changelog.md | 72 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/app/Changelog.md b/app/Changelog.md index bb2b57c29..6243dae9d 100644 --- a/app/Changelog.md +++ b/app/Changelog.md @@ -1,3 +1,75 @@ +## v1.4.2 + +*Sat Aug 29 2020* + +### ✨ New Features + +* Add `tag` catmod, for adding tags for individual copies and rooms. +* Add a properties panel for tweaking parameters of an individual copy. +* Add `PIXI.MultiStyleText` module. +* Add support for moddable extensions for individual copies. +* Add texture generator for placeholders. +* Background color control for rooms (finally!) +* Code completions now suggest names of types, rooms, sounds, actions, and emitters. +* `ct.place.moveByAxes` and `this.moveContinuousByAxes` for easy movement at platformers and top-down games. +* `ct.place.moveAlong` now checks against tiles too +* Fast integer scaling mode for `ct.fittoscreen`, for purely pixelart projects. +* Hide default cursor at Project -> Render Options -> Hide system cursor +* Import a texture by pasting it from a clipboard. Will update an existing opened texture as well! +* In the room editor, Shift+Click now selects the nearest copy or tile. +* New `select` input type for catmods, as an alternative to `radio` +* Nightly builds at comigo.itch.io/ct-nightly. +* Seeded random for `ct.random` module +* `slider`, `sliderAndNumber` input types for extensions, and additional settings for them and `number` inputs. +* Sort copies or tiles inside a room with two new buttons at the top-left corner of the room editor. Extremely handy for isometric games! +* Toggle UI sounds in the Main menu -> Settings + +### ⚡️ General Improvements + +* A popup to quickly fix backgrounds at the room editor if their texture is not marked for tiled use. +* Add .itch.toml to simplify run dialog on Linux. +* Add `dnd-processor` tag that solves edge cases with drag-and-drop behavior and allows dropping any supported files on any tab. +* Add icons that highlight deprecated and preview modules more clearly. +* Better zooming controls for room, texture, and emitter editors. +* Change build, projects', export folders to be stored under the `~/ct.js/` directory. +* Change `ct.fs` to use app data directories for Linux, Windows, macOS (#226 by @JulianWebb). +* Decrease threshold that differentiated clicks and drags in room editor, improving placing behavior of multiple tiles/copies. +* Improve preview making process for textures. +* Improve tile positioning algorithm for the room editor. +* Minor UI improvements for the texture viewer. +* Position context menus so that they don't exceed viewport's size. +* Rename "Author" field at settings into "Developer" (i18n strings only). +* Scale smaller tilesets to fit the tile picker, at the room editor. +* Update Russian UI translation. + +### 🐛 Bug Fixes + +* A workaround for 'oncancel' not being fired on `input(type="file")` tags. Fixes an issue with invisible inputs overlaying the main menu. +* Add the missing CSS directive for pixelated projects. +* Fix checkboxes at extensions and module settings not showing the actual value's state +* Fix `ct.mouse` returning old coordinates if a camera has moved, but a cursor hasn't. +* Fix incorrect drawing of scaled copies in the room editor. +* Fix issues with camera movement at room editor with extreme zooming factors. +* Fix modules' extensions being parsed at the exporter if they have undefined or unset (equal to -1) secondary keys. +* Fix overflow issues and wrong initial values for bitmap font generator. +* Fix regression from v1.4 with blurry particle editor and room view when pixelart rendering was enabled. +* Fix `user-select` CSS parameter on modules' docs panel. + +### 🍱 Demos, Dependencies and Stuff + +* Bump various catmods' versions +* Update electron-packager to v15.0.0. Fixes build issues for Windows. + +### 🌐 Website + +* :sparkles: Presskit + +### 🌚 Misc + +* :fire: Remove keymage.js, as it is not used anymore +* :fire: Remove keymaster.js, as it is not used anymore + + ## v1.4.1 *Sun Aug 10 2020* From 039f247f7474e750c25a2ee48a423e15bad59aac Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Sat, 29 Aug 2020 21:32:11 +1200 Subject: [PATCH 72/74] :pencil: Add entries from the docs to the changelog --- app/Changelog.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/app/Changelog.md b/app/Changelog.md index 6243dae9d..39594b87f 100644 --- a/app/Changelog.md +++ b/app/Changelog.md @@ -57,9 +57,19 @@ ### 🍱 Demos, Dependencies and Stuff -* Bump various catmods' versions +* Add the missing link to the bitmap fonts page in the navigation panel. +* At the platformer tutorial, fix a typo in collectibles title. +* Bump various catmods' versions. +* Fix small error in describing key input in the asteroid shooter tutorial. +* Fixed bitmap fonts docs. The `font` in the constructor should be an object. +* Specify the tab for enemy/asteroid generation code at space shooter tutorial. * Update electron-packager to v15.0.0. Fixes build issues for Windows. +### 📝 Docs + +* Add info about moddable copies' extensions +* Document new input types `slider` and `sliderAndNumber`, as well as additional settings for them + ### 🌐 Website * :sparkles: Presskit From 57d8bd8b3d3a41d46201c7d49163ba7acabdf7c7 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Sat, 29 Aug 2020 21:33:18 +1200 Subject: [PATCH 73/74] :bento: Pull the latest docs --- docs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs b/docs index 18ead7cdf..9c7bc905b 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 18ead7cdfb509a9700e1adafeed72d45156f7080 +Subproject commit 9c7bc905baf0b347831a06af33cf6421796d48bd From c9a3ef5727fb4b0ab06664be5e98d4dec9535a55 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Sat, 29 Aug 2020 22:25:33 +1200 Subject: [PATCH 74/74] :bug: Hotfix: fix font import issues on Windows, as well as fix potential similar issues for other asset types --- app/Changelog.md | 1 + src/node_requires/resources/fonts/index.js | 10 +++++----- src/node_requires/resources/skeletons.js | 2 +- src/node_requires/resources/textures/index.js | 8 ++++---- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/app/Changelog.md b/app/Changelog.md index 39594b87f..da432ddbb 100644 --- a/app/Changelog.md +++ b/app/Changelog.md @@ -54,6 +54,7 @@ * Fix overflow issues and wrong initial values for bitmap font generator. * Fix regression from v1.4 with blurry particle editor and room view when pixelart rendering was enabled. * Fix `user-select` CSS parameter on modules' docs panel. +* Hotfix: fix font import issues on Windows, as well as fix potential similar issues for other asset types ### 🍱 Demos, Dependencies and Stuff diff --git a/src/node_requires/resources/fonts/index.js b/src/node_requires/resources/fonts/index.js index e2bdc0495..832332499 100644 --- a/src/node_requires/resources/fonts/index.js +++ b/src/node_requires/resources/fonts/index.js @@ -8,7 +8,7 @@ const getPathToTtf = function getPathToTtf(font, fs) { if (fs) { return path.join(global.projdir, 'fonts', font.origname); } - return `file://${global.projdir}/fonts/${font.origname}`; + return `file://${global.projdir.replace(/\\/g, '/')}/fonts/${font.origname}`; }; /** @@ -21,7 +21,7 @@ const getFontPreview = function getFontPreview(font, fs) { if (fs) { return path.join(global.projdir, 'fonts', `${font.origname}_prev.png`); } - return `file://${global.projdir}/fonts/${font.origname}_prev.png?cache=${font.lastmod}`; + return `file://${global.projdir.replace(/\\/g, '/')}/fonts/${font.origname}_prev.png?cache=${font.lastmod}`; }; const fontGenPreview = async function fontGenPreview(font) { @@ -52,7 +52,7 @@ const fontGenPreview = async function fontGenPreview(font) { c.x.clearRect(0, 0, 64, 64); c.x.font = `${font.italic ? 'italic ' : ''}${font.weight} ${Math.floor(64 * 0.75)}px "${loaded.family}"`; c.x.fillStyle = '#000'; - c.x.fillText('Aa', 64 * 0.05, 64 * 0.75); + c.x.fillText('Ab', 64 * 0.05, 64 * 0.75); // strip off the data:image url prefix to get just the base64-encoded bytes const dataURL = c.toDataURL(); @@ -64,14 +64,14 @@ const fontGenPreview = async function fontGenPreview(font) { const importTtfToFont = async function importTtfToFont(src) { const fs = require('fs-extra'), path = require('path'); - if (path.extname(src) !== '.ttf') { + if (path.extname(src).toLowerCase() !== '.ttf') { throw new Error(`[resources/fonts] Rejecting a file as it does not have a .ttf extension: ${src}`); } const generateGUID = require('./../../generateGUID'); const uid = generateGUID(); await fs.copy(src, path.join(global.projdir, '/fonts/f' + uid + '.ttf')); const obj = { - typefaceName: path.basename(src).replace('.ttf', ''), + typefaceName: path.basename(src).replace(/\.ttf$/i, ''), weight: 400, italic: false, origname: `f${uid}.ttf`, diff --git a/src/node_requires/resources/skeletons.js b/src/node_requires/resources/skeletons.js index 51248a3d6..9fd27b91e 100644 --- a/src/node_requires/resources/skeletons.js +++ b/src/node_requires/resources/skeletons.js @@ -25,7 +25,7 @@ const getSkeletonPreview = function getSkeletonPreview(skeleton, fs) { if (fs) { return path.join(global.projdir, 'img', `${skeleton.origname}_prev.png`); } - return `file://${global.projdir}/img/${skeleton.origname}_prev.png`; + return `file://${global.projdir.replace(/\\/g, '/')}/img/${skeleton.origname}_prev.png`; }; /** diff --git a/src/node_requires/resources/textures/index.js b/src/node_requires/resources/textures/index.js index 824c621b9..75dda8421 100644 --- a/src/node_requires/resources/textures/index.js +++ b/src/node_requires/resources/textures/index.js @@ -28,7 +28,7 @@ const getTexturePreview = function (texture, x2, fs) { if (fs) { return `${global.projdir}/img/${texture.origname}_prev${x2 ? '@2' : ''}.png`; } - return `file://${global.projdir}/img/${texture.origname}_prev${x2 ? '@2' : ''}.png?cache=${texture.lastmod}`; + return `file://${global.projdir.replace(/\\/g, '/')}/img/${texture.origname}_prev${x2 ? '@2' : ''}.png?cache=${texture.lastmod}`; }; /** @@ -47,14 +47,14 @@ const getTextureOrig = function (texture, fs) { if (fs) { return `${global.projdir}/img/${texture.origname}`; } - return `file://${global.projdir}/img/${texture.origname}?cache=${texture.lastmod}`; + return `file://${global.projdir.replace(/\\/g, '/')}/img/${texture.origname}?cache=${texture.lastmod}`; }; const baseTextureFromTexture = texture => new Promise((resolve, reject) => { const textureLoader = new PIXI.Loader(); const {resources} = textureLoader; - const path = 'file://' + global.projdir + '/img/' + texture.origname + '?' + texture.lastmod; + const path = 'file://' + global.projdir.replace(/\\/g, '/') + '/img/' + texture.origname + '?' + texture.lastmod; textureLoader.add(texture.uid, path); textureLoader.onError.add(reject); @@ -111,7 +111,7 @@ const getDOMImage = function (texture, deflt) { if (typeof texture === 'string') { texture = getTextureFromId(texture); } - path = 'file://' + global.projdir + '/img/' + texture.origname + '?' + texture.lastmod; + path = 'file://' + global.projdir.replace(/\\/g, '/') + '/img/' + texture.origname + '?' + texture.lastmod; } img.src = path; return new Promise((resolve, reject) => {

_A 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 z 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 literal 0 HcmV?d00001 diff --git a/app/data/ct.libs/3d/projection/img/i059e8892-2ffd-40c8-a97b-7645b40b3db5.png_prev@2.png b/app/data/ct.libs/3d/projection/img/i059e8892-2ffd-40c8-a97b-7645b40b3db5.png_prev@2.png new file mode 100644 index 0000000000000000000000000000000000000000..4e49863c14134aee210dc5facf076ea9020afe46 GIT binary patch literal 6229 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 literal 0 HcmV?d00001 diff --git a/app/data/ct.libs/3d/projection/img/i2b15568d-6e42-4ecc-a301-e580291e0a9b.png b/app/data/ct.libs/3d/projection/img/i2b15568d-6e42-4ecc-a301-e580291e0a9b.png new file mode 100644 index 0000000000000000000000000000000000000000..97fbbc80fcb735afc166b2938890b8c20aa5c07e GIT binary patch literal 11252 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 literal 0 HcmV?d00001 diff --git a/app/data/ct.libs/3d/projection/img/i2b15568d-6e42-4ecc-a301-e580291e0a9b.png_prev.png b/app/data/ct.libs/3d/projection/img/i2b15568d-6e42-4ecc-a301-e580291e0a9b.png_prev.png new file mode 100644 index 0000000000000000000000000000000000000000..a032c776f2bad55e54bc65cff42e6a16773f004d GIT binary patch literal 975 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 NrWY*Fmm0f9{|AY5OE&-j literal 0 HcmV?d00001 diff --git a/app/data/ct.libs/3d/projection/img/i33bda9f8-75f1-4255-b86d-e5973350fd2b.png b/app/data/ct.libs/3d/projection/img/i33bda9f8-75f1-4255-b86d-e5973350fd2b.png new file mode 100644 index 0000000000000000000000000000000000000000..9164ca49a05b0dd2cc3e26351adff8e3c10c82db GIT binary patch literal 2127 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 V+~!_dfS~{Y002ovPDHLkV1kVOa-;wN literal 0 HcmV?d00001 diff --git a/app/data/ct.libs/3d/projection/img/ia91db6dd-3773-4b88-8d5c-e80080cb0b82.png b/app/data/ct.libs/3d/projection/img/ia91db6dd-3773-4b88-8d5c-e80080cb0b82.png new file mode 100644 index 0000000000000000000000000000000000000000..5358dbe6b157372229c0ccc279431f969d190266 GIT binary patch literal 45351 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 XXXC`1VD}|I00000NkvXXu0mjfjs@Yb literal 0 HcmV?d00001 diff --git a/app/data/ct.libs/3d/projection/img/ia91db6dd-3773-4b88-8d5c-e80080cb0b82.png_prev@2.png b/app/data/ct.libs/3d/projection/img/ia91db6dd-3773-4b88-8d5c-e80080cb0b82.png_prev@2.png new file mode 100644 index 0000000000000000000000000000000000000000..ac3873bc01ff1bf0d5f803630bf5e63d3753ae76 GIT binary patch literal 11710 zcmcgyS`z#t`{G=k*N4N6FtAT3hTF@$s@NC^W-DxK1ZbW4MjbV&>` z^l!fZ!t>&}Yt6lHX5IBU_tf6|oXD3NibVKy_y7P9DJ#ioVV;Qpeo!3Dy-U(!5CC9+ zvYfPzm+65&u9wbC`ni}1B_0I)VVtZRu>%Da(ohrj71BaxM|wp159`((otIfg4yis% zUAFc+O?&J&dS-oiPeYwSNcDiTxZ%}9I~MhE+uhdd7SGLy=om{&BYp5NYDgd>{hQcD z*5U0^MYfv|jbGM;0P;nVqLhdiA$a8xZYK=D0XfHwcD#_hk;b8cV4hf8=p$TOb5dXn zO_;UT#b||)2C~)!oa0CW6F~pBKi7N#{X+Z1Yv0lR_!h6ti2Be=;)TvC14!3?gH@LE zy$U*>sBxU?5WMt%8c(Llzy&x@gH|0OKrc&ZIc`T0Hw4V&Ck04y7)w6!b9ofM5weUe z(|fE7tbPY~&fx$|eoS8E2ws4#<13cn1LQH*q7%RXv?Wv$by|L6zu)wJ;?BUFEuNZ# zXH9c-Itt2)1&~Lvz+*rT)ME>e`f6@znJ*~%rT<->hX)|aj?8!F&?6^}h>76sZZhTu z!wGEt5Ixvl^gtG1%+!(aVuX%LBolzynn9(gcnPs;yY#;6y9T(r&ZoS6miAl!WXD%X zD8&8L(_0#Pn2Fwcni)#Wzc|DcO7`FnqRh zap}B%MAqJAfto!yh_9=yeTj^SrRR5_tJa;NqW=6bmR3yRkU%NnE$t#V^}yhO@pN3A z1K8Az6($T?6vTFa{83f}DeYX(3-n5F#h*$MULAdkiCm-JZ#mz+j$cp76|(?|qL#Zu z$GeT7&SFZ7^*sm{Z(W`&h5&}&HMEYhriS_!D*iG z$m|-gBMI=7Sg9`^>Ogqnj8Xy6Yeu|@1Q7_~j&`A%q2Jm0GtahL7pCgNX58k$i~9u9 zrKlbp0fiotkbYal;D(%PG&W8MnNtPH;$ncDd~cpaLd>O@)33Yx7WyyGx}9eaE<~HM z7-hFAf_gQkw?&O^5H&==D_;3{cn7b~$$Ct;uyH$Tx(>z9?0i0pfSk#wfvtm|UM zE)65|3RZ2+gZ%IRR&1zin4|PZh zmWqynN%aXgr@S~V>?vUqOKzPI6!Gt$le?#HLYg3c4DAlJ5=bhJk^-5(=woA3=Br=Fq?%chWe~G^5M{T+LivPi);}nFS#r!6#Y(FWACjH7a3Y zex7OY!5=4T<8mh!wm66&KZ}8ko3;Q7s5>to$!uNJ!d|h*F9=P?efc@^x?eEs?rqjH z4dj!ZD76(RTt$e6FuA<_j=F)BwcyvxR5~Ro1!W48WB>~oM8BKS>inXa&oP3;u*?jP zAUR2avsx%~xVWs$$>Ckyp99oo9M-&H2iJakF>cmf%tg&Tri67=@jieN`~oRK+}A+f zC+`{-?;M(234B^X^70!rFZjvgic!3`)k3!Aj?$Mlhce6F6x@33Ny&;o4=+~M;x8~C zc|#hmO$ZqP2?C_2qfqmXiTk-v_*6dK?z|3HRe%DB2G{&#`R;uEeYV$M1GUWOm^yW) zq@>iH#^os;M*K|oHRQ%)vK?h3^5q?kko}W^0Ts&U#l=tB2;h7Oe8B$7h7SGR>n4rR zxip~laKWeBIlE9sPUzY?|2 zR=KYkwY`KYk|kVEUXYMx7B9 z64dr3z7G5;g>vZ;7_JKi)Ic?n>&;{BO~S9RoQD)e>X&ZAiv*Sq{rA&x5KU&9xGcNC z`(j*8W~@Shmj$5s=6j@Jlkk%y0!+$i1-$Fg)|5B{K$U@kpuaZXe};ZfnMG|2&`9|5 ziQF+&-i`0WF3tKTgPfh+I5+$O;n;&xPy$GU8jwMY!VGY|+!2p5 zd@TXnb+5orZCwI*m|lth2lzz?YA1uP`4S@Vfvb(o-0WI!_p<6NRMTsln3$13aT}T(g!d zCMqXmBHw6Q?}{620xGMOl};>?fR>eT0A8%eGzW>4|z5FflpOcQczS;k(jjrfO z)Vm8F!lo5*UIA280(gP#ATqWNO6=t4*2>eYqe34bBk#-6`%cZn=S-x|V8e$ixyi~> zA&y5T!z*?{$O;g0+Aqvze8`&@xC4K zYFuW#tAW=8t@5x=$AOqw2YaXBy~euY0nmf+sR z{1B7LfbITkt%GkETzucnO(#?9ax~{e;PJE^{a%D1hU^gv6=Q9tHZm5mxO*B@mJj{tT!Oj^s_q@GjMrZB0?-O)_tTz%@YYlk(C0fn-p$ z_P&Q$Mn(oH6v9w5=g0`+y#NRC;`;vt`}YHHj?{+nSBst+*4kd~PJQ#FqNaBER$9ty z*+aO$*i6m+`CD#j=_V6gn+THT!MYKJGqePIc}@97UegvkAqk%tmsc>2xM!Q%%x^C@ph!vh8AAX+<`#FdW=_ps3ab+FuAHr6r$`6=IN*ygn76pklCQOPC+sV}coA zQ^aL>={l5b;>f9JFI`BLf3B1q%lnd~~t4wzeG!OtNTBU-4|kFB)68z^*QA z<^8ztBY(%UA+K`n*M~Z@o@xf<&YRR;pVq$#hua8_+wTw9WBFXZ#NsJ$B!Qz z2AUSI1Xo+Lb4+!#@Syktj2~Fd6#*-=Rk9>up*&IW7GnHRu8*?}+*!|8EAeq&hUCn2 z@4;v$QlA-lAP>g4?zevfgM$;bb#)fMzbZ!^b*~Nbv_pjQ%FD~!s;f^Jl#_O4E z=pd8)s|U%3B|BYffB!!4`1i-#)6_J(ysAohVs`dO$HCzn-dLR1<;IN1CjGOp#nm8| zJwA)SUU18oG@Yy4VNY>^x#)~tIwcTwUcMUobfWc1pA=fJ90P}<-OOCNuMWDqb3cfDv)qj92@m)srv0;eF~SJ>FuPprp49i4*TCRQt14` z!V9krR8&;dd}(Q^FRSun%HMoiAqeu$J+?Eh7x!p1dR*%Max|xY&XMfkfL_Jqek_-# z#l)n3>-+RbrJm_r>t)~PZV~5g5$-lG)+MhBnx00Nv0j#ry))(&+pwatM_iv{dW&)b zqIR?=KFtK*jGD#7#_qIT?S8AMHC#~hXeQDqBJYi(cf0m$%Q`>zAfq4CiKM6k+DIj% zwMwW>y;jS&x3~FDy=j6%!zY%ZU_?a_a7}JBHZ|4Vo>OO77KjCBh4snForYY4{4w1> zpWRl(e-IN1?3&pvi}nRiHO2eD!Fa{k^z`&cmww-SXDF$ulkt2)V717aaFe8lcMJ9J z=4qpqu8E@AY=W1+-jDEOo{FyNer1xn}-IBAhVc)s#zq<0l zS4QJbYDq$el0(~l&UQ^OZnWg&H0c6=74 z3?tmMA2t}g-bvEL@VlD%V6C2ufBHacz^N%VyLXy=>3vL-(UDkSH z+pnf7>X$qg-lYk0V5Ou?9bLbrpxT`IVf?S0J=^d3THVZrw2EQOoZiz{oWWz{fT;Tq zt4Uq73;^ISOF@5ZGGh$ME8JZ zUTR&xFqKE|O_wcDl9LN;&Q@9CA1KPppN+K|UgH6vsQG!r=f#rm>J0k3|}a^U_V6?hjLPE3C?GdXEHQ(;z7FfnnRYaP6~Y5n#uCVY1>g>#2| zY%|HVq}M9#>)GCnS-@UdgHz*1s*x;EtYB@;CV4GR?Y21-^7P>=?f2nXpFX~LSiN#) z58FfFX}df7A`JNv5T0d1xHw{wN5rz8o)>10 z&ljA4$AoONxW+U}>7~>!1k`IW&dwhmB0v=hp&vb5LqqI8azZo zUABlWZo_BbCOH7vBVAL-^3_wmJWOz zmxYn8!epO+#QQxl!G3$*(B9gPv3opJ!uQ<#bbDNdrq;YOxFR&d3S>b%WbLLK5OBww z>-S<9?&#rhKCpbVDg620{09LoZEcI^!kifu<2Zw)Nscc87;7?!>I(#@ASr$Yz`AJI z@>jm_z;q9!UGo40wN^(6vtpe2WHDJ(2pzbi*}5jZN|YnRGIp-YvX>_>FRw?SUDJl= z`SbIyyz#&j9v(e-=Wz_Z*z3z|Z&1aIuY;l@E`jFb_KrW{O|bKjaD;kAwk)81A{dpO8$AtB$}mf9>^G@YxLn z{uW?p{+fmWX8>SWWM-Hb1r8M5n!v&sN6+>01i%T&uDw;3mF==|AFDMibGbf0nEBPy zQ|OO5PSlDwy?yM~?33-UUs>Mj+{Br`p_<%6N!VBEL)oT5X}9EJi4k{QAOpe&fHw6< zDEJk%QlTXV5qvfqRwgI;&06>F@?^sdj~WkL4T|T$U{lF}8?-|b3oXx&^(4EC<-q$E zv%3?v?(>U;c(w=$>wEiMM+}2>!E0e4vMP&Fo~VVQgLXN=0B?rXdb>B&^-NJoBPtk& z0RmoP0GvU1nevy01_s`ZRaM8uufLs{ewfnT3nO}%+ILvI$j8UWj+cWhP*&2=c-_OY zFGY)KHvM;)%|PMxGwOsN)`Oxwn%qq5ZWVXsG(r`7!#dpvm; zF18w*J_cp$!QleZIf(we(o#+bj4IMez|-RVUu>}iGe5aWIC}+j_%$;KozY9<%zA-Z zoHjuSLNFX`KY(>4Vha`&x!Mfq(}i@9+OEjMR)Q#wIQF0%UZ!hY6)i){JPvktCFp+5 z0Dc?v(JHgo?ddtD1os5)xZ0S6!@O!@)Lu#o3ymFe%cIY6ui||JYxD2 zZ!Soe;BISM+ZikvGddJ3g#@`Pu&76bungLk)ORi~61AGj3{(GzK`cJ{Hwd0ql`4KHOb@;1%1&)st zoeaic4={xAj720XK%`kHO~Cj0P?=<3lM;MTm1zT=d)%BLC=(uh0}jo+feP4}^V`9N zWwjm%b+UtC5VeORwY&!sLS}v%q~sm$I1>{FZ;0ppB>Qm!+V3w53kyAU>HE2iED;N0k;K}ZB7WSjeqnD>o5Opc4m=zY3w%1d z1>U#2f{!F#f3(&V_qe;@G3T}Yq@$JKY}HL6?s1z>Q&6+g($5ivr=k|KH-1MROk#b2 zW)Z=Y41P(!fSOOgwd{@``3}e_p*)3!g!o3NV;S=@iZ#wpBYW>DId2m^@DCP;T#_^^ zofey-r^`*63y?^7x=!v?mSYCihit?$b{D@g2p~`{DX~)-sOzO3vvol`gI-s(QQ*2o zua5UHpZ$!^6$s;^m#L<(GBop~E?x2`a3S*;5`Qng@L0^_}id~4c;81bW2E1 zuDMH68v4E#5Yf z|NPAK08% z;0GaMECjfFYtvqL_e_xKiung8qF+>ejw>77@F^-O*}^3&??uSj+~sbx$L$2f?9kz#J8{K~jw?i=mOSg!GR zlV$}zyl__(@B1a=w>gMHYXWy44{U7VP&JzF6srf@b)#vL@?^UY-?s!|zWKU-}W(;XxG$9=N)>rE_@=IzDgr!_VaLfd*2{A8HaFjiw=s%CnP`-8L|M^)-W( z>HHcEK965#@Fk6abGqa~l6-pD! zHaRt8@n@EAKr$FZD0CmmD$t566s=`TCu!jg4GiompH_M^^Bfi@4Qz(Y^Hc}Cc34=# z#8i>Y#v2RNRPItd_s!i;pa>jvgeN2B50elR^F5odbI>D)41rx6D!9rUA3e`hkL*0V zGG|yRYgp=;tum%0KAIgG`l#}dik3D+UhISnZ#-! z;_>|@2%tsWb>7`x^Eo~G(h1l*>?NesJ%Iptj_>o!Y>dP}^7C8w3y$=MX~UcMcy*s@ zl9l(>mfj1RN$l7p{cGQ8@X5q_?&r+gioSKyqL;j>#MBFgIlc>VzNa zB;Q*qfXr}lKG43HG%L~sxs!*HFiIZ82l_b|jc&~(B-zz0%zvj56)X$~**5e86f~Vo z(+o$wP-wdp;t~}S$!yOxD&XVZbTV*QGOk@Xh6~Lg33DFe8gpUUsF|hsez*n!(k@Y# z$5&EIpNtGM7(R$T!tSJ$clEc8_SU+eDRaJJE7+bmyk-VM?L@1tg$et|c6x3HgRtgfZzC1>e}XouZCTTs9_F?Rviyflv={ESH?zdK>P5HFiZ#}tzSXapgK+($O% zj;o-1FQkE(SD{T_F4M|Fkk|X$trHx67;1s3w)tpMp4QU`ufOZ(B7)->Im{N@8v^e^ ztkvdT!hv@(tWii@n>tYo!gwuLtf4195+>-QE|RfX+r?D^^v-uda1${y#YE!P)v_dj z7$HZ#5*yShV&A!sqTbw}yfbzk^iEagEOo!pf>(O)?yn!?M=$0u#q zhHRxe O^`mi_6f%IDaNbS7%VWvXAvJtZ*;Qik&0LRXnO}01AXJgk$*Zu3m_V{!G zoAWe)?A_O*c$^E$Y$1o|kD2pf((zsDhJ=j5)P;Te?qbd3ul*lU=7qrmWxQJBA6wjj|Esz9P@6Vbj^9@t)bI^^ObpQ@ z>9BjlEu(j@8Hj_RQW6ILv!xO0V%pJ0j>lyRx(w~_?q-k)6xmpPH}zjln@v-S)!1Rk z_b#w34oVe<;(OoO!)}h_19gB71+}m+wMXNxSO~_bkyw5E%hP2>zBF+6!z=)Vx`xA3 zS6#i2|M}(&F8=#x@6cRkwcZyx9Tv9Pl~90hD|B|`YV)db8>~hO2?9g#o^W&bR{ebAX5`z;HD)`&l>Z<= ziW%{`gTwVMM6$!~r*LgKEGhQu@gE(K;cep=sYRCwOtZ-NIVDAbUTV$xX+HMm_>IM( z=2M|PB5}#F7e5EJ&`ke zzRy+&Q$0dp2~`(0#*K>%PmQW!eUKpF1V!-D%&eyOjh*kKgi?@H4dRVuq@=<8hYZwJ zO4s!_JkqlDH#J3{CMPFp8@+gJNQi@o%-wtsv6Zd1YCL95;bC zYm6#e#9ZMRcGZOu8YprjACq@>E~-EQ(Xf5^o9gX#nNd8_F|HQ(IXLx^AhFQ83!}X84mfk;vd^di7#0+8mI8Y29k-EigUe?0-)P-hMhY|@yzdEj z`L9X?qw%?yk%<{9X=*rck8QoZ4J=hvQ9QDBK=}!o(ISLe{ybkX5Q0DkR{fB}M;wz# zqF3@Kl~UjTC{xXqAjV6!?zkCY)~}5ax?8E{KT8G&oX^?#{_Y$iegOQzN?^6($8tEY zJ^n*szdKp7f1w9-;C6PL;XzVF`B)yw{1c@T^CuV0bZ5I5ESzU3NBNF~|Brs0@t3}+>MdN(7YDZ#n*$7RzGb_yk zQNoQsFuZBUXoFmUxko%;4vx%aG6+tWIhL}5j=Psm2fVU(a$NVvJ)_}g;r}E_%nhzu zco!&;Ib2a%pGH0oZ&$&+Py~t_{I>okR=s%f;=_VciISD@jMa)QOWLz**SSOVFY>E znpNV-$;mE8ZV%k6n-V9N@vk4+Yvz>>#0IWGp|_0f7;q@{-LQ@`1-z$@`Z-4qzzzg5 z*{2_BH7jqN-lYTf_V!6)Vq#dH%l-}787eu!ac1w{l}SB)s-_6=ws#nUYeH@$vYGX9 z)9xwVkdvTKysv7bYaERg0m1o$b2HG&qQYcA2MlNfmFzYLIJ0h`>BT(6E8TZ~%l*sF z#X*oZp<{jqUMza1q=?8kfA!ZAiDzvk2Qb3n5@uJXf{iL13Y3G2G4A=*-A&7;p7E6x zkaK;)#3cQKdbwsvlTjwih!=j?8qgSlS)Zwu#|FyL8`Tv7pGmgk2}zp>8ml8d0cn`d z=5~+K>K|}C{opmT@JRgr1{KB3PG$MB%b=Yajt7Esa&Wk`pU*px4dEu}&bk|#m@KAb zWY9@sM3QIm`OcT-Go-^oNtU19%45bzR`R@QG!K62g&_VDV%UKI`guE@)axx`)}Qw>_&SP6 z1kO7=cQ$;QT92_I7Y`3ll!2X21`45y>x2B21_{_8p({NV`ZwotED!0t}Fy<8`Kf{yZ2N8QEzcGIUK;&*8{C6f*yaw^`r7KpEHv zcf5SrI<*hO@*`kG7BFMOwm6&5@^I!c16T@;eXzsM)j_nEZE{#&Nn;xTD*j~cg~oG{SALUiOa+wiCN zk*>Z;#2;0he(}QS3C9^WxMS7%mToK+>`1tyj7I`qSpdNv;~cSqGF&pBo7}-)Pv?ET z@>#m!)Bm@@rP^qm-F@awq2l6FwfLsWZ%Cclsc|(ddS?+=EIe3FvB^{P3q27L(Itt* z>6li%H{TsQK=<(Bg|)S{Ms$39e0~L!8bW{DqG91j#!O~<`j20>f<4vA5pX6HZ=mx} zYJ{ue$?k3`Rd|;_IZO|@!a@3u;oYRVl$PQ@aq~T^dMI3ey@p{lNpzo#I!>lBQ_ITR zXp^?d8%ze4Z*Fe(vMMKe?9V0&xUToDLJ;#dD~A)P3!hd-E6fT08%69VDl+8eZykGy z=R7rQ^Ly*>-}>8`6X>|Nc!#X1nV6rOyR3cvZHn8t@rbk4R4Np?<~hUzi6=>o@Rs_E zkv*-8YW95KqX$-*R}Q+BQdfW)BprAg`Cc5UzR+kl5$LmVG}yktl`heJ!VQqDSeWAj%AC&j3|pRaT0sGqZ#P4)OxWr*v-Uh zT{Gu5E>B%%b;A={5m0bx_x^pmWbM9)YiBUFu$^EAnH4xYrxns!iln-fe|L24NTgvj zQHMyyW>PKYf&Xzs8|}(0Gfta<%z-dDa7HfTxkXpuaG=!T?*mKI+xTUR=~^Au!%;u6 znT_<}O@-)g*UzI{~oAHH-30A_+TL*WF-6hxUC;uY#8BcNm&_@lN)~Mo_o_QhQQv7=?SN$=F5H0S;eivFlc{lzM|Z^x$aEuDa}TBqawiHk zGxjd7)(%GEY-9I@`m2-bh%k!-o{Hf@Ql!wzdA3v&mpqwg8w1m2##Aizgk;OKAd}g; znFBx93x{T*GO9sh82o_Z+lMJn-VGbI)u`JmFXCy=#tVy~;#c{FnCURD^51e z)-)Og{YP>CjNuC)+kLoE&cXSmf5NyK2#NLk3~ob%j0Fp}ENckDaK!_$>_j}YAi!2tWdTGS;f&fG0k0T3o`x=0>;iA{+CGYppqVJlZ6jwz=vT(D zBe~bXeCUE@4ObR4i*}Vx9fyrXPol z$;?o4VXFr*0dm(t_(EP+Dd!jjTU_xB5}Hi}T$(uUcx2tY9U9JQ*4h}@SH--X{D1bDW&kpZp#p-aHFr_Amkf#_$@*k_ce z`G^D*0b(v~`!OaBoDR1Tr_~UH%{wAW-*dZ@0{#LOSexHN02{2z+^H5Ak9T tvx^*4e6=Zq3mOyt?-io|AFsG4_~?R-ejhx`g4xRkl;t(#%4N)h{|9+ZMa%#I literal 0 HcmV?d00001 diff --git a/app/data/ct.libs/3d/projection/img/r6ab031e8b734.png b/app/data/ct.libs/3d/projection/img/r6ab031e8b734.png new file mode 100644 index 0000000000000000000000000000000000000000..57a09843e75a23547cf29cc658759ddc94278814 GIT binary patch literal 14104 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⪻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⪻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⪻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 extends AbstractProjection { + updateLocalTransform(lt: PIXI.Matrix): void; + _projID: number; + _currentProjID: number; + _affine: AFFINE; + affinePreserveOrientation: boolean; + scaleAfterAffine: boolean; + set affine(value: AFFINE); + get affine(): AFFINE; + local: T; + world: T; + set enabled(value: boolean); + clear(): void; + } +} +declare module PIXI.projection { + class Batch3dGeometry extends PIXI.Geometry { + _buffer: PIXI.Buffer; + _indexBuffer: PIXI.Buffer; + constructor(_static?: boolean); + } + class Batch2dPluginFactory { + static create(options: any): any; + } +} +declare module PIXI.projection { + import AbstractBatchRenderer = PIXI.AbstractBatchRenderer; + class UniformBatchRenderer extends AbstractBatchRenderer { + _iIndex: number; + _aIndex: number; + _dcIndex: number; + _bufferedElements: Array; + _attributeBuffer: PIXI.ViewableBuffer; + _indexBuffer: Uint16Array; + vertexSize: number; + forceMaxTextures: number; + getUniforms(sprite: PIXI.Sprite): any; + syncUniforms(obj: any): void; + defUniforms: {}; + buildDrawCalls(texArray: PIXI.BatchTextureArray, start: number, finish: number): void; + drawBatches(): void; + contextChange(): void; + } +} +declare module PIXI.projection { + import IPoint = PIXI.IPoint; + abstract class Surface implements IWorldTransform { + surfaceID: string; + _updateID: number; + vertexSrc: string; + fragmentSrc: string; + fillUniforms(uniforms: any): void; + clear(): void; + boundsQuad(v: ArrayLike, out: any, after?: PIXI.Matrix): void; + abstract apply(pos: IPoint, newPos: IPoint): IPoint; + abstract applyInverse(pos: IPoint, newPos: IPoint): IPoint; + } +} +declare module PIXI.projection { + import IPoint = PIXI.IPoint; + class BilinearSurface extends Surface { + distortion: PIXI.Point; + constructor(); + clear(): void; + apply(pos: IPoint, newPos?: IPoint): IPoint; + applyInverse(pos: IPoint, newPos: IPoint): IPoint; + mapSprite(sprite: PIXI.Sprite, quad: Array, outTransform?: PIXI.Transform): this; + mapQuad(rect: PIXI.Rectangle, quad: Array, outTransform: PIXI.Transform): this; + fillUniforms(uniforms: any): void; + } +} +declare module PIXI.projection { + class Container2s extends PIXI.Container { + constructor(); + proj: ProjectionSurface; + get worldTransform(): any; + } +} +declare namespace PIXI { + interface Matrix extends PIXI.projection.IWorldTransform { + apply(pos: IPoint, newPos?: IPoint): IPoint; + applyInverse(pos: IPoint, newPos?: IPoint): IPoint; + } +} +declare module PIXI.projection { + import IPoint = PIXI.IPoint; + interface IWorldTransform { + apply(pos: IPoint, newPos: IPoint): IPoint; + applyInverse(pos: IPoint, newPos: IPoint): IPoint; + } + class ProjectionSurface extends AbstractProjection { + constructor(legacy: PIXI.Transform, enable?: boolean); + _surface: Surface; + _activeProjection: ProjectionSurface; + set enabled(value: boolean); + get surface(): Surface; + set surface(value: Surface); + applyPartial(pos: IPoint, newPos?: IPoint): IPoint; + apply(pos: IPoint, newPos?: IPoint): IPoint; + applyInverse(pos: IPoint, newPos: IPoint): IPoint; + mapBilinearSprite(sprite: PIXI.Sprite, quad: Array): void; + _currentSurfaceID: number; + _currentLegacyID: number; + _lastUniforms: any; + clear(): void; + get uniforms(): any; + } +} +declare module PIXI.projection { + class BatchBilineardGeometry extends PIXI.Geometry { + _buffer: PIXI.Buffer; + _indexBuffer: PIXI.Buffer; + constructor(_static?: boolean); + } + class BatchBilinearPluginFactory { + static create(options: any): any; + } +} +declare module PIXI { + interface Sprite { + convertTo2s(): void; + } + interface Container { + convertTo2s(): void; + convertSubtreeTo2s(): void; + } +} +declare module PIXI.projection { +} +declare module PIXI.projection { + class Sprite2s extends PIXI.Sprite { + constructor(texture: PIXI.Texture); + proj: ProjectionSurface; + aTrans: PIXI.Matrix; + _calculateBounds(): void; + calculateVertices(): void; + calculateTrimmedVertices(): void; + get worldTransform(): any; + } +} +declare module PIXI.projection { + class Text2s extends PIXI.Text { + constructor(text?: string, style?: PIXI.TextStyle, canvas?: HTMLCanvasElement); + proj: ProjectionSurface; + aTrans: PIXI.Matrix; + get worldTransform(): any; + } +} +declare module PIXI.projection { + function container2dWorldTransform(): any; + class Container2d extends PIXI.Container { + constructor(); + proj: Projection2d; + toLocal(position: PIXI.IPoint, from?: PIXI.DisplayObject, point?: T, skipUpdate?: boolean, step?: TRANSFORM_STEP): T; + get worldTransform(): any; + } + let container2dToLocal: (position: PIXI.IPoint, from?: PIXI.DisplayObject, point?: T, skipUpdate?: boolean, step?: TRANSFORM_STEP) => T; +} +declare module PIXI.projection { + import IPoint = PIXI.IPoint; + enum AFFINE { + NONE = 0, + FREE = 1, + AXIS_X = 2, + AXIS_Y = 3, + POINT = 4, + AXIS_XR = 5 + } + class Matrix2d { + static readonly IDENTITY: Matrix2d; + static readonly TEMP_MATRIX: Matrix2d; + mat3: Float64Array; + floatArray: Float32Array; + constructor(backingArray?: ArrayLike); + get a(): number; + get b(): number; + get c(): number; + get d(): number; + get tx(): number; + get ty(): number; + set a(value: number); + set b(value: number); + set c(value: number); + set d(value: number); + set tx(value: number); + set ty(value: number); + set(a: number, b: number, c: number, d: number, tx: number, ty: number): this; + toArray(transpose?: boolean, out?: Float32Array): Float32Array; + apply(pos: IPoint, newPos: IPoint): IPoint; + translate(tx: number, ty: number): this; + scale(x: number, y: number): this; + scaleAndTranslate(scaleX: number, scaleY: number, tx: number, ty: number): void; + applyInverse(pos: IPoint, newPos: IPoint): IPoint; + invert(): Matrix2d; + identity(): Matrix2d; + clone(): Matrix2d; + copyTo2dOr3d(matrix: Matrix2d): Matrix2d; + copyTo(matrix: PIXI.Matrix, affine?: AFFINE, preserveOrientation?: boolean): PIXI.Matrix; + copyFrom(matrix: PIXI.Matrix): this; + setToMultLegacy(pt: PIXI.Matrix, lt: Matrix2d): this; + setToMultLegacy2(pt: Matrix2d, lt: PIXI.Matrix): this; + setToMult(pt: Matrix2d, lt: Matrix2d): this; + prepend(lt: any): this; + } +} +declare module PIXI.projection { + class Mesh2d extends PIXI.Mesh { + static defaultVertexShader: string; + static defaultFragmentShader: string; + constructor(geometry: PIXI.Geometry, shader: PIXI.Shader, state: PIXI.State, drawMode?: number); + vertexData2d: Float32Array; + proj: Projection2d; + calculateVertices(): void; + _renderDefault(renderer: PIXI.Renderer): void; + toLocal(position: PIXI.IPoint, from?: PIXI.DisplayObject, point?: T, skipUpdate?: boolean, step?: TRANSFORM_STEP): T; + get worldTransform(): any; + } + class SimpleMesh2d extends Mesh2d { + constructor(texture: PIXI.Texture, vertices?: Float32Array, uvs?: Float32Array, indices?: Uint16Array, drawMode?: number); + autoUpdate: boolean; + get vertices(): Float32Array; + set vertices(value: Float32Array); + protected _render(renderer?: PIXI.Renderer): void; + } +} +declare module PIXI.projection { + import IPoint = PIXI.IPoint; + class Projection2d extends LinearProjection { + constructor(legacy: PIXI.Transform, enable?: boolean); + matrix: Matrix2d; + pivot: PIXI.ObservablePoint; + reverseLocalOrder: boolean; + onChange(): void; + setAxisX(p: IPoint, factor?: number): void; + setAxisY(p: IPoint, factor?: number): void; + mapSprite(sprite: PIXI.Sprite, quad: Array): void; + mapQuad(rect: PIXI.Rectangle, p: Array): void; + updateLocalTransform(lt: PIXI.Matrix): void; + clear(): void; + } +} +declare module PIXI { + interface Sprite { + _texture: PIXI.Texture; + vertexData: Float32Array; + vertexTrimmedData: Float32Array; + _transformID?: number; + _textureID?: number; + _transformTrimmedID?: number; + _textureTrimmedID?: number; + _anchor?: ObservablePoint; + convertTo2d?(): void; + } + interface Container { + convertTo2d?(): void; + convertSubtreeTo2d?(): void; + } + interface SimpleMesh { + convertTo2d?(): void; + } + interface Graphics { + convertTo2d?(): void; + } +} +declare module PIXI.projection { +} +declare module PIXI.projection { + class Sprite2d extends PIXI.Sprite { + constructor(texture: PIXI.Texture); + vertexData2d: Float32Array; + proj: Projection2d; + _calculateBounds(): void; + calculateVertices(): void; + calculateTrimmedVertices(): void; + toLocal(position: PIXI.IPoint, from?: PIXI.DisplayObject, point?: T, skipUpdate?: boolean, step?: TRANSFORM_STEP): T; + get worldTransform(): any; + } +} +declare module PIXI.projection { + class Text2d extends PIXI.Text { + constructor(text?: string, style?: PIXI.TextStyle, canvas?: HTMLCanvasElement); + proj: Projection2d; + vertexData2d: Float32Array; + get worldTransform(): any; + } +} +declare module PIXI.projection { + class TilingSprite2d extends PIXI.TilingSprite { + constructor(texture: PIXI.Texture, width: number, height: number); + tileProj: Projection2d; + proj: Projection2d; + get worldTransform(): any; + toLocal(position: PIXI.IPoint, from?: PIXI.DisplayObject, point?: T, skipUpdate?: boolean, step?: TRANSFORM_STEP): T; + _render(renderer: PIXI.Renderer): void; + } +} +declare module PIXI.projection { + class TilingSprite2dRenderer extends PIXI.ObjectRenderer { + constructor(renderer: PIXI.Renderer); + shader: PIXI.Shader; + simpleShader: PIXI.Shader; + quad: PIXI.QuadUv; + render(ts: any): void; + } +} +declare module PIXI.projection { +} +declare module PIXI.projection { + class SpriteMaskFilter2d extends PIXI.Filter { + constructor(sprite: PIXI.Sprite); + maskSprite: PIXI.Sprite; + maskMatrix: Matrix2d; + apply(filterManager: PIXI.systems.FilterSystem, input: PIXI.RenderTexture, output: PIXI.RenderTexture, clearMode?: boolean): void; + static calculateSpriteMatrix(input: PIXI.RenderTexture, mappedMatrix: Matrix2d, sprite: PIXI.Sprite): Matrix2d; + } +} +declare module PIXI.projection { + class Camera3d extends Container3d { + constructor(); + _far: number; + _near: number; + _focus: number; + _orthographic: boolean; + get far(): number; + get near(): number; + get focus(): number; + get ortographic(): boolean; + setPlanes(focus: number, near?: number, far?: number, orthographic?: boolean): void; + } +} +declare module PIXI.projection { + function container3dWorldTransform(): any; + class Container3d extends PIXI.Container { + constructor(); + proj: Projection3d; + isFrontFace(forceUpdate?: boolean): boolean; + getDepth(forceUpdate?: boolean): number; + toLocal(position: PIXI.IPoint, from?: PIXI.DisplayObject, point?: T, skipUpdate?: boolean, step?: TRANSFORM_STEP): T; + get worldTransform(): any; + get position3d(): PIXI.IPoint; + get scale3d(): PIXI.IPoint; + get euler(): IEuler; + get pivot3d(): PIXI.IPoint; + set position3d(value: PIXI.IPoint); + set scale3d(value: PIXI.IPoint); + set euler(value: IEuler); + set pivot3d(value: PIXI.IPoint); + } + let container3dToLocal: (position: PIXI.IPoint, from?: PIXI.DisplayObject, point?: T, skipUpdate?: boolean, step?: TRANSFORM_STEP) => T; + let container3dGetDepth: (forceUpdate?: boolean) => number; + let container3dIsFrontFace: (forceUpdate?: boolean) => boolean; +} +declare module PIXI.projection { + class Euler { + constructor(x?: number, y?: number, z?: number); + _quatUpdateId: number; + _quatDirtyId: number; + quaternion: Float64Array; + _x: number; + _y: number; + _z: number; + _sign: number; + get x(): number; + set x(value: number); + get y(): number; + set y(value: number); + get z(): number; + set z(value: number); + get pitch(): number; + set pitch(value: number); + get yaw(): number; + set yaw(value: number); + get roll(): number; + set roll(value: number); + set(x?: number, y?: number, z?: number): void; + copyFrom(euler: IEuler): void; + copyTo(p: IEuler): IEuler; + equals(euler: IEuler): boolean; + clone(): Euler; + update(): boolean; + } +} +declare module PIXI.projection { + import IPoint = PIXI.IPoint; + class Matrix3d { + static readonly IDENTITY: Matrix3d; + static readonly TEMP_MATRIX: Matrix3d; + mat4: Float64Array; + floatArray: Float32Array; + _dirtyId: number; + _updateId: number; + _mat4inv: Float64Array; + cacheInverse: boolean; + constructor(backingArray?: ArrayLike); + get a(): number; + get b(): number; + get c(): number; + get d(): number; + get tx(): number; + get ty(): number; + set a(value: number); + set b(value: number); + set c(value: number); + set d(value: number); + set tx(value: number); + set ty(value: number); + set(a: number, b: number, c: number, d: number, tx: number, ty: number): this; + toArray(transpose?: boolean, out?: Float32Array): Float32Array; + setToTranslation(tx: number, ty: number, tz: number): void; + setToRotationTranslationScale(quat: Float64Array, tx: number, ty: number, tz: number, sx: number, sy: number, sz: number): Float64Array; + apply(pos: IPoint, newPos: IPoint): IPoint; + translate(tx: number, ty: number, tz: number): this; + scale(x: number, y: number, z?: number): this; + scaleAndTranslate(scaleX: number, scaleY: number, scaleZ: number, tx: number, ty: number, tz: number): void; + applyInverse(pos: IPoint, newPos: IPoint): IPoint; + invert(): Matrix3d; + invertCopyTo(matrix: Matrix3d): void; + identity(): Matrix3d; + clone(): Matrix3d; + copyTo3d(matrix: Matrix3d): Matrix3d; + copyTo2d(matrix: Matrix2d): Matrix2d; + copyTo2dOr3d(matrix: Matrix2d | Matrix3d): Matrix2d | Matrix3d; + copyTo(matrix: PIXI.Matrix, affine?: AFFINE, preserveOrientation?: boolean): PIXI.Matrix; + copyFrom(matrix: PIXI.Matrix): this; + setToMultLegacy(pt: PIXI.Matrix, lt: Matrix3d): this; + setToMultLegacy2(pt: Matrix3d, lt: PIXI.Matrix): this; + setToMult(pt: Matrix3d, lt: Matrix3d): this; + prepend(lt: any): void; + static glMatrixMat4Invert(out: Float64Array, a: Float64Array): Float64Array; + static glMatrixMat4Multiply(out: Float64Array, a: Float64Array, b: Float64Array): Float64Array; + } +} +declare module PIXI.projection { + class Mesh3d2d extends PIXI.Mesh { + constructor(geometry: PIXI.Geometry, shader: PIXI.Shader, state: PIXI.State, drawMode?: number); + vertexData2d: Float32Array; + proj: Projection3d; + calculateVertices(): void; + get worldTransform(): any; + toLocal(position: PIXI.IPoint, from?: PIXI.DisplayObject, point?: T, skipUpdate?: boolean, step?: TRANSFORM_STEP): T; + isFrontFace(forceUpdate?: boolean): any; + getDepth(forceUpdate?: boolean): any; + get position3d(): PIXI.IPoint; + get scale3d(): PIXI.IPoint; + get euler(): Euler; + get pivot3d(): PIXI.IPoint; + set position3d(value: PIXI.IPoint); + set scale3d(value: PIXI.IPoint); + set euler(value: Euler); + set pivot3d(value: PIXI.IPoint); + } + class SimpleMesh3d2d extends Mesh3d2d { + constructor(texture: PIXI.Texture, vertices?: Float32Array, uvs?: Float32Array, indices?: Uint16Array, drawMode?: number); + autoUpdate: boolean; + get vertices(): Float32Array; + set vertices(value: Float32Array); + protected _render(renderer?: PIXI.Renderer): void; + } +} +declare module PIXI.projection { + type IEuler = Euler | ObservableEuler; + class ObservableEuler { + cb: any; + scope: any; + constructor(cb: any, scope: any, x?: number, y?: number, z?: number); + _quatUpdateId: number; + _quatDirtyId: number; + quaternion: Float64Array; + _x: number; + _y: number; + _z: number; + _sign: number; + get x(): number; + set x(value: number); + get y(): number; + set y(value: number); + get z(): number; + set z(value: number); + get pitch(): number; + set pitch(value: number); + get yaw(): number; + set yaw(value: number); + get roll(): number; + set roll(value: number); + set(x?: number, y?: number, z?: number): void; + copyFrom(euler: IEuler): void; + copyTo(p: IEuler): IEuler; + equals(euler: IEuler): boolean; + clone(): Euler; + update(): boolean; + } +} +declare namespace PIXI { + interface IPoint { + z?: number; + set(x?: number, y?: number, z?: number): void; + } + interface Point { + z?: number; + set(x?: number, y?: number, z?: number): void; + } + interface ObservablePoint { + _z?: number; + z: number; + cb?: any; + scope?: any; + set(x?: number, y?: number, z?: number): void; + } +} +declare module PIXI.projection { + class Point3d extends PIXI.Point { + constructor(x?: number, y?: number, z?: number); + set(x?: number, y?: number, z?: number): this; + copyFrom(p: PIXI.IPoint): this; + copyTo(p: PIXI.Point): PIXI.Point; + } + class ObservablePoint3d extends PIXI.ObservablePoint { + _z: number; + get z(): number; + set z(value: number); + set(x?: number, y?: number, z?: number): this; + copyFrom(p: PIXI.IPoint): this; + copyTo(p: PIXI.IPoint): PIXI.IPoint; + } +} +declare module PIXI.projection { + class Projection3d extends LinearProjection { + constructor(legacy: PIXI.Transform, enable?: boolean); + cameraMatrix: Matrix3d; + _cameraMode: boolean; + get cameraMode(): boolean; + set cameraMode(value: boolean); + position: ObservablePoint3d; + scale: ObservablePoint3d; + euler: ObservableEuler; + pivot: ObservablePoint3d; + onChange(): void; + clear(): void; + updateLocalTransform(lt: PIXI.Matrix): void; + } +} +declare module PIXI { + interface Container { + convertTo3d(): void; + convertSubtreeTo3d(): void; + } +} +declare module PIXI.projection { +} +declare module PIXI.projection { + class Sprite3d extends PIXI.Sprite { + constructor(texture: PIXI.Texture); + vertexData2d: Float32Array; + proj: Projection3d; + culledByFrustrum: boolean; + trimmedCulledByFrustrum: boolean; + calculateVertices(): void; + calculateTrimmedVertices(): void; + _calculateBounds(): void; + _render(renderer: PIXI.Renderer): void; + containsPoint(point: PIXI.IPoint): boolean; + get worldTransform(): any; + toLocal(position: PIXI.IPoint, from?: PIXI.DisplayObject, point?: T, skipUpdate?: boolean, step?: TRANSFORM_STEP): T; + isFrontFace(forceUpdate?: boolean): any; + getDepth(forceUpdate?: boolean): any; + get position3d(): PIXI.IPoint; + get scale3d(): PIXI.IPoint; + get euler(): Euler; + get pivot3d(): PIXI.IPoint; + set position3d(value: PIXI.IPoint); + set scale3d(value: PIXI.IPoint); + set euler(value: Euler); + set pivot3d(value: PIXI.IPoint); + } +} +declare module PIXI.projection { + class Text3d extends PIXI.Text { + constructor(text?: string, style?: PIXI.TextStyle, canvas?: HTMLCanvasElement); + proj: Projection3d; + vertexData2d: Float32Array; + get worldTransform(): any; + toLocal(position: PIXI.IPoint, from?: PIXI.DisplayObject, point?: T, skipUpdate?: boolean, step?: TRANSFORM_STEP): T; + isFrontFace(forceUpdate?: boolean): any; + getDepth(forceUpdate?: boolean): any; + get position3d(): PIXI.IPoint; + get scale3d(): PIXI.IPoint; + get euler(): IEuler; + get pivot3d(): PIXI.IPoint; + set position3d(value: PIXI.IPoint); + set scale3d(value: PIXI.IPoint); + set euler(value: IEuler); + set pivot3d(value: PIXI.IPoint); + } +} +declare module PIXI.projection.utils { + import IPoint = PIXI.IPoint; + function getIntersectionFactor(p1: IPoint, p2: IPoint, p3: IPoint, p4: IPoint, out: IPoint): number; + function getPositionFromQuad(p: Array, anchor: IPoint, out: IPoint): IPoint; +} From f43e44ce466d70d1da9b085166e2298894326066 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Sat, 15 Aug 2020 17:55:27 +1200 Subject: [PATCH 14/74] :bento: Update electron-packager to v15.0.0 --- app/package-lock.json | 689 ++++++++++++++---------------------------- app/package.json | 2 +- 2 files changed, 234 insertions(+), 457 deletions(-) diff --git a/app/package-lock.json b/app/package-lock.json index 94c2209ef..166fbbac8 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@electron/get": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.7.6.tgz", - "integrity": "sha512-zlNikt6ziVLNcm4lly1L4y62fJd/eYpEBjF5DiV/VAQq2vdPjH4sbUphXt9upmHz86lAhAj8g9lTnWrxJ/KBZw==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.12.2.tgz", + "integrity": "sha512-vAuHUbfvBQpYTJ5wB7uVIDq5c/Ry0fiTBMs7lnEYAo/qXXppIVcWdfBr57u6eRnKdVso7KSiH6p/LbQAG6Izrg==", "requires": { "debug": "^4.1.1", "env-paths": "^2.2.0", @@ -15,18 +15,11 @@ "global-agent": "^2.0.2", "global-tunnel-ng": "^2.7.1", "got": "^9.6.0", + "progress": "^2.0.3", "sanitize-filename": "^1.6.2", "sumchecker": "^3.0.1" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, "fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -36,72 +29,6 @@ "jsonfile": "^4.0.0", "universalify": "^0.1.0" } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "requires": { - "prepend-http": "^2.0.0" - } } } }, @@ -1405,19 +1332,12 @@ "defer-to-connect": "^1.0.1" } }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", - "optional": true - }, "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", "optional": true, "requires": { - "@types/events": "*", "@types/minimatch": "*", "@types/node": "*" } @@ -1556,37 +1476,21 @@ } }, "asar": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/asar/-/asar-2.1.0.tgz", - "integrity": "sha512-d2Ovma+bfqNpvBzY/KU8oPY67ZworixTpkjSx0PCXnQi67c2cXmssaTxpFDUM0ttopXoGx/KRxNg/GDThYbXQA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/asar/-/asar-3.0.3.tgz", + "integrity": "sha512-k7zd+KoR+n8pl71PvgElcoKHrVNiSXtw7odKbyNpmgKe7EGRF9Pnu3uLOukD37EvavKwVFxOUpqXTIZC5B5Pmw==", "requires": { "@types/glob": "^7.1.1", "chromium-pickle-js": "^0.2.0", - "commander": "^2.20.0", - "cuint": "^0.2.2", - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "tmp-promise": "^1.0.5" + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" }, "dependencies": { "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" } } }, @@ -1619,9 +1523,9 @@ "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" }, "bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=" + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "boolean": { "version": "3.0.1", @@ -1690,27 +1594,10 @@ "responselike": "^1.0.2" }, "dependencies": { - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "requires": { - "pump": "^3.0.0" - } - }, "lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } } } }, @@ -1723,6 +1610,11 @@ "upper-case": "^1.1.1" } }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, "chalk": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", @@ -1834,9 +1726,9 @@ "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" }, "core-js": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", - "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==", + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", "optional": true }, "core-util-is": { @@ -1873,37 +1765,6 @@ } } }, - "cross-zip": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cross-zip/-/cross-zip-3.0.0.tgz", - "integrity": "sha512-cm+l8PJ6WiSQmKZ/x8DGvUm2u/3FX2JFs1AFd18gdHaVhP5Lf4oE6Jrj2Jd05JYSioz5x+nIRVp0zBQuzuCRcQ==", - "requires": { - "rimraf": "^3.0.0" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, "csswring": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/csswring/-/csswring-7.0.0.tgz", @@ -1914,17 +1775,12 @@ "postcss": "^7.0.0" } }, - "cuint": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", - "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=" - }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "decamelize": { @@ -1971,56 +1827,18 @@ "integrity": "sha512-5jIMi2RB3HtGPHcYd9Yyl0cczo84y+48lgKPxMijliNQaKAHEZJbdzLmKmdxG/mCdS/YD9DQ1gihL8mxzR0F9w==" }, "electron-notarize": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/electron-notarize/-/electron-notarize-0.2.1.tgz", - "integrity": "sha512-oZ6/NhKeXmEKNROiFmRNfytqu3cxqC95sjooG7kBXQVEUSQkZnbiAhxVh5jXngL881G197pbwpeVPJyM7Ikmxw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/electron-notarize/-/electron-notarize-1.0.0.tgz", + "integrity": "sha512-dsib1IAquMn0onCrNMJ6gtEIZn/azG8hZMCYOuZIMVMUeRMgBYHK1s5TK9P8xAcrAjh/2aN5WYHzgVSWX314og==", "requires": { "debug": "^4.1.1", - "fs-extra": "^8.1.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } + "fs-extra": "^9.0.1" } }, "electron-osx-sign": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.4.15.tgz", - "integrity": "sha512-1QtPNpjIji9bGZ0VRFwtJUyU1uHi7q3XUAOG0qFsvAUfs5H0T8hbgUfyg3xvPzmF1ruV8T8pQmQ86vNfLrcRiA==", + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.4.17.tgz", + "integrity": "sha512-wUJPmZJQCs1zgdlQgeIpRcvrf7M5/COQaOV68Va1J/SgmWx5KL2otgg+fAae7luw6qz9R8Gvu/Qpe9tAOu/3xQ==", "requires": { "bluebird": "^3.5.0", "compare-version": "^0.1.2", @@ -2030,25 +1848,34 @@ "plist": "^3.0.1" }, "dependencies": { - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, "electron-packager": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/electron-packager/-/electron-packager-14.2.1.tgz", - "integrity": "sha512-g6y3BVrAOz/iavKD+VMFbehrQcwCWuA3CZvVbmmbQuCfegGA1ytwWn0BNIDDrEdbuz31Fti7mnNHhb5L+3Wq9A==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/electron-packager/-/electron-packager-15.0.0.tgz", + "integrity": "sha512-J0yQP7/fKPkjxo9Yz5+vsQVig0dBbSXW8LQYA1pvNMvi+bL00hfI2SAyORP6EU7XaeiXGUIBSG2Px01EkKfGCw==", "requires": { "@electron/get": "^1.6.0", - "asar": "^2.0.1", - "cross-zip": "^3.0.0", + "asar": "^3.0.0", "debug": "^4.0.1", - "electron-notarize": "^0.2.0", + "electron-notarize": "^1.0.0", "electron-osx-sign": "^0.4.11", - "fs-extra": "^8.1.0", + "extract-zip": "^2.0.0", + "filenamify": "^4.1.0", + "fs-extra": "^9.0.0", "galactus": "^0.2.1", "get-package-info": "^1.0.0", "junk": "^3.1.0", @@ -2056,57 +1883,8 @@ "plist": "^3.0.0", "rcedit": "^2.0.0", "resolve": "^1.1.6", - "sanitize-filename": "^1.6.0", - "semver": "^6.0.0", - "yargs-parser": "^16.0.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "rcedit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-2.1.0.tgz", - "integrity": "sha512-Nrd/65LzMjFmKpS9d2fqIxVYdW0M8ovsN0PgZhCrPMQss2yznkp6/zjEQ1a9DzzoGv2uuN3yDJAeHybOD5ZNKA==" - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } + "semver": "^7.1.3", + "yargs-parser": "^18.0.0" } }, "encodeurl": { @@ -2209,6 +1987,21 @@ "pend": "~1.2.0" } }, + "filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=" + }, + "filenamify": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.1.0.tgz", + "integrity": "sha512-KQV/uJDI9VQgN7sHH1Zbk6+42cD6mnQ2HONzkXUfPJ+K2FC8GZ1dpewbbHw0Sz8Tf5k3EVdHVayM4DoAwWlmtg==", + "requires": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + } + }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -2226,14 +2019,6 @@ "fs-extra": "^7.0.0" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, "fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -2243,11 +2028,6 @@ "jsonfile": "^4.0.0", "universalify": "^0.1.0" } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, @@ -2325,19 +2105,6 @@ "jsonfile": "^4.0.0", "universalify": "^0.1.0" } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, @@ -2350,6 +2117,21 @@ "debug": "^2.2.0", "lodash.get": "^4.0.0", "read-pkg-up": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } } }, "get-stream": { @@ -2360,27 +2142,32 @@ "pump": "^3.0.0" } }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "global-agent": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-2.1.8.tgz", - "integrity": "sha512-VpBe/rhY6Rw2VDOTszAMNambg+4Qv8j0yiTNDYEXXXxkUNGWLHp8A3ztK4YDBbFNcWF4rgsec6/5gPyryya/+A==", + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-2.1.12.tgz", + "integrity": "sha512-caAljRMS/qcDo69X9BfkgrihGUgGx44Fb4QQToNQjsiWh+YlQ66uqYVAdA8Olqit+5Ng0nkz09je3ZzANMZcjg==", "optional": true, "requires": { - "boolean": "^3.0.0", - "core-js": "^3.6.4", + "boolean": "^3.0.1", + "core-js": "^3.6.5", "es6-error": "^4.1.1", - "matcher": "^2.1.0", - "roarr": "^2.15.2", - "semver": "^7.1.2", - "serialize-error": "^5.0.0" - }, - "dependencies": { - "semver": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", - "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", - "optional": true - } + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" } }, "global-tunnel-ng": { @@ -2450,10 +2237,38 @@ "integrity": "sha512-iKdz2bWrrM4zLv3USCRtWX4kLWzZhbj/afh/W6giLxg5XQzbNg+UpVF+2G6f/LEYK9UNBgS2TdyNTuw8mod+Mg==", "optional": true }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "dependencies": { + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + } + } + }, "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" }, "has-flag": { "version": "3.0.0", @@ -2490,9 +2305,9 @@ } }, "http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-Z2EICWNJou7Tr9Bd2M2UqDJq3A9F2ePG9w3lIpjoyuSyXFP9QbniJVu3XQYytuw5ebmG7dXSXO9PgAjJG8DDKA==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" }, "ieee754": { "version": "1.1.13", @@ -2690,18 +2505,18 @@ } }, "matcher": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-2.1.0.tgz", - "integrity": "sha512-o+nZr+vtJtgPNklyeUKkkH42OsK8WAfdgaJE2FNxcjLPg+5QbeEoT6vRj8Xq/iv18JlQ9cmKsEu0b94ixWf1YQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", "optional": true, "requires": { - "escape-string-regexp": "^2.0.0" + "escape-string-regexp": "^4.0.0" }, "dependencies": { "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "optional": true } } @@ -2757,14 +2572,6 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, "monaco-editor": { "version": "0.20.0", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.20.0.tgz", @@ -2779,9 +2586,9 @@ } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "no-case": { "version": "2.3.2", @@ -2802,13 +2609,10 @@ "validate-npm-package-license": "^3.0.1" }, "dependencies": { - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "requires": { - "path-parse": "^1.0.6" - } + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -3072,11 +2876,21 @@ } } }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + }, "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, "proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -3107,6 +2921,11 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" }, + "rcedit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-2.2.0.tgz", + "integrity": "sha512-dhFtYmQS+V8qQIANyX6zDK+sO50ayDePKApi46ZPK8I6QeyyTDD6LManMa7a3p3c9mLM4zi9QBP41pfhQ9p7Sg==" + }, "read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", @@ -3156,9 +2975,12 @@ "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" }, "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "requires": { + "path-parse": "^1.0.6" + } }, "resource-loader": { "version": "3.0.1", @@ -3178,9 +3000,9 @@ } }, "roarr": { - "version": "2.15.2", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.2.tgz", - "integrity": "sha512-jmaDhK9CO4YbQAV8zzCnq9vjAqeO489MS5ehZ+rXmFiPFFE6B+S9KYO6prjmLJ5A0zY3QxVlQdrIya7E/azz/Q==", + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.3.tgz", + "integrity": "sha512-AEjYvmAhlyxOeB9OqPUzQCo3kuAkNfuDk/HqWbZdFsqDFpapkTjiw+p4svNEoRLvuqNTxqfL+s+gtD4eDgZ+CA==", "optional": true, "requires": { "boolean": "^3.0.0", @@ -3213,9 +3035,9 @@ } }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" }, "semver-compare": { "version": "1.0.0", @@ -3224,12 +3046,12 @@ "optional": true }, "serialize-error": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-5.0.0.tgz", - "integrity": "sha512-/VtpuyzYf82mHYTtI4QKtwHa79vAdU5OQpNPAmE/0UDdlGT0ZxHwC+J6gXkw29wwoVI8fMPsfcVHOwXtUQYYQA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", "optional": true, "requires": { - "type-fest": "^0.8.0" + "type-fest": "^0.13.1" } }, "serve-handler": { @@ -3253,23 +3075,23 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" }, "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -3303,27 +3125,20 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" }, + "strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, "sumchecker": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", "requires": { "debug": "^4.1.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } } }, "supports-color": { @@ -3339,58 +3154,19 @@ "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==" }, - "tmp": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", - "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", - "requires": { - "rimraf": "^2.6.3" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "tmp-promise": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-1.1.0.tgz", - "integrity": "sha512-8+Ah9aB1IRXCnIOxXZ0uFozV1nMU5xiu7hhFVUSxZ3bYu+psD4TzagCzVbexUCgNNGJnsmNDQlS4nG3mTyoNkw==", - "requires": { - "bluebird": "^3.5.0", - "tmp": "0.1.0" - }, - "dependencies": { - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - } - } - }, "to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" }, + "trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, "truncate-utf8-bytes": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", @@ -3416,9 +3192,9 @@ "optional": true }, "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", "optional": true }, "uc.micro": { @@ -3468,6 +3244,14 @@ } } }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "requires": { + "prepend-http": "^2.0.0" + } + }, "utf8-byte-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", @@ -3526,24 +3310,17 @@ "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" }, "xmldom": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", - "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=" + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", + "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==" }, "yargs-parser": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz", - "integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - } } }, "yauzl": { diff --git a/app/package.json b/app/package.json index dcff66c1a..ffe15215d 100644 --- a/app/package.json +++ b/app/package.json @@ -55,7 +55,7 @@ "dependencies": { "archiver": "^3.1.1", "csswring": "7.0.0", - "electron-packager": "^14.2.1", + "electron-packager": "^15.0.0", "extract-zip": "^2.0.1", "fs-extra": "^9.0.1", "fuse.js": "^3.6.1", From 5709b960391ac1ac8c930246c2783052c093e04b Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Sat, 15 Aug 2020 17:56:10 +1200 Subject: [PATCH 15/74] :sparkles: Fast integer scaling for ct.fittoscreen --- app/data/ct.libs/fittoscreen/index.js | 9 ++++++--- app/data/ct.libs/fittoscreen/module.json | 4 ++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/app/data/ct.libs/fittoscreen/index.js b/app/data/ct.libs/fittoscreen/index.js index 4728b3649..ff50bb688 100644 --- a/app/data/ct.libs/fittoscreen/index.js +++ b/app/data/ct.libs/fittoscreen/index.js @@ -6,7 +6,10 @@ const pixelScaleModifier = ct.highDensity ? (window.devicePixelRatio || 1) : 1; const kw = window.innerWidth / ct.roomWidth, kh = window.innerHeight / ct.roomHeight; - const k = Math.min(kw, kh); + let k = Math.min(kw, kh); + if (mode === 'fastScaleInteger') { + k = k < 1 ? k : Math.floor(k); + } var canvasWidth, canvasHeight, cameraWidth, cameraHeight; if (mode === 'expandViewport' || mode === 'expand') { @@ -14,7 +17,7 @@ canvasHeight = Math.ceil(window.innerHeight * pixelScaleModifier); cameraWidth = window.innerWidth; cameraHeight = window.innerHeight; - } else if (mode === 'fastScale') { + } else if (mode === 'fastScale' || mode === 'fastScaleInteger') { canvasWidth = Math.ceil(ct.roomWidth * pixelScaleModifier); canvasHeight = Math.ceil(ct.roomHeight * pixelScaleModifier); cameraWidth = ct.roomWidth; @@ -44,7 +47,7 @@ ct.camera.width = cameraWidth; ct.camera.height = cameraHeight; - if (mode === 'fastScale') { + if (mode === 'fastScale' || mode === 'fastScaleInteger') { canv.style.transform = `translate(-50%, -50%) scale(${k})`; canv.style.position = 'absolute'; canv.style.top = '50%'; diff --git a/app/data/ct.libs/fittoscreen/module.json b/app/data/ct.libs/fittoscreen/module.json index 2475e427e..e22a4d6a5 100644 --- a/app/data/ct.libs/fittoscreen/module.json +++ b/app/data/ct.libs/fittoscreen/module.json @@ -18,6 +18,10 @@ "value": "fastScale", "name": "Fast scaling with letterboxing", "help": "This will not change variables `ct.width` and `ct.height` and will try to fit the drawing canvas to the screen. This may result in a blurry image, but you can disable image smoothing in your project's settigs." + }, { + "value": "fastScaleInteger", + "name": "Fast integer scaling with letterboxing", + "help": "Similar to fast scaling, but it will try to scale by whole numbers: x1, x2, x3 and so on. It will often leave gaps around the game, but will show the best of your pixelart skills." }, { "value": "expand", "name": "Expand", From 8165fd4231750926d554c822c6972c1d87f7673a Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Sun, 16 Aug 2020 13:34:02 +1200 Subject: [PATCH 16/74] :construction: Depth sorting for 3d module --- app/data/ct.libs/3d/injects/beforeroomdraw.js | 8 ++++++++ app/data/ct.libs/3d/projection.ict | 6 +++--- 2 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 app/data/ct.libs/3d/injects/beforeroomdraw.js diff --git a/app/data/ct.libs/3d/injects/beforeroomdraw.js b/app/data/ct.libs/3d/injects/beforeroomdraw.js new file mode 100644 index 000000000..7fcdfef6b --- /dev/null +++ b/app/data/ct.libs/3d/injects/beforeroomdraw.js @@ -0,0 +1,8 @@ +if (this === ct.room) { + for (const child of ct.camera3d.room.children) { + child.distanceToCamera = child.getDepth(); + } + ct.camera3d.room.children.sort(function sortByDepth(a, b) { + return b.distanceToCamera - a.distanceToCamera; + }); +} diff --git a/app/data/ct.libs/3d/projection.ict b/app/data/ct.libs/3d/projection.ict index 6e4415da9..347bcfc2a 100644 --- a/app/data/ct.libs/3d/projection.ict +++ b/app/data/ct.libs/3d/projection.ict @@ -157,7 +157,7 @@ types: uid: 0ae31f06-ea0f-446a-9caa-22dba4d7cad9 lastmod: 1597380836327 - name: Comigo - depth: 20 + depth: -40 oncreate: '' onstep: this.move(); ondraw: '' @@ -169,7 +169,7 @@ types: uid: 312c8e4f-52cb-4f54-a3a6-9711048504d2 lastmod: 1597381479959 - name: Lamp - depth: 20 + depth: -40 oncreate: '' onstep: this.move(); ondraw: '' @@ -179,7 +179,7 @@ types: threeDOrientation: xNegative threeDEnabled: true uid: 93de9f6e-dc74-4277-a778-b9b9ded16c37 - lastmod: 1597379858109 + lastmod: 1597541560523 - name: SandCellSquare depth: 0 oncreate: '' From 79730473f62695342db609a7ca4627f702f9d33d Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Sun, 16 Aug 2020 14:21:31 +1200 Subject: [PATCH 17/74] :sparkles: Background color for rooms --- src/node_requires/exporter/rooms.js | 1 + src/riotTags/rooms/room-editor.tag | 11 +++++++++++ src/riotTags/shared/color-input.tag | 5 ++++- src/styl/tags/shared/color-input.styl | 5 ++++- 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/node_requires/exporter/rooms.js b/src/node_requires/exporter/rooms.js index c0a10da2f..504f9bb89 100644 --- a/src/node_requires/exporter/rooms.js +++ b/src/node_requires/exporter/rooms.js @@ -66,6 +66,7 @@ ct.rooms.templates['${r.name}'] = { objects: JSON.parse('${JSON.stringify(objs)}'), bgs: JSON.parse('${JSON.stringify(bgsCopy)}'), tiles: JSON.parse('${JSON.stringify(tileLayers)}'), + backgroundColor: '${r.backgroundColor || '#000000'}', onStep() { ${proj.rooms[k].onstep} }, diff --git a/src/riotTags/rooms/room-editor.tag b/src/riotTags/rooms/room-editor.tag index ec9246f27..7d774d16c 100644 --- a/src/riotTags/rooms/room-editor.tag +++ b/src/riotTags/rooms/room-editor.tag @@ -42,6 +42,9 @@ room-editor.panel.view br input.wide(type="number" value="{room.height}" onchange="{wire('this.room.height')}") .clear + b {voc.backgroundColor} + br + color-input.wide(onchange="{updateRoomBackground}" color="{room.backgroundColor || '#000000'}") extensions-editor(entity="{this.room.extends}" type="room" wide="aye" compact="sure") .done.nogrow @@ -150,6 +153,11 @@ room-editor.panel.view this.dragging = false; this.tab = 'roomcopies'; + this.updateRoomBackground = (e, color) => { + this.room.backgroundColor = color; + this.refreshRoomCanvas(); + }; + var updateCanvasSize = () => { // Firstly, check that we don't need to reflow the layout due to window shrinking const oldSidebarWidth = this.sidebarWidth; @@ -491,6 +499,9 @@ room-editor.panel.view canvas.x.globalAlpha = 1; // Clear the canvas canvas.x.clearRect(0, 0, canvas.width, canvas.height); + // Fill it with a background color + canvas.x.fillStyle = this.room.backgroundColor || '#000000'; + canvas.x.fillRect(0, 0, canvas.width, canvas.height) // Apply camera movement + zoom canvas.x.translate(Math.floor(canvas.width / 2), Math.floor(canvas.height / 2)); diff --git a/src/riotTags/shared/color-input.tag b/src/riotTags/shared/color-input.tag index c8ff1c1f4..258ea96ff 100644 --- a/src/riotTags/shared/color-input.tag +++ b/src/riotTags/shared/color-input.tag @@ -8,6 +8,9 @@ Calls the funtion when a user changes the color while working with the color picker. Passes an object `{target: RiotTag}` as one argument and a value (an rgba/HEX string). + @attribute color (string) + The preset color. + @attribute hidealpha (atomic) Passed as is to color-picker. Disables alpha input. @@ -62,4 +65,4 @@ color-input if (this.lastValue !== this.opts.color) { this.value = this.lastValue = this.opts.color || '#FFFFFF'; } - }); \ No newline at end of file + }); diff --git a/src/styl/tags/shared/color-input.styl b/src/styl/tags/shared/color-input.styl index 059dd2944..f0cebb7f0 100644 --- a/src/styl/tags/shared/color-input.styl +++ b/src/styl/tags/shared/color-input.styl @@ -10,4 +10,7 @@ padding 0 0.5rem font-family mono font-size 0.75rem - overflow hidden \ No newline at end of file + overflow hidden + .wide > & + width 100% + max-width unset From 9fa580546dde96e1750b3d9f956389bc9e2b095c Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Sun, 16 Aug 2020 14:21:49 +1200 Subject: [PATCH 18/74] :doughnut: --- app/data/ct.release/rooms.js | 1 + app/data/i18n/English.json | 1 + 2 files changed, 2 insertions(+) diff --git a/app/data/ct.release/rooms.js b/app/data/ct.release/rooms.js index d6e73ce0f..78b182dcd 100644 --- a/app/data/ct.release/rooms.js +++ b/app/data/ct.release/rooms.js @@ -26,6 +26,7 @@ class Room extends PIXI.Container { this.onLeave = template.onLeave; this.template = template; this.name = template.name; + ct.pixiApp.renderer.backgroundColor = Number('0x' + this.template.backgroundColor.slice(1)); /*%beforeroomoncreate%*/ for (let i = 0, li = template.bgs.length; i < li; i++) { const bg = new ct.types.Background( diff --git a/app/data/i18n/English.json b/app/data/i18n/English.json index eef9063f7..bf81b0e2d 100644 --- a/app/data/i18n/English.json +++ b/app/data/i18n/English.json @@ -517,6 +517,7 @@ "events": "Room events", "copies": "Copies", "backgrounds": "Backgrounds", + "backgroundColor": "Background color:", "tiles": "Tiles", "properties": "Properties", "add": "Add", From baab5ef60a6bf0fd9a42cce5bece3ff772a7dafe Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Sun, 16 Aug 2020 14:23:01 +1200 Subject: [PATCH 19/74] :bug: Fix linter warnings --- src/riotTags/rooms/room-editor.tag | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/riotTags/rooms/room-editor.tag b/src/riotTags/rooms/room-editor.tag index 7d774d16c..c8c516eaa 100644 --- a/src/riotTags/rooms/room-editor.tag +++ b/src/riotTags/rooms/room-editor.tag @@ -501,7 +501,7 @@ room-editor.panel.view canvas.x.clearRect(0, 0, canvas.width, canvas.height); // Fill it with a background color canvas.x.fillStyle = this.room.backgroundColor || '#000000'; - canvas.x.fillRect(0, 0, canvas.width, canvas.height) + canvas.x.fillRect(0, 0, canvas.width, canvas.height); // Apply camera movement + zoom canvas.x.translate(Math.floor(canvas.width / 2), Math.floor(canvas.height / 2)); From 4ffc1a29203fd025380182bf3228d45bd446ca5b Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Sun, 16 Aug 2020 14:29:58 +1200 Subject: [PATCH 20/74] :bug: Set background for the root room only --- app/data/ct.release/rooms.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/data/ct.release/rooms.js b/app/data/ct.release/rooms.js index 78b182dcd..dfc81becf 100644 --- a/app/data/ct.release/rooms.js +++ b/app/data/ct.release/rooms.js @@ -26,7 +26,9 @@ class Room extends PIXI.Container { this.onLeave = template.onLeave; this.template = template; this.name = template.name; - ct.pixiApp.renderer.backgroundColor = Number('0x' + this.template.backgroundColor.slice(1)); + if (this === ct.room) { + ct.pixiApp.renderer.backgroundColor = Number('0x' + this.template.backgroundColor.slice(1)); + } /*%beforeroomoncreate%*/ for (let i = 0, li = template.bgs.length; i < li; i++) { const bg = new ct.types.Background( From 7363e1c4ae3482a71435522a7f063a2795bdf9a2 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Sun, 16 Aug 2020 14:42:24 +1200 Subject: [PATCH 21/74] :sparkles: `select` input type for catmods --- app/data/ct.libs/3d/module.json | 2 +- src/riotTags/shared/extensions-editor.tag | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/app/data/ct.libs/3d/module.json b/app/data/ct.libs/3d/module.json index f80471f7b..4a3fc2082 100644 --- a/app/data/ct.libs/3d/module.json +++ b/app/data/ct.libs/3d/module.json @@ -18,7 +18,7 @@ "key": "threeDEnabled" }, { "name": "3D orientation", - "type": "radio", + "type": "select", "default": "zPositive", "key": "threeDOrientation", "options": [{ diff --git a/src/riotTags/shared/extensions-editor.tag b/src/riotTags/shared/extensions-editor.tag index 98c1f1b47..53a746887 100644 --- a/src/riotTags/shared/extensions-editor.tag +++ b/src/riotTags/shared/extensions-editor.tag @@ -128,6 +128,17 @@ extensions-editor | {option.name} div.desc(if="{option.help}") {option.help} .dim(if="{ext.help && !parent.opts.compact}") {ext.help} + select( + if="{ext.type === 'select'}" + onchange="{wire('this.opts.entity.'+ ext.key)}" + class="{wide: parent.opts.wide}" + ) + option( + each="{option in ext.options}" + value="{option.value}" + selected="{parent.parent.opts.entity[ext.key] === option.value}" + ) {option.name} + .dim(if="{ext.help && !parent.opts.compact}") {ext.help} script. const libsDir = './data/ct.libs'; const fs = require('fs-extra'), From baecf97a1e6b09f6c02910bd6cfaf2da3c0bde1d Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Sun, 16 Aug 2020 14:44:06 +1200 Subject: [PATCH 22/74] :pencil: Update readme.md: ct.js is an NW.js app --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a4cce1568..c4e66bd5b 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ If you are willing to participate in ct.js' future, contact me at Discord (CoMiG # Repo structure & tools -* `app` — an [Electron app](https://electronjs.org/), with its configs and static files. +* `app` — an [NW.js app](nwjs.io/), with its configs and static files. * `data` * `ct.release` — the ct.js game library, aka its "core" * `ct.libs` — catmods (modules) that ship with ct.js. Feel free to create a pull request with your module! From 40f33850fe12d41e6247acd2269114efd6304894 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Sun, 16 Aug 2020 14:48:59 +1200 Subject: [PATCH 23/74] :pencil: Add info about nightly and production builds to readme.md --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index c4e66bd5b..d9b8b0803 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,14 @@ If you are willing to participate in ct.js' future, contact me at Discord (CoMiG * [Like ct.js on AlternativeTo](https://alternativeto.net/software/ct-js/) * [Rate ct.js on Slant in different questions](https://www.slant.co/options/30242/~ct-js-review) +# Production builds + +See the [releases page](https://github.com/ct-js/ct-js/releases) or [jump to itch.io page](https://comigo.itch.io/ct). Available for Windows, Mac and Linux. + +# Nightly builds + +We have [daily builds at itch.io](https://comigo.itch.io/ct-nightly). This page will have nightly versions that are built from the `develop` branch from our repository. It means that you will get the latest features, improvement, bug fixes, and new bugs daily, out of the oven. [Itch.io app](https://itch.io/app) is strongly recommended. + # Repo structure & tools * `app` — an [NW.js app](nwjs.io/), with its configs and static files. From 0344a4a9ccb0a2f1936b726b02b97c243470fd03 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Tue, 18 Aug 2020 17:21:12 +1200 Subject: [PATCH 24/74] :bug: Fix regression from v1.4 with blurry particle editor and room view when pixelart rendering was enabled --- src/riotTags/particles/emitter-tandem-editor.tag | 4 ++-- src/riotTags/rooms/room-editor.tag | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/riotTags/particles/emitter-tandem-editor.tag b/src/riotTags/particles/emitter-tandem-editor.tag index a816ee970..25d364e39 100644 --- a/src/riotTags/particles/emitter-tandem-editor.tag +++ b/src/riotTags/particles/emitter-tandem-editor.tag @@ -275,9 +275,9 @@ emitter-tandem-editor.panel.view.flexrow width: Math.round(box.width), height: Math.round(box.height), view: this.refs.canvas, - antialias: !global.currentProject.settings.pixelatedrender + antialias: !global.currentProject.settings.rendering.pixelatedrender }); - if (global.currentProject.settings.pixelatedrender) { + if (global.currentProject.settings.rendering.pixelatedrender) { PIXI.settings.ROUND_PIXELS = true; PIXI.settings.SCALE_MODE = PIXI.SCALE_MODES.NEAREST; } diff --git a/src/riotTags/rooms/room-editor.tag b/src/riotTags/rooms/room-editor.tag index c8c516eaa..9b01d426f 100644 --- a/src/riotTags/rooms/room-editor.tag +++ b/src/riotTags/rooms/room-editor.tag @@ -509,7 +509,7 @@ room-editor.panel.view canvas.x.translate(-this.roomx, -this.roomy); // Disable pixel interpolation, if needed - canvas.x.imageSmoothingEnabled = !global.currentProject.settings.pixelatedrender; + canvas.x.imageSmoothingEnabled = !global.currentProject.settings.rendering.pixelatedrender; for (let i = 0, li = this.stack.length; i < li; i++) { if (this.stack[i].tiles) { // a tile layer From c2fbbfcd14282bc58079a89042aa53d83c35e0a1 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Tue, 18 Aug 2020 17:26:43 +1200 Subject: [PATCH 25/74] :zap: 800% scaling mode at room editors and texture viewers for really small sprites --- src/riotTags/rooms/room-editor.tag | 7 ++++++- src/riotTags/texture-editor.tag | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/riotTags/rooms/room-editor.tag b/src/riotTags/rooms/room-editor.tag index 9b01d426f..b981050ae 100644 --- a/src/riotTags/rooms/room-editor.tag +++ b/src/riotTags/rooms/room-editor.tag @@ -78,6 +78,7 @@ room-editor.panel.view button#roomzoom100.inline(onclick="{roomToggleZoom(1)}" class="{active: zoomFactor === 1}") 100% button#roomzoom200.inline(onclick="{roomToggleZoom(2)}" class="{active: zoomFactor === 2}") 200% button#roomzoom400.inline(if="{window.innerWidth - sidebarWidth > 470}" onclick="{roomToggleZoom(4)}" class="{active: zoomFactor === 4}") 400% + button#roomzoom800.inline(if="{window.innerWidth - sidebarWidth > 470}" onclick="{roomToggleZoom(8)}" class="{active: zoomFactor === 8}") 800% .grid button#roomgrid(onclick="{roomToggleGrid}" class="{active: room.gridX > 0}") span {voc[room.gridX > 0? 'gridoff' : 'grid']} @@ -359,7 +360,9 @@ room-editor.panel.view this.onCanvasWheel = e => { if (e.wheelDelta > 0) { // in - if (this.zoomFactor === 2) { + if (this.zoomFactor === 4) { + this.zoomFactor = 8; + } else if (this.zoomFactor === 2) { this.zoomFactor = 4; } else if (this.zoomFactor === 1) { this.zoomFactor = 2; @@ -370,6 +373,8 @@ room-editor.panel.view } else if (this.zoomFactor === 0.125) { this.zoomFactor = 0.25; } + } else if (this.zoomFactor === 8) { + this.zoomFactor = 4; } else if (this.zoomFactor === 4) { this.zoomFactor = 2; } else if (this.zoomFactor === 2) { diff --git a/src/riotTags/texture-editor.tag b/src/riotTags/texture-editor.tag index a4b59de6c..aea0baa0e 100644 --- a/src/riotTags/texture-editor.tag +++ b/src/riotTags/texture-editor.tag @@ -125,6 +125,7 @@ texture-editor.panel.view button#texturezoom100.inline(onclick="{textureToggleZoom(1)}" class="{active: zoomFactor === 1}") 100% button#texturezoom200.inline(onclick="{textureToggleZoom(2)}" class="{active: zoomFactor === 2}") 200% button#texturezoom400.inline(onclick="{textureToggleZoom(4)}" class="{active: zoomFactor === 4}") 400% + button#texturezoom400.inline(onclick="{textureToggleZoom(8)}" class="{active: zoomFactor === 8}") 800% .column.column2.borderleft.tall.flexfix.nogrow.noshrink(show="{!opts.texture.tiled}") .flexfix-body fieldset @@ -340,7 +341,9 @@ texture-editor.panel.view this.onMouseWheel = e => { if (e.wheelDelta > 0) { // in - if (this.zoomFactor === 2) { + if (this.zoomFactor === 4) { + this.zoomFactor = 8; + } else if (this.zoomFactor === 2) { this.zoomFactor = 4; } else if (this.zoomFactor === 1) { this.zoomFactor = 2; @@ -349,6 +352,8 @@ texture-editor.panel.view } else if (this.zoomFactor === 0.25) { this.zoomFactor = 0.5; } + } else if (this.zoomFactor === 8) { // out + this.zoomFactor = 4; } else if (this.zoomFactor === 4) { // out this.zoomFactor = 2; } else if (this.zoomFactor === 2) { From 8af993166d3625bba326bebdf3b33e5f189a279d Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Tue, 18 Aug 2020 17:36:36 +1200 Subject: [PATCH 26/74] :zap: Scale smaller tilesets to fit the tile picker, at the room editor --- src/riotTags/rooms/room-tile-editor.tag | 21 +++++++++++++++++---- src/styl/tags/rooms/room-editor.styl | 1 + 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/riotTags/rooms/room-tile-editor.tag b/src/riotTags/rooms/room-tile-editor.tag index c146107cb..125607144 100644 --- a/src/riotTags/rooms/room-tile-editor.tag +++ b/src/riotTags/rooms/room-tile-editor.tag @@ -140,6 +140,11 @@ room-tile-editor.room-editor-Tiles.tabbed.tall.flexfix i = glob.texturemap[g.uid]; c.width = i.width; c.height = i.height; + if (global.currentProject.settings.rendering.pixelatedrender) { + c.style.imageRendering = 'pixelated'; + } else { + c.style.imageRendering = 'unset'; + } cx.globalAlpha = 1; cx.drawImage(i, 0, 0); cx.strokeStyle = '#0ff'; @@ -173,13 +178,17 @@ room-tile-editor.room-editor-Tiles.tabbed.tall.flexfix if (!this.parent.currentTileset) { return; } + // Adjust the pointer coordinates to account for potential scaling + const bbox = e.target.getBoundingClientRect(); + const px = e.layerX / bbox.width * e.target.width, + py = e.layerY / bbox.height * e.target.height; var g = this.parent.currentTileset; this.parent.tileSpanX = 1; this.parent.tileSpanY = 1; this.selectingTile = true; - this.tileStartX = Math.round((e.layerX - g.offx - g.width * 0.5) / (g.width + g.marginx)); + this.tileStartX = Math.round((px - g.offx - g.width * 0.5) / (g.width + g.marginx)); this.tileStartX = Math.max(0, Math.min(g.grid[0], this.tileStartX)); - this.tileStartY = Math.round((e.layerY - g.offy - g.height * 0.5) / (g.height + g.marginy)); + this.tileStartY = Math.round((py - g.offy - g.height * 0.5) / (g.height + g.marginy)); this.tileStartY = Math.max(0, Math.min(g.grid[1], this.tileStartY)); this.parent.tileX = this.tileStartX; this.parent.tileY = this.tileStartY; @@ -189,10 +198,14 @@ room-tile-editor.room-editor-Tiles.tabbed.tall.flexfix if (!this.selectingTile) { return; } + // Adjust the pointer coordinates to account for potential scaling + const bbox = e.target.getBoundingClientRect(); + const px = e.layerX / bbox.width * e.target.width, + py = e.layerY / bbox.height * e.target.height; var g = this.parent.currentTileset; - this.tileEndX = Math.round((e.layerX - g.offx - g.width * 0.5) / (g.width + g.marginx)); + this.tileEndX = Math.round((px - g.offx - g.width * 0.5) / (g.width + g.marginx)); this.tileEndX = Math.max(0, Math.min(g.grid[0], this.tileEndX)); - this.tileEndY = Math.round((e.layerY - g.offy - g.height * 0.5) / (g.height + g.marginy)); + this.tileEndY = Math.round((py - g.offy - g.height * 0.5) / (g.height + g.marginy)); this.tileEndY = Math.max(0, Math.min(g.grid[1], this.tileEndY)); this.parent.tileSpanX = 1 + Math.abs(this.tileStartX - this.tileEndX); this.parent.tileSpanY = 1 + Math.abs(this.tileStartY - this.tileEndY); diff --git a/src/styl/tags/rooms/room-editor.styl b/src/styl/tags/rooms/room-editor.styl index 3b098035a..fd9739d2b 100644 --- a/src/styl/tags/rooms/room-editor.styl +++ b/src/styl/tags/rooms/room-editor.styl @@ -158,6 +158,7 @@ room-editor .room-editor-Tiles canvas cursor pointer + min-width 100% .act color text cursor pointer From 83e78bb7639c284a634ae92d3bbc3589b16d5b1d Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Wed, 19 Aug 2020 09:59:47 +1200 Subject: [PATCH 27/74] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20Minor=20UI=20improve?= =?UTF-8?q?ments=20for=20the=20texture=20viewer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/data/i18n/English.json | 3 +- src/riotTags/texture-editor.tag | 35 +++++++++++----------- src/styl/hvost.styl | 1 + src/styl/tags/textures/texture-editor.styl | 4 +++ 4 files changed, 25 insertions(+), 18 deletions(-) diff --git a/app/data/i18n/English.json b/app/data/i18n/English.json index bf81b0e2d..e3b12c0f0 100644 --- a/app/data/i18n/English.json +++ b/app/data/i18n/English.json @@ -320,7 +320,8 @@ "movePoint": "Move this point", "symmetryTool": "Symmetry tool", "padding": "Padding:", - "paddingNotice": "This affects how a texture is exported: it adds duplicate pixels on edges and prevents bleeding artifacts on tiled and scaled textures. The default value is usually enough, but, if you shrink textures strongly, the bleeding may re-appear. Increment this value if this texture has artifacts while in-game." + "paddingNotice": "This affects how a texture is exported: it adds duplicate pixels on edges and prevents bleeding artifacts on tiled and scaled textures. The default value is usually enough, but, if you shrink textures strongly, the bleeding may re-appear. Increment this value if this texture has artifacts while in-game.", + "previewAnimationNotice": "This is a preview. Use this.animationSpeed property to change it for real copies." }, "sounds": { "create": "Create" diff --git a/src/riotTags/texture-editor.tag b/src/riotTags/texture-editor.tag index aea0baa0e..a2473026d 100644 --- a/src/riotTags/texture-editor.tag +++ b/src/riotTags/texture-editor.tag @@ -120,12 +120,17 @@ texture-editor.panel.view use(xlink:href="data/icons.svg#refresh-ccw") .textureview-zoom div.button-stack.inlineblock - button#texturezoom25.inline(onclick="{textureToggleZoom(0.25)}" class="{active: zoomFactor === 0.25}") 25% - button#texturezoom50.inline(onclick="{textureToggleZoom(0.5)}" class="{active: zoomFactor === 0.5}") 50% - button#texturezoom100.inline(onclick="{textureToggleZoom(1)}" class="{active: zoomFactor === 1}") 100% - button#texturezoom200.inline(onclick="{textureToggleZoom(2)}" class="{active: zoomFactor === 2}") 200% - button#texturezoom400.inline(onclick="{textureToggleZoom(4)}" class="{active: zoomFactor === 4}") 400% - button#texturezoom400.inline(onclick="{textureToggleZoom(8)}" class="{active: zoomFactor === 8}") 800% + button.inline(onclick="{textureToggleZoom(0.25)}" class="{active: zoomFactor === 0.25}") 25% + button.inline(onclick="{textureToggleZoom(0.5)}" class="{active: zoomFactor === 0.5}") 50% + button.inline(onclick="{textureToggleZoom(1)}" class="{active: zoomFactor === 1}") 100% + button.inline(onclick="{textureToggleZoom(2)}" class="{active: zoomFactor === 2}") 200% + button.inline(onclick="{textureToggleZoom(4)}" class="{active: zoomFactor === 4}") 400% + button.inline(onclick="{textureToggleZoom(8)}" class="{active: zoomFactor === 8}") 800% + .textureview-bg + button.inline(onclick="{changePreviewBg}") + svg.feather + use(xlink:href="data/icons.svg#droplet") + span {voc.bgcolor} .column.column2.borderleft.tall.flexfix.nogrow.noshrink(show="{!opts.texture.tiled}") .flexfix-body fieldset @@ -149,6 +154,7 @@ texture-editor.panel.view b {voc.height} br input.wide(type="number" value="{opts.texture.height}" onchange="{wire('this.texture.height')}" oninput="{wire('this.texture.height')}") + fieldset .flexrow div b {voc.marginx} @@ -183,27 +189,22 @@ texture-editor.panel.view #preview(ref="preview" style="background-color: {previewColor};") canvas(ref="grprCanvas") .flexrow - button#textureplay.square.inline(onclick="{previewPlayPause}") + button.nogrow.square.inline(onclick="{previewPlayPause}") svg.feather use(xlink:href="data/icons.svg#{prevPlaying? 'pause' : 'play'}") span(ref="textureviewframe") 0 / 1 - .filler - button#textureviewback.square.inline(onclick="{previewBack}") + button.nogrow.square.inline(onclick="{previewBack}") svg.feather use(xlink:href="data/icons.svg#skip-back") - button#textureviewnext.square.inline.nmr(onclick="{previewNext}") + button.nogrow.square.inline.nmr(onclick="{previewNext}") svg.feather use(xlink:href="data/icons.svg#skip-forward") .flexrow - b {voc.speed} + b.alignmiddle {voc.speed} .filler input#grahpspeed.short(type="number" min="1" value="{prevSpeed}" onchange="{wire('this.prevSpeed')}" oninput="{wire('this.prevSpeed')}") - .relative - button#texturecolor.inline.wide(onclick="{changePreviewBg}") - svg.feather - use(xlink:href="data/icons.svg#droplet") - span {voc.bgcolor} - input.color.rgb#previewbgcolor + p + .aNotice {voc.previewAnimationNotice} color-picker( ref="previewBackgroundColor" if="{changingPreviewBg}" diff --git a/src/styl/hvost.styl b/src/styl/hvost.styl index 9d2c10529..f6097ed57 100644 --- a/src/styl/hvost.styl +++ b/src/styl/hvost.styl @@ -228,6 +228,7 @@ for i in 1 2 3 4 5 6 7 8 /* misc */ .alignmiddle vertical-align middle !important + align-self center /* utilities */ .scrollbar-measure diff --git a/src/styl/tags/textures/texture-editor.styl b/src/styl/tags/textures/texture-editor.styl index 29a63e5d3..444988342 100644 --- a/src/styl/tags/textures/texture-editor.styl +++ b/src/styl/tags/textures/texture-editor.styl @@ -61,6 +61,10 @@ texture-editor bottom 0.5em right 0.5em text-align right +.textureview-bg + position absolute + left 0.5em + bottom 0.5em #textureviewframes position absolute left 16em From 3552923f2b5c3f93f7be28a499f9de0d5b6b5e8b Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Wed, 19 Aug 2020 10:45:45 +1200 Subject: [PATCH 28/74] :zap: Improve preview making process for textures --- src/node_requires/resources/textures.js | 107 +++++++++++------------- src/riotTags/texture-editor.tag | 54 ++---------- 2 files changed, 55 insertions(+), 106 deletions(-) diff --git a/src/node_requires/resources/textures.js b/src/node_requires/resources/textures.js index 4e15df039..8ce205d53 100644 --- a/src/node_requires/resources/textures.js +++ b/src/node_requires/resources/textures.js @@ -170,59 +170,48 @@ const getTextureFromName = function (name) { } return texture; }; +const textureGenPreview = async function textureGenPreview(texture, destination, size) { + if (typeof texture === 'string') { + texture = getTextureFromId(texture); + } -/** - * Generates a square preview for a given skeleton - * @param {string} source Path to the image - * @param {string} destFile Path to the destinating image - * @param {number} size Size of the square thumbnail, in pixels - * @returns {Promise} Resolves after creating a thumbnail. - * On success, passes `destFile`, the path to the created thumbnail. - */ -const imgGenPreview = (source, destFile, size) => { - const thumbnail = document.createElement('img'); + const source = await getDOMImage(texture); + + const c = document.createElement('canvas'); + c.x = c.getContext('2d'); + c.width = c.height = size; + c.x.clearRect(0, 0, size, size); + + const x = texture.offx, + y = texture.offy, + w = texture.width, + h = texture.height; + + let k; + if (w > h) { + k = size / w; + } else { + k = size / h; + } + if (k > 1) { + if (global.currentProject.settings.rendering.pixelatedrender) { + k = Math.floor(k); + c.x.imageSmoothingEnabled = false; + } else { + k = 1; + } + } + c.x.drawImage( + source, + x, y, w, h, + (size - w * k) / 2, (size - h * k) / 2, + w * k, h * k + ); + const thumbnailBase64 = c.toDataURL().replace(/^data:image\/\w+;base64,/, ''); + const buf = Buffer.from(thumbnailBase64, 'base64'); const fs = require('fs-extra'); - return new Promise((accept, reject) => { - thumbnail.onload = () => { - var c = document.createElement('canvas'), - w, h, k; - c.x = c.getContext('2d'); - c.width = c.height = size; - c.x.clearRect(0, 0, size, size); - w = thumbnail.width; - h = thumbnail.height; - if (w > h) { - k = size / w; - } else { - k = size / h; - } - if (k > 1) { - k = 1; - } - c.x.drawImage( - thumbnail, - (size - thumbnail.width * k) / 2, - (size - thumbnail.height * k) / 2, - thumbnail.width * k, - thumbnail.height * k - ); - // strip off the data:image url prefix to get just the base64-encoded bytes - var dataURL = c.toDataURL(); - var base64data = dataURL.replace(/^data:image\/\w+;base64,/, ''); - var buf = new Buffer(base64data, 'base64'); - var stream = fs.createWriteStream(destFile); - stream.on('finish', () => { - setTimeout(() => { // WHY THE HECK I EVER NEED THIS?! - accept(destFile); - }, 100); - }); - stream.on('error', err => { - reject(err); - }); - stream.end(buf); - }; - thumbnail.src = 'file://' + source; - }); + await fs.writeFile(destination, buf); + return destination; }; const texturePostfixParser = /_(?\d+)x(?\d+)(?:@(?\d+))?$/; @@ -251,13 +240,9 @@ const importImageToTexture = async src => { }; image.src = 'file://' + dest + '?' + Math.random(); }); - await Promise.all([ - imgGenPreview(dest, dest + '_prev.png', 64), - imgGenPreview(dest, dest + '_prev@2.png', 128) - ]); const texName = path.basename(src) - .replace(/\.(jpg|gif|png|jpeg)/gi, '') - .replace(/\s/g, '_'); + .replace(/\.(jpg|gif|png|jpeg)/gi, '') + .replace(/\s/g, '_'); const obj = { name: texName, untill: 0, @@ -300,7 +285,13 @@ const importImageToTexture = async src => { obj.tiled = true; } + await Promise.all([ + textureGenPreview(obj, dest + '_prev.png', 64), + textureGenPreview(obj, dest + '_prev@2.png', 128) + ]); + global.currentProject.textures.push(obj); + window.signals.trigger('textureImported'); return obj; }; @@ -325,5 +316,5 @@ module.exports = { getPixiTexture, getDOMImage, importImageToTexture, - imgGenPreview + textureGenPreview }; diff --git a/src/riotTags/texture-editor.tag b/src/riotTags/texture-editor.tag index a2473026d..a0044b858 100644 --- a/src/riotTags/texture-editor.tag +++ b/src/riotTags/texture-editor.tag @@ -317,11 +317,11 @@ texture-editor.panel.view textureCanvas.img = image; this.texture.lastmod = Number(new Date()); - const {imgGenPreview} = require('./data/node_requires/resources/textures'); - imgGenPreview(dest, dest + '_prev.png', 64, () => { + const {textureGenPreview} = require('./data/node_requires/resources/textures'); + textureGenPreview(this.texture, dest + '_prev.png', 64, () => { this.update(); }); - imgGenPreview(dest, dest + '_prev@2.png', 128); + textureGenPreview(this.texture, dest + '_prev@2.png', 128); setTimeout(() => { this.refreshTextureCanvas(); this.parent.fillTextureMap(); @@ -771,8 +771,9 @@ texture-editor.panel.view this.parent.fillTextureMap(); glob.modified = true; this.texture.lastmod = Number(new Date()); - this.textureGenPreview(global.projdir + '/img/' + this.texture.origname + '_prev@2.png', 128); - this.textureGenPreview(global.projdir + '/img/' + this.texture.origname + '_prev.png', 64) + const {textureGenPreview} = require('./data/node_requires/resources/textures'); + textureGenPreview(this.texture, global.projdir + '/img/' + this.texture.origname + '_prev@2.png', 128); + textureGenPreview(this.texture, global.projdir + '/img/' + this.texture.origname + '_prev.png', 64) .then(() => { this.parent.editing = false; this.parent.update(); @@ -780,49 +781,6 @@ texture-editor.panel.view return true; }; - /** - * Генерирует превьюху первого кадра графики - * @returns {Promise} Промис - */ - this.textureGenPreview = function textureGenPreview(destination, size) { - return new Promise((accept, decline) => { - var c = document.createElement('canvas'); - const x = this.texture.offx, - y = this.texture.offy, - w = this.texture.width, - h = this.texture.height; - let k; - c.x = c.getContext('2d'); - c.width = c.height = size; - c.x.clearRect(0, 0, size, size); - if (w > h) { - k = size / w; - } else { - k = size / h; - } - if (k > 1) { - k = 1; - } - c.x.drawImage( - textureCanvas.img, - x, y, w, h, - (size - w * k) / 2, (size - h * k) / 2, - w * k, h * k - ); - var thumbnailBase64 = c.toDataURL().replace(/^data:image\/\w+;base64,/, ''); - var buf = Buffer.from(thumbnailBase64, 'base64'); - fs.writeFile(destination, buf, err => { - if (err) { - console.error(err); - decline(err); - } else { - accept(destination); - } - }); - }); - }; - - this.changePreviewBg = () => { this.changingPreviewBg = !this.changingPreviewBg; if (this.changingPreviewBg) { From 2910dc00b1349fb5758617947179e355b6a3af6f Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Wed, 19 Aug 2020 10:49:42 +1200 Subject: [PATCH 29/74] :zap: More symmetric viewport movement at room editor --- src/riotTags/rooms/room-editor.tag | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/riotTags/rooms/room-editor.tag b/src/riotTags/rooms/room-editor.tag index b981050ae..3b8b48c70 100644 --- a/src/riotTags/rooms/room-editor.tag +++ b/src/riotTags/rooms/room-editor.tag @@ -332,15 +332,15 @@ room-editor.panel.view this.refs.mousecoords.innerHTML = `(${this.mouseX}:${this.mouseY})`; }; - /** Начинаем перемещение, или же показываем предварительное расположение новой копии */ + /** Start moving or show a placement preview **/ this.onCanvasMove = e => { e.preventUpdate = true; if (this.dragging && !this.movingStuff) { - // перетаскивание - this.roomx -= Math.floor(e.movementX / this.zoomFactor); - this.roomy -= Math.floor(e.movementY / this.zoomFactor); + // Drag the viewport + this.roomx -= Math.round(e.movementX / this.zoomFactor); + this.roomy -= Math.round(e.movementY / this.zoomFactor); this.refreshRoomCanvas(e); - } else if ( // если зажата мышь и клавиша Shift, то создавать больше копий/тайлов + } else if ( // Make more tiles or copies if Shift key is down e.shiftKey && this.mouseDown && ( (this.tab === 'roomcopies' && this.currentType !== -1) || From ac5cf87dcbfc396e15e39eace675f5a68f392e56 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Wed, 19 Aug 2020 17:45:50 +1200 Subject: [PATCH 30/74] =?UTF-8?q?=E2=9C=A8=20ct.place.moveByAxes=20and=20t?= =?UTF-8?q?his.moveContinuousByAxes=20for=20easy=20movement=20at=20platfor?= =?UTF-8?q?mers=20and=20top-down=20games=20=E2=9A=A1=EF=B8=8F=20ct.place.m?= =?UTF-8?q?oveAlong=20now=20checks=20against=20tiles=20too?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ct.libs/place/docs/Movement methods.md | 17 +++++- app/data/ct.libs/place/index.js | 40 +++++++++++++- app/data/ct.libs/place/injects/start.js | 26 ++++++++-- app/data/ct.libs/place/module.json | 2 +- app/data/ct.libs/place/types.d.ts | 52 +++++++++++++++++-- 5 files changed, 125 insertions(+), 12 deletions(-) diff --git a/app/data/ct.libs/place/docs/Movement methods.md b/app/data/ct.libs/place/docs/Movement methods.md index 72921a3bf..0d2ecedac 100644 --- a/app/data/ct.libs/place/docs/Movement methods.md +++ b/app/data/ct.libs/place/docs/Movement methods.md @@ -8,9 +8,22 @@ Moves a copy by `stepSize` in a given `direction` untill a `maxLength` is reached or a copy is next to another colliding copy. You can filter collided copies with `ctype`, and set precision with `stepSize` (default is `1`, which means pixel-by-pixel movement). This function is especially useful for side-view games and any fast-moving copies, as it allows precise movement without clipping or passing through surfaces. -### this.moveContinuous(ctype); +## ct.place.moveByAxes(me, dx, dy, [ctype, stepSize]) -You can call `this.moveContinuous('CollisionGroup');` at any copy to perform precise movement with collision checks. It takes gravity into account, too, and uses the `ct.place.moveAlong` method. +Similar to ct.place.moveAlong, this method moves a copy by X and Y axes until dx and dy are reached +or a copy meets an obstacle on both axes. If an obstacle was met on one axis, a copy may continue +moving by another axis. You can filter collided copies with `ctype`, +and set precision with `stepSize` (default is `1`, which means pixel-by-pixel movement). +This movement suits characters in top-down and side-view worlds. + + +### this.moveContinuous(ctype, [precision]); + +You can call `this.moveContinuous('CollisionGroup');` at any copy to perform precise movement with collision checks. It takes gravity and `ct.delta` into account, too, and uses the `ct.place.moveAlong` method. + +### this.moveContinuousByAxes(ctype, [precision]); + +You can call `this.moveContinuousByAxes('CollisionGroup');` at any copy to perform precise movement with collision checks. It takes gravity and `ct.delta` into account, too, and uses the `ct.place.moveByAxes` method. ## ct.place.go(me, x, y, length, [ctype]) diff --git a/app/data/ct.libs/place/index.js b/app/data/ct.libs/place/index.js index ceb2486bd..32eadf2b2 100644 --- a/app/data/ct.libs/place/index.js +++ b/app/data/ct.libs/place/index.js @@ -376,7 +376,8 @@ var dx = Math.cos(dir * Math.PI / -180) * precision, dy = Math.sin(dir * Math.PI / -180) * precision; for (let i = 0; i < length; i += precision) { - const occupied = ct.place.occupied(me, me.x + dx, me.y + dy, ctype); + const occupied = ct.place.occupied(me, me.x + dx, me.y + dy, ctype) || + ct.place.tile(me, me.x + dx, me.y + dy, ctype); if (!occupied) { me.x += dx; me.y += dy; @@ -387,6 +388,43 @@ } return false; }, + moveByAxes(me, dx, dy, ctype, precision) { + if (typeof ctype === 'number') { + precision = ctype; + ctype = void 0; + } + const obstacles = { + x: false, + y: false + }; + precision = Math.abs(precision || 1); + while (Math.abs(dx) > precision) { + if (ct.place.free(me, me.x + Math.sign(dx) * precision, me.y, ctype) && + !ct.place.tile(me, me.x + Math.sign(dx) * precision, me.y, ctype) + ) { + me.x += Math.sign(dx) * precision; + dx -= Math.sign(dx) * precision; + } else { + obstacles.x = true; + break; + } + } + while (Math.abs(dy) > precision) { + if (ct.place.free(me, me.x, me.y + Math.sign(dy) * precision, ctype) && + !ct.place.tile(me, me.x, me.y + Math.sign(dy) * precision, ctype) + ) { + me.y += Math.sign(dy) * precision; + dy -= Math.sign(dy) * precision; + } else { + obstacles.y = true; + break; + } + } + if (!obstacles.x && !obstacles.y) { + return false; + } + return obstacles; + }, go(me, x, y, length, ctype) { // ct.place.go([, ctype: String]) // tries to reach the target with a simple obstacle avoidance algorithm diff --git a/app/data/ct.libs/place/injects/start.js b/app/data/ct.libs/place/injects/start.js index daafa05f0..6a38477f2 100644 --- a/app/data/ct.libs/place/injects/start.js +++ b/app/data/ct.libs/place/injects/start.js @@ -1,17 +1,33 @@ Object.defineProperty(ct.types.Copy.prototype, 'ctype', { - set: function(value) { + set: function (value) { this.$ctype = value; }, - get: function() { + get: function () { return this.$ctype; } }); Object.defineProperty(ct.types.Copy.prototype, 'moveContinuous', { value: function (ctype, precision) { if (this.gravity) { - this.hspeed += this.gravity * ct.delta * Math.cos(this.gravityDir*Math.PI/-180); - this.vspeed += this.gravity * ct.delta * Math.sin(this.gravityDir*Math.PI/-180); + this.hspeed += this.gravity * ct.delta * Math.cos(this.gravityDir * Math.PI / -180); + this.vspeed += this.gravity * ct.delta * Math.sin(this.gravityDir * Math.PI / -180); } - return ct.place.moveAlong(this, this.direction, this.speed, ctype, precision); + return ct.place.moveAlong(this, this.direction, this.speed * ct.delta, ctype, precision); + } +}); + +Object.defineProperty(ct.types.Copy.prototype, 'moveContinuousByAxes', { + value: function (ctype, precision) { + if (this.gravity) { + this.hspeed += this.gravity * ct.delta * Math.cos(this.gravityDir * Math.PI / -180); + this.vspeed += this.gravity * ct.delta * Math.sin(this.gravityDir * Math.PI / -180); + } + return ct.place.moveByAxes( + this, + this.hspeed * ct.delta, + this.vspeed * ct.delta, + ctype, + precision + ); } }); diff --git a/app/data/ct.libs/place/module.json b/app/data/ct.libs/place/module.json index 07167e8f3..2ef4bbace 100644 --- a/app/data/ct.libs/place/module.json +++ b/app/data/ct.libs/place/module.json @@ -2,7 +2,7 @@ "main": { "name": "ct.place", "tagline": "Check for collisions, move copies continuously, and add basic collision avoidance to your copies.", - "version": "3.1.0", + "version": "3.2.0", "authors": [{ "name": "Cosmo Myzrail Gorynych", "mail": "admin@nersta.ru" diff --git a/app/data/ct.libs/place/types.d.ts b/app/data/ct.libs/place/types.d.ts index cde8d66d2..995289e8a 100644 --- a/app/data/ct.libs/place/types.d.ts +++ b/app/data/ct.libs/place/types.d.ts @@ -144,18 +144,44 @@ declare namespace ct { /** * Moves a copy by `stepSize` in a given `direction` untill a `maxLength` is reached - * or a copy is next to another colliding copy. You can filter collided copies with `ctype`, + * or a copy is next to an obstacle. You can filter collided copies and tiles with `ctype`, * and set precision with `stepSize` (default is `1`, which means pixel-by-pixel movement). * This function is especially useful for side-view games and any fast-moving copies, * as it allows precise movement without clipping or passing through surfaces. * + * @remarks + * You will usually need to premultiply `maxLength` with `ct.delta` so that the speed is consistent + * under different FPS rates. + * * @param {Copy} me The copy that needs to be moved - * @param {number} direction The irection in which to perform a movement + * @param {number} direction The direction in which to perform a movement * @param {number} maxLength The maximum distance a copy can traverse * @param {string} [ctype] A collision group to test against. Tests against every copy if no collision group was specified * @param {number} [stepSize=1] Precision of movement + * @returns {Copy|boolean} If there was no collision and a copy reached its target, returns `false`. + * If a copy met an obstacle as another copy, returns this copy. If there was a tile, returns `true`. + */ + function moveAlong(me: Copy, direction: number, maxLength: number, ctype?: string, stepSize?: number): Copy | boolean; + + /** + * Similar to ct.place.moveAlong, this method moves a copy by X and Y axes until dx and dy are reached + * or a copy meets an obstacle on both axes. If an obstacle was met on one axis, a copy may continue + * moving by another axis. You can filter collided copies with `ctype`, + * and set precision with `stepSize` (default is `1`, which means pixel-by-pixel movement). + * This movement suits characters in top-down and side-view worlds. + * + * @remarks + * You will usually need to premultiply `dx` and `dy` with `ct.delta` so that the speed is consistent + * under different FPS rates. + * + * @param {Copy} me The copy that needs to be moved + * @param {number} dx Amount of pixels to move by X axis + * @param {number} dy Amount of pixels to move by Y axis + * @param {string} [ctype] A collision group to test against. Tests against every copy if no collision group was specified + * @param {number} [stepSize=1] Precision of movement + * @returns {false|ISeparateMovementResult} `false` if it reached its target, an object with each axis specified otherwise. */ - function moveAlong(me: Copy, direction: number, maxLength: number, ctype?: string, stepSize?: number): Copy | false; + function moveByAxes(me: Copy, dx: number, dy: number, ctype?: string, stepSize?: number): false | ISeparateMovementResult; /** * Tries to reach the target with a simple obstacle avoidance algorithm. @@ -189,4 +215,24 @@ declare namespace ct { */ function trace(x1: number, y1: number, x2: number, y2: number, ctype?: string): Copy[]; } +} + +interface ISeparateMovementResult { + x: boolean; + y: boolean; +} + +interface Copy { + /** The current collision group of a copy */ + ctype: string; + /** + * Call to perform precise movement with collision checks. It takes gravity + * and `ct.delta` into account, too, and uses the `ct.place.moveAlong` method. + */ + moveContinuous(ctype: string, precision?: number): void; + /** + * Call to perform precise movement with collision checks. It takes gravity + * and `ct.delta` into account, too, and uses the `ct.place.moveByAxes` method. + */ + moveContinuousByAxes(ctype: string, precision?: number): void; } \ No newline at end of file From d66acc1b47773d0a89aeb470d10167f97723d46a Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Wed, 19 Aug 2020 17:46:14 +1200 Subject: [PATCH 31/74] =?UTF-8?q?=E2=9C=A8=20Hide=20default=20cursor=20at?= =?UTF-8?q?=20Project=20->=20Render=20Options=20->=20Hide=20system=20curso?= =?UTF-8?q?r?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/data/ct.release/ct.css | 1 + app/data/i18n/English.json | 1 + src/node_requires/exporter/css.js | 3 ++- src/node_requires/exporter/index.js | 4 ---- src/riotTags/project-settings/rendering-settings.tag | 4 ++++ 5 files changed, 8 insertions(+), 5 deletions(-) diff --git a/app/data/ct.release/ct.css b/app/data/ct.release/ct.css index 43fb83f35..395ed570a 100644 --- a/app/data/ct.release/ct.css +++ b/app/data/ct.release/ct.css @@ -54,4 +54,5 @@ body { } /*@pixelatedrender@*/ +/*@hidecursor@*/ /*%css%*/ \ No newline at end of file diff --git a/app/data/i18n/English.json b/app/data/i18n/English.json index e3b12c0f0..1e417baea 100644 --- a/app/data/i18n/English.json +++ b/app/data/i18n/English.json @@ -229,6 +229,7 @@ "highDensity": "Support high pixel density (e.g. on retina screens)", "maxFPS": "Max framerate:", "pixelatedrender": "Disable image smoothing here and in exported project (preserve crisp pixels)", + "hideCursor": "Hide system cursor", "usePixiLegacy": "Add a legacy, canvas-based renderer to support older browsers and graphics cards (adds ~20kb up to your game)", "desktopBuilds": "Desktop builds", "launchMode": "Launch mode:", diff --git a/src/node_requires/exporter/css.js b/src/node_requires/exporter/css.js index 096c7fb0c..c1edd294d 100644 --- a/src/node_requires/exporter/css.js +++ b/src/node_requires/exporter/css.js @@ -7,7 +7,8 @@ const substituteCssVars = (str, project, injects) => { [color1, color2] = [color2, color1]; } return str - .replace('/*@pixelatedrender@*/', project.settings.pixelatedrender ? 'canvas,img{image-rendering:optimizeSpeed;image-rendering:-moz-crisp-edges;image-rendering:-webkit-optimize-contrast;image-rendering:optimize-contrast;image-rendering:pixelated;ms-interpolation-mode:nearest-neighbor}' : '') + .replace('/*@pixelatedrender@*/', project.settings.rendering.pixelatedrender ? 'canvas,img{image-rendering:optimizeSpeed;image-rendering:-moz-crisp-edges;image-rendering:-webkit-optimize-contrast;image-rendering:optimize-contrast;image-rendering:pixelated;ms-interpolation-mode:nearest-neighbor}' : '') + .replace('/*@hidecursor@*/', project.settings.rendering.hideCursor ? '#ct { cursor: none; }' : '') .replace(/\/\*@preloaderforeground@\*\//g, color1) .replace(/\/\*@preloaderbackground@\*\//g, color2) .replace('/*%css%*/', injects.css); diff --git a/src/node_requires/exporter/index.js b/src/node_requires/exporter/index.js index f9269534a..222a7f0a2 100644 --- a/src/node_requires/exporter/index.js +++ b/src/node_requires/exporter/index.js @@ -271,10 +271,6 @@ const exportCtProject = async (project, projdir) => { const html = substituteHtmlVars(await sources['index.html'], project, injects); let css = substituteCssVars(await sources['ct.css'], project, injects); - if (settings.rendering.pixelatedrender) { - css += '#ct canvas{image-rendering: pixelated;}'; - } - css += fonts.css; // Output minified HTML & CSS diff --git a/src/riotTags/project-settings/rendering-settings.tag b/src/riotTags/project-settings/rendering-settings.tag index 8e44a33b8..946b8d84b 100644 --- a/src/riotTags/project-settings/rendering-settings.tag +++ b/src/riotTags/project-settings/rendering-settings.tag @@ -15,6 +15,10 @@ rendering-settings label.block.checkbox input(type="checkbox" value="{renderSettings.usePixiLegacy}" checked="{renderSettings.usePixiLegacy}" onchange="{wire('this.renderSettings.usePixiLegacy')}") span {voc.usePixiLegacy} + fieldset + label.block.checkbox + input(type="checkbox" checked="{renderSettings.hideCursor}" onchange="{wire('this.renderSettings.hideCursor')}") + span {voc.hideCursor} h2 {voc.desktopBuilds} fieldset b {voc.launchMode} From 40d722392a80b92b2d5e3df6294aa83977a084cf Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Wed, 19 Aug 2020 13:46:09 +1200 Subject: [PATCH 32/74] :bug: Fix double help notices at extensions' fields --- src/riotTags/shared/extensions-editor.tag | 1 - 1 file changed, 1 deletion(-) diff --git a/src/riotTags/shared/extensions-editor.tag b/src/riotTags/shared/extensions-editor.tag index 53a746887..3b1c7a141 100644 --- a/src/riotTags/shared/extensions-editor.tag +++ b/src/riotTags/shared/extensions-editor.tag @@ -127,7 +127,6 @@ extensions-editor ) | {option.name} div.desc(if="{option.help}") {option.help} - .dim(if="{ext.help && !parent.opts.compact}") {ext.help} select( if="{ext.type === 'select'}" onchange="{wire('this.opts.entity.'+ ext.key)}" From 404eb5a6eb15787974c1aaa443c1c837967c230b Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Wed, 19 Aug 2020 17:43:53 +1200 Subject: [PATCH 33/74] :sparkles: Code completions now suggest types' and sounds' names. --- src/js/codeEditorProjectAwareCompletions.js | 75 +++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/js/codeEditorProjectAwareCompletions.js diff --git a/src/js/codeEditorProjectAwareCompletions.js b/src/js/codeEditorProjectAwareCompletions.js new file mode 100644 index 000000000..f61038c8a --- /dev/null +++ b/src/js/codeEditorProjectAwareCompletions.js @@ -0,0 +1,75 @@ +(function codeEditorCompletions() { + const getInsertRange = function getInsertRange(model, position) { + var word = model.getWordUntilPosition(position); + return { + startLineNumber: position.lineNumber, + endLineNumber: position.lineNumber, + startColumn: word.startColumn, + endColumn: word.endColumn + }; + }; + + const createTypeProposals = function createTypeProposals(range) { + // filtering is done by the Monaco editor + return global.currentProject.types.map(type => ({ + label: type.name, + kind: monaco.languages.CompletionItemKind.Value, + insertText: `'${type.name}'`, + range + })).sort((a, b) => a.label.localeCompare(b.label)); + }; + + const createSoundProposals = function createSoundProposals(range) { + return global.currentProject.sounds.map(sound => ({ + label: sound.name, + kind: monaco.languages.CompletionItemKind.Value, + insertText: `'${sound.name}'`, + range + })).sort((a, b) => a.label.localeCompare(b.label)); + }; + + const checkMatch = function checkMatch(model, position, regex) { + var textUntilPosition = model.getValueInRange({ + startLineNumber: position.lineNumber, + startColumn: 1, + endLineNumber: position.lineNumber, + endColumn: position.column + }); + return textUntilPosition.match(regex); + }; + + const provideTypeNames = function provideTypeNames(model, position) { + if (!checkMatch(model, position, /ct\.types\.((make|copy)\(|list\[)$/)) { + return { + suggestions: [] + }; + } + const range = getInsertRange(model, position); + return { + suggestions: createTypeProposals(range) + }; + }; + + const provideSoundNames = function provideSoundNames(model, position) { + if (!checkMatch(model, position, /ct\.sound\.(spawn|volume|fade|stop|pause|resume|position|load|playing)\($/)) { + return { + suggestions: [] + }; + } + const range = getInsertRange(model, position); + return { + suggestions: createSoundProposals(range) + }; + }; + + window.signals.on('monacoBooted', () => { + monaco.languages.registerCompletionItemProvider('typescript', { + provideCompletionItems: provideTypeNames, + triggerCharacters: ['(', '['] + }); + monaco.languages.registerCompletionItemProvider('typescript', { + provideCompletionItems: provideSoundNames, + triggerCharacters: ['('] + }); + }); +})(); From 423c2b672bdadb5ec7ae2775fcfa232855ef0b37 Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Wed, 19 Aug 2020 20:09:17 +1200 Subject: [PATCH 34/74] :zap: Add project-aware completions for rooms, emitters and actions --- src/js/codeEditorProjectAwareCompletions.js | 77 ++++++++++++++++++++- 1 file changed, 76 insertions(+), 1 deletion(-) diff --git a/src/js/codeEditorProjectAwareCompletions.js b/src/js/codeEditorProjectAwareCompletions.js index f61038c8a..a20c4d2c1 100644 --- a/src/js/codeEditorProjectAwareCompletions.js +++ b/src/js/codeEditorProjectAwareCompletions.js @@ -19,6 +19,15 @@ })).sort((a, b) => a.label.localeCompare(b.label)); }; + const createRoomProposals = function createRoomProposals(range) { + return global.currentProject.rooms.map(room => ({ + label: room.name, + kind: monaco.languages.CompletionItemKind.Value, + insertText: `'${room.name}'`, + range + })).sort((a, b) => a.label.localeCompare(b.label)); + }; + const createSoundProposals = function createSoundProposals(range) { return global.currentProject.sounds.map(sound => ({ label: sound.name, @@ -28,6 +37,24 @@ })).sort((a, b) => a.label.localeCompare(b.label)); }; + const createActionProposals = function createActionProposals(range) { + return global.currentProject.actions.map(action => ({ + label: action.name, + kind: monaco.languages.CompletionItemKind.Property, + insertText: action.name, + range + })).sort((a, b) => a.label.localeCompare(b.label)); + }; + + const createPSProposals = function createPSProposals(range) { + return global.currentProject.emitterTandems.map(et => ({ + label: et.name, + kind: monaco.languages.CompletionItemKind.Value, + insertText: `'${et.name}'`, + range + })).sort((a, b) => a.label.localeCompare(b.label)); + }; + const checkMatch = function checkMatch(model, position, regex) { var textUntilPosition = model.getValueInRange({ startLineNumber: position.lineNumber, @@ -39,7 +66,7 @@ }; const provideTypeNames = function provideTypeNames(model, position) { - if (!checkMatch(model, position, /ct\.types\.((make|copy)\(|list\[)$/)) { + if (!checkMatch(model, position, /ct\.types\.((make|copy)\(|list\[|templates\[)$/)) { return { suggestions: [] }; @@ -50,6 +77,18 @@ }; }; + const provideRoomNames = function provideRoomNames(model, position) { + if (!checkMatch(model, position, /ct\.rooms\.((switch|append|prepend|merge)\(|templates\[)$/)) { + return { + suggestions: [] + }; + } + const range = getInsertRange(model, position); + return { + suggestions: createRoomProposals(range) + }; + }; + const provideSoundNames = function provideSoundNames(model, position) { if (!checkMatch(model, position, /ct\.sound\.(spawn|volume|fade|stop|pause|resume|position|load|playing)\($/)) { return { @@ -62,6 +101,30 @@ }; }; + const provideActionNames = function provideActionNames(model, position) { + if (!checkMatch(model, position, /ct\.actions\.$/)) { + return { + suggestions: [] + }; + } + const range = getInsertRange(model, position); + return { + suggestions: createActionProposals(range) + }; + }; + + const providePSNames = function providePSNames(model, position) { + if (!checkMatch(model, position, /ct\.emitters\.(fire|append|follow)\($/)) { + return { + suggestions: [] + }; + } + const range = getInsertRange(model, position); + return { + suggestions: createPSProposals(range) + }; + }; + window.signals.on('monacoBooted', () => { monaco.languages.registerCompletionItemProvider('typescript', { provideCompletionItems: provideTypeNames, @@ -71,5 +134,17 @@ provideCompletionItems: provideSoundNames, triggerCharacters: ['('] }); + monaco.languages.registerCompletionItemProvider('typescript', { + provideCompletionItems: provideActionNames, + triggerCharacters: ['.'] + }); + monaco.languages.registerCompletionItemProvider('typescript', { + provideCompletionItems: provideRoomNames, + triggerCharacters: ['(', '['] + }); + monaco.languages.registerCompletionItemProvider('typescript', { + provideCompletionItems: providePSNames, + triggerCharacters: ['('] + }); }); })(); From dd84f5f893126db0cc9f7701599fa1be390a51fa Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Thu, 20 Aug 2020 11:52:53 +1200 Subject: [PATCH 35/74] :zap: Add .itch.toml to add links to Discord and docs, plus to simplify run dialog on Linux --- app/.itch.toml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 app/.itch.toml diff --git a/app/.itch.toml b/app/.itch.toml new file mode 100644 index 000000000..dbe88a0d1 --- /dev/null +++ b/app/.itch.toml @@ -0,0 +1,22 @@ +[[actions]] +name = "play" +path = "ctjs.exe" +platform = "windows" + +[[actions]] +name = "play" +path = "ctjs" +platform = "linux" + +[[actions]] +name = "play" +path = "ctjs.app" +platform = "osx" + +[[actions]] +name = "manual" +path = "https://docs.ctjs.rocks/" + +[[actions]] +name = "Discord" +path = "https://discord.gg/CggbPkb" \ No newline at end of file From 97a4da2dd464ad2e0e8024e043ab70339f7ad0dd Mon Sep 17 00:00:00 2001 From: Cosmo Myzrail Gorynych Date: Thu, 20 Aug 2020 16:42:41 +1200 Subject: [PATCH 36/74] :sparkles: Import a texture by pasting it from a clipboard. Will update an existing opened texture as well! --- app/ct_ide.png | Bin 18544 -> 154390 bytes app/data/i18n/English.json | 6 ++- src/node_requires/hotkeys.js | 66 +++++++++++++++++++++--- src/node_requires/resources/textures.js | 23 ++++++--- src/riotTags/texture-editor.tag | 56 +++++++++++++++----- src/riotTags/textures-panel.tag | 23 ++++++++- src/styl/hvost.styl | 9 ++-- 7 files changed, 151 insertions(+), 32 deletions(-) diff --git a/app/ct_ide.png b/app/ct_ide.png index 38bbc14507911f9dcc73a9ad236727c6dc490691..b02a3795ed6691b6175d5fbbbf8c2277cf97a45c 100644 GIT binary patch literal 154390 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