From ee34124fbff878b493ac3777a25f877f63a1bf43 Mon Sep 17 00:00:00 2001 From: HF Date: Sun, 5 Jul 2020 12:06:42 +0200 Subject: [PATCH] change README, add preview and loading tiles for pc and pz mirrors, add utils script for initial image upload --- README.md | 3 +- public/loading5.png | Bin 0 -> 2383 bytes public/loading6.png | Bin 0 -> 2240 bytes public/preview5.png | Bin 0 -> 12926 bytes public/preview6.png | Bin 0 -> 13323 bytes utils/README.md | 3 ++ utils/uploadImage.js | 109 +++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 public/loading5.png create mode 100644 public/loading6.png create mode 100644 public/preview5.png create mode 100644 public/preview6.png create mode 100644 utils/uploadImage.js diff --git a/README.md b/README.md index 50e584e1..a01dd3fd 100644 --- a/README.md +++ b/README.md @@ -127,7 +127,7 @@ Meaning of some values: | Key | Description | |--------|:--------------------------------------------------| -| itent | Unique character used in the url | +| ident | Unique character used in the url | | title | Title | | size | canvas size, power of 4 and between 256 and 65536 | | bcd | Base cooldown for unset pixels | @@ -139,6 +139,7 @@ Meaning of some values: | sd | Start-date of the canvas for historical view | | desc | Small desctiption text | | v | If 3D voxel canvas (boolean) | +| hid | Hidden canvases, can be just seen by pressing P | The canvas size limit can be surpassed by changing the websocket packages in src/socket/packages/ to send chunk coordinates in 16bit. req is an integer and if >0 is the amount of total pixels placed before being allowed to play there, if -1 it has no requirement and if 0 it is limited to registered users. diff --git a/public/loading5.png b/public/loading5.png new file mode 100644 index 0000000000000000000000000000000000000000..766589c3f2d6d4736f0033d78edf31a2eff2e564 GIT binary patch literal 2383 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 literal 0 HcmV?d00001 diff --git a/public/preview6.png b/public/preview6.png new file mode 100644 index 0000000000000000000000000000000000000000..f9904b3c13e267b7eb9e8ef33429571b5a7158cb GIT binary patch literal 13323 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 literal 0 HcmV?d00001 diff --git a/utils/README.md b/utils/README.md index 664b3449..6d0ced2c 100644 --- a/utils/README.md +++ b/utils/README.md @@ -60,3 +60,6 @@ center logo of pixelplanet ## change-canvasbackup just a script that got run once to add the missing tiles in historical view when increasing the size of the moon canvas. + +## uploadImage.js +nodejs script to upload a Image to the canvas without checks and without caring about what was previously there, don't use it for anything other than initially loading a very large image to the canvas. diff --git a/utils/uploadImage.js b/utils/uploadImage.js new file mode 100644 index 00000000..1082fd80 --- /dev/null +++ b/utils/uploadImage.js @@ -0,0 +1,109 @@ +/* + * upload image to canvs in console + * doesn't care about previous data + * no checks - don't use if you can use Admintools + */ + +import redis from 'redis'; +import sharp from 'sharp'; +import bluebird from 'bluebird'; + +import canvases from '../src/canvases.json'; +import Palette from '../src/core/Palette'; +import { + getChunkOfPixel, +} from '../src/core/utils'; +import { + TILE_SIZE, +} from '../src/core/constants'; + +bluebird.promisifyAll(redis.RedisClient.prototype); +bluebird.promisifyAll(redis.Multi.prototype); +//ATTENTION Make suer to set the rdis URLs right!!! +const redisurl = "redis://localhost:6379"; +const redisCanvas = redis.createClient(redisurl, { return_buffers: true }); + +/* + * copied and modified from src/core/Image.js + */ +async function imageABGR2Canvas( + canvasId: number, + x: number, + y: number, + data: Buffer, + width: number, + height: number, +) { + console.log( + `Loading image with dim ${width}/${height} to ${x}/${y}/${canvasId}`, + ); + const canvas = canvases[canvasId]; + const { colors, cli, size } = canvas; + const palette = new Palette(colors); + const canvasMinXY = -(size / 2); + const imageData = new Uint32Array(data.buffer); + + const [ucx, ucy] = getChunkOfPixel(size, x, y); + const [lcx, lcy] = getChunkOfPixel(size, x + width, y + height); + + let totalPxlCnt = 0; + console.log(`Loading to chunks from ${ucx} / ${ucy} to ${lcx} / ${lcy} ...`); + let chunk; + for (let cx = ucx; cx <= lcx; cx += 1) { + for (let cy = ucy; cy <= lcy; cy += 1) { + chunk = new Uint8Array(TILE_SIZE * TILE_SIZE); + // offset of chunk in image + const cOffX = cx * TILE_SIZE + canvasMinXY - x; + const cOffY = cy * TILE_SIZE + canvasMinXY - y; + let cOff = 0; + let pxlCnt = 0; + for (let py = 0; py < TILE_SIZE; py += 1) { + for (let px = 0; px < TILE_SIZE; px += 1) { + const clrX = cOffX + px; + const clrY = cOffY + py; + if (clrX >= 0 && clrY >= 0 && clrX < width && clrY < height) { + const clr = imageData[clrX + clrY * width]; + const clrIndex = palette.abgr.indexOf(clr); + if (clrIndex !== -1) { + chunk[cOff] = clrIndex; + pxlCnt += 1; + } + } + cOff += 1; + } + } + if (pxlCnt) { + const key = `ch:${canvasId}:${cx}:${cy}`; + await redisCanvas.setAsync(key, Buffer.from(chunk.buffer)); + console.log(`Loaded ${pxlCnt} pixels into chunk ${cx}, ${cy}.`); + totalPxlCnt += pxlCnt; + } + chunk = null; + } + } + console.log('Image loading done.'); + return totalPxlCnt; +} + + +async function uploadImage( + path, + canvasId, + x, + y, +) { + const { data, info } = await sharp(path) + .ensureAlpha() + .raw() + .toBuffer({ resolveWithObject: true }); + + const pxlCount = await imageABGR2Canvas( + canvasId, + x, y, + data, + info.width, info.height, + ); +} + +uploadImage('PZ.png', '5', -4096, -4096); +//uploadImage('PC.png', '6', -7000, -7000)