77 lines
1.8 KiB
TypeScript
77 lines
1.8 KiB
TypeScript
import { compressTextureBuffer } from '@/lib/texture-compression'
|
|
import { classifyAssetCategory } from '@/lib/asset-classification'
|
|
import type { ParsedFile, PreparedAssetSummary } from '@/lib/types'
|
|
|
|
interface PushFile {
|
|
path: string
|
|
contentBase64: string
|
|
}
|
|
|
|
interface PrepareGitAssetsParams {
|
|
folderName: string
|
|
parsedFiles: ParsedFile[]
|
|
}
|
|
|
|
interface PrepareGitAssetsResult {
|
|
filesToPush: PushFile[]
|
|
modelFilename: string
|
|
assetSummaries: PreparedAssetSummary[]
|
|
compressed: boolean
|
|
compressionError?: string
|
|
}
|
|
|
|
export async function prepareGitAssets({
|
|
folderName,
|
|
parsedFiles,
|
|
}: PrepareGitAssetsParams): Promise<PrepareGitAssetsResult> {
|
|
const filesToPush: PushFile[] = []
|
|
const assetSummaries: PreparedAssetSummary[] = []
|
|
let modelFilename = ''
|
|
let compressed = false
|
|
let compressionError: string | undefined
|
|
|
|
for (const pf of parsedFiles) {
|
|
let content = pf.buffer
|
|
|
|
if (pf.isModel) {
|
|
modelFilename = pf.filename
|
|
|
|
assetSummaries.push({
|
|
filename: pf.filename,
|
|
kind: 'model',
|
|
compressed: false,
|
|
})
|
|
} else {
|
|
const category = classifyAssetCategory(pf.filename)
|
|
|
|
const textureResult = await compressTextureBuffer(pf.filename, pf.buffer)
|
|
content = textureResult.buffer
|
|
compressed ||= textureResult.compressed
|
|
|
|
if (textureResult.error && !compressionError) {
|
|
compressionError = textureResult.error
|
|
}
|
|
|
|
assetSummaries.push({
|
|
filename: pf.filename,
|
|
kind: category === 'assets' ? 'asset' : 'texture',
|
|
category,
|
|
compressed: textureResult.compressed,
|
|
})
|
|
}
|
|
|
|
filesToPush.push({
|
|
path: `public/models/${folderName}/${pf.filename}`,
|
|
contentBase64: content.toString('base64'),
|
|
})
|
|
}
|
|
|
|
return {
|
|
filesToPush,
|
|
modelFilename,
|
|
assetSummaries,
|
|
compressed,
|
|
compressionError,
|
|
}
|
|
}
|