Metasequoiaクラス改造論(1) 階層構造の再現
階層構造
さて、Objectチャンクごとに別インスタンスが生成されるようになったので、これを階層構造に持っていく。まず、階層構造を表すdepthチャンクを保持する必要があるので、メンバとして定義する。
/**
* モデルの階層
*/
private var _depth:Number;
* モデルの階層
*/
private var _depth:Number;
で、Metasequoia#parseObjectChunkでObjectチャンク内の各チャンクを読み込んだ後、取り出してコピーする。
var properties:Dictionary = new Dictionary();
for (; l <vline; ++l) {
line = lines[l];
var props:Array = RegExp(/^\s*([\w]+)\s+(.*)$/).exec(line);
properties[props[1]] = props[2];
}
for (; l <vline; ++l) {
line = lines[l];
var props:Array = RegExp(/^\s*([\w]+)\s+(.*)$/).exec(line);
properties[props[1]] = props[2];
}
↓
var properties:Dictionary = new Dictionary();
for (; l <vline; ++l) {
line = lines[l];
var props:Array = RegExp(/^\s*([\w]+)\s+(.*)$/).exec(line);
properties[props[1]] = props[2];
}
obj._depth = parseInt(properties["depth"] , 10);
for (; l <vline; ++l) {
line = lines[l];
var props:Array = RegExp(/^\s*([\w]+)\s+(.*)$/).exec(line);
properties[props[1]] = props[2];
}
obj._depth = parseInt(properties["depth"] , 10);
depthはルート直下を0として深くなるごとに1ずつ増えていくので、一覧にあるパース済みのObjectと自分のdepthの関連は以下のようになるはず。
- depthが自分より1小さい ⇒ 自分の親Objectである
- depthが自分と同じ ⇒ 自分の兄弟Objectである
- depthが自分より大きい ⇒ 自分の兄弟Objectの子である
また、rootとなる、ファイル読み込みを行うMetasequoiaインスタンスのdepthは、ルート直下(0)よりも1少ない-1として初期化することにする。
this._depth = -1;
これで準備完了。親オブジェクトを探す処理を実装する。位置は、Metasequoia#parseObjectChunk内の、プロパティ読み込み処理の後くらいがいいかと。
//親オブジェクトを探す
for(var i:Number = this._objectlist.length -1 ; i>= 0 ; i--) {
var parentCandidate:Metasequoia = this._objectlist[i] as Metasequoia;
if (parentCandidate) {
//_depthが自分より1少ない→親オブジェクト
if (parentCandidate._depth == (obj._depth - 1)) {
//親に自分をaddChildさせる
parentCandidate.addChild(obj);
break;
}
}
}
for(var i:Number = this._objectlist.length -1 ; i>= 0 ; i--) {
var parentCandidate:Metasequoia = this._objectlist[i] as Metasequoia;
if (parentCandidate) {
//_depthが自分より1少ない→親オブジェクト
if (parentCandidate._depth == (obj._depth - 1)) {
//親に自分をaddChildさせる
parentCandidate.addChild(obj);
break;
}
}
}
これでMetasequoiaクラスに、mqoファイルと同様の階層構造を与えられる。ただしMetasequoiaの無料版だとまだ階層機能がないので、もしかしたらマイナーな機能なのかもしれない。
カテゴリ:ActionScript |Papervision3D




