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

model_viewer: Allow viewing/selecting objects within a HOB

This commit is contained in:
Ben Champion 2020-07-26 16:44:31 +01:00
parent c43e0fe4d6
commit 56d6dce408
2 changed files with 69 additions and 43 deletions

View File

@ -30,11 +30,14 @@ type
TVertexList = specialize TVector<TVertex>; TVertexList = specialize TVector<TVertex>;
TTriangleList = specialize TVector<TTriangle>; TTriangleList = specialize TVector<TTriangle>;
TTriangleListList = specialize TVector<TTriangleList>;
TTriangleListListList = specialize TVector<TTriangleListList>;
TMaterialArray = array of TMaterial; TMaterialArray = array of TMaterial;
TRenderOpts = record TRenderOpts = record
fg_to_draw: integer; fg_to_draw: integer;
fg_all: boolean; fg_all: boolean;
obj_to_draw: integer;
wireframe: boolean; wireframe: boolean;
points: boolean; points: boolean;
vcolors: boolean; vcolors: boolean;
@ -52,8 +55,8 @@ type
TModel = class TModel = class
private private
_vertices: TVertexList; _vertices: TVertexList;
_triangles: array of TTriangleList; _triangles: TTriangleListListList;
_materials: array of TMaterial; _materials: TMaterialArray;
_hmt: THmtFile; _hmt: THmtFile;
_hmt_loaded: boolean; _hmt_loaded: boolean;
procedure HmtRead(stream: TMemoryStream); procedure HmtRead(stream: TMemoryStream);
@ -98,6 +101,7 @@ var
triangle: TTriangle; triangle: TTriangle;
fg_idx: integer; fg_idx: integer;
tris: TTriangleList; tris: TTriangleList;
mesh_tris: TTriangleListList;
last_idx: integer; last_idx: integer;
function InitVertex(face: THobFace; offset: integer): TTriangle; function InitVertex(face: THobFace; offset: integer): TTriangle;
@ -116,7 +120,7 @@ var
begin begin
group_vertices := TVertexList.Create; group_vertices := TVertexList.Create;
setlength(_triangles, Length(mesh.face_groups)); mesh_tris := TTriangleListList.Create;
fg_idx := 0; fg_idx := 0;
last_idx:=0; last_idx:=0;
for fg in mesh.face_groups do begin for fg in mesh.face_groups do begin
@ -136,7 +140,7 @@ begin
v.y := -v.y; v.y := -v.y;
v.x := -v.x; v.x := -v.x;
_vertices.PushBack(v); _vertices.PushBack(v); // TODO(?): _vertices per object (not all)
group_vertices.PushBack(v); group_vertices.PushBack(v);
end; end;
tris := TTriangleList.Create; tris := TTriangleList.Create;
@ -148,12 +152,13 @@ begin
tris.PushBack(triangle); tris.PushBack(triangle);
end; end;
end; end;
_triangles[fg_idx] := tris; mesh_tris.PushBack(tris);
fg_idx += 1; fg_idx += 1;
group_vertices.Clear; group_vertices.Clear;
last_idx:=fg.fg_group_id; last_idx:=fg.fg_group_id;
end; end;
group_vertices.Free; group_vertices.Free;
_triangles.PushBack(mesh_tris);
end; end;
@ -215,11 +220,15 @@ end;
destructor TModel.Destroy; destructor TModel.Destroy;
var var
t: TTriangleList; t: TTriangleListList;
tt: TTriangleList;
begin begin
inherited Destroy; inherited Destroy;
for t in _triangles do for t in _triangles do begin
for tt in t do
tt.Free;
t.Free; t.Free;
end;
_triangles := nil; _triangles := nil;
if _hmt_loaded then if _hmt_loaded then
DeallocHmt(_hmt); DeallocHmt(_hmt);
@ -230,7 +239,7 @@ end;
procedure TModel.Load(hob, hmt: TMemoryStream); procedure TModel.Load(hob, hmt: TMemoryStream);
begin begin
_vertices := TVertexList.Create; _vertices := TVertexList.Create;
//_triangles := TTriangleList.Create; _triangles := TTriangleListListList.Create;
WriteLn('Loading mesh file'); WriteLn('Loading mesh file');
HobRead(hob); HobRead(hob);
WriteLn('Loading material file'); WriteLn('Loading material file');
@ -307,7 +316,7 @@ end;
procedure TModel.DrawGL(var opts: TRenderOpts); procedure TModel.DrawGL(var opts: TRenderOpts);
var var
vert: TVertex; vert: TVertex;
i, k: integer; i, j, k: integer;
triangle_count: integer = 0; triangle_count: integer = 0;
procedure DrawTri(tri: TTriangle); procedure DrawTri(tri: TTriangle);
@ -351,32 +360,37 @@ begin
end; end;
glColor3f(1, 1, 1); glColor3f(1, 1, 1);
if _triangles.Size > 0 then begin
if opts.fg_all then begin j := min(integer(opts.obj_to_draw), integer(_triangles.Size - 1));
for k := 0 to Length(_triangles) - 1 do begin opts.obj_to_draw := j; // clip
if _triangles[k].Size > 0 then if _triangles[j].Size > 0 then begin
for i := 0 to _triangles[k].Size - 1 do if opts.fg_all then begin
DrawTri(_triangles[k][i]); for k := 0 to _triangles[j].Size - 1 do
if _triangles[j][k].Size > 0 then
for i := 0 to _triangles[j][k].Size - 1 do
DrawTri(_triangles[j][k][i]);
end
else begin
k := min(integer(opts.fg_to_draw), integer(_triangles[j].Size - 1));
opts.fg_to_draw := k; //clip
if _triangles[j][k].Size > 0 then
for i := 0 to _triangles[j][k].Size - 1 do
DrawTri(_triangles[j][k][i]);
end; end;
end
else begin if opts.wireframe then
k := min(opts.fg_to_draw, Length(_triangles) - 1); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
opts.fg_to_draw := k; //clip
if _triangles[k].Size > 0 then ImGui.Begin_('Mesh');
for i := 0 to _triangles[k].Size - 1 do ImGui.Text('triangles: %d (vertices: %d)', [triangle_count, _vertices.Size]);
DrawTri(_triangles[k][i]); ImGui.Text('object: %d / %d', [opts.obj_to_draw + 1, _triangles.Size]);
if opts.fg_all then
ImGui.Text('facegroups: %d', [_triangles[opts.obj_to_draw].Size])
else
ImGui.Text('facegroup: %d / %d', [opts.fg_to_draw + 1, _triangles[opts.obj_to_draw].Size]);
ImGui.End_;
end;
end; end;
if opts.wireframe then
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
ImGui.Begin_('Mesh');
ImGui.Text('triangles: %d (vertices: %d)', [triangle_count, _vertices.Size]);
if opts.fg_all then
ImGui.Text('facegroups: %d', [Length(_triangles)])
else
ImGui.Text('facegroup: %d / %d', [opts.fg_to_draw + 1, Length(_triangles)]);
ImGui.End_;
end; end;
@ -434,10 +448,12 @@ begin
scaling_factor := 1; scaling_factor := 1;
//scaling_factor := DesiredUnitSize / GetMaxCoord; //scaling_factor := DesiredUnitSize / GetMaxCoord;
// just export first object for now -- TODO: allow object selection later
//vertex pass //vertex pass
for k := 0 to Length(_triangles) - 1 do for k := 0 to _triangles[0].Size - 1 do
for i := 0 to _triangles[k].Size - 1 do begin for i := 0 to _triangles[0][k].Size - 1 do begin
face := _triangles[k][i]; face := _triangles[0][k][i];
for vt in face.vertices do begin for vt in face.vertices do begin
x := (vt.x) * scaling_factor; x := (vt.x) * scaling_factor;
y := (vt.y) * scaling_factor; y := (vt.y) * scaling_factor;
@ -447,9 +463,9 @@ begin
end; end;
//uv pass //uv pass
for k := 0 to Length(_triangles) - 1 do for k := 0 to _triangles[0].Size - 1 do
for i := 0 to _triangles[k].Size - 1 do begin for i := 0 to _triangles[0][k].Size - 1 do begin
face := _triangles[k][i]; face := _triangles[0][k][i];
for j := 0 to 2 do begin for j := 0 to 2 do begin
u := face.tex_coords[j, 0]; u := face.tex_coords[j, 0];
v := face.tex_coords[j, 1]; v := face.tex_coords[j, 1];
@ -462,14 +478,14 @@ begin
vertex_counter := 1; vertex_counter := 1;
last_material_index := -1; last_material_index := -1;
for k := 0 to Length(_triangles) - 1 do begin for k := 0 to _triangles[0].Size - 1 do begin
if _triangles[k].Size = 0 then if _triangles[0][k].Size = 0 then
continue; continue;
writeln(objfile, 'g ', k); writeln(objfile, 'g ', k);
for i := 0 to _triangles[k].Size - 1 do begin for i := 0 to _triangles[0][k].Size - 1 do begin
face := _triangles[k][i]; face := _triangles[0][k][i];
if face.material_index <> last_material_index then begin if face.material_index <> last_material_index then begin
if face.material_index = -1 then if face.material_index = -1 then

