diff --git a/rs_units/rs_dat.pas b/rs_units/rs_dat.pas index 1d813de..515f44e 100644 --- a/rs_units/rs_dat.pas +++ b/rs_units/rs_dat.pas @@ -111,6 +111,17 @@ begin CloseFile(f); end; +procedure FreeNode(node: PRsDatFileNode); +var + i: Integer; +begin + if node^.nodes <> nil then begin + for i := 0 to Length(node^.nodes) - 1 do + FreeNode(node^.nodes[i]); + node^.nodes := nil; + end; +end; + { TRSDatFile } constructor TRSDatFile.Create(const hdr_file, dat_file: string); @@ -120,8 +131,14 @@ begin end; destructor TRSDatFile.Destroy; +var + section: TRsHdrSection; + node: TRsDatFileNode; begin inherited Destroy; + for section in m_sections do + for node in section.nodes do + FreeNode(@node); m_sections := nil; freemem(m_data); end; diff --git a/terrain_viewer/rs_world.pas b/terrain_viewer/rs_world.pas index 92b30bd..6206dbb 100644 --- a/terrain_viewer/rs_world.pas +++ b/terrain_viewer/rs_world.pas @@ -249,8 +249,15 @@ begin end; destructor TWorld.Destroy; +var + tex: PByte; begin if height_texture <> nil then Freemem(height_texture); + for tex in heightmap.textures do + freemem(tex); + freemem(heightmap.tiles); + freemem(heightmap.blk); + heightmap.textures := nil; inherited Destroy; end; diff --git a/terrain_viewer/terrain_mesh.pas b/terrain_viewer/terrain_mesh.pas index 999bcdb..76e369d 100644 --- a/terrain_viewer/terrain_mesh.pas +++ b/terrain_viewer/terrain_mesh.pas @@ -183,8 +183,17 @@ begin end; destructor TTerrainMesh.Destroy; +var + i: Integer; begin inherited Destroy; + for i := 0 to Length(render_batches) - 1 do begin + freemem(render_batches[i].vertices); + freemem(render_batches[i].normals); + freemem(render_batches[i].face_indices); + end; + render_batches := nil; + terrain.Free; end; procedure TTerrainMesh.Load(level: TLevelListItem); @@ -280,6 +289,7 @@ begin if end_idx > render_blocks.Count - 1 then break; end; + render_blocks.Free; end; diff --git a/terrain_viewer/terrain_viewer.lpi b/terrain_viewer/terrain_viewer.lpi index ccc68c1..29490b1 100644 --- a/terrain_viewer/terrain_viewer.lpi +++ b/terrain_viewer/terrain_viewer.lpi @@ -17,8 +17,34 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -88,6 +114,28 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/terrain_viewer/terrain_viewer.pas b/terrain_viewer/terrain_viewer.pas index 4ee1bd4..499ba52 100644 --- a/terrain_viewer/terrain_viewer.pas +++ b/terrain_viewer/terrain_viewer.pas @@ -37,7 +37,7 @@ var g_window: PSDL_Window; g_ogl_context: TSDL_GLContext; - g_rsdata: TRSDatFile; + g_rs_files: TRsDatFileNodeList; g_levels: TLevelList; g_selected_level_idx: integer = 0; @@ -390,13 +390,11 @@ procedure LoadLevelFilelist; g_levels.PushBack(item); end; var - rs_files: TRsDatFileNodeList; fnode: TRsDatFileNode; data_dir, level_dir, map_dir: PRsDatFileNode; begin //go to data/level/ - rs_files := g_rsdata.GetStructure(); - for fnode in rs_files do begin + for fnode in g_rs_files do begin if fnode.is_directory and (fnode.Name = 'data') then begin data_dir := @fnode; break; @@ -416,6 +414,7 @@ end; //****************************************************************************** var + rsdata: TRSDatFile; sec, frames: integer; event: TSDL_Event; done: boolean; @@ -427,8 +426,9 @@ 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_levels := TLevelList.Create; LoadLevelFilelist; @@ -468,6 +468,7 @@ begin terrain.Free; SDL_Quit; g_levels.Free; - g_rsdata.Free; + g_rs_files.Free; + rsdata.Free; end.