aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorraysan5 <raysan5@gmail.com>2017-02-15 10:44:59 +0100
committerraysan5 <raysan5@gmail.com>2017-02-15 10:44:59 +0100
commit4cb3e4a240d342a08a97cb4659c18c34d8dccdc8 (patch)
tree442777565b9494cbc2e015c21ef9a582849e9dc4 /src
parent05f039f85fb43f9ae4598747a4d9c6770ec5774b (diff)
downloadraylib-4cb3e4a240d342a08a97cb4659c18c34d8dccdc8.tar.gz
raylib-4cb3e4a240d342a08a97cb4659c18c34d8dccdc8.zip
Support resources divided in multiple parts
Every part is a resource itself, they are loaded in an array
Diffstat (limited to 'src')
-rw-r--r--src/rres.h105
1 files changed, 50 insertions, 55 deletions
diff --git a/src/rres.h b/src/rres.h
index 700c9ab3..32f0ab6b 100644
--- a/src/rres.h
+++ b/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;
*/ \ No newline at end of file