Skip to content

Commit cbbbad9

Browse files
committed
Convert file IO to use FileIO class in SampleInterfaces.h
de-duping a lot of standard file IO
1 parent df08391 commit cbbbad9

7 files changed

Lines changed: 94 additions & 155 deletions

File tree

RecastDemo/Include/Filelist.h

Lines changed: 0 additions & 25 deletions
This file was deleted.

RecastDemo/Include/InputGeom.h

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
#pragma once
2020

2121
#include "ChunkyTriMesh.h"
22-
#include "MeshLoaderObj.h"
2322

2423
#include <string>
2524

@@ -115,10 +114,7 @@ class InputGeom
115114

116115
public:
117116
InputGeom() = default;
118-
~InputGeom()
119-
{
120-
delete chunkyMesh;
121-
}
117+
~InputGeom() { delete chunkyMesh; }
122118
InputGeom(const InputGeom&) = delete;
123119
InputGeom& operator=(const InputGeom&) = delete;
124120
InputGeom(InputGeom&&) = delete;

RecastDemo/Include/SampleInterfaces.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,8 @@ class FileIO : public duFileIO
7878
FileIO() = default;
7979
FileIO(const FileIO&) = delete;
8080
FileIO& operator=(const FileIO&) = delete;
81-
FileIO(FileIO&&) = delete;
82-
FileIO& operator=(FileIO&&) = delete;
81+
FileIO(FileIO&&) = default;
82+
FileIO& operator=(FileIO&&) = default;
8383
virtual ~FileIO();
8484

8585
bool openForWrite(const char* path);
@@ -88,8 +88,11 @@ class FileIO : public duFileIO
8888
virtual bool isReading() const;
8989
virtual bool write(const void* ptr, const size_t size);
9090
virtual bool read(void* ptr, const size_t size);
91+
size_t getFileSize();
9192

93+
static void scanDirectory(const std::string& path, const std::string& ext, std::vector<std::string>& fileList);
9294
private:
9395
FILE* fp = nullptr;
94-
int mode = -1;
96+
enum class Mode { none, reading, writing };
97+
Mode mode = Mode::none;
9598
};

RecastDemo/Source/Filelist.cpp

Lines changed: 0 additions & 109 deletions
This file was deleted.

RecastDemo/Source/InputGeom.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,13 +136,22 @@ static char* parseRow(char* buf, char* bufEnd, char* row, int len)
136136

137137
bool InputGeom::loadMesh(rcContext* ctx, const std::string& filepath)
138138
{
139-
char* buffer;
140-
size_t bufferLen;
141-
if (!tryReadFile(filepath, &buffer, &bufferLen))
139+
FileIO file;
140+
if (!file.openForRead(filepath.c_str()))
142141
{
143142
ctx->log(RC_LOG_ERROR, "buildTiledNavigation: Could not load '%s'", filepath.c_str());
144143
return false;
145144
}
145+
146+
size_t bufferLen = file.getFileSize();
147+
char* buffer = new char[bufferLen];
148+
149+
if (!file.read(buffer, bufferLen))
150+
{
151+
ctx->log(RC_LOG_ERROR, "buildTiledNavigation: Could not load '%s'", filepath.c_str());
152+
return false;
153+
}
154+
146155
filename = filepath;
147156

148157
delete chunkyMesh;

RecastDemo/Source/SampleInterfaces.cpp

Lines changed: 71 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,16 @@
44
#include "Recast.h"
55
#include "SDL_opengl.h"
66

7+
#include <algorithm>
78
#include <cstdarg>
89
#include <cstdio>
910

1011
#ifdef WIN32
1112
# define snprintf _snprintf
13+
# include <io.h>
14+
#else
15+
# include <dirent.h>
16+
# include <cstring>
1217
#endif
1318

1419
////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -272,7 +277,7 @@ bool FileIO::openForWrite(const char* path)
272277
{
273278
return false;
274279
}
275-
mode = 1;
280+
mode = Mode::writing;
276281
return true;
277282
}
278283

@@ -287,23 +292,23 @@ bool FileIO::openForRead(const char* path)
287292
{
288293
return false;
289294
}
290-
mode = 2;
295+
mode = Mode::reading;
291296
return true;
292297
}
293298

