File size: 2,281 Bytes
30c1ba0
 
955ce73
096584a
 
 
 
 
 
 
 
 
 
 
eff8217
 
096584a
 
39166f8
096584a
 
 
b785e1d
096584a
 
 
cd6d879
096584a
 
39166f8
096584a
bdccaf0
096584a
 
39166f8
096584a
 
 
 
39166f8
096584a
 
39166f8
096584a
 
 
 
bdccaf0
 
 
 
 
 
 
30c1ba0
bdccaf0
 
 
 
096584a
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import { generateImageLCMAsBase64 } from "../providers/image-generation/generateImageLCMGradio.mts"
import { generateImageSDXLAsBase64 } from "../providers/image-generation/generateImageSDXLGradio.mts"
import { generateImageSDXL360AsBase64 } from "../providers/image-generation/generateImageSDXL360.mts"
import { RenderedScene, RenderRequest } from "../types.mts"

export async function renderImage(
  request: RenderRequest,
  response: RenderedScene,
): Promise<RenderedScene> {

  const isSpherical = request.projection === 'spherical'

  const generateImageAsBase64 = isSpherical
    ? generateImageSDXL360AsBase64
    : request.turbo
    ? generateImageLCMAsBase64
    : generateImageSDXLAsBase64

  // console.log(`going to generate an image using ${request.projection || "default (cartesian)"} projection`)
  
  const params = {
    positivePrompt: request.prompt,
    negativePrompt: request.negativePrompt,
    seed: request.seed,
    nbSteps: request.nbSteps,
    width: request.width,
    height: request.height
  }

  // console.log(`calling generateImageAsBase64 with: `, JSON.stringify(params, null, 2))

  // we try at least 3 different servers
  try {
    response.assetUrl = await generateImageAsBase64(params)
    // console.log("successful generation!", response.assetUrl.slice(0, 30))
    if (!response.assetUrl?.length) {
      throw new Error(`the generated image is empty`)
    }
  } catch (err) {
    // console.error(`failed to render.. but let's try again!`)
    try {
      response.assetUrl = await generateImageAsBase64(params)
      // console.log("successful generation!", response.assetUrl.slice(0, 30))
      if (!response.assetUrl?.length) {
        throw new Error(`the generated image is empty`)
      }
    } catch (err) {
      try {
        response.assetUrl = await generateImageAsBase64(params)
        // console.log("successful generation!", response.assetUrl.slice(0, 30))
        if (!response.assetUrl?.length) {
          throw new Error(`the generated image is empty`)
        }
      } catch (err) {
        // console.error(`failed to generate the image, due to`, err)
        response.error = `failed to render scene: ${err}`
        response.status = "error"
        response.assetUrl = ""
      }
    }
  }

  return response
}