lingo3d
Version:
Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor
72 lines • 2.68 kB
JavaScript
import createSharedPool from "./utils/createSharedPool";
const numbers = new Set("01234567890".split(""));
const scanSerial = (_textureStart) => {
let isNumberOld = false;
let count = 0;
let startIndex = -1;
let endIndex = -1;
for (let i = _textureStart.length - 1; i >= 0; --i) {
const isNumber = numbers.has(_textureStart[i]);
if (isNumberOld !== isNumber) {
++count;
if (count === 1)
endIndex = i + 1;
else if (count === 2) {
startIndex = i + 1;
break;
}
}
isNumberOld = isNumber;
}
if (startIndex === -1 || endIndex === -1)
return [];
const serial = _textureStart.substring(startIndex, endIndex);
const start = _textureStart.substring(0, startIndex);
const end = _textureStart.substring(endIndex);
return [serial, start, end];
};
export const [requestSpriteSheet, releaseSpriteSheet] = createSharedPool(async ([textureStart, textureEnd]) => {
const [serialStart, start, end] = scanSerial(textureStart);
if (!serialStart)
return ["", 0, 0, undefined];
const [serialEnd] = scanSerial(textureEnd);
if (!serialEnd)
return ["", 0, 0, undefined];
const serialStrings = [];
const iMax = Number(serialEnd);
if (serialStart[0] === "0")
for (let i = Number(serialStart); i <= iMax; ++i)
serialStrings.push((i + "").padStart(serialEnd.length, "0"));
else
for (let i = Number(serialStart); i <= iMax; ++i)
serialStrings.push(i + "");
const imagePromises = serialStrings.map((serial) => new Promise((resolve) => {
const image = new Image();
image.onload = () => resolve(image);
image.src = start + serial + end;
}));
const images = await Promise.all(imagePromises);
const [{ naturalWidth, naturalHeight }] = images;
const columns = 5;
const rows = Math.ceil(imagePromises.length / columns);
const canvas = document.createElement("canvas");
canvas.width = naturalWidth * columns;
canvas.height = rows * naturalHeight;
const ctx = canvas.getContext("2d");
let x = 0;
let y = 0;
for (const image of images) {
ctx.drawImage(image, x * naturalWidth, y * naturalHeight);
if (++x === columns) {
x = 0;
++y;
}
}
return new Promise((resolve) => canvas.toBlob((blob) => resolve([
URL.createObjectURL(blob),
columns,
imagePromises.length,
blob
])));
}, (promise) => promise.then(([url]) => URL.revokeObjectURL(url)));
//# sourceMappingURL=spriteSheetPool.js.map