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:
parent
d104b606cd
commit
6decfb931d
@ -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.
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user