View File

@ -236,6 +236,7 @@ begin
view.render.fg_all := true; view.render.fg_all := true;
view.render.fg_to_draw := 0; view.render.fg_to_draw := 0;
view.render.obj_to_draw := 0;
view.render.wireframe := false; view.render.wireframe := false;
view.render.points := false; view.render.points := false;
view.render.vcolors := true; view.render.vcolors := true;
@ -339,14 +340,23 @@ begin
view.render.fg_to_draw := max(0, view.render.fg_to_draw - 1); view.render.fg_to_draw := max(0, view.render.fg_to_draw - 1);
SDLK_RIGHT: SDLK_RIGHT:
view.render.fg_to_draw += 1; view.render.fg_to_draw += 1;
SDLK_END:
view.render.obj_to_draw += 1;
SDLK_HOME:
view.render.obj_to_draw := max(0, view.render.obj_to_draw - 1);
SDLK_UP: SDLK_UP:
if (g_selected_file_idx > 0) then begin if (g_selected_file_idx > 0) then begin
g_selected_file_idx -= 1; g_selected_file_idx -= 1;
view.render.fg_to_draw := 0;
view.render.obj_to_draw := 0;
LoadMesh(g_filelist[g_selected_file_idx]); LoadMesh(g_filelist[g_selected_file_idx]);
end; end;
SDLK_DOWN: SDLK_DOWN:
if (g_selected_file_idx < g_filelist.Size - 1) then begin if (g_selected_file_idx < g_filelist.Size - 1) then begin
g_selected_file_idx += 1; g_selected_file_idx += 1;
view.render.fg_to_draw := 0;
view.render.obj_to_draw := 0;
LoadMesh(g_filelist[g_selected_file_idx]); LoadMesh(g_filelist[g_selected_file_idx]);
end; end;
end; end;