ソースを参照

Support resources divided in multiple parts

Every part is a resource itself, they are loaded in an array
raysan5 8 年 前
コミット
4cb3e4a240
1 ファイル変更50 行追加55 行削除
  1. 50 55
      src/rres.h

+ 50 - 55
src/rres.h

@@ -83,6 +83,8 @@
         RRES_TYPE_FONT_DATA,        // Character { int value, recX, recY, recWidth, recHeight, offsetX, offsetY, xAdvance } 
         RRES_TYPE_DIRECTORY
     } RRESDataType;
+    
+    typedef struct RRESData *RRES;
 #endif
 
 //----------------------------------------------------------------------------------
@@ -93,9 +95,9 @@
 //----------------------------------------------------------------------------------
 // Module Functions Declaration
 //----------------------------------------------------------------------------------
-RRESDEF RRESData LoadResource(const char *rresFileName);
-RRESDEF RRESData LoadResourceById(const char *rresFileName, int rresId);
-RRESDEF void UnloadResource(RRESData rres);
+//RRESDEF RRESData LoadResourceData(const char *rresFileName, int rresId, int part);
+RRESDEF RRES LoadResource(const char *rresFileName, int rresId);
+RRESDEF void UnloadResource(RRESData *rres);
 
 #endif // RRES_H
 
@@ -235,24 +237,12 @@ static void *DecompressData(const unsigned char *data, unsigned long compSize, i
 // Module Functions Definition
 //----------------------------------------------------------------------------------
 
-// Load resource from file (only one)
-// NOTE: Returns uncompressed data with parameters, only first resource found
-RRESDEF RRESData LoadResource(const char *fileName)
-{
-    // Force loading first resource available
-    RRESData rres = { 0 };
-    
-    rres = LoadResourceById(fileName, 0);
-   
-    return rres;
-}
-
-// Load resource from file by id
+// Load resource from file by id (could be multiple parts)
 // NOTE: Returns uncompressed data with parameters, search resource by id
-RRESDEF RRESData LoadResourceById(const char *fileName, int rresId)
+RRESDEF RRES LoadResource(const char *fileName, int rresId)
 {
-    RRESData rres = { 0 };
-    
+    RRES rres;
+       
     RRESFileHeader fileHeader;
     RRESInfoHeader infoHeader;
     
@@ -280,33 +270,42 @@ RRESDEF RRESData LoadResourceById(const char *fileName, int rresId)
             {
                 // Read resource info and parameters
                 fread(&infoHeader, sizeof(RRESInfoHeader), 1, rresFile);
-
+                
+                rres = (RRES)malloc(sizeof(RRESData)*infoHeader.partsCount)
+                
                 if (infoHeader.id == rresId)
                 {
-                    // Register data type and parameters
-                    rres.type = infoHeader.dataType;
-                    rres.param1 = infoHeader.param1;
-                    rres.param2 = infoHeader.param2;
-                    rres.param3 = infoHeader.param3;
-                    rres.param4 = infoHeader.param4;
-
-                    // Read resource data block
-                    void *data = RRES_MALLOC(infoHeader.dataSize);
-                    fread(data, infoHeader.dataSize, 1, rresFile);
-
-                    if (infoHeader.compType == RRES_COMP_DEFLATE)
+                    // Load all required resources parts
+                    for (int k = 0; k < infoHeader.partsCount; k++)
                     {
-                        void *uncompData = DecompressData(data, infoHeader.dataSize, infoHeader.uncompSize);
+                        // TODO: Verify again that rresId is the same in every part
                         
-                        rres.data = uncompData;
+                        // Register data type and parameters
+                        rres[k].type = infoHeader.dataType;
+                        rres[k].param1 = infoHeader.param1;
+                        rres[k].param2 = infoHeader.param2;
+                        rres[k].param3 = infoHeader.param3;
+                        rres[k].param4 = infoHeader.param4;
+
+                        // Read resource data block
+                        void *data = RRES_MALLOC(infoHeader.dataSize);
+                        fread(data, infoHeader.dataSize, 1, rresFile);
+
+                        if (infoHeader.compType == RRES_COMP_DEFLATE)
+                        {
+                            void *uncompData = DecompressData(data, infoHeader.dataSize, infoHeader.uncompSize);
+                            
+                            rres[k].data = uncompData;
+                            
+                            RRES_FREE(data);
+                        }
+                        else rres[k].data = data;
+
+                        if (rres[k].data != NULL) TraceLog(INFO, "[%s][ID %i] Resource data loaded successfully", fileName, (int)infoHeader.id);
                         
-                        RRES_FREE(data);
+                        // Read next part
+                        fread(&infoHeader, sizeof(RRESInfoHeader), 1, rresFile); 
                     }
-                    else rres.data = data;
-
-                    if (rres.data != NULL) TraceLog(INFO, "[%s][ID %i] Resource data loaded successfully", fileName, (int)infoHeader.id);
-                    
-                    if (rresId == 0) break;     // Break for loop, do not check next resource
                 }
                 else
                 {
@@ -372,7 +371,6 @@ static void *DecompressData(const unsigned char *data, unsigned long compSize, i
     return uncompData;
 }
 
-
 // Some required functions for rres standalone module version
 #if defined(RRES_STANDALONE)
 // Outputs a trace log message (INFO, ERROR, WARNING)
@@ -417,22 +415,19 @@ Mesh LoadMeshEx(rres.param1, rres.data, rres.data + offset, rres.data + offset*2
 Shader LoadShader(const char *vsText, int vsLength);
 Shader LoadShaderV(rres.data, rres.param1);
 
-// Parameters information depending on resource type (IMAGE, WAVE, MESH, TEXT)
+// Parameters information depending on resource type
 
-// Image data params
-int imgWidth, imgHeight;
-char colorFormat, mipmaps;
+// RRES_TYPE_IMAGE params:      imgWidth, imgHeight, format, mipmaps;
+// RRES_TYPE_WAVE params:       sampleCount, sampleRate, sampleSize, channels;
+// RRES_TYPE_FONT_IMAGE params: imgWidth, imgHeight, format, mipmaps;
+// RRES_TYPE_FONT_DATA params:  charsCount, baseSize
+// RRES_TYPE_VERTEX params:     vertexCount, vertexType, vertexFormat        // Use masks instead?
+// RRES_TYPE_TEXT params:       charsCount, cultureCode
+// RRES_TYPE_DIRECTORY params:  fileCount, directoryCount
 
-// Wave data params
-int sampleCount,
-short sampleRate, bps;
-char channels, reserved;
+// SpriteFont = RRES_TYPE_FONT_IMAGE chunk + RRES_TYPE_FONT_DATA chunk
+// Mesh = multiple RRES_TYPE_VERTEX chunks
 
-// Mesh data params
-int vertexCount, reserved;
-short vertexTypesMask, vertexFormatsMask;
+Ref: RIFF file-format: http://www.johnloomis.org/cpe102/asgn/asgn1/riff.html
 
-// Text data params
-int charsCount;
-int cultureCode;
 */