diff --git a/resource/main.cpp b/resource/main.cpp index 1fea482..9431a04 100644 --- a/resource/main.cpp +++ b/resource/main.cpp @@ -10,16 +10,14 @@ using namespace std; #include \n\ \n\ namespace Resource {\n\ -typedef std::unordered_map ResourceMap;\n" - -#define FILE_END "\n\ -}\n\ -}\n" +typedef std::unordered_map ResourceMap;\n\ +typedef std::unordered_map ResourceSizeMap;\n" unsigned int n = 0; bool addFile(const string &inFile, FILE *out) { + unsigned int size = 0; FILE *in = fopen(inFile.c_str(), "r"); if(in == NULL) { @@ -32,12 +30,14 @@ bool addFile(const string &inFile, FILE *out) do { nbRead = fread(ptr, sizeof(char), NB_VAL_PER_LINE, in); + size += nbRead; for(unsigned int i=0; i #include +#include #define RESOURCE_PACK(pack) namespace Resource {\ void getResourcePack_ ## pack(ResourceMap &resourceFilesData);\ +void getResourceSizes_ ## pack(ResourceSizeMap &resourceFilesSizes);\ } /** * To load an attached resource pack file, you must declare the pack with : * RESOURCE_PACK(pack_name) + * * it will allow you to use the function : * getResourcePack_pack_name(ResourceMap &map) * This function will give access the the embedded data through its original file name, * using the provided map. * + * it will also allow you to use the function : + * getResourceSizes_pack_name(ResourceSizeMap &map) + * This function will give access the the size of the embedded data. + * * example : * RESOURCE_PACK(shaders) // declaring the resource pack function * Resource::ResourceMap myShaders; // defining a resource map @@ -23,7 +30,59 @@ void getResourcePack_ ## pack(ResourceMap &resourceFilesData);\ * string *shader = new string(myShaders["shaders/shaderFile.glsl"]); // getting a resource file */ namespace Resource { - typedef std::unordered_map ResourceMap; -} + +typedef std::unordered_map ResourceMap; +typedef std::unordered_map ResourceSizeMap; + +/* + * Reader is a wrapper that allows you to read files and resources exactly the same way + */ + +class Reader +{ +public: + /** + * inspired from cstdio standard fread + * http://www.cplusplus.com/reference/cstdio/fread + */ + virtual size_t read (void * ptr, size_t size, size_t count) = 0; +}; + +class FileReader +{ + FILE* m_stream; + +public: + FileReader(FILE* stream) : m_stream(stream) {} + + virtual size_t read (void * ptr, size_t size, size_t count) + { return fread ( ptr, size, count, m_stream ); } +}; + +class ResourceReader +{ + unsigned char* m_ptr; + size_t m_size; + size_t m_cursor; + +public: + ResourceReader(unsigned char* ptr, size_t size) : m_ptr(ptr), m_size(size), m_cursor(0) {} + + virtual size_t read (void * ptr, size_t size, size_t count) + { + size_t nbRead = 0; + unsigned char* p = (unsigned char*)ptr; + while(m_cursor + size < m_size && nbRead < count) + { + for(size_t i=0; i