Commit Graph
80 Commits
Author SHA1 Message Date
irrlichtandClaude Opus 5 b3d08d4a8c Testscene aktiv, Cinema Room stillgelegt
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 09:30:57 +02:00
irrlichtandClaude Opus 5 8ddbd6f514 Outline-Pass: Kanten aus dem G-Buffer
Erster Effekt, der das Bild verändert. Gesucht werden Kanten der
Geometrie, nicht des Bildes — auf dem fertigen Bild zu suchen wäre
falsch, weil der Dither Flächen in Muster zerlegt und jede Texturkante
als Kante zählte. Drei unabhängige Signale, genommen wird das stärkste:
Tiefe (Silhouetten) und Normale (Knicke) über einen 3x3-Sobel, die
Objekt-ID über einen Vergleich mit den direkten Nachbarn. Läuft vor
dither, damit die Linie mitquantisiert wird wie alles andere.

Zwei Vorarbeiten, die nur für diesen Pass existieren und deshalb hier
mit drinstehen:

Der Post-Vertrag bekommt group 2 mit Uniforms (inv_res, near, far,
time). Das räumt near/far aus normals.wgsl heraus, wo ich sie als
Literale abgeschrieben hatte — der Debug-View hätte stillschweigend
gelogen, sobald jemand die Projektion ändert, ausgerechnet das
Werkzeug, dem man beim Debuggen glauben muss. Sie kommen jetzt aus
NEAR_FAR in gpu.rs, derselben Konstante wie die Projektion. time ist
Vorrat für animierte Effekte; jetzt mitgenommen, weil eine spätere
Vertragsänderung alle Bind-Group-Layouts anfasst.

Die Objektnummer füllt das reservierte Alpha des Normal-Buffers. Sie
läuft fortlaufend statt als Namens-Hash: benachbarte Nummern
unterscheiden sich damit garantiert, ein Hash hätte mit ~1/256 still
kollidiert. Mesh::append verschiebt die Nummern des Anhängsels, sonst
trügen die ersten Objekte zweier .glb dieselbe und die Kante zwischen
ihnen fehlte. Ab 1, damit die 0 "kein Objekt" heißt — der Outline-Pass
zeichnet auf dem Hintergrund nichts, sonst läge jede Silhouette
doppelt.

Nicht getrennt committet, weil Uniform und ID für sich nichts leisten:
vor diesem Pass liest sie niemand außer dem Debug-View.

Strichstärke geht über den Abtastabstand des Kernels (WIDTH, aktuell 2)
statt über nachträgliches Aufdicken — das kostet keinen zusätzlichen
Texturzugriff, wo Dilatation das Neunfache gebraucht hätte. Die
Gradienten werden durch den Abstand geteilt, damit die Schwellwerte
beim Breitenwechsel ihre Bedeutung behalten.

DEPTH_T und NORMAL_T sind aus der Kernel-Normierung hergeleitet, nicht
an der Szene erprobt; Fehlerbilder und Richtung stehen als Kommentar
daneben. normals.wgsl zeigt jetzt drei Bänder (Normale, ID, Tiefe).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 23:31:49 +02:00
irrlichtandClaude Opus 5 b9258a68fd G-Buffer: Normalen aus glTF bis in den Post-Vertrag
Cel-Ramp und ein Sobel, der auch Innenkanten findet, brauchen beide
Normalen — die gab es in der Pipeline bisher nirgends. Der Strang geht
quer durch alle Schichten, deshalb als eigener Schritt, bevor ein
Effekt darauf zugreift.

Loader: NORMAL wird gelesen und mit der Kofaktormatrix des 3x3-Teils
transformiert, nicht mit der Welt-Matrix. Das ist die inverse
Transponierte bis auf den Faktor det, den das Normieren frisst — nur so
bleibt eine Normale bei ungleichmäßiger Skalierung senkrecht auf ihrer
Fläche, und bei Spiegelungen dreht sie korrekt mit. glTF erlaubt Meshes
ohne NORMAL; die rechnet fill_missing_normals aus den angrenzenden
Flächen (Nullvektor als Sentinel). Beide Szenen-Modelle bringen eigene
Normalen mit, der Fallback ist reine Absicherung.

