BlueGit

golden-age paperdoll-renderer

Overview

Activity

NovDecJanFebMarAprMayJunJulAugSepOctNov

225 contributions in the last 12 months

LessMore

Commits, merge requests and comments.

paperdoll-renderer
README.md

Paperdoll Renderer

Desktopeditor voor .ppd-projecten, bone-gebonden equipment en geanimeerde 3D-preview, met productie-export naar paperdoll-maps.

Starten

Rust 1.96.0 staat in rust-toolchain.toml. Op Debian/Ubuntu gebruik je voor bouwen en het venster pkg-config, libxcb1-dev, libx11-dev, libxkbcommon-dev, libxkbcommon-x11-dev en libgl1-mesa-dev. De native filepicker gebruikt XDG Desktop Portal met een GTK/KDE-backend, of Zenity. Live 3D vereist OpenGL 3.3.

cargo run
cargo run -- "/pad met spaties/character.ppd"
cargo run -- --preview-fixture
cargo run -- --status

Project en bodies

Het startvenster biedt Project laden en Nieuw project, beide met een systeembestandkiezer. Nieuw project maakt character.ppd en de mappen assets/body/, assets/equipment/, presets/, cache/ en renders/. De CC0-testlichamen worden in assets/body/ voorbereid. --preview-fixture maakt een tijdelijk voorbeeldproject en opent de mannelijke body.

De eerste projectweergave toont de bodies. Kies man / Kies vrouw selecteert een model. Een extern bestand wordt naar de projectmap gekopieerd; bij een bestaande naam krijgt de kopie een eigen naam. Modellen met bijbestanden kun je met hun relatieve mappenstructuur in de projectmap zetten en daar selecteren. Importoverzicht toont meshes, materialen, textures, joints en clips van glTF/GLB, FBX en OBJ+MTL.

Open man / Open vrouw opent de body. Een geskind glTF/GLB-model is in de live preview zichtbaar:

  • Sleep om te orbiten. Vast renderkader tonen toont het gele orthografische exportkader; stel per man/vrouw Vaste renderhoogte, Centrum Y (beeldcentrum) en Pivot Y (orbitpunt) in en sla op. Zonder handmatige pivot gebruikt de editor de rustpose-nekhoogte (of een fallback met diagnose); Auto nek wist een handmatige override. Body en equipment delen exact dezelfde camera. Uitvinken geeft vrije perspectief-preview met scrollzoom; die zoom verandert de export niet. Een echte 24-bits depthbuffer houdt voorste oppervlakken vooraan.
  • Kies een animatieclip en gebruik Pauze / Speel.
  • Yaw − / Yaw + volgen twaalf hoeken van 30°; pitch -30 / 0 / 30 kiezen de hoogte. Yaw 0 kijkt naar de voorkant van de testlichamen (−Z).
  • Render alle hoeken rendert alle animaties × alle frames op project-fps × 36 hoeken. De preview wordt direct vervangen door iedere voltooide pass: highres → detail → target/diffuse → depth → normal → specular. Alle passes behouden hun aspect met gecentreerde letterboxing en nearest-neighbor weergave. Voortgang telt echte passes; Annuleer render behoudt geldige gedeeltelijke uitvoer. Live 3D keert terug naar het model; een volgende voltooide renderpass kan de preview weer vervangen.
  • Stel breedte, hoogte en fps in de Bodies-weergave in.

!Bodyweergave met animatie- en camerabediening

2D-preview

Vanuit Body of de bodyweergave opent 2D-preview de gerenderde compositor over voltooide schema-3 exportsets in renders/:

  • Kies Man / Vrouw. Alleen exportsets met dezelfde project-/rig-/exportcontract (CompatKey) zijn combineerbaar; equipment verschijnt als multiselect wanneer die contracten overeenkomen.
  • Kies een clip uit de body-exportinventaris. Speel / Pauze, snelheid en export-fps sturen een looping frame-tijd (elapsed × fps); ontbrekende maps/frames tonen een diagnose in plaats van een stille vervanging.
  • Yaw − / Yaw + wrappen over 0…330° (stap 30). Pitch − / Pitch + kiezen −30 / 0 / +30 met klemmen. Hoekwijzigingen behouden de animatietijd.
  • Houd Azimut / Elevatie ingedrukt voor continue lichtrotatie in °/s (delta-time); loslaten, focusverlies of pointer-annulering stopt de beweging. Azimut 0° is licht van voren (+Z); elevatie is geklemd. Belichting is alleen voor de preview; opgeslagen diffuse blijft unlit albedo.
  • Het samengestelde frame gebruikt nearest-neighbor weergave met uniforme schaal en gecentreerde letterboxing, gelijk aan de productie-passpreviews.
