diff --git a/include/systems/Renderer.h b/include/systems/Renderer.h index f13eca2..b777d42 100644 --- a/include/systems/Renderer.h +++ b/include/systems/Renderer.h @@ -182,9 +182,9 @@ void Renderer_Initialize(ContextWindow *window, size_t initialTextureCapacity); void Renderer_Terminate(); /// @brief Configures the main shaders for the renderer. -/// @param vertexShaderSource Source code of the main vertex shader. -/// @param fragmentShaderSource Source code of the main fragment shader. -void Renderer_ConfigureShaders(StringView vertexShaderSource, StringView fragmentShaderSource); +/// @param vertexShaderFile Path and file name of the main vertex shader. The path is relative to the resources folder in executable file directory. +/// @param fragmentShaderFile Path and file name of the main fragment shader. The path is relative to the resources folder in executable file directory. +void Renderer_ConfigureShaders(StringView vertexShaderFile, StringView fragmentShaderFile); /// @brief Should be called before using rendering functions. void Renderer_StartRendering(); @@ -201,10 +201,10 @@ void Renderer_RenderScene(RendererScene *scene); #pragma region Renderer Debug /// @brief Initialize function for renderer debug functions. Should be called after the Renderer_Initialize function. -/// @param vertexShaderSource The source file for debug vertex shader. -/// @param fragmentShaderSource The source file for debug fragment shader. +/// @param vertexShaderFile The source file for debug vertex shader. +/// @param fragmentShaderFile The source file for debug fragment shader. /// @param initialVertexCapacity The initial capacity for the vertex buffer. -void RendererDebug_Initialize(StringView vertexShaderSource, StringView fragmentShaderSource, size_t initialVertexCapacity); +void RendererDebug_Initialize(StringView vertexShaderFile, StringView fragmentShaderFile, size_t initialVertexCapacity); /// @brief Terminator for renderer debug functions. void RendererDebug_Terminate(); @@ -234,10 +234,9 @@ void RendererDebug_DrawBoxLines(Vector3 position, Vector3 size, Color color); #pragma region Renderer Material /// @brief Creates materials from a material file (prefer .mat). File can contain multiple materials but textures of them will be ignored. Use RendererMaterial_CreateFromFileTextured and to create a material with texture. -/// @param matFileData Source code of the material file. -/// @param matFileLineCount Number of lines in the material file source. +/// @param matFile Path and file name of the material (.mat) file. The path is relative to the resources folder in executable file directory. /// @return Created material list type of the list is RendererMaterial*. -ListArray RendererMaterial_CreateFromFile(StringView matFileData, size_t matFileLineCount); +ListArray RendererMaterial_CreateFromFile(StringView matFile); /// @brief Creates materials from a material file (prefer .mat) with the argument texture. It copies the texture data into OpenGL so the original data can be freed after this function. /// @param matFileData Source code of the material file. @@ -259,22 +258,19 @@ void RendererMaterial_Destroy(RendererMaterial *material); // todo fix docs /// @brief Creates a model from an MDL file source. The .obj and its other files (like .mtl) must be in the same directory. Only supports models with triangular faces. doesn't support objects with normal maps but without UVs (x//x signature). -/// @param mdlFileData Source code of the OBJ file. -/// @param mdlFileLineCount Number of lines in the OBJ file source. +/// @param matFile Path and file name of the model (.mat) file. The path is relative to the resources folder in executable file directory. /// @param materialPool Pointer to a list array of material pointer pointers (RendererMaterial **) to use for the model. /// @param positionOffset Position offset to freely adjust final model position. /// @param rotationOffset Rotation offset to freely adjust final model rotation. /// @param scaleOffset Scale offset to freely adjust final model scale. /// @return Created model with vertices and indices. -RendererModel *RendererModel_Create(StringView mdlFileData, size_t mdlFileLineCount, const ListArray *materialPool, Vector3 positionOffset, Vector3 rotationOffset, Vector3 scaleOffset); +RendererModel *RendererModel_Create(StringView mdlFile, const ListArray *materialPool, Vector3 positionOffset, Vector3 rotationOffset, Vector3 scaleOffset); // todo fix docs /// @brief Creates a model from an MDL file source. The .obj and its other files (like .mtl) must be in the same directory. Only supports models with triangular faces. doesn't support objects with normal maps but without UVs (x//x signature). -/// @param mdlFileData Source code of the OBJ file. -/// @param mdlFileLineCount Number of lines in the OBJ file source. -/// @param materialPool Pointer to a list array of material pointer pointers (RendererMaterial **) to use for the model. +/// @param matFile Path and file name of the model (.mat) file. The path is relative to the resources folder in executable file directory. /// @return Created model with vertices and indices. -ListArray RendererModel_CreateFromFile(StringView mdlFileData, size_t mdlFileLineCount, const ListArray *materialPool); +ListArray RendererModel_CreateFromFile(StringView mdlFile, const ListArray *materialPool); /// @brief Destroyer function for renderer model. /// @param model Model to destroy. @@ -292,15 +288,14 @@ RendererScene *RendererScene_CreateEmpty(StringView name, size_t initialBatchCap // todo fix docs /// @brief -/// @param scnFileData -/// @param scnFileLineCount +/// @param scnFile /// @param modelPool /// @param objectReferences /// @param transformOffsetInObject /// @param totalObjectSize /// @param objectCount /// @return -RendererScene *RendererScene_CreateFromFile(StringView scnFileData, size_t scnFileLineCount, const ListArray *modelPool, void *objectReferences, size_t transformOffsetInObject, size_t totalObjectSize, size_t objectCount); +RendererScene *RendererScene_CreateFromFile(StringView scnFile, const ListArray *modelPool, void *objectReferences, size_t transformOffsetInObject, size_t totalObjectSize, size_t objectCount); /// @brief Destroyer function for object scene /// @param scene Scene to destroy diff --git a/include/tools/Resources.h b/include/tools/Resources.h index f10f9ff..0ba9fd9 100644 --- a/include/tools/Resources.h +++ b/include/tools/Resources.h @@ -15,8 +15,7 @@ /// @brief Resource representation for text files. typedef struct ResourceText { - String name; - String path; + String file; String data; size_t lineCount; } ResourceText; @@ -24,8 +23,7 @@ typedef struct ResourceText /// @brief Resource representation for image files. typedef struct ResourceImage { - String name; - String path; + String file; void *data; Vector2Int size; int channels; @@ -36,10 +34,9 @@ typedef struct ResourceImage #pragma region ResourceText /// @brief Creates a new resource. -/// @param name The name of the resource file. (e.g. "vertex.glsl") -/// @param path The file path of the resource in resources folder. Excluding file name. (e.g. "shaders/"). +/// @param file The file path of the resource in resources folder. Including file name. (e.g. "shaders/vertex.glsl"). /// @return Pointer to the created resource. -ResourceText *ResourceText_Create(StringView name, StringView path); +ResourceText *ResourceText_Create(StringView file); /// @brief Destroys a resource. /// @param resource The resource to destroy. @@ -50,10 +47,9 @@ void ResourceText_Destroy(ResourceText *resource); #pragma region ResourceImage /// @brief Creates a new resource image. Looks for a resources folder in executable directory. -/// @param name The name of the resource image. (e.g. "texture.png") -/// @param path The file path of the resource image in resources folder. Excluding file name. (e.g. "images/"). +/// @param file The file path of the resource image in resources folder. Including file name. (e.g. "images/texture.png"). /// @return Pointer to the created resource image. -ResourceImage *ResourceImage_Create(StringView name, StringView path); +ResourceImage *ResourceImage_Create(StringView file); /// @brief Destroys a resource image. /// @param resourceImage The resource image to destroy. diff --git a/include/utilities/String.h b/include/utilities/String.h index 2acc4da..ca50566 100644 --- a/include/utilities/String.h +++ b/include/utilities/String.h @@ -26,7 +26,7 @@ typedef struct StringView /// @brief Creates a new String object from a char array safely. Allocates its own memory and copies the string. Can be used with dynamic strings. /// @param string Any char pointer. /// @param length Length of the given string. -/// @return Newly created String object holding a pointer to copy of the original string. +/// @return Newly created null terminated String object holding a pointer to copy of the original string. String String_CreateCopySafe(const char *string, size_t length); /// @brief Create a owner copy of the given string it can be a view or owner. diff --git a/src/systems/Renderer.c b/src/systems/Renderer.c index 3ee766f..8454294 100644 --- a/src/systems/Renderer.c +++ b/src/systems/Renderer.c @@ -1,5 +1,7 @@ #include "systems/Renderer.h" +#include "tools/Resources.h" + #include "utilities/Timer.h" #include "utilities/Maths.h" @@ -286,20 +288,25 @@ void Renderer_Terminate() RJGlobal_DebugInfo("Renderer terminated successfully."); } -void Renderer_ConfigureShaders(StringView vertexShaderSource, StringView fragmentShaderSource) +void Renderer_ConfigureShaders(StringView vertexShaderFile, StringView fragmentShaderFile) { if (RENDERER_MAIN_SHADER_PROGRAM != 0) { glDeleteProgram(RENDERER_MAIN_SHADER_PROGRAM); } + ResourceText *rscVertexShader = ResourceText_Create(vertexShaderFile); + ResourceText *rscFragmentShader = ResourceText_Create(fragmentShaderFile); + GLint glslHasCompiled = 0; char glslInfoLog[RENDERER_OPENGL_INFO_LOG_BUFFER] = {0}; unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER); - glShaderSource(vertexShader, 1, (const GLchar *const *)&vertexShaderSource.characters, NULL); + glShaderSource(vertexShader, 1, (const GLchar *const *)&rscVertexShader->data.characters, NULL); glCompileShader(vertexShader); + ResourceText_Destroy(rscVertexShader); + glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &glslHasCompiled); glGetShaderInfoLog(vertexShader, RENDERER_OPENGL_INFO_LOG_BUFFER, NULL, glslInfoLog); @@ -307,9 +314,11 @@ void Renderer_ConfigureShaders(StringView vertexShaderSource, StringView fragmen RJGlobal_DebugInfo("Vertex shader compiled successfully."); unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); - glShaderSource(fragmentShader, 1, (const GLchar *const *)&fragmentShaderSource.characters, NULL); + glShaderSource(fragmentShader, 1, (const GLchar *const *)&rscFragmentShader->data.characters, NULL); glCompileShader(fragmentShader); + ResourceText_Destroy(rscFragmentShader); + glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &glslHasCompiled); glGetShaderInfoLog(fragmentShader, sizeof(glslInfoLog), NULL, glslInfoLog); @@ -435,7 +444,7 @@ void Renderer_RenderScene(RendererScene *scene) #pragma region Renderer Debug -void RendererDebug_Initialize(StringView vertexShaderSource, StringView fragmentShaderSource, size_t initialVertexCapacity) +void RendererDebug_Initialize(StringView vertexShaderFile, StringView fragmentShaderFile, size_t initialVertexCapacity) { RENDERER_DEBUG_VERTICES = ListArray_Create("Renderer Debug Vertex", sizeof(RendererDebugVertex), initialVertexCapacity); @@ -445,10 +454,15 @@ void RendererDebug_Initialize(StringView vertexShaderSource, StringView fragment GLint glslHasCompiled = 0; char glslInfoLog[RENDERER_OPENGL_INFO_LOG_BUFFER] = {0}; + ResourceText *rscVertexShader = ResourceText_Create(vertexShaderFile); + ResourceText *rscFragmentShader = ResourceText_Create(fragmentShaderFile); + unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER); - glShaderSource(vertexShader, 1, (const GLchar *const *)&vertexShaderSource.characters, NULL); + glShaderSource(vertexShader, 1, (const GLchar *const *)&rscVertexShader->data.characters, NULL); glCompileShader(vertexShader); + ResourceText_Destroy(rscVertexShader); + glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &glslHasCompiled); glGetShaderInfoLog(vertexShader, RENDERER_OPENGL_INFO_LOG_BUFFER, NULL, glslInfoLog); @@ -456,9 +470,11 @@ void RendererDebug_Initialize(StringView vertexShaderSource, StringView fragment RJGlobal_DebugInfo("Debug Vertex shader compiled successfully."); unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); - glShaderSource(fragmentShader, 1, (const GLchar *const *)&fragmentShaderSource.characters, NULL); + glShaderSource(fragmentShader, 1, (const GLchar *const *)&rscFragmentShader->data.characters, NULL); glCompileShader(fragmentShader); + ResourceText_Destroy(rscFragmentShader); + glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &glslHasCompiled); glGetShaderInfoLog(fragmentShader, sizeof(glslInfoLog), NULL, glslInfoLog); @@ -604,14 +620,16 @@ void RendererDebug_DrawBoxLines(Vector3 position, Vector3 size, Color color) #pragma region Renderer Material -ListArray RendererMaterial_CreateFromFile(StringView matFileData, size_t matFileLineCount) +ListArray RendererMaterial_CreateFromFile(StringView matFile) { + ResourceText *rscMaterial = ResourceText_Create(matFile); + size_t materialCount = 0; size_t mtlLineCount = 0; - StringView *mtlLines = (StringView *)malloc(matFileLineCount * sizeof(StringView)); + StringView *mtlLines = (StringView *)malloc(rscMaterial->lineCount * sizeof(StringView)); RJGlobal_DebugAssertNullPointerCheck(mtlLines); - RJGlobal_MemorySet(mtlLines, matFileLineCount * sizeof(StringView), 0); + RJGlobal_MemorySet(mtlLines, rscMaterial->lineCount * sizeof(StringView), 0); size_t mtlLineTokenCount = 0; StringView mtlLineTokens[RENDERER_MODEL_LINE_MAX_TOKEN_COUNT] = {0}; @@ -628,7 +646,8 @@ ListArray RendererMaterial_CreateFromFile(StringView matFileData, size_t matFile StringView strD = scl("d"); StringView strILLNUM = scl("illum"); - String_Tokenize(matFileData, strNewline, &mtlLineCount, mtlLines, matFileLineCount); + String_Tokenize(scv(rscMaterial->data), strNewline, &mtlLineCount, mtlLines, rscMaterial->lineCount); + for (size_t j = 0; j < mtlLineCount; j++) // count { String_Tokenize(scv(mtlLines[j]), strSpace, &mtlLineTokenCount, mtlLineTokens, RENDERER_MODEL_LINE_MAX_TOKEN_COUNT); @@ -707,6 +726,7 @@ ListArray RendererMaterial_CreateFromFile(StringView matFileData, size_t matFile } free(mtlLines); + ResourceText_Destroy(rscMaterial); return materials; } @@ -878,7 +898,7 @@ RendererModel *RendererModel_CreateEmpty(StringView name, size_t initialMeshCapa return model; } -RendererModel *RendererModel_Create(StringView mdlFileData, size_t mdlFileLineCount, const ListArray *materialPool, Vector3 positionOffset, Vector3 rotationOffset, Vector3 scaleOffset) +RendererModel *RendererModel_Create(StringView mdlFile, const ListArray *materialPool, Vector3 positionOffset, Vector3 rotationOffset, Vector3 scaleOffset) { Renderer_Matrix4 offsetMatrix = {0}; TRANSFORM_TO_MODEL_MATRIX(&offsetMatrix, &positionOffset, &rotationOffset, &scaleOffset); @@ -890,11 +910,14 @@ RendererModel *RendererModel_Create(StringView mdlFileData, size_t mdlFileLineCo size_t totalVertexNormalCount = 0; size_t totalVertexUvCount = 0; - StringView *mdlLines = (StringView *)malloc(mdlFileLineCount * sizeof(StringView)); + ResourceText *rscModel = ResourceText_Create(mdlFile); + + size_t mdlLineCount = 0; + StringView *mdlLines = (StringView *)malloc(rscModel->lineCount * sizeof(StringView)); RJGlobal_DebugAssertNullPointerCheck(mdlLines); - RJGlobal_MemorySet(mdlLines, mdlFileLineCount * sizeof(StringView), 0); + RJGlobal_MemorySet(mdlLines, rscModel->lineCount * sizeof(StringView), 0); - size_t lineTokenCount = 0; + size_t mdlLineTokenCount = 0; StringView mdlLineTokens[RENDERER_MODEL_LINE_MAX_TOKEN_COUNT] = {0}; StringView strNewline = scl("\n"); @@ -907,11 +930,11 @@ RendererModel *RendererModel_Create(StringView mdlFileData, size_t mdlFileLineCo StringView strNEWMDL = scl("newmdl"); StringView strUSEMTL = scl("usemtl"); - String_Tokenize(mdlFileData, strNewline, &mdlFileLineCount, mdlLines, mdlFileLineCount); + String_Tokenize(scv(rscModel->data), strNewline, &mdlLineCount, mdlLines, rscModel->lineCount); - for (size_t i = 0; i < mdlFileLineCount; i++) // count and create materials + for (size_t i = 0; i < mdlLineCount; i++) // count and create materials { - String_Tokenize(mdlLines[i], strSpace, &lineTokenCount, mdlLineTokens, RENDERER_MODEL_LINE_MAX_TOKEN_COUNT); + String_Tokenize(mdlLines[i], strSpace, &mdlLineTokenCount, mdlLineTokens, RENDERER_MODEL_LINE_MAX_TOKEN_COUNT); StringView firstToken = mdlLineTokens[0]; @@ -943,15 +966,15 @@ RendererModel *RendererModel_Create(StringView mdlFileData, size_t mdlFileLineCo { size_t tempMeshIndex = 0; - for (size_t i = 0; i < mdlFileLineCount && tempMeshIndex <= meshCount; i++) // count faces + for (size_t i = 0; i < mdlLineCount && tempMeshIndex <= meshCount; i++) // count faces { - String_Tokenize(scv(mdlLines[i]), strSpace, &lineTokenCount, mdlLineTokens, RENDERER_MODEL_LINE_MAX_TOKEN_COUNT); + String_Tokenize(scv(mdlLines[i]), strSpace, &mdlLineTokenCount, mdlLineTokens, RENDERER_MODEL_LINE_MAX_TOKEN_COUNT); StringView firstToken = scv(mdlLineTokens[0]); if (String_Compare(firstToken, strF) == 0) // f 15/15/24 102/122/119 116/142/107 67/79/106 { - faceCounts[tempMeshIndex - 1] += lineTokenCount == 4 ? 1 : 2; + faceCounts[tempMeshIndex - 1] += mdlLineTokenCount == 4 ? 1 : 2; } else if (String_Compare(firstToken, strO) == 0) { @@ -977,9 +1000,9 @@ RendererModel *RendererModel_Create(StringView mdlFileData, size_t mdlFileLineCo globalVertexUvPool = ListArray_Create("Vector2", sizeof(Vector2), totalVertexUvCount); } - for (size_t i = 0; i < mdlFileLineCount; i++) // create global pools + for (size_t i = 0; i < mdlLineCount; i++) // create global pools { - String_Tokenize(scv(mdlLines[i]), strSpace, &lineTokenCount, mdlLineTokens, RENDERER_MODEL_LINE_MAX_TOKEN_COUNT); + String_Tokenize(scv(mdlLines[i]), strSpace, &mdlLineTokenCount, mdlLineTokens, RENDERER_MODEL_LINE_MAX_TOKEN_COUNT); StringView firstToken = scv(mdlLineTokens[0]); @@ -1025,21 +1048,21 @@ RendererModel *RendererModel_Create(StringView mdlFileData, size_t mdlFileLineCo RendererMesh *currentMesh = NULL; RendererMaterial *currentMaterial = NULL; - for (size_t i = 0; i < mdlFileLineCount; i++) // add data to model + for (size_t i = 0; i < mdlLineCount; i++) // add data to model { - String_Tokenize(scv(mdlLines[i]), scl(" "), &lineTokenCount, mdlLineTokens, RENDERER_MODEL_LINE_MAX_TOKEN_COUNT); + String_Tokenize(scv(mdlLines[i]), scl(" "), &mdlLineTokenCount, mdlLineTokens, RENDERER_MODEL_LINE_MAX_TOKEN_COUNT); StringView firstToken = scv(mdlLineTokens[0]); if (String_Compare(firstToken, strF) == 0) // f 15/15/24 102/122/119 116/142/107 67/79/106 { - if (lineTokenCount == 4) // 3 vertex face (triangle) + if (mdlLineTokenCount == 4) // 3 vertex face (triangle) { ProcessFaceVertex(scv(mdlLineTokens[1]), model, currentMesh, &globalVertexUvPool, &globalVertexNormalPool); ProcessFaceVertex(scv(mdlLineTokens[2]), model, currentMesh, &globalVertexUvPool, &globalVertexNormalPool); ProcessFaceVertex(scv(mdlLineTokens[3]), model, currentMesh, &globalVertexUvPool, &globalVertexNormalPool); } - else if (lineTokenCount == 5) // 4 vertex face (quad), triangulate it + else if (mdlLineTokenCount == 5) // 4 vertex face (quad), triangulate it { // First triangle: vertices 1, 2, 3 ProcessFaceVertex(scv(mdlLineTokens[1]), model, currentMesh, &globalVertexUvPool, &globalVertexNormalPool); @@ -1091,19 +1114,23 @@ RendererModel *RendererModel_Create(StringView mdlFileData, size_t mdlFileLineCo free(mdlLines); free(faceCounts); + ResourceText_Destroy(rscModel); RJGlobal_DebugInfo("Renderer Model '%s' imported successfully with %zu child meshes.", model->name.characters, model->meshes.count); return model; } -ListArray RendererModel_CreateFromFile(StringView mdlFileData, size_t mdlFileLineCount, const ListArray *materialPool) +ListArray RendererModel_CreateFromFile(StringView mdlFile, const ListArray *materialPool) { size_t modelCount = 0; - StringView *mdlLines = (StringView *)malloc(mdlFileLineCount * sizeof(StringView)); + ResourceText *rscModel = ResourceText_Create(mdlFile); + + size_t mdlLineCount = 0; + StringView *mdlLines = (StringView *)malloc(rscModel->lineCount * sizeof(StringView)); RJGlobal_DebugAssertNullPointerCheck(mdlLines); - RJGlobal_MemorySet(mdlLines, mdlFileLineCount * sizeof(StringView), 0); + RJGlobal_MemorySet(mdlLines, rscModel->lineCount * sizeof(StringView), 0); size_t mdlLineTokenCount = 0; StringView mdlLineTokens[RENDERER_MODEL_LINE_MAX_TOKEN_COUNT] = {0}; @@ -1118,8 +1145,8 @@ ListArray RendererModel_CreateFromFile(StringView mdlFileData, size_t mdlFileLin StringView strNEWMDL = scl("newmdl"); StringView strUSEMTL = scl("usemtl"); - String_Tokenize(mdlFileData, strNewline, &mdlFileLineCount, mdlLines, mdlFileLineCount); - for (size_t j = 0; j < mdlFileLineCount; j++) // count models + String_Tokenize(scv(rscModel->data), strNewline, &mdlLineCount, mdlLines, rscModel->lineCount); + for (size_t j = 0; j < mdlLineCount; j++) // count models { String_Tokenize(scv(mdlLines[j]), strSpace, &mdlLineTokenCount, mdlLineTokens, RENDERER_MODEL_LINE_MAX_TOKEN_COUNT); @@ -1156,7 +1183,7 @@ ListArray RendererModel_CreateFromFile(StringView mdlFileData, size_t mdlFileLin { size_t tempModelIndex = 0; - for (size_t i = 0; i < mdlFileLineCount; i++) + for (size_t i = 0; i < mdlLineCount; i++) { String_Tokenize(mdlLines[i], strSpace, &mdlLineTokenCount, mdlLineTokens, RENDERER_MODEL_LINE_MAX_TOKEN_COUNT); @@ -1194,7 +1221,7 @@ ListArray RendererModel_CreateFromFile(StringView mdlFileData, size_t mdlFileLin size_t tempModelIndex = 0; size_t tempMeshIndex = 0; - for (size_t i = 0; i < mdlFileLineCount; i++) + for (size_t i = 0; i < mdlLineCount; i++) { String_Tokenize(mdlLines[i], strSpace, &mdlLineTokenCount, mdlLineTokens, RENDERER_MODEL_LINE_MAX_TOKEN_COUNT); @@ -1226,7 +1253,7 @@ ListArray RendererModel_CreateFromFile(StringView mdlFileData, size_t mdlFileLin ListArray currentVertexUvPool = {0}; ListArray currentVertexNormalPool = {0}; - for (size_t i = 0; i < mdlFileLineCount; i++) + for (size_t i = 0; i < mdlLineCount; i++) { String_Tokenize(mdlLines[i], strSpace, &mdlLineTokenCount, mdlLineTokens, RENDERER_MODEL_LINE_MAX_TOKEN_COUNT); @@ -1352,6 +1379,7 @@ ListArray RendererModel_CreateFromFile(StringView mdlFileData, size_t mdlFileLin } free(faceCounts); + ResourceText_Destroy(rscModel); return models; } @@ -1449,7 +1477,7 @@ RendererScene *RendererScene_CreateEmpty(StringView name, size_t initialBatchCap return scene; } -RendererScene *RendererScene_CreateFromFile(StringView scnFileData, size_t scnFileLineCount, const ListArray *modelPool, void *objectReferences, size_t transformOffsetInObject, size_t totalObjectSize, size_t objectCount) +RendererScene *RendererScene_CreateFromFile(StringView scnFile, const ListArray *modelPool, void *objectReferences, size_t transformOffsetInObject, size_t totalObjectSize, size_t objectCount) { RJGlobal_DebugAssertNullPointerCheck(modelPool); RJGlobal_DebugAssertNullPointerCheck(objectReferences); @@ -1459,9 +1487,12 @@ RendererScene *RendererScene_CreateFromFile(StringView scnFileData, size_t scnFi RendererComponent *currentComponent = NULL; size_t totalObjectIndex = 0; - StringView *scnLines = (StringView *)malloc(scnFileLineCount * sizeof(StringView)); + ResourceText *rscScene = ResourceText_Create(scnFile); + + size_t scnLineCount = 0; + StringView *scnLines = (StringView *)malloc(rscScene->lineCount * sizeof(StringView)); RJGlobal_DebugAssertNullPointerCheck(scnLines); - RJGlobal_MemorySet(scnLines, scnFileLineCount * sizeof(StringView), 0); + RJGlobal_MemorySet(scnLines, rscScene->lineCount * sizeof(StringView), 0); size_t scnLineTokenCount = 0; StringView scnLineTokens[RENDERER_MODEL_LINE_MAX_TOKEN_COUNT] = {0}; @@ -1474,9 +1505,8 @@ RendererScene *RendererScene_CreateFromFile(StringView scnFileData, size_t scnFi StringView strNEWSCN = scl("newscn"); StringView strUSEMDL = scl("usemdl"); - String_Tokenize(scnFileData, strNewline, &scnFileLineCount, scnLines, scnFileLineCount); - - for (size_t i = 0; i < scnFileLineCount; i++) + String_Tokenize(scv(rscScene->data), strNewline, &scnLineCount, scnLines, rscScene->lineCount); + for (size_t i = 0; i < scnLineCount; i++) { String_Tokenize(scnLines[i], strSpace, &scnLineTokenCount, scnLineTokens, RENDERER_MODEL_LINE_MAX_TOKEN_COUNT); @@ -1528,6 +1558,7 @@ RendererScene *RendererScene_CreateFromFile(StringView scnFileData, size_t scnFi } free(scnLines); + ResourceText_Destroy(rscScene); RJGlobal_DebugInfo("Scene %s imported successfully.", scene->name.characters); diff --git a/src/tools/Resources.c b/src/tools/Resources.c index d457ff6..db63af1 100644 --- a/src/tools/Resources.c +++ b/src/tools/Resources.c @@ -7,13 +7,12 @@ #pragma region ResourceText -ResourceText *ResourceText_Create(StringView name, StringView relativePath) +ResourceText *ResourceText_Create(StringView file) { ResourceText *resource = (ResourceText *)malloc(sizeof(ResourceText)); RJGlobal_DebugAssertNullPointerCheck(resource); - resource->name = scc(name); - resource->path = scc(relativePath); + resource->file = scc(file); // size_t pathCount = 0; // String pathBuffer[RJGLOBAL_TEMP_BUFFER_SIZE / 32]; @@ -24,24 +23,23 @@ ResourceText *ResourceText_Create(StringView name, StringView relativePath) // String_ConcatEnd(&resource->path, pathBuffer[i]); //} - String fullPath = scc(resource->path); + String fullPath = scc(resource->file); String_ConcatBegin(&fullPath, scl(RESOURCE_PATH)); String_ConcatBegin(&fullPath, scl(RJGlobal_GetExecutablePath())); - String_ConcatEnd(&fullPath, scv(resource->name)); size_t lineCount = 0; int character = 0; - FILE *file = NULL; - RJGlobal_DebugAssertFileOpenCheck(file, fullPath.characters, "r"); - while ((character = fgetc(file)) != EOF) + FILE *fileHandle = NULL; + RJGlobal_DebugAssertFileOpenCheck(fileHandle, fullPath.characters, "r"); + while ((character = fgetc(fileHandle)) != EOF) { if (character == '\n') { lineCount++; } } - fclose(file); + fclose(fileHandle); resource->lineCount = lineCount; @@ -55,14 +53,14 @@ ResourceText *ResourceText_Create(StringView name, StringView relativePath) lineBuffer[0] = '\0'; size_t dataIndex = 0; - RJGlobal_DebugAssertFileOpenCheck(file, fullPath.characters, "r"); - while (fgets(lineBuffer, RESOURCE_FILE_LINE_MAX_CHAR_COUNT, file)) + RJGlobal_DebugAssertFileOpenCheck(fileHandle, fullPath.characters, "r"); + while (fgets(lineBuffer, RESOURCE_FILE_LINE_MAX_CHAR_COUNT, fileHandle)) { size_t lineLength = strlen(lineBuffer); RJGlobal_MemoryCopy(dataBuffer + dataIndex, lineLength, lineBuffer); dataIndex += lineLength; } - fclose(file); + fclose(fileHandle); dataBuffer[dataIndex] = '\0'; @@ -73,7 +71,7 @@ ResourceText *ResourceText_Create(StringView name, StringView relativePath) String_Destroy(&fullPath); - RJGlobal_DebugInfo("Resource '%s' loaded.", resource->name.characters); + RJGlobal_DebugInfo("Resource '%s' loaded.", resource->file.characters); return resource; } @@ -81,14 +79,13 @@ ResourceText *ResourceText_Create(StringView name, StringView relativePath) void ResourceText_Destroy(ResourceText *resource) { RJGlobal_DebugAssertNullPointerCheck(resource); - RJGlobal_DebugAssertNullPointerCheck(resource->name.characters); + RJGlobal_DebugAssertNullPointerCheck(resource->file.characters); char tempTitle[RJGLOBAL_TEMP_BUFFER_SIZE]; - RJGlobal_MemoryCopy(tempTitle, Maths_Min(RJGLOBAL_TEMP_BUFFER_SIZE - 1, resource->name.length), resource->name.characters); - tempTitle[Maths_Min(RJGLOBAL_TEMP_BUFFER_SIZE - 1, resource->name.length)] = '\0'; + RJGlobal_MemoryCopy(tempTitle, Maths_Min(RJGLOBAL_TEMP_BUFFER_SIZE - 1, resource->file.length), resource->file.characters); + tempTitle[Maths_Min(RJGLOBAL_TEMP_BUFFER_SIZE - 1, resource->file.length)] = '\0'; - String_Destroy(&resource->name); - String_Destroy(&resource->path); + String_Destroy(&resource->file); String_Destroy(&resource->data); resource->lineCount = 0; @@ -105,18 +102,16 @@ void ResourceText_Destroy(ResourceText *resource) #pragma region ResourceImage -ResourceImage *ResourceImage_Create(StringView title, StringView path) +ResourceImage *ResourceImage_Create(StringView file) { ResourceImage *resourceImage = (ResourceImage *)malloc(sizeof(ResourceImage)); RJGlobal_DebugAssertNullPointerCheck(resourceImage); - resourceImage->name = scc(title); - resourceImage->path = scc(path); + resourceImage->file = scc(file); - String fullPath = scc(resourceImage->path); + String fullPath = scc(resourceImage->file); String_ConcatBegin(&fullPath, scl(RESOURCE_PATH)); String_ConcatBegin(&fullPath, scl(RJGlobal_GetExecutablePath())); - String_ConcatEnd(&fullPath, scv(resourceImage->name)); stbi_set_flip_vertically_on_load(true); resourceImage->data = stbi_load(fullPath.characters, &resourceImage->size.x, &resourceImage->size.y, &resourceImage->channels, 4); @@ -124,7 +119,7 @@ ResourceImage *ResourceImage_Create(StringView title, StringView path) String_Destroy(&fullPath); - RJGlobal_DebugInfo("Resource Image '%s' loaded.", resourceImage->name.characters); + RJGlobal_DebugInfo("Resource Image '%s' loaded.", resourceImage->file.characters); return resourceImage; } @@ -134,11 +129,10 @@ void ResourceImage_Destroy(ResourceImage *resourceImage) RJGlobal_DebugAssertNullPointerCheck(resourceImage); char tempTitle[RJGLOBAL_TEMP_BUFFER_SIZE]; - RJGlobal_MemoryCopy(tempTitle, Maths_Min(RJGLOBAL_TEMP_BUFFER_SIZE - 1, resourceImage->name.length), resourceImage->name.characters); - tempTitle[Maths_Min(RJGLOBAL_TEMP_BUFFER_SIZE - 1, resourceImage->name.length)] = '\0'; + RJGlobal_MemoryCopy(tempTitle, Maths_Min(RJGLOBAL_TEMP_BUFFER_SIZE - 1, resourceImage->file.length), resourceImage->file.characters); + tempTitle[Maths_Min(RJGLOBAL_TEMP_BUFFER_SIZE - 1, resourceImage->file.length)] = '\0'; - String_Destroy(&resourceImage->name); - String_Destroy(&resourceImage->path); + String_Destroy(&resourceImage->file); resourceImage->channels = 0; resourceImage->size = Vector2Int_New(0, 0);