diff options
Diffstat (limited to 'src/honey.c')
| -rw-r--r-- | src/honey.c | 253 | 
1 files changed, 0 insertions, 253 deletions
| diff --git a/src/honey.c b/src/honey.c deleted file mode 100644 index 793f5b5..0000000 --- a/src/honey.c +++ /dev/null @@ -1,253 +0,0 @@ -#include "honey.h" - -void honey_print_help() -{ -    printf("usage: honey [OPTIONS] SCRIPT_DIR\n" -           "  -v        Enable verbose logging\n" -           "  -h        Show this help message and exit\n" -           "  -l LOG    Log to LOG instead of stdout\n"); -} - -/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ - -bool honey_parse_options(honey_options* options, int argc, char** argv) -{ -    honey_options opts; -    opts.verbose = false; -    opts.script_directory = NULL; -    opts.logfile = NULL; - -    opterr = 0; -    int c; - -    while ((c = getopt(argc, argv, "vhl:")) != -1) { -        switch (c) { -        case 'v': -            opts.verbose = true; -            break; - -        case 'h': -            honey_print_help(); -            return false; - -        case 'l': -            opts.logfile = optarg; -            break; - -        case '?': -            fprintf(stderr, "unknown option: '%c'\n", optopt); -            honey_print_help(); -            return false; - -        default: -            return false; -        } -    } - -    if (optind < argc) { -        opts.script_directory = argv[optind]; -    } - -    *options = opts; - -    return true; -} - -/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ - -static int honey_lua_clear_color(lua_State* L) -{ -    honey_glm_array* color_array; -    bool color, depth, stencil; -    honey_lua_parse_arguments(L, 1, 4, -                              HONEY_USERDATA, &color_array, -                              HONEY_BOOLEAN, &color, -                              HONEY_BOOLEAN, &depth, -                              HONEY_BOOLEAN, &stencil); -    float r = color_array->data[0]; -    float g = color_array->data[1]; -    float b = color_array->data[2]; -    float a = color_array->data[3]; - -    int clear_flags = 0; -    if (color) -        clear_flags = clear_flags | GL_COLOR_BUFFER_BIT; -    if (depth) -        clear_flags = clear_flags | GL_DEPTH_BUFFER_BIT; -    if (stencil) -        clear_flags = clear_flags | GL_STENCIL_BUFFER_BIT; - -    glClearColor(r, g, b, a); -    glClear(clear_flags); -    return 0; -} - -/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ - -int honey_lua_enable_depth_test(lua_State* L) -{ -    bool enable; -    honey_lua_parse_arguments(L, 1, 1, HONEY_BOOLEAN, &enable); -    if (enable) -        glEnable(GL_DEPTH_TEST); -    else -        glDisable(GL_DEPTH_TEST); -    return 0; -} - -int honey_lua_set_viewport_size(lua_State* L) -{ -    int width, height; -    honey_lua_parse_arguments(L, 1, 2, -                              HONEY_INTEGER, &width, -                              HONEY_INTEGER, &height); -    glViewport(0,0,width,height); -    return 0; -} - -/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -     -bool honey_setup(lua_State** L) -{ -    /* set up lua and honey lua bindings */ -    *L = luaL_newstate(); -    luaL_openlibs(*L); - -    lua_createtable(*L, 0, 1); - -    if (!honey_setup_window(*L)) -        return false; - -    honey_setup_input(*L); -    lua_setfield(*L, -2, "input"); - -    honey_setup_glm(*L); - -    honey_setup_shader(*L); - -    honey_setup_mesh(*L); - -    honey_setup_texture(*L); - -    honey_setup_cairo(*L); - -    lua_pushcfunction(*L, honey_exit); -    lua_setfield(*L, -2, "exit"); - -    lua_pushcfunction(*L, honey_set_framebuffer); -    lua_setfield(*L, -2, "set_framebuffer"); - -    lua_pushcfunction(*L, honey_lua_clear_color); -    lua_setfield(*L, -2, "clear_color"); - -    lua_pushcfunction(*L, honey_lua_enable_depth_test); -    lua_setfield(*L, -2, "enable_depth_test"); - -    lua_pushcfunction(*L, honey_lua_set_viewport_size); -    lua_setfield(*L, -2, "set_viewport_size"); - -    lua_setglobal(*L, "honey"); - -    return true; -} - -/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ - -bool honey_run(lua_State* L, honey_options opts) { -    lua_rawgeti(L, LUA_REGISTRYINDEX, honey_window_info_ref); -    honey_window_information* info = lua_touserdata(L, -1); -    honey_window window = info->window; - -    chdir(opts.script_directory); -     -    if (luaL_loadfile(L, "main.lua") == 0) { -        if (!honey_lua_pcall(L, 0, 1) == 0) { -            const char* error = lua_tostring(L, -1); -            fprintf(stderr, "[honey] ERROR: %s\n", error); -            return false; -        } -    } -    else { -         -        fprintf(stderr, -                "[honey] ERROR: failed to load main.lua: %s!\n", -                lua_tostring(L, -1)); -        return false; -    } - -    int update_callback = honey_get_callback(L, "update"); -    int draw_callback   = honey_get_callback(L, "draw"); -     -    float prevTime = 0; -    float currentTime = 0; -    float dt; -    float drawTime = 0; -     -    while (!glfwWindowShouldClose(window)) { -        currentTime = (float) glfwGetTime(); -        dt = currentTime - prevTime; -        prevTime = currentTime; -        drawTime += dt; -        glfwPollEvents(); - -        if (update_callback != LUA_NOREF) { -            lua_rawgeti(L, LUA_REGISTRYINDEX, update_callback); -            lua_pushnumber(L, dt); -            int result = honey_lua_pcall(L, 1, 0); -            if (result != 0) { -                const char* error = lua_tostring(L, -1); -                fprintf(stderr, "[honey] ERROR: %s\n", error); -                glfwSetWindowShouldClose(window, true); -            } -        } - -        if (drawTime > 0.016) { -            drawTime -= 0.016; -         -            if (draw_callback != LUA_NOREF) { -                lua_rawgeti(L, LUA_REGISTRYINDEX, draw_callback); -                int result = honey_lua_pcall(L, 0, 0); -                if (result != 0) { -                    const char* error = lua_tostring(L, -1); -                    fprintf(stderr, "[honey] ERROR: %s\n", error); -                    glfwSetWindowShouldClose(window, true); -                } -            } - -            glfwSwapBuffers(window); -        } -    } - -    lua_close(L); -     -    glfwTerminate(); -    return true; -} - -/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ - -int honey_get_callback(lua_State* L, char* callback) -{ -    lua_getglobal(L, "honey"); -    lua_getfield(L, -1, callback); - -    int ref = LUA_NOREF; -     -    if (lua_isfunction(L, -1)) -        ref = luaL_ref(L, LUA_REGISTRYINDEX); -    else -        lua_pop(L, 1); -    lua_pop(L, 1); - -    return ref; -} - -/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ - -int honey_set_framebuffer(lua_State* L) -{ -    int framebuffer; -    honey_lua_parse_arguments(L, 1, 1, HONEY_INTEGER, &framebuffer); -    glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); -    return 0; -} | 
