2010-8-6 Shinji Kono Renderer Engine の task の下に user task を置くのは反則だろ? 問題は、User program の方で、どうやって、task_init するかだが、 PPE側は自分でやって問題ない。SPE側が困る。 やはり、main memory 上のtask listをSPEが自分で読み出すと言う 方式が合理的だと思われる。get_segment で良いしね。ただ、可変長 にしないとダメだが... 2^n allocator with compaction が必要か? 必ず ppe/spe task があるわけだから、task_list はppe/speで一つ でも良い。少なくとも設定は一ヶ所が望ましい。object search path があれば良い。 task_list を main memory に置くのは良いが、spe task のentry point が決まらないと言う問題がある。 2009-12-19 Shinji Kono SgChange/viewer は大域変数使いすぎ。禁止って言ったのに。 linda api は、federated linda 対応でないものが使われている。 対応したものは、どこにあるんだろう? 他の例題いじるのは、自分の例題を動かしてからにして欲しい。 まぁねぇ。Pipeline execution するのに、sgpack とかも Pipeline buffer にするのは気づかないものなんだろうな... なくても、動かないことは ないのか。 viewer.cc の大域変数を落すところから始めるべきか? 2009-11-15 Shinji Kono DrawSpan は, Start DrawSpan region (allocate Z buffer) DrawSpan / for each SpanPack add_inData End DrawSpan region (Write frame buffer,free Z buffer) add_outData みたいにしたい. CreateSpan は,SpanPack を入れ換えているようだが, SpanPack は,ランダムに書きだし, PPU 側で,それをsortする. と言う方がよい? ほぼ毎回入れ換えているんじゃないの? 2009-11-14 Shinji Kono DrawSpan の dma_write を追放。なんでこんなになっていたかは謎。 これで、renew Task を落とせます。 2009-08-06 Shinji Kono DrawSpan の reboot/ TASK_DRAW_SPAN2 は、使ってないのね。 2009-03-29 Wataru MIYAGUNI * Makefile SGlist.{cpp,h} を make clean で消去し、 make で自動生成するようにしました。 けどなんか他のファイルと同じ書きかたしても 上手く行かなかった。何か見落としてるかもしれない。誰か直(ry 2009-02-12 Wataru MIYAGUNI * task/CreatePolygonFromSceneGraph.cpp (CreatePolygonFromSceneGraph::run): fix 下にあわせる様に * SceneGraph.cpp (SceneGraph::SceneGraph, SceneGraph::init) (SceneGraph::finalize_original): fix 今まで、Polygon が持つ vertex, normal, texture coordinate ってのが --------------------------------------- data = | vertex | normal | texture | sizeof(data) = size*3 --------------------------------------- \ size / \ size / \ size / てな感じで、SceneGraph->data の中に 3 つ入ってたわけです。 これだと、アクセスする時にどれがどれかわからんくなるし、 ソース読む時に迷う(経験談)ので、data を消して、代わりに coord_xyz, normal, coord_tex を作りました。 * polygon.cpp (Polygon::pickup_coordinate) (Polygon::pickup_normal, Polygon::pickup_texture): 2009-02-10 Wataru MIYAGUNI * Makefile.macosx (depend): fix depend.inc とかを吐き出す様にしました * Camera.cpp (Camera::Camera, Camera::updateView) (Camera::updatePerspective, Camera::updateScreen) (Camera::update): fix なんとかカメラできてるっぽいです。 Perspective とかも聞いてるし、中心に向かって遠くなってる。 あとは行列演算をもうちょいこぎれいにすればいい感じかなー。 残りは、ユーザ側からの設定。例えば 1. 車の運転席目線(FPS) 2. 車の後ろから(TPS) 3. 車の前から(SPS) 的なのを、ユーザが CameraData みたいな構造体に zd とか yd とかを設定して camera->set(data) とかやれば 反映するみたいな!みたいな! 2009-02-09 Wataru MIYAGUNI * SceneGraphRoot.cpp (SceneGraphRoot::allExecute) (SceneGraphRoot): fix SceneGraph を root から走査していきながら その都度コピーしていき、最終的に全体の新しい SceneGraph ができる。 削除されていればコピーしない、っていうのは簡単だけど 追加された場合、コピー元に追加されるのは困るので コピーしたやつに追加って形にしたら今のコードになった。 めんどくさいっちゃめんどくさい。もっと綺麗な書き方あるかね 2009-02-01 Wataru MIYAGUNI * SceneGraph.cpp (SceneGraph::SceneGraph) (SceneGraph::SceneGraph, SceneGraph::SceneGraph) (SceneGraph::finalize_original, SceneGraph) (SceneGraph::finalize_copy): add, fix 今のところ、SceneGraph の作られ方は a1. xml ファイルから生成 (sgid 毎、sg_src[] に格納) a2. ID を指定し、sg_src[id] の SceneGraph を複製 a3. xml も ID も指定しない、何も表示しない SceneGraph a1 の時はポリゴンデータ(data[])を生成するわけだけど、 a2 でも、オリジナルと同じ data[] を持つ必要は(今は)ない。 なので、a2 の場合、data[] は a1 と同じ場所を指せば良い。 しかし、今までは、SceneGraph::~SceneGraph では どんな SceneGraph でも delete [] data; とかやってたので、それならということで b1. a1 用の、Desturctor で data[] を delete する finalize_original() b2. a2,a3 用の、data[] を削除しない finalize_copy() を用意し、a1,a2,a3 の Consturoctor で、どっちかを設定する。 2009-01-30 Wataru MIYAGUNI * spe/DrawSpan.cpp (DrawSpan::drawDot1): add span->length_x == 1 の処理。 (DrawSpan::drawDot2): add Dot1 の続き。要は Dot1 で load して、Dot2 で wait->書き込みって感じ しかし、1ドットだとそこまで待つ必要もないかなって感じなので 今は Dot 2には何も書いてない。ちゃんとしらべて、必要そうだったら ここで書き込みを行う (DrawSpan::drawLine1): add span->length_x > 1 の処理。 いくつか Load パターンを考えてる途中 1. 全部 load 1. z buf で描きこむと判断したとき、その pixel の texture tile を load する。(すでにある、ないに関わらず。ある場合は、実際には Load の処理は行われないが) 2. Line2 で描画する(ここで使う tile はすでに全部読み込まれてるとする 2. 無い物だけload 1. 書き込むと判断したとき、tile があるかどうかを調べ あればそのまま linebuf に、無ければ load を掛けて continue; このとき、load した(つまりまだ書き込まれてない) 場所を覚えておく 2. Line2 で、1. で覚えた場所から再び計算して描画する。 tile はすでに全部読み込まれているとする まだあったけど忘れた。 今のところ描画領域が 256x8、もしくは512x8 で、 単純に考えて、領域pixel と texture pixel が一緒だと考えると 一個の Span で最大 64 (512/8) 個の tile があればいいと考えられる。 一個の SPE には Tile を 128 個持っておけるし、 今は Span を二つ平行して処理しているので、 途中で Tile が足りなくなる!ってことはないはず。 とまあ、いろいろ考えてたんだけど、何書けばいいのか忘れた。。 思い出したらまた書きます。 2009-01-26 Wataru MIYAGUNI * spe/CreateSpan.cpp (CreateSpan::run): fix ポリゴンをx軸に水平に分割し、その二つを計算するってのが half_triangelで、上としたで、何故か渡すテクスチャの情報が違う。 なんでだろうと思いつつも、今まで特に問題が出なかったから無視してたが、 今回、三つのSceneGraph を動かしてる時に問題発生。 それぞれ違うテクスチャを貼ってるのに、なぜかそれらのうちの半分が 別のテクスチャが貼られていた。簡単に言うと、A,B,C の SG があった。 A: 正常 B: 右上だけ A のテクスチャ C: 右上だけ A のテクスチャ といった具合。わけがわからなかったんだが、 half_triangle に渡すやつの所為だと気づきました なんでここだけ pp->tri[0].tex_info.addr とか渡してんのか未だに謎。 単なる書き間違いか直し間違いか。微妙なところ。 これ書いた後輩はもう居ない * SceneGraphIterator.cpp (SceneGraphIterator::hasNext) (SceneGraphIterator::next): fix 検索する引数を int id に変更。 * SceneGraph.h (class SceneGraph): add variable int flag_drawbale : この SceneGraph は描画する物かどうか int sgid : SceneGraph の ID 。ID は SGList.h にあるものを使う * SceneGraphIterator.cpp : add file SceneGraph を走査する用。 基本、Java の Iterator を参考にしてます。 追加機能としては - hasNext(const char* name); 名前が name の SceneGraph があるかどうか - next(const char* name); 名前が name の SceneGraph まで進ませる * SceneGraphIterator.cpp : TODO hasNext とかは名前じゃなくて ID が良いかなーとも思うけどね。 てかその方がいいな。あとで直します * ieshoot.cpp (ieboss_move): add (ieboss_collision): add BOSSの動きを追加。 IETAMA が数回衝突したら BOSS を消すって処理。 * SceneGraphIterator.cpp (SceneGraphIterator::next): fix break してなかった。そりゃ取れないわ * SceneGraph.cpp (SceneGraph::realRemoveFromTree): fix < p1 = p1->next; < p = p->next; ===== > p1 = p1->brother; > p = p->brother; * viewer.cpp (Viewer::run_draw): fix Spanの無い部分を塗りつぶす処理はタスクを走らせず、 そのまま memset とかの方が早い。 まとめてするタスクを立ち上げるってのもいいかもしれない。 あと、memsetで指定する値が、0xFF と 0x00 とで速度が違う。 universe だと、 0xFF 24fps 0x00 30fps なんだろう。0x00 だと、ただのクリアになるから速いってことかな。 * Camera.h (class Camera): add とりあえず Camera を作って、これを SceneGraph の Top にした。 * SceneGraph.cpp (SceneGraph::realRemoveFromTree): add realRemove() の Tree構造用。削除後の tree top を返す様にしている。 まあ top が消えなければ返す必要も無いし、top が消えるってことは SceneGraph そのものが消えるってことでそうは無い・・はずだけどね。 (SceneGraph::realRemoveFromList): add realRemove() の list用。削除後の list top を返す様にしている。 (SceneGraph::realRemoveFromTree): fix < p->next = p1->next; === > p->brother = p1->brother; 2009-01-25 Wataru MIYAGUNI * add (tools/create_sglist): new 必要な SceneGraph xml file から SceneGraph を抽出し、 名前と対応する ID を SGList.h に出力する。 また、名前から ID を求める sglist_table を SGList.cpp に出力する。 * SceneGraph.cpp (SceneGraph::remove): add User API。ここで削除するのではなく、まずはフラグを立てるだけ ここですぐに消すと、allExecute() の走査で何気に困る (SceneGraph::isRemoved): add この SceneGraph 削除フラグが立っているかどうか (SceneGraph::realRemove): TODO 子を持つ SceneGraph が消された場合、 その子孫を全て削除するかどうか。まあ削除するのかな。 (SceneGraph::realRemove): add Cerium System で呼ばれる。 remove flag の立った SceneGraph を削除する。 parentやbrother、next は繋ぎ直す。 * SceneGraphRoot.cpp (SceneGraphRoot::addNext): add sg_available_list に追加していく 木の操作が要らないアクセスの際にはこっちの方がいい。 (SceneGraphRoot::setSceneData): add Cerium に SceneGraph の tree を渡す。Cerium はこの tree を辿って 処理を行う (SceneGraphRoot::createFromXMLfile): add xml file を指定して、そこから SceneGraph を生成し、 sg_src に格納する。ユーザはこの SceneGraph を直接は扱えない。 以下に示す createSceneGraph の、読み込み元データとして保存しておく。 (SceneGraphRoot::createSceneGraph): add オリジナルの SceneGraph を clone してユーザに返す。 この SceneGraph をユーザが操作する。 * SceneGraphRoot.h (class SceneGraphRoot): new variables sg_src, sg_exec_list, sg_draw_list, sg_available_list * addfile (SceneGraphRoot.cpp) SceneGraph を管理するクラス、ってところか。 Root ってのは SceneGraph という名前からすると 一番親と思われそうで微妙です。変えるかも。 2009-01-12 Wataru MIYAGUNI * Joystick.cpp: TODO 使用している Joystick が 1. PS3 コントローラ 2. PS2 コントローラにUSB変換をかましたやつ によってボタンの番号配置が違うので そこを自動的に取得して割り振りたい SDL_JoystickName() で名前取れるんだけど 全部共通なのかなー。「PS3って文字列があるか否か」でわけてもいいけど * Joystick.cpp: fix コントローラボタンの番号を PS3 コントローラに合わせました。 - 参考 PS3 Linux SDLでプログラミング -コントローラを使う- http://yun.cup.com/ps3sdl007.html アナログスティックの方はまだです 2009-01-08 Wataru MIYAGUNI * spe/DrawSpanRenew.cpp (DrawSpanRenew::run): fix next_spack を free() していたが、do-while の最初で next_spack = NULL とかやっている。 DrawSpan だと、free するのは free_spack ってやつなので 問題なかったが、なぜここは free(next_spack) とかやってるのか。 というわけで、next_spack,spack 両方用の free_spack1, free_spack2 を生成して、これを free させることに。 これで、ようやくまともに動くようになった。けど微妙です。 遅いですね。 * addFile : DrawSpanRenew.cpp DrawSpan の再起動 ver。 2008-12-22 Wataru MIYAGUNI * fix charles を Fedora 10 に上げて、コンパイラが新しくなったせいか、 以下のような warning が出始めた warning: deprecated conversion from string constant to 'char *' まあよくわからんが、例えば char *str = "hoge"; みたいな所だとこの warning が出る。これを const char *str = "hoge"; にすると消えた。 以後こういう形に統一しろよ的なやつなのかな。 2008-12-19 Wataru MIYAGUNI * viewer.cpp (Viewer::run_draw): fix startx, endx に対して、start_y, end_y って名前は統一されてなくて わかりづらいので、starty, endy に変更 * main.cpp (init): fix bpp (BitsPerPixel) の値がデフォルトで 0 になっていた。 今のレンダリング方式では 32 がデフォルトなので、間違ってた。 今まで気づかなかったのは 1. SDL_SetVideoMode に bpp = 0 で渡される 2. SDL が開発・実行環境に合わせて bpp を設定 3. 今までそれが 32 になってた しかし、ゲーム班の環境では bpp = 16 になってしまったため、 その次の bitmap の allocate の時に screen->pitch*height = 16*width*height となり、 DrawSpan では 32 のつもりで書き込んでいたため領域外への メモリ書き込み->エラー ゲーム班ありがとう 2008-12-16 Wataru MIYAGUNI * SceneGraph.cpp (makeTapestry): add SceneGraph::get_data にあったけど、ごちゃごちゃしてたので 関数として生成 * viewer.cpp (Viewer::run_init, Viewer::run_draw): fix * spe/DrawSpan.cpp (DrawSpan::zRow_init): delete Z Buffering に使う zRow は DrawSpan で毎回生成、初期化するのではなく、 PPE で生成、初期化を行っておき、DrawSpan に add_inData で DMA で渡すという方法に変更。速度的にはほんのちょっとしか(ry * spe/CreateSpan.cpp (CreateSpan::half_triangle): fix getScale に渡す tex_width,tex_height を修正。 比較にそのまま tex_width, tex_height を使うと、 Span が持つテクスチャが全体の一部分だったとしても 比較結果で縮小が行われてしまうため。 - 例 span->length_x = 32; tex_width = 128; tex_x_len = (span->tex_x2 - span->tex_x1) = (0.5 - 0.3) = 0.2; 今までの処理だと、span->length_x < tex_width の結果により 縮小されたテクスチャを使うことになる。 しかし、実際に Span が使う Texture の長さは tex_width*tex_x_len = 24 なので、縮小を行う必要は無い 2008-12-12 Wataru MIYAGUNI * SceneGraph.cpp (SceneGraph::get_data): Todo テクスチャの縦横が 8 の倍数でなければ弾く処理を入れる。 * spe/DrawSpan.cpp (DrawSpan::run): Todo テクスチャの座標計算と、そこから取得できる Tile の DMA を 一スレッドで処理しているのでそれを分けないといけない * spe/CreateSpan.cpp (getTapestry): Add (getScale): Add * memo: 雑記 ようやくこいつに ChangeLog を加えました。 なんか emacs で「C-x 4 a」とかすると、ChangeLog の entry が 加えれられるんだけど、上の階層のを探しにいくので、TaskManager/ のに 加えようとしてたわけさ。まあそういう仕様なんだけど。 で、だからといって不可能ってわけじゃないから書けばよかったんだが。 要するに、これからはちゃんと書いていこうと思います。