Add callbacks to allow an application to override file reading in raylib with it's own code.

This commit is contained in:
Jeffery Myers 2020-12-31 13:00:40 -08:00
parent 10b5e2e73a
commit 8cbdf2c69b
8 changed files with 55 additions and 14 deletions

View File

@ -2595,7 +2595,7 @@ bool SaveStorageValue(unsigned int position, int value)
unsigned int dataSize = 0; unsigned int dataSize = 0;
unsigned int newDataSize = 0; unsigned int newDataSize = 0;
unsigned char *fileData = LoadFileData(path, &dataSize); unsigned char *fileData = RLLoadFileData(path, &dataSize);
unsigned char *newFileData = NULL; unsigned char *newFileData = NULL;
if (fileData != NULL) if (fileData != NULL)
@ -2673,7 +2673,7 @@ int LoadStorageValue(unsigned int position)
#endif #endif
unsigned int dataSize = 0; unsigned int dataSize = 0;
unsigned char *fileData = LoadFileData(path, &dataSize); unsigned char *fileData = RLLoadFileData(path, &dataSize);
if (fileData != NULL) if (fileData != NULL)
{ {

View File

@ -1012,7 +1012,7 @@ ModelAnimation *LoadModelAnimations(const char *fileName, int *animCount)
#define IQM_VERSION 2 // only IQM version 2 supported #define IQM_VERSION 2 // only IQM version 2 supported
unsigned int fileSize = 0; unsigned int fileSize = 0;
unsigned char *fileData = LoadFileData(fileName, &fileSize); unsigned char *fileData = RLLoadFileData(fileName, &fileSize);
unsigned char *fileDataPtr = fileData; unsigned char *fileDataPtr = fileData;
typedef struct IQMHeader { typedef struct IQMHeader {
@ -3034,7 +3034,7 @@ static Model LoadOBJ(const char *fileName)
tinyobj_material_t *materials = NULL; tinyobj_material_t *materials = NULL;
unsigned int materialCount = 0; unsigned int materialCount = 0;
char *fileData = LoadFileText(fileName); char *fileData = RLLoadFileText(fileName);
if (fileData != NULL) if (fileData != NULL)
{ {
@ -3199,7 +3199,7 @@ static Model LoadIQM(const char *fileName)
#define MATERIAL_NAME_LENGTH 32 // Material name string length #define MATERIAL_NAME_LENGTH 32 // Material name string length
unsigned int fileSize = 0; unsigned int fileSize = 0;
unsigned char *fileData = LoadFileData(fileName, &fileSize); unsigned char *fileData = RLLoadFileData(fileName, &fileSize);
unsigned char *fileDataPtr = fileData; unsigned char *fileDataPtr = fileData;
// IQM file structs // IQM file structs
@ -3738,7 +3738,7 @@ static Model LoadGLTF(const char *fileName)
// glTF file loading // glTF file loading
unsigned int dataSize = 0; unsigned int dataSize = 0;
unsigned char *fileData = LoadFileData(fileName, &dataSize); unsigned char *fileData = RLLoadFileData(fileName, &dataSize);
if (fileData == NULL) return model; if (fileData == NULL) return model;

View File

@ -385,7 +385,7 @@ static Wave LoadMP3(const unsigned char *fileData, unsigned int fileSize); //
#if defined(RAUDIO_STANDALONE) #if defined(RAUDIO_STANDALONE)
static bool IsFileExtension(const char *fileName, const char *ext); // Check file extension static bool IsFileExtension(const char *fileName, const char *ext); // Check file extension
static unsigned char *LoadFileData(const char *fileName, unsigned int *bytesRead); // Load file data as byte array (read) static unsigned char *RLLoadFileData(const char *fileName, unsigned int *bytesRead); // Load file data as byte array (read)
static bool SaveFileData(const char *fileName, void *data, unsigned int bytesToWrite); // Save data to file from byte array (write) static bool SaveFileData(const char *fileName, void *data, unsigned int bytesToWrite); // Save data to file from byte array (write)
static bool SaveFileText(const char *fileName, char *text); // Save text data to file (write), string must be '\0' terminated static bool SaveFileText(const char *fileName, char *text); // Save text data to file (write), string must be '\0' terminated
#endif #endif
@ -690,7 +690,7 @@ Wave LoadWave(const char *fileName)
// Loading file to memory // Loading file to memory
unsigned int fileSize = 0; unsigned int fileSize = 0;
unsigned char *fileData = LoadFileData(fileName, &fileSize); unsigned char *fileData = RLLoadFileData(fileName, &fileSize);
if (fileData != NULL) if (fileData != NULL)
{ {
@ -2087,7 +2087,7 @@ static bool IsFileExtension(const char *fileName, const char *ext)
} }
// Load data from file into a buffer // Load data from file into a buffer
static unsigned char *LoadFileData(const char *fileName, unsigned int *bytesRead) static unsigned char *RLLoadFileData(const char *fileName, unsigned int *bytesRead)
{ {
unsigned char *data = NULL; unsigned char *data = NULL;
*bytesRead = 0; *bytesRead = 0;

View File

@ -979,6 +979,14 @@ RLAPI void TakeScreenshot(const char *fileName); // Takes a scr
RLAPI int GetRandomValue(int min, int max); // Returns a random value between min and max (both included) RLAPI int GetRandomValue(int min, int max); // Returns a random value between min and max (both included)
// Files management functions // Files management functions
// Virtual file system override functions
typedef unsigned char* (*LoadFileBinFunction)(const char* fileName, unsigned int* bytesRead); // Load file data as byte array (read)
typedef char* (*LoadFileTextFunction)(const char* fileName); // Load text data from file (read), returns a '\0' terminated string
RLAPI void SetFileSystemFunctions(LoadFileBinFunction loadBin, LoadFileTextFunction loadText); // override default file access functions
// Native File Management
RLAPI unsigned char *LoadFileData(const char *fileName, unsigned int *bytesRead); // Load file data as byte array (read) RLAPI unsigned char *LoadFileData(const char *fileName, unsigned int *bytesRead); // Load file data as byte array (read)
RLAPI void UnloadFileData(unsigned char *data); // Unload file data allocated by LoadFileData() RLAPI void UnloadFileData(unsigned char *data); // Unload file data allocated by LoadFileData()
RLAPI bool SaveFileData(const char *fileName, void *data, unsigned int bytesToWrite); // Save data to file from byte array (write), returns true on success RLAPI bool SaveFileData(const char *fileName, void *data, unsigned int bytesToWrite); // Save data to file from byte array (write), returns true on success
@ -1332,6 +1340,7 @@ RLAPI void DrawGizmo(Vector3 position);
// Model loading/unloading functions // Model loading/unloading functions
RLAPI Model LoadModel(const char *fileName); // Load model from files (meshes and materials) RLAPI Model LoadModel(const char *fileName); // Load model from files (meshes and materials)
RLAPI Model LoadModelFromMemory(const char* fileType, const unsigned char* fileData, int dataSize); // Load model from memory (meshes and materials)
RLAPI Model LoadModelFromMesh(Mesh mesh); // Load model from generated mesh (default material) RLAPI Model LoadModelFromMesh(Mesh mesh); // Load model from generated mesh (default material)
RLAPI void UnloadModel(Model model); // Unload model (including meshes) from memory (RAM and/or VRAM) RLAPI void UnloadModel(Model model); // Unload model (including meshes) from memory (RAM and/or VRAM)
RLAPI void UnloadModelKeepMeshes(Model model); // Unload model (but not meshes) from memory (RAM and/or VRAM) RLAPI void UnloadModelKeepMeshes(Model model); // Unload model (but not meshes) from memory (RAM and/or VRAM)

View File

@ -342,7 +342,7 @@ Font LoadFontEx(const char *fileName, int fontSize, int *fontChars, int charsCou
// Loading file to memory // Loading file to memory
unsigned int fileSize = 0; unsigned int fileSize = 0;
unsigned char *fileData = LoadFileData(fileName, &fileSize); unsigned char *fileData = RLLoadFileData(fileName, &fileSize);
if (fileData != NULL) if (fileData != NULL)
{ {
@ -1740,7 +1740,7 @@ static Font LoadBMFont(const char *fileName)
int base = 0; // Useless data int base = 0; // Useless data
char *fileText = LoadFileText(fileName); char *fileText = RLLoadFileText(fileName);
if (fileText == NULL) return font; if (fileText == NULL) return font;

View File

@ -210,7 +210,7 @@ Image LoadImage(const char *fileName)
// Loading file to memory // Loading file to memory
unsigned int fileSize = 0; unsigned int fileSize = 0;
unsigned char *fileData = LoadFileData(fileName, &fileSize); unsigned char *fileData = RLLoadFileData(fileName, &fileSize);
if (fileData != NULL) if (fileData != NULL)
{ {
@ -232,7 +232,7 @@ Image LoadImageRaw(const char *fileName, int width, int height, int format, int
Image image = { 0 }; Image image = { 0 };
unsigned int dataSize = 0; unsigned int dataSize = 0;
unsigned char *fileData = LoadFileData(fileName, &dataSize); unsigned char *fileData = RLLoadFileData(fileName, &dataSize);
if (fileData != NULL) if (fileData != NULL)
{ {
@ -268,7 +268,7 @@ Image LoadImageAnim(const char *fileName, int *frames)
if (IsFileExtension(fileName, ".gif")) if (IsFileExtension(fileName, ".gif"))
{ {
unsigned int dataSize = 0; unsigned int dataSize = 0;
unsigned char *fileData = LoadFileData(fileName, &dataSize); unsigned char *fileData = RLLoadFileData(fileName, &dataSize);
if (fileData != NULL) if (fileData != NULL)
{ {

View File

@ -175,6 +175,32 @@ void MemFree(void *ptr)
RL_FREE(ptr); RL_FREE(ptr);
} }
LoadFileBinFunction LoadBinCallback = NULL;
LoadFileTextFunction LoadFileTextCallback = NULL;
// virtual file systems functions
void SetFileSystemFunctions(LoadFileBinFunction loadBin, LoadFileTextFunction loadText)
{
LoadBinCallback = loadBin;
LoadFileTextCallback = loadText;
}
unsigned char* RLLoadFileData(const char* fileName, unsigned int* bytesRead)
{
if (LoadBinCallback != NULL)
return LoadBinCallback(fileName, bytesRead);
return LoadFileData(fileName, bytesRead);
}
char* RLLoadFileText(const char* fileName)
{
if (LoadFileTextCallback != NULL)
return LoadFileTextCallback(fileName);
return LoadFileText(fileName);
}
// Load data from file into a buffer // Load data from file into a buffer
unsigned char *LoadFileData(const char *fileName, unsigned int *bytesRead) unsigned char *LoadFileData(const char *fileName, unsigned int *bytesRead)
{ {

View File

@ -27,6 +27,12 @@
#ifndef UTILS_H #ifndef UTILS_H
#define UTILS_H #define UTILS_H
// internal loader functions that may or may not call the virtual file system
unsigned char* RLLoadFileData(const char* fileName, unsigned int* bytesRead);
void RLUnloadFileData(unsigned char* data);
char* RLLoadFileText(const char* fileName);
void RLUnloadFileText(unsigned char* text);
#if defined(PLATFORM_ANDROID) #if defined(PLATFORM_ANDROID)
#include <stdio.h> // Required for: FILE #include <stdio.h> // Required for: FILE
#include <android/asset_manager.h> // Required for: AAssetManager #include <android/asset_manager.h> // Required for: AAssetManager