Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 75c0e39b0c | |||
| cc2076dcaa |
52
meson.build
52
meson.build
@@ -2,7 +2,7 @@ project('evol-sandbox', 'c',
|
|||||||
version : '0.1',
|
version : '0.1',
|
||||||
default_options : [
|
default_options : [
|
||||||
'warning_level=3',
|
'warning_level=3',
|
||||||
'c_std=gnu11',
|
'c_std=c11',
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -15,30 +15,32 @@ cc = meson.get_compiler('c')
|
|||||||
compiler_name = cc.get_id()
|
compiler_name = cc.get_id()
|
||||||
if compiler_name == 'gcc'
|
if compiler_name == 'gcc'
|
||||||
sandbox_args += '-fms-extensions'
|
sandbox_args += '-fms-extensions'
|
||||||
|
sandbox_args += '-Wall'
|
||||||
|
sandbox_args += '-Werror'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
# The subproject's sole purpose is to make sure that the modules build
|
# The subproject's sole purpose is to make sure that the modules build
|
||||||
subproject('evmod_glfw')
|
# subproject('evmod_glfw')
|
||||||
subproject('evmod_ecs')
|
# subproject('evmod_ecs')
|
||||||
subproject('evmod_physics')
|
# subproject('evmod_physics')
|
||||||
subproject('evmod_script')
|
# subproject('evmod_script')
|
||||||
subproject('evmod_assets')
|
# subproject('evmod_assets')
|
||||||
subproject('evmod_renderer')
|
# subproject('evmod_renderer')
|
||||||
subproject('evmod_game')
|
# subproject('evmod_game')
|
||||||
|
|
||||||
evmodglfw_dep = dependency('evmod_glfw')
|
# evmodglfw_dep = dependency('evmod_glfw')
|
||||||
evmodecs_dep = dependency('evmod_ecs')
|
# evmodecs_dep = dependency('evmod_ecs')
|
||||||
evmodphysics_dep = dependency('evmod_physics')
|
# evmodphysics_dep = dependency('evmod_physics')
|
||||||
evmodscript_dep = dependency('evmod_script')
|
# evmodscript_dep = dependency('evmod_script')
|
||||||
evmodgame_dep = dependency('evmod_game')
|
# evmodgame_dep = dependency('evmod_game')
|
||||||
evmodrenderer_dep = dependency('evmod_renderer')
|
# evmodrenderer_dep = dependency('evmod_renderer')
|
||||||
evmod_assets_dep = dependency('evmod_assets')
|
# evmod_assets_dep = dependency('evmod_assets')
|
||||||
|
|
||||||
subproject('project_assets')
|
# subproject('project_assets')
|
||||||
|
|
||||||
# Setup build directory
|
# Setup build directory
|
||||||
subdir('buildscripts')
|
# subdir('buildscripts')
|
||||||
|
|
||||||
sandbox_exe = executable(
|
sandbox_exe = executable(
|
||||||
'sandbox',
|
'sandbox',
|
||||||
@@ -46,15 +48,15 @@ sandbox_exe = executable(
|
|||||||
dependencies: [
|
dependencies: [
|
||||||
evol_dep,
|
evol_dep,
|
||||||
|
|
||||||
evmodglfw_dep,
|
# evmodglfw_dep,
|
||||||
evmodecs_dep,
|
# evmodecs_dep,
|
||||||
evmodphysics_dep,
|
# evmodphysics_dep,
|
||||||
evmodscript_dep,
|
# evmodscript_dep,
|
||||||
evmodgame_dep,
|
# evmodgame_dep,
|
||||||
evmodrenderer_dep,
|
# evmodrenderer_dep,
|
||||||
evmod_assets_dep,
|
# evmod_assets_dep,
|
||||||
],
|
],
|
||||||
install : true,
|
# install : true,
|
||||||
c_args: sandbox_args,
|
c_args: sandbox_args,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
332
src/main.c
332
src/main.c
@@ -1,217 +1,217 @@
|
|||||||
#include <evol/evol.h>
|
/* #include <evol/evol.h> */
|
||||||
#include <evol/common/ev_log.h>
|
/* #include <evol/common/ev_log.h> */
|
||||||
#include <evol/common/ev_macros.h>
|
#include <evol/common/ev_macros.h>
|
||||||
#include <evol/common/ev_profile.h>
|
/* #include <evol/common/ev_profile.h> */
|
||||||
#include <evol/utils/sleep.h>
|
/* #include <evol/utils/sleep.h> */
|
||||||
#include <evjson.h>
|
/* #include <evjson.h> */
|
||||||
#include <evol/core/configloader.h>
|
/* #include <evol/core/configloader.h> */
|
||||||
|
|
||||||
#define IMPORT_MODULE evmod_glfw
|
/* #define IMPORT_MODULE evmod_glfw */
|
||||||
#include IMPORT_MODULE_H
|
/* #include IMPORT_MODULE_H */
|
||||||
#define IMPORT_MODULE evmod_assets
|
/* #define IMPORT_MODULE evmod_assets */
|
||||||
#include IMPORT_MODULE_H
|
/* #include IMPORT_MODULE_H */
|
||||||
#define IMPORT_MODULE evmod_game
|
/* #define IMPORT_MODULE evmod_game */
|
||||||
#include IMPORT_MODULE_H
|
/* #include IMPORT_MODULE_H */
|
||||||
#define IMPORT_MODULE evmod_renderer
|
/* #define IMPORT_MODULE evmod_renderer */
|
||||||
#include IMPORT_MODULE_H
|
/* #include IMPORT_MODULE_H */
|
||||||
|
|
||||||
// Close window when Q is pressed
|
/* // Close window when Q is pressed */
|
||||||
DECLARE_EVENT_LISTENER(keyPressedListener, (KeyPressedEvent *event) {
|
/* DECLARE_EVENT_LISTENER(keyPressedListener, (KeyPressedEvent *event) { */
|
||||||
if(event->keyCode == 81) // tests if Q was pressed
|
/* if(event->keyCode == 81) // tests if Q was pressed */
|
||||||
Window->setShouldClose(event->handle, true);
|
/* Window->setShouldClose(event->handle, true); */
|
||||||
|
|
||||||
/* else if(event->keyCode == 49) // Numrow 1 */
|
/* /1* else if(event->keyCode == 49) // Numrow 1 *1/ */
|
||||||
/* else if(event->keyCode == 50) // Numrow 2 */
|
/* /1* else if(event->keyCode == 50) // Numrow 2 *1/ */
|
||||||
/* else if(event->keyCode == 45) // Numrow - */
|
/* /1* else if(event->keyCode == 45) // Numrow - *1/ */
|
||||||
/* else if(event->keyCode == 61) // Numrow = */
|
/* /1* else if(event->keyCode == 61) // Numrow = *1/ */
|
||||||
})
|
/* }) */
|
||||||
|
|
||||||
struct {
|
/* struct { */
|
||||||
evolmodule_t game_mod;
|
/* evolmodule_t game_mod; */
|
||||||
evolmodule_t asset_mod;
|
/* evolmodule_t asset_mod; */
|
||||||
evolmodule_t window_mod;
|
/* evolmodule_t window_mod; */
|
||||||
evolmodule_t input_mod;
|
/* evolmodule_t input_mod; */
|
||||||
evolmodule_t renderer_mod;
|
/* evolmodule_t renderer_mod; */
|
||||||
|
|
||||||
WindowHandle window;
|
/* WindowHandle window; */
|
||||||
|
|
||||||
} State;
|
/* } State; */
|
||||||
|
|
||||||
void
|
/* void */
|
||||||
project_changed_cb()
|
/* project_changed_cb() */
|
||||||
{
|
/* { */
|
||||||
evol_unloadmodule(State.renderer_mod);
|
/* evol_unloadmodule(State.renderer_mod); */
|
||||||
Game->reload();
|
/* Game->reload(); */
|
||||||
State.renderer_mod = evol_loadmodule("renderer");
|
/* State.renderer_mod = evol_loadmodule("renderer"); */
|
||||||
Renderer->setWindow((GenericHandle)State.window);
|
/* Renderer->setWindow((GenericHandle)State.window); */
|
||||||
|
|
||||||
EV_DEFER(
|
/* EV_DEFER( */
|
||||||
AssetHandle project_config = Asset->load("project://game.proj"),
|
/* AssetHandle project_config = Asset->load("project://game.proj"), */
|
||||||
Asset->free(project_config))
|
/* Asset->free(project_config)) */
|
||||||
{
|
/* { */
|
||||||
JSONAsset project_desc = JSONLoader->loadAsset(project_config);
|
/* JSONAsset project_desc = JSONLoader->loadAsset(project_config); */
|
||||||
|
|
||||||
// Loading Scenes
|
/* // Loading Scenes */
|
||||||
double scene_count = evjs_get(project_desc.json_data, "scenes.len")->as_num;
|
/* double scene_count = evjs_get(project_desc.json_data, "scenes.len")->as_num; */
|
||||||
for(int i = 0; i < (int)scene_count;i++) {
|
/* for(int i = 0; i < (int)scene_count;i++) { */
|
||||||
evstring scenepath_id = evstring_newfmt("scenes[%d].path", i);
|
/* evstring scenepath_id = evstring_newfmt("scenes[%d].path", i); */
|
||||||
evstring sceneid_id = evstring_newfmt("scenes[%d].id", 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 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);
|
/* evstring sceneid = evstring_refclone(evjs_get(project_desc.json_data, sceneid_id)->as_str); */
|
||||||
|
|
||||||
GameScene scene = Scene->loadFromFile(scenepath);
|
/* GameScene scene = Scene->loadFromFile(scenepath); */
|
||||||
Scene->setName(scene, sceneid);
|
/* Scene->setName(scene, sceneid); */
|
||||||
|
|
||||||
evstring_free(sceneid);
|
/* evstring_free(sceneid); */
|
||||||
evstring_free(sceneid_id);
|
/* evstring_free(sceneid_id); */
|
||||||
evstring_free(scenepath);
|
/* evstring_free(scenepath); */
|
||||||
evstring_free(scenepath_id);
|
/* evstring_free(scenepath_id); */
|
||||||
}
|
/* } */
|
||||||
|
|
||||||
evstring activeScene = evstring_refclone(evjs_get(project_desc.json_data, "activeScene")->as_str);
|
/* evstring activeScene = evstring_refclone(evjs_get(project_desc.json_data, "activeScene")->as_str); */
|
||||||
Game->setActiveScene(Scene->getFromName(activeScene));
|
/* Game->setActiveScene(Scene->getFromName(activeScene)); */
|
||||||
evstring_free(activeScene);
|
/* evstring_free(activeScene); */
|
||||||
}
|
/* } */
|
||||||
}
|
/* } */
|
||||||
|
|
||||||
void
|
/* void */
|
||||||
load_project()
|
/* load_project() */
|
||||||
{
|
/* { */
|
||||||
State.game_mod = evol_loadmodule("game"); DEBUG_ASSERT(State.game_mod);
|
/* State.game_mod = evol_loadmodule("game"); DEBUG_ASSERT(State.game_mod); */
|
||||||
State.window_mod = evol_loadmodule("window"); DEBUG_ASSERT(State.window_mod);
|
/* State.window_mod = evol_loadmodule("window"); DEBUG_ASSERT(State.window_mod); */
|
||||||
State.input_mod = evol_loadmodule("input"); DEBUG_ASSERT(State.input_mod);
|
/* State.input_mod = evol_loadmodule("input"); DEBUG_ASSERT(State.input_mod); */
|
||||||
State.renderer_mod = evol_loadmodule("renderer"); DEBUG_ASSERT(State.renderer_mod);
|
/* State.renderer_mod = evol_loadmodule("renderer"); DEBUG_ASSERT(State.renderer_mod); */
|
||||||
|
|
||||||
imports(State.game_mod , (Game, Object, Camera, Scene))
|
/* imports(State.game_mod , (Game, Object, Camera, Scene)) */
|
||||||
imports(State.window_mod , (Window))
|
/* imports(State.window_mod , (Window)) */
|
||||||
imports(State.input_mod , (Input))
|
/* imports(State.input_mod , (Input)) */
|
||||||
imports(State.renderer_mod, (Renderer))
|
/* imports(State.renderer_mod, (Renderer)) */
|
||||||
IMPORT_EVENTS_evmod_glfw(State.window_mod);
|
/* IMPORT_EVENTS_evmod_glfw(State.window_mod); */
|
||||||
|
|
||||||
U32 width = 1920;
|
/* U32 width = 1920; */
|
||||||
U32 height = 1050;
|
/* U32 height = 1050; */
|
||||||
|
|
||||||
State.window = Window->create(width, height, "Main Window");
|
/* State.window = Window->create(width, height, "Main Window"); */
|
||||||
Input->setActiveWindow(State.window);
|
/* Input->setActiveWindow(State.window); */
|
||||||
|
|
||||||
ACTIVATE_EVENT_LISTENER(keyPressedListener, KeyPressedEvent);
|
/* ACTIVATE_EVENT_LISTENER(keyPressedListener, KeyPressedEvent); */
|
||||||
evstring project_dir = NULL;
|
/* evstring project_dir = NULL; */
|
||||||
EvConfigLoaderResult project_dir_get_res = ev_configloader_get("project_dir", EV_TYPE_NAME(STRING), &project_dir);
|
/* EvConfigLoaderResult project_dir_get_res = ev_configloader_get("project_dir", EV_TYPE_NAME(STRING), &project_dir); */
|
||||||
if(project_dir_get_res != EV_CONFIGLOADER_SUCCESS) {
|
/* 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]);
|
/* ev_log_error("[sandbox] Could not get project_dir from config file. Error: %s", EvConfigLoaderResultStrings[project_dir_get_res]); */
|
||||||
}
|
/* } */
|
||||||
|
|
||||||
assert(project_dir);
|
/* assert(project_dir); */
|
||||||
|
|
||||||
evstring project_mountpoint = evstring_new("project");
|
/* evstring project_mountpoint = evstring_new("project"); */
|
||||||
AssetManager->mount(&project_dir, &project_mountpoint);
|
/* AssetManager->mount(&project_dir, &project_mountpoint); */
|
||||||
evstring_free(project_mountpoint);
|
/* evstring_free(project_mountpoint); */
|
||||||
|
|
||||||
EV_DEFER(
|
/* EV_DEFER( */
|
||||||
AssetHandle project_config = Asset->load("project://game.proj"),
|
/* AssetHandle project_config = Asset->load("project://game.proj"), */
|
||||||
Asset->free(project_config))
|
/* Asset->free(project_config)) */
|
||||||
{
|
/* { */
|
||||||
JSONAsset project_desc = JSONLoader->loadAsset(project_config);
|
/* JSONAsset project_desc = JSONLoader->loadAsset(project_config); */
|
||||||
|
|
||||||
// Loading filesystem mounts
|
/* // Loading filesystem mounts */
|
||||||
double mounts_count = evjs_get(project_desc.json_data, "mounts.len")->as_num;
|
/* double mounts_count = evjs_get(project_desc.json_data, "mounts.len")->as_num; */
|
||||||
for(int i = 0; i < (int)mounts_count;i++) {
|
/* for(int i = 0; i < (int)mounts_count;i++) { */
|
||||||
evstring path_id = evstring_newfmt("mounts[%d].path", i);
|
/* evstring path_id = evstring_newfmt("mounts[%d].path", i); */
|
||||||
evstring mountpoint_id = evstring_newfmt("mounts[%d].mountpoint", 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 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;
|
/* 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 path = evstring_newfmt("%s/%.*s", project_dir, path_ref.len, path_ref.data + path_ref.offset); */
|
||||||
evstring mountpoint = evstring_refclone(mountpoint_ref);
|
/* evstring mountpoint = evstring_refclone(mountpoint_ref); */
|
||||||
|
|
||||||
AssetManager->mount(&path, &mountpoint);
|
/* AssetManager->mount(&path, &mountpoint); */
|
||||||
|
|
||||||
evstring_free(mountpoint);
|
/* evstring_free(mountpoint); */
|
||||||
evstring_free(path);
|
/* evstring_free(path); */
|
||||||
|
|
||||||
evstring_free(mountpoint_id);
|
/* evstring_free(mountpoint_id); */
|
||||||
evstring_free(path_id);
|
/* evstring_free(path_id); */
|
||||||
}
|
/* } */
|
||||||
|
|
||||||
Renderer->setWindow((GenericHandle)State.window);
|
/* Renderer->setWindow((GenericHandle)State.window); */
|
||||||
|
|
||||||
|
|
||||||
// Loading Scenes
|
/* // Loading Scenes */
|
||||||
double scene_count = evjs_get(project_desc.json_data, "scenes.len")->as_num;
|
/* double scene_count = evjs_get(project_desc.json_data, "scenes.len")->as_num; */
|
||||||
for(int i = 0; i < (int)scene_count;i++) {
|
/* for(int i = 0; i < (int)scene_count;i++) { */
|
||||||
evstring scenepath_id = evstring_newfmt("scenes[%d].path", i);
|
/* evstring scenepath_id = evstring_newfmt("scenes[%d].path", i); */
|
||||||
evstring sceneid_id = evstring_newfmt("scenes[%d].id", 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 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);
|
/* evstring sceneid = evstring_refclone(evjs_get(project_desc.json_data, sceneid_id)->as_str); */
|
||||||
|
|
||||||
GameScene scene = Scene->loadFromFile(scenepath);
|
/* GameScene scene = Scene->loadFromFile(scenepath); */
|
||||||
Scene->setName(scene, sceneid);
|
/* Scene->setName(scene, sceneid); */
|
||||||
|
|
||||||
evstring_free(sceneid);
|
/* evstring_free(sceneid); */
|
||||||
evstring_free(sceneid_id);
|
/* evstring_free(sceneid_id); */
|
||||||
evstring_free(scenepath);
|
/* evstring_free(scenepath); */
|
||||||
evstring_free(scenepath_id);
|
/* evstring_free(scenepath_id); */
|
||||||
}
|
/* } */
|
||||||
|
|
||||||
evstring activeScene = evstring_refclone(evjs_get(project_desc.json_data, "activeScene")->as_str);
|
/* evstring activeScene = evstring_refclone(evjs_get(project_desc.json_data, "activeScene")->as_str); */
|
||||||
Game->setActiveScene(Scene->getFromName(activeScene));
|
/* Game->setActiveScene(Scene->getFromName(activeScene)); */
|
||||||
evstring_free(activeScene);
|
/* evstring_free(activeScene); */
|
||||||
}
|
/* } */
|
||||||
|
|
||||||
evstring_free(project_dir);
|
/* evstring_free(project_dir); */
|
||||||
}
|
/* } */
|
||||||
|
|
||||||
void
|
/* void */
|
||||||
unload_project()
|
/* unload_project() */
|
||||||
{
|
/* { */
|
||||||
evol_unloadmodule(State.renderer_mod);
|
/* evol_unloadmodule(State.renderer_mod); */
|
||||||
evol_unloadmodule(State.game_mod);
|
/* evol_unloadmodule(State.game_mod); */
|
||||||
evol_unloadmodule(State.input_mod);
|
/* evol_unloadmodule(State.input_mod); */
|
||||||
evol_unloadmodule(State.window_mod);
|
/* evol_unloadmodule(State.window_mod); */
|
||||||
}
|
/* } */
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
evolengine_t *engine = evol_create();
|
EV_UNUSED_PARAMS(argc, argv);
|
||||||
evol_parse_args(engine, argc, argv);
|
/* evolengine_t *engine = evol_create(); */
|
||||||
evol_init(engine);
|
/* evol_parse_args(engine, argc, argv); */
|
||||||
|
/* evol_init(engine); */
|
||||||
|
|
||||||
State.asset_mod = evol_loadmodule("assetmanager"); DEBUG_ASSERT(State.asset_mod);
|
/* State.asset_mod = evol_loadmodule("assetmanager"); DEBUG_ASSERT(State.asset_mod); */
|
||||||
imports(State.asset_mod , (AssetManager, Asset, TextLoader, JSONLoader, ShaderLoader))
|
/* imports(State.asset_mod , (AssetManager, Asset, TextLoader, JSONLoader, ShaderLoader)) */
|
||||||
load_project();
|
/* load_project(); */
|
||||||
|
|
||||||
|
|
||||||
AssetManager->watchRecursively("project:/", project_changed_cb);
|
/* AssetManager->watchRecursively("project:/", project_changed_cb); */
|
||||||
|
|
||||||
rmt_SetCurrentThreadName("Main Thread");
|
/* rmt_SetCurrentThreadName("Main Thread"); */
|
||||||
|
|
||||||
U32 result = 0;
|
/* U32 result = 0; */
|
||||||
while(result == 0) {
|
/* while(result == 0) { */
|
||||||
ev_ProfileCPU(WindowUpdate, 0) {
|
/* ev_ProfileCPU(WindowUpdate, 0) { */
|
||||||
result |= Window->update(State.window);
|
/* result |= Window->update(State.window); */
|
||||||
}
|
/* } */
|
||||||
|
|
||||||
ev_ProfileCPU(EventSystemProgress, 0) {
|
/* ev_ProfileCPU(EventSystemProgress, 0) { */
|
||||||
result |= EventSystem.progress();
|
/* result |= EventSystem.progress(); */
|
||||||
}
|
/* } */
|
||||||
|
|
||||||
ev_ProfileCPU(GameProgress, 0) {
|
/* ev_ProfileCPU(GameProgress, 0) { */
|
||||||
result |= Game->progress(0.01666667f);
|
/* result |= Game->progress(0.01666667f); */
|
||||||
}
|
/* } */
|
||||||
|
|
||||||
ev_ProfileCPU(GameProgress, 0) {
|
/* ev_ProfileCPU(GameProgress, 0) { */
|
||||||
AssetManager->update();
|
/* AssetManager->update(); */
|
||||||
}
|
/* } */
|
||||||
|
|
||||||
Renderer->run();
|
/* /1* sleep_ms(17); *1/ */
|
||||||
/* sleep_ms(17); */
|
/* } */
|
||||||
}
|
|
||||||
|
|
||||||
unload_project();
|
/* unload_project(); */
|
||||||
evol_unloadmodule(State.asset_mod);
|
/* evol_unloadmodule(State.asset_mod); */
|
||||||
|
|
||||||
evol_deinit(engine);
|
/* evol_deinit(engine); */
|
||||||
evol_destroy(engine);
|
/* evol_destroy(engine); */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[wrap-git]
|
[wrap-git]
|
||||||
directory = evol
|
directory = evol
|
||||||
url = https://github.com/evol3D/evol
|
url = https://github.com/evol3D/evol
|
||||||
revision = master
|
revision = v0.3
|
||||||
|
|
||||||
[provide]
|
[provide]
|
||||||
dependency_names = evol
|
dependency_names = evol
|
||||||
|
|||||||
Reference in New Issue
Block a user