lingo3d
Version:
Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor
57 lines • 2.25 kB
JavaScript
import { Cancellable } from "@lincode/promiselikes";
import loadTexture from "../../display/utils/loaders/loadTexture";
import { requestSpriteSheet, releaseSpriteSheet } from "../../pools/spriteSheetPool";
import { spriteSheetPlaybackSystem } from "../spriteSheetPlaySystem";
import createInternalSystem from "../utils/createInternalSystem";
const loadSpriteSheet = (material, url, columns, length) => {
const map = (material.map = loadTexture(url, () => {
const rows = Math.ceil(length / columns);
map.repeat.set(1 / columns, 1 / rows);
}));
return map;
};
const playSpriteSheet = (material, columns, length, loop) => {
material.visible = true;
const rows = Math.ceil(length / columns);
spriteSheetPlaybackSystem.add(material, {
x: 0,
y: rows - 1,
columns,
rows,
frame: 0,
length,
loop
});
};
export const configSpriteSheetSystem = createInternalSystem("configSpriteSheetSystem", {
effect: (self) => {
const { textureStart, textureEnd, texture, columns, length, loop, object3d: { material } } = self;
if (textureStart && textureEnd) {
const handle = new Cancellable();
const promise = requestSpriteSheet([textureStart, textureEnd]);
promise.then(([url, columns, length, blob]) => {
if (handle.done)
return;
self.$blob = blob;
loadSpriteSheet(material, url, columns, length);
playSpriteSheet(material, columns, length, loop);
});
return () => {
releaseSpriteSheet(promise);
spriteSheetPlaybackSystem.delete(material);
handle.cancel();
};
}
if (!texture || !columns || !length)
return;
const handle = new Cancellable();
loadSpriteSheet(material, texture, columns, length);
const timeout = setTimeout(() => playSpriteSheet(material, columns, length, loop), 300);
return () => {
clearTimeout(timeout);
spriteSheetPlaybackSystem.delete(material);
handle.cancel();
};
}
});
//# sourceMappingURL=configSpriteSheetSystem.js.map