# HG changeset patch # User gongo@gendarme.cr.ie.u-ryukyu.ac.jp # Date 1234433102 -32400 # Node ID 401b55a4a4dd7a41fcb6a429be338180499d9892 # Parent c254a2bd1b348b09a1ad775e2be1c26c8c940767 add Random class diff -r c254a2bd1b34 -r 401b55a4a4dd TaskManager/ChangeLog --- a/TaskManager/ChangeLog Thu Feb 12 16:31:38 2009 +0900 +++ b/TaskManager/ChangeLog Thu Feb 12 19:05:02 2009 +0900 @@ -1,3 +1,10 @@ +2009-02-12 Wataru MIYAGUNI + + * add: kernel/ppe/Random.cc + 乱数生成クラス。 + ゲームだとユーザ使うでしょうきっと。 + 一応 /dev/random から seed 取る様にしてます + 2009-02-04 Wataru MIYAGUNI * kernel/ppe/TaskManager.cc (TaskManager::allocate): rename diff -r c254a2bd1b34 -r 401b55a4a4dd TaskManager/Test/test_render/SceneGraph.cpp --- a/TaskManager/Test/test_render/SceneGraph.cpp Thu Feb 12 16:31:38 2009 +0900 +++ b/TaskManager/Test/test_render/SceneGraph.cpp Thu Feb 12 19:05:02 2009 +0900 @@ -738,12 +738,29 @@ this->last = next; } +/** + * SceneGraph の clone + * @return clone SceneGraph + */ SceneGraphPtr SceneGraph::clone(void) { SceneGraphPtr p = new SceneGraph(this); return p; } +/** + * SceneGraph の clone + * 予め allocate されてる領域への placement new を行う + * + * @param buf clone 領域 + * @return clone SceneGraph + */ +SceneGraphPtr +SceneGraph::clone(void *buf) { + SceneGraphPtr p = new(buf) SceneGraph(this); + return p; +} + void SceneGraph::remove(void) { diff -r c254a2bd1b34 -r 401b55a4a4dd TaskManager/Test/test_render/SceneGraph.h --- a/TaskManager/Test/test_render/SceneGraph.h Thu Feb 12 16:31:38 2009 +0900 +++ b/TaskManager/Test/test_render/SceneGraph.h Thu Feb 12 19:05:02 2009 +0900 @@ -69,6 +69,7 @@ SceneGraphPtr addChild(SceneGraphPtr child); SceneGraphPtr addBrother(SceneGraphPtr bro); SceneGraphPtr clone(void); + SceneGraphPtr clone(void *buf); SceneGraphPtr searchSceneGraph(char *name); void set_move_collision(SceneGraphPtr node, move_func new_move, collision_func new_collision); diff -r c254a2bd1b34 -r 401b55a4a4dd TaskManager/Test/test_render/SceneGraphArray.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/Test/test_render/SceneGraphArray.h Thu Feb 12 19:05:02 2009 +0900 @@ -0,0 +1,45 @@ +#ifndef INCUDED_SCENE_GRAPH_ARRAY +#define INCUDED_SCENE_GRAPH_ARRAY + +#ifndef INCLUDED_SCENE_GRAPH +# include "SceneGraph.h" +#endif + +// 下ですぐ #undef してます +#define MAX_SIZE 32 + +class SceneGraphArray { +public: + SceneGraph buf[MAX_SIZE]; + int size; + int pad[3]; + + SceneGraphArray(void) : size(0) {} + + /** + * array の初期化 + */ + void init(void) { + size = 0; + } + + /** + * buf から SceneGraph buffer を返す + * + * @retval SceneGraph if size < MAX_SIZE + * @retval NULL if size >= MAX_SIZE + */ + SceneGraphPtr getNext(void) { + if (size >= MAX_SIZE) { + return NULL; + } else { + return &buf[size++]; + } + } +}; + +typedef SceneGraphArray *SceneGraphArrayPtr; + +#undef MAX_SIZE + +#endif diff -r c254a2bd1b34 -r 401b55a4a4dd TaskManager/Test/test_render/SceneGraphRoot.h --- a/TaskManager/Test/test_render/SceneGraphRoot.h Thu Feb 12 16:31:38 2009 +0900 +++ b/TaskManager/Test/test_render/SceneGraphRoot.h Thu Feb 12 19:05:02 2009 +0900 @@ -5,6 +5,10 @@ # include "SceneGraph.h" #endif +#ifndef INCLUDED_SCENE_GRAPH_ARRAY +# include "SceneGraphArray.h" +#endif + #ifndef INCLUDED_CAMERA # include "Camera.h" #endif @@ -36,6 +40,10 @@ // draw_tree は描画後削除される SceneGraphPtr sg_remove_list; + SceneGraphArrayPtr sg_array1; + SceneGraphArrayPtr sg_array2; + SceneGraphArrayPtr sg_curArray; + // コントローラーオブジェクト (Keyboard, Joystick, ..) Pad *controller; diff -r c254a2bd1b34 -r 401b55a4a4dd TaskManager/Test/test_render/task/DrawSpan.cpp --- a/TaskManager/Test/test_render/task/DrawSpan.cpp Thu Feb 12 16:31:38 2009 +0900 +++ b/TaskManager/Test/test_render/task/DrawSpan.cpp Thu Feb 12 19:05:02 2009 +0900 @@ -531,7 +531,8 @@ tileList = (TileListPtr)smanager->global_get(GLOBAL_TILE_LIST); zRow = zRow_init(rangex, rangey); - linebuf = linebuf_init(rangex, rangey, 0xffffffff); + //linebuf = linebuf_init(rangex, rangey, 0xffffffff); + linebuf = linebuf_init(rangex, rangey, 0); doneWrite = 0; diff -r c254a2bd1b34 -r 401b55a4a4dd TaskManager/Test/test_render/viewer.cpp --- a/TaskManager/Test/test_render/viewer.cpp Thu Feb 12 16:31:38 2009 +0900 +++ b/TaskManager/Test/test_render/viewer.cpp Thu Feb 12 19:05:02 2009 +0900 @@ -44,7 +44,7 @@ } int -Viewer::get_ticks() +Viewer::get_ticks(void) { int time; time = SDL_GetTicks(); @@ -52,7 +52,7 @@ } bool -Viewer::quit_check() +Viewer::quit_check(void) { SDL_Event event; @@ -72,13 +72,13 @@ } void -Viewer::quit() +Viewer::quit(void) { SDL_Quit(); } void -Viewer::swap_buffers() +Viewer::swap_buffers(void) { SDL_GL_SwapBuffers(); } diff -r c254a2bd1b34 -r 401b55a4a4dd TaskManager/kernel/ppe/Random.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/kernel/ppe/Random.cc Thu Feb 12 19:05:02 2009 +0900 @@ -0,0 +1,35 @@ +#include +#include +#include "Random.h" + +/** + * /dev/random から取得した値を seed として使う + */ +Random::Random(void) +{ + FILE *fp; + unsigned int seed; + + if ((fp = fopen("/dev/random", "r")) == NULL) { + seed = 12345; + } else { + fread(&seed, sizeof(unsigned int), 1, fp); + fclose(fp); + } + + srandom(seed); +} + +/** + * 引数で seed を指定する + */ +Random::Random(unsigned int seed) +{ + srandom(seed); +} + +int +Random::getData(void) +{ + return random(); +} diff -r c254a2bd1b34 -r 401b55a4a4dd TaskManager/kernel/ppe/TaskManager.cc --- a/TaskManager/kernel/ppe/TaskManager.cc Thu Feb 12 16:31:38 2009 +0900 +++ b/TaskManager/kernel/ppe/TaskManager.cc Thu Feb 12 19:05:02 2009 +0900 @@ -1,10 +1,14 @@ #include "TaskManager.h" -TaskManager::TaskManager(int num) : machineNum(num) {} +TaskManager::TaskManager(int num) : machineNum(num) +{ + gen_random = new Random; +} TaskManager::~TaskManager(void) { delete m_impl; + delete gen_random; } /** @@ -75,3 +79,9 @@ { return machineNum; } + +int +TaskManager::get_random(void) +{ + return gen_random->getData(); +} diff -r c254a2bd1b34 -r 401b55a4a4dd include/TaskManager/Random.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/TaskManager/Random.h Thu Feb 12 19:05:02 2009 +0900 @@ -0,0 +1,14 @@ +#ifndef INCLUDED_RANDOM +#define INCLUDED_RANDOM + +class Random { +public: + Random(void); + Random(unsigned int seed); + + int getData(void); +}; + +typedef Random *RandomPtr; + +#endif diff -r c254a2bd1b34 -r 401b55a4a4dd include/TaskManager/TaskManager.h --- a/include/TaskManager/TaskManager.h Thu Feb 12 16:31:38 2009 +0900 +++ b/include/TaskManager/TaskManager.h Thu Feb 12 19:05:02 2009 +0900 @@ -5,6 +5,10 @@ # include "TaskManagerImpl.h" #endif +#ifndef INCLUDED_RANDOM +# include "Random.h" +#endif + class TaskManager { public: /* constructor */ @@ -14,6 +18,7 @@ /* variables */ TaskManagerImpl *m_impl; void (*tm_end)(void); + RandomPtr gen_random; /* user function */ HTaskPtr create_task(int cmd); @@ -21,6 +26,7 @@ void *allocate(int size); void set_TMend(void (*endf)(void)); int get_cpuNum(void); + int get_random(void); /* functions */ void init(void);