Пример #1
0
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);
}
Пример #2
0
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];
	}
}
Пример #3
0
/* 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);
	}
}
Пример #4
0
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);
}