X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=laserbrain_demo;a=blobdiff_plain;f=src%2Fsceneload.cc;fp=src%2Fsceneload.cc;h=7459c1de229a8dd05331fd3c3ce31768f67b036d;hp=28f58778796cccc79f7a3079af8ddd8f1fc5a595;hb=5dd1387e90808441e8748c33f0550a93e72ff203;hpb=e9070b6571e0fffb70b5a7f0625906d1627b37c1 diff --git a/src/sceneload.cc b/src/sceneload.cc index 28f5877..7459c1d 100644 --- a/src/sceneload.cc +++ b/src/sceneload.cc @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -13,6 +14,7 @@ #include #include #include +#include "assman.h" #include "app.h" #include "scene.h" #include "objmesh.h" @@ -36,6 +38,13 @@ static long assimp_time(const aiAnimation *anim, double aitime); static void print_hierarchy(const aiNode *node); */ +static aiFile *io_open(aiFileIO *io, const char *fname, const char *mode); +static void io_close(aiFileIO *io, aiFile *aifp); +static size_t io_read(aiFile *aifp, char *buf, size_t size, size_t count); +static size_t io_tell(aiFile *aifp); +static size_t io_filesize(aiFile *aifp); +static aiReturn io_seek(aiFile *aifp, size_t offs, aiOrigin whence); + struct LoaderData { const aiScene *aiscn; std::string fname; @@ -72,7 +81,11 @@ bool Scene::load(const char *fname, unsigned int flags) this->name = std::string(fname); } - const aiScene *aiscn = aiImportFile(fname, ppflags); + aiFileIO io; + io.OpenProc = io_open; + io.CloseProc = io_close; + + const aiScene *aiscn = aiImportFileEx(fname, ppflags, &io); if(!aiscn) { error_log("failed to load scene file: %s\n", fname); return false; @@ -400,3 +413,59 @@ void SceneSet::free_scene(Scene *scn) { delete scn; } + + +// ------ custom file I/O for assimp ------- + +static aiFile *io_open(aiFileIO *io, const char *fname, const char *mode) +{ + ass_file *fp; + if(!(fp = ass_fopen(fname, mode))) { + error_log("failed to open scene file: %s: %s\n", fname, strerror(ass_errno)); + return 0; + } + + aiFile *aifp = new aiFile; + aifp->ReadProc = io_read; + aifp->WriteProc = 0; + aifp->TellProc = io_tell; + aifp->FileSizeProc = io_filesize; + aifp->SeekProc = io_seek; + aifp->FlushProc = 0; + aifp->UserData = (aiUserData)fp; + return aifp; +} + +static void io_close(aiFileIO *io, aiFile *aifp) +{ + ass_fclose(aifp->UserData); + delete aifp; +} + +static size_t io_read(aiFile *aifp, char *buf, size_t size, size_t count) +{ + return ass_fread(buf, size, count, aifp->UserData); +} + +static size_t io_tell(aiFile *aifp) +{ + return ass_ftell(aifp->UserData); +} + +static size_t io_filesize(aiFile *aifp) +{ + ass_file *fp = aifp->UserData; + long cur = ass_ftell(fp); + ass_fseek(fp, 0, SEEK_END); + long off = ass_ftell(fp); + ass_fseek(fp, cur, SEEK_SET); + return off; +} + +static aiReturn io_seek(aiFile *aifp, size_t offs, aiOrigin whence) +{ + if(ass_fseek(aifp->UserData, offs, (int)whence) == -1) { + return aiReturn_FAILURE; + } + return aiReturn_SUCCESS; +}