feat(ugc): processing options per make, recorded per model with their times

Staff can make models again with other processing options than the UGC
settings' (ray backend, hidden-face method, denoising) and every make records
what made it, for comparing the options.

- migration mysql 99 / sqlite 82 (ugc_process_options): ugc.process_options
  (picked for the next make, cleared once made), ugc.made_options (what made
  the current files) and ugc_process_runs (every successful make: options,
  wall and CPU time, hidden faces', occlusion's and icon's time, bricks,
  triangles before and after)
- IUgc: ResetUgcModelProcessing and ResetPropertyUgcModelProcessing take the
  options; PendingModel carries them; RecordUgcModelRun, GetUgcRunSummaries;
  list entries have madeOptions and processOptions
- the UGC server applies a job's options over its settings and records the run
- /api/ugc/reprocess takes options ("embree fast oidn"); /api/ugc/options
  lists the choices, the settings' defaults and averages per combination
- /reprocessproperty [builtin|embree|hiprt] [toolbox|fast] [off|oidn], any
  order, all optional

Check: run the migration on MySQL and SQLite; /reprocessproperty embree fast
on a property, then the models' made_options and ugc_process_runs rows;
/api/ugc/options.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Aaron Kimbrell
2026-09-29 11:28:52 -05:00
parent 06be40471b
commit ef3c74f715
22 changed files with 290 additions and 58 deletions

View File

@@ -1,5 +1,6 @@
#include "DEVGMCommands.h"
#include "UgcKeys.h"
#include "UgcManifest.h"
#include "PropertyManagementComponent.h"
#include "MasterPackets.h"
@@ -1989,12 +1990,19 @@ namespace DEVGMCommands {
ChatPackets::SendSystemMessage(sysAddr, u"You aren't on a property.");
return;
}
const auto queued = UgcManifest::ReprocessProperty(property->GetId());
// Optional processing options for this make: ray backend, hidden-face method, denoising, in any order
UgcProcessOptions::Choice choice;
if (!UgcProcessOptions::Parse(args, choice)) {
ChatPackets::SendSystemMessage(sysAddr, u"Usage: /reprocessproperty [builtin|embree|hiprt] [toolbox|fast] [off|oidn] (left out: the UGC settings')");
return;
}
const auto options = UgcProcessOptions::ToString(choice);
const auto queued = UgcManifest::ReprocessProperty(property->GetId(), options);
if (queued == 0) {
ChatPackets::SendSystemMessage(sysAddr, u"This property has no brick built models.");
return;
}
ChatPackets::SendSystemMessage(sysAddr, GeneralUtils::UTF8ToUTF16("Making " + std::to_string(queued) +
" model(s) again. Everyone on the property is reloaded when they're made."));
ChatPackets::SendSystemMessage(sysAddr, GeneralUtils::UTF8ToUTF16("Making " + std::to_string(queued) + " model(s) again" +
(options.empty() ? "" : " with " + options) + ". Everyone on the property is reloaded when they're made."));
}
};