Added per-scene init and cleanup functions

dev
Shariq Shah 6 years ago
parent ee13448c4a
commit e62bf12bc5
  1. 2
      assets/entities/turret.symtres
  2. 2
      assets/scenes/scene_1.symtres
  3. 2
      src/common/hashmap.c
  4. 2
      src/common/hashmap.h
  5. 4
      src/common/parser.c
  6. 2
      src/common/version.h
  7. 2
      src/game/console.c
  8. 41
      src/game/game.c
  9. 2
      src/game/game.h
  10. 2
      src/game/input.c
  11. 9
      src/game/scene.c
  12. 5
      src/game/scene.h
  13. 23
      src/game/scene_funcs.c
  14. 12
      src/game/scene_funcs.h
  15. 2
      src/system/main.c

@ -61,7 +61,7 @@ Entity
bouding_box_min : -0.500 -0.500 -0.500 bouding_box_min : -0.500 -0.500 -0.500
source_filename : sounds/windy_ambience.ogg source_filename : sounds/windy_ambience.ogg
sound_type : 2 sound_type : 2
sound_max_distance : 60.0000 sound_max_distance : 30.0000
name : Turret_Ambient_Sound name : Turret_Ambient_Sound
bouding_box_max : 0.500 0.500 0.500 bouding_box_max : 0.500 0.500 0.500
sound_attenuation_type : 2 sound_attenuation_type : 2

@ -10,6 +10,8 @@ Scene_Config
debug_draw_enabled : false debug_draw_enabled : false
debug_draw_mode : 0 debug_draw_mode : 0
ambient_light : 0.100 0.100 0.100 ambient_light : 0.100 0.100 0.100
init_func : scene_1
cleanup_func : scene_1
} }
Player Player

@ -51,7 +51,7 @@ unsigned int hashmap_generate_hash(const char* key)
return index % HASH_MAP_NUM_BUCKETS; return index % HASH_MAP_NUM_BUCKETS;
} }
struct Hashmap* hashmap_new(void) struct Hashmap* hashmap_create(void)
{ {
struct Hashmap* hashmap = malloc(sizeof(*hashmap)); struct Hashmap* hashmap = malloc(sizeof(*hashmap));
if(!hashmap) if(!hashmap)

@ -11,7 +11,7 @@
struct Hashmap; struct Hashmap;
struct Variant; struct Variant;
struct Hashmap* hashmap_new(void); struct Hashmap* hashmap_create(void);
void hashmap_free(struct Hashmap* hashmap); void hashmap_free(struct Hashmap* hashmap);
void hashmap_copy(struct Hashmap* from, struct Hashmap* to); void hashmap_copy(struct Hashmap* from, struct Hashmap* to);
void hashmap_value_remove(struct Hashmap* hashmap, const char* key); void hashmap_value_remove(struct Hashmap* hashmap, const char* key);

@ -197,7 +197,7 @@ struct Parser* parser_load_objects(FILE* file, const char* filename)
// Read into intermediate parser object and add it to the objects list // Read into intermediate parser object and add it to the objects list
struct Parser_Object* object = array_grow(parser->objects, struct Parser_Object); struct Parser_Object* object = array_grow(parser->objects, struct Parser_Object);
object->type = parser_object_type_from_str(type_str); object->type = parser_object_type_from_str(type_str);
object->data = hashmap_new(); object->data = hashmap_create();
char format_str[64]; char format_str[64];
char key_str[HASH_MAX_KEY_LEN]; char key_str[HASH_MAX_KEY_LEN];
@ -313,7 +313,7 @@ struct Parser_Object* parser_object_new(struct Parser* parser, int type)
return NULL; return NULL;
} }
object->type = type; object->type = type;
object->data = hashmap_new(); object->data = hashmap_create();
return object; return object;
} }

@ -4,7 +4,7 @@
/* Auto generated version file. DO NOT MODIFY */ /* Auto generated version file. DO NOT MODIFY */
#define SYMMETRY_VERSION_MAJOR 0 #define SYMMETRY_VERSION_MAJOR 0
#define SYMMETRY_VERSION_MINOR 1 #define SYMMETRY_VERSION_MINOR 1
#define SYMMETRY_VERSION_REVISION 326 #define SYMMETRY_VERSION_REVISION 327
#define SYMMETRY_VERSION_BRANCH "dev" #define SYMMETRY_VERSION_BRANCH "dev"
#endif #endif