# Native GUI-smoke met schema-3 fixture-export (Xvfb)
cargo run --example preview2d_smoke --locked -- /tmp/preview2d-smoke

Equipment en opslaan

Vanuit een body opent Equipment de lijst. Kies een definitie of Nieuw.

1. Geef een unieke naam van maximaal 64 kleine letters/cijfers/-/_, zonder spaties; body is gereserveerd. 2. Kies Man / Vrouw voor het lichaam dat je bekijkt; Geldig voor bepaalt op welke geslachten het preset van toepassing is. 3. Onderdeel toevoegen (OBJ) opent de systeembestandkiezer. Rigide OBJ-onderdelen worden inclusief MTL en relatieve PNG-bijbestanden ingesloten. De preview gebruikt diffuse kleur/texture en alpha-cutout (grens 0,5). Bronbestanden mogen de modelmap niet verlaten. 4. Vouw Skeleton / botten uit en kies het doelbot. Stel relatieve positie XYZ en rotatie XYZ in graden in (Rz·Ry·Rx). Het onderdeel beweegt met dat bot tijdens walk/attack of een andere geïmporteerde bodyclip. Iedere sekse heeft een eigen botbinding; de numerieke offsets zijn gedeeld. 5. Kies shinymap (PNG) moduleert de instelbare glanssterkte. Wis shinymap keert terug naar een uniforme glanssterkte. Vul desgewenst Herkomst / licentie in. Meerdere onderdelen kunnen verschillende botten gebruiken. 6. Opslaan bewaart het project plus zelfbevattende binaire .ppe-snapshots in presets/ (geometrie, bronpayloads, materialen/textures, transformaties, bindingen, seksevlaggen en herkomst). Er worden geen bronpaden buiten het project nodig om die opnieuw te laden.

Preset importeren leest een .ppe uit bijvoorbeeld een ander project. Bij een andere rig moet je de botten opnieuw kiezen; er wordt niet stil geretarget. Onvolledige configuraties kunnen worden opgeslagen, maar onopgeloste onderdelen worden niet op een gegist bot getekend. Verwijder onderdeel haalt een onderdeel uit het werkpreset; Verwijder equipmentdefinitie haalt de definitie uit de projectlijst. Oude project-snapshots blijven voor herstel bewaard. Opslaan vereist een bestandssysteem met hardlinks; bij een fout wordt een bestaande snapshot niet overschreven.

Een preset is begrensd op 32 MiB, 32 onderdelen/bestanden en textures van maximaal 2048×2048. Een project heeft maximaal 64 presets en 64 MiB aan presetbestanden. De volledige containerbeschrijving staat in design.md.

# Zelfbevattend CC0-zwaardvoorbeeld in een nieuw tijdelijk project
cargo run --example equipment_fixture --locked

!Werkelijke equipment-editor met geanimeerd lichaam en handgebonden OBJ

Bij sluiten of Ander project / Nieuw project met wijzigingen kies je Opslaan, Niet opslaan of Annuleren. Als opslaan mislukt, blijft het project open. Annuleren in de bestandkiezer behoudt je huidige werk.

Productie-output

De bodyknop rendert alleen het lichaam; Render equipment alle hoeken in de equipment-editor rendert het geselecteerde preset, geanimeerd op het gekozen lichaam maar zonder body-occlusie of bodypixels. De vaste camera van dat geslacht blijft gelijk, ook als je in de live preview vrij hebt ingezoomd.

Per beeld worden alleen vier target-res PNGs opgeslagen: diffuse, normal, depth, specular. Diffuse is onbelichte albedo (basiskleur/texture × vertexkleur, alpha behouden), nooit ingebakken lighting/schaduw/glans. Depth is lineaire 16-bit grayscale+alpha met gemeenschappelijke near/far; normal is view-space RGB+alpha; specular is lineaire sterkte (body nul, equipment inclusief ingestelde shinymap). Highres en detail zijn uitsluitend zichtbare hulpstappen en worden niet opgeslagen.

renders/run-<tijd>-<pid>/male/body/clip001-walk/f000012/p-30_y330_diffuse.png

