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