forked from noxious/server
Stash
This commit is contained in:
@ -31,6 +31,8 @@ interface EffectiveDimensions {
|
||||
type Payload = {
|
||||
id: UUID
|
||||
name: string
|
||||
width: number
|
||||
height: number
|
||||
spriteActions: Array<{
|
||||
action: string
|
||||
sprites: SpriteImage[]
|
||||
@ -56,7 +58,7 @@ export default class SpriteUpdateEvent extends BaseEvent {
|
||||
await spriteRepository.getEntityManager().populate(sprite, ['spriteActions'])
|
||||
|
||||
// Update sprite in database
|
||||
await sprite.setName(data.name).setUpdatedAt(new Date()).save()
|
||||
await sprite.setName(data.name).setWidth(data.width).setHeight(data.height).setUpdatedAt(new Date()).save()
|
||||
|
||||
// First verify all sprite sheets can be generated
|
||||
for (const actionData of data.spriteActions) {
|
||||
@ -89,13 +91,13 @@ export default class SpriteUpdateEvent extends BaseEvent {
|
||||
sprite.getSpriteActions().add(spriteAction)
|
||||
|
||||
spriteAction
|
||||
.setAction(actionData.action)
|
||||
.setSprites(actionData.sprites)
|
||||
.setOriginX(actionData.originX)
|
||||
.setOriginY(actionData.originY)
|
||||
.setFrameWidth(await this.calculateMaxWidth(actionData.sprites))
|
||||
.setFrameHeight(totalHeight)
|
||||
.setFrameRate(actionData.frameRate)
|
||||
.setAction(actionData.action)
|
||||
.setSprites(actionData.sprites)
|
||||
.setOriginX(actionData.originX)
|
||||
.setOriginY(actionData.originY)
|
||||
.setFrameWidth(await this.calculateMaxWidth(actionData.sprites))
|
||||
.setFrameHeight(totalHeight)
|
||||
.setFrameRate(actionData.frameRate)
|
||||
|
||||
await spriteRepository.getEntityManager().persistAndFlush(spriteAction)
|
||||
}
|
||||
@ -126,27 +128,27 @@ export default class SpriteUpdateEvent extends BaseEvent {
|
||||
|
||||
// Process images and create sprite sheet
|
||||
const processedImages = await Promise.all(
|
||||
sprites.map(async (sprite, index) => {
|
||||
const { width, height, offsetX, offsetY } = await this.processImage(sprite)
|
||||
const uri = sprite.url.split(';base64,').pop()
|
||||
if (!uri) throw new Error('Invalid base64 image')
|
||||
const buffer = Buffer.from(uri, 'base64')
|
||||
sprites.map(async (sprite, index) => {
|
||||
const { width, height, offsetX, offsetY } = await this.processImage(sprite)
|
||||
const uri = sprite.url.split(';base64,').pop()
|
||||
if (!uri) throw new Error('Invalid base64 image')
|
||||
const buffer = Buffer.from(uri, 'base64')
|
||||
|
||||
// Create individual frame
|
||||
const left = offsetX >= 0 ? offsetX : 0
|
||||
const verticalOffset = totalHeight - height - (offsetY >= 0 ? offsetY : 0)
|
||||
return sharp({
|
||||
create: {
|
||||
width: maxWidth,
|
||||
height: totalHeight,
|
||||
channels: 4,
|
||||
background: { r: 0, g: 0, b: 0, alpha: 0 }
|
||||
}
|
||||
// Create individual frame
|
||||
const left = offsetX >= 0 ? offsetX : 0
|
||||
const verticalOffset = totalHeight - height - (offsetY >= 0 ? offsetY : 0)
|
||||
return sharp({
|
||||
create: {
|
||||
width: maxWidth,
|
||||
height: totalHeight,
|
||||
channels: 4,
|
||||
background: { r: 0, g: 0, b: 0, alpha: 0 }
|
||||
}
|
||||
})
|
||||
.composite([{ input: buffer, left, top: verticalOffset }])
|
||||
.png()
|
||||
.toBuffer()
|
||||
})
|
||||
.composite([{ input: buffer, left, top: verticalOffset }])
|
||||
.png()
|
||||
.toBuffer()
|
||||
})
|
||||
)
|
||||
|
||||
// Combine frames into sprite sheet
|
||||
@ -158,15 +160,15 @@ export default class SpriteUpdateEvent extends BaseEvent {
|
||||
background: { r: 0, g: 0, b: 0, alpha: 0 }
|
||||
}
|
||||
})
|
||||
.composite(
|
||||
processedImages.map((buffer, index) => ({
|
||||
input: buffer,
|
||||
left: index * maxWidth,
|
||||
top: 0
|
||||
}))
|
||||
)
|
||||
.png()
|
||||
.toBuffer()
|
||||
.composite(
|
||||
processedImages.map((buffer, index) => ({
|
||||
input: buffer,
|
||||
left: index * maxWidth,
|
||||
top: 0
|
||||
}))
|
||||
)
|
||||
.png()
|
||||
.toBuffer()
|
||||
|
||||
// Ensure directory exists
|
||||
const dir = `public/sprites/${spriteId}`
|
||||
|
Reference in New Issue
Block a user