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

hob: face group parsing

This commit is contained in:
dpethes 2017-01-29 19:32:35 +01:00
parent d104b606cd
commit 6decfb931d
2 changed files with 84 additions and 14 deletions

View File

@ -4,8 +4,8 @@ unit hob_mesh;
interface interface
uses uses
Classes, SysUtils, gl, Classes, SysUtils, gl, math, fgl,
fgl, GenericStructList, hob_parser, hmt_parser; GenericStructList, hob_parser, hmt_parser;
type type
TVertex = record TVertex = record
@ -36,6 +36,7 @@ type
points: boolean; points: boolean;
vcolors: boolean; vcolors: boolean;
textures: boolean; textures: boolean;
fg_to_draw: integer;
end; end;
{ TModel { TModel
@ -45,7 +46,7 @@ type
TModel = class TModel = class
private private
_vertices: TVertexList; _vertices: TVertexList;
_triangles: TTriangleList; _triangles: array of TTriangleList;
_materials: array of TMaterial; _materials: array of TMaterial;
_hmt: THmtFile; _hmt: THmtFile;
_hmt_loaded: boolean; _hmt_loaded: boolean;
@ -87,6 +88,10 @@ var
v: TVertex; v: TVertex;
group_vertices: TVertexList; group_vertices: TVertexList;
triangle: TTriangle; triangle: TTriangle;
fg_idx: integer;
tris: TTriangleList;
last_idx: integer;
tx, ty, tz: single;
function InitVertex(face: THobFace; offset: integer): TTriangle; function InitVertex(face: THobFace; offset: integer): TTriangle;
var var
@ -104,27 +109,42 @@ var
begin begin
group_vertices := TVertexList.Create; group_vertices := TVertexList.Create;
setlength(_triangles, Length(mesh.face_groups));
fg_idx := 0;
last_idx:=0;
for fg in mesh.face_groups do begin for fg in mesh.face_groups do begin
for i := 0 to fg.vertex_count - 1 do begin for i := 0 to fg.vertex_count - 1 do begin
v.x := FixRange(fg.vertices[i].x); v.x := FixRange(fg.vertices[i].x);
v.y := FixRange(fg.vertices[i].y); v.y := FixRange(fg.vertices[i].y);
v.z := FixRange(fg.vertices[i].z); v.z := FixRange(fg.vertices[i].z);
v.x += fg.transform.x/16;
v.y += fg.transform.y/16;
v.z += fg.transform.z/16;
//flip Y for OpenGL coord system, otherwise the model is upside down. //flip Y for OpenGL coord system, otherwise the model is upside down.
//Flip x coord too, otherwise the model looks mirrored //Flip x coord too, otherwise the model looks mirrored
v.y := -v.y; v.y := -v.y;
v.x := -v.x; v.x := -v.x;
_vertices.Add(v); _vertices.Add(v);
group_vertices.Add(v); group_vertices.Add(v);
end; end;
tris := TTriangleList.Create;
for i := 0 to fg.face_count - 1 do begin for i := 0 to fg.face_count - 1 do begin
triangle := InitVertex(fg.faces[i], 0); triangle := InitVertex(fg.faces[i], 0);
_triangles.Add(triangle); tris.Add(triangle);
if fg.faces[i].ftype <> 3 then begin if fg.faces[i].ftype <> 3 then begin
triangle := InitVertex(fg.faces[i], 2); triangle := InitVertex(fg.faces[i], 2);
_triangles.Add(triangle); tris.Add(triangle);
end; end;
end; end;
_triangles[fg_idx] := tris;
fg_idx += 1;
group_vertices.Clear; group_vertices.Clear;
last_idx:=fg.fg_group_id;
end; end;
group_vertices.Free; group_vertices.Free;
end; end;
@ -136,10 +156,10 @@ var
hob: THobFile; hob: THobFile;
begin begin
hob := ParseHobFile(filename); hob := ParseHobFile(filename);
for i := 0 to hob.obj_count - 1 do for i := 0 to 0 do
HobReadMesh(hob.objects[i]); HobReadMesh(hob.objects[i]);
WriteLn('vertices: ', _vertices.Count); WriteLn('vertices: ', _vertices.Count);
WriteLn('faces (triangulated): ', _triangles.Count); //WriteLn('faces (triangulated): ', _triangles.Count);
end; end;
@ -182,13 +202,13 @@ end;
destructor TModel.Destroy; destructor TModel.Destroy;
begin begin
inherited Destroy; inherited Destroy;
_triangles.Free; // _triangles.Free;
end; end;
procedure TModel.Load(const hob_filename, hmt_filename: string); procedure TModel.Load(const hob_filename, hmt_filename: string);
begin begin
_vertices := TVertexList.Create; _vertices := TVertexList.Create;
_triangles := TTriangleList.Create; //_triangles := TTriangleList.Create;
WriteLn('Loading mesh file ', hob_filename); WriteLn('Loading mesh file ', hob_filename);
HobRead(hob_filename); HobRead(hob_filename);
if FileExists(hmt_filename) then begin if FileExists(hmt_filename) then begin
@ -265,7 +285,7 @@ end;
procedure TModel.DrawGL(opts: TRenderOpts); procedure TModel.DrawGL(opts: TRenderOpts);
var var
vert: TVertex; vert: TVertex;
i: integer; i, k: integer;
procedure DrawTri(tri: TTriangle); procedure DrawTri(tri: TTriangle);
var var
@ -309,8 +329,10 @@ begin
end; end;
glColor3f(1, 1, 1); glColor3f(1, 1, 1);
for i := 0 to _triangles.Count - 1 do for k := 0 to Length(_triangles) - 1 do
DrawTri(_triangles[i]); //k := min(opts.fg_to_draw, Length(_triangles) - 1);
for i := 0 to _triangles[k].Count - 1 do
DrawTri(_triangles[k][i]);
end; end;
end. end.

View File

@ -33,6 +33,11 @@ type
face_block_offset, face_block_offset,
vertex_block_offset: integer; vertex_block_offset: integer;
fg_group_id: integer;
transform: record
x,y,z: single;
end;
face_count: integer; face_count: integer;
faces: array of THobFace; faces: array of THobFace;
@ -65,7 +70,7 @@ function ParseHobFile(const fname: string): THobFile;
implementation implementation
const const
DumpFaces = true; DumpFaces = false;
function NameToString(name: array of byte): string; function NameToString(name: array of byte): string;
var var
@ -200,19 +205,52 @@ begin
end; end;
end; end;
var fgid: integer = 0;
procedure ReadFaceGroup(var fg: THobFaceGroup; var f: TMemoryStream); procedure ReadFaceGroup(var fg: THobFaceGroup; var f: TMemoryStream);
var var
filepos: int64; filepos: int64;
fnum: single;
i: Integer;
zero: int64;
fg_next, fg_end: integer;
begin begin
//save file position before seeking to face/vertex data and restore it, to read next group properly //save file position before seeking to face/vertex data and restore it, to read next group properly
filepos := f.Position; filepos := f.Position;
//read group/meshdef0 //read group/meshdef0
f.Seek(16, fsFromCurrent); //unknown fg_next := f.ReadDWord;
f.Seek(4*2, fsFromCurrent); //unknown
fg_end := f.ReadDWord;
fg.meshdef1_offset := f.ReadDWord; fg.meshdef1_offset := f.ReadDWord;
writeln();
writeln('fg: ', fgid); fgid += 1;
writeln('fg next: ', fg_next, ' end: ', fg_end);
writeln('fg meshdef1 offset:', fg.meshdef1_offset); writeln('fg meshdef1 offset:', fg.meshdef1_offset);
zero := f.ReadQWord;
if zero <> 0 then
writeln('unusual file: facegroup 0 zero');
for i := 1 to (48) div 4 do begin
f.ReadBuffer(fnum, 4);
//writeln(fnum);
end;
fg.fg_group_id := f.ReadDWord;
for i := 1 to (3*4 + 3*4 + 4*4) div 4 do begin
f.ReadBuffer(fnum, 4);
//writeln(fnum);
end;
f.ReadBuffer(fg.transform.x, 4);
f.ReadBuffer(fg.transform.y, 4);
f.ReadBuffer(fg.transform.z, 4);
writeln(fg.fg_group_id);
writeln(fg.transform.x:7:5);
writeln(fg.transform.y:7:5);
writeln(fg.transform.z:7:5);
if fg.meshdef1_offset > 0 then begin if fg.meshdef1_offset > 0 then begin
//read meshdef1 //read meshdef1
f.Seek(fg.meshdef1_offset - 4, fsFromBeginning); f.Seek(fg.meshdef1_offset - 4, fsFromBeginning);
@ -232,6 +270,16 @@ begin
writeln('vertices at: ', fg.vertex_block_offset, hexStr(fg.vertex_block_offset, 4):6); writeln('vertices at: ', fg.vertex_block_offset, hexStr(fg.vertex_block_offset, 4):6);
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);
//if (scale > 0) then
//for i := 0 to fg.vertex_count - 1 do begin
// //fg.vertices[i].x += trunc(tx * 300);
// //fg.vertices[i].y += trunc(ty * 300);
// //fg.vertices[i].z += trunc(tz * 300);
// fg.vertices[i].x *= scale;
// fg.vertices[i].y *= scale;
// fg.vertices[i].z *= scale;
//end;
end; end;
end; end;