Path: chuka.playstation.co.uk!news1.scei.co.jp!usenet From: "koichi nishino" Newsgroups: playstation.ny.program.questions Subject: =?ISO-2022-JP?B?UmU6IFtRXSAbJEJKIz90JE4bKEogVE1EIBskQiVHITwlPyROST08KCRLJEQkJCRGGyhK?= Date: 27 Jun 1997 09:04:48 GMT Organization: PlayStation Net Yarouze Lines: 183 Message-ID: <01bc82d9$9b53b640$23ded5ca@pc-nishino.signallight.co.jp> References: <33B13045.63D57401@inetc.roland.co.jp> NNTP-Posting-Host: 202.213.222.35 Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 8bit X-Newsreader: Microsoft Internet News 4.70.1161 はじめまして、にっしーですぅ。 Shigeru Kobayashi wrote in article <33B13045.63D57401@inetc.roland.co.jp>... > 皆さんはじめまして、小林ともうします。 > > 恐らく非常に初歩的なところでつまづいているのではないかと思いますが思い切 > っ > て質問させていただきます。現在 sample などを参照に 2D / 3D の object を > 表 > 示する簡単な作品を作っています。 > > この中で次のように model データの準備をしているところがあります。中身は > sample から持ってきたものを少し変えただけです。 > > この後に object1 について同じ処理を行っているのですが、せっかくですので > ループ処理で object が増えた場合にも対応させたいと思いましたが、自分で思 > い付く範囲でいろいろとためしてみたのですがどうもうまく行きません。 > > 勿論現在のままでも動きますが、この機会にもう少しきちんとしたものに書き換 > えたいと思っております。お手数ですがよろしくお願いいたします。 > > > u_long MODEL_ADDR[10]; > GsDOBJ2 object0[10]; //できればこれを 1 つにまとめたいです > GsDOBJ2 object1[10]; //現在は仕方なく 2 つにわけています > > (中略) > > //model の初期化部分 > void model_init(void) > { > u_long *dop; > GsDOBJ2 *objp; > int i; > > MODEL_ADDR[0] = (u_long)(0x800c0000); > MODEL_ADDR[1] = (u_long)(0x800c3000); > > //for object0(以下ほぼ同じものを 2 回書いています) > dop = (u_long *)MODEL_ADDR[0]; > dop++; > > GsMapModelingData(dop); > dop++; > Objnum = *dop; > dop++; > for (i = 0; i < Objnum; i++) { > GsLinkObject4((u_long)dop, &object0[i], i); > } > > for (i = 0, objp = object0; i < Objnum; i++) { > objp->coord2 = &Dobject0; > objp->attribute = GsDOFF; > objp++; > } > > object0[0].attribute &= ‾GsDOFF; > object0[0].coord2 = &Dobject0; > > (中略) > > //model の表示部分(この部分も 2 回ほぼ同じものを書いています) > for (i = 0, op = object1; i < 1/*Objnum*/; i++) { > GsGetLs(op->coord2,&tmpls); > GsSetLightMatrix(&tmpls); > GsSetLsMatrix(&tmpls); > GsSortObject4(op, &worldot[actbuf], 14-OT_LENGTH, > (u_long *)getScratchAddr(0)); > op++; > } > > > SHIGERU KOBAYASHI > kotobuki@inetc.roland.co.jp > http://www.rinc.roland.co.jp/‾kotobuki/ > えっと、次のような感じでいいと思うんですがどうでしょうか? とりあえず、手元にコンパイル・実行環境がないので、正しいか どうかわかりませんが・・・(^_^;) #define MAX_MODEL 5 #define MAX_OBJECT 100 u_long *MODEL_ADDR[MAX_MODEL]; GsDOBJ2 object[MAX_OBJECT]; /* 関数のプロトタイプ宣言 */ GsDOBJ2 *model_init(GsDOBJ2 *objp, u_long *model_adr); int model_disp(GsDOBJ2 *objp, GsDOBJ2 *lobjp); /* かなり省略しているので注意 */ void main(void) { GsDOBJ2 *objp; int obj_cnt; /* 表示したオブジェクト総数 */ MODEL_ADDR[0] = (u_long*)0x800c0000; MODEL_ADDR[1] = (u_long*)0x800c3000; /* 初期化 */ objp = &object[0]; objp = model_init(objp,MODEL_ADDR[0]); objp = model_init(objp,MODEL_ADDR[1]); /* VsyncY0L_ */ for(;;) { /* 表示 */ obj_cnt = model_disp(&object[0],objp); } } //model の初期化関数 GsDOBJ2 *model_init(GsDOBJ2 *objp, u_long *model_adr) { u_long *dop; GsDOBJ2 *cobjp; int i; dop = model_adr; dop++; GsMapModelingData(dop); dop++; Objnum = *dop; dop++; for (i = 0, cobjp = objp; i < Objnum; i++) { GsLinkObject4((u_long)dop, cobjp, i); cobjp++; } for (i = 0, cobjp = objp; i < Objnum; i++) { cobjp->coord2 = &Dobject0; cobjp->attribute = GsDOFF; cobjp++; } objp.attribute &= ‾GsDOFF; objp.coord2 = &Dobject0; (中略) return cobjp; } //model の表示関数 int model_disp(GsDOBJ2 *objp, GsDOBJ2 *lobjp) { int i; for (i=0, op = objp; op < lobjp; i++) { GsGetLs(op->coord2,&tmpls); GsSetLightMatrix(&tmpls); GsSetLsMatrix(&tmpls); GsSortObject4(op, &worldot[actbuf], 14-OT_LENGTH, (u_long *)getScratchAddr(0)); op++; } return i; } こんなもんでどうでしょう? かなり省略しているのでこのままでは、コンパイルも実行も できないです。現在、作成されているソースに付け足す感じで 動かしてもらえると大丈夫ではないかと思います。 ----------------------------------------- 西野功一(にっしー) koichi@fa2.so-net.or.jp koichi@marry.co.jp -----------------------------------------