Files
llamamod/notes/textures.md
T

2.7 KiB
Raw Blame History

TEXT-Chunk (Texturen)

Quelle: groove.exe FUN_004067b0 (Größenlauf), FUN_004071d0 → FUN_00406880 (Paletten), FUN_00406ab0 (Seiten), FUN_00406a10 (RLE), FUN_00406d30 (Texturliste), FUN_00406e40 (Texturanimationen), FUN_00407240/FUN_00408470 (Upload/Konvertierung). Werkzeug: tools/textchunk.py, tools/text_export.py. Parse + Neuaufbau ist für alle Level-WADs byte-identisch (auch der RLE-Encoder erzeugt exakt die Originaldaten).

Aufbau

u32 nPal                         (in allen WADs 0)
  nPal × { u32 id, u32 n, u16 farbe[n], u8 extra[n] }
u32 nSeiten                      (13–22 je Level, alle 256×256)
  nSeiten × { u32 flags, u32 w, u32 h, Daten }
     flags == 0     : w·h Byte (8 Bit, Palette)                – unbenutzt
     flags & 0x80   : u32 Länge, RLE16                          – alle Originalseiten
     sonst          : w·h u16 roh
u32 nTex                         (~180–1260)
  nTex × 8 Byte { u16 flags, u8 seite, u8 clut(0xff), u8 x0, u8 x1, u8 y0, u8 y1 }   (Kanten inklusive)
u32 nAnim
  nAnim × { u16 texIndex, u8 typ, Nutzdaten je typ }
     typ 1,2 : 3 Byte          typ 7,9 : u16,u16,u8,u8
     typ 8   : u8, u8 nFrames, u8, nFrames × u16 texIndex (Daumenkino)
     typ 10,11: u8,u8,u8,u8 n, n × u16 texIndex

RLE16: Folge von s16 n; n>0 → n Literal-u16; n<0 → nächstes u16 (−n)-mal.

Pixel

16 Bit PS1-Reihenfolge: Bits 0–4 R, 5–9 G, 10–14 B, Bit 15 = STP. 0x0000 = durchsichtig (Konverter schreibt 0 für Pixel 0, alles andere wird umgerechnet). STP=0 bei Farbe≠0 tritt auf Seiten mit Blendmodus auf (halbtransparente Pixel). Export: Alpha 0 = 0x0000, Alpha 128 = STP 0, Alpha 255 = STP 1.

Seiten-flags & 0x7f = Format/Blendklasse (Tabelle 0x570370, je 0x20 Byte): 1 = opak, 2 = eigener Konverter (0x409640), 3 = opak+Flag, 4/7 = Alpha (Blend 1), 5 = Blend 3, 6 = wie 1. (Modi 1/2/3 ≈ PS1-Halbtransparenz-Modi; Details offen.)

Texturliste

Faces der Modelle (TRAK/STPC, Face+8 u16) verweisen auf den Index in der Texturliste; Eintrag = Rechteck auf einer Seite. flags-Lowbyte 4/5/6/0xc6, Highbyte 1/4/17/20/36/… (Bedeutung offen; vermutl. Blend/Größenklasse). Fürs Ersetzen: Liste unverändert lassen und nur Pixel in den Seiten tauschen → keine Querverweise betroffen.

Export / Ersetzen

text_export.py export level.wad ordner      # pageNN_fXX.png + texinfo.txt (≈370 KB je Level)
text_export.py import level.wad ordner neu.wad

Import ändert nur Pixel, deren RGBA vom Export abweicht → unveränderte Seiten bleiben bitgenau. Größe muss 256×256 bleiben. Neue Seiten/Texturen anhängen ist möglich (nTex/nSeiten erhöhen), dann müssen aber Faces in TRAK/STPC die neuen Indizes verwenden.