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

terrain viewer: plug memleaks

This commit is contained in:
dpethes 2020-06-15 11:23:44 +02:00
parent 909cfe5a97
commit 2b1f49b7ba
5 changed files with 92 additions and 9 deletions

View File

@ -111,6 +111,17 @@ begin
CloseFile(f); CloseFile(f);
end; 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 } { TRSDatFile }
constructor TRSDatFile.Create(const hdr_file, dat_file: string); constructor TRSDatFile.Create(const hdr_file, dat_file: string);
@ -120,8 +131,14 @@ begin
end; end;
destructor TRSDatFile.Destroy; destructor TRSDatFile.Destroy;
var
section: TRsHdrSection;
node: TRsDatFileNode;
begin begin
inherited Destroy; inherited Destroy;
for section in m_sections do
for node in section.nodes do
FreeNode(@node);
m_sections := nil; m_sections := nil;
freemem(m_data); freemem(m_data);
end; end;

View File

@ -249,8 +249,15 @@ begin
end; end;
destructor TWorld.Destroy; destructor TWorld.Destroy;
var
tex: PByte;
begin begin
if height_texture <> nil then Freemem(height_texture); 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; inherited Destroy;
end; end;

View File

@ -183,8 +183,17 @@ begin
end; end;
destructor TTerrainMesh.Destroy; destructor TTerrainMesh.Destroy;
var
i: Integer;
begin begin
inherited Destroy; 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; end;
procedure TTerrainMesh.Load(level: TLevelListItem); procedure TTerrainMesh.Load(level: TLevelListItem);
@ -280,6 +289,7 @@ begin
if end_idx > render_blocks.Count - 1 then if end_idx > render_blocks.Count - 1 then
break; break;
end; end;
render_blocks.Free;
end; end;

View File

@ -17,8 +17,34 @@
<i18n> <i18n>
<EnableI18N LFM="False"/> <EnableI18N LFM="False"/>
</i18n> </i18n>
<BuildModes Count="1"> <BuildModes Count="2">
<Item1 Name="Default" Default="True"/> <Item1 Name="Debug" Default="True"/>
<Item2 Name="Release">
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="terrain_viewer"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<OtherUnitFiles Value="..\rs_units;imgui;sdl2"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<CodeGeneration>
<SmartLinkUnit Value="True"/>
<Optimizations>
<OptimizationLevel Value="3"/>
</Optimizations>
</CodeGeneration>
<Linking>
<Debugging>
<GenerateDebugInfo Value="False"/>
</Debugging>
<LinkSmart Value="True"/>
</Linking>
</CompilerOptions>
</Item2>
</BuildModes> </BuildModes>
<PublishOptions> <PublishOptions>
<Version Value="2"/> <Version Value="2"/>
@ -88,6 +114,28 @@
<OtherUnitFiles Value="..\rs_units;imgui;sdl2"/> <OtherUnitFiles Value="..\rs_units;imgui;sdl2"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths> </SearchPaths>
<Parsing>
<SyntaxOptions>
<IncludeAssertionCode Value="True"/>
</SyntaxOptions>
</Parsing>
<CodeGeneration>
<Checks>
<IOChecks Value="True"/>
<RangeChecks Value="True"/>
<OverflowChecks Value="True"/>
<StackChecks Value="True"/>
</Checks>
<VerifyObjMethodCallValidity Value="True"/>
</CodeGeneration>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
<UseHeaptrc Value="True"/>
<TrashVariables Value="True"/>
<UseExternalDbgSyms Value="True"/>
</Debugging>
</Linking>
</CompilerOptions> </CompilerOptions>
<Debugging> <Debugging>
<Exceptions Count="2"> <Exceptions Count="2">

View File

@ -37,7 +37,7 @@ var
g_window: PSDL_Window; g_window: PSDL_Window;
g_ogl_context: TSDL_GLContext; g_ogl_context: TSDL_GLContext;
g_rsdata: TRSDatFile; g_rs_files: TRsDatFileNodeList;
g_levels: TLevelList; g_levels: TLevelList;
g_selected_level_idx: integer = 0; g_selected_level_idx: integer = 0;
@ -390,13 +390,11 @@ procedure LoadLevelFilelist;
g_levels.PushBack(item); g_levels.PushBack(item);
end; end;
var var
rs_files: TRsDatFileNodeList;
fnode: TRsDatFileNode; fnode: TRsDatFileNode;
data_dir, level_dir, map_dir: PRsDatFileNode; data_dir, level_dir, map_dir: PRsDatFileNode;
begin begin
//go to data/level/ //go to data/level/
rs_files := g_rsdata.GetStructure(); for fnode in g_rs_files do begin
for fnode in rs_files do begin
if fnode.is_directory and (fnode.Name = 'data') then begin if fnode.is_directory and (fnode.Name = 'data') then begin
data_dir := @fnode; data_dir := @fnode;
break; break;
@ -416,6 +414,7 @@ end;
//****************************************************************************** //******************************************************************************
var var
rsdata: TRSDatFile;
sec, frames: integer; sec, frames: integer;
event: TSDL_Event; event: TSDL_Event;
done: boolean; done: boolean;
@ -427,8 +426,9 @@ begin
end; end;
writeln('loading data'); writeln('loading data');
g_rsdata := TRSDatFile.Create(RS_DATA_HDR, RS_DATA_DAT); rsdata := TRSDatFile.Create(RS_DATA_HDR, RS_DATA_DAT);
g_rsdata.Parse(); rsdata.Parse();
g_rs_files := rsdata.GetStructure();
g_levels := TLevelList.Create; g_levels := TLevelList.Create;
LoadLevelFilelist; LoadLevelFilelist;
@ -468,6 +468,7 @@ begin
terrain.Free; terrain.Free;
SDL_Quit; SDL_Quit;
g_levels.Free; g_levels.Free;
g_rsdata.Free; g_rs_files.Free;
rsdata.Free;
end. end.