Files
DarkflameServer/resources/ugcconfig.ini
Aaron Kimbrell 2e2e8153e2 feat(ugc): denoise=oidn traces icons' occlusion per pixel and denoises it (optional build)
Intel Open Image Denoise 2 (Apache-2.0) behind the CMake option DLU_OIDN (off):
an installed OIDN is used when found, else Intel's release package (pinned by
hash) is downloaded and its libraries copied next to the servers.

A denoiser only removes noise that differs from pixel to pixel; the icons'
occlusion comes from the bake, per vertex, which it leaves as it is (checked:
white noise 0.17 -> 0.006 relative spread, per-vertex blocks unchanged). So
with denoise=oidn a model's icon is drawn from model.noao.nif (its colors
before the bake) with its occlusion traced per pixel of the supersampled image
(denoise_samples rays, default 4, with the bake's distance and strength and the
ray backend), box filtered and denoised at the icon's size, guided by the colors
and normals. The model keeps its baked occlusion. Icons drawn again from stored
files use the stored model.noao.nif the same way.

OIDN works on a thread of its own; its time is charged to the job's thread
(UgcThrottle::Charge), so the CPU budget and the recorded CPU time include it.

Check: configure with -DDLU_OIDN=ON; UgcServer --make-model x.lxfml out oidn
and compare its icon.png with one made with off; an OFF build leaves icons as
they were.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 12:29:08 -05:00

177 lines
9.9 KiB
INI

