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

hob parser: parse header/grey area to find faces

This commit is contained in:
dpethes 2014-10-10 08:14:54 +02:00
parent 387734e68f
commit 205e266b4b

View File

@ -11,10 +11,13 @@ type
dw1: integer; dw1: integer;
b1, b2, b3: byte; b1, b2, b3: byte;
bsize: byte; bsize: byte;
ftype: byte; //3 - tri, 4 - quad
tex_index: word;
indices: array[0..3] of word; indices: array[0..3] of word;
end; end;
THobFile = record THobFile = record
name: array[0..15] of byte;
face_block_offset: integer; face_block_offset: integer;
face_count: integer; face_count: integer;
faces: array of THobFace; faces: array of THobFace;
@ -29,38 +32,64 @@ function ParseHobFile(const fname: string): THobFile;
//************************************************************************************************** //**************************************************************************************************
implementation implementation
function NameToString(name: array of byte): string;
var
i: Integer;
begin
result := '';
for i := 0 to length(name) - 1 do begin
if name[i] = 0 then break;
result += char( name[i] );
end;
end;
procedure ReadFaces(var hob: THobFile; var f: TMemoryStream); procedure ReadFaces(var hob: THobFile; var f: TMemoryStream);
var var
face_count: integer; face_count: integer;
i, k: integer; i, k: integer;
face: THobFace; face: THobFace;
unknown: integer;
file_pos: integer;
begin begin
face_count := hob.face_count; face_count := hob.face_count;
SetLength(hob.faces, face_count); SetLength(hob.faces, face_count);
for i := 0 to face_count - 1 do begin for i := 0 to face_count - 1 do begin
file_pos := f.Position;
face.dw1 := f.ReadDWord; //? face.dw1 := f.ReadDWord; //?
face.b1 := f.ReadByte; //46/49/4B face.b1 := f.ReadByte; //46/49/4B
face.b2 := f.ReadByte; //51/71 face.b2 := f.ReadByte; //51/71
face.b3 := f.ReadByte; //0C face.b3 := f.ReadByte; //0C
face.bsize := f.ReadByte * 4; //block size: A = 40B, 9 = 36 face.bsize := f.ReadByte * 4; //block size: A = 40B, 9 = 36
if face.bsize = 36 then
face.ftype := 3
else
face.ftype := 4;
write(face.dw1:8, face.b1:3, face.b2:3, face.b3:3, face.bsize:3); write(face.dw1:8, face.b1:3, face.b2:3, face.b3:3, face.bsize:3);
write(f.ReadWord:4);
write(f.ReadWord:4); unknown := f.ReadWord;
// f.ReadWord; //? if (unknown <> 0) then
// f.ReadWord; //increasing after 4 faces? writeln('unusual file: unknown');
//12B
face.tex_index := f.ReadWord;
write(' ti: ', face.tex_index);
//read vertex indices
write(' coords: ');
for k := 0 to 3 do begin for k := 0 to 3 do begin
face.indices[k] := f.ReadWord; face.indices[k] := f.ReadWord;
write(face.indices[k]:4, '-'); write(face.indices[k]:4);
end; end;
//20B
for k := 0 to face.bsize - 20 - 1 do begin //read rest of the face block
write(f.ReadByte:3, ','); write(' rest: ');
for k := f.Position to file_pos + face.bsize - 1 do begin
write(f.ReadByte: 4);
end; end;
hob.faces[i] := face; hob.faces[i] := face;
writeln; writeln;
Flush(stdout);
end; end;
end; end;
@ -71,14 +100,33 @@ var
hob: THobFile; hob: THobFile;
i: integer; i: integer;
vertex_count: integer; vertex_count: integer;
obj_count, face_block_offset: integer;
meshdef_offset: integer;
unknown: integer;
begin begin
f := TMemoryStream.Create; f := TMemoryStream.Create;
f.LoadFromFile(fname); f.LoadFromFile(fname);
obj_count := f.ReadDWord;
unknown := f.ReadDWord; //sometimes face block start
f.ReadBuffer(hob.name, 16);
writeln(NameToString(hob.name));
writeln('objects: ', obj_count);
meshdef_offset := f.ReadDWord;
f.Seek(meshdef_offset + 16, fsFromBeginning); //16B zero
meshdef_offset := f.ReadDWord;
f.Seek(meshdef_offset + 32, fsFromBeginning); //32B zero
face_block_offset := f.ReadDWord;
//faces //faces
f.Seek(428, fsFromBeginning); //faceblock start f.Seek(face_block_offset + 8, fsFromBeginning); //faceblock start
{ {
bark_moon: 400
428 - 1ky.hob 428 - 1ky.hob
trooper: 840
1604 - hvyshut 1604 - hvyshut
prbdroid: 756 prbdroid: 756
wmvwng: 1648 wmvwng: 1648
@ -87,6 +135,7 @@ begin
hob.face_block_offset := f.ReadDWord; //filepos + 4 hob.face_block_offset := f.ReadDWord; //filepos + 4
hob.face_count := f.ReadDWord; //face count hob.face_count := f.ReadDWord; //face count
ReadFaces(hob, f); ReadFaces(hob, f);
writeln('filepos: ', f.Position);
//vertices //vertices
vertex_count := (f.Size - f.Position) div 8; vertex_count := (f.Size - f.Position) div 8;
@ -98,6 +147,7 @@ begin
hob.vertices[i].unknown := f.ReadWord; hob.vertices[i].unknown := f.ReadWord;
end; end;
hob.vertex_count := vertex_count; hob.vertex_count := vertex_count;
writeln('vertex_count: ', vertex_count);
f.Free; f.Free;
result := hob; result := hob;