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 }
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); }
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); } }