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.