From 6e4fdd3b3ae4e4656e151f098c40cfe551a36e8c Mon Sep 17 00:00:00 2001 From: jussi Date: Fri, 18 Feb 2022 18:27:10 +0200 Subject: Added initial files. --- src/state.c | 194 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 194 insertions(+) create mode 100644 src/state.c (limited to 'src/state.c') diff --git a/src/state.c b/src/state.c new file mode 100644 index 0000000..d9b2ad4 --- /dev/null +++ b/src/state.c @@ -0,0 +1,194 @@ +#include "main.h" +#include "state.h" +#include "lua_core.h" +#include "textures.h" + +State *state; + +bool stateInit( const char *exePath ) { + state = malloc( sizeof( State ) ); + + state->exePath = malloc( STRING_LEN * sizeof( char ) ); + strncpy( state->exePath, exePath, STRING_LEN - 1 ); + + state->hasWindow = true; + state->run = true; + state->resolution = (Vector2){ 1024, 720 }; + state->luaState = NULL; + state->targetFPS = 60; + state->textureSource = TEXTURE_SOURCE_TEXTURE; + /* Images. */ + state->imageAlloc = ALLOC_PAGE_SIZE; + state->imageCount = 0; + state->images = malloc( state->imageAlloc * sizeof( Image* ) ); + /* Textures. */ + state->textureAlloc = ALLOC_PAGE_SIZE; + state->textureCount = 0; + state->textures = malloc( state->textureAlloc * sizeof( Texture2D* ) ); + /* RenderTextures. */ + state->renderTextureAlloc = ALLOC_PAGE_SIZE; + state->renderTextureCount = 0; + state->renderTextures = malloc( state->renderTextureAlloc * sizeof( RenderTexture2D* ) ); + /* Fonts. */ + state->fontAlloc = ALLOC_PAGE_SIZE; + state->fontCount = 1; + state->fonts = malloc( state->fontAlloc * sizeof( Font* ) ); + /* Sounds. */ + state->soundAlloc = ALLOC_PAGE_SIZE; + state->soundCount = 0; + state->sounds = malloc( state->soundAlloc * sizeof( Sound* ) ); + /* Camera3D's. */ + state->camera3DAlloc = ALLOC_PAGE_SIZE; + state->camera3DCount = 0; + state->camera3Ds = malloc( state->camera3DAlloc * sizeof( Camera3D* ) ); + /* Meshes. */ + state->meshAlloc = ALLOC_PAGE_SIZE; + state->meshCount = 0; + state->meshes = malloc( state->meshAlloc * sizeof( Mesh* ) ); + /* Materials. */ + state->materialAlloc = ALLOC_PAGE_SIZE; + state->materialCount = 1; + state->materials = malloc( state->materialAlloc * sizeof( Material* ) ); + /* Models. */ + state->modelAlloc = ALLOC_PAGE_SIZE; + state->modelCount = 0; + state->models = malloc( state->modelAlloc * sizeof( Model* ) ); + /* ModelsAnimations. */ + state->animationAlloc = ALLOC_PAGE_SIZE; + state->animationCount = 0; + state->animations = malloc( state->animationAlloc * sizeof( ModelAnimations* ) ); + /* Shaders. */ + state->shaderAlloc = ALLOC_PAGE_SIZE; + state->shaderCount = 0; + state->shaders = malloc( state->shaderAlloc * sizeof( Shader* ) ); + + for ( int i = 0; i < ALLOC_PAGE_SIZE; i++ ) { + state->images[i] = NULL; + state->textures[i] = NULL; + state->renderTextures[i] = NULL; + state->sounds[i] = NULL; + state->camera3Ds[i] = NULL; + state->meshes[i] = NULL; + state->models[i] = NULL; + state->animations[i] = NULL; + state->shaders[i] = NULL; + + /* The ones we want to save the first. */ + if ( 0 < i ) { + state->fonts[i] = NULL; + state->materials[i] = NULL; + } + } + + InitWindow( state->resolution.x, state->resolution.y, "ReiLua" ); + /* Has to be after InitWindod where opengl context is created. */ + state->materials[0] = malloc( sizeof( Material ) ); + *state->materials[0] = LoadMaterialDefault(); + state->fonts[0] = malloc( sizeof( Font ) ); + *state->fonts[0] = GetFontDefault(); + + if ( !IsWindowReady() ) { + state->hasWindow = false; + state->run = false; + } + else { + SetTargetFPS( state->targetFPS ); + } + + InitAudioDevice(); + state->run = luaInit(); + + return state->run; +} + +void stateFree() { + for ( int i = 0; i < state->imageCount; ++i ) { + if ( state->images[i] != NULL ) { + UnloadImage( *state->images[i] ); + free( state->images[i] ); + } + } + for ( int i = 0; i < state->textureCount; ++i ) { + if ( state->textures[i] != NULL ) { + UnloadTexture( *state->textures[i] ); + free( state->textures[i] ); + } + } + for ( int i = 0; i < state->renderTextureCount; ++i ) { + if ( state->renderTextures[i] != NULL ) { + UnloadRenderTexture( *state->renderTextures[i] ); + free( state->renderTextures[i] ); + } + } + for ( int i = 0; i < state->fontCount; ++i ) { + if ( state->fonts[i] != NULL ) { + UnloadFont( *state->fonts[i] ); + free( state->fonts[i] ); + } + } + for ( int i = 0; i < state->soundCount; ++i ) { + if ( state->sounds[i] != NULL ) { + UnloadSound( *state->sounds[i] ); + free( state->sounds[i] ); + } + } + for ( int i = 0; i < state->camera3DCount; ++i ) { + if ( state->camera3Ds[i] != NULL ) { + free( state->camera3Ds[i] ); + } + } + for ( int i = 0; i < state->modelCount; ++i ) { + if ( state->models[i] != NULL ) { + // UnloadModel( *state->models[i] ); + UnloadModelKeepMeshes( *state->models[i] ); + free( state->models[i] ); + } + } + for ( int i = 0; i < state->meshCount; ++i ) { + if ( state->meshes[i] != NULL ) { + UnloadMesh( *state->meshes[i] ); + free( state->meshes[i] ); + } + } + for ( int i = 0; i < state->materialCount; ++i ) { + if ( state->materials[i] != NULL ) { + UnloadMaterial( *state->materials[i] ); + free( state->materials[i] ); + } + } + for ( int i = 0; i < state->animationCount; ++i ) { + if ( state->animations[i] != NULL ) { + UnloadModelAnimations( state->animations[i]->animations, state->animations[i]->animCount ); + free( state->animations[i] ); + } + } + for ( int i = 0; i < state->shaderCount; ++i ) { + if ( state->shaders[i] != NULL ) { + UnloadShader( *state->shaders[i] ); + free( state->shaders[i] ); + } + } + + if ( IsAudioDeviceReady() ) { + CloseAudioDevice(); + UnloadMusicStream( state->music ); + } + if ( state->hasWindow ) { + CloseWindow(); + } + if ( state->luaState != NULL ) { + lua_close( state->luaState ); + } + free( state->images ); + free( state->textures ); + free( state->renderTextures ); + free( state->fonts ); + free( state->sounds ); + free( state->camera3Ds ); + free( state->meshes ); + free( state->materials ); + free( state->models ); + free( state->animations ); + free( state->shaders ); + free( state ); +} -- cgit v1.2.3