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. 13
      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
source_filename : sounds/windy_ambience.ogg
sound_type : 2
sound_max_distance : 60.0000
sound_max_distance : 30.0000
name : Turret_Ambient_Sound
bouding_box_max : 0.500 0.500 0.500
sound_attenuation_type : 2

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

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

@ -11,7 +11,7 @@
struct Hashmap;
struct Variant;
struct Hashmap* hashmap_new(void);
struct Hashmap* hashmap_create(void);
void hashmap_free(struct Hashmap* hashmap);
void hashmap_copy(struct Hashmap* from, struct Hashmap* to);
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
struct Parser_Object* object = array_grow(parser->objects, struct Parser_Object);
object->type = parser_object_type_from_str(type_str);
object->data = hashmap_new();
object->data = hashmap_create();
char format_str[64];
char key_str[HASH_MAX_KEY_LEN];
@ -313,7 +313,7 @@ struct Parser_Object* parser_object_new(struct Parser* parser, int type)
return NULL;
}
object->type = type;
object->data = hashmap_new();
object->data = hashmap_create();
return object;
}

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

@ -57,7 +57,7 @@ void console_init(struct Console* console)
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_save", &console_command_scene_save);
hashmap_ptr_set(console->commands, "scene_load", &console_command_scene_load);

@ -36,6 +36,7 @@
#include "im_render.h"
#include "event.h"
#include "../common/limits.h"
#include "scene_funcs.h"
#define UNUSED(a) (void)a
#define MIN_NUM(a,b) ((a) < (b) ? (a) : (b))
@ -80,6 +81,8 @@ bool game_init(struct Window* window, struct Hashmap* cvars)
game_state->event_manager = calloc(1, sizeof(*game_state->event_manager));
game_state->sound = calloc(1, sizeof(*game_state->sound));
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_warning_callback_set(game_on_log_warning);
@ -95,6 +98,8 @@ bool game_init(struct Window* window, struct Hashmap* cvars)
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);
input_init();
@ -104,10 +109,6 @@ bool game_init(struct Window* window, struct Hashmap* cvars)
gui_init(game_state->gui);
console_init(game_state->console);
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);
debug_vars_init(game_state->debug_vars);
@ -118,7 +119,7 @@ bool game_init(struct Window* window, struct Hashmap* cvars)
/* Debug 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;
return game_state->is_initialized;
}
@ -1958,6 +1959,8 @@ void game_cleanup(void)
free(game_state->gui);
free(game_state->sound);
free(game_state->debug_vars);
hashmap_free(game_state->scene_init_func_table);
hashmap_free(game_state->scene_cleanup_func_table);
}
free(game_state);
game_state = NULL;

@ -36,6 +36,8 @@ struct Game_State
struct Hashmap* cvars;
struct Sound* sound;
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_RELEASED, &input_on_key);
key_bindings = hashmap_new();
key_bindings = hashmap_create();
/* Default keys for fallback */
struct Key_Binding forward_keys = {KEY_W, KMOD_NONE, KEY_UP, KMOD_NONE, KS_INACTIVE};

@ -20,6 +20,7 @@
#include "sound_source.h"
#include "enemy.h"
#include "event.h"
#include "scene_funcs.h"
#include <assert.h>
#include <string.h>
@ -86,6 +87,8 @@ void scene_init(struct Scene* scene)
editor_init_entities(game_state->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)
@ -132,6 +135,7 @@ bool scene_load(struct Scene* scene, const char* filename, int directory_type)
{
struct Hashmap* scene_data = object->data;
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_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_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");
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++;
}
break;
@ -211,6 +218,7 @@ bool scene_load(struct Scene* scene, const char* filename, int directory_type)
strncpy(scene->filename, filename, MAX_FILENAME_LEN);
if(num_objects_loaded > 0)
{
scene->init(scene);
struct Event_Manager* event_manager = game_state_get()->event_manager;
struct Event* scene_loaded_event = event_manager_create_new_event(event_manager);
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)
{
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_CAMERAS; i++) scene_camera_remove(scene, &scene->cameras[i]);

@ -8,6 +8,9 @@
struct Ray;
struct Raycast_Result;
typedef void (*Scene_Init_Func)(struct Scene* scene);
typedef void (*Scene_Cleanup_Func)(struct Scene* scene);
struct Scene
{
char filename[MAX_FILENAME_LEN];
@ -21,6 +24,8 @@ struct Scene
struct Enemy enemies[MAX_SCENE_ENEMIES];
char entity_archetypes[MAX_SCENE_ENTITY_ARCHETYPES][MAX_FILENAME_LEN];
int active_camera_index;
Scene_Init_Func init;
Scene_Cleanup_Func cleanup;
};
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;
}
cvars = hashmap_new();
cvars = hashmap_create();
config_vars_init(cvars);
if(!platform_init()) return false;

Loading…
Cancel
Save