Support resources divided in multiple parts

Every part is a resource itself, they are loaded in an array
This commit is contained in:
raysan5
2017-02-15 10:44:59 +01:00
parent 05f039f85f
commit 4cb3e4a240

View File

@ -83,6 +83,8 @@
RRES_TYPE_FONT_DATA, // Character { int value, recX, recY, recWidth, recHeight, offsetX, offsetY, xAdvance } RRES_TYPE_FONT_DATA, // Character { int value, recX, recY, recWidth, recHeight, offsetX, offsetY, xAdvance }
RRES_TYPE_DIRECTORY RRES_TYPE_DIRECTORY
} RRESDataType; } RRESDataType;
typedef struct RRESData *RRES;
#endif #endif
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
@ -93,9 +95,9 @@
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Module Functions Declaration // Module Functions Declaration
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
RRESDEF RRESData LoadResource(const char *rresFileName); //RRESDEF RRESData LoadResourceData(const char *rresFileName, int rresId, int part);
RRESDEF RRESData LoadResourceById(const char *rresFileName, int rresId); RRESDEF RRES LoadResource(const char *rresFileName, int rresId);
RRESDEF void UnloadResource(RRESData rres); RRESDEF void UnloadResource(RRESData *rres);
#endif // RRES_H #endif // RRES_H
@ -235,23 +237,11 @@ static void *DecompressData(const unsigned char *data, unsigned long compSize, i
// Module Functions Definition // Module Functions Definition
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Load resource from file (only one) // Load resource from file by id (could be multiple parts)
// 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
// NOTE: Returns uncompressed data with parameters, search resource by id // 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; RRESFileHeader fileHeader;
RRESInfoHeader infoHeader; RRESInfoHeader infoHeader;
@ -281,32 +271,41 @@ RRESDEF RRESData LoadResourceById(const char *fileName, int rresId)
// Read resource info and parameters // Read resource info and parameters
fread(&infoHeader, sizeof(RRESInfoHeader), 1, rresFile); fread(&infoHeader, sizeof(RRESInfoHeader), 1, rresFile);
rres = (RRES)malloc(sizeof(RRESData)*infoHeader.partsCount)
if (infoHeader.id == rresId) if (infoHeader.id == rresId)
{ {
// Register data type and parameters // Load all required resources parts
rres.type = infoHeader.dataType; for (int k = 0; k < infoHeader.partsCount; k++)
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)
{ {
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;
RRES_FREE(data); // 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);
// 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 else
{ {
@ -372,7 +371,6 @@ static void *DecompressData(const unsigned char *data, unsigned long compSize, i
return uncompData; return uncompData;
} }
// Some required functions for rres standalone module version // Some required functions for rres standalone module version
#if defined(RRES_STANDALONE) #if defined(RRES_STANDALONE)
// Outputs a trace log message (INFO, ERROR, WARNING) // 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 LoadShader(const char *vsText, int vsLength);
Shader LoadShaderV(rres.data, rres.param1); 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 // RRES_TYPE_IMAGE params: imgWidth, imgHeight, format, mipmaps;
int imgWidth, imgHeight; // RRES_TYPE_WAVE params: sampleCount, sampleRate, sampleSize, channels;
char colorFormat, mipmaps; // 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 // SpriteFont = RRES_TYPE_FONT_IMAGE chunk + RRES_TYPE_FONT_DATA chunk
int sampleCount, // Mesh = multiple RRES_TYPE_VERTEX chunks
short sampleRate, bps;
char channels, reserved;
// Mesh data params Ref: RIFF file-format: http://www.johnloomis.org/cpe102/asgn/asgn1/riff.html
int vertexCount, reserved;
short vertexTypesMask, vertexFormatsMask;
// Text data params
int charsCount;
int cultureCode;
*/ */