Szenen-Pass schreibt jetzt zwei Ziele: Albedo und n*0.5+0.5. Das Alpha
des Normal-Buffers ist für eine Objekt-ID reserviert und noch leer. Die
Depth-Textur bekommt TEXTURE_BINDING, und der Post-Vertrag wächst um
group 1 (Normale + Tiefe), die jeder Effekt ignorieren darf — dither
tut das.

Statt eines cel.wgsl-Durchreichers gibt es normals.wgsl, per Default
aus: `post normals on` zeigt oben die Normalen, unten die linearisierte
Tiefe. Ein Effekt, der nichts tut, wäre von einem kaputten nicht zu
unterscheiden; dieser hier trennt später "Loader kaputt" von "Effekt
kaputt".

Das Standard-Bild bleibt unverändert — die Normalen werden geschrieben,
aber von keinem aktiven Effekt gelesen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 23:31:49 +02:00
irrlichtandClaude Opus 5 7f87dbca35 Post-Effekt-Kette als Gerüst, Dither als erstes Glied
Bildweite Effekte gehören nicht in den Szenen-Shader. Cel-Ramp und
Sobel-Outline sollen dazukommen, ohne einander (oder scene.wgsl) zu
kennen — also eine Kette gleichrangiger Fullscreen-Pässe zwischen
Szene und Blit, Ping-Pong über zwei interne Targets.

Der Vertrag ist für alle gleich: Farbtextur rein (group 0/binding 0),
Farbe raus. Die Vertex-Stufe teilen sich alle über fullscreen.wgsl,
damit eine Effekt-Datei nur aus ihrem fs_main besteht. Ein neuer Effekt
ist eine .wgsl plus eine Zeile in EFFECTS. Bei 640×480 kostet ein
eigener Pass je Effekt praktisch nichts — deshalb kein Über-Shader.

Erster Bewohner ist die RGB555-Quantisierung samt Bayer-Dither, aus
scene.wgsl herausgelöst. Das UI zeichnet jetzt in einem eigenen Pass
hinter der Kette, sonst würde der Dither auch den Text quantisieren,
den er bisher nicht anfasst; damit braucht SpritePass kein
Tiefen-Attachment mehr.

Geschaltet wird über den exec-Trichter (`post`, `post <e> on|off`).
Die Namen kennt nur das Frontend: es meldet seine Kette beim Start in
engine::post an, wie render::audio seine Emitter aus engine::audio
zieht. Der Kern bekommt dadurch keine GPU zu sehen.

Das Bild soll unverändert bleiben — gleicher Bayer-Kernel, gleiche
Koordinaten, gleiche Reihenfolge relativ zum UI. Verifiziert sind
Tests, clippy und ein Start ohne Validation-Fehler; ein Pixelvergleich
steht aus.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 23:31:49 +02:00
irrlichtandClaude Opus 5 8bee8322c3 noclip gestrichen
Der Befehl war ein Toggle zwischen Play und Free — als getippter
Konsolen-Befehl die falsche Form (man sieht nicht, wohin er schaltet)
und deckungsgleich mit `mode play` / `mode free`. Keine Taste, kein
Menü-Knopf, keine Referenz in assets/ hing daran.

