retiam 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.js +213 -209
- package/bin/export.js +322 -322
- package/bin/init.js +425 -425
- package/bin/lint.js +354 -354
- package/bin/render-config.js +87 -0
- package/bin/render.js +517 -600
- package/bin/snapshot.js +231 -231
- package/dist/{UTIF-pBEih-vH.js → UTIF-CuM_xgsi.js} +1 -1
- package/dist/assets/roboto-msdf.json +3642 -3642
- package/dist/{index-CnM0BhUR.js → index-C7UzgTiw.js} +4728 -4728
- package/dist/{main-Bw2LTrnR.js → main-CCBHkqdA.js} +1 -1
- package/dist/retiam.es.js +1 -1
- package/package.json +106 -116
- package/readme.md +155 -143
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { pathToFileURL } from 'node:url';
|
|
4
|
+
|
|
5
|
+
export const CLI_RENDER_DEFAULTS = Object.freeze({
|
|
6
|
+
fps: 60,
|
|
7
|
+
width: 1920,
|
|
8
|
+
height: 1080,
|
|
9
|
+
videoBitrate: '20M',
|
|
10
|
+
outputFormat: 'mp4',
|
|
11
|
+
outputDir: './outputs/video',
|
|
12
|
+
maxDuration: 0,
|
|
13
|
+
devServerPort: 5173,
|
|
14
|
+
wsPort: 5001,
|
|
15
|
+
replayFile: null,
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
// Serializable RenderConfig fields forwarded to SceneComposer before GPU setup.
|
|
19
|
+
export const RENDER_CONFIG_KEYS = Object.freeze([
|
|
20
|
+
'AA_Function', 'AA', 'sample_count', 'PPLL', 'max_layers',
|
|
21
|
+
'shadowsEnabled', 'shadowMethod', 'lightSize', 'frustumCulling',
|
|
22
|
+
'shadingStyle', 'celBands', 'celRimStrength', 'celRimPower', 'goochWarm', 'goochCool',
|
|
23
|
+
'raytraceEnabled', 'rtSamples', 'rtMaxAccumulation', 'bvhMethod', 'gamma', 'bounce_count',
|
|
24
|
+
'denoiser', 'oidnModel',
|
|
25
|
+
]);
|
|
26
|
+
|
|
27
|
+
export async function loadRenderConfig(projectRoot) {
|
|
28
|
+
const preferred = path.resolve(projectRoot, 'retiam.config.js');
|
|
29
|
+
const configPath = fs.existsSync(preferred) ? preferred : path.resolve(projectRoot, 'config.js');
|
|
30
|
+
if (!fs.existsSync(configPath)) return { defaultConfig: {}, configSource: 'built-in defaults' };
|
|
31
|
+
|
|
32
|
+
try {
|
|
33
|
+
const module = await import(pathToFileURL(configPath).href);
|
|
34
|
+
return { defaultConfig: module.default || {}, configSource: path.basename(configPath) };
|
|
35
|
+
} catch (error) {
|
|
36
|
+
console.warn(`⚠️ Failed to import ${path.basename(configPath)}, falling back to default values.`, error);
|
|
37
|
+
return { defaultConfig: {}, configSource: 'built-in defaults' };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function resolveRenderOptions(defaultConfig = {}, args = [], projectRoot = process.cwd()) {
|
|
42
|
+
const defaults = Object.fromEntries(Object.entries(CLI_RENDER_DEFAULTS)
|
|
43
|
+
.map(([key, value]) => [key, defaultConfig[key] ?? value]));
|
|
44
|
+
const config = {
|
|
45
|
+
fps: defaults.fps,
|
|
46
|
+
width: defaults.width,
|
|
47
|
+
height: defaults.height,
|
|
48
|
+
bitrate: defaults.videoBitrate,
|
|
49
|
+
maxDuration: defaults.maxDuration,
|
|
50
|
+
wsPort: defaults.wsPort,
|
|
51
|
+
devServerPort: defaults.devServerPort,
|
|
52
|
+
};
|
|
53
|
+
const renderConfigOverrides = {};
|
|
54
|
+
for (const key of RENDER_CONFIG_KEYS) {
|
|
55
|
+
if (defaultConfig[key] !== undefined) renderConfigOverrides[key] = defaultConfig[key];
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const targetFile = args[0] && !args[0].startsWith('-') ? args[0] : null;
|
|
59
|
+
let replayFile = defaults.replayFile;
|
|
60
|
+
let outputDir = path.resolve(projectRoot, defaults.outputDir);
|
|
61
|
+
|
|
62
|
+
for (let i = targetFile ? 1 : 0; i < args.length; i++) {
|
|
63
|
+
const flag = args[i];
|
|
64
|
+
if (flag === '-w' || flag === '--width') config.width = parseInt(args[++i], 10);
|
|
65
|
+
else if (flag === '-h' || flag === '--height') config.height = parseInt(args[++i], 10);
|
|
66
|
+
else if (flag === '-f' || flag === '--fps') config.fps = parseInt(args[++i], 10);
|
|
67
|
+
else if (flag === '-d' || flag === '--duration') config.maxDuration = parseInt(args[++i], 10);
|
|
68
|
+
else if (flag === '-o' || flag === '--out') outputDir = path.resolve(projectRoot, args[++i]);
|
|
69
|
+
else if (flag === '--raytrace') {
|
|
70
|
+
const value = args[i + 1];
|
|
71
|
+
if (value === 'true' || value === 'false') {
|
|
72
|
+
renderConfigOverrides.raytraceEnabled = value === 'true';
|
|
73
|
+
i++;
|
|
74
|
+
} else renderConfigOverrides.raytraceEnabled = true;
|
|
75
|
+
} else if (flag === '--no-raytrace') renderConfigOverrides.raytraceEnabled = false;
|
|
76
|
+
else if (flag === '--denoiser') renderConfigOverrides.denoiser = args[++i];
|
|
77
|
+
else if (flag === '--raw') renderConfigOverrides.denoiser = 'native';
|
|
78
|
+
else if (flag === '--replay') replayFile = args[++i];
|
|
79
|
+
else if (flag.endsWith('.json') && !replayFile) replayFile = flag;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// The browser sends raw buffers and auxiliary passes only for native raytracing.
|
|
83
|
+
config.useRawFrames = renderConfigOverrides.denoiser === 'native' && renderConfigOverrides.raytraceEnabled === true;
|
|
84
|
+
config.exportAlbedoNormal = config.useRawFrames;
|
|
85
|
+
|
|
86
|
+
return { config, renderConfigOverrides, targetFile, replayFile, outputDir, outputFormat: defaults.outputFormat };
|
|
87
|
+
}
|