# HG changeset patch # User koba # Date 1256728360 -32400 # Node ID 99a6512a8253dbfe492da77f91599ecd73b4e277 moving from firefly diff -r 000000000000 -r 99a6512a8253 document/presentation/image/SceneGraph.jpg Binary file document/presentation/image/SceneGraph.jpg has changed diff -r 000000000000 -r 99a6512a8253 document/presentation/image/TaskManager.jpg Binary file document/presentation/image/TaskManager.jpg has changed diff -r 000000000000 -r 99a6512a8253 document/presentation/image/autotools.jpg Binary file document/presentation/image/autotools.jpg has changed diff -r 000000000000 -r 99a6512a8253 document/presentation/image/figure/SceneGraph.graffle Binary file document/presentation/image/figure/SceneGraph.graffle has changed diff -r 000000000000 -r 99a6512a8253 document/presentation/image/figure/TaskManager.graffle Binary file document/presentation/image/figure/TaskManager.graffle has changed diff -r 000000000000 -r 99a6512a8253 document/presentation/image/figure/autotools.graffle Binary file document/presentation/image/figure/autotools.graffle has changed diff -r 000000000000 -r 99a6512a8253 document/presentation/semi08_11_21.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/presentation/semi08_11_21.html Wed Oct 28 20:12:40 2009 +0900 @@ -0,0 +1,110 @@ + + + + + +ゼミ資料 08/12/12 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ +
+

並列プログラミングにおける
テストルーチンによる信頼性の向上

+

小林 佑亮

+

琉球大学 工学部 情報工学科

+

No.055722G

+
+ + +
+

研究背景・目的

+
    + +当研究室では学生実験において、PlayStation3を用いた並列的なゲームプログラムの作成を行っている。その際に使用されるのが当研究室で開発したCeriumレンダリングエンジンである。Ceriumを用いたプログラミングでは、Taskの管理やデータの転送など、独自の技術を必要としており、従来のプログラミングに比べその信頼性を確保する事は難しい。
    +
    +本研究ではCppUnitを用いて、学生の作成したプログラム、およびCerium本体の単体テストを行い、その動作を保証することを目的とする。 +
    +
+
+ +
+

Done

+
    +
  • sortプログラムのテスト
  • + +mainでの全てのテストケースの一括表示を + + +
+
+ + +
+

Doing

+
    +
  • 巨大オブジェクトの表示テスト
  • + + + + +
  • Automake/Autoconf
  • + +PS3:libSPEの有無
    +Linux:dlopen,dlcloseなど +
    + +
+
+ + +
+

To Do

+
    +
  • Ceriumを用いたゲーム
  • + +膨大な数のObjectを用いた戦争ゲーム? + + +
  • Game Objectのmove,collision
  • + +... + + +
+
+ +
+ + + diff -r 000000000000 -r 99a6512a8253 document/presentation/semi08_12_12.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/presentation/semi08_12_12.html Wed Oct 28 20:12:40 2009 +0900 @@ -0,0 +1,127 @@ + + + + + +ゼミ資料 08/12/12 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ +
+

並列プログラミングにおける
テストルーチンによる信頼性の向上

+

小林 佑亮

+

琉球大学 工学部 情報工学科

+

No.055722G

+
+ + +
+

研究背景・目的

+
    + +
  • 当研究室では学生実験において、PlayStation3を用いた並列的なゲームプログラムの作成を行っている。
  • +
  • PlayStation3にはCellと呼ばれるCPUが搭載されており、作成したプログラムはCellに最適化させる必要がある。
  • +
  • そこで使用されるのが当研究室で開発したCeriumレンダリングエンジンである。
  • +
  • Ceriumレンダリングエンジンでは、Taskの管理やデータの転送など、Cellの特徴を考えた処理を行っている。
  • +
  • 従来のシーケンシャルなプログラミングに比べて、
  • +
    +
    +
  • 本研究ではCppUnitを用いて、学生の作成したプログラム、およびCerium本体の単体テストを行い、その動作を保証することを目的とする。
  • +
    +
+
+ +
+

Cellの構成

+
    + + +
+
+ +
+

Cellの構成

+
    + + +
+
+ +
+

Ceriumとは

+
    +
  • + +
+
+ +
+

Doing

+
    +
  • SG_marioのテスト
  • + +
+
+ + +
+

SG_marioの処理

+
    + + +
+
+ + +
+

To Do

+
    +
  • Ceriumを用いたゲーム
  • + +膨大な数のObjectを用いた戦争ゲーム? + + +
  • Game Objectのmove,collision
  • + +... + + +
+
+ +
+ + + diff -r 000000000000 -r 99a6512a8253 document/presentation/semi09_01_09.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/presentation/semi09_01_09.html Wed Oct 28 20:12:40 2009 +0900 @@ -0,0 +1,115 @@ + + + + + +ゼミ資料 09/01/09 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ +
+

並列プログラミングにおける
テストルーチンによる信頼性の向上

+

小林 佑亮

+

琉球大学 工学部 情報工学科

+

No.055722G

+
+ + +
+

研究背景・目的

+
    + +
  • 当研究室では学生実験において、PlayStation3を用いた並列的なゲームプログラムの作成を行っている。
  • +
  • PlayStation3にはCellと呼ばれるCPUが搭載されており、作成したプログラムはCellに最適化させる必要がある。
  • +
  • そこで使用されるのが当研究室で開発したCeriumレンダリングエンジンである。
  • +
  • Ceriumには、Taskの管理やデータの転送などを行うTaskManager、オブジェクトのレンダリングを行うRenderingEngine、ゲームの場面(Scene)やルールをTree構造に格納したSceneGraphがある。
  • +
  • Ceriumを用いたプログラムにはTaskやSceneの概念、Cell上でのデータのやりとりなどがある為、期待された動作を保証するのは難しい。
  • +
    +
  • 本研究ではCppUnitを用いて、学生の作成したプログラム、およびCerium本体に対しての単体テストを行う。学生の作成したプログラムに対してはTask単位、Scene単位でのテストを行い、その動作を保証する。
  • +
    +
+
+ + +
+

Doing

+
    +
  • Game_project/ps3/tree_dandy2のCeriumへの移行
  • + +Scene_Graphの適用_doing
    +その他 +
    + +
  • Test
  • + +1つのSceneだけを抜き出すテスト
    +(まずは明らかにおかしい2面ボスシーンを) +
    +
+
+ + +
+

tree_dandy2

