Пример #1
0
void ImprovWindow::redraw()
{

#ifndef NACL
    circa_update_changed_files(_world);
#endif
    
    if (_width == 0 && _height == 0) {
        printf("error: App::redraw() called before setSize()\n");
        return;
    }
    
    double startTime = get_time();
    
    glClear( GL_COLOR_BUFFER_BIT /*| GL_DEPTH_BUFFER_BIT*/ );
    
    circa_copy(_inputEvents, circa_env_insert(_stack, "inputEvents"));
    
    circa_set_vec2(circa_env_insert(_stack, "mouse"), _mouseX, _mouseY);
    circa_set_vec2(circa_env_insert(_stack, "windowSize"), _width, _height);
    circa_set_float(circa_env_insert(_stack, "time"), _elapsedTime);
    circa_set_float(circa_env_insert(_stack, "lastFrameDuration"), _lastFrameDuration);
    
#ifdef NACL
    circa_set_bool(circa_env_insert(_stack, "gl_es2"), true);
#endif
    
    circa_run(_stack);
    
    if (circa_has_error(_stack)) {
        circa_dump_stack_trace(_stack);
        
#ifndef NACL
        exit(1);
#endif
    }
    
    // Cleanup stack
    circa_restart(_stack);
    
    // Cleanup
    circa_set_list(_inputEvents, 0);
    
    _lastFrameDuration = get_time() - startTime;
    
#define DUMP_PERF_STATS 0
#if DUMP_PERF_STATS
    printf("frame duration = %f\n", (float) _lastFrameDuration);
    circa_perf_stats_dump();
    circa_perf_stats_reset();
#endif

}
Пример #2
0
void GLWidget::mouseReleaseEvent ( QMouseEvent * qevent )
{
    caValue* event = circa_alloc_list(2);
    circa_set_int(circa_index(event, 0), 2);
    circa_set_vec2(circa_index(event, 1), qevent->x(), qevent->y());
    onInputEvent(event);
}
Пример #3
0
void ImprovWindow::mainLoop()
{
    // Main loop.
    while (true) {
        
        // Handle events.
        SDL_Event sdlEvent;
        while (SDL_PollEvent(&sdlEvent)) {

            switch (sdlEvent.type) 
            {
            case SDL_QUIT:
                printf("received SDL_QUIT\n");
                return;

            case SDL_KEYDOWN: {

                #ifndef NACL
                    // Quit on Escape key
                    if (sdlEvent.key.keysym.sym == SDLK_ESCAPE)
                        return;

                    #if 0
                    // Fullscreen on command-F
                    if (sdlEvent.key.keysym.sym == SDLK_f && (sdlEvent.key.keysym.mod & KMOD_CTRL))
                        toggleFullscreen();
                    #endif
                #endif

                caValue* event = circa_append(_inputEvents);
                circa_set_list(event, 2);
                circa_set_symbol(circa_index(event, 0), "down");
                sdl_key_to_symbol(sdlEvent.key.keysym.sym, circa_index(event, 1));
                break;
            }
            case SDL_KEYUP: {
                caValue* event = circa_append(_inputEvents);
                circa_set_list(event, 2);
                circa_set_symbol(circa_index(event, 0), "up");
                sdl_key_to_symbol(sdlEvent.key.keysym.sym, circa_index(event, 1));
                break;
            }

            case SDL_MOUSEBUTTONDOWN: {
                double mouseX = sdlEvent.button.x;
                double mouseY = sdlEvent.button.y;

                caValue* event = circa_append(_inputEvents);
                circa_set_list(event, 3);
                circa_set_symbol(circa_index(event, 0), "down");
                if (sdlEvent.button.button == SDL_BUTTON_LEFT)
                    circa_set_symbol(circa_index(event, 1), "left_mouse");
                else
                    circa_set_symbol(circa_index(event, 1), "right_mouse");
                circa_set_vec2(circa_index(event, 2), mouseX, mouseY);
                break;
            }

            case SDL_MOUSEBUTTONUP: {
                double mouseX = sdlEvent.button.x;
                double mouseY = sdlEvent.button.y;

                caValue* event = circa_append(_inputEvents);
                circa_set_list(event, 3);
                circa_set_symbol(circa_index(event, 0), "up");
                if (sdlEvent.button.button == SDL_BUTTON_LEFT)
                    circa_set_symbol(circa_index(event, 1), "left_mouse");
                else
                    circa_set_symbol(circa_index(event, 1), "right_mouse");
                circa_set_vec2(circa_index(event, 2), mouseX, mouseY);
                break;
            }

            case SDL_MOUSEWHEEL: {
                caValue* event = circa_append(_inputEvents);
                circa_set_list(event, 3);
                circa_set_symbol(circa_index(event, 0), "mouse_wheel");
                circa_set_vec2(circa_index(event, 1), sdlEvent.wheel.x, sdlEvent.wheel.y);
                break;
            }

            case SDL_WINDOWEVENT: {
                switch (sdlEvent.window.event) {
                case SDL_WINDOWEVENT_RESIZED:
                    int width = sdlEvent.window.data1;
                    int height = sdlEvent.window.data2;
                    setSize(width, height);
                    break;
                }
                break;
            }
            }
        }

        // Done handling events. Redraw screen.

        _elapsedTime = SDL_GetTicks() / 1000.0;

        int mouseX, mouseY;
        SDL_GetMouseState(&mouseX, &mouseY);
        _mouseX = mouseX;
        _mouseY = mouseY;

        redraw();

        SDL_GL_SwapWindow(_sdl_window);
        SDL_Delay(1);
    }
}