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

model viewer: use up/down arrows to switch between models

This commit is contained in:
dpethes 2018-01-14 16:17:43 +01:00
parent b739950c03
commit 252d93702a

View File

@ -46,8 +46,8 @@ var
g_rsdata: TRSDatFile; g_rsdata: TRSDatFile;
g_filelist: TFileList; g_filelist: TFileList;
g_selected_file_idx: integer;
g_model: TModel; g_model: TModel;
g_model_name: string;
g_model_loading_failed: Boolean; g_model_loading_failed: Boolean;
view: record view: record
@ -243,6 +243,35 @@ begin
end; end;
//Beware, not all models can be parsed correctly yet. This will leak then, but we don't care much.
procedure LoadMesh(item: TFileListItem);
var
hob, hmt: TMemoryStream;
begin
try
if g_model <> nil then
g_model.Free;
hob := TMemoryStream.Create;
hob.WriteBuffer(item.node_hob^.Data^, item.node_hob^.size);
hob.Seek(0, soBeginning);
hmt := TMemoryStream.Create;
hmt.WriteBuffer(item.node_hmt^.Data^, item.node_hmt^.size);
hmt.Seek(0, soBeginning);
g_model := TModel.Create;
g_model.Load(hob, hmt);
g_model.InitGL;
hob.Free;
hmt.Free;
g_model_loading_failed := false;
except
g_model_loading_failed := true;
end;
end;
procedure HandleEvent(const ev: TSDL_Event; var done: boolean); procedure HandleEvent(const ev: TSDL_Event; var done: boolean);
var var
io: PImGuiIO; io: PImGuiIO;
@ -305,6 +334,16 @@ begin
view.opts.fg_to_draw := max(0, view.opts.fg_to_draw - 1); view.opts.fg_to_draw := max(0, view.opts.fg_to_draw - 1);
SDLK_RIGHT: SDLK_RIGHT:
view.opts.fg_to_draw += 1; view.opts.fg_to_draw += 1;
SDLK_UP:
if (g_selected_file_idx > 0) then begin
g_selected_file_idx -= 1;
LoadMesh(g_filelist[g_selected_file_idx]);
end;
SDLK_DOWN:
if (g_selected_file_idx < g_filelist.Size - 1) then begin
g_selected_file_idx += 1;
LoadMesh(g_filelist[g_selected_file_idx]);
end;
end; end;
end; end;
SDL_KEYUP: begin SDL_KEYUP: begin
@ -370,47 +409,28 @@ begin
end; {case} end; {case}
end; end;
procedure LoadMesh(item: TFileListItem);
var
hob, hmt: TMemoryStream;
begin
if g_model <> nil then
g_model.Free;
hob := TMemoryStream.Create;
hob.WriteBuffer(item.node_hob^.Data^, item.node_hob^.size);
hob.Seek(0, soBeginning);
hmt := TMemoryStream.Create;
hmt.WriteBuffer(item.node_hmt^.Data^, item.node_hmt^.size);
hmt.Seek(0, soBeginning);
g_model := TModel.Create;
g_model.Load(hob, hmt);
g_model.InitGL;
hob.Free;
hmt.Free;
end;
procedure DrawGui; procedure DrawGui;
var var
style: PImGuiStyle; style: PImGuiStyle;
file_item: TFileListItem; file_item: TFileListItem;
fitem_selected: Boolean = false; selected_item_idx: integer;
selected_mesh_name: String;
selected_item: TFileListItem; selected_item: TFileListItem;
i: Integer;
begin begin
ImGui_ImplSdlGL2_NewFrame(g_window); ImGui_ImplSdlGL2_NewFrame(g_window);
style := Imgui.GetStyle(); style := Imgui.GetStyle();
style^.WindowRounding := 0; style^.WindowRounding := 0;
Imgui.Begin_('Mesh'); if g_selected_file_idx >= 0 then begin
if not g_model_loading_failed then begin Imgui.Begin_('Mesh'); //window used in hob_mesh as well
Imgui.Text(g_model_name); if not g_model_loading_failed then begin
end else Imgui.Text(g_filelist[g_selected_file_idx].name);
Imgui.Text('mesh loading failed :('); end else
Imgui.End_; Imgui.Text('mesh loading failed :(');
Imgui.End_;
end;
Imgui.Begin_('Rendering options'); Imgui.Begin_('Rendering options');
Imgui.Checkbox('points', @view.opts.points); Imgui.Checkbox('points', @view.opts.points);
@ -422,26 +442,24 @@ begin
g_model.ExportObj('rs_exported.obj'); g_model.ExportObj('rs_exported.obj');
Imgui.End_; Imgui.End_;
selected_mesh_name := EmptyStr; if g_filelist.Size = 0 then
exit;
selected_item_idx := -1;
//todo scrolling, filter?
Imgui.Begin_('File list'); Imgui.Begin_('File list');
//todo filter for i := 0 to g_filelist.Size - 1 do begin
for file_item in g_filelist do begin file_item := g_filelist[i];
fitem_selected := file_item.name = g_model_name; if Imgui.Selectable(file_item.name, g_selected_file_idx = i) then begin
if Imgui.Selectable(file_item.name, fitem_selected) then begin selected_item_idx := i;
selected_mesh_name := file_item.name;
selected_item := file_item; selected_item := file_item;
end; end;
end; end;
Imgui.End_; Imgui.End_;
if (selected_mesh_name <> EmptyStr) and (selected_mesh_name <> g_model_name) then begin if (selected_item_idx >= 0) and (selected_item_idx <> g_selected_file_idx) then begin
try g_selected_file_idx := selected_item_idx;
LoadMesh(selected_item); LoadMesh(selected_item);
g_model_name := selected_mesh_name;
g_model_loading_failed := false;
except
g_model_loading_failed := true;
end;
end; end;
end; end;
@ -498,7 +516,7 @@ begin
LoadMeshFilelist(); LoadMeshFilelist();
g_model := nil; g_model := nil;
g_model_name := ''; g_selected_file_idx := -1;
g_model_loading_failed := false; g_model_loading_failed := false;
writeln('Init SDL...'); writeln('Init SDL...');