mirror of
https://github.com/raysan5/raylib.git
synced 2026-01-22 07:09:18 -05:00
Support resources divided in multiple parts
Every part is a resource itself, they are loaded in an array
This commit is contained in:
101
src/rres.h
101
src/rres.h
@ -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;
|
|
||||||
*/
|
*/
|
||||||
Reference in New Issue
Block a user