+
    +
  • move.c
  • + +
    +void Move()
    +...
    +
    +switch (enemy[tekino].move) {
    +            case 0:
    +                enemy[tekino].x += enemy[tekino].sx;
    +                enemy[tekino].y += enemy[tekino].sy;
    +                break;
    +            case 1:
    +                enemy[tekino].x -= enemy[tekino].sx;
    +                enemy[tekino].y -= enemy[tekino].sy;
    +                break;
    +            case 2:
    +                enemy[tekino].sy -= 0.25;
    +                enemy[tekino].y += enemy[tekino].sy;
    +                break;
    +				...
    +
    +
    +
+
+ +
+ + + diff -r 000000000000 -r 99a6512a8253 document/presentation/semi09_01_16.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/presentation/semi09_01_16.html Wed Oct 28 20:12:40 2009 +0900 @@ -0,0 +1,155 @@ + + + + + +ゼミ資料 09/01/16 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ +
+

並列プログラミングにおける
テストルーチンによる信頼性の向上

+

小林 佑亮

+

琉球大学 工学部 情報工学科

+

No.055722G

+
+ + +
+

研究背景・目的

+
    + +
  • 当研究室では学生実験において、PlayStation3を用いた並列的なゲームプログラムの作成を行っている。
  • +
  • PlayStation3にはCellと呼ばれるCPUが搭載されており、作成したプログラムはCellに最適化させる必要がある。
  • +
  • そこで使用されるのが当研究室で開発したCeriumレンダリングエンジンである。
  • +
  • Ceriumには、Taskの管理やデータの転送などを行うTaskManager、オブジェクトのレンダリングを行うRenderingEngine、ゲームの場面(Scene)やルールをTree構造に格納したSceneGraphがある。
  • +
  • Ceriumを用いたプログラムにはTaskやSceneの概念、Cell上でのデータのやりとりなどがある為、期待された動作を保証するのは難しい。
  • +
    +
  • 本研究ではCppUnitを用いて、学生の作成したプログラム、およびCerium本体に対しての単体テストを行う。学生の作成したプログラムに対してはTask単位、Scene単位でのテストを行い、その動作を保証する。
  • +
    +
+
+ + +
+

TaskManagerとは

+ +TaskManagerは、Taskと呼ばれる分割された各プログラムを管理するライブラリである。 Task同士の依存関係を考慮しながらメモリ上にマッピングし、SPE上ではそのプログラムを DMA転送によりロードする。SPEは256KBという小さなデータ量しか持てず、 大量のプログラムを全てSPE上に置いておく事は出来ない可能性がある。 そのため、必要な時に必要な実行プログラムだけがSPE上にロードされている事が望ましい。(図1) + +TaskManager
+図1:TaskManager +
+
+ + +
+

SceneGraphとは

+ +ゲームの中の一つの場面(Scene)を構成するオブジェクトやその振る舞い、ゲームのルールの集合をSceneGraphとする。SceneGraphのノードは親子関係を持つTreeで構成される。(図2) + + + + +
 SceneGraph + +
    +
  • Vervatim:ポリゴンオブジェクトの頂点座標 +
  • Texture:ポリゴンオブジェクトのテクスチャ座標 +
  • TextureImage:テクスチャイメージ +
  • TransMatrix:ポリゴンオブジェクトの変換行列 +
  • Coordinates:オブジェクトの座標 +
  • Angle:オブジェクトの角度 +
  • Move:自律的なオブジェクトの動き +
  • Collision:他のノードと衝突した時の動き +
+
+
+図2:SceneGraph
+
+親子関係とは、親オブジェクトの回転や平行移動等の行列計算による頂点座標の変更が、子オブジェクトにも反映する関係の事である。これは子に対してスタックに積まれた親の変換行列をかけることで実現出来る。 +
+
+ + +
+

Doing

+
    +
  • Game_project/ps3/tree_dandy2のCeriumへの移行
  • + +Scene_Graphの適用_doing
    +その他 +
    + +
  • Test
  • + +1つのSceneだけを抜き出すテスト
    +(まずは明らかにおかしい2面ボスシーンを) +
    +
+
+ + +
+

tree_dandy2

+
    +
  • move.c
  • + +
    +void Move()
    +...
    +
    +switch (enemy[tekino].move) {
    +            case 0:
    +                enemy[tekino].x += enemy[tekino].sx;
    +                enemy[tekino].y += enemy[tekino].sy;
    +                break;
    +            case 1:
    +                enemy[tekino].x -= enemy[tekino].sx;
    +                enemy[tekino].y -= enemy[tekino].sy;
    +                break;
    +            case 2:
    +                enemy[tekino].sy -= 0.25;
    +                enemy[tekino].y += enemy[tekino].sy;
    +                break;
    +				...
    +
    +
    +
+
+ +
+ + + diff -r 000000000000 -r 99a6512a8253 document/presentation/semi09_04_14.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/presentation/semi09_04_14.html Wed Oct 28 20:12:40 2009 +0900 @@ -0,0 +1,98 @@ + + + + + +ゼミ資料 09/04/14 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ +
+

発表資料

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ +
+

超弾帝の移植

+
    +
  • ソースの修正
  • + +
  • ダメなソース
  • +
    +...
    +  if(node->xyz[0] > screen_w-280) {
    +    node->set_move_collision(boss1_move_left, boss1_collision);
    +  }
    +...
    +
    +
  • 良いソース
  • +
    +#define BOSS1_RIGHT_END screen_w-280
    +...
    +  if(node->xyz[0] > BOSS1_RIGHT_END) {
    +    node->set_move_collision(boss1_move_left, boss1_collision);
    +  }
    +...
    +
    +
    +
    +
  • オブジェクト指向を使いたい
  • +
+
+ +
+

東京で聞いてきました

+
    +
  • 目の動きに合わせて立体的に見える光学技術
  • + +
  • ゲームに応用
  • +
  • 携帯ゲームに
  • +
    +
    +
  • PS3でのプログラミング
  • + +
  • SCEのツールはダメらしい
  • +
  • 各社自前のツールを用意
  • +
    +
  • SEGAの本は読んだ方が良い
  • +
+
+ +
+ + + diff -r 000000000000 -r 99a6512a8253 document/presentation/semi09_05_12.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/presentation/semi09_05_12.html Wed Oct 28 20:12:40 2009 +0900 @@ -0,0 +1,115 @@ + + + + + +ゼミ資料 09/05/12 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ +
+

発表資料

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ +
+

この連休中にできたこと

+ +
    +
  • 1面ボスの基本的な動き
  • +
  • 自機キャラクターの基本的な動きと当たり判定
  • +
  • 自機の出す弾の動きと当たり判定・エフェクト
  • +
+
+ +
+

1面ボス

+ +
    +
  • 3月時の動きの微調整(継続中)
  • +
  • 当たり判定は持ってない
  • +
  • 登場時の演出の関係上、こいつが当たり判定を持っていた方が良い
  • +
    +
  • TO DO
  • +
      +
    • ボスのショットの実装
    • +
    +
+ +
+ +
+

自機キャラクター

+ +
    +
  • 操作の実装・ショットの実装(1種類のみ)
  • +
  • 自分とボスの当たり判定を持っている(ボスが持った方が良い)
  • +
    +
  • TO DO
  • +
      +
    • 左右操作時の旋回モーション
    • +
    • 敵に当たったときの爆発モーション&ゲームオーバー処理
    • +
    +
+ +
+ +
+

自機のショット

+
    +
  • ボスとの当たり判定(敵に実装が良い)
  • +
  • 爆発エフェクトの実装(ちょっと変)
  • +
+
+ +
+

全体的な課題

+
    +
  • オブジェクトの透過処理
  • +
  • ボスや自機の当たり判定の取り方
  • +
      +
    • 自機の当たり判定を小さく
    • +
    • ボスの当たり判定を細かく(ボス2への応用)
    • +
    +
  • scaleの実装(Blenderで大きさを合わせるのは手間)
  • +
+
+ +
+ + + diff -r 000000000000 -r 99a6512a8253 document/presentation/semi09_05_19.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/presentation/semi09_05_19.html Wed Oct 28 20:12:40 2009 +0900 @@ -0,0 +1,130 @@ + + + + + +ゼミ資料 09/05/19 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ +
+

発表資料

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ +
+

今週やった事

+ +
    +
  • アルファ値の検出のテスト
  • +
  • スーパーダンディの微調整
  • +
+
+ +
+

アルファ値の検出テスト

+ +
    +
  • ダンディで確認
  • +
  • テクスチャ画像はPNGを使用
  • +
  • 画像はプレビューで加工
  • +
  • JPEG2000はSDL_imageが未対応(エラーが出る)
  • +
+ +
+ +
+

アルファ値の検出テスト

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SDL_image対応形式
PNG36KB
BMP128KB
GIF11KB(256色)
PNM140KB
PCX84KB
TGA107.8KB
XPM未調査
LBM未調査
JP216KB
+
+
    +
  • JPEG2000に対応させる?
  • +
+
+ +
+

ダンディの微調整

+
    +
  • 爆発エフェクトの挙動の修正
  • +
  • 旋回モーションの実装中…
  • +
+
+ +
+ + + diff -r 000000000000 -r 99a6512a8253 document/presentation/semi09_05_26.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/presentation/semi09_05_26.html Wed Oct 28 20:12:40 2009 +0900 @@ -0,0 +1,73 @@ + + + + + +ゼミ資料 09/05/26 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ +
+

発表資料

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ +
+

今週やった事

+ +今週何もやりませんでした。スイマセン…… +
    +
  • MySQLの設定・コード読み
  • +
  • ファジィアルゴリズムの理解
  • +
+
+ +
+

これからやる予定の事

+
    +
  • Java PathFinderについて詳しく調べる
  • +
  • 他にどんなテストがあるか調べる
  • +
  • リアルタイムで値を変える仕組みを実装してみる
  • +
  • 併行してGUIをどうするか考える(Ceriumを使う?)
  • +
  • ダンディも進める
  • +
+
+ +
+ + + diff -r 000000000000 -r 99a6512a8253 document/presentation/semi09_06_09.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/presentation/semi09_06_09.html Wed Oct 28 20:12:40 2009 +0900 @@ -0,0 +1,108 @@ + + + + + +ゼミ資料 09/06/09 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ +
+

発表資料

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ +
+

今週やった事

+ +
    +
  • ソース読み会
  • +
  • Autotools(Automake/Autoconf)の理解と試行
  • +
+
+ +
+

Autotoolsの基本的な使い方

+ +
    +
  1. autoscan する
  2. +
      +
    • configure.scan が生成される
    • +
    • mv configure.scan configure.in する
    • +
    +
  3. configure.in の編集
  4. +
  5. Makefile.am を作る
  6. +
  7. autoheader で configure.in から config.h.in を作る
  8. +
  9. automake で Makefile.am から Makefile.in を作る
  10. +
  11. autoconf で configure.in から configure を作る
  12. +
  13. configure すると Makefile.in から Makefile, config.h.in から config.h が作られる
  14. +
  15. make で Makefile とconfig.h からTARGET を作り出す。
  16. +
+
+
+ +
+

Autotoolsの基本的な使い方

+
+ +
+
+ +
+

Autotoolsでできること

+
    +
  • コンパイラのチェック
  • +
  • ライブラリのチェック
  • +
  • ヘッダのチェック
  • +
  • 関数のチェック
  • +
  • m4 を用いてautoconf で使えるマクロを定義する事が出来る
  • +
  • autoheaderでソースで使用するマクロを定義する事が出来る
  • +
+
+ +
+

Ceriumでautotoolsを使うに当たって

+
    +
  • libspe2の有無などによって出力するMakefileを変える
  • +
  • LibXXXXManagerは作成するが、各例題はMakefileを作成するに留める
  • +
  • 条件文によってコンパイルするファイルを選択できる
  • +
  • Ceriumの階層構造を見直すかどうか
  • +
+
+ + + diff -r 000000000000 -r 99a6512a8253 document/presentation/semi09_07_07.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/presentation/semi09_07_07.html Wed Oct 28 20:12:40 2009 +0900 @@ -0,0 +1,152 @@ + + + + + +ゼミ資料 09/07/07 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ +
+

発表資料

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ +
+

DOING

+ +
    +
  • 複数の XML から registSceneGraph() で HashTable に登録する機能の実装
  • +
      +
    • HashTable の勉強
    • +
    • コード読み
    • +
    +
+
+ +
+

Approach

+
    +
  • とりあえず SceneGraphPtr を格納する HashTable を作成してみる
  • +
  • registSceneGraph() で HashTable に登録する
  • +
  • createSceneGraph(int id) を変更
  • +
+
+ +
+

HashTableの作成

+
    +
  • TextureHash, spe/TileHashを参考に
  • +
  • とりあえず書いてみる
  • +
  • Hash 関数を考える
  • +
+ +
+ +
+

HashTableの作成

+

実装例

+ +
+int
+SGHash::put(char *sg_name, SceneGraphPtr data)
+{
+    int hashval = hash(sg_name);
+
+    for (int i = 0; i < hashSize/2; i++) {
+        int index = (hashval + i*i)%hashSize;
+
+        if (table[index] == 0) {
+            table[index] = data;
+            return index;
+        }
+    }
+
+}
+
+SceneGraphPtr
+SGHash::get(char *sg_name)
+{
+    int hashval = hash(sg_name);
+
+    for (int i = 0; i < hashSize/2; i++) {
+        int index = (hashval + i*i)%hashSize;
+
+        if (table[index] != NULL &&
+            table[index]->name == sg_name) {
+            return table[index];
+        }
+    }
+
+
+
+ +
+

複数のXMLからHashTableに登録

+
    +
  • 現在の実装
  • + +
    +..
    +
    +  sgroot->createFromXMLfile("xml_file/boss1.xml");
    +  sgroot->createFromXMLfile("xml_file/player1.xml");
    +  sgroot->createFromXMLfile("xml_file/p_shot.xml");
    +  sgroot->createFromXMLfile("xml_file/blast.xml");
    +
    +..
    +
    +
    +
+
+ +
+

今後の課題

+
    +
  • 以下のような記述を使わないような実装
  • + +
    +#define BOSS1 scene_graph
    +#define BOSS1_L scene_graph->next
    +#define BOSS1_R scene_graph->next->next
    +
    +
    +
+
+ + + diff -r 000000000000 -r 99a6512a8253 document/presentation/semi09_09_29.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/presentation/semi09_09_29.html Wed Oct 28 20:12:40 2009 +0900 @@ -0,0 +1,111 @@ + + + + + +ゼミ資料 09/09/29 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ +
+

Cell を用いた
+並列 Game Programming の為の
+Cerium Engine の実装

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ +
+

研究背景・目的

+ +
    +
  • 近年、CPU の性能向上はクロックの限界や発熱問題などからマルチコア化による +性能向上が図られている
  • +
  • マルチコア CPU の中でも、PlayStation3 に搭載されている Cell と呼ばれる CPU は、 +1つの PPE と8つの SPE をもつヘテロジニアス型のマルチコア CPU である
  • +
  • 当研究室では Playstation3 上でのゲーム開発を目的とした Cerium という + Engine を開発している
  • +
  • Cerium にはプログラムを Task 単位で Cell の各アーキテクチャに処理させる TaskManager と + Object をScene 毎に管理する SceneGraph、Object の描画をする RenderingEngine がある
  • +
    +
  • 本研究ではこの Cerium を使った一般的なゲームの作成を実現するための様々な実装を行う
  • +
+
+ +
+

DONE

+
    +
  • OSC 準備 & OSC
  • +
+
+ +
+

DOING

+

超弾帝を移植する為の必要事項の洗い出し

+
    +
  • 状態遷移
  • +
      +
    • property 内のHP等を見てif文 → Move のコードの書き換え?
    • +
    +
  • collision の実装
  • +
      +
    • property の他 Object の座標を見て衝突判定
    • +
    • Dandy なら1つの Object につき敵と自分,弾
    • +
    • 当たったら property 内のフラグが立つ
    • +
    • collision と move は別 SPE で計算?
    • +
    +
  • Object が大量にあった場合
  • +
      +
    • property の検索が必要 → Hash?
    • +
    +
  • 音楽
  • +
  • etc...
  • +
+ +
+ +
+

TODO

+
    +
  • Dandy 移植に向けた Cerium の実装
  • +
  • Cerium 用の Dandy を書く
  • +
+
+ + +
+ + diff -r 000000000000 -r 99a6512a8253 document/presentation/semi09_10_06.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/presentation/semi09_10_06.html Wed Oct 28 20:12:40 2009 +0900 @@ -0,0 +1,103 @@ + + + + + +ゼミ資料 09/10/06 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ +
+

Cell を用いた
+並列 Game Programming の為の
+Cerium Engine の実装

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ +
+

研究背景・目的

+ +
    +
  • 近年、CPU の性能向上はクロックの限界や発熱問題などからマルチコア化による +性能向上が図られている
  • +
  • マルチコア CPU の中でも、PlayStation3 に搭載されている Cell と呼ばれる CPU は、 +1つの PPE と8つの SPE をもつヘテロジニアス型のマルチコア CPU である
  • +
  • 当研究室では Playstation3 上でのゲーム開発を目的とした Cerium という + Engine を開発している
  • +
  • Cerium にはプログラムを Task 単位で Cell の各アーキテクチャに処理させる TaskManager と + Object をScene 毎に管理する SceneGraph、Object の描画をする RenderingEngine がある
  • +
    +
  • 本研究では Cerium の実装として
  • +
      +
    • Test
    • +
    • 音声
    • +
    • MARS
    • +
    +
+
+ +
+

DONE

+
    +
  • Dandy の BMP ファイルを PNG 化 & 透過処理
  • +
+
+ +
+

DOING

+
    +
  • XML ファイルの作成
  • +
      +
    • ボス戦 ver
    • +
    • 1面 ver
    • +
    + +
+
+ +
+

TODO

+
    +
  • 現時点で動く Dandy の作成
  • +
  • 次期 Cerium の仕様に合わせた Dandy の作成
  • +
+
+ + +
+ + diff -r 000000000000 -r 99a6512a8253 document/presentation/semi09_10_20.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/presentation/semi09_10_20.html Wed Oct 28 20:12:40 2009 +0900 @@ -0,0 +1,202 @@ + + + + + +ゼミ資料 09/10/20 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + +
+ + +
+

Cell を用いた
+並列 Programming の為の
+テスト手法の提案

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ + +
+

研究背景・目的

+ +
    +
  • 近年、CPU の性能向上はクロックの限界や発熱問題などからマルチコア化による +性能向上が図られている
  • +
  • マルチコア CPU の中でも、PlayStation3 に搭載されている Cell と呼ばれる CPU は、 +1つの PPE と8つの SPE をもつヘテロジニアス型のマルチコア CPU である
  • +
  • 各 SPE は 256KB の LocalStore(LS) を持ち、 +必要に応じて MainMemory 上の Data を LS に Load して実行する
  • +
  • 並列 Programming における計算の順序性と Cell 独自の仕様により、 +Cell 上での Program の Debug は通常の Program に比べて困難である
  • +
+
+ + +
+

研究背景・目的

+ +
    +
  • 本研究では Cell 上で動く Program の正常な動作を保証するテスト手法を提案する
  • +
  • Program の順序性と PPE, SPE 上での Data 管理の面からテスト手法を考える
  • +
  • 当研究室で開発した Cerium というPlayStation3 上で動作する Engine を用いてテストを行う
  • +
  • Cerium にはプログラムを Task 単位で Cell の各アーキテクチャに処理させる TaskManager と + Object をScene 毎に管理する SceneGraph、Object の描画をする RenderingEngine がある
  • +
+
+ +
+

DONE

+
    +
  • SnowLeopard 上での Cerium 開発環境
  • +
  • Dandy のタイトル画面追加
  • +
+
+ + +
+

SnowLeopard 上でのCerium 開発環境

+

GCC, G++

+
    +
  • default ではgcc-4.2
  • +
  • gcc-4.2 だと cast 等で error
  • +
    +  $sudo mv /usr/bin/gcc /usr/bin/gcc4.2
    +  $sudo mv /usr/bin/g++ /usr/bin/g++4.2
    +  $sudo ln -s /usr/bin/gcc-4.0 /usr/bin/gcc
    +  $sudo ln -s /usr/bin/g++-4.0 /usr/bin/g++
    +
    +
+
+ + +
+

SnowLeopard 上でのCerium 開発環境

+

SDL

+
    +
  • SDL-1.2.13 の Option を変えて Compile
  • +
    +  $env CC='/usr/bin/gcc-4.0' CFLAGS='-isysroot 
    +  /Developer/SDKs/MacOSX10.5.sdk -arch i386'
    +  LDFLAGS='-arch i386' ./configure
    +  --prefix=/sw --without-x
    +  $make
    +  ...
    +
    +
  • うまく行かない…
  • +
  • SDL-1.3 がSnowLeopard で動くらしい
  • +
  • …と思ったら、10月6日に SnowLeopard 対応の SDL-1.2.14 公開
  • +
+
+ + +
+

DOING

+
    +
  • 汎用的な collision 関数の実装
  • +
  • 爆発アニメーションの実装
  • +
  • Blender file の作成
  • +
+
+ + +
+

汎用的な collision 関数の実装

+
+static bool
+collision_judge(SceneGraphIteratorPtr it, SceneGraphPtr myself,
+                int obj_id, int my_radius, int enemy_radius)
+{
+  /* 自分と相手のx,y座標での距離と2点間の距離 */
+  float x_distant, y_distant, distance;
+  SceneGraphPtr enemy;
+
+  for (; it->hasNext(obj_id);) {
+    it->next(obj_id);
+    enemy = it->get();
+
+    x_distant = enemy->xyz[0] - myself->xyz[0];
+    y_distant = enemy->xyz[1] - myself->xyz[1];
+
+    /* hypotf で2点間の距離を求める */
+    distance = hypotf(x_distant, y_distant);
+
+    /* collision 判定 */
+    if(distance < (my_radius+enemy_radius)) {
+      return true;
+    }
+    return false;
+  }
+}
+
+ +
+ + +
+

爆発アニメーションの実装

+
+static void
+blast_move(SceneGraphPtr node, int screen_w, int screen_h)
+{
+  if(node->sgid > BLAST8 && node->frame%blast_interval == 0) {
+    SceneGraphPtr next_blast = sgroot->createSceneGraph(node->sgid-1);
+    next_blast->frame = 1;
+    next_blast->set_move_collision(blast_move, null_collision);
+    node->addBrother(next_blast);
+    node->remove();
+  }
+}
+
+ +
+ + +
+

TODO

+
    +
  • PS3 上でテスト
  • +
  • 引き続き Dandy の実装
  • +
  • example を用いたテスト
  • +
+
+ + + +
+ + diff -r 000000000000 -r 99a6512a8253 document/presentation/semi09_10_20.html~ --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/presentation/semi09_10_20.html~ Wed Oct 28 20:12:40 2009 +0900 @@ -0,0 +1,103 @@ + + + + + +ゼミ資料 09/10/06 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ +
+

Cell を用いた
+並列 Game Programming の為の
+Cerium Engine の実装

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ +
+

研究背景・目的

+ +
    +
  • 近年、CPU の性能向上はクロックの限界や発熱問題などからマルチコア化による +性能向上が図られている
  • +
  • マルチコア CPU の中でも、PlayStation3 に搭載されている Cell と呼ばれる CPU は、 +1つの PPE と8つの SPE をもつヘテロジニアス型のマルチコア CPU である
  • +
  • 当研究室では Playstation3 上でのゲーム開発を目的とした Cerium という + Engine を開発している
  • +
  • Cerium にはプログラムを Task 単位で Cell の各アーキテクチャに処理させる TaskManager と + Object をScene 毎に管理する SceneGraph、Object の描画をする RenderingEngine がある
  • +
    +
  • 本研究では Cerium の実装として
  • +
      +
    • Test
    • +
    • 音声
    • +
    • MARS
    • +
    +
+
+ +
+

DONE

+
    +
  • Dandy の BMP ファイルを PNG 化 & 透過処理
  • +
+
+ +
+

DOING

+
    +
  • XML ファイルの作成
  • +
      +
    • ボス戦 ver
    • +
    • 1面 ver
    • +
    + +
+
+ +
+

TODO

+
    +
  • 現時点で動く Dandy の作成
  • +
  • 次期 Cerium の仕様に合わせた Dandy の作成
  • +
+
+ + +
+ + diff -r 000000000000 -r 99a6512a8253 document/presentation/ui/default/blank.gif Binary file document/presentation/ui/default/blank.gif has changed diff -r 000000000000 -r 99a6512a8253 document/presentation/ui/default/bodybg.gif Binary file document/presentation/ui/default/bodybg.gif has changed diff -r 000000000000 -r 99a6512a8253 document/presentation/ui/default/framing.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/presentation/ui/default/framing.css Wed Oct 28 20:12:40 2009 +0900 @@ -0,0 +1,23 @@ +/* The following styles size, place, and layer the slide components. + Edit these if you want to change the overall slide layout. + The commented lines can be uncommented (and modified, if necessary) + to help you with the rearrangement process. */ + +/* target = 1024x768 */ + +div#header, div#footer, .slide {width: 100%; top: 0; left: 0;} +div#header {top: 0; height: 3em; z-index: 1;} +div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;} +.slide {top: 0; width: 92%; padding: 3.5em 4% 4%; z-index: 2; list-style: none;} +div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;} +div#controls form {position: absolute; bottom: 0; right: 0; width: 100%; + margin: 0;} +#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em; z-index: 10;} +html>body #currentSlide {position: fixed;} + +/* +div#header {background: #FCC;} +div#footer {background: #CCF;} +div#controls {background: #BBD;} +div#currentSlide {background: #FFC;} +*/ diff -r 000000000000 -r 99a6512a8253 document/presentation/ui/default/iepngfix.htc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/presentation/ui/default/iepngfix.htc Wed Oct 28 20:12:40 2009 +0900 @@ -0,0 +1,42 @@ + + + + + \ No newline at end of file diff -r 000000000000 -r 99a6512a8253 document/presentation/ui/default/opera.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/presentation/ui/default/opera.css Wed Oct 28 20:12:40 2009 +0900 @@ -0,0 +1,7 @@ +/* DO NOT CHANGE THESE unless you really want to break Opera Show */ +.slide { + visibility: visible !important; + position: static !important; + page-break-before: always; +} +#slide0 {page-break-before: avoid;} diff -r 000000000000 -r 99a6512a8253 document/presentation/ui/default/outline.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/presentation/ui/default/outline.css Wed Oct 28 20:12:40 2009 +0900 @@ -0,0 +1,15 @@ +/* don't change this unless you want the layout stuff to show up in the outline view! */ + +.layout div, #footer *, #controlForm * {display: none;} +#footer, #controls, #controlForm, #navLinks, #toggle { + display: block; visibility: visible; margin: 0; padding: 0;} +#toggle {float: right; padding: 0.5em;} +html>body #toggle {position: fixed; top: 0; right: 0;} + +/* making the outline look pretty-ish */ + +#slide0 h1, #slide0 h2, #slide0 h3, #slide0 h4 {border: none; margin: 0;} +#slide0 h1 {padding-top: 1.5em;} +.slide h1 {margin: 1.5em 0 0; padding-top: 0.25em; + border-top: 1px solid #888; border-bottom: 1px solid #AAA;} +#toggle {border: 1px solid; border-width: 0 0 1px 1px; background: #FFF;} diff -r 000000000000 -r 99a6512a8253 document/presentation/ui/default/pretty.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/presentation/ui/default/pretty.css Wed Oct 28 20:12:40 2009 +0900 @@ -0,0 +1,86 @@ +/* Following are the presentation styles -- edit away! */ + +body {background: #FFF url(bodybg.gif) -16px 0 no-repeat; color: #000; font-size: 2em;} +:link, :visited {text-decoration: none; color: #00C;} +#controls :active {color: #88A !important;} +#controls :focus {outline: 1px dotted #227;} +h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;} +ul, pre {margin: 0; line-height: 1em;} +html, body {margin: 0; padding: 0;} + +blockquote, q {font-style: italic;} +blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em; text-align: center; font-size: 1em;} +blockquote p {margin: 0;} +blockquote i {font-style: normal;} +blockquote b {display: block; margin-top: 0.5em; font-weight: normal; font-size: smaller; font-style: normal;} +blockquote b i {font-style: italic;} + +kbd {font-weight: bold; font-size: 1em;} +sup {font-size: smaller; line-height: 1px;} + +.slide code {padding: 2px 0.25em; font-weight: bold; color: #533;} +.slide code.bad, code del {color: red;} +.slide code.old {color: silver;} +.slide pre {padding: 0; margin: 0.25em 0 0.5em 0.5em; color: #533; font-size: 90%;} +.slide pre code {display: block;} +.slide ul {margin-left: 5%; margin-right: 7%; list-style: disc;} +.slide li {margin-top: 0.75em; margin-right: 0;} +.slide ul ul {line-height: 1;} +.slide ul ul li {margin: .2em; font-size: 85%; list-style: square;} +.slide img.leader {display: block; margin: 0 auto;} + +div#header, div#footer {background: #005; color: #AAB; + font-family: Verdana, Helvetica, sans-serif;} +div#header {background: #005 url(bodybg.gif) -16px 0 no-repeat; + line-height: 1px;} +div#footer {font-size: 0.5em; font-weight: bold; padding: 1em 0;} +#footer h1, #footer h2 {display: block; padding: 0 1em;} +#footer h2 {font-style: italic;} + +div.long {font-size: 0.75em;} +.slide h1 {position: absolute; top: 0.7em; left: 87px; z-index: 1; + margin: 0; padding: 0.3em 0 0 50px; white-space: nowrap; + font: bold 150%/1em Helvetica, sans-serif; text-transform: capitalize; + color: #DDE; background: #005;} +.slide h3 {font-size: 130%;} +h1 abbr {font-variant: small-caps;} + +div#controls {position: absolute; left: 50%; bottom: 0; + width: 50%; + text-align: right; font: bold 0.9em Verdana, Helvetica, sans-serif;} +html>body div#controls {position: fixed; padding: 0 0 1em 0; + top: auto;} +div#controls form {position: absolute; bottom: 0; right: 0; width: 100%; + margin: 0; padding: 0;} +#controls #navLinks a {padding: 0; margin: 0 0.5em; + background: #005; border: none; color: #779; + cursor: pointer;} +#controls #navList {height: 1em;} +#controls #navList #jumplist {position: absolute; bottom: 0; right: 0; background: #DDD; color: #227;} + +#currentSlide {text-align: center; font-size: 0.5em; color: #449;} + +#slide0 {padding-top: 3.5em; font-size: 90%;} +#slide0 h1 {position: static; margin: 1em 0 0; padding: 0; + font: bold 2em Helvetica, sans-serif; white-space: normal; + color: #000; background: transparent;} +#slide0 h2 {font: bold italic 1em Helvetica, sans-serif; margin: 0.25em;} +#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;} +#slide0 h4 {margin-top: 0; font-size: 1em;} + +ul.urls {list-style: none; display: inline; margin: 0;} +.urls li {display: inline; margin: 0;} +.note {display: none;} +.external {border-bottom: 1px dotted gray;} +html>body .external {border-bottom: none;} +.external:after {content: " \274F"; font-size: smaller; color: #77B;} + +.incremental, .incremental *, .incremental *:after {color: #DDE; visibility: visible;} +img.incremental {visibility: hidden;} +.slide .current {color: #B02;} + + +/* diagnostics + +li:after {content: " [" attr(class) "]"; color: #F88;} + */ \ No newline at end of file diff -r 000000000000 -r 99a6512a8253 document/presentation/ui/default/print.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/presentation/ui/default/print.css Wed Oct 28 20:12:40 2009 +0900 @@ -0,0 +1,1 @@ +/* The following rule is necessary to have all slides appear in print! DO NOT REMOVE IT! */ .slide, ul {page-break-inside: avoid; visibility: visible !important;} h1 {page-break-after: avoid;} body {font-size: 12pt; background: white;} * {color: black;} #slide0 h1 {font-size: 200%; border: none; margin: 0.5em 0 0.25em;} #slide0 h3 {margin: 0; padding: 0;} #slide0 h4 {margin: 0 0 0.5em; padding: 0;} #slide0 {margin-bottom: 3em;} h1 {border-top: 2pt solid gray; border-bottom: 1px dotted silver;} .extra {background: transparent !important;} div.extra, pre.extra, .example {font-size: 10pt; color: #333;} ul.extra a {font-weight: bold;} p.example {display: none;} #header {display: none;} #footer h1 {margin: 0; border-bottom: 1px solid; color: gray; font-style: italic;} #footer h2, #controls {display: none;} /* The following rule keeps the layout stuff out of print. Remove at your own risk! */ .layout, .layout * {display: none !important;} \ No newline at end of file diff -r 000000000000 -r 99a6512a8253 document/presentation/ui/default/s5-core.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/presentation/ui/default/s5-core.css Wed Oct 28 20:12:40 2009 +0900 @@ -0,0 +1,9 @@ +/* Do not edit or override these styles! The system will likely break if you do. */ + +div#header, div#footer, div#controls, .slide {position: absolute;} +html>body div#header, html>body div#footer, + html>body div#controls, html>body .slide {position: fixed;} +.handout {display: none;} +.layout {display: block;} +.slide, .hideme, .incremental {visibility: hidden;} +#slide0 {visibility: visible;} diff -r 000000000000 -r 99a6512a8253 document/presentation/ui/default/slides.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/presentation/ui/default/slides.css Wed Oct 28 20:12:40 2009 +0900 @@ -0,0 +1,3 @@ +@import url(s5-core.css); /* required to make the slide show run at all */ +@import url(framing.css); /* sets basic placement and size of slide components */ +@import url(pretty.css); /* stuff that makes the slides look better than blah */ \ No newline at end of file diff -r 000000000000 -r 99a6512a8253 document/presentation/ui/default/slides.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/presentation/ui/default/slides.js Wed Oct 28 20:12:40 2009 +0900 @@ -0,0 +1,553 @@ +// S5 v1.1 slides.js -- released into the Public Domain +// +// Please see http://www.meyerweb.com/eric/tools/s5/credits.html for information +// about all the wonderful and talented contributors to this code! + +var undef; +var slideCSS = ''; +var snum = 0; +var smax = 1; +var incpos = 0; +var number = undef; +var s5mode = true; +var defaultView = 'slideshow'; +var controlVis = 'visible'; + +var isIE = navigator.appName == 'Microsoft Internet Explorer' && navigator.userAgent.indexOf('Opera') < 1 ? 1 : 0; +var isOp = navigator.userAgent.indexOf('Opera') > -1 ? 1 : 0; +var isGe = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('Safari') < 1 ? 1 : 0; + +function hasClass(object, className) { + if (!object.className) return false; + return (object.className.search('(^|\\s)' + className + '(\\s|$)') != -1); +} + +function hasValue(object, value) { + if (!object) return false; + return (object.search('(^|\\s)' + value + '(\\s|$)') != -1); +} + +function removeClass(object,className) { + if (!object) return; + object.className = object.className.replace(new RegExp('(^|\\s)'+className+'(\\s|$)'), RegExp.$1+RegExp.$2); +} + +function addClass(object,className) { + if (!object || hasClass(object, className)) return; + if (object.className) { + object.className += ' '+className; + } else { + object.className = className; + } +} + +function GetElementsWithClassName(elementName,className) { + var allElements = document.getElementsByTagName(elementName); + var elemColl = new Array(); + for (var i = 0; i< allElements.length; i++) { + if (hasClass(allElements[i], className)) { + elemColl[elemColl.length] = allElements[i]; + } + } + return elemColl; +} + +function isParentOrSelf(element, id) { + if (element == null || element.nodeName=='BODY') return false; + else if (element.id == id) return true; + else return isParentOrSelf(element.parentNode, id); +} + +function nodeValue(node) { + var result = ""; + if (node.nodeType == 1) { + var children = node.childNodes; + for (var i = 0; i < children.length; ++i) { + result += nodeValue(children[i]); + } + } + else if (node.nodeType == 3) { + result = node.nodeValue; + } + return(result); +} + +function slideLabel() { + var slideColl = GetElementsWithClassName('*','slide'); + var list = document.getElementById('jumplist'); + smax = slideColl.length; + for (var n = 0; n < smax; n++) { + var obj = slideColl[n]; + + var did = 'slide' + n.toString(); + obj.setAttribute('id',did); + if (isOp) continue; + + var otext = ''; + var menu = obj.firstChild; + if (!menu) continue; // to cope with empty slides + while (menu && menu.nodeType == 3) { + menu = menu.nextSibling; + } + if (!menu) continue; // to cope with slides with only text nodes + + var menunodes = menu.childNodes; + for (var o = 0; o < menunodes.length; o++) { + otext += nodeValue(menunodes[o]); + } + list.options[list.length] = new Option(n + ' : ' + otext, n); + } +} + +function currentSlide() { + var cs; + if (document.getElementById) { + cs = document.getElementById('currentSlide'); + } else { + cs = document.currentSlide; + } + cs.innerHTML = '' + snum + '<\/span> ' + + '\/<\/span> ' + + '' + (smax-1) + '<\/span>'; + if (snum == 0) { + cs.style.visibility = 'hidden'; + } else { + cs.style.visibility = 'visible'; + } +} + +function go(step) { + if (document.getElementById('slideProj').disabled || step == 0) return; + var jl = document.getElementById('jumplist'); + var cid = 'slide' + snum; + var ce = document.getElementById(cid); + if (incrementals[snum].length > 0) { + for (var i = 0; i < incrementals[snum].length; i++) { + removeClass(incrementals[snum][i], 'current'); + removeClass(incrementals[snum][i], 'incremental'); + } + } + if (step != 'j') { + snum += step; + lmax = smax - 1; + if (snum > lmax) snum = lmax; + if (snum < 0) snum = 0; + } else + snum = parseInt(jl.value); + var nid = 'slide' + snum; + var ne = document.getElementById(nid); + if (!ne) { + ne = document.getElementById('slide0'); + snum = 0; + } + if (step < 0) {incpos = incrementals[snum].length} else {incpos = 0;} + if (incrementals[snum].length > 0 && incpos == 0) { + for (var i = 0; i < incrementals[snum].length; i++) { + if (hasClass(incrementals[snum][i], 'current')) + incpos = i + 1; + else + addClass(incrementals[snum][i], 'incremental'); + } + } + if (incrementals[snum].length > 0 && incpos > 0) + addClass(incrementals[snum][incpos - 1], 'current'); + ce.style.visibility = 'hidden'; + ne.style.visibility = 'visible'; + jl.selectedIndex = snum; + currentSlide(); + number = 0; +} + +function goTo(target) { + if (target >= smax || target == snum) return; + go(target - snum); +} + +function subgo(step) { + if (step > 0) { + removeClass(incrementals[snum][incpos - 1],'current'); + removeClass(incrementals[snum][incpos], 'incremental'); + addClass(incrementals[snum][incpos],'current'); + incpos++; + } else { + incpos--; + removeClass(incrementals[snum][incpos],'current'); + addClass(incrementals[snum][incpos], 'incremental'); + addClass(incrementals[snum][incpos - 1],'current'); + } +} + +function toggle() { + var slideColl = GetElementsWithClassName('*','slide'); + var slides = document.getElementById('slideProj'); + var outline = document.getElementById('outlineStyle'); + if (!slides.disabled) { + slides.disabled = true; + outline.disabled = false; + s5mode = false; + fontSize('1em'); + for (var n = 0; n < smax; n++) { + var slide = slideColl[n]; + slide.style.visibility = 'visible'; + } + } else { + slides.disabled = false; + outline.disabled = true; + s5mode = true; + fontScale(); + for (var n = 0; n < smax; n++) { + var slide = slideColl[n]; + slide.style.visibility = 'hidden'; + } + slideColl[snum].style.visibility = 'visible'; + } +} + +function showHide(action) { + var obj = GetElementsWithClassName('*','hideme')[0]; + switch (action) { + case 's': obj.style.visibility = 'visible'; break; + case 'h': obj.style.visibility = 'hidden'; break; + case 'k': + if (obj.style.visibility != 'visible') { + obj.style.visibility = 'visible'; + } else { + obj.style.visibility = 'hidden'; + } + break; + } +} + +// 'keys' code adapted from MozPoint (http://mozpoint.mozdev.org/) +function keys(key) { + if (!key) { + key = event; + key.which = key.keyCode; + } + if (key.which == 84) { + toggle(); + return; + } + if (s5mode) { + switch (key.which) { + case 10: // return + case 13: // enter + if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return; + if (key.target && isParentOrSelf(key.target, 'controls')) return; + if(number != undef) { + goTo(number); + break; + } + case 32: // spacebar + case 34: // page down + case 39: // rightkey + case 40: // downkey + if(number != undef) { + go(number); + } else if (!incrementals[snum] || incpos >= incrementals[snum].length) { + go(1); + } else { + subgo(1); + } + break; + case 33: // page up + case 37: // leftkey + case 38: // upkey + if(number != undef) { + go(-1 * number); + } else if (!incrementals[snum] || incpos <= 0) { + go(-1); + } else { + subgo(-1); + } + break; + case 36: // home + goTo(0); + break; + case 35: // end + goTo(smax-1); + break; + case 67: // c + showHide('k'); + break; + } + if (key.which < 48 || key.which > 57) { + number = undef; + } else { + if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return; + if (key.target && isParentOrSelf(key.target, 'controls')) return; + number = (((number != undef) ? number : 0) * 10) + (key.which - 48); + } + } + return false; +} + +function clicker(e) { + number = undef; + var target; + if (window.event) { + target = window.event.srcElement; + e = window.event; + } else target = e.target; + if (target.getAttribute('href') != null || hasValue(target.rel, 'external') || isParentOrSelf(target, 'controls') || isParentOrSelf(target,'embed') || isParentOrSelf(target,'object')) return true; + if (!e.which || e.which == 1) { + if (!incrementals[snum] || incpos >= incrementals[snum].length) { + go(1); + } else { + subgo(1); + } + } +} + +function findSlide(hash) { + var target = null; + var slides = GetElementsWithClassName('*','slide'); + for (var i = 0; i < slides.length; i++) { + var targetSlide = slides[i]; + if ( (targetSlide.name && targetSlide.name == hash) + || (targetSlide.id && targetSlide.id == hash) ) { + target = targetSlide; + break; + } + } + while(target != null && target.nodeName != 'BODY') { + if (hasClass(target, 'slide')) { + return parseInt(target.id.slice(5)); + } + target = target.parentNode; + } + return null; +} + +function slideJump() { + if (window.location.hash == null) return; + var sregex = /^#slide(\d+)$/; + var matches = sregex.exec(window.location.hash); + var dest = null; + if (matches != null) { + dest = parseInt(matches[1]); + } else { + dest = findSlide(window.location.hash.slice(1)); + } + if (dest != null) + go(dest - snum); +} + +function fixLinks() { + var thisUri = window.location.href; + thisUri = thisUri.slice(0, thisUri.length - window.location.hash.length); + var aelements = document.getElementsByTagName('A'); + for (var i = 0; i < aelements.length; i++) { + var a = aelements[i].href; + var slideID = a.match('\#slide[0-9]{1,2}'); + if ((slideID) && (slideID[0].slice(0,1) == '#')) { + var dest = findSlide(slideID[0].slice(1)); + if (dest != null) { + if (aelements[i].addEventListener) { + aelements[i].addEventListener("click", new Function("e", + "if (document.getElementById('slideProj').disabled) return;" + + "go("+dest+" - snum); " + + "if (e.preventDefault) e.preventDefault();"), true); + } else if (aelements[i].attachEvent) { + aelements[i].attachEvent("onclick", new Function("", + "if (document.getElementById('slideProj').disabled) return;" + + "go("+dest+" - snum); " + + "event.returnValue = false;")); + } + } + } + } +} + +function externalLinks() { + if (!document.getElementsByTagName) return; + var anchors = document.getElementsByTagName('a'); + for (var i=0; i' + + '