Damit stimmt auch die Doku von set_mode wieder: `menu` und die
SetMode-Action sind jetzt tatsächlich die einzigen Schreibpfade.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 23:31:49 +02:00
irrlicht a3ace75c81 Collider an Cinema Scene 2026-08-28 23:31:49 +02:00
irrlicht 87500e13da Dokumentation der Blender-Interaktion 2026-08-28 23:31:48 +02:00
irrlicht bf2cb25836 map builts 2026-08-28 23:31:48 +02:00
irrlicht 50b7b86944 refactor 2026-08-28 23:31:48 +02:00
irrlicht 3571106251 block slope sliding 2026-08-28 23:31:48 +02:00
irrlicht 075c49200e nails refferenzbilder 2026-07-16 20:37:43 +02:00
irrlichtandClaude Fable 5 01f299aa4f Hausputz: UV-Doppel-Flip raus, tga::load → Result, hide_object entfernt
UVs laufen jetzt durchgehend in glTF-/tga-Konvention (der Flip-Hin-und-
Zurück stammte vom gelöschten OBJ-Pfad). Kaputte Welt-Texturen fallen auf
den Platzhalter statt zu panicken. Player::eye() statt vierfacher
Augenpunkt-Rechnung. hide_object war ein irl3d-Demo-Relikt ohne
Konsument.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 20:37:18 +02:00
irrlichtandClaude Fable 5 31e1942870 Audio: WAV + tinyaudio, Ambient-Emitter mit Distance ramps; artist.md
engine/wav.rs (Decoder) und render/audio.rs (Mixer, 8 SFX-Voices +
Loop-Voice je Emitter) aus irl3d eingebettet; Emitter-Logik headless in
engine/audio.rs. Empties mit sound/radius-Property senden positional,
play_sound-Signale laufen als SFX über Session::take_sounds.
Platzhalter-Sounds + Emitter in der Testszene; artist.md fasst die
Content-Regeln für die Autorin zusammen.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 20:37:18 +02:00
irrlichtandClaude Fable 5 56d92cdb46 Map-Loader entfernt: glTF ist das einzige 3D-Format
engine/map.rs + render/brush.rs raus, Welt kommt komplett aus .glb.
Spawn via Empty mit role=spawn statt info_player_start; testscene.glb
(Boden, Wände, Spawn) ersetzt test.map.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 20:37:18 +02:00
irrlichtandClaude Fable 5 186ee9a817 640×480 (VGA) intern, UI auf EGA 8×14
Text-getrieben → 80-Spalten-Textmodus-Look; RGB555+Dither bleiben.
Menü-/Dialog-Metriken an die Fonthöhe angepasst, CGA bleibt fürs HUD.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 20:37:18 +02:00
irrlichtandClaude Fable 5 9db3929750 Collider via collide-Property + Quickhull, OBJ-Pfad entfernt
col_*-Namenspräfix raus: Rollen steuern nur noch Custom Properties
(collide=1 sichtbar+Collider, "proxy" unsichtbar, signal wie gehabt).
Collider sind die konvexe Hülle der Vertices — konkave Meshes erlaubt.
glb ist der einzige Modell-Pfad; suzanne.obj → suzanne.glb.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 20:37:18 +02:00
irrlichtandClaude Opus 4.8 f7bfdb4a0b Blender-Import-Pipeline: glTF/OBJ, col_*-Proxies, Trigger
Blender wird das Haupt-3D-Tool: zwei Loader (engine/gltf.rs für .glb als
Hauptpfad, engine/obj.rs aus irl3d eingebettet) liefern ein neutrales
engine/model.rs::Model. Loader sind reine Dekoder; das Frontend zieht sie
und schiebt das Ergebnis per Session::load_props in den State, der
Renderer baut sein Mesh (render/props.rs, verschmolzen mit der
Brush-Welt über eine geteilte Texturliste).

glTF trägt Blender-Custom-Properties (node.extras → Object::props) und
Empties (Nodes ohne Mesh) als Entity-Kanal. Namenskonvention: `col_*` =
unsichtbarer Collision-Proxy, aus dem collision::add_model konvexe
Ebenen-Sets baut (konvex-only, daher kein Default-Collider auf
Sichtgeometrie).

