2
0
mirror of https://github.com/dpethes/rerogue.git synced 2025-06-07 18:58:32 +02:00
rerogue/hob_parser/hob_parser.pas

108 lines
2.5 KiB
ObjectPascal

unit hob_parser;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils;
type
THobFace = record
dw1: integer;
b1, b2, b3: byte;
bsize: byte;
indices: array[0..3] of word;
end;
THobFile = record
face_block_offset: integer;
face_count: integer;
faces: array of THobFace;
vertex_count: integer;
vertices: array of record
x, y, z, unknown: smallint; //+-2^15
end;
end;
function ParseHobFile(const fname: string): THobFile;
//**************************************************************************************************
implementation
procedure ReadFaces(var hob: THobFile; var f: TMemoryStream);
var
face_count: integer;
i, k: integer;
face: THobFace;
begin
face_count := hob.face_count;
SetLength(hob.faces, face_count);
for i := 0 to face_count - 1 do begin
face.dw1 := f.ReadDWord; //?
face.b1 := f.ReadByte; //46/49/4B
face.b2 := f.ReadByte; //51/71
face.b3 := f.ReadByte; //0C
face.bsize := f.ReadByte * 4; //block size: A = 40B, 9 = 36
write(face.dw1:8, face.b1:3, face.b2:3, face.b3:3, face.bsize:3);
write(f.ReadWord:4);
write(f.ReadWord:4);
// f.ReadWord; //?
// f.ReadWord; //increasing after 4 faces?
//12B
for k := 0 to 3 do begin
face.indices[k] := f.ReadWord;
write(face.indices[k]:4, '-');
end;
//20B
for k := 0 to face.bsize - 20 - 1 do begin
write(f.ReadByte:3, ',');
end;
hob.faces[i] := face;
writeln;
end;
end;
function ParseHobFile(const fname: string): THobFile;
var
f: TMemoryStream;
hob: THobFile;
i: integer;
vertex_count: integer;
begin
f := TMemoryStream.Create;
f.LoadFromFile(fname);
//faces
f.Seek(428, fsFromBeginning); //faceblock start
{
428 - 1ky.hob
1604 - hvyshut
prbdroid: 756
wmvwng: 1648
xwing: 18304
}
hob.face_block_offset := f.ReadDWord; //filepos + 4
hob.face_count := f.ReadDWord; //face count
ReadFaces(hob, f);
//vertices
vertex_count := (f.Size - f.Position) div 8;
SetLength(hob.vertices, vertex_count);
for i := 0 to vertex_count - 1 do begin
hob.vertices[i].x := f.ReadWord;
hob.vertices[i].y := f.ReadWord;
hob.vertices[i].z := f.ReadWord;
hob.vertices[i].unknown := f.ReadWord;
end;
hob.vertex_count := vertex_count;
f.Free;
result := hob;
end;
end.