void do_tasks(TaskManager* task_manager) { TaskId done = task_manager->begin_add_empty(); TaskId animation = task_manager->add(animation_task()); TaskId gui = task_manager->add(gui_task()); TaskId sound = task_manager->add(sound_update_task()); task_manager->add_child(done, sound); /*gui_scene*/ { TaskId gui_scene = task_manager->begin_add_empty(); /*scene_graph*/ { TaskId scene_graph = task_manager->add(scene_graph_task(), animation); task_manager->add_child(gui_scene, scene_graph); } /*scene_graph*/ task_manager->add_child(gui_scene, gui); task_manager->finish_add(gui_scene); /*render*/ { TaskId render = task_manager->add(render_task(), gui_scene); task_manager->add_child(done, render); } /*render*/ } /*gui_scene*/ task_manager->finish_add(done); task_manager->wait(done); }
void draw_all(int mouse){ unsigned char *buffer = (unsigned char *)0x1000000; for(int i = 0; i != SCREEN_HEIGHT * SCREEN_WIDTH; ++i){ buffer[i] = CYAN; } render_task(buffer, head_task); render_symbol(buffer + mouse - (SYMBOL_HEIGHT / 2 * SCREEN_WIDTH + SYMBOL_WIDTH / 2), 'X', BLACK); for(int i = 0; i != SCREEN_HEIGHT * SCREEN_WIDTH; ++i){ /* Now we write to real video memory */ *(*(unsigned char *const *)(0x11028) + i) = buffer[i]; } }
/* Renders window `task' and all next windows recursively */ void render_task(unsigned char *buffer, struct task_t *task){ if(task != 0){ /* We render front task last */ render_task(buffer, task->next); render_rectangle(buffer + task->begin, 0, 0, task->size / SCREEN_WIDTH + 1, task->size % SCREEN_WIDTH, BLACK); render_rectangle(buffer + task->begin, 1, 1, task->size / SCREEN_WIDTH - 1, task->size % SCREEN_WIDTH - 2, LIGHT_GRAY); render_rectangle(buffer + task->begin, 2, 2, task->size / SCREEN_WIDTH - 2, task->size % SCREEN_WIDTH - 3, DARK_GRAY); render_rectangle(buffer + task->begin, 2, 2, task->size / SCREEN_WIDTH - 3, task->size % SCREEN_WIDTH - 4, GRAY); render_rectangle(buffer + task->begin, 4, 4, TITLE_HEIGHT, task->size % SCREEN_WIDTH - 8, BLUE); for(int i = 0; task->cmdline[i] != 0; ++i){ render_symbol(buffer + task->begin + 5 * SCREEN_WIDTH + 6 + i * SYMBOL_WIDTH, task->cmdline[i], WHITE); } /* Render window content */ (*task->handler)(task, msg_render, (int)buffer); } }
void Engine::run_one_frame() { TaskId update = task_manager.add(update_task(), INVALID_ID, pthread_self()); TaskId render = task_manager.add(render_task(), update, pthread_self()); task_manager.wait(update); }