@ -57,7 +57,7 @@ void console_init(struct Console* console)
console->messages[i].type = CMT_NONE; console->messages[i].type = CMT_NONE;
} }
console->commands = hashmap_new(); console->commands = hashmap_create();
hashmap_ptr_set(console->commands, "scene_empty", &console_command_scene_empty); hashmap_ptr_set(console->commands, "scene_empty", &console_command_scene_empty);
hashmap_ptr_set(console->commands, "scene_save", &console_command_scene_save); hashmap_ptr_set(console->commands, "scene_save", &console_command_scene_save);
hashmap_ptr_set(console->commands, "scene_load", &console_command_scene_load); hashmap_ptr_set(console->commands, "scene_load", &console_command_scene_load);

@ -36,6 +36,7 @@
#include "im_render.h" #include "im_render.h"
#include "event.h" #include "event.h"
#include "../common/limits.h" #include "../common/limits.h"
#include "scene_funcs.h"
#define UNUSED(a) (void)a #define UNUSED(a) (void)a
#define MIN_NUM(a,b) ((a) < (b) ? (a) : (b)) #define MIN_NUM(a,b) ((a) < (b) ? (a) : (b))
@ -67,19 +68,21 @@ bool game_init(struct Window* window, struct Hashmap* cvars)
} }
else else
{ {
game_state->window = window; game_state->window = window;
game_state->cvars = cvars; game_state->cvars = cvars;
game_state->is_initialized = false; game_state->is_initialized = false;
game_state->fixed_delta_time = 1.f / 60.f; game_state->fixed_delta_time = 1.f / 60.f;
game_state->game_mode = GAME_MODE_GAME; game_state->game_mode = GAME_MODE_GAME;
game_state->renderer = calloc(1, sizeof(*game_state->renderer)); game_state->renderer = calloc(1, sizeof(*game_state->renderer));
game_state->scene = calloc(1, sizeof(*game_state->scene)); game_state->scene = calloc(1, sizeof(*game_state->scene));
game_state->console = calloc(1, sizeof(*game_state->console)); game_state->console = calloc(1, sizeof(*game_state->console));
game_state->editor = calloc(1, sizeof(*game_state->editor)); game_state->editor = calloc(1, sizeof(*game_state->editor));
game_state->gui = calloc(1, sizeof(*game_state->gui)); game_state->gui = calloc(1, sizeof(*game_state->gui));
game_state->event_manager = calloc(1, sizeof(*game_state->event_manager)); game_state->event_manager = calloc(1, sizeof(*game_state->event_manager));
game_state->sound = calloc(1, sizeof(*game_state->sound)); game_state->sound = calloc(1, sizeof(*game_state->sound));
game_state->debug_vars = calloc(1, sizeof(*game_state->debug_vars)); game_state->debug_vars = calloc(1, sizeof(*game_state->debug_vars));
game_state->scene_init_func_table = hashmap_create();
game_state->scene_cleanup_func_table = hashmap_create();
log_message_callback_set(game_on_log_message); log_message_callback_set(game_on_log_message);
log_warning_callback_set(game_on_log_warning); log_warning_callback_set(game_on_log_warning);
@ -94,8 +97,10 @@ bool game_init(struct Window* window, struct Hashmap* cvars)
{ {
log_message("Loaded GL extentions"); log_message("Loaded GL extentions");
} }
hashmap_ptr_set(game_state->scene_init_func_table, "scene_1", &scene_1_init);
hashmap_ptr_set(game_state->scene_cleanup_func_table, "scene_1", &scene_1_cleanup);
event_manager_init(game_state->event_manager); event_manager_init(game_state->event_manager);
input_init(); input_init();
shader_init(); shader_init();
@ -104,10 +109,6 @@ bool game_init(struct Window* window, struct Hashmap* cvars)
gui_init(game_state->gui); gui_init(game_state->gui);
console_init(game_state->console); console_init(game_state->console);
geom_init(); geom_init();
//physics_init();
//physics_gravity_set(0.f, -9.8f, 0.f);
//physics_body_set_moved_callback(entity_rigidbody_on_move);
//physics_body_set_collision_callback(entity_rigidbody_on_collision);
sound_init(game_state->sound); sound_init(game_state->sound);
debug_vars_init(game_state->debug_vars); debug_vars_init(game_state->debug_vars);
@ -118,7 +119,7 @@ bool game_init(struct Window* window, struct Hashmap* cvars)
/* Debug scene setup */ /* Debug scene setup */
//game_scene_setup(); //game_scene_setup();
scene_load(game_state->scene, "Level_1", DIRT_INSTALL); scene_load(game_state->scene, "scene_1", DIRT_INSTALL);
game_state->is_initialized = true; game_state->is_initialized = true;
return game_state->is_initialized; return game_state->is_initialized;
} }
@ -1958,6 +1959,8 @@ void game_cleanup(void)
free(game_state->gui); free(game_state->gui);
free(game_state->sound); free(game_state->sound);
free(game_state->debug_vars); free(game_state->debug_vars);
hashmap_free(game_state->scene_init_func_table);
hashmap_free(game_state->scene_cleanup_func_table);
} }
free(game_state); free(game_state);
game_state = NULL; game_state = NULL;

