Metasequoia改造論(2) 透明マップの読み込み
で、次にMetasequoiaクラスの修正。Metasequoia#parseMaterialChunk内の、Materialチャンク行を解析しているfor文を、MetasequoiaMaterialを使用するように変更。
for (; l <endLine; ++l) {
var material:MaterialObject3D;
line = lines[l];
// マテリアルの名前を取得
var nameBeginIndex:int = line.indexOf("\"");
var nameEndIndex:int = line.indexOf("\"", nameBeginIndex + 1);
var name:String = line.substring(nameBeginIndex + 1, nameEndIndex);
_materialNames.push(name);
// テクスチャファイル名
var tex:String = getParam(line, "tex");
if (tex) {
// テクスチャファイル名を取り囲む " " を取り除く
tex = tex.substr(1, tex.length - 2);
_materialsToLoad++;
if (tex.toLowerCase().search(/\.tga$/) != -1) {
material = loadTGAMaterial(path + tex);
} else {
// テクスチャの URL を絶対にして読み込む
material = new BitmapFileMaterial(path + tex);
material.addEventListener(FileLoadEvent.LOAD_COMPLETE, materialLoadCompleteHandler);
material.addEventListener(FileLoadEvent.LOAD_ERROR, materialLoadErrorHandler);
}
// あまり重さが変わらないのでせっかくだからスムージング
material.smooth = true;
} else {
// 形式 - col(1.000 1.000 0.000 1.000)
var colorstr:String = getParam(line, "col");
if (colorstr != null) {
var color:Array = colorstr.match(/\d+\.\d+/g);
var r:int = parseFloat(color[0]) * 255;
var g:int = parseFloat(color[1]) * 255;
var b:int = parseFloat(color[2]) * 255;
var a:Number = parseFloat(color[3]) * 100;
//trace("rgb = " + r + "," + g + "," + b);
material = new ColorMaterial((r <<16) | (g <<8) | b);
} else {
material = MaterialObject3D.DEFAULT;
}
}
material.doubleSided = this.doubleSided;
material.name = name;
materials.addMaterial(material, name);
}
var material:MaterialObject3D;
line = lines[l];
// マテリアルの名前を取得
var nameBeginIndex:int = line.indexOf("\"");
var nameEndIndex:int = line.indexOf("\"", nameBeginIndex + 1);
var name:String = line.substring(nameBeginIndex + 1, nameEndIndex);
_materialNames.push(name);
// テクスチャファイル名
var tex:String = getParam(line, "tex");
if (tex) {
// テクスチャファイル名を取り囲む " " を取り除く
tex = tex.substr(1, tex.length - 2);
_materialsToLoad++;
if (tex.toLowerCase().search(/\.tga$/) != -1) {
material = loadTGAMaterial(path + tex);
} else {
// テクスチャの URL を絶対にして読み込む
material = new BitmapFileMaterial(path + tex);
material.addEventListener(FileLoadEvent.LOAD_COMPLETE, materialLoadCompleteHandler);
material.addEventListener(FileLoadEvent.LOAD_ERROR, materialLoadErrorHandler);
}
// あまり重さが変わらないのでせっかくだからスムージング
material.smooth = true;
} else {
// 形式 - col(1.000 1.000 0.000 1.000)
var colorstr:String = getParam(line, "col");
if (colorstr != null) {
var color:Array = colorstr.match(/\d+\.\d+/g);
var r:int = parseFloat(color[0]) * 255;
var g:int = parseFloat(color[1]) * 255;
var b:int = parseFloat(color[2]) * 255;
var a:Number = parseFloat(color[3]) * 100;
//trace("rgb = " + r + "," + g + "," + b);
material = new ColorMaterial((r <<16) | (g <<8) | b);
} else {
material = MaterialObject3D.DEFAULT;
}
}
material.doubleSided = this.doubleSided;
material.name = name;
materials.addMaterial(material, name);
}
↓
for (; l <endLine; ++l) {
var material:MetasequoiaMaterial;
line = lines[l];
var material:MetasequoiaMaterial;
line = lines[l];
//マテリアルの作成開始
material = new MetasequoiaMaterial();
//マテリアルロード完了イベントの設定
material.addEventListener (FileLoadEvent.LOAD_COMPLETE , materialLoadCompleteHandler);
//マテリアルのロード開始
material.load(path , line);
material.smooth = true;
material.doubleSided = this.doubleSided;
materials.addMaterial(material, material.name);
_materialNames.push(material.name);
}
これで、透明マップを読み込み可能になった。ただし、TGA画像の読み込み能力を失ってる(Revision100がベースなので)ので、そこは要改良。
カテゴリ:ActionScript |Papervision3D




