Mercurial > hg > Game > Cerium
changeset 619:278db3ca751d draft
RenewTask removal
line wrap: on
line diff
--- a/Renderer/Engine/Makefile.macosx Sat Nov 14 21:17:02 2009 +0900 +++ b/Renderer/Engine/Makefile.macosx Sun Nov 15 02:02:30 2009 +0900 @@ -48,7 +48,6 @@ clean: rm -f $(TARGET) $(OBJS) $(TASK_OBJS) - rm -f *~ \#* - rm -f SGList.h SGList.cc + rm -f *~ \#* *.o -include depend.inc
--- a/Renderer/Engine/lindaapi.cc Sat Nov 14 21:17:02 2009 +0900 +++ b/Renderer/Engine/lindaapi.cc Sun Nov 15 02:02:30 2009 +0900 @@ -156,7 +156,7 @@ 失敗すると -1 を返す。 /-------------------------------------------------------------------*/ int -open_linda(char * hostname, int port){ +open_linda(const char * hostname, int port){ int fd; struct hostent *hoste; struct sockaddr_in serv_addr; @@ -213,7 +213,7 @@ } int -open_linda_java(char * hostname, int port){ +open_linda_java(const char * hostname, int port){ int fd; struct hostent *hoste; struct sockaddr_in serv_addr;
--- a/Renderer/Engine/lindaapi.h Sat Nov 14 21:17:02 2009 +0900 +++ b/Renderer/Engine/lindaapi.h Sun Nov 15 02:02:30 2009 +0900 @@ -62,8 +62,8 @@ ----------------------------------------------------------------------*/ extern void init_linda(void); -extern int open_linda(char *hostname, int port); -extern int open_linda_java(char *hostname, int port); +extern int open_linda(const char *hostname, int port); +extern int open_linda_java(const char *hostname, int port); extern int close_linda(int tspace_id); extern void psx_free(void*);
--- a/Renderer/Engine/spe/DrawSpan.cc Sat Nov 14 21:17:02 2009 +0900 +++ b/Renderer/Engine/spe/DrawSpan.cc Sun Nov 15 02:02:30 2009 +0900 @@ -417,7 +417,7 @@ }; // uint32 display = smanager->get_param(0); - int screen_width = smanager->get_param(1); + // int screen_width = smanager->get_param(1); int rangex_start = smanager->get_param(2); int rangex_end = smanager->get_param(3);
--- a/Renderer/Engine/task/DrawSpan.cc Sat Nov 14 21:17:02 2009 +0900 +++ b/Renderer/Engine/task/DrawSpan.cc Sun Nov 15 02:02:30 2009 +0900 @@ -11,6 +11,7 @@ #include "Tapestry.h" #include "SpanPack.h" +#define BIGENDIAN 1 SchedDefineTask(DrawSpan); @@ -174,7 +175,11 @@ int color = get_rgb(tex_x, tex_y, tile); /*下位4bitを抽出*/ +#if BIGENDIAN int alpha = color & 0x000000ff; +#else + int alpha = color & 0xff000000; +#endif /*完全に透けているか判断*/ int flag = (alpha != 0); @@ -361,10 +366,17 @@ float inner_product; // 引数で受け取った color の rgb 情報の抜き出し +#if BIGENDIAN rgb[0] = (color & 0xff000000) >> 24; rgb[1] = (color & 0x00ff0000) >> 16; rgb[2] = (color & 0x0000ff00) >> 8; rgb[3] = (color & 0x000000ff); +#else + rgb[3] = (color & 0xff000000) >> 24; + rgb[2] = (color & 0x00ff0000) >> 16; + rgb[1] = (color & 0x0000ff00) >> 8; + rgb[0] = (color & 0x000000ff); +#endif // 法線ベクトルと光源ベクトルとの内積をとる inner_product = innerProduct(normal_vector,light_vector); @@ -377,7 +389,11 @@ rgb[2] = (unsigned char)(rgb[2]*inner_product*flag); //計算した rgb を light_rgb にまとめる。 +#if BIGENDIAN light_rgb = (rgb[0] << 24) + (rgb[1] << 16) + (rgb[2] << 8) + (rgb[3]); +#else + light_rgb = (rgb[3] << 24) + (rgb[2] << 16) + (rgb[1] << 8) + (rgb[0]); +#endif return light_rgb; } @@ -401,7 +417,7 @@ }; // uint32 display = smanager->get_param(0); - int screen_width = smanager->get_param(1); + // int screen_width = smanager->get_param(1); int rangex_start = smanager->get_param(2); int rangex_end = smanager->get_param(3);
--- a/Renderer/Test/writer.c Sat Nov 14 21:17:02 2009 +0900 +++ b/Renderer/Test/writer.c Sun Nov 15 02:02:30 2009 +0900 @@ -64,7 +64,7 @@ int tspace; int serial; int xml_id; - char *linda_serv = "localhost"; + const char *linda_serv = "localhost"; if (argc > 1) linda_serv = argv[1]; init_linda();
--- a/TaskManager/Cell/CellTaskManagerImpl.cc Sat Nov 14 21:17:02 2009 +0900 +++ b/TaskManager/Cell/CellTaskManagerImpl.cc Sun Nov 15 02:02:30 2009 +0900 @@ -53,6 +53,10 @@ ppeManager = new FifoTaskManagerImpl(machineNum); // 大半のTaskQueueInfoは、共有される ppeManager->init(new PpeScheduler, this); + + ppeManager->get_scheduler()->set_manager(this); + schedTaskManager = new SchedTask(); + schedTaskManager->init(0,0,0,ppeManager->get_scheduler()); } void @@ -220,7 +224,9 @@ speThreads->send_mail(id, 2, alloc_info); } else if (data > MY_SPE_NOP) { //__debug_ppe("[PPE] recv from [SPE %d] : 0x%x\n", id, data); - check_task_finish((HTaskPtr)data); + HTaskPtr task = (HTaskPtr)data; + task->post_func(schedTaskManager, task->post_arg1, task->post_arg2); + check_task_finish(task); } } }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/Cell/spe/SpeTaskManagerImpl.cc Sun Nov 15 02:02:30 2009 +0900 @@ -0,0 +1,57 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "FifoTaskManagerImpl.h" +#include "Scheduler.h" +#include "SchedTask.h" +#include "types.h" +#include "error.h" + +FifoTaskManagerImpl::~FifoTaskManagerImpl() +{ + +} + +/** + */ +void +FifoTaskManagerImpl::init() +{ +} + +/** + */ +void +FifoTaskManagerImpl::init(MainScheduler *_sched) +{ + scheduler = _sched; +} + + +void +FifoTaskManagerImpl::run() +{ +} + + +void* +FifoTaskManagerImpl::allocate(int size, int alignment) +{ + void *buff; + posix_memalign(&buff, alignment, size); + return buff; +} + +void* +FifoTaskManagerImpl::allocate(int size) +{ + void *buff; + posix_memalign(&buff, DEFAULT_ALIGNMENT, size); + return buff; +} + +Scheduler* +FifoTaskManagerImpl::get_scheduler() { + return scheduler; +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/Cell/spe/SpeTaskManagerImpl.h Sun Nov 15 02:02:30 2009 +0900 @@ -0,0 +1,30 @@ +#ifndef INCLUDED_FIFO_TASK_MANAGER_IMPL +#define INCLUDED_FIFO_TASK_MANAGER_IMPL + +#include "TaskManagerImpl.h" +#include "MainScheduler.h" +#include "Scheduler.h" + +class SpeTaskManagerImpl : public TaskManagerImpl { +public: + /* constructor */ + SpeTaskManagerImpl(int num = 1) : TaskManagerImpl(num) {} + ~SpeTaskManagerImpl(void); + + /* variables */ + CellScheduler *scheduler; + + /* functions */ + // call by system + void init(void); + void run(void); + + // call by user + int add_data(ListDataPtr, uint32, int); + void* allocate(int size,int align); + void* allocate(int size); + Scheduler* get_scheduler(); +}; + + +#endif /* INCLUDED_FIFO_TASK_MANAGER_IMPL */
--- a/TaskManager/Cell/spe/main.cc Sat Nov 14 21:17:02 2009 +0900 +++ b/TaskManager/Cell/spe/main.cc Sun Nov 15 02:02:30 2009 +0900 @@ -23,6 +23,9 @@ manager->init(); manager->id = (int)argc; + TaskManagerImpl *tm = new SpeTaskManagerImpl(manager); + manager->set_manager(tm); + spu_write_decrementer(0x7FFFFFFFU); unsigned int prof = spu_read_decrementer(); manager->run();
--- a/TaskManager/ChangeLog Sat Nov 14 21:17:02 2009 +0900 +++ b/TaskManager/ChangeLog Sun Nov 15 02:02:30 2009 +0900 @@ -1,3 +1,18 @@ +2009-11-14 Shinji KONO <kono@ie.u-ryukyu.ac.jp> + + Scheduler / TaskManger / TaskManagerImpl の区別が不明 + + Scheduler は SchedTask から直接見えないはずだが、SchedTask は、 + Scheduler は知っているが、TaskManager は知らない。これがかなりの + 混乱を生んでいる。 + + SPU上では、TaskManager が存在しないのが原因らしいが、allcoate とかは、 + TaskManager が行うはず。なので、SPU上にもTaskManagerがある方が自然。 + + SchedTask が自分自身で scheduling してしまっているので、Scheduler + には、ほとんど仕事がない。なので、大半の処理を scheduler -> manager + 経由で行うことになる。 + 2009-11-14 Shinji KONO <kono@ie.u-ryukyu.ac.jp> 要するに、SPE task 側から addOutData できればよい。
--- a/TaskManager/Fifo/FifoTaskManagerImpl.cc Sat Nov 14 21:17:02 2009 +0900 +++ b/TaskManager/Fifo/FifoTaskManagerImpl.cc Sun Nov 15 02:02:30 2009 +0900 @@ -3,6 +3,7 @@ #include <string.h> #include "FifoTaskManagerImpl.h" #include "Scheduler.h" +#include "SchedTask.h" #include "types.h" #include "error.h" @@ -32,6 +33,7 @@ scheduler->init(); scheduler->set_mailManager(mailManager); scheduler->id = 0; + scheduler->set_manager(this); taskListImpl = new TaskListInfo; taskQueueImpl = new TaskQueueInfo; @@ -39,6 +41,9 @@ mainTaskList = taskListImpl->create(); + schedTaskManager = new SchedTask(); + schedTaskManager->init(0,0,0,scheduler); + } /** @@ -222,7 +227,11 @@ __debug_ppe("mail_check(): Task List finish\n"); } else if (data > MY_SPE_NOP) { __debug_ppe("mail_check(): recv from 0x%x\n", data); - check_task_finish((HTaskPtr)data); + // post_func を先に実行しないと、systask_finish が active_queue + // 移されてから、wait_for されるという事態が起きることがある。 + HTaskPtr task = (HTaskPtr)data; + task->post_func(schedTaskManager, task->post_arg1, task->post_arg2); + check_task_finish(task); } d = q;
--- a/TaskManager/kernel/ppe/TaskManager.cc Sat Nov 14 21:17:02 2009 +0900 +++ b/TaskManager/kernel/ppe/TaskManager.cc Sun Nov 15 02:02:30 2009 +0900 @@ -1,8 +1,8 @@ #include "TaskManager.h" +#include "Scheduler.h" TaskManager::TaskManager(int num) : machineNum(num) { - gen_random = new Random; } TaskManager::~TaskManager() @@ -83,7 +83,13 @@ int TaskManager::get_random() { - return gen_random->getData(); + return random(); +} + +MemList* +TaskManager::createMemList(int size, int count) +{ + return get_scheduler()->createMemList(size, count); } Scheduler*
--- a/TaskManager/kernel/ppe/TaskManager.h Sat Nov 14 21:17:02 2009 +0900 +++ b/TaskManager/kernel/ppe/TaskManager.h Sun Nov 15 02:02:30 2009 +0900 @@ -4,9 +4,11 @@ #include "TaskManagerImpl.h" #include "Random.h" #include "MemList.h" -#include "Scheduler.h" #include "HTask.h" +class Scheduler; +class MemList; + class TaskManager { public: /* constructor */ @@ -26,6 +28,7 @@ int get_cpuNum(); int get_random(); Scheduler *get_scheduler(); + MemList* createMemList(int size, int count); /* functions */ void init();
--- a/TaskManager/kernel/ppe/TaskManagerImpl.cc Sat Nov 14 21:17:02 2009 +0900 +++ b/TaskManager/kernel/ppe/TaskManagerImpl.cc Sun Nov 15 02:02:30 2009 +0900 @@ -3,9 +3,10 @@ #include "types.h" #include "error.h" #include "SchedTask.h" -#include "SchedTaskManager.h" #include "../sys_task/SysTask.h" +#include "Scheduler.h" + static HTaskPtr systask_start; static HTaskPtr systask_finish; @@ -32,8 +33,6 @@ { systask_register(); - schedTaskManager = new SchedTaskManager(this); - systask_start = create_task(SYSTASK_START); systask_finish = create_task(SYSTASK_FINISH); @@ -125,10 +124,6 @@ void TaskManagerImpl::check_task_finish(HTaskPtr me) { - // post_func を先に実行しないと、systask_finish が active_queue - // 移されてから、wait_for されるという事態が起きることがある。 - - me->post_func(schedTaskManager, me->post_arg1,me->post_arg2); while(TaskQueue *p = me->wait_me->poll()) { HTaskPtr you = p->task; @@ -166,4 +161,5 @@ // done in check_task_finish } + /* end */
--- a/TaskManager/kernel/ppe/TaskManagerImpl.h Sat Nov 14 21:17:02 2009 +0900 +++ b/TaskManager/kernel/ppe/TaskManagerImpl.h Sun Nov 15 02:02:30 2009 +0900 @@ -3,10 +3,11 @@ #include "MailManager.h" #include "ListData.h" -#include "Scheduler.h" #include "TaskListInfo.h" #include "TaskQueueInfo.h" #include "HTaskInfo.h" +class Scheduler; +class MemList; class TaskManagerImpl { @@ -20,6 +21,7 @@ TaskListInfo *taskListImpl; TaskQueueInfo *taskQueueImpl; HTaskInfo *htaskImpl; + SchedTask *schedTaskManager; /* constructor */ @@ -44,8 +46,10 @@ void set_task_depend(HTaskPtr master, HTaskPtr slave); void spawn_task(HTaskPtr); void set_task_cpu(HTaskPtr, CPU_TYPE); + virtual void* allocate(int size) = 0; virtual void* allocate(int size,int align) = 0; virtual Scheduler* get_scheduler() = 0; }; + #endif
--- a/TaskManager/kernel/schedule/SchedNop2Ready.cc Sat Nov 14 21:17:02 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedNop2Ready.cc Sun Nov 15 02:02:30 2009 +0900 @@ -20,19 +20,8 @@ SchedTaskBase* SchedNop2Ready::next(Scheduler *scheduler,SchedTaskBase *p) { - SchedTaskBase *nextSched; - __debug("[SchedNop2Ready:%s]\n", __FUNCTION__); - // delete p; - - nextSched = scheduler->get_nextRenewTaskList(); - - // RenewTask がある - if (nextSched) { - return nextSched; - } else { - scheduler->mail_write(MY_SPE_STATUS_READY); - return new SchedMail(); - } + scheduler->mail_write(MY_SPE_STATUS_READY); + return new SchedMail(); }
--- a/TaskManager/kernel/schedule/SchedTask.cc Sat Nov 14 21:17:02 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTask.cc Sun Nov 15 02:02:30 2009 +0900 @@ -10,8 +10,6 @@ extern Scheduler::TaskObject task_list[MAX_TASK_OBJECT]; -//#define NO_PIPELINE - /** Task Object を作る */ @@ -46,19 +44,11 @@ readbuf = NULL; writebuf = NULL; scheduler = NULL; - taskGroup = NULL; - renew_flag = 0; cur_index = 0; - flag_renewTask = SCHED_TASK_NORMAL; this->stdout_ = stdout; this->stderr_ = stderr; this->stdin_ = stdin; - ex_init = &SchedTask::ex_init_normal; - ex_read = &SchedTask::ex_read_normal; - ex_exec = &SchedTask::ex_exec_normal; - ex_write = &SchedTask::ex_write_normal; - ex_next = &SchedTask::ex_next_normal; } @@ -67,35 +57,8 @@ */ SchedTask::~SchedTask() { - if (flag_renewTask == SCHED_TASK_RENEW) { - /** - * list != NULL の場合、 - * この Task が list の最後の Task になるので (SchedTask::next 参照) - * このタイミングで list を解放する - * (free に渡されるアドレスが正しいものとなる)。 - * それ以外の Task では当然解放しない。 - * list == NULL なので、free に渡しても無問題 - */ - free(list); - } - - } -/** - * このタスクを Renew Task とし、それに応じた関数をセットする - */ -void -SchedTask::setRenew() -{ - flag_renewTask = SCHED_TASK_RENEW; - - ex_init = &SchedTask::ex_init_renew; - ex_read = &SchedTask::ex_read_renew; - ex_exec = &SchedTask::ex_exec_renew; - ex_write = &SchedTask::ex_write_renew; - ex_next = &SchedTask::ex_next_renew; -} void SchedTask::init(TaskListPtr _list, TaskPtr _task, int index, @@ -111,56 +74,14 @@ scheduler->mainMem_wait(); - (this->*ex_init)(); } -/** - * PPE 内で生成されたタスクの ex_init() - */ -void -SchedTask::ex_init_normal() -{ -#if 0 - // task list に入れたので既に読んでいる? - // - scheduler->dma_load(inListData, (uint32)&task->inData, - sizeof(ListData), DMA_READ_IN_LIST); - scheduler->dma_load(outListData, (uint32)&task->outData, - sizeof(ListData), DMA_READ_OUT_LIST); -#if defined(NO_PIPELINE) - scheduler->dma_wait(DMA_READ_IN_LIST); - scheduler->dma_wait(DMA_READ_OUT_LIST); -#endif -#endif - - taskGroup = new TaskGroup; - taskGroup->command = (int)task->self; -} - -/** - * SPE 内で生成されたタスクの ex_init() - * 各データは SPE 内の create_task 時に生成もしくは引き継がれているので - * ex_init_normal() と違い、ここでは値を渡すだけ - */ -void -SchedTask::ex_init_renew() -{ - inListData = &task->inData; - outListData = &task->outData; - taskGroup = (TaskGroupPtr)task->self; -} void SchedTask::read() { __debug("[SchedTask:%s]\n", __FUNCTION__); -#if 0 -#if !defined(NO_PIPELINE) - scheduler->dma_wait(DMA_READ_IN_LIST); - scheduler->dma_wait(DMA_READ_OUT_LIST); -#endif -#endif // object creation をSchedTask生成時にやらないので、 // exec の直前のread で十分に間に合う if (cur_index < list->length) { @@ -177,61 +98,24 @@ readbuf = scheduler->allocate(inListData->size); scheduler->dma_loadList(inListData, readbuf, DMA_READ); -#if defined(NO_PIPELINE) - scheduler->dma_wait(DMA_READ); -#endif - (this->*ex_read)(); } -/** - * PPE 内で生成されたタスクの ex_read() - * - * [Todo] - * データの読み込み場所を readbuf ではなく、 - * ユーザ自身で決めれるようになるといいかもしれない。 - * - * # TaskManager が勝手に消すことなく、 - * # ユーザが SPE 上に持ち続けることができるため。 - * # もちろん管理はユーザに任せるわけだ。 - */ -void -SchedTask::ex_read_normal() -{ -} void SchedTask::exec() { __debug("[SchedTask:%s]\n", __FUNCTION__); -#if !defined(NO_PIPELINE) scheduler->dma_wait(DMA_READ); task_list[task->command].wait(scheduler,task->command); -#endif - task_list[task->command].run(this, readbuf, writebuf); - free(readbuf); - if (taskGroup->status() != 0) { - task->self = (int)taskGroup->command; - delete taskGroup; - taskGroup = NULL; - } - - // 書き込む領域がなければ無視 if (outListData->length > 0) { scheduler->dma_storeList(outListData, writebuf, DMA_WRITE); - -#if defined(NO_PIPELINE) - scheduler->dma_wait(DMA_WRITE); - free(writebuf); -#endif } - - (this->*ex_exec)(); } void @@ -239,187 +123,40 @@ { __debug("[SchedTask:%s]\n", __FUNCTION__); -#if !defined(NO_PIPELINE) scheduler->dma_wait(DMA_WRITE); free(writebuf); -#endif - if ((int)task->self == MY_SPE_NOP) return; - - (this->*ex_write)(); -} - - -/** - * SPE 内で生成されたタスクの ex_read() - */ -void -SchedTask::ex_read_renew() -{ - writebuf = scheduler->allocate(outListData->size); -} - -/** - * PPE 内で生成されたタスクの ex_exec() - */ -void -SchedTask::ex_exec_normal() -{ -} - -/** - * SPE 内で生成されたタスクの ex_exec() - */ -void -SchedTask::ex_exec_renew() -{ + scheduler->mail_write((int)task->self); } - -/** - * PPE 内で生成されたタスクの ex_write() - * - * このタスク内で新たにタスクが生成され、 - * 且つそのタスクの終了を待つ必要がある場合、 - * PPE に終了したことは知らせない(command は送信しない) - */ -void -SchedTask::ex_write_normal() -{ - /** - * このタスク内で新たにタスクが生成されなかった - * or 生成されたが、そのタスクの終了を待つ必要は無い - */ - if (renew_flag == 0) { - scheduler->mail_write((int)task->self); - } -} - -/** - * SPE 内で生成されたタスクの ex_write() - * - * A <- 親タスク - * | \ - * B C <- SPE 内で生成されたタスク - * - * A は SPE 内で B, C を生成したとする。 - * B と C が終了したら、A が PPE に送るはずだったコマンドが - * 子タスクに引き継がれているので、最後に実行された子タスクが - * PPE に mail 送信する。 - */ -void -SchedTask::ex_write_renew() -{ - uint32 cmd; - - taskGroup->remove(task); - cmd = taskGroup->status(); - - // タスク内で作られた全てのタスクが終了した - if (cmd != 0) { - delete taskGroup; - scheduler->mail_write(cmd); - } -} - SchedTaskBase* SchedTask::next(Scheduler *scheduler, SchedTaskBase *p) { __debug("[SchedTask:%s]\n", __FUNCTION__); - // delete p; move to Scheduler - - return (this->*ex_next)(); -} - -SchedTaskBase* -SchedTask::ex_next_normal() -{ if (cur_index < list->length) { - SchedTaskBase *nextSched; - - nextSched = scheduler->get_nextRenewTaskList(); + // Task List が残っているので、次を準備 - // RenewTask がある - if (nextSched) { - scheduler->set_backupTaskList(list); - scheduler->set_backupTaskListIndex(cur_index); - return nextSched; - } else { - TaskPtr nextTask = &list->tasks[cur_index++]; - nextSched = createSchedTask(scheduler, nextTask); - ((SchedTask*)nextSched)->init(list, nextTask, cur_index, - // scheduler->get_curReadBuf(), - // scheduler->get_curWriteBuf(), - scheduler); - return nextSched; - } + TaskPtr nextTask = &list->tasks[cur_index++]; + SchedTaskBase *nextSched = createSchedTask(scheduler, nextTask); + // この up cast は汚い... + ((SchedTask*)nextSched)->init(list, nextTask, cur_index, + scheduler); + return nextSched; } else { memaddr nextList = (memaddr)list->next; - if (nextList == 0) { + // もう何もする必要がない return new SchedNop2Ready(scheduler); } else { + // 新しいリストに取り掛かる return createSchedTaskList(nextList, scheduler, SCHED_TASKLIST_NORMAL); } } } -/** - * - */ -SchedTaskBase* -SchedTask::ex_next_renew() -{ - TaskPtr nextTask; - SchedTask *nextSched; - - if (cur_index < list->length) { - nextTask = &list->tasks[cur_index++]; - nextSched = createSchedTask(scheduler, nextTask); - - // RenewTaskList を実行中なので - nextSched->setRenew(); - nextSched->init(list, nextTask, cur_index, - // scheduler->get_curReadBuf(), - // scheduler->get_curWriteBuf(), - scheduler); - - /** - * この理由は SchedTask:~SchedTask() で - */ - list = NULL; - return nextSched; - } else { - SchedTaskBase *nextList; - - nextList = scheduler->get_nextRenewTaskList(); - - if (nextList) { - return nextList; - } else { - TaskListPtr nextList = scheduler->get_backupTaskList(); - - // 中断した TaskList がある - if (nextList) { - cur_index = scheduler->get_backupTaskListIndex(); - - nextTask = &nextList->tasks[cur_index++]; - nextSched = createSchedTask(scheduler, nextTask); - - nextSched->init(nextList, nextTask, cur_index, - // scheduler->get_curReadBuf(), - // scheduler->get_curWriteBuf(), - scheduler); - return nextSched; - } else { - return new SchedNop2Ready(scheduler); - } - } - } -} int SchedTask::get_cpuid() @@ -496,39 +233,6 @@ return task->param[index]; } -TaskPtr -SchedTask::create_task(int cmd) -{ - TaskListPtr taskList = scheduler->get_renewListBuf(); - TaskPtr p = &taskList->tasks[taskList->length++]; - p->command = cmd; - - // already allocated - // p->inData = (ListData*)scheduler->allocate(sizeof(ListData)); - // p->outData = (ListData*)scheduler->allocate(sizeof(ListData)); - - p->inData.clear(); - p->outData.clear(); - - p->self = (int)MY_SPE_NOP; - p->param_size = 0; - - return p; -} - -/** - * - * @param[in] waitTask タスク内で生成したタスクの登録(spawn()に相当) - */ -void -SchedTask::wait_task(TaskPtr waitTask) -{ - waitTask->self = (memaddr)taskGroup; - - scheduler->add_groupTask(taskGroup, waitTask); - - renew_flag++; -} void* SchedTask::global_alloc(int id, int size) { @@ -570,11 +274,6 @@ return scheduler->mainMem_get(id); } -void* -SchedTask::allocate(int size) { - return scheduler->allocate(size); -} - void SchedTask::dma_load(void *buf, uint32 addr, uint32 size, uint32 mask) { @@ -608,6 +307,42 @@ scheduler->wait_segment(s); } + +HTaskPtr SchedTask::create_task(int cmd) +{ + return scheduler->create_task(cmd); +} + +void SchedTask::set_task_depend(HTaskPtr master, HTaskPtr slave) +{ + scheduler->set_task_depend(master, slave); +} + +void SchedTask::spawn_task(HTaskPtr t) +{ + scheduler->spawn_task(t); +} + +void SchedTask::set_task_cpu(HTaskPtr t, CPU_TYPE cpu) +{ + scheduler->set_task_cpu(t, cpu); +} + +void* SchedTask::allocate(int size) +{ + return scheduler->allocate(size) ; +} + +void* SchedTask::allocate(int size,int align) +{ + return scheduler->allocate(size,align) ; +} + +Scheduler* SchedTask::get_scheduler() +{ + return scheduler; +} + /* system call */ int
--- a/TaskManager/kernel/schedule/SchedTask.h Sat Nov 14 21:17:02 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTask.h Sun Nov 15 02:02:30 2009 +0900 @@ -7,7 +7,7 @@ #include "Scheduler.h" #include "SchedTaskBase.h" #include "ListData.h" -#include "TaskGroup.h" +#include "HTask.h" #include "MemList.h" class SchedTask : public SchedTaskBase { @@ -44,25 +44,6 @@ // Task の、Tasklist での位置。(task = &list[cur_index-1]) int cur_index; - // タスク内で生成されたタスクのグループ - TaskGroup *taskGroup; - - // このタスク内で生成されたタスクの数 - int renew_flag; - - // このタスクが SPE 内で生成されたタスクか否か 1: Yes, 0: No - int flag_renewTask; - - // タスクがメインメモリ側で生成されたものか、 - // SPE で生成されたものかによって、データの扱いが変わってくる。 - // そのために if (flag_renewTask) を連発するのはよくないので - // 関数ポインタで持っておく - void (SchedTask::*ex_init)(); - void (SchedTask::*ex_read)(); - void (SchedTask::*ex_exec)(); - void (SchedTask::*ex_write)(); - SchedTaskBase* (SchedTask::*ex_next)(); - /* functions */ // override @@ -76,30 +57,10 @@ //--- System API --- SchedTask* get_nextTask(TaskListPtr list); - /** - * PPE で生成されたタスクに対する - * init, read,exec,write,next の付属(?)処理 - */ - void ex_init_normal(); - void ex_read_normal(); - void ex_exec_normal(); - void ex_write_normal(); - SchedTaskBase* ex_next_normal(); - - /** - * SPE で生成されたタスクに対する - * inti, ead,exec,write,next の付属(?)処理 - */ - void ex_init_renew(); - void ex_read_renew(); - void ex_exec_renew(); - void ex_write_renew(); - SchedTaskBase* ex_next_renew(); public: /* functions */ - void setRenew(); void init(TaskListPtr _list, TaskPtr _task, int index, // ListDataPtr rbuf, ListDataPtr wbuf, Scheduler* sc); @@ -117,8 +78,6 @@ int get_param(int index); - TaskPtr create_task(int cmd); - void wait_task(TaskPtr waitTask); void* global_alloc(int id, int size); void* global_get(int id); @@ -160,6 +119,14 @@ return get_output(writebuf, index); } + // user + HTaskPtr create_task(int cmd); + void set_task_depend(HTaskPtr master, HTaskPtr slave); + void spawn_task(HTaskPtr); + void set_task_cpu(HTaskPtr, CPU_TYPE); + void* allocate(int size,int align); + Scheduler* get_scheduler(); + /* system call */ FILE *stdout_;
--- a/TaskManager/kernel/schedule/SchedTaskList.cc Sat Nov 14 21:17:02 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTaskList.cc Sun Nov 15 02:02:30 2009 +0900 @@ -54,10 +54,7 @@ __debug("[SchedTaskList:%s]\n", __FUNCTION__); - // delete p; - scheduler->dma_wait(DMA_READ_TASKLIST); - if (list->length < 1) { nextSched = new SchedNop2Ready(scheduler); @@ -68,14 +65,7 @@ } else { TaskPtr nextTask = &list->tasks[0]; nextSched = createSchedTask(scheduler, nextTask); - - if (flag_renewTaskList == SCHED_TASKLIST_RENEW) { - ((SchedTask*)nextSched)->setRenew(); - } - ((SchedTask*)nextSched)->init(list, nextTask, 1, - // scheduler->get_curReadBuf(), - // scheduler->get_curWriteBuf(), scheduler); }
--- a/TaskManager/kernel/schedule/SchedTaskManager.cc Sat Nov 14 21:17:02 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,49 +0,0 @@ - -#include "TaskManagerImpl.h" -#include "SchedTaskManager.h" - -SchedTaskManager::SchedTaskManager(TaskManagerImpl *m_) -{ - m = m_; -} - -SchedTaskManager::~SchedTaskManager() -{ -} - -HTaskPtr SchedTaskManager::create_task(int cmd) -{ - return m->create_task(cmd); -} - -void SchedTaskManager::set_task_depend(HTaskPtr master, HTaskPtr slave) -{ - m->set_task_depend(master, slave); -} - -void SchedTaskManager::spawn_task(HTaskPtr t) -{ - m->spawn_task(t); -} - -void SchedTaskManager::set_task_cpu(HTaskPtr t, CPU_TYPE cpu) -{ - m->set_task_cpu(t, cpu); -} - -void* SchedTaskManager::allocate(int size) -{ - return m->allocate(size) ; -} - -void* SchedTaskManager::allocate(int size,int align) -{ - return m->allocate(size,align) ; -} - -Scheduler* SchedTaskManager::get_scheduler() -{ - return m->get_scheduler() ; -} - -/* end */
--- a/TaskManager/kernel/schedule/SchedTaskManager.h Sat Nov 14 21:17:02 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -#ifndef INCLUDED_SCHED_TASK_MANAGER -#define INCLUDED_SCHED_TASK_MANAGER - -#include <stdio.h> -#include <stdlib.h> -#include "base.h" -#include "SchedTask.h" -#include "TaskManagerImpl.h" - -class SchedTaskManager : public SchedTask { -public: - /* constructor */ - SchedTaskManager(TaskManagerImpl *m); - - virtual ~SchedTaskManager(); - - BASE_NEW_DELETE(SchedTask); - - /* variables */ - - // Task を実行するスケジューラ自身 - TaskManagerImpl *m; - -public: - /* functions */ - - // user - HTaskPtr create_task(int cmd); - void set_task_depend(HTaskPtr master, HTaskPtr slave); - void spawn_task(HTaskPtr); - void set_task_cpu(HTaskPtr, CPU_TYPE); - void* allocate(int size); - void* allocate(int size,int align); - Scheduler* get_scheduler(); -}; -#endif
--- a/TaskManager/kernel/schedule/Scheduler.cc Sat Nov 14 21:17:02 2009 +0900 +++ b/TaskManager/kernel/schedule/Scheduler.cc Sun Nov 15 02:02:30 2009 +0900 @@ -28,14 +28,9 @@ for (int i = 0; i < 2; i++) { buff_taskList[i] = (TaskListPtr)allocate(sizeof(TaskList)); - // buff_inListData[i] = (ListDataPtr)allocate(sizeof(ListData)); - // buff_outListData[i] = (ListDataPtr)allocate(sizeof(ListData)); } buffFlag_taskList = 0; - // buffFlag_inListData = 0; - // buffFlag_outListData = 0; - flag_renewTaskList = 0; // bzero でもいいけど for (int i = 0; i < MAX_GLOBAL_AREA; i++) { @@ -47,10 +42,6 @@ } - taskGroup = new TaskGroup; - renewTop_taskList = NULL; - renewCur_taskList = NULL; - bak_curTaskList = NULL; } void @@ -83,10 +74,6 @@ { free(buff_taskList[0]); free(buff_taskList[1]); - // free(buff_inListData[0]); - // free(buff_inListData[1]); - // free(buff_outListData[0]); - // free(buff_outListData[1]); } /** @@ -102,115 +89,6 @@ } -/** - * Task に inListData, outListData を入れたので、 - * これは必要ないらしい。 - * - * あらかじめ memory allocte してある ListData の領域を - * パイプラインの各処理が交代して使う。 - */ -#if 0 -ListDataPtr -Scheduler::get_curWriteBuf() -{ - buffFlag_outListData ^= 1; - return buff_outListData[buffFlag_outListData]; -} - - -ListDataPtr -Scheduler::get_curReadBuf() -{ - buffFlag_inListData ^= 1; - return buff_inListData[buffFlag_inListData]; -} -#endif - -/** - * タスク内で生成されたタスクを格納する TaskList を取得する - * 現在格納に使っている TaskList (renewCur_taskList) が使えるならそれを返す - * もしそうでないなら、新しく TaskList を allocate してそれを返す - * コード中で renewCur_taskList が NULL になるのは - * - プログラム開始時 - * - タスク内生成タスクがある TaskList の実行を新しく始める (Nop2Ready 参照) - * 以上の場合です - */ -TaskListPtr -Scheduler::get_renewListBuf() -{ - if (renewCur_taskList && renewCur_taskList->length < TASK_MAX_SIZE) { - return renewCur_taskList; - } else { - TaskListPtr newList = (TaskListPtr)allocate(sizeof(TaskList)); - newList->length = 0; - newList->next = NULL; - renewTop_taskList = TaskList::append(renewTop_taskList, newList); - renewCur_taskList = newList; - return newList; - } -} - -/** - * 次に実行する Renew Task List を返す - * - * @param[in] curList 現在実行中の TaskList - * 中断して RenewTaskList を行うため - * バックアップを取っておく - * @return next RenewTaskList - */ -SchedTaskList* -Scheduler::get_nextRenewTaskList() -{ - if (renewTop_taskList) { - TaskListPtr list = renewTop_taskList; - renewTop_taskList = renewTop_taskList->next; - renewCur_taskList = NULL; - - list->next = NULL; - SchedTaskList *sched - = createSchedTaskList((memaddr)list, this, SCHED_TASKLIST_RENEW); - return sched; - } else { - return NULL; - } -} - -void -Scheduler::set_backupTaskList(TaskListPtr cur_taskList) -{ - bak_curTaskList = cur_taskList; -} - -void -Scheduler::set_backupTaskListIndex(int cur_index) -{ - bakIndex_taskList = cur_index; -} - -/** - * RenewTaskList 実行前に中断した TaskList を返す - * NULL の場合、中断した TaskList は無い。 - * - * @return TaskList - */ -TaskListPtr -Scheduler::get_backupTaskList() -{ - TaskListPtr ret = bak_curTaskList; - - bak_curTaskList = NULL; - return ret; -} - -int -Scheduler::get_backupTaskListIndex() -{ - int ret = bakIndex_taskList; - - bakIndex_taskList = 0; - return ret; -} - void Scheduler::dma_load(void *buf, uint32 addr, uint32 size, uint32 mask) { @@ -254,40 +132,6 @@ return connector->mail_read(); } -TaskGroupPtr -Scheduler::set_groupTask(uint32 command) -{ - TaskGroupPtr ret = taskGroup; - - reload_groupTask(); - - ret->command = command; - return ret; -} - -void -Scheduler::add_groupTask(TaskGroupPtr group, TaskPtr task) -{ - group->add(task); -} - -void -Scheduler::remove_groupTask(TaskGroupPtr group, TaskPtr task) -{ - group->remove(task); -} - -void -Scheduler::reload_groupTask() -{ - taskGroup = new TaskGroup; -} - -uint32 -Scheduler::status_groupTask(TaskGroupPtr group) -{ - return group->status(); -} /* ここから下は、memory 以下にあるべき
--- a/TaskManager/kernel/schedule/Scheduler.h Sat Nov 14 21:17:02 2009 +0900 +++ b/TaskManager/kernel/schedule/Scheduler.h Sun Nov 15 02:02:30 2009 +0900 @@ -1,15 +1,17 @@ #ifndef INCLUDED_SCHEDULER #define INCLUDED_SCHEDULER +#include "stdlib.h" #include "base.h" #include "TaskList.h" #include "ListData.h" #include "DmaManager.h" #include "SchedTaskBase.h" #include "SchedTaskList.h" -#include "TaskGroup.h" #include "MemList.h" #include "MemHash.h" +#include "TaskManagerImpl.h" + #define MAX_USER_TASK 32 #define MAX_SYSTEM_TASK 2 @@ -20,6 +22,7 @@ class SchedTaskBase; class SchedTask; class SchedTaskList; +class TaskManager; typedef int (*TaskObjectRun)(SchedTask* smanager, void* r, void *w); @@ -35,54 +38,8 @@ // double buffering TaskListPtr buff_taskList[2]; - // ListDataPtr buff_inListData[2]; - // ListDataPtr buff_outListData[2]; int buffFlag_taskList; - // int buffFlag_inListData; - // int buffFlag_outListData; - - /* TaskList 関連 */ - - /** - * 実行中 TaskList の現在の位置 (list->tasks[index]) - * - * bakIndex_taskList がある理由 - * taskList の途中で renew task が作られたとき、 - * 即座に実行するため、TaskList -> RenewTaskList と移って処理する。 - * RenewTaskList が終了したとき、再び TaskList に戻ってくるが - * Renew Task を生成した所から再スタートするため、 - * taskList の index を覚えておく (backup) - * 同様に TaskList も覚えておく - */ - int bakIndex_taskList; - TaskListPtr bak_curTaskList; - - - /** - * タスク内で生成されたタスクを入れる - * Linked List で管理 - */ - TaskListPtr renewCur_taskList; - TaskListPtr renewTop_taskList; - - /** - * 実行中 TaskList が Renew されたものかどうかのフラグ - * Renew の場合、ListData は DMA する必要ないとか - * いろいろな判定に使えるかもしれん - * if (flag == 1) taskList is Renew - */ - int flag_renewTaskList; - - /** - * タスク内 (T1) でタスク (Tc = T2, T3, ..) が複数生成された場合、 - * Tc が全て終わってから、T1 の終了コマンドを PPE に送る。 - * なので、Tc を process group として記憶しておく。 - * - * Tc が taskGroup のアドレスを持つので - * Scheduler が持つ taskGroup 変数は一つだけで(多分)おk - */ - TaskGroupPtr taskGroup; /* GlobalMemoryList */ void* globalList[MAX_GLOBAL_AREA]; @@ -108,6 +65,7 @@ } TaskObject, *TaskObjectPtr; DmaManager* connector; + TaskManagerImpl* manager; // Pipeline Stage SchedTaskBase* task1; @@ -121,8 +79,6 @@ void finish(); TaskListPtr get_curListBuf(); - // ListDataPtr get_curReadBuf(); - // ListDataPtr get_curWriteBuf(); TaskListPtr get_renewListBuf(); void set_backupTaskList(TaskListPtr cur_taskList); @@ -131,13 +87,6 @@ TaskListPtr get_backupTaskList(); int get_backupTaskListIndex(); - // なんか名前が変だが。。。 - /* TaskGroup */ - TaskGroupPtr set_groupTask(uint32 command); - void add_groupTask(TaskGroupPtr group, TaskPtr task); - void remove_groupTask(TaskGroupPtr group, TaskPtr task); - void reload_groupTask(); - uint32 status_groupTask(TaskGroupPtr group); /* GlobalMemory */ void* global_alloc(int id, int size); @@ -170,6 +119,23 @@ uint32 mail_read(); void dma_loadList(ListDataPtr list, void *, uint32 mask); void dma_storeList(ListDataPtr list, void *, uint32 mask); + + /* manager */ + + void set_manager(TaskManagerImpl *m) { manager = m; } + + // user + HTaskPtr create_task(int cmd) { return manager->create_task(cmd); } + void set_task_depend(HTaskPtr master, HTaskPtr slave) { + manager->set_task_depend(master, slave) ; + } + void spawn_task(HTaskPtr t) { manager->spawn_task(t); } + void set_task_cpu(HTaskPtr t, CPU_TYPE cpu) { manager->set_task_cpu(t,cpu); } + void* allocate(int size,int align) { return manager->allocate(size,align); } + int get_random() { return random(); } + Scheduler *get_scheduler() { return this; } + + }; extern void register_task(int cmd, TaskObjectRun run);
--- a/example/HelloWorld/Makefile.def Sat Nov 14 21:17:02 2009 +0900 +++ b/example/HelloWorld/Makefile.def Sun Nov 15 02:02:30 2009 +0900 @@ -1,13 +1,13 @@ TARGET = hello # include/library path -# ex: macosx +# ex macosx #CERIUM = /Users/gongo/Source/Cerium -# ex: linux/ps3 +# ex linux/ps3 CERIUM = ../../../Cerium -CC = g++ +CC = g++ -m32 CFLAGS = -g -Wall -O9 INCLUDE = -I${CERIUM}/include/TaskManager -I. -I..
--- a/example/MemList/Makefile.macosx Sat Nov 14 21:17:02 2009 +0900 +++ b/example/MemList/Makefile.macosx Sun Nov 15 02:02:30 2009 +0900 @@ -1,5 +1,6 @@ include ./Makefile.def +CC += -m32 SRCS_TMP = $(wildcard *.cc) SRCS_EXCLUDE = SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
--- a/example/MemList/main.cc Sat Nov 14 21:17:02 2009 +0900 +++ b/example/MemList/main.cc Sun Nov 15 02:02:30 2009 +0900 @@ -37,8 +37,8 @@ uint32 size = 128; uint32 count = 64; - MemList* active = manager->get_scheduler()->createMemList(size, 0); - MemList* freelist = manager->get_scheduler()->createMemList(size, count); + MemList* active = manager->createMemList(size, 0); + MemList* freelist = manager->createMemList(size, count); // 配列! uint32 i = 0; @@ -59,3 +59,5 @@ return 0; } + +/* end */
--- a/example/basic/Makefile.macosx Sat Nov 14 21:17:02 2009 +0900 +++ b/example/basic/Makefile.macosx Sun Nov 15 02:02:30 2009 +0900 @@ -12,6 +12,7 @@ TASK_OBJS = $(TASK_SRCS:.cc=.o) LIBS += -lFifoManager `sdl-config --libs` +CC += -m32 .SUFFIXES: .cc .o
--- a/example/basic/main.cc Sat Nov 14 21:17:02 2009 +0900 +++ b/example/basic/main.cc Sun Nov 15 02:02:30 2009 +0900 @@ -28,7 +28,7 @@ * タスク終了後の data1, data2 の確認 */ void -twice_result(void *a) +twice_result(SchedTask *s, void *a, void *b) { int* data = (int*)a; print_data(data, length, "after"); @@ -90,7 +90,7 @@ /* * set_post() で ppe task を渡せるようにしたい */ - twice->set_post(twice_result, (void*)data); + twice->set_post(twice_result, (void*)data, 0); // add Active Queue twice->spawn();
--- a/example/cube/CubeSceneGraph.cpp Sat Nov 14 21:17:02 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -#include "CubeSceneGraph.h" - -CubeSceneGraph::CubeSceneGraph(char *xml) -{ - SceneGraph::SceneGraph(xml); - task = new CubeTask(); -} - -void -CubeSceneGraph::update(CubeSceneGraph *old) -{ - task->update(old->data_pack, data_pack); -}
--- a/example/cube/CubeSceneGraph.h Sat Nov 14 21:17:02 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -#include "SceneGraph.h" -#include "CubeTask.h" - -class CubeSceneGraph : SceneGraph { -public: - CubeTask* task; - CubeSceneGraph(char *xml); -};
--- a/example/cube/CubeTask.cpp Sat Nov 14 21:17:02 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -void -CubeTask::update(CubeDataPack *input, CubeDataPack *output) -{ - output->angle[0] = input->angle[0] + 1; -}
--- a/example/cube/CubeTask.h Sat Nov 14 21:17:02 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +0,0 @@ -class CubeTask : Task { - void update(CubeDataPack *input, CubeDataPack *output); - -};
--- a/example/cube/RenderingEngine.cpp Sat Nov 14 21:17:02 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,101 +0,0 @@ -void -RenderingEngine::init(int width, int height, int bpp) -{ -} - -TaskDepend -RenderingEngine::update_all(SceneGraph* next, SceneGraph* now, TaskDepend wait) -{ - SceneGraph *t, *nt; - t = now; - nt = next; - - //glPushMatrix(); - int s=0; - while(t) - { - //t->draw(stack); - t->update(t->data_pack, nt->data_pack); - if(t->child != NULL) - { - stack[s++] = t->matrix; //push - t = t->child; - } - else if(t->brother != NULL) - { - stack[--s] = NULL; //pop - stack[s++] = t->matrix; //push - t = t->brother; - } - else - { - while(t) - { - if(t->brother != NULL) - { - stack[--s] = NULL; //pop - stack[s++] = t->matrix; //push - t = t->brother; - break; - } - else - { - t = t->parent; - if(t) - { - stack[--s] = NULL; //pop - } - } - } - } - } - //glPopMatrix(); -} - -TaskDepend -RenderingEngin::draw_all(SceneGraph* now, TaskDepend wait) -{ - Polygon *t; - - t = this; - - //glPushMatrix(); - int s=0; - while(t) - { - t->draw(stack); - if(t->child != NULL) - { - stack[s++] = t->matrix; //push - t = t->child; - } - else if(t->brother != NULL) - { - stack[--s] = NULL; //pop - stack[s++] = t->matrix; //push - t = t->brother; - } - else - { - while(t) - { - if(t->brother != NULL) - { - stack[--s] = NULL; //pop - stack[s++] = t->matrix; //push - t = t->brother; - break; - } - else - { - t = t->parent; - if(t) - { - stack[--s] = NULL; //pop - } - } - } - } - } - //glPopMatrix(); -}
--- a/example/cube/RenderingEngine.h Sat Nov 14 21:17:02 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -class RenderingEngine { -public: - RenderingEngine(); - - void init(int width, int height, int bpp); -};
--- a/example/cube/main.cpp Sat Nov 14 21:17:02 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -int -main() -{ - CubeSceneGraph scg[2]; - TaskID wait = 0; - TaskID wait2 = 0; - int phase = 0; - - scg[0] = new CubeSceneGraph("cube.xml"); - scg[1] = scg[0]->copy(); - - // OPENGL, SHARED, DATAPACK, CELL - RenderingEngine *engine = RenderingEngineFactory(OPENGL); - engine->init(width, height, bpp); - - while (1) { - wait = engine->update_all(scg[1-phase], scg[phase], wait); - //scg[1-phase]->update_all(scg[phase]); - wait2 = engine->draw_all(scg[phase], wait2); - //scg[phase]->draw_all(engine); - phase ^= 1; - } -}
--- a/example/dependency_task/Makefile.macosx Sat Nov 14 21:17:02 2009 +0900 +++ b/example/dependency_task/Makefile.macosx Sun Nov 15 02:02:30 2009 +0900 @@ -1,5 +1,7 @@ include ./Makefile.def +CC += -m32 + SRCS_TMP = $(wildcard *.cc) SRCS_EXCLUDE = # ե SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
--- a/example/get_segment/Makefile.macosx Sat Nov 14 21:17:02 2009 +0900 +++ b/example/get_segment/Makefile.macosx Sun Nov 15 02:02:30 2009 +0900 @@ -1,5 +1,7 @@ include ./Makefile.def +CC += -m32 + SRCS_TMP = $(wildcard *.cc) SRCS_EXCLUDE = # ե SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
--- a/example/mainMem/Makefile.macosx Sat Nov 14 21:17:02 2009 +0900 +++ b/example/mainMem/Makefile.macosx Sun Nov 15 02:02:30 2009 +0900 @@ -1,5 +1,7 @@ include ./Makefile.def +CC += -m32 + SRCS_TMP = $(wildcard *.cc) SRCS_EXCLUDE = # ե SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
--- a/example/many_task/Makefile.macosx Sat Nov 14 21:17:02 2009 +0900 +++ b/example/many_task/Makefile.macosx Sun Nov 15 02:02:30 2009 +0900 @@ -1,5 +1,6 @@ include ./Makefile.def + SRCS_TMP = $(wildcard *.cc) SRCS_EXCLUDE = # ե SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) @@ -12,6 +13,7 @@ TASK_OBJS = $(TASK_SRCS:.cc=.o) CC = g++ +CC += -m32 CFLAGS = -g -Wall# -O9 #-DDEBUG INCLUDE = -I${CERIUM}/include/TaskManager -I. -I..
--- a/example/post_function/Makefile.macosx Sat Nov 14 21:17:02 2009 +0900 +++ b/example/post_function/Makefile.macosx Sun Nov 15 02:02:30 2009 +0900 @@ -12,6 +12,7 @@ TASK_OBJS = $(TASK_SRCS:.cc=.o) LIBS += -lFifoManager `sdl-config --libs` +CC += -m32 .SUFFIXES: .cc .o
--- a/example/post_function/main.cc Sat Nov 14 21:17:02 2009 +0900 +++ b/example/post_function/main.cc Sun Nov 15 02:02:30 2009 +0900 @@ -14,7 +14,7 @@ -count Number of print \"Hello, World!!\""; void -func1(void *p) +func1(SchedTask *m, void *p, void *q) { int i = (int)p; @@ -23,7 +23,7 @@ if (i > 0) { HTaskPtr next = manager->create_task(HELLO_TASK); next->add_param(i); - next->set_post(func1, (void*)i); + next->set_post(func1, (void*)i, 0); next->set_cpu(SPE_ANY); next->spawn(); } @@ -49,7 +49,7 @@ task = manager->create_task(HELLO_TASK); task->add_param(count); - task->set_post(func1, (void*)count); + task->set_post(func1, (void*)count, 0); task->set_cpu(SPE_ANY); task->spawn(); }
--- a/example/renew_task/Makefile.macosx Sat Nov 14 21:17:02 2009 +0900 +++ b/example/renew_task/Makefile.macosx Sun Nov 15 02:02:30 2009 +0900 @@ -12,6 +12,7 @@ TASK_OBJS = $(TASK_SRCS:.cc=.o) LIBS += -lFifoManager `sdl-config --libs` +CC += -m32 .SUFFIXES: .cc .o
--- a/example/renew_task/README Sat Nov 14 21:17:02 2009 +0900 +++ b/example/renew_task/README Sun Nov 15 02:02:30 2009 +0900 @@ -9,10 +9,10 @@ ------------------------------------- -RenewTask +Task ------------------------------------- - TaskPtr create_task(int TASK_ID); + HTaskPtr create_task(int TASK_ID); PPE ǻȤ @@ -27,10 +27,11 @@ smanager->create_task, smanager->add_inData, Ȥ褦ˡsmanager ƤӽФƤ -ϡPPE Ǥ TaskManager ƱǤ STaskManager äƷǤ -ʤsmanager->spawn() ȤΤϤޤΤޤ¹Ԥޤ +ϡPPE Ǥ TaskManager ƱǤ + SPU ϻȤޤ... + ------------------------------------- RenewTask Ԥ ------------------------------------- @@ -44,10 +45,8 @@ ˤäƤϡTaskB λޤԤäơ TaskA λ ΤȻפޤȤ - TaskPtr taskB = smanager->create_task(TASK_B); - smanager->wait_task(taskB); - -ȤƤPPE Ǥ wait_for Ȱ㤤ʣϤǤޤ + HTaskPtr taskB = smanager->create_task(TASK_B); + taskB->spawn(); ------------------------------------- @@ -119,4 +118,4 @@ [SPE] ** finish Renew4 -¬ñ̤ msec Ǥ \ No newline at end of file +¬ñ̤ msec Ǥ
--- a/example/renew_task/main.cc Sat Nov 14 21:17:02 2009 +0900 +++ b/example/renew_task/main.cc Sun Nov 15 02:02:30 2009 +0900 @@ -2,6 +2,7 @@ #include <stdlib.h> #include <string.h> #include "TaskManager.h" +#include "SchedTask.h" #include "Func.h" extern void task_init(); @@ -14,13 +15,13 @@ static int task_count = 1; static void -renewRepeat(SchedTask *s, void *arg, void *d) +renewRepeat1(SchedTask *s, void *arg, void *d) { TaskManager *manager = (TaskManager *)arg; if (count-->0) { HTask *repeat = manager->create_task(RENEW_REPEAT); - repeat->set_post(renewRepeat, (void*)manager, 0); + repeat->set_post(renewRepeat1, (void*)manager, 0); repeat->spawn(); HTask *renew; @@ -69,7 +70,7 @@ printf("[PPE] Create Task : RenewRepeat\n\n"); repeat = manager->create_task(RENEW_REPEAT); - repeat->set_post(renewRepeat, (void*)manager, 0); + repeat->set_post(renewRepeat1, (void*)manager, 0); // add Active Queue repeat->spawn();
--- a/example/renew_task/ppe/Renew1.cc Sat Nov 14 21:17:02 2009 +0900 +++ b/example/renew_task/ppe/Renew1.cc Sun Nov 15 02:02:30 2009 +0900 @@ -11,8 +11,9 @@ s->printf("[PPE] ** running Renew1\n"); s->printf("[PPE] Create Task : Renew2\n"); - TaskPtr nextTask = s->create_task(RENEW2); - s->wait_task(nextTask); + HTaskPtr nextTask = s->create_task(RENEW2); + // s->wait_task(nextTask); + nextTask->spawn(); s->printf("[PPE] ** finish Renew1\n"); s->printf("\n");
--- a/example/renew_task/ppe/Renew1.h Sat Nov 14 21:17:02 2009 +0900 +++ b/example/renew_task/ppe/Renew1.h Sun Nov 15 02:02:30 2009 +0900 @@ -1,9 +1,6 @@ #ifndef INCLUDED_TASK_RENEW1 #define INCLUDED_TASK_RENEW1 -#ifndef INCLUDED_SCHED_TASK -# include "SchedTask.h" -#endif - +#include "SchedTask.h" #endif
--- a/example/renew_task/ppe/Renew2.cc Sat Nov 14 21:17:02 2009 +0900 +++ b/example/renew_task/ppe/Renew2.cc Sun Nov 15 02:02:30 2009 +0900 @@ -11,8 +11,9 @@ s->printf("[PPE] ** running Renew2\n"); s->printf("[PPE] Create Task : Renew3\n"); - TaskPtr nextTask = s->create_task(RENEW3); - s->wait_task(nextTask); + HTaskPtr nextTask = s->create_task(RENEW3); + nextTask->spawn(); + // s->wait_task(nextTask); s->printf("[PPE] ** finish Renew2\n"); s->printf("\n");
--- a/example/renew_task/ppe/Renew2.h Sat Nov 14 21:17:02 2009 +0900 +++ b/example/renew_task/ppe/Renew2.h Sun Nov 15 02:02:30 2009 +0900 @@ -1,9 +1,7 @@ #ifndef INCLUDED_TASK_RENEW2 #define INCLUDED_TASK_RENEW2 -#ifndef INCLUDED_SCHED_TASK # include "SchedTask.h" -#endif #endif
--- a/example/renew_task/ppe/Renew3.cc Sat Nov 14 21:17:02 2009 +0900 +++ b/example/renew_task/ppe/Renew3.cc Sun Nov 15 02:02:30 2009 +0900 @@ -11,8 +11,9 @@ s->printf("[PPE] ** running Renew3\n"); s->printf("[PPE] Create Task : Renew4\n"); - TaskPtr nextTask = s->create_task(RENEW4); - s->wait_task(nextTask); + HTaskPtr nextTask = s->create_task(RENEW4); + // s->wait_task(nextTask); + nextTask->spawn(); s->printf("[PPE] ** finish Renew3\n"); s->printf("\n");
--- a/example/renew_task/ppe/RenewStart.cc Sat Nov 14 21:17:02 2009 +0900 +++ b/example/renew_task/ppe/RenewStart.cc Sun Nov 15 02:02:30 2009 +0900 @@ -15,8 +15,9 @@ s->printf("[PPE] ** running RenewStart %d\n", id); s->printf("[PPE] Create Task : Renew1\n"); - TaskPtr nextTask = s->create_task(RENEW1); - s->wait_task(nextTask); + HTaskPtr nextTask = s->create_task(RENEW1); + nextTask->spawn(); + // s->wait_task(nextTask); s->printf("[PPE] ** finish RenewStart\n"); s->printf("\n");
--- a/example/scenegraph/xml/Makefile Sat Nov 14 21:17:02 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -default: macosx - -macosx: FORCE - @echo "Make for Mac OS X" - @$(MAKE) -f Makefile.macosx - -linux: FORCE - @echo "Make for Linux" - @$(MAKE) -f Makefile.linux - -cell: FORCE - @echo "Make for PS3 (Cell)" - @$(MAKE) -f Makefile.cell - -FORCE: - -clean: - @$(MAKE) -f Makefile.macosx clean - @$(MAKE) -f Makefile.linux clean - @$(MAKE) -f Makefile.cell clean \ No newline at end of file
--- a/example/scenegraph/xml/Makefile.cell Sat Nov 14 21:17:02 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,42 +0,0 @@ -include ./Makefile.def - -SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե -SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) -OBJS = $(SRCS:.cc=.o) - -TASK_DIR = ppe -TASK_SRCS_TMP = $(wildcard $(TASK_DIR)/*.cc) -TASK_SRCS_EXCLUDE = -TASK_SRCS = $(filter-out $(TASK_DIR)/$(TASK_SRCS_EXCLUDE),$(TASK_SRCS_TMP)) -TASK_OBJS = $(TASK_SRCS:.cc=.o) - -LIBS += -lCellManager -lspe2 -lpthread -Wl,--gc-sections - -.SUFFIXES: .cc .o - -.cc.o: - $(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@ - -all: $(TARGET) speobject - -$(TARGET): $(OBJS) $(TASK_OBJS) - $(CC) -o $@ $(OBJS) $(TASK_OBJS) $(LIBS) - -speobject: - cd spe; $(MAKE) - -run: - ./$(TARGET) -cpu 6 - -link: - $(CC) -o $(TARGET) $(OBJS) $(TASK_OBJS) $(LIBS) - -debug: $(TARGET) - sudo ppu-gdb ./$(TARGET) - -clean: - rm -f $(TARGET) $(OBJS) $(TASK_OBJS) - rm -f *~ \#* - rm -f ppe/*~ ppe/\#* - cd spe; $(MAKE) clean
--- a/example/scenegraph/xml/Makefile.def Sat Nov 14 21:17:02 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -TARGET = test_xml - -# include/library path -# ex: macosx - -# ex: linux/ps3 -CERIUM = ../../../../Cerium - -CC = g++ -CFLAGS = -g -Wall -O9 - -INCLUDE = -I${CERIUM}/include/TaskManager -I. -I.. -LIBS = -L${CERIUM}/TaskManager
--- a/example/scenegraph/xml/Makefile.linux Sat Nov 14 21:17:02 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -include ./Makefile.def - -SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե -SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) -OBJS = $(SRCS:.cc=.o) - -TASK_DIR = ppe -TASK_SRCS_TMP = $(wildcard $(TASK_DIR)/*.cc) -TASK_SRCS_EXCLUDE = -TASK_SRCS = $(filter-out $(TASK_DIR)/$(TASK_SRCS_EXCLUDE),$(TASK_SRCS_TMP)) -TASK_OBJS = $(TASK_SRCS:.cc=.o) - -LIBS += -lFifoManager - -.SUFFIXES: .cc .o - -.cc.o: - $(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@ - -all: $(TARGET) - -$(TARGET): $(OBJS) $(TASK_OBJS) - $(CC) -o $@ $(OBJS) $(TASK_OBJS) $(LIBS) - -link: - $(CC) -o $(TARGET) $(OBJS) $(TASK_OBJS) $(LIBS) - -debug: $(TARGET) - sudo gdb ./$(TARGET) - -clean: - rm -f $(TARGET) $(OBJS) $(TASK_OBJS) - rm -f *~ \#* - rm -f ppe/*~ ppe/\#* - rm -f spe/*~ spe/\#*
--- a/example/scenegraph/xml/Makefile.macosx Sat Nov 14 21:17:02 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -include ./Makefile.def - -SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե -SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) -OBJS = $(SRCS:.cc=.o) - -TASK_DIR = ppe -TASK_SRCS_TMP = $(wildcard $(TASK_DIR)/*.cc) -TASK_SRCS_EXCLUDE = -TASK_SRCS = $(filter-out $(TASK_DIR)/$(TASK_SRCS_EXCLUDE),$(TASK_SRCS_TMP)) -TASK_OBJS = $(TASK_SRCS:.cc=.o) - -LIBS += -lFifoManager `sdl-config --libs` - -.SUFFIXES: .cc .o - -.cc.o: - $(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@ - -all: $(TARGET) - -$(TARGET): $(OBJS) $(TASK_OBJS) - $(CC) -o $@ $(OBJS) $(TASK_OBJS) $(LIBS) - -link: - $(CC) -o $(TARGET) $(OBJS) $(TASK_OBJS) $(LIBS) - -debug: $(TARGET) - sudo gdb ./$(TARGET) - -clean: - rm -f $(TARGET) $(OBJS) $(TASK_OBJS) - rm -f *~ \#* - rm -f ppe/*~ ppe/\#* - rm -f spe/*~ spe/\#*
--- a/example/scenegraph/xml/sg/sg-test.h Sat Nov 14 21:17:02 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2 +0,0 @@ -#define Cube scene_graph -#define Cube_1 scene_graph->next
--- a/example/scenegraph/xml/sg/sg-test.xml Sat Nov 14 21:17:02 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,606 +0,0 @@ -<?xml version="1.0"?> -<OBJECT-3D> - <surface name="Cube" size="36" prim="Triangle" parent="NULL"> - <coordinate> - 1.251144 0.119058 -0.025325 - 1.251144 -1.880942 -0.025325 - -0.748856 -1.880942 -0.025325 - -0.748856 -1.880942 -0.025325 - -0.748855 0.119058 -0.025325 - 1.251144 0.119058 -0.025325 - 1.251145 0.119057 1.974675 - -0.748856 0.119058 1.974675 - -0.748856 -1.880942 1.974675 - -0.748856 -1.880942 1.974675 - 1.251144 -1.880943 1.974675 - 1.251145 0.119057 1.974675 - 1.251144 0.119058 -0.025325 - 1.251145 0.119057 1.974675 - 1.251144 -1.880943 1.974675 - 1.251144 -1.880943 1.974675 - 1.251144 -1.880942 -0.025325 - 1.251144 0.119058 -0.025325 - 1.251144 -1.880942 -0.025325 - 1.251144 -1.880943 1.974675 - -0.748856 -1.880942 1.974675 - -0.748856 -1.880942 1.974675 - -0.748856 -1.880942 -0.025325 - 1.251144 -1.880942 -0.025325 - -0.748856 -1.880942 -0.025325 - -0.748856 -1.880942 1.974675 - -0.748856 0.119058 1.974675 - -0.748856 0.119058 1.974675 - -0.748855 0.119058 -0.025325 - -0.748856 -1.880942 -0.025325 - 1.251145 0.119057 1.974675 - 1.251144 0.119058 -0.025325 - -0.748855 0.119058 -0.025325 - -0.748855 0.119058 -0.025325 - -0.748856 0.119058 1.974675 - 1.251145 0.119057 1.974675 - </coordinate> - <normal> - 0.000000 0.000000 -1.000000 - 0.000000 0.000000 -1.000000 - 0.000000 0.000000 -1.000000 - 0.000000 0.000000 -1.000000 - 0.000000 0.000000 -1.000000 - 0.000000 0.000000 -1.000000 - 0.000000 -0.000000 1.000000 - 0.000000 -0.000000 1.000000 - 0.000000 -0.000000 1.000000 - 0.000000 -0.000000 1.000000 - 0.000000 -0.000000 1.000000 - 0.000000 -0.000000 1.000000 - 1.000000 -0.000000 0.000000 - 1.000000 -0.000000 0.000000 - 1.000000 -0.000000 0.000000 - 1.000000 -0.000000 0.000000 - 1.000000 -0.000000 0.000000 - 1.000000 -0.000000 0.000000 - -0.000000 -1.000000 -0.000000 - -0.000000 -1.000000 -0.000000 - -0.000000 -1.000000 -0.000000 - -0.000000 -1.000000 -0.000000 - -0.000000 -1.000000 -0.000000 - -0.000000 -1.000000 -0.000000 - -1.000000 0.000000 -0.000000 - -1.000000 0.000000 -0.000000 - -1.000000 0.000000 -0.000000 - -1.000000 0.000000 -0.000000 - -1.000000 0.000000 -0.000000 - -1.000000 0.000000 -0.000000 - 0.000000 1.000000 0.000000 - 0.000000 1.000000 0.000000 - 0.000000 1.000000 0.000000 - 0.000000 1.000000 0.000000 - 0.000000 1.000000 0.000000 - 0.000000 1.000000 0.000000 - </normal> - <model> - 0.251144 -0.880942 0.974675 - </model> - <texture> - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - 1.000000 1.000000 - 0.000000 1.000000 - 0.000000 0.000000 - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - 1.000000 1.000000 - 0.000000 1.000000 - 0.000000 0.000000 - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - 1.000000 1.000000 - 0.000000 1.000000 - 0.000000 0.000000 - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - 1.000000 1.000000 - 0.000000 1.000000 - 0.000000 0.000000 - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - 1.000000 1.000000 - 0.000000 1.000000 - 0.000000 0.000000 - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - 1.000000 1.000000 - 0.000000 1.000000 - 0.000000 0.000000 - </texture> - <image name="kanji_ki.png"> - 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 - YII= - </image> - </surface> - <surface name="Cube_1" size="36" prim="Triangle" parent="Cube"> - <coordinate> - -2.384044 0.062584 -1.290772 - -2.384044 -1.937416 -1.290772 - -4.384044 -1.937416 -1.290772 - -4.384044 -1.937416 -1.290772 - -4.384043 0.062584 -1.290772 - -2.384044 0.062584 -1.290772 - -2.384043 0.062583 0.709228 - -4.384044 0.062584 0.709228 - -4.384044 -1.937416 0.709228 - -4.384044 -1.937416 0.709228 - -2.384044 -1.937417 0.709228 - -2.384043 0.062583 0.709228 - -2.384044 0.062584 -1.290772 - -2.384043 0.062583 0.709228 - -2.384044 -1.937417 0.709228 - -2.384044 -1.937417 0.709228 - -2.384044 -1.937416 -1.290772 - -2.384044 0.062584 -1.290772 - -2.384044 -1.937416 -1.290772 - -2.384044 -1.937417 0.709228 - -4.384044 -1.937416 0.709228 - -4.384044 -1.937416 0.709228 - -4.384044 -1.937416 -1.290772 - -2.384044 -1.937416 -1.290772 - -4.384044 -1.937416 -1.290772 - -4.384044 -1.937416 0.709228 - -4.384044 0.062584 0.709228 - -4.384044 0.062584 0.709228 - -4.384043 0.062584 -1.290772 - -4.384044 -1.937416 -1.290772 - -2.384043 0.062583 0.709228 - -2.384044 0.062584 -1.290772 - -4.384043 0.062584 -1.290772 - -4.384043 0.062584 -1.290772 - -4.384044 0.062584 0.709228 - -2.384043 0.062583 0.709228 - </coordinate> - <normal> - 0.000000 0.000000 -1.000000 - 0.000000 0.000000 -1.000000 - 0.000000 0.000000 -1.000000 - 0.000000 0.000000 -1.000000 - 0.000000 0.000000 -1.000000 - 0.000000 0.000000 -1.000000 - 0.000000 -0.000000 1.000000 - 0.000000 -0.000000 1.000000 - 0.000000 -0.000000 1.000000 - 0.000000 -0.000000 1.000000 - 0.000000 -0.000000 1.000000 - 0.000000 -0.000000 1.000000 - 1.000000 -0.000000 0.000000 - 1.000000 -0.000000 0.000000 - 1.000000 -0.000000 0.000000 - 1.000000 -0.000000 0.000000 - 1.000000 -0.000000 0.000000 - 1.000000 -0.000000 0.000000 - -0.000000 -1.000000 -0.000000 - -0.000000 -1.000000 -0.000000 - -0.000000 -1.000000 -0.000000 - -0.000000 -1.000000 -0.000000 - -0.000000 -1.000000 -0.000000 - -0.000000 -1.000000 -0.000000 - -1.000000 0.000000 -0.000000 - -1.000000 0.000000 -0.000000 - -1.000000 0.000000 -0.000000 - -1.000000 0.000000 -0.000000 - -1.000000 0.000000 -0.000000 - -1.000000 0.000000 -0.000000 - 0.000000 1.000000 0.000000 - 0.000000 1.000000 0.000000 - 0.000000 1.000000 0.000000 - 0.000000 1.000000 0.000000 - 0.000000 1.000000 0.000000 - 0.000000 1.000000 0.000000 - </normal> - <model> - -3.384044 -0.937416 -0.290772 - </model> - <texture> - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - 1.000000 1.000000 - 0.000000 1.000000 - 0.000000 0.000000 - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - 1.000000 1.000000 - 0.000000 1.000000 - 0.000000 0.000000 - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - 1.000000 1.000000 - 0.000000 1.000000 - 0.000000 0.000000 - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - 1.000000 1.000000 - 0.000000 1.000000 - 0.000000 0.000000 - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - 1.000000 1.000000 - 0.000000 1.000000 - 0.000000 0.000000 - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - 1.000000 1.000000 - 0.000000 1.000000 - 0.000000 0.000000 - </texture> - <image name="kanji_ki.png"/> - </surface> -</OBJECT-3D> \ No newline at end of file
--- a/example/scenegraph/xml/sg/sg-test2.h Sat Nov 14 21:17:02 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2 +0,0 @@ -#define Cone scene_graph -#define Cone_1 scene_graph->next
--- a/example/scenegraph/xml/sg/sg-test2.xml Sat Nov 14 21:17:02 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,552 +0,0 @@ -<?xml version="1.0"?> -<OBJECT-3D> - <surface name="Cone" size="18" prim="Triangle" parent="NULL"> - <coordinate> - -2.990213 -4.356150 -0.270008 - -2.541925 -2.683117 -0.270008 - -3.249032 -3.390224 1.729992 - -3.249032 -3.390224 1.729992 - -4.214958 -3.131405 -0.270008 - -2.990213 -4.356150 -0.270008 - -3.249032 -3.390224 1.729992 - -2.541925 -2.683117 -0.270008 - -4.214958 -3.131405 -0.270008 - -3.249032 -3.390224 -0.270008 - -2.541925 -2.683117 -0.270008 - -2.990213 -4.356150 -0.270008 - -3.249032 -3.390224 -0.270008 - -2.990213 -4.356150 -0.270008 - -4.214958 -3.131405 -0.270008 - -4.214958 -3.131405 -0.270008 - -2.541925 -2.683117 -0.270008 - -3.249032 -3.390224 -0.270008 - </coordinate> - <normal> - 0.937086 -0.251091 0.242536 - 0.937086 -0.251091 0.242536 - 0.937086 -0.251091 0.242536 - -0.685995 -0.685994 0.242536 - -0.685995 -0.685994 0.242536 - -0.685995 -0.685994 0.242536 - -0.251091 0.937086 0.242536 - -0.251091 0.937086 0.242536 - -0.251091 0.937086 0.242536 - -0.000000 0.000000 -1.000000 - -0.000000 0.000000 -1.000000 - -0.000000 0.000000 -1.000000 - -0.000000 0.000000 -1.000000 - 0.000000 0.000000 -1.000000 - 0.000000 0.000000 -1.000000 - -0.000000 0.000000 -1.000000 - -0.000000 0.000000 -1.000000 - -0.000000 0.000000 -1.000000 - </normal> - <model> - -3.249032 -3.390224 0.729992 - </model> - <texture> - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - </texture> - <image name="redbomb_anim_0.png"> - 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 - SUVORK5CYII= - </image> - </surface> - <surface name="Cone_1" size="18" prim="Triangle" parent="Cone"> - <coordinate> - -0.137300 -0.931876 -1.241959 - 0.310988 0.741157 -1.241959 - -0.396119 0.034050 0.758041 - -0.396119 0.034050 0.758041 - -1.362045 0.292869 -1.241959 - -0.137300 -0.931876 -1.241959 - -0.396119 0.034050 0.758041 - 0.310988 0.741157 -1.241959 - -1.362045 0.292869 -1.241959 - -0.396119 0.034050 -1.241959 - 0.310988 0.741157 -1.241959 - -0.137300 -0.931876 -1.241959 - -0.396119 0.034050 -1.241959 - -0.137300 -0.931876 -1.241959 - -1.362045 0.292869 -1.241959 - -1.362045 0.292869 -1.241959 - 0.310988 0.741157 -1.241959 - -0.396119 0.034050 -1.241959 - </coordinate> - <normal> - 0.937086 -0.251091 0.242536 - 0.937086 -0.251091 0.242536 - 0.937086 -0.251091 0.242536 - -0.685995 -0.685994 0.242536 - -0.685995 -0.685994 0.242536 - -0.685995 -0.685994 0.242536 - -0.251091 0.937086 0.242536 - -0.251091 0.937086 0.242536 - -0.251091 0.937086 0.242536 - -0.000000 0.000000 -1.000000 - -0.000000 0.000000 -1.000000 - -0.000000 0.000000 -1.000000 - -0.000000 0.000000 -1.000000 - 0.000000 0.000000 -1.000000 - 0.000000 0.000000 -1.000000 - -0.000000 0.000000 -1.000000 - -0.000000 0.000000 -1.000000 - -0.000000 0.000000 -1.000000 - </normal> - <model> - -0.396119 0.034050 -0.241959 - </model> - <texture> - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - </texture> - <image name="kanji_ki.png"> - iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ - bWFnZVJlYWR5ccllPAAAUAVJREFUeNrsfel7JFXZ/qm+8j3xus5XSI+yb+lhURAhPSIiazKsimJ6 - BFFBmYzr731V0mEV2XoUERWYDrK4oHSUfZsOssnidABBBF87+vV8SP6Brt+ppbtrOctzlup0hqrr - qkkn011dy3nu5352h+yzn4vyLd/y7QO5jeS3YG/aHKU/gzZX+T/yLQeAfBuIgDsDAACu8DsCPMjB - IQeAfLMn7A7k7xkAgAv8rOh9bg4KOQDkG1zgHUsA4Ng7JW3F7oqOkQNCDgC5wKcFHgIAPOF2nIGc - ckp2Y3+H0oYcEHIA+CAKvQMFAI6wi4Q8awCAAIQr+D0HhBwAPvBCLwIAiLAPMwBAWAMIFEIWkYNB - DgB7r9AnBB4q7BsNAHz5dePn5qgCQs4McgBgb6vhz7GhFnqelo8JxV4MAKqmA4sNpJhBDgQ5ACDU - wv99f0v3F7LPfqP0Ryny/+XI62K4dwGjZFfwE9qdpemTAqr6O/dv3F+4f1KzxyW0Xm+r0r3hP4s+ - QyjRY49FjltKgHv0GeasIAeA+EbBYI3+WIr8aQnyOQocE5GFVk0AB1DbA4TeFAAchjSvWzIQBwgg - lD4UePz+35cT/7Ok8vVk3wPG6cGKEVZQswfsOQB8YDYKHMsRICgra/uksEOFXvh/CanVSwZa7QHb - IK0DLcefxnP7zz9X6I8V/9mNUzBwqfAP1jxYHQ7zU38r5OLfYwEz9EeTL/jRHSV+T+wIsV+L9gLn - tf7ewu+0PkR/VujetnA89rUj3j2QXF/BHiKR4oGT9MDN1Pdnv1VDk6QW8UflDGADCT1dOGg21Ppj - Qo2f1Pwyba/yWpYLoMcA6r6WfHvPAv2xQA47snut08qaPBul6t3zee1n95FDJqgpMe3vPu3nJCBl - ywjqodm5g64lDwwq4T0u5gCwMbYyWyA0BR8k6KL4vwIAyLMBGzG6/NbfPPt6iRx+1HiouaaV6GsW - WYBmW41eaxn8bvtA0AiFP+p/2untFAymIoolNwE2ziagvbq0HPI5pECfYcds4jdfX2HazfTvdN9G - 31Ok+6w184B7jkhsKmk/Kp55heT32hIACHxKi2F0qtRlYjkAbFTBh9j5qva+zL429wdIFx1+47U1 - uu+k+6bQT9C05ycAApcpAKj4KuwCwaoIAKLOZbpvC5lWdRj9BIVc8KNaN0KvTRZ8IXkMJF6Ydh2A - q3RvqNwFvPzqAt230M+VfPCwDQQ8wbQFAEJAyAQIYvQfAARrdJ+n+4dCP0ErB4ChkH8nLfAyATTW - 8homgtrewK1X1nRuB/3cMt275kE1BJPswCBTBsADAoGPR8X/oLlREFig++bQP9DIAWCdCYDSYuUK - MIKFxrIT+n5oDUD/pYt0z19X6LEaku9ZfwAoJO4nFBgKRmyg3c0bMbrH/31/aRhMgg92FCDJAGQe - fUcQHdDNCLSbDdjGr7+8pHMryNEf72ZDeiE1L6GmIpQH3SxAm+DNug/e9yeLj1Q3ccRAS/sn0tTL - oSlQzAFg3QEA+JNJHTl/U8kRkP5fElTSUh95qbc4jzmeLk63xTy2jmAOAhQchx91hAJB6tzoL673 - HMOf6RNfNfDqV0xMhxwAhgoAOHakSNurAoB6MpD+4nS8mLWG0EPD/jrlv9BnJzqJJBDwfoqOEWcD - Ss6/xDY7jCKQA0AWgq+cBQhsDyYGgAZ+5QXlxUmOPWGUCsIsl+LH1r+s+6cDQwgbINB9Nm73awBA - oIpuaTagS/9n0JBmB+YAIBN8lo2fDBciRQBggYoOADjmtqmvmRxnTG5vI0kWIIQpROr5HUvPLqbp - JUBgRmua+D/v6Tr/qsMqAjkAJDUKAv6ECj5I6AEAIG4X1sQv/0V5cZKPT7K1/7Da/fzrZwNBV4NH - 72f3vLjmAAsP/H+0zKth1v45AAjpvobgQwBA+poh8PLGIPqOKZn2twEKWQCCSGiT38cCBGhvwsDZ - 2Mbtdxf2Nu2fA0A0ScSG4Iu0vYrQq3UGauMXlxY0r39wjinbgBC9J6ZhP8RhBYYAO+zaPweAXk26 - ROjBP1nHErzWzQ2I/01vcX5iy/ouTps+AB4QSIHGjbzJEYGCrn+lOuwisIEBwLFQ2JWl4MvYADJL - CAr+5oX+aprgVxXKhUhoh6EFn0jjc8N8Cc++A2ADXs3/v95Wj65sAO2/gQFAO4ebYQIMQvNbzgjs - H7+B//Ks+uKcPMlscdrIAnTdMdMl0EsG0jVFhKzAWItXN4IkjWxY4bdR2+1wGn3oanxbXYOYAs8M - BVY1r7sqdX7p8PaYcCUEKW1Xl4yfXfcrdH0KvGhBf2vg995a2Vu1/wYEgITwO+aHU9L6oDAhMusa - xBX4FADU8dIz6otzy8l2Fqcv0BJwyDISEM0E7AowhBFEzQLW+2O5BO5ea/tvQABIeuwdO44ka4Kv - kRHIEnph8g8ycv6Rkz49Shd4TaoWYx52HbUKAIQsfABx4Q1+yuL8zM/6WxP/4w3lwiqy7wEzfqty - 180BIHPht9lWSgQIuoKvkxEImw/YxLuf0qj681qAKbaxNs0CZAKCa+/ZGbMYBhsIcKCmuVSrPQfj - BgCBkQ0l/KwGHrYBgCX0yY5BPBtfNyNQJPTs6kBliklO/kyY9edYfzxqzkBLjUMdYDIP6z1CNuCf - Xxu/vWdR+R5vOmg7PXYxdplDDgLDDQA8gbch/Ca0X0vwHbFDD+wbQG38zJM6Nf9hzn+WXXsZWXas - 9Ftba0Ma5ks6+KTxfm0bnnzkEA9gq7H7sAFAYGTDCr/NhRQVelZ/QFMAUBkOKncAqi/OU06L5Pwb - 3zf1gawJGc3MB6DjZ0iDUhu/9bpOZuWsf08cxiBTdRAY2MShwoYRfl6LLhtOQIfXHFSxlVf3mKlW - VZIGlQVwq7A2fvoJvcXpaf9oSy/eLm85VpP2DGSabYx24bafnWpvQPbzUwfY/Q8bDVusJ84tcf3w - zQuRlhF3UtVeDQAc4UcZmAHSrrEo7XAU/SzwjoFgYIKkC1h9cZ56xngorDb6+K3S867hJx9dw08+ - Nm/cPBRlCAIFXp2HsN9jG7/xmg7A1nra3xwEvGlDK17PwHC2QKZAUBg64XcUhN+qFkEQAVRoMslb - pEj3O9pU6HQWZ9ViV+MafvyR/jScJygQPPHoPD23op9a3AWCAnAIitHKDQeaSH05IrBF5gB74BHj - 4VwFQRNZJRCInUPWQFDY0MKfSWtpZCaojgpFRbC/FzQX5+lnsRen/rwBZmjMAwW6xxkBYNYBOfkz - EwbPrq3eYRkJTEtq+7deWdBYtjWhj0oNBHztz7zHfSCoeH6KvQwABEMjZDfT1NqA0kMko/EMwYfb - 9unxYwWzYR/dBaVMyUXa/9E/C+sOmEAgmnpk0ovAxnXFwUAdYA8uTdLPTUsd1UlzkA8C0nMI5wps - sgUEheEQ/qj32wqSqi+iAlTrI3avQOEILI3ZAfHrr+HHHlYq+iFnTE36wzMdDUdfgQlA4MQY71zp - LvAR2PLhcGg+CLRR3Ln6+st62p+nvIQAlFjrEu2fJRAUhkP4HZgJwHpvFk5A0QJStueFnv9VADtY - 1apH92xy0yEefTCo4YcXlasO5UDgmIN3kslxbX7OM0Wa2v/QI2eCUWo6DJbJYqs6t8EUCAobW/gt - VAMpzZdDsHCe1KnY+3wl1NKrJtQ7tTjP2jpDP1jO2vYHL1J6/hEgqFsFADHQtsLwZ03wHNr41ReU - tD854uhRDxTZz1riw0qFuf0/KGl/ABBsAABwkiE/AXryhN/ck6w++y+lSRA83BT/viq1lxepYCyF - gtG0IXxk+pxRi2G/AIAWH1qz88w9e9nfzQGgIHX0eeyqgp/fvYZfaO7wv9dLsElHCHQ072ws7KcC - ArE1pB99YD77ffYbpz+mVT6zPpmAYK0vEX7H1rmwqFqSpSD9CsF0xl/D14gRDUl/bCGnn7W9J/DB - 52fxnxtryovTAxQhQQLfOP2OQz0m4lXGoRJy3TKymt3m8Cv/gt8reOmZXqdkCgKL5Piyl2DjOVO7 - vQha+KXn1LR/6aPjvZTfVBZhd4YASvcXYL03yBSs4/+8u6Ip8KM9MOonD6EhBwCo1mcVADFQ1oYT - kGkfcpx8KgDATg1u8WgafuRPO8mZ05QJ+KW+Y/hPDbXFefa5dHF6AAAEveSWzlat4T8+qKX9ydTZ - k/SAdaVafR3gZm9V3Hw6VcxDQcATtM0UCG71U6P1mqLWY9/PF+wQBCKA200HjqcLm2j/mirlX2cT - gJMZx6JIKbBwxM4WG9pfGi9GsKQh/rRaj4JWRDY91fjLVPA3+74B9evxHH9jhuG+nmfcyPZ3UBUQ - 7iwZg3c6ktOgwj8vtJcDk6CEX1xSKqoiRx7bj6xAHXxillvH7X/oav8JU+EfPAOIeT45Wl/lZlql - /wzTQsgKtPoIVqiWBw3woHa30sIg554/STVMBXxfABlp+MHf6Wn/red61L8sr/x1TfIAVuNK16ff - Ld+xCrm/LzSVBqmQo4/zCqrqXFrP1u7xqUhujDmsGtr+VgaNDg4AooLPYwEpx5/EZLCWT47SbcYc - US65FgDM4ocXFzO8wzUlYEy+L05l2/j3v9WaNUDOOc+zS6up6r8oGFgZDYZaiRLfVR9gn358LaMF - 7JkLRalt70YnEYUX70YnE7n93I73/66r/Wd07P11BAAVwVcMD9rwAfAEWVYeDG0p5iV5PLy4M6u7 - S867YHvPsWWHAcwa3NNZvymGkxjHlVlPwN42jZ96bDmT+/vR40PHn8C25/oBGIgXaH/dQaMBwFra - RgYi/EqCHwWMDIWf5cwTUf5kRh9P2NMNQFqh9shG+C/4XKQRBRLXyYv+0NfOTfzbBxY1gWhcCB4x - MDCkAfFGKbP48UeXMlzDdfZwU1fi4EOJqEDvRtfwP980GTNetHVlhUHIP8zuZ2l9JM+sssUAZIkl - CJj5l2QPnqOr4ExneIdrsVp/fh0/NPuvanA/++ciLeaykAjUP17FL3vOAmCPPWE7fZZlLXbKfn/b - QPuPI8sdhwsDkH4YC0C8cJ8kt9r09ERAgCSpwuBcfqdOps/eZX1xfvbCyV61X8FK0k8dP3C/lial - TGQyleSTZU+A+DE886dFQWDS6v31pid3k6pSpqwqCPTWdBW/+4au9q/bXkOFTIXf0aD/rEIfkaPQ - CgNIPsQEAKnUDPAFsUK2nrs7dJLZsoPr+sKOrDQc6a8kXrqtcC8bP7v+M/AiCk0KAtstLuJKnNEg - dl4KgqxV/zMt/M6ynnN1n/0mbTn+BgMALHseIvjQXAEbiUA8Zx9E6EHdZ5IOQ/8Btsi5509YAoBZ - 7W48DOHH992r55W+8PPbg8IYBgjK0q1NTUtG5SQFAStsC7+4tBOlSqoVtX9cIRr4gpx6FmJayFb6 - nThAQum/SpTAFgNAglJdZGAGpAWg6Guq8y6YMl6g99+7mC4mQnDbv/cepO+V/sJFidoDNCgToCVg - ZJ5PYA/dRy2AwDbUjbkLQUCq/Zv473v0zKt9D5ijny9uEABwYvLPfeApO1snSmAzCiAp6JBmDSrt - Hq1skPM/O2O8QO/79XIKBAoa2v/X9+japbVeu3Fow5OCOQDgPzXWJEytFJoEExZAYEcvwUg1YhVx - VGoJf/Gg8YA5WFB4AwGAFJ13JHZ3gjEgJKZRWdQCOALqzxP6giR9uACqJqyTz37OmK7ie+/pgkBL - g/q38T0LWjkK5IszEickyo4BICQHabsgsJAGAQdqvtbwm6+vaF5jzZ/mFJOVoQUAIPXnoqcGCzCO - AgCFHyG1sGDSQZj8fCHiHPzc53eRC79gRFepEOuCQMUAQGtqbdNTADFmBcDFz2IsjBDMWAUBFhtg - O7C1U37Jhw/2zMTplFwNJwAIqH/yoaXQUjNKkFVHIEiHV9biK2j5BLpC2PTtaZMFulBfQ4UCHwRS - Lb+oXbrrbj27tLIt7vgDz1CI3b+SnTUn+I4+ANdtRAh6IJBSENwQdhUvv6psXpH9Dh3tAyyyq/gy - AQAeledRaJGpoBIlMF5AgKQVSI8/pVZizGMFdPWiLxoltFCBXosxAXEvQD279EsXqzUd4Q5KsdjQ - BcLkLEUIUiCAuE5Br9Owbgp4WHvgcEBmqADAUXD+KUYJoMlEpjYkl+4j9fwAblYgLzzYEw5Po7ao - bW1ks+K771oLste8NGTE7/Rz110Gdikj+xAhWPlxwVJLt25rcOkzSkUI7IIAz5+lC7AHHD4eT0AC - KNl1BQCH4aST2msAU4HXTtnmXEDQ7AHN/ACdMGHQaqpJKbYZCNx1V5cJtDmtxvTs0ksu8RJSKrHn - VxB05pVdu9nW5gq+yC8QgMBu0zChDwJBshCLsTbw6y/p1ifU5ezZjgjoFgN5mmWVq/2lJw4xFRAk - mahlrEG8aStQ4UcAJ2FS68c1vhcuKwnLiIPXQVbbti9VKKXXLiHGd965Ri69dBoFE2WiDrcq/uUv - 1zTvWTpfwK+Gi1wTr/rP5nRgxDEBe9V6Tvx18vuDFmVehKCs2nI9do9fem6BHHdiILS9Y3t5FXoV - leSgI2bo58uxe8bWtpELNriFZJ/9dI5Q9iaVoHxTe7hfuIhqT6/5J4KPFHdQhWrzBaPv/cpXJiIg - 0Ma/+MUmreNceukc8mv93bRgs353k7+7rM+U8UJdzxF53gW7Q0EOjueGTTcQ53X3PSj2uuWfgwEI - +Ody3IlBm7Hgu6r4lefnlY9xSGkUddy23yilwzhX5m4GAoVcLAe4iQaNsttbBd7rSy4xCmFRgV/u - tbLStUu/+tXx3gRcpYgJYjgBkd1+DiCfDZLlCpiZAy89tyOszWjrCH+XmYUskX9/YpW15pGwHAAG - DgAQn0Dq/XXy5S+bgcAddyz7ffDuuEOXuYnLjlWKjwrWSrpXQd8rG9yB/K7FTfKZ08cNQWCbboET - OfTIyaBvhMScZlrQTg4AGx4ACtLBonVKwc1A4Oc/1+qYQy772lSq1LegkgCE5ECgdz9bsL4DHBCI - vzcoKf7M6ROGIGCS8ceKJGTKAnIAWA8AQEhF8KP/V6dUfGaQp0y+fvkof7KORu1/umjJcEAoQhZB - IHC+GoKA8j0+4ui5XlJVKkqGOPfRDgvQBAAnF2YTACgojhKP2dCoTjXyIEGgGk4uUhllDsyP6Nng - hoxKEQTEcyk8EGhQEBgdiPBPHBNvo5aKkjn8a7cQEyzk8j9IAEB2Bot6HYYuvyxzECBXfGOy5/gr - 8EphVYelOvbausGcfOoNZ4Oee80BgUA91UbNQeosQDOxqqC5inNhtkFZlSl0AgS+/vWsQaCmbfcL - Kyet9QRoc8EIIchQTiSoQC1lDQJk88dm+E7DwbCAQi7/6+gDSP50FECiaw5c8Y1M7FUyu31OWOzD - 7fYj+FvBdkmwBwCIn/mHkGQoJ5L0qgijA6ecZh0EyFHHjqLocA9R4pwSC8gUAHLptwYCjqo2ReyU - Wy9tePsVVkGA7JiFxfxFBT/ScWvI4ngwBRCAtp9DsfNrZLAQ4tRflwUYokBBWf5zJ4CZ8EOcfire - 9G7tgCe09s6zjlLjr40bjvLeaxAFQOJBsrKpUw64H0WZsgBrXZ3JMR+fpN81nZJXHRbAel9uAmwE - 7Q+l+yBhCjzX39xhTFXJt74Z2KUFxfg+awEXFABN736u8pmAYrtuUUl6sFXIp0+bM76/H/3EqO/4 - S8b6jVkA0kKBgrrk5whglf6zRo/pOQtL4Vhx/cX5nW+PSrv8FDSYSkHYB0H7fMMuSAwHn4KdD6k2 - 7b+vSkHA1PFapQcqcuUVaudz77eaeBZy+V8PAND0Bci17DT59jdvNThDRkgKEvNXnZYUZQ6GXYGY - Dj6Qlz+9sGW9LIKtRkFAy9wix54w6VcJ8jL+mFl/rPOEjH+DCemIuvTnm5HNigQTh2WDRpn/F3nY - wY9VrcX5ve9MIRdNG11bt+JOTaub9wXsbdKhnJzPoP7n/Jdu5DWj/NbVPtd6/GvduEjxvjP5Xpdz - D1zEOJgNAEhTlAr5yCFl40QQ8PtT6N3Eu58yLkcm55w32YvDCvvKQWxKBGkuUmTTVSSJXSNGR6EE - iAQ/WvjHN6mXof7P97wBo3UrE3zBx7A2Mni157CMLnz2UE4AEISfdRLv7b+/ip94RDnfn3x8cs6f - mpyUKTcF4Ony6v57vUGzNd+BiCJg3bsexi22wwBSBKBihylA35uyybzUSRv9CMooSHVlIL0TfzAs - e9Vx+DZcUvgRz9YHjBdnMgfm64q2XeqEOfksLSOW0zb9zyJ79Tl9RpD8ac+s8uv5hSO6ZUCQ/LvD - +bvrNvHjjyj3+CPHlydSE5yT2pp3jz1Hp+uHIWv4nZZfzEUOPKIZrt0xuby4pj4AB25/yJwZUIeG - CE+C31uWFo/ES89wDPHGk4mYARL0q0PILCMw2uPvhhuVq/3I//6/SVDMP54FuOo7HL3y4htv2iSc - UQjwE/gpxyaMQ+bll02n5r43tT4qmuusruHYa4U9B4v473/bht/e03u2+N03PAZSEzoDgW6AEbD8 - I4AHUqTUo4s3qV2l7039zS4AqIaGEOJTfqZZAGgrxmQPTJrPYgNtnR5/5Af/G1B/+OZpoga+/oaF - xH2s+v4D1Zi+DTbgOHFbP0nvXYD2d0Qas/d/VfzIn9Sp/wmf9Kh/iXneKeXsrqKgH2AdL78qBHP8 - zzfnyQGHV2JmBdO8sGkCWGcKkpgwW/u38TNPrCFbG69jsSMZUopUik6QPHYupPsM0yF+7hUqlDr3 - pNrzSyARxfe1TQNf9yOmAFDmsUK+9136HkpzXU59utMVOoYZ4Br5AdopEEgCgSul9gJz03f6tajw - q/tWJk+KUH+HAX7x6AJ+/eUdil8xi5hZinBnwIiyUPOEVCVWCWEKDlf7N60Lv0rHYtD4MARLTWWy - ECXB9+klFUxlfwj54fcnEeI0rgwEtO4vymuug5kV3nhw1+8WXAx61Tmh8ER/cr/LpCdAuwcsCODc - Y/1dxAC8zxS0fSt1mDr23+M59ZQAgLKARcoCuv4AdqRC4mctqMg/X0hVaJwCU2D/rYVsbg5D6EEd - iwUppkhB+M0Gja7qjJwmcz8cldrtBacFFn5vMXoMJDospKAU2bHfE0Bm50MmVwXPsIr/1FD3rWw5 - OSymAivFIjn64zqTi2ZN/Ot2R4MhzmhtXabAHsPVsir8TFBCgpFTMlAAhAx5Cxc6aLT/+Qq+9np9 - 6i+ZGOwDhYpG8nwDotmEvPkK1oFcFNVR6rnXwosPqVP/kz494d/j5HfLzeIqOfo4tXv+zzeXEUpk - gDoOgmbuFTKj/zLnn6bTAT/9hN125I6kBRPrnKCTi42nDglHjjWo8CvPDCDzV04CK/3GNHvbz4Jq - HpC1eoBmWusLojoqPff0B6fWkQPQxmkWPcbV6OJ7UGWCGMRyU/L+c+m/oyjPUKaQenjNTIQfCUM/ - CjQTiVNQZRECBzxodFVncZKr5kbDMlSoiTFL5ufUNJLnj3BCP42MBfRfl82foxNndLwQL7znXhU/ - 9Ad16v+pz8wF6c2cc5KHuz0WoJRqTFnASpxxMI+raQKAwVnUmUXiU2CjIetKLNv/SL4gEGInAkEm - F8vi/UiiEQUjvfHV12pQfyeg/gXGpOACt8rQXCPxGI9jYcqzzEErm02JmAyghf/4oDr1//Spferv - GCxKlyHM8s2L1KwiRRQoqHn/kNwE4NEpKFtwhN9hlwEgR04JHVECCYI3mOAmGCE+aLCzAhtU+NWp - /zXzk1TIZ4XMosCs/pslV1fVWMA118VZAMTs0QeAFtc8lToDuQxAnV0FXYMafN+WkjO9Qo5SZAHv - vbWWquQEoBCMAZjWcTsCypZyfqF0Hn7/ANkzAO6CgTqWHGBiEGCcdTqjTo/6X3tVuDi1GnyM6UQa - 2HYpt1OQdhQA33HHGt+Zx1unQpNvFj/4u2Wt60WUXYm1IdyfhiywAIDeLUg1u2pIj5eOCDqm6A1O - Gz/1+AqyjwBih5QQvJC4lhwcJUDQUGEFz1+j4/Wvx3L9pXva5FAWzKuvXeo56KRlzYYVgVybH6CN - 49fcxL/7jXqu/6lnBDkVIKc4eF1SFnCsOguI9hk0cgJCZV8mKKr03xkU/RdgjrSxJIv6A+vOWY5C - 2HirOp6/Wp36X3d1eqqPUrWmf5giZRHqjTB8SgoEN7Nn2OazUzAL0GNXp50ZsCuQXwzqVO9tZiwA - IH8FsFbn2leqDg8J/eeDRysT4VfR/qybCs4cVG1ZFfu/tlbCz/XXjIZFOwjU4kucxKO8GPFV1ywG - 5y4HAfK97xr0NAy/gwniSJzT0f//Wfyb+3UYZqK5p0zZKZkB6izg/b/3fQEAxiHPBBQilYJWl76d - ZY/FfsuAAThq2p/ZgFHWRopTYAQWfv8/Krh61ZrG5TX8xakzzDM1A4CygOuv0ajaY0QEWPa54w/j - yAbI5R11G/iB+5RHsJMzpmZ8diVb71pmQLi5ln0BUgDQav7j2HEUOojnO1jFTz22nIX885NBoH4P - gLdZVGAkdBQGziUq/Oq5/jdcuz0yEtzSrr4YqdlCBcsvHwaERbUfZEvsyBU4s4NiInXqf9b0uNze - dmBmgNhkrpAjNVgA0BegPxqMlyhkbFIwb0Q29j9yxD0JIC2YHZnmAVQW8oW/heeuUo9H//i6iZgX - HuRnAO1lCizqVN2jpPKe/SYMYDV1v6GI7jlW7/u1jmO1EXNeKtXHAJzmMRbg6rMACWMvKKt/VXal - ZFJwt4wAAHjeEkMNHCVAUP8AClteO7o9+iTNPVUn+cazAzXuZ13asx8ZmAC8HH+WLyB+XVV87z3q - 7GrqbE62n6rZCzabK2Tzx9RYwL/e9nwB0oEmBWVar3pFdm5ChhEA6OJH8pAZy7xIef8hUQL/n1k8 - N6/egOLG6+d61XUOIOlHxTkYJsnQ71BLDJq7aiUOAg6k+67Kc2zBuuzG/tbE9yyos6vpcya1vPMO - 4heVsbd2qPiaIQPWAcgq02kf2Ub0tCDPvnH00jvFwrSKn8zA/u959PVhWaj9RRECOQuoU+FXd0rd - 9KP44uR3DuY/b1YdebyBh0d7PWaieH5eDYIb2Npu4suCXoEG7cHDASHSzrm9Onm9kN/Z57I7KLmM - NeWmlBYVaLcdXdc+cPU7Aa/il56zus4pC1ghHz7YO98K776MGGtrR0FglPqWZW3/96jyLOo2V5TW - AgDsf2jVGd9Z2NKpwqPCH06cQYkiJ5QeHa1SkMlu3jurCgAU0JbI/Fw78PYzu/eYjQiLCSNDAcVb - hU3jXXfrhPxKoW3dStzPtk67sAFtAQBwthGtm20DKOAmRSOrO0Mp4AqZqVT7cVNBaSjIPyLIEUAC - YOm/39MKFXzlvEbIz+/gUxT2EZQDQDvc2b+7bivoUuvqCmqNav+wmaWL1BGJ8xx/etsS+frXu7+2 - Qk3bYvqRvIjS3XdraVr8xwc9f8ES2kAb/r93ligL8JhGiUVbRpQegjMAoBiU/d+9QQv1naSyrYyQ - YCiGTsdjlh+FBxbRZJQr59VLUG++YcY//0DzNxPtwpuR16u+YDgR8+qKby0PbDX6IOXW4u26e9q5 - bMdx6zTx7bfvQPkW3WoIscfGjSjZ9VBJ1rX/059tU/t/ZQALsxKkk3Im4vKAgMtmHHmKcdyU8B09 - VPgXtEDsW99bULfJ10Eb/bC6Rq6uUkbnRoZaOKYEIMpWikijt94HYGug7gAVkAmgE9e3ARQDi/8n - Fuauu9fIxRdXkCynW7/jcS1y7FV89bXLH+DFWI+FNyOmAPnh98fpvdEDfC/lGPkNSYvk8ssn8M9+ - tpzLfc8MWCObDmrEfAHhbTfrCWgCFHDkGsxNuuuuReb38ZKe1JhC0euUg6+9fkml0eZeuRh/WF0M - fR0sR2nRnM35/1ZysWeaAamtwLdfbVJsmcOMK3DNgd6iYBLLqlJxEIwpTPtDOPKte58bzFCp2daM - PKTp/CYngPff/1hGjH4aBWVBHtyg4CZ+6rG1gd6kO+/0vm8WxGRE94Xl+c8XZZrZJUdfO8hOe3Cv - fPnyy6fy28wyv3QBYBARgMyr/wAg8KtfLaB+yIifRaXeHDUHgO49/sHcYo9pxUOVJo1B2onnlN/v - tIA1kmt1xP536AAFswCosX73yY8KeHRpjGPTyy8qbUZMkyt/MIqvumYtX4g9FpDMUCtaAYA+4G7b - G24UOfrjo36mpOuORX/i5Ve3KAFv+x8rZPxAb133mNaIkOba6tiiDhTZlP9Cb9QvfrFCvvrVqj+L - XYfxcJOedFJo92IA8IA2lg/k6gOA4/Tr3/1jumPk8sum8M9uXxx6AT/hk5PBOLWecPvRDNQJf3IS - r8gRR0/hN15TvT7PDKglAEBzlZuEACE24nrS1Dvu2Em+9jUqsF7PekDLc9gtzAGgL7DN1IBMgxmh - uLZzmWy/ov9M3B4LWFcAIKeclhbuQLBDbY5MhqPqXF8jCgAO2Wc/N7W4zVpHKb4Psf4+jZ9+fN2R - m1x2mVeC2VLuqlNgVBX2Pz+Gq1fvNWYAue3WSbqgvVXcxld8SymGT66Z300XfzkUEH+n90Zbg1AA - cKPH6tYYUBZg/X6Ts8+dCIW4S8sRvQ+l1N9Yeyf6O0Lc96Xem9pXKQP4kPK5jx+wp3t+I9o2fFbh - wgGk/4K1yu23r1AaWVPqhCN3FG4YFkDuvH0yXKBxauq99uzI7kL0Na5fi6BmcwezA8rItXbKwfFQ - jFUo3W9y0Re7Glsu2Cbr3M41j2maAc2uH2Ak81WkDhQN/NTjQ6MhqfaYJ1+/fDrqOBFaRvKtst4A - QOq/HI843AKBCcpxw0XuXWtkkTuMh5kWgLKmwMaqDkn1yglcvcqm/ycFAOTLX56h5z/tX2snRs+h - gs1Mq7Uo2Hz5SR7fdXXMAO++zw4GANQvtImGbvNrx1tG4NYHiTK5am4cXzmfSY0D+eVtkyHjKAYT - gP36hm6DkBLild0GNfn9uvmoe75bv99N23URwzHsFslPbpnAV3wTPlL8+1cuUTMAJUDAoCzY7xxd - jguKO01NuVHK5nylQi691POo11A0wuMCnl3/PS2/12IAmHUEjlzwkspcU/+HUbRjJKXFBkn5h9QB - mFqot922TK74hmcGVA3BLfrQwAMoSO3GUZ+BBOZEKdLuq9zrp9cd9536Tk4rbqUtBIR0BR+LBahq - 7yRt9wRKt+R2lS20bpQF1JB+7wFf+PHvf7sWnuMmMn3OTLguilw5cQ09nDIz4PCjJvGbr0vvGdl0 - 0KTfX9Dzu8QAQF2Lyd+jeYPx008Ma2OFWpgqXOR3cAWHTStRACDXXzPu9QHgCrirIrTJc0H8WYNC - mQ/ZgBtZxSyPfexY/sKCA9t1V3k+hmJCYxcNnlGLg1+z5Ktf9a6pEl38TBbEk9UgL6SMf/ebmHmK - G3/wKzHJWVvnQlo9lukqZDOWaRFoko8cMkWve5Z17SOZnqg6UDSGVPgR/slP18j2KypgE0U4R8Ep - Ueo7jn8wtxJ5gFXwTQV1K0Zi4eeBQLT9VypMx2AYcSYgTeUlN1w7GtrfVd+hmF7YJgK0ymFfAV13 - OffU4fo1osCSEv7Y+vjTQ/PkzOla+BxnLQk2kKCxQY3sf9hM6j4ntsK6S1ZcSJQAIKRfgwOBnT9Z - QpzGCpq2mze6a4I+wSrYfFBpwca71wXWNGDE71cIp3VF8tNbmN1ryY3Xj5MfX+dpybbEdjboDZhg - AHbMVq+BShn/9gGpYxr/ubGGH17cEV5Dc4Dmc4kcdmTvvpODjpghBxz+b4iPYv0BoL+18TNPqNqP - FSOH2Zcu3k4uvnhcEbBmmZpG5UF3xz758/bcplTr6dZVcHsWKrQGB2JLhG7HBJjcfMMkuelHu0LB - rwqv1TFjALi203b0KBD+B+5XOi5+5E/L+NE/bwlBvj0Q6XFRmRxSmiEHTwSCD5y0NEwAoKj9z7ZR - 7TWm6tjDt9bWkJ16864XWSYQ6v4ZR2TjJtqPJ7sYIyUQ42pwUrtphtx6455wQnBFob18yVhobQr/ - /fdpgwp+7OFF/3pcTeexGgLUkVJUYvgAQI1au4Y95CIsglxyyYQiCCyiYQpXardgYw3NUEAZNmuY - JTtv7tJPLWEm1StNeiesWrifgbf/vnuNGQV+/JE1/OSj8ymzYEi2YQGANn72SVX6b7Pcs6a+SPzc - gFW0kTcHdJ2qNR5jyKyqz64fQBtE3KLNW+0Vt+GnH/fMgtlhWjfDAgBq9H9q67iFRRbdyuTLX1aa - fItvvmVFZ1hmRvaf2nt7eyQfnXesXnYcY0/n3dva7EYCNOxpurfIhV/YRXernZzwM0/sHCY2MCwA - UFd8//QQnAPCN92y06LNaSbYSQGXvSEmuAwg0DpfIFC40pNcbwbQMw/pubbJZy+cswoCzz65gnc/ - NRRsYBgAoE1vxrLiIi8DVrrqViSXXqoeVnQ0HIJuRmDB0uQp4UP9zDRXUJUGPb5NhOuf2/oygDQb - qZILPvdvcv5nJ60CQfPpdWcDwwAAavT/rOnRWF95u1uVfOUraoMvb7x5uedDyFKwQXjH0LwsOp8s - M+0wBJ9H71VxV++eaDOAMFcji80zOZvkvAt2kXPPt2YW4KVnVvBzz24ZTKRgmACgb4fWFT9XzvCs - ikgvi8t7eG09Wqxjw/NoNeurkv+fEHxRvXlMiCXggtiXqQUUrrF/ZxUOnsoI5TG+NjnnPKtJaPj5 - 3d1IQXtjA4DaAmhTBFxP7z9r8/LG1VjAj29aCwZ6GjjGVJxv0mMw3uu68j32vYlzYJ2Cml3PUwCs - z5oCgJofgHkdHMDumwV1svXc3WTrOePWQOCF5nIIAo1BmY8F8MF1kd0i/Q8fVnYA0G8EocwC8A03 - LnKvB0rdudpXQr9TDj2B9oeAQew9LAagaIa4LvB+9D9H5n5gIljtzIrv4vfaKwtukamt262BwItL - a/il57ZqMVENoCho2XX2NiX6T86YmkQ2q62Szq8IpSdf+6rGAhSkCZsAaMoBJ2AZUQ0WvbYORNg5 - jkGUAAOQ6SE4Z8hNcK12CLbto0g6CWvkrOndgX/KEhC8/JedIdvNNEqQvQ/AFdD/5xTpf1T7Zwla - wXGVnTL4hh+vgD/nIpgfgEVJXRGFRQnBRSo95hhOQYbgS8/R0GzstiHTB/aW1bwF2FvLfsjwjClr - A0nwX59fDI5LQSCj9V7IQLChW03jM9NZ2EGc66uQr31NmQXgH/04nhugYstDHXsIccwFXlgPwYS9 - 40ZChIgvNLzQIjfE6HKEXeg7sBsKdBXWsL4j0zMfG+S0M3fR3QobwK+8sIwg7dY0z7mQtZOBmwhC - b5QS/T/9rAlkN/sPcsE1zYNW1G15VduaAQYpIIjcfxYbkHWkZZlITO2ZWHkiPwXfkZE8TllbaH56 - 29JAzFq+0FV838CpZ0xY+qZaJueszwBkGV5SKGri53erdf7JyvknXiRePznl5A98/Q3LzIfGSqZh - aVGplmWE48B2vcj5pxEhSJ27K08okglRcI2mvp623FR0VdeDylb0QeCU04wchOSY43dJwdDgnAvM - JyEV7ME6/3oAkM25cBxrvb2qdTzHqcaoKMgMEMXYGdrfRXKh77h6YBBzAsqEH5h8FDNpOIyg/7Jk - BQD0nzuChVzl2pucfOpDdFc2CchHP7EL2Rx17nIBwKYggd6lRv9PPWPcwoLgCJXUPiyTyzVYwHU/ - WkuZAiIMcF1+Ak/y8yjpmRdo6e7PDgAUOioRg+S5IH74MXZPeSHBtAIi3/8fg1BgwhEoC7GqmrAI - HM0IfFceG/jUKWCTgHzsE3P0wxULdRWWnID2ClPq+IWmap31dLZ+Cqm9pMUCKAgI+gbwtCbEQYgY - 4TlF+t8RZARCj4EAdQTMHAWAk7NLo20wAGbUBLjOXYWFIgQKzyRATfLJT0szCMmxJ3Q7Des7JIBA - MaItGD7N1fp/HfpfSTWxtAUCvcaXwj5XPgvAP7tdJ8/cryiLeaj9DrNO/Boc1nVFcxOcuFZHyV79 - jK6S3V7/rNexY6H076zXKediggUwhR5ih3NBzwOAJc012gx3Y0eZHQXZO2iFbDnZK4BjXhc57sRx - f72zFIf+mh/rM+j4xY1YFGzxtQefaeMXl5QeKPnM6dnQf9b5JQUi3lvfA65NGixghVLZagTRW3j+ - mi0o3zLd8O23e47YDXef8UvPrdg+b/Lhgyd5TLRgTPHV6JGe80/kELPhAxD5Afp7kVx+uW4BSM2n - pPYbZ+RbvhltBTN7X9lBokf/eQ4xq85AUBxezxdw7fWez2M2X275tq4bQywL+oKtHCJp4Jf/ojY+ - +uRTxfTftSX8SJJr3/tPbRZAQSBwCOYMIN/WS/jFDMBq7JMV7qprnPV0ph5/VphKVueOjBo3VPKV - mG/DbwJoUAnJ1savPL+o8T0Vvn2eQSIQLDm8SL6u6Qtw3dVERCDf8m0A2p/P3gvctQ5lAbDwh7L2 - J586hdJ/tySs5LJlAqTi0ZJiF932TcFY6mK+IvNtOBmAVtNHaQKEt6nTf3cATjNXtzBfnQWQ7313 - pufQzLd8GwL7H2YCmDsCG/jVFzVGfof2/0CqulxAeW0qaw3MAsh3v+OxmVq+EvNtXUGAIUsFga0L - q+aSf6nywidbTp5IdYThla4a3xRX7e/9N8BZgFf6HNSK53kA+TbEJoAOmojXcxu//pJe+qxRi1lN - bsTKmWbmv/dOSWqmkG9/c873ZSSr6/It39ZF/bsSANDNg2YXjOjRXt9WZpxTJvdF1LWGxwJ6byhR - FsCtFCTf3DHpmwrJqrl8y7cNwQDMWlV7tfB1Zfo/eZLXU22MKfgusjyPzoWFGMXNOZi+ALJjdtRP - fWaWz+Zbvq2//c8BAEFZoZofoI73/FVnvHKFT10yEh6hs09SJOB6/QIYLCCoeyjG3u/mDCDfhmsb - MUKV5BavElR3/p14EtWaXu1/pOwwWeXq2BR8FJTTuk76uMkyYZdzEkE5rgdaPV8H2X7F9ngRU3gR - wY8y+c63Xf91d/R2tzxX+DpyP4KfVTx31bzOZZPrruZUh7li9pd8HcvHSDYSjfxN2lYMyfoLtHFt - 5ybdx0y2fWmP32UY0vdQpUcidO+4/OYsusfvJBR0B9C7gSG0BVXKIOQYkYafuPWKXugPuTAzxLYJ - oMIC0g7BCmUBfvcacsU3JmJmgbCDDrTnXuL7TH0JwsWHYF2EO6LFitgzB6XCj3j3pUhBddTgelvi - BiSS6FJMFqAdj3kmrKLDTjRYxQIxLoA1vVpLJF3n3yzbFs/IBBA55yCTc+PtuYJz7/h2/xiohx4E - 7XufR0mUbxoIRFFLg0EbiIqmEQmFX5iLYWdkOGvtQqYtiQQY3CZMEF5nCbR0sIoL1s28t46A+L2L - EKgjT/CWJn7jNeXQH/nEFi/2X4p9gePwr9FBlhhApLNOjOU7yRvAMAUi5oDjUhZw2ViwUJ34+TG7 - +XRNgqiNE3kd7eBj3+dRhAFj8lm7jNcMuo8kPyHCn/69jLS7A0UYgEz7c0XBhQkw4jEFiUIFj09j - rWH9VPmC5YWl1/Qj+GxFArOwh2DCALhtuSWmQPCesaB4CdqumycACKqRVw2fE/u4HV1bF8lnEHZc - YI9AJgvQHxm+UF/iryMVhzBAgGWjD2zQfxDZgL2xAD0XOeUJnTVv/W1BGwBcQHdZm5YAb/gl1+bn - nBOSNMiUgYDr8rUR5ye++tplg+sua7cKR4pOq9h9FlyrvP14yfBZt9iFXTItrKJ4uO9t9roUQ4Xa - ZK6iAosogBFJFA40rJIjx53opdSOgU4lSXus0ADJwuB5wqUtsoEggABONKsp0AazAjpAr7PIiQmZ - OpS+H0Vy2WUGjkDUYgq00PaHan8kbveOUAU/9+zmML3dk5G2tlDryqY6ACijTBu/vWdB8/FUuF14 - eI4PG0wAwgBkpoDVdt0I5lzzh18a+gB0HIBQoec7LtlAIHQSxp6NAQvwnKZAoOdpfy26jOp46Rk/ - IuZNw8IvNOfxi0teSLOEur0iVYRaOltGrWhvRIlCOIy4cP9vetr/2BPGfUrKczI6vHOxZAe4jFbH - UYdg9LxciLMuFvPnvzf2OYf9kGJOwth7zEZGdyROQBbjEf2eAkSZk5ADAFwfSe8YBo7AkAFApxgh - gLnAdCqmQIUpF/il5zwTboe3k2OOn/D9R14OjOvPD9CMMmQRBkzZuExUauN3lnVt/1mxA0MxfKMl - /AgxB29yw1pCZxXDw4wU4v1IEiL0/97WvWTyg/8d1bf/kXq4UGXgqHzwiL4j8L5fU4HzHKeueMpy - MkIgtf2FTsVmV/sLz+3VF5bxay/uwK+/FGUGq4YyCcIKoA9AulUNhLAi97wKEjjsRC44gzcRewKv - i4BDOQEgwPqbXJDaBtdbMvIB2MqOk1F/xIyWGDoCIyyAN8UIucDIkL72F4LB315exnv+ugO3XvkQ - CiZi1X0wyID+wxiA3DPZxu++oaX9KfWROP8ALMAGAxBNukWyhB4k1+rIQKuyd/shQF1noNSfgeQg - IYqMxE2GIrn0UpN5gU2xj0dx0rFc+y+ZLE+8/OoifuO1bfjN1z8UZsm2bDfvHYFCZ9o2d+xof66R - n3I6iBODTAQilfQTtd9R3IZn+g1cuX0fted7iVWcUV69zzPtf29rGVxvWc9ESrAu1utkkhA0KSgZ - KhT7CzwWsKJ17Z1I9qQssxOUHSrU/hW769SLHET8AyITUYG8j8CE30m97Hn+33tLT/sffdxE6NRh - CLvAG9gr0rEo/KxCHycJBG5aUFOOP4iTz2FnHYJCez1AMGMASpjvCn7nvIYIPk/okWA0efC7t2YW - dS4d//aBJXL+ZyG1HYDSc6H2r0Nsf6F8HHH0aGiuFcO8jQpMw6ux5BGlxeCkbG8T7T+bkmRmem+G - LEA4LDOiuRHqpwwjWXqvAARi0YUkI1BYyDffYpYEpBL5EQIAy9uvAQCQCEH/temcyJbPImRmH2hC - M+KFE6sWVuds7ziCEepC+c/EBOgLZRv/62097b/5Y6N+2MMB1BwMggUgBKD4EDYgAwHEyP9X3tqG - 1zuWDQAgfliQK/SCUCHfTCgbXn+z5whFLMevK2cA4hyBqiXtPwsaoQ4YAW7mBOQzi1mDhzCrn2ll - ORGIZxO6jAUBSvdFYsdYB+gs4zopXXMAMPX46yQHgRyFsghB8JNs+9KkEQCwnMqg5CBpjoBnmtno - /lyNO8dVnd9w4VAsBuqdRBP/3zuLBhdYEVIbpqAy4u+2ugJzvfkorRlE56FU34/E0YFONlmA+Mab - N/n9CoIpRZY8/sDIRkcjnIiYUQQTM6DJz+5kCA7EVOivn1mq/ddMng/V/uN97Y84OzAhyS4AuEmE - 0rvAiWNmYqmokIwrhFA2LQEAxTta6b0IFu/XE6q26VXjm26Z92PqHbfRqwDscAS0YzFkiCCJToJn - EC8N1rv2B3+3FhQGIX7eB9f5xzEVQmZBhX/BkvbX0Px6CFDQIAB13H5XP76ZbKKpXKDhsjW3rgng - QppRAEGAeUwEKI9FDC84t/imZQP68M23rOBbbt3qe9U9ULGRHZi8xg44sxEGlv3fDf0A3SnNkk5E - Uudf7P3Gk6yo9p9gV8UivuLQl30tE2DV5ELJ4Ud5tlsRlPknLdKwQwCki0CW3tsRsQIk9hlE39uB - pgMbOgGTQHDLrUuhV7xqTdN3FLoGSSk/cz2MkYu+OGHmB3DllZ/wKIHn+Fu28DhqwDAjxzxWlwvV - hiA1/J9/rhnc+Cqg1768SYOwY6+mCQCt52d6sIGmgQ79TwgRvu22FWR5w7fW1nBt53wIBE075cHI - LItQfk9NWECTa/dzy8C5zsK2Dccf1f5T/T4NAO3P9fm5mQFAC//3/XntCzx08yRCkRCObgqmC0BF - VQaQQnckceLxQEBTo0mFA5n3AYQAQW3nMt75ky2hE2qVT+sZrxHQ6w9JCpKlCnfMAAA3/rDWZwEA - E1DsH6iYOv60tD+vZ2GGDGDWUNgq4LxqcYqlvWIgftUZzJOPgDXuTJtfIgxszdpCA9jwT3660zfV - uk5C1vmLhB7pOBKBANm/12XDh99kNm7h0n8mza6Z5vuH2n+u7xjX0P4GcXEoANSo9te+UHJwabw3 - 7gsS64e057IxZEM1xs91DCJYKCtl8yubBAMBgBAE1qi5sTWY0qwQMmT6ApB6JSHrnsXZ1hj53OcN - /ACoIY888BRTj/pXjYV/4pjxuHLV0P4G0TEIAKwaX6jv+QfE+lXysW21BHMZMX5VEGCZAkoCDgwX - dsxDgMpAcNvPFkPHbYNP85FGM1Gk6C9g3mt9M+DPjeVYVSWz3FuQGYjQtBXq7ybayCv3LNTX/lAA - qFLtr32h5MAjKMKFhQwgwRY4BK0NBBGxEBMQUGjtlaT6AOHBv/zlElqHDf/s9jV8+8+3Bh1rImyg - oxAiZFFqSHRE3EXY0AzgsAB5eNCK1993/MX8YoCYnkXtDwWACtlnP5OpLFWjQgskCdGYAgDzuxUG - d4AFH0li20jWMaeF1nnDP/95nw0oJwghtbFXsPtZNnz+TVACWNwx7CX8zBsL/8QxnkzVldqQMT3/ - ZggAAYCSrglA9j9svJfYoFtqCe3SawoCEPseIaSe6qsBImxG0ERDsOE77ljDv/iFl0AE9A0gZJxf - wL+XY+S8CyYMLqfBfvaIt/5WUdClx8a6q/cKs3SqES21xYM6AWcpC5jUuMiqMrVXbc9l0wSQgUAH - Eu/XCfNBZvChFhqijZojfTYg1fZILUyqliqsLZD40T+vpacGCaNCVuz+kPpPp0wOiJJ07Wl/1TBg - XcUUIB85ZDzd709C7WWmALLMALQHdyDFJJ/IotZqkzU8DCAmQL/61Rq+886tvhC63b51QLBj+kAE - Nn+He4xpwzVQBw4pnbUS8mNRf4hc8MDCcFMBgCJSyQVIjgiDIh3LFHAB+dp6oSD1wR0IIPgIGXjE - 2T0A8a67tTMAySWXjGcKBHfdtYi6WYSqDEc1RTh9v0tk67kmA0Ma0ghQ0OFnpyXq30hRf2VmjKyl - xKumAlcpC5DaXGTTQUHWn3DctmwIh8vW/rzkDVMTACH9qTamlX7yvWmq5cjFF++h+0RmIHD3XSsU - pLb4/iJbPoEOMMKADMyAJx9d8Ztt8qMSLWSh0Cek/tt7Xn9XgfazfGOW6mF0hoPWAAuuqkTtoaYA - awafKQVQquyTjPIy1niIlwFoCgDloAsOapEvXbw9UzZQ39WtKWjDAZFjGonCgh3b0QCU7qgTOv2s - 2P0Tx0z4siP1dUHlBq0bAJQpC+AuIjJ+wIyfpgmh9hBTQJidZckEUAYBQJgQIUm+O1IZvqkNAKSy - bSJR618j2760m+6ZmQV4ob7sg0AntK87gHyJjoIZkD6WoR8gtMnjz9QT/rJpe6+e3d/1NYioPyj1 - fV0mAzFNgVG+51+js4o0zi+oxzdyAmpO7zHJZQcfK5y78Ot7bE8C9v7WouCQGRvA9yys4Xvv2RbW - gKxygU634UhcWMfIWdPa5g1+5glvalA7sQZmLZX4+qCLUDjURKcNGbKT9GMTAMYQIzeAgsJcr3e5 - LIWXW2evOIHX2ARQqFtHHBaA3Kxsf1v0n3Xvx3w2MFN5iO6jmQHBfb9eCP1BLXFvRGj9BAcIOpG2 - 2drOwFiFn43uPp7290C2okT9hf0w3aEAAB8hqcCPR4Q/LGrIwMsvatFl7AREaqOrQYsYybvdyJgA - sgwA/N1L6GmTL85MZQYC99+77M+A6IXcFLz8kK5JVsyAHkWvWxT+CV/7q+a3uBlOw7IIAP7NSjgH - ++ENpNBkURkILIVBXAUQgGb9IVFPPAAgpLvqNLQX4BcumugVmnQYe/87x7zSX/KFL95K90zYAH7g - /jX8mwe2xdpdW5lH2LuXRXLamfpmQPPp5ZD2b7Mk/KO9VGMRnVfpQJzBZgoAnkNwku79zKaYdx1q - Cij4A6yXAwM9/QiZDvTUsHdR0xOczLR/uhGoJ5xN8vmLsgsX/u43O8PzWjXrIMx8FkbRAGuxftRz - 3I7xhVmnDdnwAQAKfQE1jnqFe/lFN4fnFMwkExDg6QeHtzSq5eJ/axhe37TGeZV8B+GFn8/OQfj7 - 33b7ELbYgp9kVJwwYXqvoCHYyBFH70Lc6UNAp7cLGU0+HADgoW6RS7GR4gWLkn1E03mNTABojTpC - WjntSSDpgLWcPv3/3IWjAPtftNfoMR7yj5MFCDz4u5XQOdhMCz6QEaQBtEROOW18nYWf4/RTKHAb - APW3CQASL7uulx/QoNPK+WnG+1XseWnuAPMYLaop9WPQHSr85j39p70mJOSCz01mAgJ/+P0a/uOD - W8TNRpTzA6bXTfi9mRexZB8E6zzNpf/ZI0Ah+9uic/ECtEwhpa0oAAJ65pH5wAzYRKC6Ffrf0TzX - /ufGfL/A+Z+dy0Rops4eDRLHbPlN1scMSHn8maxWNdHNzfy8CwO5O6r0h2UvibrH2IoCuEgc79ct - WOno5MSj9bD/RXuVnHfBbrqP2hP+raNBc07WvEKkNl48agZ86pSJdRD+ZmzwKsuvJWs/nhpDh/YS - AEAIgfuwy2L+VqsBIU0nkDgBBdzOGjI4o/f+Jn7oQf3qv3PPnzAeAso2bYIMQu/4dtZErTep13gU - Wez5VQYo/KPxCj/gWDkQC9ibAADs/OCYDigrE4C3mJC9Lj/CUBfz/0zpfyXDzMSiDwJnnztjJDhn - Tm/3z1OpgzAQKDqD8QNEYv1FJoMFT50yrnNpo6B57zADgM4NydoEkDX4RPYWJfw4q3jxoQXD65rO - EAC611knW8/ZpSU4Z0xNxjPkVLMlkxGWNEiR8qemBiT8JeYaAmt9ZCO7tR1G41aHHAA0b47s/VZB - QKLtO4IuP1o9AFPgYWT7U6GciE1fjpoxHanmlE8Kjv+9QqbP3kP3UQXhH2e3ETPpIcA0xaaHUvhl - Dm+9rYn/+/6yDggMHgCQJj0Sd2yxZwLI/h79/47mokXC/6saXVMHQP87ktRg1cQhL1R41lZ5o5jT - zxoNAW7MjuCL7i+qkBM/OZqRElMTfhUz1ySsGoCAZ460hhsAkCFaDqwjEDIs9VX4TLiw8MOLK4bX - VMmU/rOvKwgVnjk9Izm3esrpBwm/KpldKFrPP2Zd+3tZfkLhR+JCMiELMN+8GR5034yAA0vXCQAQ - LEQCAQFjAEAatjrSiFUzognp7zGaMksFcMrY+69vuoz5foHTz2KmEJPTzpwz9k1Iuwb11pWnAUv4 - uWetTVL2aH8o/BWx8LvrIfxtBhDsCE2C9pACAIJpf6ZfwNZ0YMXOvinbXxqTFjfBiANCGz/28KIV - 558ZpYc7ODucFOLTzow5B8mpZ0z12sRJ258La/4hsxQ8E6OM/2JX+EParyf8It+WHc3f5rCBJbpv - Cs1Kpm9gBK371hUmJ34zHCd+82K/O3ZunHcIx/t+wfGS59H7HBKci+j8OP/nmtn+oX1dSftaoueq - 6SBV+f+woQYVeu/nbOiQrKfen9TacQ0e/xs3ESjlgK3h53fvyMDmr8hpP3SqtLHHX8csmCf77FcL - zYLpqGlUQEOx6dhP5k4TYVweGvrTLR5yE9r/yUcXLCxSNER7JdSawQScjurgVIDG7wufN5Ogkonw - B1s93tYM8VO6VUxYe1sLAAKeb2Bb6CSsDRkAIFh/PiYI2DBBFAd6Cik/4G/p76lauH+zQwYAngCX - 4k4/ZOjtT2j9Tm9Md5kK/0JmGvSN19bCrEXGM0Rw4UdumuFYcvwpvnd1iEyABAj0GHKEKrNouI3N - W0DesR0emITnIP1+J2IXCMyU6Fuc3v+38TNPGi1e8pnTJ3vZaJkAM/D/UnSe8zvrNSu5y+V8tv8e - z973NP/aABZnLWA1ngbVFH7XvvAjzQzA4QQAKAjYAgSXYbvLfAKgTQIE8a1qAchmjWx9HQBILmSR - wHN/ZwCAyD8QB4lZ/EJz56CWJf77njVycKka+DOGRvhB9J+xlYbPBFA1ByBOKrAfAFlu5QWuL2ji - Z58y0/4nnzoe8/7LEn9Uk4Tk2YCSkmck73som5CciJZ4C3iQwt8DgXdaC0H14tAIv+42NrwMQJUJ - ZEVvo2wgxgqgZoEoQtBbDDZs/6rSOSivQVf4K3tMtYD284a7pt7L/Ew91Pxr67cu/chGCzRIZjDC - 3zRhAMMLAIPwCTCPAaT/XSzonovonNyEmyBczPi5Z42mzZKTPk21f6eSDfc3BACXc5+lfgOmX2CV - 3t8KFfzF9V6S+N03lsn+h9V8p+v6C7+uD2BsYwBACgSyODZAgE239LG9BW0+cNLL+3cyfwByAHBl - zkENoe+/Dhx966n12X6b6V7RVVL43Wy8/TZ8AMnhvsMPADEQsMwCpIkuXY0tiBS4Cecb7Lwq+Dkz - zzUpf2o00EIciu9YBgBX4R66PNBQcAAGmq2CX1xaHLbliN97a4185JBKb2jL+gm/t7V1tf/wOgGF - jkGUaB9tuLZBAz0F7aq53X64jsWGFSobxP3HFHr+66cAd3QKhZDEoSp0pHlavziMwt8DgX+9vZTq - aTB44ffi+qopz+WNxwBS2kEUu9c8HvRgKY2P2GFDl6GFHcfXaqa3gZx40ng/ddgd0D2HWAiimL/E - NAhet30n30vPZSb45PCjpsLU5BJ+629G9QL43//YQYoHdkevo0Gm9xo4AIsbkwHEbE7XThWVzaw3 - WFtrj9KuWRDKqljzIrEW1tLmwGN2NMt6g/TUUqbCf9iRt/b693XMKi8jy3Ga7qtWm9RkZP+zAGAE - bcjNRrIOx4GVDPPxnIQsDc8L+wU+jBr+6/PGi5scX56IFf1Yt/mRxOkn8AuA/AEprd/0tf7Lf1nO - TPAPPyrsQuSFv3oUfZocXJrE77SMIjF45d0Vsu/+035+wOA3HQAo7wUAEAUBU3rLyf5zOUIlAwI2 - LrXwqy/aKVTh9Qzgna+bODdtoQeYBWoAsBoK/kKWq4Rq/aleQRKjepC+2Gxsh//nvSWyz34eKNcH - LARKoBOd5r2BTQCVlZqhCZD8PL+ufTWJutqL+bgTp4zGfXWAe9ZFQkEYrZil8FPBH6X7Ll/zd7jO - 0hI58HArMxDxf99fQMAuPLa0v4YDsJT8wwj6IG8Qb60r0ZzisN8q/WwZv/aSsd1Pjj1h1LhdeNaO - QTkD8M6/SgV/JcvTo4I/ETQG8eL0Ka2PEhGcKtn/sAZ+760VCyCwg2pZL8xWGVIHYA4A7MUZSdNL - pv9Ci4OYQODM4r+9vGzpXD2tOTbUAJCy8Xv/0MXqVPErzy9lfWrk0CPnAiepRPD75zoWAusWS0xg - GwUBNAAQ0FEG5RwApBpLpPGVHI8V3HrFCsUlxxw/2Us9hbCS9bpv0RduqKUcqvFfeWEQgj9BvzRo - OooAbdtR7GeZfOSQGfyvtxcsgkAzQ59Atw24MQMofOABwLwjLjvct/yqHeE/+uOjoRMr/t2dDJN/ - pElBSFYt2fa0DX71hS2DEf7N28MCnRLoubGffY18+GBro8VDn0AZGdbrczZlX0OYAjyWM4AkAPDC - fSAt6/TTlPumQAW/8dqCxXP0HWbqvg2LLMGV/LH/0gtL1fBrLy4M4vFRwfds/Xo8ESfBQiADRoOf - Y/6xLJkCIQh40YFiyARsDSrxtL9OOLnM+mPOAGAz54Gdfintf/N1a4ufHHns1FC2+krfA0p33TIV - /M0DE/5DNs8xtb60g7AwealMxg+wOgY97MW3NQSAtuHhTDJJmQCQRwHANr2k069Daf/f99gT/tJH - 415/KSPJqmRSyAAC597rLy0N6pGRQ0qTPgVO2vrqGj8O8v1jVcm++ze92L5lIPC09iJlBN7wFHVW - Fwh/WSP0192mcwBgMgBVqpwSNC/UV8FvLy9aPrdmymZLnmvWWYB8AKj7zr3XX14ZoOCP+vUPXkMO - JJnPwPopFvrkkI4GFdSSgbDJfAMLoU1eCTVzSSL4XnHUrErzz4T9zx2UmgNArJhHudsPpXTONP7H - stU0VnLE0bf2+tBDBdRWFiBf6Fd9zes4Nfy3lwdam08OLs0ElXddQFQAAIjgpyv4xkIQKOsKHQAI - vDWzIyKkk5HvLoX+lFXPj2Dh66ZzAOABgEigxEDQpP8/jd99w+oCIYcfNRML+WVK42FOJ3qddbzn - rwuDfjzk4ImJkO6XAV2DxIIvA4D0Vgo175ZBXGtC0G0XROUAwJUKF6BZ01OKqvi9t+atL3gvlj0c - 2X5exyJv8ddw65XldRB8GN3PRvCjW5lq5l3hQI0NuYU+h7EcAOwBwWqvE4xVG9cLaYUdZx0Jtc9+ - q+LlV3euy4I9aGJ7mMk3lno2EGEXCr6S8He3ipfZt4FBoCL6z0Iu/CwgEIaLglHYHz54xq7G88do - jaW+uwMdl2V1r/mmyEAF/4gpcuAR/w677IwJW7L3hBtQnMV6pur2kAcCuzag9vf8CuUcAJRBQDYq - zF9sdbLpoDkLC78v/NBsw8FkAdbJYUdmDgJU6Cfpvpuee6PXZLOjmaXIEnzXWgOZjQgCVdkbcgCA - AAF/4VVJ8SDtRUEOOHyULtimPIU16x5+AhA4dPNkJoJ/wOHjdN8dgl/Zblq2VcFPgsBuuo9uAO0/ - hQBl6DkAQIAACRdahRQPVAYBsv9hXc1fSk/OHaq9QQ4pTVgW/F1+vQBE8BHSb82WTWKUJ1TNZHvt - IRN+D6BA9QI5ACgDAXPBVcj4gWC6TPY7tC/8EIrfMS5OMtkDn4fnpzBZlPsfNk73ruBX9IQewUaK - Zd+RtxSCwNSQLlZP+Is5AGRuHiTo8vgBUhAgHz54AnU6LWXa3xlw5V8SBDp6kQ+u4EM1O3eOIIvm - D7QpZzdZ6KFhMgnCsF8F+v4cAOz6Cepk3wO41JBsOigM9YXOLls2v+lAUBd0jJJP3eEsZ5LuMI3P - nMEA7Lq8/gM3/SKfUPCGQfjrKp/JAcC+edAk++6fqiv3TYSOX702llrkqnZuVr0A5b0BK1SbzwAE - v+vcg2v8joIPBA2F4CfZQD10EE6uk/BvRxoNSHIAsA8GY+Fkm/7D2Xf/W5lNPXgaL2tAMM0R2O/Q - FMvxOurQ/d9grz7P8Ylkgj/UW9dBODAg8MwPzwxBmg1J80zAjJxE9KHMhQ+lEeSyA0hEbHI40pk5 - ODBtR/fNYQcdz94MxpTFrkc2EFT2u7uRn38XCNrdNWC7sjD0O8yGu3avSIceaCPf6VZ4A3S3Csq2 - eeMq++E4CQHn/C58TwIc1uPesyoW3dQLoMBveKGHrFWPGTZ1K/xCoS+Hfgcr63ajA8BesikAABME - BOCQlcuDJbAu55cPpsBDAKGN+tN9mhwm4TNKFIT1StZXXg4AGwEQgADA/X/bgi8TdAkA5NvQbLkP - YCg3dzjlRRcA8i0HgHyzKH3ukAJAvuUAkG9DIJm5TOYbcPv/AgwALHXy+OnnkDkAAAAASUVORK5C - YII= - </image> - </surface> -</OBJECT-3D> \ No newline at end of file
--- a/example/scenegraph/xml/task/collision.cpp Sat Nov 14 21:17:02 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ -/** - * 前もって collision する対象を task の global に登録しておく task が必要 - * SceneGraph を読み込んで - * 衝突判定を行う node を確保する - * node の型に対応する collision 関数を呼び出す - * 新しい SceneGraoh を生成する - * 登録してある global を解放する task を用意する - * - */ - -// #define DEBUG -#include "error.h" -#include "scene_graph_pack.h" - -// 本来は tasks.xml に書く -SchedDefineTask(SceneGraphCollision); - -int -move::run(void *rbuf, void *wbuf) -{ - __debug_spe("SceneGraphCollision\n"); - - SceneGraphPackPtr cur = (SceneGraphPack*) rbuf; - int collision_task_id = cur->collision_task; - // next は Mainmemory 上のアドレス - SceneGraphPackPtr next = - (SceneGraphPackPtr)smanager->allocate(sizeof(SceneGraphPack)); - - if (smanager->call_task(collision_task_id, (void*)cur, (void*)next)) { - // 次の状態があって、新しく node を確保してそこを確保する - smanager->write(cur, next, sizeof(SceneGraphPack)); - } else { - // この node は消滅 - smanager->free(next); - } - - return 0; -}
--- a/example/scenegraph/xml/task/collision.h Sat Nov 14 21:17:02 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -#ifndef INCLUDED_CREATE_POLYGON -#define INCLUDED_CREATE_POLYGON - -#ifndef INCLUDED_SCHED_TASK -# include "SchedTask.h" -#endif - -class CreatePolygon : public SchedTask { -public: - SchedConstructor(CreatePolygon); - - int run(void *rbuf, void *wbuf); -}; - -#endif
--- a/example/scenegraph/xml/task/collision_task1.cpp Sat Nov 14 21:17:02 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +0,0 @@ -/** - * node の衝突判定を行う - * - */ - -// #define DEBUG -#include "error.h" -#include "scene_graph_pack.h" - -// 本来は tasks.xml に書く -SchedDefineTask(SceneGraphMove); - -int -move::run(void *rbuf, void *wbuf) -{ - __debug_spe("SceneGraphMove\n"); - - SceneGraphPackPtr cur = (SceneGraphPack*) rbuf; - //SceneGraphPackPtr next = (SceneGraphPackPtr*)wbuf; - SceneGraphPackPtr next = cur; - //memcpy((void*)rbuf, (void*)wbuf, sizeof(SceneGtaphPack)); - - SceneGraphPackPtr col = - (SceneGraphPackPtr*)smanager->global_get(cur->collision); - if (cur->x == col->x) { - next->move_function_id = Next; - } - return 1; -}
--- a/example/scenegraph/xml/task/move.cpp Sat Nov 14 21:17:02 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -/** - * SceneGraph を読み込んで - * node の型に対応する move 関数を呼び出す - * move 関数が無かったら load する - * 新しい SceneGraoh を生成する - * - */ - -// #define DEBUG -#include "error.h" -#include "scene_graph_pack.h" - -// 本来は tasks.xml に書く -SchedDefineTask(SceneGraphMove); - -int -move::run(void *rbuf, void *wbuf) -{ - __debug_spe("SceneGraphMove\n"); - - SceneGraphPackPtr cur = (SceneGraphPack*) rbuf; - int move_task_id = cur->move_task; - // next は Mainmemory 上のアドレス - SceneGraphPackPtr next = - (SceneGraphPackPtr)smanager->allocate(sizeof(SceneGraphPack)); - - if (smanager->call_task(move_task_id, (void*)cur, (void*)next)) { - // 次の状態があって、新しく node を確保してそこを確保する - smanager->write(cur, next, sizeof(SceneGraphPack)); - } else { - // この node は消滅 - smanager->free(next); - } - - return 0; -}
--- a/example/scenegraph/xml/task/move.h Sat Nov 14 21:17:02 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -#ifndef INCLUDED_CREATE_POLYGON -#define INCLUDED_CREATE_POLYGON - -#ifndef INCLUDED_SCHED_TASK -# include "SchedTask.h" -#endif - -class CreatePolygon : public SchedTask { -public: - SchedConstructor(CreatePolygon); - - int run(void *rbuf, void *wbuf); -}; - -#endif
--- a/example/scenegraph/xml/task/move_task1.cpp Sat Nov 14 21:17:02 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,26 +0,0 @@ -/** - * node の状態を変化させる - * - */ - -// #define DEBUG -#include "error.h" -#include "scene_graph_pack.h" - -// 本来は tasks.xml に書く -SchedDefineTask(SceneGraphMove); - -int -move::run(void *rbuf, void *wbuf) -{ - __debug_spe("SceneGraphMove\n"); - - SceneGraphPackPtr cur = (SceneGraphPack*) rbuf; - //SceneGraphPackPtr next = (SceneGraphPackPtr*)wbuf; - SceneGraphPackPtr next = cur; - //memcpy((void*)rbuf, (void*)wbuf, sizeof(SceneGtaphPack)); - - next->x = cur->x + 1; - - return 1; -}
--- a/example/scenegraph/xml/task/tree_walk_collision.cpp Sat Nov 14 21:17:02 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -/*! - tree_walk cell の場合は spe がデータを作成して送り込む - SPE が出力した tree を DMA 転送するのに必要なデータ構造を作成する - - */
--- a/example/scenegraph/xml/task/tree_walk_move.cpp Sat Nov 14 21:17:02 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -/*! - tree_walk cell の場合は spe がデータを作成して送り込む - SPE が出力した tree を DMA 転送するのに必要なデータ構造を作成する - - */ - -// #define DEBUG -#include "error.h" -#include "scene_graph_pack.h" - -// 本来は tasks.xml に書く -SchedDefineTask(TreeWalkMove); - -int -tree_walk_move::run(void *rbuf, void *wbuf) -{ - __debug_spe("TreeWalkMove\n"); - - SceneGraphPackPtr cur = (SceneGraphPack*) rbuf; - //SceneGraphPackPtr next = (SceneGraphPackPtr*)wbuf; - SceneGraphPackPtr next = cur; - //memcpy((void*)rbuf, (void*)wbuf, sizeof(SceneGtaphPack)); - - next->x = cur->x + 1; - - return 1; -}
--- a/example/scenegraph/xml/tasks.xml Sat Nov 14 21:17:02 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -<!-- Cerium Task Configuration - CPU_PPE = 0, // default - CPU_SPE = 1, - SPE_ANY = CPU_SPE, - SPE_0 = 2, - SPE_1 = 3, - SPE_2 = 4, - SPE_3 = 5, - SPE_4 = 6, - SPE_5 = 7, - --> - -<directory> - <path> task </path> - - <target> - <path> spe </path> - <cpu> SPE_ANY </cpu> - <cc cc:compiler="spu-g++"/> - </target> - - <target> - <path> ppe </path> - <cpu> CPU_PPE </cpu> - <cc cc:compiler="ppu-g++"/> - </target> - - <target> - <path> macosx </path> - <cpu> CPU_PPE </cpu> - <cc cc:compiler="mac-g++"/> - </target> - - <target name="linux"> - <path> linux </path> - <cpu> CPU_PPE </cpu> - <cc cc:compiler="linux-g++"/> - </target> - <task name="move"> - <source> move.cpp </source> - - </task> - - <task name="collision"> - <source> collision.cpp </source> - </task> - -</directory> - -<directory> - <path> ${CERIUM}/Renderer/test_render </path> - <task name="Renderer"> - <config> renderer.xml </config> - </task> -</directory>
--- a/example/scenegraph/xml/xml.cpp Sat Nov 14 21:17:02 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <sys/time.h> -#include "TaskManager.h" - -/** - * 2つの XML ファイルを読み込んで、それを表示する。 - * move を使って SceneGraph の値を変える。 - * 1つの型に複数のインスタンスを対応させる。 - * それぞれの型にランダムアクセスする。 - * 型 ID の割り当て。 - */ - -void TMend(void); - -const char *usr_help_str = "Usage: ./test_xml [option]\n \ -options\n\ - -cpu Number of SPE used (default 1)\n\ - -l, --length Sorted number of data (default 1200)\n\ - -h, --help Print this message"; - -int -init(int argc, char **argv) -{ - for (int i = 1; argv[i]; ++i) { - if (strcmp(argv[i], "--length") == 0 || strcmp(argv[i], "-l") == 0) { - length = atoi(argv[++i]); - } - - } - - return 0; -} - -int -TMmain(int argc, char *argv[]) -{ - if (init(argc, argv) < 0) { - return -1; - } - SceneGraphRootPtr sgroot = new SceneGraphRoot(this->width, this->height); - - sgroot->createFromXMLfile("sg/sg-test.xml"); - sgroot->createFromXMLfile("sg/sg-test2.xml"); - - manager->set_TMend(TMend); - -} - -void -TMend(void) -{ -} - -void -load_xml() -{ -} - -static void -test_move(SceneGraphPtr node) -{ -}
--- a/example/share_task/Makefile.macosx Sat Nov 14 21:17:02 2009 +0900 +++ b/example/share_task/Makefile.macosx Sun Nov 15 02:02:30 2009 +0900 @@ -12,6 +12,7 @@ TASK_OBJS = $(TASK_SRCS:.cc=.o) LIBS += -lFifoManager `sdl-config --libs` +CC += -m32 .SUFFIXES: .cc .o
--- a/example/task_queue/Makefile.macosx Sat Nov 14 21:17:02 2009 +0900 +++ b/example/task_queue/Makefile.macosx Sun Nov 15 02:02:30 2009 +0900 @@ -12,6 +12,7 @@ TASK_OBJS = $(TASK_SRCS:.cc=.o) LIBS += -lFifoManager `sdl-config --libs` +CC += -m32 .SUFFIXES: .cc .o
--- a/example/task_queue/main.cc Sat Nov 14 21:17:02 2009 +0900 +++ b/example/task_queue/main.cc Sun Nov 15 02:02:30 2009 +0900 @@ -31,7 +31,7 @@ Queues queues; static void -repeat(void *arg) +repeat(SchedTask *s, void *arg, void *dm) { static int count = 4; QueuePtr q = (QueuePtr) arg; @@ -39,7 +39,7 @@ if (count-->0) { HTask *t = manager->create_task(HELLO_TASK); - t->set_post(repeat, arg); + t->set_post(repeat, arg, 0); t->add_param(q->i); t->add_param((int)arg); t->spawn(); @@ -91,7 +91,7 @@ hello->add_param(i); hello->add_param((int)&queues); - hello->set_post(repeat, (void*) &queues); + hello->set_post(repeat, (void*) &queues, 0); hello->spawn(); }
--- a/example/word_count/Makefile.macosx Sat Nov 14 21:17:02 2009 +0900 +++ b/example/word_count/Makefile.macosx Sun Nov 15 02:02:30 2009 +0900 @@ -12,6 +12,7 @@ TASK_OBJS = $(TASK_SRCS:.cc=.o) LIBS += -lFifoManager `sdl-config --libs` +CC += -m32 .SUFFIXES: .cc .o
--- a/example/word_count3/Makefile.macosx Sat Nov 14 21:17:02 2009 +0900 +++ b/example/word_count3/Makefile.macosx Sun Nov 15 02:02:30 2009 +0900 @@ -12,6 +12,7 @@ TASK_OBJS = $(TASK_SRCS:.cc=.o) LIBS += -lFifoManager `sdl-config --libs` +CC += -m32 .SUFFIXES: .cc .o
--- a/example/word_count3/main.cc Sat Nov 14 21:17:02 2009 +0900 +++ b/example/word_count3/main.cc Sun Nov 15 02:02:30 2009 +0900 @@ -145,7 +145,7 @@ } void -func2(void *p) +func2(SchedTask *s, void *p, void *q) { data_list_t *data = (data_list_t*)p; @@ -175,7 +175,7 @@ } void -func1(void *p) +func1(SchedTask *s, void *p, void *q) { /*receive*/ @@ -255,12 +255,12 @@ if (*data->sum_task_num > 0) { - wait_task->set_post(func1,p); + wait_task->set_post(func1,p, 0); } /* すべての task が終了するのを待つ。*/ else { - wait_task->set_post(func2,p); + wait_task->set_post(func2,p, 0); } /* 16task が終了するのを待つ */ @@ -335,7 +335,7 @@ data->task_list = now; - func1((void*)data); + func1(0, (void*)data, 0); t_print->spawn();