mirror of
https://github.com/dpethes/rerogue.git
synced 2025-06-07 18:58:32 +02:00
hob parser: improve facegroups seeking
This commit is contained in:
parent
acf9b6ebca
commit
5f714ceef5
@ -65,7 +65,7 @@ function ParseHobFile(const fname: string): THobFile;
|
|||||||
implementation
|
implementation
|
||||||
|
|
||||||
const
|
const
|
||||||
DumpFaces = false;
|
DumpFaces = true;
|
||||||
|
|
||||||
function NameToString(name: array of byte): string;
|
function NameToString(name: array of byte): string;
|
||||||
var
|
var
|
||||||
@ -88,15 +88,15 @@ const
|
|||||||
var
|
var
|
||||||
i, k: integer;
|
i, k: integer;
|
||||||
face: THobFace;
|
face: THobFace;
|
||||||
unknown: integer;
|
zero: integer;
|
||||||
file_pos: integer;
|
file_pos: integer;
|
||||||
color: integer;
|
color: integer;
|
||||||
begin
|
begin
|
||||||
unknown := f.ReadDWord;
|
zero := f.ReadDWord;
|
||||||
if (unknown <> 0) then
|
if (zero <> 0) then
|
||||||
writeln('unusual file: zero');
|
writeln('unusual file: zero');
|
||||||
unknown := f.ReadDWord;
|
zero := f.ReadDWord;
|
||||||
if (unknown <> 0) then
|
if (zero <> 0) then
|
||||||
writeln('unusual file: zero');
|
writeln('unusual file: zero');
|
||||||
file_pos := f.ReadDWord;
|
file_pos := f.ReadDWord;
|
||||||
if file_pos <> f.Position + 4 then
|
if file_pos <> f.Position + 4 then
|
||||||
@ -107,14 +107,13 @@ begin
|
|||||||
SetLength(group.faces, group.face_count);
|
SetLength(group.faces, group.face_count);
|
||||||
for i := 0 to group.face_count - 1 do begin
|
for i := 0 to group.face_count - 1 do begin
|
||||||
file_pos := f.Position;
|
file_pos := f.Position;
|
||||||
face.flags := f.ReadDWord; //?
|
face.flags := 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
|
||||||
|
zero := f.ReadWord;
|
||||||
unknown := f.ReadWord;
|
if (zero <> 0) then
|
||||||
if (unknown <> 0) then
|
|
||||||
writeln('unusual file: face header separator');
|
writeln('unusual file: face header separator');
|
||||||
|
|
||||||
//material index
|
//material index
|
||||||
@ -212,7 +211,7 @@ begin
|
|||||||
//read group/meshdef0
|
//read group/meshdef0
|
||||||
f.Seek(16, fsFromCurrent); //unknown
|
f.Seek(16, fsFromCurrent); //unknown
|
||||||
fg.meshdef1_offset := f.ReadDWord;
|
fg.meshdef1_offset := f.ReadDWord;
|
||||||
writeln('fg meshdef offset:', fg.meshdef1_offset);
|
writeln('fg meshdef1 offset:', fg.meshdef1_offset);
|
||||||
|
|
||||||
if fg.meshdef1_offset > 0 then begin
|
if fg.meshdef1_offset > 0 then begin
|
||||||
//read meshdef1
|
//read meshdef1
|
||||||
@ -234,14 +233,14 @@ begin
|
|||||||
f.Seek(fg.vertex_block_offset, fsFromBeginning);
|
f.Seek(fg.vertex_block_offset, fsFromBeginning);
|
||||||
ReadVertices(fg, f, fg.vertex_count);
|
ReadVertices(fg, f, fg.vertex_count);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
f.Seek(filepos + 132, fsFromBeginning);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure ReadObject(var mesh: THobObject; var f: TMemoryStream);
|
procedure ReadObject(var mesh: THobObject; var f: TMemoryStream);
|
||||||
var
|
var
|
||||||
i: integer;
|
i: integer;
|
||||||
|
fg_offsets: array of integer;
|
||||||
|
unknown: integer;
|
||||||
begin
|
begin
|
||||||
f.ReadBuffer(mesh.name, 16);
|
f.ReadBuffer(mesh.name, 16);
|
||||||
mesh.face_group_offset := f.ReadDWord;
|
mesh.face_group_offset := f.ReadDWord;
|
||||||
@ -259,10 +258,17 @@ begin
|
|||||||
writeln('facegroup counts don''t match!: ', mesh.face_group_count, mesh.face_group_count0:5);
|
writeln('facegroup counts don''t match!: ', mesh.face_group_count, mesh.face_group_count0:5);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
SetLength(fg_offsets, mesh.face_group_count);
|
||||||
|
for i := 0 to mesh.face_group_count - 1 do begin
|
||||||
|
unknown := f.ReadDWord;
|
||||||
|
fg_offsets[i] := f.ReadDWord;
|
||||||
|
end;
|
||||||
|
|
||||||
//read face group defs
|
//read face group defs
|
||||||
SetLength(mesh.face_groups, mesh.face_group_count);
|
SetLength(mesh.face_groups, mesh.face_group_count);
|
||||||
f.Seek(mesh.face_group_offset, fsFromBeginning);
|
|
||||||
for i := 0 to mesh.face_group_count - 1 do begin
|
for i := 0 to mesh.face_group_count - 1 do begin
|
||||||
|
writeln('fg meshdef0 offset: ', fg_offsets[i], IntToHex(fg_offsets[i], 8):9);
|
||||||
|
f.Seek(fg_offsets[i], fsFromBeginning);
|
||||||
ReadFaceGroup(mesh.face_groups[i], f);
|
ReadFaceGroup(mesh.face_groups[i], f);
|
||||||
end;
|
end;
|
||||||
writeln;
|
writeln;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user