|
import { v4 as uuidv4 } from "uuid" |
|
|
|
import { RenderedScene, RenderRequest } from "../types.mts" |
|
import { generateSeed } from "../utils/generateSeed.mts" |
|
import { getValidNumber } from "../utils/getValidNumber.mts" |
|
import { renderPipeline } from "./renderPipeline.mts" |
|
|
|
const cache: Record<string, RenderedScene> = {} |
|
const cacheQueue: string[] = [] |
|
const maxCacheSize = 1000 |
|
|
|
export async function renderScene(request: RenderRequest): Promise<RenderedScene> { |
|
|
|
const renderId = uuidv4() |
|
|
|
request.nbFrames = getValidNumber(request.nbFrames, 1, 24, 16) |
|
|
|
const isVideo = request?.nbFrames === 1 |
|
|
|
|
|
request.seed = getValidNumber(request.seed, 0, 2147483647, generateSeed()) |
|
request.nbSteps = getValidNumber(request.nbSteps, 5, 50, 10) |
|
|
|
if (isVideo) { |
|
request.width = getValidNumber(request.width, 256, 1024, 1024) |
|
request.height = getValidNumber(request.width, 256, 1024, 512) |
|
} else { |
|
request.width = getValidNumber(request.width, 256, 1280, 576) |
|
request.height = getValidNumber(request.width, 256, 720, 320) |
|
} |
|
|
|
const response: RenderedScene = { |
|
renderId, |
|
status: "pending", |
|
assetUrl: "", |
|
error: "", |
|
maskBase64: "", |
|
segments: [] |
|
} |
|
|
|
cache[renderId] = response |
|
cacheQueue.push(renderId) |
|
if (cacheQueue.length > maxCacheSize) { |
|
const toRemove = cacheQueue.shift() |
|
delete cache[toRemove] |
|
} |
|
|
|
|
|
|
|
renderPipeline(request, response) |
|
|
|
console.log("renderScene: yielding the scene", response) |
|
return response |
|
} |
|
|
|
export async function getRenderedScene(renderId: string): Promise<RenderedScene> { |
|
const rendered = cache[renderId] |
|
if (!rendered) { |
|
throw new Error(`couldn't find any rendered scene with renderId ${renderId}`) |
|
} |
|
return cache[renderId] |
|
} |