@ -36,6 +36,8 @@ struct Game_State
struct Hashmap* cvars; struct Hashmap* cvars;
struct Sound* sound; struct Sound* sound;
struct Debug_Vars* debug_vars; struct Debug_Vars* debug_vars;
struct Hashmap* scene_init_func_table;
struct Hashmap* scene_cleanup_func_table;
}; };

@ -25,7 +25,7 @@ void input_init(void)
event_manager_subscribe(event_manager, EVT_KEY_PRESSED, &input_on_key); event_manager_subscribe(event_manager, EVT_KEY_PRESSED, &input_on_key);
event_manager_subscribe(event_manager, EVT_KEY_RELEASED, &input_on_key); event_manager_subscribe(event_manager, EVT_KEY_RELEASED, &input_on_key);
key_bindings = hashmap_new(); key_bindings = hashmap_create();
/* Default keys for fallback */ /* Default keys for fallback */
struct Key_Binding forward_keys = {KEY_W, KMOD_NONE, KEY_UP, KMOD_NONE, KS_INACTIVE}; struct Key_Binding forward_keys = {KEY_W, KMOD_NONE, KEY_UP, KMOD_NONE, KS_INACTIVE};

@ -20,6 +20,7 @@
#include "sound_source.h" #include "sound_source.h"
#include "enemy.h" #include "enemy.h"
#include "event.h" #include "event.h"
#include "scene_funcs.h"
#include <assert.h> #include <assert.h>
#include <string.h> #include <string.h>
@ -86,6 +87,8 @@ void scene_init(struct Scene* scene)
editor_init_entities(game_state->editor); editor_init_entities(game_state->editor);
scene->active_camera_index = game_state_get()->game_mode == GAME_MODE_GAME ? CAM_GAME : CAM_EDITOR; scene->active_camera_index = game_state_get()->game_mode == GAME_MODE_GAME ? CAM_GAME : CAM_EDITOR;
scene->init = &scene_init_stub;
scene->cleanup = &scene_cleanup_stub;
} }
bool scene_load(struct Scene* scene, const char* filename, int directory_type) bool scene_load(struct Scene* scene, const char* filename, int directory_type)
@ -132,6 +135,7 @@ bool scene_load(struct Scene* scene, const char* filename, int directory_type)
{ {
struct Hashmap* scene_data = object->data; struct Hashmap* scene_data = object->data;
struct Render_Settings* render_settings = &game_state_get()->renderer->settings; struct Render_Settings* render_settings = &game_state_get()->renderer->settings;
struct Game_State* game_state = game_state_get();
if(hashmap_value_exists(scene_data, "fog_type")) render_settings->fog.mode = hashmap_int_get(scene_data, "fog_type"); if(hashmap_value_exists(scene_data, "fog_type")) render_settings->fog.mode = hashmap_int_get(scene_data, "fog_type");
if(hashmap_value_exists(scene_data, "fog_density")) render_settings->fog.density = hashmap_float_get(scene_data, "fog_density"); if(hashmap_value_exists(scene_data, "fog_density")) render_settings->fog.density = hashmap_float_get(scene_data, "fog_density");
@ -143,6 +147,9 @@ bool scene_load(struct Scene* scene, const char* filename, int directory_type)
if(hashmap_value_exists(scene_data, "debug_draw_enabled")) render_settings->debug_draw_enabled = hashmap_bool_get(scene_data, "debug_draw_enabled"); if(hashmap_value_exists(scene_data, "debug_draw_enabled")) render_settings->debug_draw_enabled = hashmap_bool_get(scene_data, "debug_draw_enabled");
if(hashmap_value_exists(scene_data, "debug_draw_mode")) render_settings->debug_draw_mode = hashmap_int_get(scene_data, "debug_draw_mode"); if(hashmap_value_exists(scene_data, "debug_draw_mode")) render_settings->debug_draw_mode = hashmap_int_get(scene_data, "debug_draw_mode");
if(hashmap_value_exists(scene_data, "debug_draw_physics")) render_settings->debug_draw_physics = hashmap_bool_get(scene_data, "debug_draw_physics"); if(hashmap_value_exists(scene_data, "debug_draw_physics")) render_settings->debug_draw_physics = hashmap_bool_get(scene_data, "debug_draw_physics");
scene->init = hashmap_value_exists(scene_data, "init_func") ? hashmap_ptr_get(game_state->scene_init_func_table, hashmap_str_get(scene_data, "init_func")) : &scene_init_stub;
scene->cleanup = hashmap_value_exists(scene_data, "cleanup_func") ? hashmap_ptr_get(game_state->scene_cleanup_func_table, hashmap_str_get(scene_data, "cleanup_func")) : &scene_init_stub;
num_objects_loaded++; num_objects_loaded++;
} }
break; break;
@ -211,6 +218,7 @@ bool scene_load(struct Scene* scene, const char* filename, int directory_type)
strncpy(scene->filename, filename, MAX_FILENAME_LEN); strncpy(scene->filename, filename, MAX_FILENAME_LEN);
if(num_objects_loaded > 0) if(num_objects_loaded > 0)
{ {
scene->init(scene);
struct Event_Manager* event_manager = game_state_get()->event_manager; struct Event_Manager* event_manager = game_state_get()->event_manager;
struct Event* scene_loaded_event = event_manager_create_new_event(event_manager); struct Event* scene_loaded_event = event_manager_create_new_event(event_manager);
scene_loaded_event->type = EVT_SCENE_LOADED; scene_loaded_event->type = EVT_SCENE_LOADED;
@ -349,6 +357,7 @@ void scene_write_entity_entry(struct Scene* scene, struct Entity* entity, struct
void scene_destroy(struct Scene* scene) void scene_destroy(struct Scene* scene)
{ {
assert(scene); assert(scene);
scene->cleanup(scene);
for(int i = 0; i < MAX_SCENE_ENTITIES; i++) scene_entity_base_remove(scene, &scene->entities[i]); for(int i = 0; i < MAX_SCENE_ENTITIES; i++) scene_entity_base_remove(scene, &scene->entities[i]);
for(int i = 0; i < MAX_SCENE_CAMERAS; i++) scene_camera_remove(scene, &scene->cameras[i]); for(int i = 0; i < MAX_SCENE_CAMERAS; i++) scene_camera_remove(scene, &scene->cameras[i]);

@ -8,6 +8,9 @@
struct Ray; struct Ray;
struct Raycast_Result; struct Raycast_Result;
typedef void (*Scene_Init_Func)(struct Scene* scene);
typedef void (*Scene_Cleanup_Func)(struct Scene* scene);
struct Scene struct Scene
{ {
char filename[MAX_FILENAME_LEN]; char filename[MAX_FILENAME_LEN];
@ -21,6 +24,8 @@ struct Scene
struct Enemy enemies[MAX_SCENE_ENEMIES]; struct Enemy enemies[MAX_SCENE_ENEMIES];
char entity_archetypes[MAX_SCENE_ENTITY_ARCHETYPES][MAX_FILENAME_LEN]; char entity_archetypes[MAX_SCENE_ENTITY_ARCHETYPES][MAX_FILENAME_LEN];
int active_camera_index; int active_camera_index;
Scene_Init_Func init;
Scene_Cleanup_Func cleanup;
}; };
void scene_init(struct Scene* scene); void scene_init(struct Scene* scene);

@ -0,0 +1,23 @@
#include "scene_funcs.h"
#include "../common/log.h"
void scene_init_stub(struct Scene* scene)
{
log_warning("Scene Init Stub Called");
}
void scene_cleanup_stub(struct Scene* scene)
{
log_warning("Scene Cleanup Stub Called");
}
void scene_1_init(struct Scene* scene)
{
log_message("Scene 1 init called");
}
void scene_1_cleanup(struct Scene* scene)
{
log_message("Scene 1 cleanup called");
}

@ -0,0 +1,12 @@
#ifndef SCENE_FUNCS_H
#define SCENE_FUNCS_H
#include "scene.h"
void scene_init_stub(struct Scene* scene);
void scene_cleanup_stub(struct Scene* scene);
void scene_1_init(struct Scene* scene);
void scene_1_cleanup(struct Scene* scene);
#endif

@ -52,7 +52,7 @@ bool init(void)
return false; return false;
} }
cvars = hashmap_new(); cvars = hashmap_create();
config_vars_init(cvars); config_vars_init(cvars);
if(!platform_init()) return false; if(!platform_init()) return false;

Loading…
Cancel
Save