Ieder nieuw renderverzoek krijgt een eigen runmap; bestaande uitvoer wordt niet overschreven. render.json (schema 3) beschrijft projectidentiteit, bronfingerprints (SHA-256 van bodybestand en optioneel encoded equipment), camera/pivot/sample/materiaalcontract, clipinventaris en telling. Alleen complete.json (zelfde schema, met per-PNG SHA-256) betekent een volledige set. cancelled.json/failed.json markeren een gedeeltelijke run zonder compleet-marker. De bibliotheekmodule export_set opent uitsluitend voltooide runs met overeenkomende identiteit en geverifieerde checksums, en leest de echte RGBA8-/depth16-maps met strikte pad-/formaatvalidatie. De map-/camera-/pixelcontracten staan in design.md.

2D depth-compositor (bibliotheek)

De module compositor combineert een body-export met nul of meer compatibele equipment-exports (zelfde project-id, geslacht, body-fingerprint, target, fps, framing, near/far en clipinventaris via export_set). Per pixel wint het dichtstbijzijnde geldige oppervlak (depth gray dichterbij = kleiner; epsilon DEPTH_EPSILON_U16 = 1 depthcode; bij gelijke diepte wint de laagste laagindex — geef body eerst, daarna equipment op vaste naamvolgorde). Diffuse, normal en specular komen altijd uit dezelfde winnende laag. Soft alpha van die winnaar blijft behouden; verliezende lagen mixen niet mee (single-depth kan geen willekeurige doorschijnendheid reconstrueren).

relight past lineaire ambient + Lambert diffuse + Blinn-Phong specular toe. De lichtvektor staat al in view-space, gelijk aan de geëxporteerde normal maps; opgeslagen diffuse blijft elders onbelichte albedo.

use paperdoll_renderer::compositor::{assert_compatible, compose_and_relight, LayerMaps, Light};
use paperdoll_renderer::export_set::ExportRun;

let body = ExportRun::open(&body_run_dir)?;
let sword = ExportRun::open(&sword_run_dir)?;
assert_compatible(&[&body, &sword])?;
let layers = [
    LayerMaps::from_export_run(&body, "body", "clip000-walk", 0, 0, 0)?,
    LayerMaps::from_export_run(&sword, "sword", "clip000-walk", 0, 0, 0)?,
];
let (maps, lit_rgba) = compose_and_relight(&layers, &Light::default())?;

Highres is exact 8× beide assen; batch-targets zijn momenteel 1–256 pixels per as (highres max 2048). Grotere projectinstellingen geven een duidelijke renderfout, geen stil verkleinde supersampling. Maximaal 500000 PNGs / 16 GiB geschatte ongecomprimeerde targetdata per run; output vereist hardlinks. Productie rendert de eerste skinned glTF/GLB-mesh met driehoekprimitieven, basiskleur/8-bit albedotextures en vertexkleuren. FBX is alleen importoverzicht; morph targets, tangent-normaltextures, volledige PBR en willekeurige transparante lagen zijn niet ondersteund. Live placement blijft een belichte, vereenvoudigde weergave.

Openen met

  • Windows: start de uitgepakte .exe eenmaal om de editor voor het huidige account aan Openen met toe te voegen. Kies daarna bij een .ppd Openen met → Paperdoll Renderer (of selecteer de .exe via Bladeren).
  • Debian/Arch: de pakketten installeren de .ppd-MIME-koppeling, desktopstarter en iconen. Kies de editor in Openen met.
  • Linux AppImage/losse binary: bewaar het bestand op zijn vaste plek en voer "/pad/Paperdoll.AppImage" --install-desktop uit. Hiervoor zijn shared-mime-info en desktop-file-utils nodig. Daarna staat de editor in Openen met. Herhaal dit na verplaatsen van de AppImage.

Het venster, de Linux-starter en de Windows-executable gebruiken Tims applicatie-icoon.

Tests

cargo fmt --check
cargo check --workspace --all-targets --locked
cargo clippy --workspace --all-targets --locked -- -D warnings
cargo test --workspace --locked
# Linux GPU-regressie: echte depth-occlusie, normal/depth/specular en lichtonafhankelijke albedo
xvfb-run -a cargo run --example preview_depth_probe --locked

De testlichamen komen uit scripts/generate_test_bodies.py. Het FBX-testbestand wordt met Blender via scripts/convert_test_body_to_fbx.py gemaakt.