Enabled hot-reloading of scenes
Signed-off-by: Robear Selwans <robear.selwans@outlook.com>
This commit is contained in:
165
src/main.c
165
src/main.c
@@ -26,30 +26,117 @@ DECLARE_EVENT_LISTENER(keyPressedListener, (KeyPressedEvent *event) {
|
||||
/* else if(event->keyCode == 61) // Numrow = */
|
||||
})
|
||||
|
||||
int main(int argc, char **argv)
|
||||
struct {
|
||||
evolmodule_t game_mod;
|
||||
evolmodule_t asset_mod;
|
||||
evolmodule_t window_mod;
|
||||
evolmodule_t input_mod;
|
||||
/* evolmodule_t renderer_mod; */
|
||||
|
||||
WindowHandle window;
|
||||
|
||||
} State;
|
||||
|
||||
void
|
||||
project_changed_cb()
|
||||
{
|
||||
evolengine_t *engine = evol_create();
|
||||
evol_parse_args(engine, argc, argv);
|
||||
evol_init(engine);
|
||||
Game->clearScenes();
|
||||
|
||||
evolmodule_t game_mod = evol_loadmodule("game"); DEBUG_ASSERT(game_mod);
|
||||
evolmodule_t asset_mod = evol_loadmodule("assetmanager"); DEBUG_ASSERT(asset_mod);
|
||||
evolmodule_t window_mod = evol_loadmodule("window"); DEBUG_ASSERT(window_mod);
|
||||
evolmodule_t input_mod = evol_loadmodule("input"); DEBUG_ASSERT(input_mod);
|
||||
evolmodule_t renderer_mod= evol_loadmodule("renderer"); DEBUG_ASSERT(renderer_mod);
|
||||
evstring project_dir = NULL;
|
||||
EvConfigLoaderResult project_dir_get_res = ev_configloader_get("project_dir", EV_TYPE_NAME(STRING), &project_dir);
|
||||
if(project_dir_get_res != EV_CONFIGLOADER_SUCCESS) {
|
||||
ev_log_error("[sandbox] Could not get project_dir from config file. Error: %s", EvConfigLoaderResultStrings[project_dir_get_res]);
|
||||
}
|
||||
|
||||
imports(asset_mod , (AssetManager, Asset, TextLoader, JSONLoader, ShaderLoader))
|
||||
imports(game_mod , (Game, Object, Camera, Scene))
|
||||
imports(window_mod , (Window))
|
||||
imports(input_mod , (Input))
|
||||
imports(renderer_mod, (Renderer))
|
||||
IMPORT_EVENTS_evmod_glfw(window_mod);
|
||||
assert(project_dir);
|
||||
|
||||
evstring project_mountpoint = evstring_new("project");
|
||||
AssetManager->mount(&project_dir, &project_mountpoint);
|
||||
evstring_free(project_mountpoint);
|
||||
|
||||
AssetHandle shader_asset = Asset->load("project://triangle.vert");
|
||||
ShaderAsset shader_bin = ShaderLoader->loadAsset(shader_asset, EV_SHADERASSETSTAGE_VERTEX, "TriangleVertex", "main", EV_SHADER_BIN);
|
||||
ShaderAsset shader_asm = ShaderLoader->loadAsset(shader_asset, EV_SHADERASSETSTAGE_VERTEX, "TriangleVertex", "main", EV_SHADER_ASM);
|
||||
|
||||
ev_log_debug("Shader Binary: %.*s", shader_bin.len, shader_bin.binary);
|
||||
ev_log_debug("Shader Assembly: %.*s", shader_asm.len, shader_asm.binary);
|
||||
|
||||
Asset->free(shader_asset);
|
||||
|
||||
EV_DEFER(
|
||||
AssetHandle project_config = Asset->load("project://game.proj"),
|
||||
Asset->free(project_config))
|
||||
{
|
||||
JSONAsset project_desc = JSONLoader->loadAsset(project_config);
|
||||
|
||||
// Loading filesystem mounts
|
||||
double mounts_count = evjs_get(project_desc.json_data, "mounts.len")->as_num;
|
||||
for(int i = 0; i < (int)mounts_count;i++) {
|
||||
evstring path_id = evstring_newfmt("mounts[%d].path", i);
|
||||
evstring mountpoint_id = evstring_newfmt("mounts[%d].mountpoint", i);
|
||||
|
||||
evstr_ref path_ref = evjs_get(project_desc.json_data, path_id)->as_str;
|
||||
evstr_ref mountpoint_ref = evjs_get(project_desc.json_data, mountpoint_id)->as_str;
|
||||
|
||||
evstring path = evstring_newfmt("%s/%.*s", project_dir, path_ref.len, path_ref.data + path_ref.offset);
|
||||
evstring mountpoint = evstring_refclone(mountpoint_ref);
|
||||
|
||||
AssetManager->mount(&path, &mountpoint);
|
||||
|
||||
evstring_free(mountpoint);
|
||||
evstring_free(path);
|
||||
|
||||
evstring_free(mountpoint_id);
|
||||
evstring_free(path_id);
|
||||
}
|
||||
|
||||
|
||||
// Loading Scenes
|
||||
double scene_count = evjs_get(project_desc.json_data, "scenes.len")->as_num;
|
||||
for(int i = 0; i < (int)scene_count;i++) {
|
||||
evstring scenepath_id = evstring_newfmt("scenes[%d].path", i);
|
||||
evstring sceneid_id = evstring_newfmt("scenes[%d].id", i);
|
||||
evstring scenepath = evstring_refclone(evjs_get(project_desc.json_data, scenepath_id)->as_str);
|
||||
evstring sceneid = evstring_refclone(evjs_get(project_desc.json_data, sceneid_id)->as_str);
|
||||
|
||||
GameScene scene = Scene->loadFromFile(scenepath);
|
||||
Scene->setName(scene, sceneid);
|
||||
|
||||
evstring_free(sceneid);
|
||||
evstring_free(sceneid_id);
|
||||
evstring_free(scenepath);
|
||||
evstring_free(scenepath_id);
|
||||
}
|
||||
|
||||
evstring activeScene = evstring_refclone(evjs_get(project_desc.json_data, "activeScene")->as_str);
|
||||
Game->setActiveScene(Scene->getFromName(activeScene));
|
||||
evstring_free(activeScene);
|
||||
}
|
||||
|
||||
evstring_free(project_dir);
|
||||
/* Renderer->setWindow((GenericHandle)State.window); */
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
load_project()
|
||||
{
|
||||
State.game_mod = evol_loadmodule("game"); DEBUG_ASSERT(State.game_mod);
|
||||
State.window_mod = evol_loadmodule("window"); DEBUG_ASSERT(State.window_mod);
|
||||
State.input_mod = evol_loadmodule("input"); DEBUG_ASSERT(State.input_mod);
|
||||
/* State.renderer_mod = evol_loadmodule("renderer"); DEBUG_ASSERT(State.renderer_mod); */
|
||||
|
||||
imports(State.game_mod , (Game, Object, Camera, Scene))
|
||||
imports(State.window_mod , (Window))
|
||||
imports(State.input_mod , (Input))
|
||||
/* imports(State.renderer_mod, (Renderer)) */
|
||||
IMPORT_EVENTS_evmod_glfw(State.window_mod);
|
||||
|
||||
U32 width = 800;
|
||||
U32 height = 600;
|
||||
|
||||
WindowHandle windowHandle = Window->create(width, height, "Main Window");
|
||||
Input->setActiveWindow(windowHandle);
|
||||
State.window = Window->create(width, height, "Main Window");
|
||||
Input->setActiveWindow(State.window);
|
||||
|
||||
ACTIVATE_EVENT_LISTENER(keyPressedListener, KeyPressedEvent);
|
||||
evstring project_dir = NULL;
|
||||
@@ -100,6 +187,7 @@ int main(int argc, char **argv)
|
||||
evstring_free(path_id);
|
||||
}
|
||||
|
||||
|
||||
// Loading Scenes
|
||||
double scene_count = evjs_get(project_desc.json_data, "scenes.len")->as_num;
|
||||
for(int i = 0; i < (int)scene_count;i++) {
|
||||
@@ -123,15 +211,38 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
evstring_free(project_dir);
|
||||
/* Renderer->setWindow((GenericHandle)State.window); */
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
unload_project()
|
||||
{
|
||||
evol_unloadmodule(State.game_mod);
|
||||
evol_unloadmodule(State.input_mod);
|
||||
evol_unloadmodule(State.window_mod);
|
||||
/* evol_unloadmodule(State.renderer_mod); */
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
evolengine_t *engine = evol_create();
|
||||
evol_parse_args(engine, argc, argv);
|
||||
evol_init(engine);
|
||||
|
||||
State.asset_mod = evol_loadmodule("assetmanager"); DEBUG_ASSERT(State.asset_mod);
|
||||
imports(State.asset_mod , (AssetManager, Asset, TextLoader, JSONLoader, ShaderLoader))
|
||||
load_project();
|
||||
|
||||
AssetManager->watchRecursively("project:/", project_changed_cb);
|
||||
|
||||
|
||||
rmt_SetCurrentThreadName("Main Thread");
|
||||
|
||||
Renderer->setWindow(windowHandle);
|
||||
|
||||
U32 result = 0;
|
||||
while(result == 0) {
|
||||
ev_ProfileCPU(WindowUpdate, 0) {
|
||||
result |= Window->update(windowHandle);
|
||||
result |= Window->update(State.window);
|
||||
}
|
||||
|
||||
ev_ProfileCPU(EventSystemProgress, 0) {
|
||||
@@ -141,14 +252,18 @@ int main(int argc, char **argv)
|
||||
ev_ProfileCPU(GameProgress, 0) {
|
||||
result |= Game->progress(0.01666667f);
|
||||
}
|
||||
Renderer->run();
|
||||
|
||||
ev_ProfileCPU(GameProgress, 0) {
|
||||
AssetManager->update();
|
||||
}
|
||||
|
||||
/* Renderer->run(); */
|
||||
sleep_ms(17);
|
||||
}
|
||||
|
||||
evol_unloadmodule(game_mod);
|
||||
evol_unloadmodule(asset_mod);
|
||||
evol_unloadmodule(input_mod);
|
||||
evol_unloadmodule(window_mod);
|
||||
unload_project();
|
||||
evol_unloadmodule(State.asset_mod);
|
||||
|
||||
evol_deinit(engine);
|
||||
evol_destroy(engine);
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user