From 1700b7e2e37c3a6b0a080e5624f05ac2cd5b1edc Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Tue, 29 Sep 2026 11:28:52 -0500 Subject: [PATCH] feat(dashboard): pick processing options for Make again; compare them on the UGC page The UGC page's Make again buttons (a model's, the failed ones, everything) use the ray tracer, hidden-face method and denoising picked next to them (the settings' when left alone). The List view's new Options column shows what made each model and what its next make will use; "Processing options compared" shows every combination the made models used with its makes, models and the average time, CPU time, hidden faces', occlusion's and icon's time and share of triangles removed per make. Check: the three selects next to Make again (models only); make a model again with embree fast and see its Options column and the comparison table. Co-Authored-By: Claude Opus 5.5 --- dDashboardServer/static/js/ugc.js | 39 +++++++++++++++++++++++++-- dDashboardServer/templates/ugc.jinja2 | 22 +++++++++++++-- 2 files changed, 57 insertions(+), 4 deletions(-) diff --git a/dDashboardServer/static/js/ugc.js b/dDashboardServer/static/js/ugc.js index 0f9d95d13..4ab1828e0 100644 --- a/dDashboardServer/static/js/ugc.js +++ b/dDashboardServer/static/js/ugc.js @@ -125,10 +125,14 @@ if (!i.processMs) return ''; return 'took ' + duration(i.processMs) + (i.processCpuMs ? ', CPU ' + duration(i.processCpuMs) : '') + (i.processMemoryKb ? ', ~' + megabytes(i.processMemoryKb) + ' RAM (est.)' : ''); } - // When it was made and what that cost (the cost is only known for makes since it was recorded) + // When it was made and what that cost (the cost is only known for makes since it was recorded), and with what function madeText(i) { if (!i.processedAt) return ''; - return fmt.unix(i.processedAt) + (costText(i) ? ' \u00b7 ' + costText(i) : ''); + return fmt.unix(i.processedAt) + (costText(i) ? ' \u00b7 ' + costText(i) : '') + (i.madeOptions ? ' \u00b7 with ' + i.madeOptions : ''); + } + // The processing options picked for Make again (ray tracer, hidden faces, denoise), as /api/ugc/reprocess takes them + function remakeOptions() { + return ['optRays', 'optHsr', 'optDenoise'].map(function (x) { return $(x).value; }).filter(Boolean).join(' '); } // A model's file as the player named it: its name with the upload's extension (".lxfml"), else the upload's name function fileName(i) { @@ -178,6 +182,10 @@ return badge(i.state) + (i.attempts ? ' ' + esc(i.attempts) + ' attempt' + (i.attempts === 1 ? '' : 's') + '' : '') + waitBadge(i); }) ].concat(madeColumns(), [ + column('Options', function (i) { + return '' + esc(i.madeOptions || '') + '' + + (i.processOptions ? '
next: ' + esc(i.processOptions) + '
' : ''); + }), column('Saved', function (i) { if (!i.trianglesBefore) return ''; var removed = i.trianglesBefore - i.triangles, share = removed / i.trianglesBefore * 100; @@ -256,6 +264,7 @@ b.textContent = (b.dataset.kind === 'modular' ? 'Cars and rockets' : 'Models') + (count === null || count === undefined ? '' : ' (' + Number(count).toLocaleString() + ')'); }); $('manageButtons').classList.toggle('d-none', !canManage); + $('remakeOptions').classList.toggle('d-none', list.kind !== 'model'); $('cacheCard').classList.toggle('d-none', !canManage); $('counts').innerHTML = countCard('Models', d.counts.model) + countCard('Cars and rockets (builds)', d.counts.modular) + (d.totals ? totalsCard('Models', d.totals.model) + totalsCard('Cars and rockets', d.totals.modular) : ''); @@ -366,6 +375,7 @@ function remake(body, question) { if (question && !confirm(question)) return; body.kind = list.kind; + if (list.kind === 'model' && remakeOptions()) body.options = remakeOptions(); api.post('/api/ugc/reprocess', body).then(function (d) { if (!d.success) { toast(d.error || 'Failed', 'danger'); return; } toast(d.message, 'success'); @@ -715,6 +725,31 @@ } loadPresets(); + // ---- processing options: Make again's choices and the comparison of what made the models ---- + + var OPTION_LABELS = { builtin: 'Built in', embree: 'Embree (CPU)', hiprt: 'HIPRT (GPU)', toolbox: 'LU Toolbox (paths)', fast: 'Fast (renders)', off: 'Off', oidn: 'Open Image Denoise' }; + function loadOptions() { + return api.get('/api/ugc/options').then(function (d) { + if (!d.success) throw new Error(d.error || 'Failed'); + [['optRays', 'rays', 'Ray tracer'], ['optHsr', 'hsr', 'Hidden faces'], ['optDenoise', 'denoise', 'Denoise']].forEach(function (x) { + var select = $(x[0]), chosen = select.value; + select.innerHTML = '' + + d.choices[x[1]].map(function (name) { return ''; }).join(''); + select.value = chosen; + }); + var ms = function (v) { return v ? esc(duration(v)) : ''; }; + $('optionsTable').querySelector('tbody').innerHTML = d.combinations.length ? d.combinations.map(function (c) { + return '' + esc(c.options) + '' + esc(c.runs.toLocaleString()) + '' + esc(c.models.toLocaleString()) + '' + ms(c.ms) + + '' + ms(c.cpuMs) + '' + ms(c.hsrMs) + '' + ms(c.aoMs) + '' + ms(c.iconMs) + '' + esc(c.bricks) + '' + esc((c.removed * 100).toFixed(1)) + '%'; + }).join('') : 'No model made since the options were recorded.'; + }).catch(function (e) { + $('optionsTable').querySelector('tbody').innerHTML = 'Could not load the options: ' + esc(e.message) + ''; + }); + } + loadOptions(); + $('optionsCard').addEventListener('toggle', function () { if (this.open) loadOptions(); }); + if (window.Live) Live.on('ugc', load); var linked = readUrl(); diff --git a/dDashboardServer/templates/ugc.jinja2 b/dDashboardServer/templates/ugc.jinja2 index 710e47566..f5be691cf 100644 --- a/dDashboardServer/templates/ugc.jinja2 +++ b/dDashboardServer/templates/ugc.jinja2 @@ -32,6 +32,19 @@ +
+ Processing options compared +
+

The ways of making models to compare: the ray tracer (built in, Embree on the CPU, HIPRT on the GPU), how + hidden faces are found (LU Toolbox's paths, or fast renders from around the model) and denoising of icons. The settings pick the + defaults; Make again can use others for a make (the options next to it, or /reprocessproperty embree fast in game). + Every make is counted under what made it: the averages per make below, each model's in the List view's Options column.

+
+ +
OptionsMakesModelsTookCPUHidden facesOcclusionIconBricksTriangles removed
Loading…
+
+
+
Stored files: delete and purge
@@ -67,7 +80,12 @@
-
+
+ + + + +
@@ -76,7 +94,7 @@
-
IconIDOwnerStateMadeTookCPURAM (est.)SavedSizeFileWhere
+ IconIDOwnerStateMadeTookCPURAM (est.)OptionsSavedSizeFileWhere
IconIDOwnerStateMadeTookCPURAM (est.)SizeFileWhere