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:
parent
387734e68f
commit
205e266b4b
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user