Trigger (engine/trigger.rs) hängen an der Custom Property `signal`:
mit Collider = Point-and-Click-Ziel (Session::pick raycastet aus der
Bildmitte, Treffer läuft durch den `use <name>`-Trichter), ohne Collider
= unsichtbare Betretens-Zone, die einmal je Eintritt feuert. Gefeuert
wird nur über Session::exec — der Eingabe-Trichter bleibt der einzige
Weg in den State.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 20:37:18 +02:00
irrlichtandClaude Opus 4.8 67c4a366c7 Ink: KV-Auto-Import und Crash-Härtung
sync_to_kv übernimmt jetzt alle im Skript deklarierten VARs in den
KV-Store (Auto-Import per Quelltext-Scan, da bladeink keine Enumeration
bietet); `_`-Prefix bleibt skript-lokal. So wandern Werte wie
snaks/favor_nails automatisch in per start_ink verkettete Folgeskripte.

cont()/choose() melden Ink-Runtime-Fehler nach stderr und beenden den
Dialog, statt zu panicken — ein auslaufender Skript-Pfad darf das
laufende Spiel nicht crashen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 20:37:18 +02:00
irrlicht c9e463bb9a Cleanup 2026-07-11 00:14:41 +02:00
irrlicht 87dd8e1190 changed test map 2026-07-01 00:32:05 +02:00
irrlicht 3bffb82560 added blender tutorial video 2026-07-01 00:32:05 +02:00
irrlicht f181bf4de9 Renamed Play State 2026-07-01 00:32:05 +02:00
irrlicht b10641ee3c Blender tutorial in sources 2026-06-25 22:22:05 +02:00
irrlicht fcdd8306d2 Deleted blend11 2026-06-24 23:13:39 +02:00
irrlicht 01fb83d05f Deleted blend11 2026-06-24 23:12:28 +02:00
irrlicht 9aebddde86 Changed Player start 2026-06-17 02:06:45 +02:00
irrlicht 8ae566d627 Teppich-Varianten eingebaut 2026-06-17 01:55:56 +02:00
irrlicht 949a076ec7 Mipmapping an den Texturen 2026-06-16 10:39:58 +02:00
irrlicht 14961d903b Testmap mit Stein 2026-06-16 09:49:11 +02:00
irrlicht ccac320e0e Sonderzeichen in person.ink ersetzt 2026-06-15 11:52:47 +02:00
irrlicht ff3e66ae3e Scan auf nicht-CP437-Zeichen in Ink-Buildscript 2026-06-15 11:51:53 +02:00
irrlicht 7c92f046a1 nicht-CP437-Zeichen ersetzt 2026-06-15 11:51:20 +02:00
irrlicht 9de6a0b5a9 Acute Accents zu Apostrophen-Zeichen 2026-06-15 11:44:47 +02:00
irrlicht 4603a64e10 Kommasetzung, wortstellung 2026-06-15 11:42:04 +02:00
irrlicht 36a172d07f Typos korrigiert 2026-06-15 11:35:29 +02:00
irrlicht cb85c94f56 Split cinema ink script into two 2026-06-15 11:17:21 +02:00
irrlicht 3ba7ef92ad Start Ink from Ink 2026-06-15 11:17:06 +02:00
irrlicht c326c363a0 Tiffany Signal 2026-06-15 10:39:30 +02:00
irrlicht 7543fe3cb7 Cinema Inkscript 2026-06-15 10:39:25 +02:00
irrlicht 93480150e5 Mode als Action 2026-06-15 09:46:13 +02:00
irrlicht 201d3be322 Ink-Script PDF in notes 2026-06-15 09:45:59 +02:00
irrlicht b6aca99d0c First Person controller nach Dialog 2026-06-15 09:41:02 +02:00
irrlicht 44f58bc9c2 First Person Cam im Menu 2026-06-15 09:40:51 +02:00
irrlicht 03c97ae3f2 Sammlung von Textur-Websites gestartet 2026-06-14 22:06:42 +02:00
irrlicht 836132b6ef TrenchBroom autosave aus Tracking entfernen 2026-06-14 22:06:11 +02:00
irrlicht 3a6ca792aa Änderungen an Testmap 2026-06-14 16:21:03 +02:00
irrlicht a8bfaaee36 First Person Controller 2026-06-14 16:20:47 +02:00
irrlicht 902da64588 Ignore TrenchBroom autosave 2026-06-14 15:38:58 +02:00
irrlicht e27eedb654 Neue Test-Szene 2026-06-14 14:51:23 +02:00
irrlicht a07e2e567f TrenchBroom autosave in Git-ignore 2026-06-13 22:46:19 +02:00
irrlicht 9cf23f8ad6 Wand Textur 2026-06-13 22:45:03 +02:00
irrlicht 04623ea226 Tunnel gebaut 2026-06-13 22:32:02 +02:00
irrlicht 983104a173 Initial Mode set to Menu 2026-06-13 21:05:07 +02:00
irrlicht 4f9a792dea Replaced Affine Texture mapping with Regular Texute Mapping 2026-06-13 20:42:18 +02:00
irrlicht a585dff09d Fixed double mouse lock logic 2026-06-13 20:42:18 +02:00
irrlicht d584e418f5 Menu als state im Mode-System 2026-06-13 20:42:18 +02:00
irrlicht a41d39cc78 Menu-Panel 2026-06-13 20:42:18 +02:00
irrlicht 3ac613cb58 Merge branch 'main' of https://git.bnd.wtf/irrlicht/wds.git 2026-06-13 18:54:49 +02:00
irrlicht ecccfddf7d Update test.txt 2026-06-13 18:53:18 +02:00
irrlicht 361fb72b27 Das ist ein weiterer Test 2026-06-13 18:50:40 +02:00
irrlicht bebdcf6049 Revert "removed test"
This reverts commit 07772f2093.
2026-06-13 18:48:56 +02:00
irrlicht 07772f2093 removed test 2026-06-13 18:48:10 +02:00
irrlicht 13c1683d5e test 2026-06-13 18:46:11 +02:00
irrlicht e20ca4f016 Signed-off-by: irrlicht <david@bernet.it> 2026-06-13 18:32:51 +02:00
irrlicht 6bb9b009c4 idk shitload of stuff 2026-06-13 18:18:17 +02:00
irrlicht 48c499e356 centralized state 2026-06-13 13:44:02 +02:00
irrlicht 0a8861a5b1 Window init 2026-06-13 03:16:59 +02:00
irrlicht 2dd338c890 Refactor 2026-06-13 02:57:22 +02:00
irrlicht 802f2bd34b Automatisches Ink-Build on Engine build 2026-06-13 02:48:04 +02:00
irrlicht d30ab97f13 Added inklecate to repo <3 2026-06-13 02:48:04 +02:00
irrlicht 7929e7349a Dialog Build-Script 2026-06-13 02:48:03 +02:00
irrlicht cdc27eccc3 Plan-Anpassung 2026-06-13 02:48:03 +02:00
irrlicht de853c22bb Actions statt Effects 2026-06-13 02:48:03 +02:00
irrlicht 1af93c897c Add signal command 2026-06-13 02:48:03 +02:00
irrlicht 97eff4f9eb Signal-System mit Inky und KV-Store 2026-06-13 02:48:03 +02:00
irrlicht ff80b3cc0f Plan für spätere Renderer-Implementierung 2026-06-13 02:48:03 +02:00
irrlicht 46494c29d9 README.md aktualisiert 2026-06-12 19:37:09 +00:00
irrlicht 3d4042ff9e Cargo init 2026-06-12 21:35:24 +02:00
irrlicht e9e18a88b9 README.md Startanweisungen 2026-06-12 19:33:30 +00:00
irrlicht 6bcabccfab Initial commit 2026-06-12 19:30:50 +00:00