summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorraysan5 <[email protected]>2017-01-15 01:11:38 +0100
committerraysan5 <[email protected]>2017-01-15 01:11:38 +0100
commit53457e466477e3d3d47477d2b319035433386063 (patch)
tree7c43fe7571ce134b07e518dfa174586e5a57923f /src
parente5a2def57f96567c23072c95afeceeb9e76f7e10 (diff)
downloadraylib-53457e466477e3d3d47477d2b319035433386063.tar.gz
raylib-53457e466477e3d3d47477d2b319035433386063.zip
Work on rres file format -IN PROGRESS-
Diffstat (limited to 'src')
-rw-r--r--src/rres.h180
1 files changed, 87 insertions, 93 deletions
diff --git a/src/rres.h b/src/rres.h
index dcf7be3f..700c9ab3 100644
--- a/src/rres.h
+++ b/src/rres.h
@@ -61,6 +61,7 @@
//----------------------------------------------------------------------------------
#if defined(RRES_STANDALONE)
// rRES data returned when reading a resource, it contains all required data for user (24 byte)
+ // NOTE: Using void *data pointer, so we can load to image.data, wave.data, mesh.*, (unsigned char *)
typedef struct {
unsigned int type; // Resource type (4 byte)
@@ -73,11 +74,14 @@
} RRESData;
typedef enum {
- RRES_RAW = 0,
- RRES_IMAGE,
- RRES_WAVE,
- RRES_VERTEX,
- RRES_TEXT
+ RRES_TYPE_RAW = 0,
+ RRES_TYPE_IMAGE,
+ RRES_TYPE_WAVE,
+ RRES_TYPE_VERTEX,
+ RRES_TYPE_TEXT,
+ RRES_TYPE_FONT_IMAGE,
+ RRES_TYPE_FONT_DATA, // Character { int value, recX, recY, recWidth, recHeight, offsetX, offsetY, xAdvance }
+ RRES_TYPE_DIRECTORY
} RRESDataType;
#endif
@@ -133,11 +137,13 @@ typedef struct {
unsigned short count; // Number of resources in this file (2 byte)
} RRESFileHeader;
-// rRES info header, every resource includes this header (12 byte + 16 byte)
+// rRES info header, every resource includes this header (16 byte + 16 byte)
typedef struct {
- unsigned short id; // Resource unique identifier (2 byte)
+ unsigned int id; // Resource unique identifier (4 byte)
unsigned char dataType; // Resource data type (1 byte)
unsigned char compType; // Resource data compression type (1 byte)
+ unsigned char cryptoType; // Resource data encryption type (1 byte)
+ unsigned char partsCount; // Resource data parts count, used for splitted data (1 byte)
unsigned int dataSize; // Resource data size (compressed or not, only DATA) (4 byte)
unsigned int uncompSize; // Resource data size (uncompressed, only DATA) (4 byte)
@@ -153,11 +159,66 @@ typedef enum {
RRES_COMP_DEFLATE, // DEFLATE compression
RRES_COMP_LZ4, // LZ4 compression
RRES_COMP_LZMA, // LZMA compression
- // brotli, zopfli, gzip // Other compression algorythms...
+ RRES_COMP_BROTLI, // BROTLI compression
+ // gzip, zopfli, lzo, zstd // Other compression algorythms...
} RRESCompressionType;
+typedef enum {
+ RRES_CRYPTO_NONE = 0, // No data encryption
+ RRES_CRYPTO_XOR, // XOR (128 bit) encryption
+ RRES_CRYPTO_AES, // RIJNDAEL (128 bit) encryption (AES)
+ RRES_CRYPTO_TDES, // Triple DES encryption
+ RRES_CRYPTO_BLOWFISH, // BLOWFISH encryption
+ RRES_CRYPTO_XTEA, // XTEA encryption
+ // twofish, RC5, RC6 // Other encryption algorythm...
+} RRESEncryptionType;
+
+typedef enum {
+ RRES_IM_UNCOMP_GRAYSCALE = 1, // 8 bit per pixel (no alpha)
+ RRES_IM_UNCOMP_GRAY_ALPHA, // 16 bpp (2 channels)
+ RRES_IM_UNCOMP_R5G6B5, // 16 bpp
+ RRES_IM_UNCOMP_R8G8B8, // 24 bpp
+ RRES_IM_UNCOMP_R5G5B5A1, // 16 bpp (1 bit alpha)
+ RRES_IM_UNCOMP_R4G4B4A4, // 16 bpp (4 bit alpha)
+ RRES_IM_UNCOMP_R8G8B8A8, // 32 bpp
+ RRES_IM_COMP_DXT1_RGB, // 4 bpp (no alpha)
+ RRES_IM_COMP_DXT1_RGBA, // 4 bpp (1 bit alpha)
+ RRES_IM_COMP_DXT3_RGBA, // 8 bpp
+ RRES_IM_COMP_DXT5_RGBA, // 8 bpp
+ RRES_IM_COMP_ETC1_RGB, // 4 bpp
+ RRES_IM_COMP_ETC2_RGB, // 4 bpp
+ RRES_IM_COMP_ETC2_EAC_RGBA, // 8 bpp
+ RRES_IM_COMP_PVRT_RGB, // 4 bpp
+ RRES_IM_COMP_PVRT_RGBA, // 4 bpp
+ RRES_IM_COMP_ASTC_4x4_RGBA, // 8 bpp
+ RRES_IM_COMP_ASTC_8x8_RGBA // 2 bpp
+ //...
+} RRESImageFormat;
+
+typedef enum {
+ RRES_VERT_POSITION,
+ RRES_VERT_TEXCOORD1,
+ RRES_VERT_TEXCOORD2,
+ RRES_VERT_TEXCOORD3,
+ RRES_VERT_TEXCOORD4,
+ RRES_VERT_NORMAL,
+ RRES_VERT_TANGENT,
+ RRES_VERT_COLOR,
+ RRES_VERT_INDEX,
+ //...
+} RRESVertexType;
+
+typedef enum {
+ RRES_VERT_BYTE,
+ RRES_VERT_SHORT,
+ RRES_VERT_INT,
+ RRES_VERT_HFLOAT,
+ RRES_VERT_FLOAT,
+ //...
+} RRESVertexFormat;
+
#if defined(RRES_STANDALONE)
-typedef enum { INFO = 0, ERROR, WARNING, DEBUG, OTHER } TraceLogType;
+typedef enum { LOG_INFO = 0, LOG_ERROR, LOG_WARNING, LOG_DEBUG, LOG_OTHER } TraceLogType;
#endif
//----------------------------------------------------------------------------------
@@ -178,61 +239,11 @@ static void *DecompressData(const unsigned char *data, unsigned long compSize, i
// NOTE: Returns uncompressed data with parameters, only first resource found
RRESDEF RRESData LoadResource(const char *fileName)
{
+ // Force loading first resource available
RRESData rres = { 0 };
- RRESFileHeader fileHeader;
- RRESInfoHeader infoHeader;
-
- FILE *rresFile = fopen(fileName, "rb");
-
- if (rresFile == NULL) TraceLog(WARNING, "[%s] rRES raylib resource file could not be opened", fileName);
- else
- {
- // Read rres file info header
- fread(&fileHeader.id[0], sizeof(char), 1, rresFile);
- fread(&fileHeader.id[1], sizeof(char), 1, rresFile);
- fread(&fileHeader.id[2], sizeof(char), 1, rresFile);
- fread(&fileHeader.id[3], sizeof(char), 1, rresFile);
- fread(&fileHeader.version, sizeof(short), 1, rresFile);
- fread(&fileHeader.count, sizeof(short), 1, rresFile);
-
- // Verify "rRES" identifier
- if ((fileHeader.id[0] != 'r') && (fileHeader.id[1] != 'R') && (fileHeader.id[2] != 'E') && (fileHeader.id[3] != 'S'))
- {
- TraceLog(WARNING, "[%s] This is not a valid raylib resource file", fileName);
- }
- else
- {
- // Read first resource info and parameters
- fread(&infoHeader, sizeof(RRESInfoHeader), 1, rresFile);
-
- // 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)
- {
- void *uncompData = DecompressData(data, infoHeader.dataSize, infoHeader.uncompSize);
-
- rres.data = uncompData;
-
- RRES_FREE(data);
- }
- else rres.data = data;
-
- if (rres.data != NULL) TraceLog(INFO, "[%s] Resource data loaded successfully", fileName);
- }
-
- fclose(rresFile);
- }
-
+ rres = LoadResourceById(fileName, 0);
+
return rres;
}
@@ -293,7 +304,9 @@ RRESDEF RRESData LoadResourceById(const char *fileName, int rresId)
}
else rres.data = data;
- if (rres.data != NULL) TraceLog(INFO, "[%s][ID %i] Resource data loaded successfully", fileName, (int)rresId);
+ 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
{
@@ -302,7 +315,7 @@ RRESDEF RRESData LoadResourceById(const char *fileName, int rresId)
}
}
- if (rres.data == NULL) TraceLog(WARNING, "[%s][ID %i] Requested resource could not be found, wrong id?", fileName, (int)rresId);
+ if (rres.data == NULL) TraceLog(WARNING, "[%s][ID %i] Requested resource could not be found", fileName, (int)rresId);
}
fclose(rresFile);
@@ -364,7 +377,7 @@ static void *DecompressData(const unsigned char *data, unsigned long compSize, i
#if defined(RRES_STANDALONE)
// Outputs a trace log message (INFO, ERROR, WARNING)
// NOTE: If a file has been init, output log is written there
-void TraceLog(int msgType, const char *text, ...)
+void TraceLog(int logType, const char *text, ...)
{
va_list args;
int traceDebugMsgs = 0;
@@ -375,14 +388,14 @@ void TraceLog(int msgType, const char *text, ...)
switch (msgType)
{
- case INFO: fprintf(stdout, "INFO: "); break;
- case ERROR: fprintf(stdout, "ERROR: "); break;
- case WARNING: fprintf(stdout, "WARNING: "); break;
- case DEBUG: if (traceDebugMsgs) fprintf(stdout, "DEBUG: "); break;
+ case LOG_INFO: fprintf(stdout, "INFO: "); break;
+ case LOG_ERROR: fprintf(stdout, "ERROR: "); break;
+ case LOG_WARNING: fprintf(stdout, "WARNING: "); break;
+ case LOG_DEBUG: if (traceDebugMsgs) fprintf(stdout, "DEBUG: "); break;
default: break;
}
- if ((msgType != DEBUG) || ((msgType == DEBUG) && (traceDebugMsgs)))
+ if ((msgType != LOG_DEBUG) || ((msgType == LOG_DEBUG) && (traceDebugMsgs)))
{
va_start(args, text);
vfprintf(stdout, text, args);
@@ -397,33 +410,13 @@ void TraceLog(int msgType, const char *text, ...)
#endif // RAYGUI_IMPLEMENTATION
-
/*
-//T LoadResource(const char *rresFileName, int resId);
-
-// ASSUMPTION: rRES files only contain one resource (solution to id requirement...)
-
-// Now, rres file check and data loading can be managed inside each function:
-Image LoadImage(); // -> Texture2D
-Wave LoadWave() // -> Sound, Music
-const char *LoadText(); // -> Shader, Material
-
-// NOTE: RRESData uses void* data pointer, so we can load to image.data, wave.data, mesh.*, (unsigned char *)
-
-Image LoadImagePro(void *data, int width, int height, int format);
-Image LoadImagePro(rres.data, rres.param1, rres.param2, rres.param3);
-
Mesh LoadMeshEx(int numVertex, float *vData, float *vtData, float *vnData, Color *cData);
Mesh LoadMeshEx(rres.param1, rres.data, rres.data + offset, rres.data + offset*2, rres.data + offset*3);
-Shader LoadShaderV(const char *vsText, int vsLength);
+Shader LoadShader(const char *vsText, int vsLength);
Shader LoadShaderV(rres.data, rres.param1);
-Wave LoadWaveEx(void *data, int sampleCount, int sampleRate, int sampleSize, int channels);
-Wave LoadWaveEx(rres.data, rres.param1, (int)rres.param2, (int)rres.param3, (int)rres.param4);
-
-// Max value for an unsigned short: 65535
-
// Parameters information depending on resource type (IMAGE, WAVE, MESH, TEXT)
// Image data params
@@ -431,6 +424,7 @@ int imgWidth, imgHeight;
char colorFormat, mipmaps;
// Wave data params
+int sampleCount,
short sampleRate, bps;
char channels, reserved;
@@ -439,6 +433,6 @@ int vertexCount, reserved;
short vertexTypesMask, vertexFormatsMask;
// Text data params
-int numChars;
-char textFormat, language, charsetCode;
+int charsCount;
+int cultureCode;
*/ \ No newline at end of file