mirror of
https://github.com/dpethes/rerogue.git
synced 2025-06-07 18:58:32 +02:00
Merge pull request #7 from BenChampion/viewer-changes-only
model_viewer: Allow viewing/selecting objects within a HOB
This commit is contained in:
commit
271f74e36d
@ -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);
|
||||||
@ -336,6 +345,8 @@ var
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
if _triangles.Size = 0 then
|
||||||
|
exit;
|
||||||
if opts.wireframe then
|
if opts.wireframe then
|
||||||
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||||||
|
|
||||||
@ -352,19 +363,22 @@ begin
|
|||||||
|
|
||||||
glColor3f(1, 1, 1);
|
glColor3f(1, 1, 1);
|
||||||
|
|
||||||
|
j := min(integer(opts.obj_to_draw), integer(_triangles.Size - 1));
|
||||||
|
opts.obj_to_draw := j; // clip
|
||||||
|
if _triangles[j].Size = 0 then
|
||||||
|
exit;
|
||||||
if opts.fg_all then begin
|
if opts.fg_all then begin
|
||||||
for k := 0 to Length(_triangles) - 1 do begin
|
for k := 0 to _triangles[j].Size - 1 do
|
||||||
if _triangles[k].Size > 0 then
|
if _triangles[j][k].Size > 0 then
|
||||||
for i := 0 to _triangles[k].Size - 1 do
|
for i := 0 to _triangles[j][k].Size - 1 do
|
||||||
DrawTri(_triangles[k][i]);
|
DrawTri(_triangles[j][k][i]);
|
||||||
end;
|
|
||||||
end
|
end
|
||||||
else begin
|
else begin
|
||||||
k := min(opts.fg_to_draw, Length(_triangles) - 1);
|
k := min(integer(opts.fg_to_draw), integer(_triangles[j].Size - 1));
|
||||||
opts.fg_to_draw := k; //clip
|
opts.fg_to_draw := k; //clip
|
||||||
if _triangles[k].Size > 0 then
|
if _triangles[j][k].Size > 0 then
|
||||||
for i := 0 to _triangles[k].Size - 1 do
|
for i := 0 to _triangles[j][k].Size - 1 do
|
||||||
DrawTri(_triangles[k][i]);
|
DrawTri(_triangles[j][k][i]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
if opts.wireframe then
|
if opts.wireframe then
|
||||||
@ -372,10 +386,11 @@ begin
|
|||||||
|
|
||||||
ImGui.Begin_('Mesh');
|
ImGui.Begin_('Mesh');
|
||||||
ImGui.Text('triangles: %d (vertices: %d)', [triangle_count, _vertices.Size]);
|
ImGui.Text('triangles: %d (vertices: %d)', [triangle_count, _vertices.Size]);
|
||||||
|
ImGui.Text('object: %d / %d', [opts.obj_to_draw + 1, _triangles.Size]);
|
||||||
if opts.fg_all then
|
if opts.fg_all then
|
||||||
ImGui.Text('facegroups: %d', [Length(_triangles)])
|
ImGui.Text('facegroups: %d', [_triangles[opts.obj_to_draw].Size])
|
||||||
else
|
else
|
||||||
ImGui.Text('facegroup: %d / %d', [opts.fg_to_draw + 1, Length(_triangles)]);
|
ImGui.Text('facegroup: %d / %d', [opts.fg_to_draw + 1, _triangles[opts.obj_to_draw].Size]);
|
||||||
ImGui.End_;
|
ImGui.End_;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -434,10 +449,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 +464,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 +479,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
|
||||||
|
@ -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;
|
||||||
@ -342,14 +343,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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user