(
settings: RendererSettings,
signal: AbortSignal,
)
| 221 | } |
| 222 | |
| 223 | private async run( |
| 224 | settings: RendererSettings, |
| 225 | signal: AbortSignal, |
| 226 | ): Promise<RendererResult> { |
| 227 | // Select exporter |
| 228 | // TODO(refactor): check if i want to keep it this way |
| 229 | const exporters: ExporterClass[] = [ |
| 230 | FFmpegExporterClient, |
| 231 | ImageExporter, |
| 232 | WasmExporter, |
| 233 | ]; |
| 234 | |
| 235 | const exporterClass = exporters.find( |
| 236 | exporter => exporter.id === settings.exporter.name, |
| 237 | ); |
| 238 | |
| 239 | if (!exporterClass) { |
| 240 | this.project.logger.error( |
| 241 | `Could not find the "${settings.exporter.name}" exporter.`, |
| 242 | ); |
| 243 | return RendererResult.Error; |
| 244 | } |
| 245 | |
| 246 | // Instantiate exporter |
| 247 | this.exporter = await exporterClass.create(this.project, settings); |
| 248 | if (this.exporter.configuration) { |
| 249 | settings = { |
| 250 | ...settings, |
| 251 | ...((await this.exporter.configuration()) ?? {}), |
| 252 | }; |
| 253 | } |
| 254 | this.stage.configure(settings); |
| 255 | this.playback.fps = settings.fps; |
| 256 | this.playback.state = PlaybackState.Rendering; |
| 257 | const from = this.status.secondsToFrames(settings.range[0]); |
| 258 | this.frame.current = from; |
| 259 | |
| 260 | // Reset |
| 261 | await this.reloadScenes(settings); |
| 262 | await this.playback.recalculate(); |
| 263 | await this.playback.reset(); |
| 264 | |
| 265 | const to = Math.min( |
| 266 | this.playback.duration, |
| 267 | this.status.secondsToFrames(settings.range[1]), |
| 268 | ); |
| 269 | await this.playback.seek(from); |
| 270 | if (signal.aborted) return RendererResult.Aborted; |
| 271 | |
| 272 | await this.exporter.start?.(); |
| 273 | let lastRefresh = performance.now(); |
| 274 | let result = RendererResult.Success; |
| 275 | |
| 276 | const mediaByFrames = await this.getMediaByFrames(settings); |
| 277 | |
| 278 | // Start audio export |
| 279 | let generateAudioPromise; |
| 280 | if (this.exporter && this.exporter.generateAudio) { |
no test coverage detected