diff --git a/model_viewer/hob_mesh.pas b/model_viewer/hob_mesh.pas index d61c889..a03a56c 100644 --- a/model_viewer/hob_mesh.pas +++ b/model_viewer/hob_mesh.pas @@ -214,9 +214,17 @@ end; destructor TModel.Destroy; +var + t: TTriangleList; begin inherited Destroy; -// _triangles.Free; + for t in _triangles do + t.Free; + _triangles := nil; + if _hmt_loaded then + DeallocHmt(_hmt); + _vertices.Free; + _materials := nil; end; procedure TModel.Load(hob, hmt: TMemoryStream); diff --git a/model_viewer/model_viewer.pas b/model_viewer/model_viewer.pas index 9f0376a..e1b3fbe 100644 --- a/model_viewer/model_viewer.pas +++ b/model_viewer/model_viewer.pas @@ -45,7 +45,7 @@ var g_window: PSDL_Window; g_ogl_context: TSDL_GLContext; - g_rsdata: TRSDatFile; + g_rs_files: TRsDatFileNodeList; g_filelist: TFileList; g_selected_file_idx: integer; g_model: TModel; @@ -491,11 +491,9 @@ procedure LoadMeshFilelist; end; end; var - rs_files: TRsDatFileNodeList; file_: TRsDatFileNode; begin - rs_files := g_rsdata.GetStructure(); - for file_ in rs_files do begin + for file_ in g_rs_files do begin AddFile('', @file_, nil); end; end; @@ -519,6 +517,7 @@ end; //****************************************************************************** var + rsdata: TRSDatFile; sec, frames: integer; event: TSDL_Event; done: boolean; @@ -530,15 +529,12 @@ begin end; writeln('loading data'); - g_rsdata := TRSDatFile.Create(RS_DATA_HDR, RS_DATA_DAT); - g_rsdata.Parse(); + rsdata := TRSDatFile.Create(RS_DATA_HDR, RS_DATA_DAT); + rsdata.Parse(); + g_rs_files := rsdata.GetStructure(); g_filelist := TFileList.Create; LoadMeshFilelist(); - g_model := nil; - g_selected_file_idx := -1; - g_model_loading_failed := false; - writeln('Init SDL...'); SDL_Init(SDL_INIT_VIDEO or SDL_INIT_TIMER); WindowInit(SCR_W_INIT, SCR_H_INIT); @@ -547,6 +543,9 @@ begin SetGLWindowSize(g_window^.w, g_window^.h); InitView; + g_model := nil; + g_selected_file_idx := 0; + LoadMesh(g_filelist[0]); sec := SDL_GetTicks; frames := 0; @@ -578,6 +577,7 @@ begin if g_model <> nil then g_model.Free; g_filelist.Free; - g_rsdata.Free; + g_rs_files.Free; + rsdata.Free; end. diff --git a/rs_units/hmt_parser.pas b/rs_units/hmt_parser.pas index 6eb872e..adb5605 100644 --- a/rs_units/hmt_parser.pas +++ b/rs_units/hmt_parser.pas @@ -36,7 +36,8 @@ type textures: array of THmtTexture; end; - function ParseHmtFile(f: TMemoryStream): THmtFile; +function ParseHmtFile(f: TMemoryStream): THmtFile; +procedure DeallocHmt(h: THmtFile); //************************************************************************************************** implementation @@ -167,5 +168,17 @@ begin result := hmt; end; +procedure DeallocHmt(h: THmtFile); +var + tex: THmtTexture; +begin + for tex in h.textures do begin + freemem(tex.image.pixels); + freemem(tex.image.samples); + end; + h.textures := nil; + h.materials := nil; +end; + end. diff --git a/rs_units/rs_dat.pas b/rs_units/rs_dat.pas index 515f44e..3e138f6 100644 --- a/rs_units/rs_dat.pas +++ b/rs_units/rs_dat.pas @@ -217,9 +217,9 @@ begin result.Data := mem_data + entry.offset; //if (result.offset mod 32) <> 0 then writeln('unaligned offset'); - writeln(stderr, format('name: %s size: %d dir: %s subsize: %d flags: %s', - [result.Name, entry.length, BoolToStr(result.is_directory), - entry.sub_entry_size, binStr(entry.type_flag, 16)])); + //writeln(stderr, format('name: %s size: %d dir: %s subsize: %d flags: %s', + // [result.Name, entry.length, BoolToStr(result.is_directory), + // entry.sub_entry_size, binStr(entry.type_flag, 16)])); end; procedure TRSDatFile.ReadSectionEntries(var section: TRsHdrSection; const mem_data: pbyte);