# UGC server: makes the meshes and icons of what players build and serves them to the game client.
# The master starts it when enable_ugc_server=1 (masterconfig.ini). See docs/UgcServer.md.
# HTTP port the game client downloads from (the client's UGCSERVERPORT)
port=2008
# The IP address to bind to. The game client has to reach it, so the default is every interface.
listen_ip=0.0.0.0
# UDP port for the connection to the master server (the next port is used too). It must not clash with another
# server's ports: auth uses 1500-1501, chat 2005-2006, the dashboard 2010-2011, worlds 3000 and up.
net_port=2012
# The client's UGCSERVERDIR: the path the downloads are under (the client adds /UGCC<DATACENTERID>/...)
client_path=/ugc
# Where the made files are kept (relative to the server binaries), and at most how much space they may take in MB.
# When there's more, the files used longest ago are deleted; they're made again when asked for. 0: no limit.
ugc_output_dir=ugc
ugc_max_storage_mb=2048
# Worker threads making files (0: half the CPU cores)
worker_threads=0
# How much of the machine making files may use (changes apply while running):
# max_cpu_percent: the workers together average at most this share of all CPU cores (0: no limit); they pause
# between bits of work to stay under it, long renders included.
# worker_nice: the workers' scheduling priority on Linux, 0 (normal) to 19 (only when nothing else wants the CPU).
# max_memory_mb: jobs whose estimated memory would go past this together wait for running ones to finish; a job
# bigger than it alone runs when nothing else does (0: no limit).
# max_model_bricks: models with more bricks fail with that reason instead of being made (0: no limit).
# pause_hours: local hours in which no new jobs start, e.g. 18-23 or 22-6 (empty: never).
max_cpu_percent=0
worker_nice=0
max_memory_mb=0
max_model_bricks=0
pause_hours=
# How often to look for models to make (milliseconds), how many to take at once, and how often a model may fail
# before it's given up on (the dashboard can try again)
poll_interval_ms=2000
poll_batch=32
max_attempts=3
# Models are made like LU Toolbox's Process Model and Bake Lighting make them; these default to its settings.
# color_palette: lu_toolbox (its LU palette, unknown colors black) or brickdb (the client's Materials.xml).
# color_variation: each brick's brightness is shifted by up to this percent (the same every time; 0: none).
# transparent_opacity: transparent bricks' opacity in percent.
# color_brightness: the models' colors in percent (not icons'; 100: as the palette has them, lower is darker).
# transparent_colors: color ids drawn transparent whatever Materials.xml says, comma separated (empty: the default, 129,
# the transparent glitter violet, which Materials.xml has opaque; none: no colors).
color_palette=lu_toolbox
color_variation=5
transparent_opacity=58.82
color_brightness=100
transparent_colors=129
# Levels of detail made, from the client's brickprimitives (0 most detailed, 2 least), and the distances they're
# drawn at (LU Toolbox picks each level's range from these by which levels are made; lod_cull: drawn up to).
lods=0,2
lod_distance_0=0
lod_distance_1=50
lod_distance_2=100
lod_distance_3=280
lod_cull=10000
# The shapes' shader number: S<shader>_Opaque_Model (transparent shapes are S01_Alpha_Model), and whether all
# transparent bricks are one shape (1) or each its own (0, so the client can sort them)
shader_opaque=01
combine_transparent=0
# Metal, glow and glitter colors in NiLODNodes of their own, drawn with the client's metal, emissive and animated UV
# shaders (the default).
# Not how live looked: live's models were all LEGO plastic (S01), which 0 (off) keeps, byte for byte.
# shader_metal: mapShaders id for metal colors (Materials.xml types in metal_material_types and LU Toolbox's metallic
# colors), S<id>_Metal_Model: 88 is Polished Metal.
# shader_brushed: for brushed steel colors (brushed_material_types; the client's Materials.xml has none): 89 is
# Brushed Steel.
# shader_glow: for opaque glowing colors (LU Toolbox's glow colors), with their plain color and an emissive material:
# 46 is LEGO-Emissive. Transparent glow stays with the transparent bricks.
# glow_emissive: the glow shapes' material emissive (how far the shader goes from lit to the plain color, 1 fully).
# *_material_types: Materials.xml MaterialTypes, comma separated (empty: the default, none: no types).
# Models already made keep their look until they're made again (the dashboard's Make everything again, or Reprocess).
shader_metal=88
shader_brushed=89
shader_glow=46
glow_emissive=1
metal_material_types=shinySteel
brushed_material_types=brushedSteel,matteSteel
# brushed_colors: LEGO color ids drawn as brushed steel whatever their type, comma separated (empty: the default, the
# drum lacquered 298,300,1002,1004; none: no colors)
brushed_colors=298,300,1002,1004
# shader_glitter: for glitter colors (glitter_material_types and glitter_colors), S<id>_Glitter_Model and, for
# transparent ones, S<id>_GlitterAlpha_Model: 21 is LEGO-AnimUV, which lays a white fleck texture stored in the .nif
# over the color (still: the client never updates a placed model). 0: off, glitter stays plastic.
# glitter_size: the fleck texture's tile in model units (a stud is 0.8); glitter_density: flecks in a tile;
# glitter_fleck_size: a fleck's diameter in model units (they are cm: 0.05 is half a millimetre, as LEGO's glitter);
# glitter_fleck_opacity: percent, the brightest flecks (each catches the light differently: most are dimmer).
# shader_glitter_sparkle: the glitter bricks' sparkles, S<id>_GlitterSparkle_Model over both glitter groups (only with
# shader_glitter). 79 is Distortion Directional (Ocean), whose texture layers the client moves every frame on its
# own: a sparkle flashes where two layers' sparkles meet. (Nothing else can move on a placed model: the client never
# updates its scene graph, so texture controllers in the .nif never run.) 0: no sparkles.
# glitter_sparkle_size: a sparkle's diameter in model units; glitter_sparkle_amount: percent of each moving layer
# covered (about its square's share of the brick sparkles at once); glitter_speed: how fast sparkles flash and go
# out (1: about half a second each, 0.1 to 4); glitter_sparkle_tint: percent of the brick's color the sparkles take;
# glitter_sparkle_brightness: percent.
# glitter_random: 1 places each brick's flecks its own way (turned and moved by the brick), 0 the same on every brick.
# glitter_colors: LEGO color ids that are glitter whatever their type (empty: the default, 114,117, which LEGO's color
# data calls glitter; none: no colors)
shader_glitter=21
glitter_material_types=glitter
glitter_colors=114,117
glitter_size=1.6
glitter_density=80
glitter_fleck_size=0.05
glitter_fleck_opacity=80
shader_glitter_sparkle=79
glitter_sparkle_size=0.1
glitter_sparkle_amount=5
glitter_speed=1
glitter_sparkle_tint=30
glitter_sparkle_brightness=100
glitter_random=1
# Satin (opal) colors stay transparent plastic (the client has no satin shader) but are made milky:
# satin_colors: color ids (empty: the default, LEGO's satin colors 360,362,363,364,365,366,367,376; none: off),
# satin_opacity: their transparent bricks' opacity in percent (instead of transparent_opacity),
# satin_whiten: how far their color goes towards white, in percent.
satin_colors=360,362,363,364,365,366,367,376
satin_opacity=75
satin_whiten=20
# Remove faces that can't be seen from anywhere, as LU Toolbox's Remove Hidden Faces: paths are traced from points on
# each opaque triangle, bouncing off the model; a triangle none of whose paths reaches the sky is removed.
# hsr_ground_plane: 1 also removes what can only be seen from below the model. hsr_samples: paths from each point.
# hsr_bounces: bounces a path may take. hsr_sample_spacing: distance between the points in LDD units (a stud is 0.8).
# hsr_min_points: points on a triangle at least, however small it is (LU Toolbox bakes 28 texels a triangle).
remove_hidden_faces=1
hsr_ground_plane=0
hsr_samples=8
hsr_bounces=8
hsr_sample_spacing=0.1143
hsr_min_points=28
# hsr_method: toolbox (LU Toolbox's paths, above) or fast (renders from 42 directions around the model, hsr_fast_resolution
# pixels square; much faster, but it also removes faces seen only by bounced light).
hsr_method=toolbox
hsr_fast_resolution=1024
# What traces the rays of the hidden faces' paths and of the occlusion: builtin, embree (Intel Embree on the CPU) or
# hiprt (the GPU, when built with DLU_HIPRT and the machine has one; else embree).
ray_backend=builtin
# denoise: off, or oidn (when built with DLU_OIDN; else off): a model's icon is drawn from its colors before the
# occlusion bake with its occlusion traced per pixel (denoise_samples rays from each pixel of the supersampled image)
# and denoised by Intel Open Image Denoise. The model keeps its baked occlusion.
denoise=off
denoise_samples=4
# Bake ambient occlusion into the vertex colors: rays per vertex, how far they look, strength 0 (none) to 1, and how
# much glowing colors add
bake_ao=1
ao_samples=64
ao_distance=5
ao_strength=1
glow_strength=6
# Icons: size in pixels. A player model's icon is drawn from its finished .nif (LOD 0), a car or rocket's from its
# modules' meshes put together.
icon_size=128
# How icons are framed and lit: icon_yaw, icon_pitch, icon_fov, icon_margin, icon_offset_x, icon_offset_y,
# icon_model_yaw, icon_model_pitch, icon_model_roll,
# icon_sun_yaw, icon_sun_pitch, icon_sun_light, icon_world_light, icon_fill, icon_specular, icon_shininess,
# icon_exposure, icon_contrast, icon_shadow_strength, icon_ao_strength. Their defaults (the framing from LU Toolbox's icon
# renderer, the light matched to the game's own model icons) and ranges are listed once in the server
# (UgcIconParams) and on the dashboard's settings page; set one here only to change it. The dashboard's icon editor
# also keeps presets for player models and each car or rocket type, and overrides for single items, in the database.