294299
bool FileIO::isWriting() const
295300
{
296-
return mode == 1;
301+
return mode == Mode::writing;
297302
}
298303

299304
bool FileIO::isReading() const
300305
{
301-
return mode == 2;
306+
return mode == Mode::reading;
302307
}
303308

304309
bool FileIO::write(const void* ptr, const size_t size)
305310
{
306-
if (!fp || mode != 1)
311+
if (!fp || mode != Mode::writing)
307312
{
308313
return false;
309314
}
@@ -313,10 +318,70 @@ bool FileIO::write(const void* ptr, const size_t size)
313318

314319
bool FileIO::read(void* ptr, const size_t size)
315320
{
316-
if (!fp || mode != 2)
321+
if (!fp || mode != Mode::reading)
317322
{
318323
return false;
319324
}
320325
size_t readLen = fread(ptr, size, 1, fp);
321326
return readLen == 1;
322327
}
328+
329+
size_t FileIO::getFileSize()
330+
{
331+
if (!fp || mode != Mode::reading)
332+
{
333+
return false;
334+
}
335+
size_t currentPos = ftell(fp);
336+
if (fseek(fp, 0, SEEK_END) != 0)
337+
{
338+
return 0;
339+
}
340+
size_t size = ftell(fp);
341+
if (fseek(fp, 0, currentPos) != 0)
342+
{
343+
return 0;
344+
}
345+
return size;
346+
}
347+
348+
void FileIO::scanDirectory(const std::string& path, const std::string& ext, std::vector<std::string>& filelist)
349+
{
350+
#ifdef WIN32
351+
std::string pathWithExt = path + "/*" + ext;
352+
353+
_finddata_t dir;
354+
intptr_t findHandle = _findfirst(pathWithExt.c_str(), &dir);
355+
if (findHandle == -1L)
356+
{
357+
return;
358+
}
359+
360+
do
361+
{
362+
filelist.emplace_back(dir.name);
363+
} while (_findnext(findHandle, &dir) == 0);
364+
_findclose(findHandle);
365+
#else
366+
dirent* current = 0;
367+
DIR* dp = opendir(path.c_str());
368+
if (!dp)
369+
{
370+
return;
371+
}
372+
373+
size_t extLen = strlen(ext.c_str());
374+
while ((current = readdir(dp)) != 0)
375+
{
376+
size_t len = strlen(current->d_name);
377+
if (len > extLen && strncmp(current->d_name + len - extLen, ext.c_str(), extLen) == 0)
378+
{
379+
filelist.emplace_back(current->d_name);
380+
}
381+
}
382+
closedir(dp);
383+
#endif
384+
385+
// Sort the list of files alphabetically.
386+
std::sort(filelist.begin(), filelist.end());
387+
}

RecastDemo/Source/main.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ int main(int /*argc*/, char** /*argv*/)
276276

277277

278278
//----------------------------------------------------------------------------
279-
scanDirectory(app.meshesFolder, ".obj", app.files);
279+
FileIO::scanDirectory(app.meshesFolder, ".obj", app.files);
280280
app.meshName = app.files[0];
281281
app.inputGeometry = new InputGeom;
282282
app.inputGeometry->load(&app.buildContext, app.meshesFolder + "/" + app.meshName);
@@ -326,7 +326,7 @@ int main(int /*argc*/, char** /*argv*/)
326326
case SDLK_t:
327327
app.showTestCases = true;
328328
app.files.clear();
329-
scanDirectory(app.testCasesFolder, ".txt", app.files);
329+
FileIO::scanDirectory(app.testCasesFolder, ".txt", app.files);
330330
break;
331331
case SDLK_TAB:
332332
app.showMenu = !app.showMenu;
@@ -660,8 +660,8 @@ int main(int /*argc*/, char** /*argv*/)
660660
if (ImGui::BeginCombo("##levelCombo", app.meshName.c_str(), 0))
661661
{
662662
app.files.clear();
663-
scanDirectory(app.meshesFolder, ".obj", app.files);
664-
scanDirectory(app.meshesFolder, ".gset", app.files);
663+
FileIO::scanDirectory(app.meshesFolder, ".obj", app.files);
664+
FileIO::scanDirectory(app.meshesFolder, ".gset", app.files);
665665

666666
for (const auto& file : app.files)
667667
{

0 commit comments

Comments
 (0)