64 lines
4.0 KiB
JavaScript
64 lines
4.0 KiB
JavaScript
const { chromium } = require('C:/Users/phenom/.cache/codex-runtimes/codex-primary-runtime/dependencies/node/node_modules/playwright');
|
|
const fs = require('node:fs');
|
|
const path = require('node:path');
|
|
const output = path.resolve('artifacts/playtest/rom-deep-review/water-screen-effects');
|
|
|
|
(async () => {
|
|
const { createServer } = await import('vite');
|
|
const server = await createServer({ configFile: false, publicDir: 'public',
|
|
cacheDir: path.join(output, '.vite'),
|
|
optimizeDeps: { entries: ['scripts/runewaker-pipeline/environment-preview.html'] },
|
|
server: { host: '127.0.0.1', port: 0, strictPort: true, watch: null } });
|
|
await server.listen();
|
|
const browser = await chromium.launch({ channel: 'msedge', headless: true });
|
|
const results = [];
|
|
try {
|
|
for (const staged of [false, true]) {
|
|
const page = await browser.newPage({ viewport: { width: 1600, height: 1000 } });
|
|
const errors = [];
|
|
page.on('pageerror', error => errors.push(error.message));
|
|
page.on('console', message => { if (message.type() === 'error') errors.push(message.text()); });
|
|
await page.route('**/favicon.ico', route => route.fulfill({ status: 204 }));
|
|
const baseline = path.join(output, 'pre-promotion-backup/src/assets/game/dungeons/the-origin/the-origin-visual.glb');
|
|
const asset = staged ? path.join(output, 'shipping-the-origin-visual.glb') : baseline;
|
|
if (staged || fs.existsSync(baseline)) await page.route('**/src/assets/game/dungeons/the-origin/the-origin-visual.glb',
|
|
route => route.fulfill({ path: asset, contentType: 'model/gltf-binary' }));
|
|
await page.goto(`http://127.0.0.1:${server.httpServer.address().port}/scripts/runewaker-pipeline/environment-preview.html?dungeon=the-origin`, { waitUntil: 'commit' });
|
|
await page.waitForFunction(() => window.romEnvironmentReview?.ready, null, { timeout: 180000 });
|
|
const waterPoint = [-219.8775686, -21.5003624, 182.7898102];
|
|
await page.evaluate(target => window.romEnvironmentReview.inspectAt(
|
|
[target[0] + 5, target[1] + 3, target[2] + 5], target), waterPoint);
|
|
await page.waitForTimeout(1600);
|
|
await page.evaluate(() => window.romEnvironmentReview.resetFrameSample());
|
|
await page.waitForTimeout(4000);
|
|
const diagnostics = await page.evaluate(() => ({
|
|
performance: window.romEnvironmentReview.frameSample(),
|
|
water: window.romEnvironmentReview.waterDiagnostics(),
|
|
center: window.romEnvironmentReview.raycastAt(innerWidth / 2, innerHeight / 2, 4),
|
|
drawCalls: window.romEnvironmentReview.drawCalls(),
|
|
}));
|
|
const file = `exposed-water-${staged ? 'reflection' : 'baseline'}.png`;
|
|
await page.screenshot({ path: path.join(output, file) });
|
|
await page.evaluate(target => window.romEnvironmentReview.inspectAt(
|
|
[target[0] + 5, target[1] + 0.7, target[2] + 12], [target[0] - 5, target[1], target[2] - 7]), waterPoint);
|
|
await page.waitForTimeout(1200);
|
|
const glancing = `glancing-water-${staged ? 'reflection' : 'baseline'}.png`;
|
|
await page.screenshot({ path: path.join(output, glancing) });
|
|
const glancingDiagnostics = await page.evaluate(() => ({
|
|
water: window.romEnvironmentReview.waterDiagnostics(),
|
|
center: window.romEnvironmentReview.raycastAt(innerWidth / 2, innerHeight / 2, 4),
|
|
}));
|
|
results.push({ staged, screenshot: file, glancing, glancingDiagnostics, errors, ...diagnostics });
|
|
console.log(JSON.stringify({ staged, errors, fps: diagnostics.performance.fps,
|
|
ready: diagnostics.water.filter(layer => layer.screenEffectsReady).length,
|
|
planes: new Set(diagnostics.water.map(layer => layer.reflection).filter(Boolean)).size }));
|
|
await page.close();
|
|
}
|
|
} finally {
|
|
await browser.close();
|
|
await server.close();
|
|
fs.writeFileSync(path.join(output, 'browser-proof.json'), JSON.stringify(results, null, 2) + '\n');
|
|
}
|
|
if (results.some(result => result.errors.length)) process.exitCode = 1;
|
|
})().catch(error => { console.error(error); process.exitCode = 1; });
|