太郎日記’79J

「やったろうやないの。」な太郎のblog
技術ネタはタロタローグに任せて、こっちはニュースメインで。
<< August 2018 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 >>
 
RECOMMEND
MySQLによるタフなサイトの作り方
MySQLによるタフなサイトの作り方 (JUGEMレビュー »)
佐藤 真人,桑野 章弘,岡田 達典,大黒 圭祐
MySQLだけでなく、DBサーバやアプリの設計など、あらゆる手段を使ってタフなサイトを作る本である
最新記事
あわせて読みたい
あわせて読みたい
なかのひと
ClusterMaps
CM by JUGEM
スポンサーサイト

一定期間更新がないため広告を表示しています

- | 個別記事 | - | -
LOAD TO NEGI (4):MetasequoiaMaterialクラス完了。アルファマップが適用可能に。

色々と改善点はあるだろうが、ずっと頑張っていた、
「透明マップも反映出来るMetasequoiaクラス」を実現してみた。
Metasequoiaクラスの方を改造するのが大変だったので、
思い切ってMaterialクラスを新規に作成。
これを改造していけば、普通に通常マップと透明マップを読めるようなMaterialになるんじゃない?
例えばコンストラクタの引数をMaterialチャンクの1行分だけでなく、
ちゃんと色情報とパスを受け取る形にするとか。
あと、今回のMetasequoiaMaterialクラスは設計考え無しもいいところなので、
多分もっと綺麗なソースになるはず。

しかし、そろそろネギを振らないと。
ネギブームが去ってしまう。

11月28日追記:
一応ネギは振れるようになった。
今後は、MetasequoiaクラスとMetasequoiaMaterialクラスを改良するつもり。
その間に、誰かがMD2とかのアニメーションがらみを整備してくれることを祈る。

モデルのテクスチャは変更せず。
ただし、アルファマップはpngに変えた。
tgaをFlashが読めるかどうか、検証するのも面倒だったので。

で、ソースファイル。
まず、Metasequoia用のMaterialクラス、MetasequoiaMaterialを作成。
ソースの一部はMetasequoiaクラスから拝借。

/**
* @author 太郎日記’79J
* @version 0.1
*/

package cc.jugem.tarotaro.pv3d {
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.BitmapDataChannel;
    import flash.display.Graphics;
    import flash.display.Loader;
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    import flash.geom.Point;
    import flash.net.URLRequest;
    import org.papervision3d.core.geom.Face3D;
    import org.papervision3d.core.geom.Vertex2D;
    import org.papervision3d.materials.BitmapMaterial;
    import org.papervision3d.objects.DisplayObject3D;
    
    public class MetasequoiaMaterial extends BitmapMaterial{
        /**
        *  模様マップの読み込み完了?
        */
        private var texLoaded:Boolean = false;
        /**
        * アルファマップの読み込み完了?
        */
        private var aplaneLoaded:Boolean = false;
        /**
        * バンプマップの読み込み完了?
        */
        private var bumpLoaded:Boolean = false;

        /**
        * 模様マップ
        */
        private var _tex:BitmapData;
        /**
        * アルファマップ 
        */
        private var _aplane:BitmapData;
        /**
        * バンプマップ
        */
        private var _bump:BitmapData;
        
        /**
        * メタセコイア用のマテリアルを作成
        * @param    path メタセコイアのモデルデータのパス
        * @param    line メタセコイアのMaterial チャンク1行分
        */
        public function MetasequoiaMaterial(path:String , line:String):void {
            
            //形式 - 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]);
                trace("rgb = " + r + "," + g + "," + b);
                this.fillColor = ((r << 16) | (g << 8) | b);
                this.fillAlpha = a;
            }
            
            // マテリアルの名前を取得
            var nameBeginIndex:int = line.indexOf("¥"");
            var nameEndIndex:int = line.indexOf("¥"", nameBeginIndex + 1);
            this.name = line.substring(nameBeginIndex + 1, nameEndIndex);

            //テクスチャ画像のパスを取得
            var tex:String = MetasequoiaMaterial.getParam(line , "tex");
            var aplane:String = MetasequoiaMaterial.getParam(line , "aplane");
            var bump:String = MetasequoiaMaterial.getParam(line , "bump");
            
            //テクスチャの初期化
            this._tex = null;
            this._aplane = null;
            this._bump = null;

            //各マップのパスがnullでない場合、読み込みを開始する
            if (tex != null) {
                tex = tex.substr(1 , tex.length - 2);
                var texLoader:Loader = new Loader();
                texLoader.contentLoaderInfo.addEventListener(Event.COMPLETE , texLoadComplete);
                texLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR , loadError);
                texLoader.load(new URLRequest(path + tex));
            } else {
                this.texLoaded = true;
            }
            
            if (aplane != null) {
                aplane = aplane.substr(1 , aplane.length - 2);
                var aplaneLoader:Loader = new Loader();
                aplaneLoader.contentLoaderInfo.addEventListener(Event.COMPLETE , aplaneLoadComplete);
                aplaneLoader.load(new URLRequest(path + aplane));
            } else {
                this.aplaneLoaded = true;
            }
            if (bump != null) {
                bump = bump.substr(1 , bump.length - 2);
                var bumpLoader:Loader = new Loader();
                bumpLoader.contentLoaderInfo.addEventListener(Event.COMPLETE , bumpLoadComplete);
                bumpLoader.load(new URLRequest(path + bump));
            } else {
                this.bumpLoaded = true;
            }
        }
        
        private function loadError(evt:Event):void {
            fillColor = 0xffffff;
        }
        /**
        * 模様マップの読み込み完了時
        * @param    evt
        */
        private function texLoadComplete(evt:Event):void {
            var l:Loader = Loader (evt.target.loader);
            var b:Bitmap = Bitmap(l.content);
            this._tex = b.bitmapData;
            this.texLoaded = true;
            
            if (this.texLoaded && this.aplaneLoaded && this.bumpLoaded) {
                materialLoadComplete();
            }
        }
        
        /**
        * アルファマップの読み込み完了時
        * @param    evt
        */
        private function aplaneLoadComplete(evt:Event):void {
            var l:Loader = Loader (evt.target.loader);
            var b:Bitmap = Bitmap(l.content);
            this._aplane = b.bitmapData;
            this.aplaneLoaded = true;
            
            if (this.texLoaded && this.aplaneLoaded && this.bumpLoaded) {
                materialLoadComplete();
            }
        }
        
        /**
        * バンプマップの読み込み完了時
        * @param    evt
        */
        private function bumpLoadComplete(evt:Event):void {
            var l:Loader = Loader (evt.target.loader);
            var b:Bitmap = Bitmap(l.content);
            this._bump = b.bitmapData;
            this.bumpLoaded = true;
            
            if (this.texLoaded && this.aplaneLoaded && this.bumpLoaded) {
                materialLoadComplete();
            }
        }
        
        /**
        * 全マップの読み込み完了時
        * @return
        */
        private function materialLoadComplete():void {
            //透明マップと模様マップから透明部分ありの模様マップを作成
            var bmpData:BitmapData;
            if (this._tex != null) {
                bmpData = new BitmapData(this._tex.width , this._tex.height);
                bmpData.draw(this._tex);
            } else {
                if (this._aplane != null) {
                    bmpData = new BitmapData(this._aplane.width , this._aplane.height);
                    bmpData = this._aplane.clone();
                } else {
                    return;
                }
            }
            if (this._aplane != null) {
                bmpData.copyChannel(this._aplane , 
                                               this._aplane.rect , 
                                               new Point(0,0) , 
                                               BitmapDataChannel.RED , 
                                               BitmapDataChannel.ALPHA);
            }
            this.texture = bmpData;
            
        }
        
        /**
         *  drawFace3D
         */
        override public function drawFace3D(instance:DisplayObject3D, face3D:Face3D, graphics:Graphics, v0:Vertex2D, v1:Vertex2D, v2:Vertex2D):int
        {
        
            if ( this.texture == null ) {
                var x0:Number = v0.x;
                var y0:Number = v0.y;
                var x1:Number = v1.x;
                var y1:Number = v1.y;
                var x2:Number = v2.x;
                var y2:Number = v2.y;

                graphics.beginFill( fillColor, fillAlpha );
                graphics.moveTo( x0, y0 );
                graphics.lineTo( x1, y1 );
                graphics.lineTo( x2, y2 );
                graphics.lineTo( x0, y0 );
                graphics.endFill();
                
                return 1;
            } else {
                return super.drawFace3D(instance , face3D , graphics , v0 , v1 , v2);
            }
        }
        /**
        * line 内で paramName(...) という形式で指定されているパラメータを返します。
        */
        private static function getParam(line:String, paramName:String):String {
            var prefix:String = paramName + "(";
            var prefixLen:int = prefix.length;
            
            var begin:int = line.indexOf(prefix, 0);
            if (begin == -1) {
                return null;
            }
            var end:int = line.indexOf(")", begin + prefixLen);
            if (end == -1){
                return null;
            }
            return line.substring(begin + prefixLen, end);
        }
        
    }
    
}
次に、Metasequoiaクラスを改造。
177〜201行目を削除し、
                material = new MetasequoiaMaterial(path , line);
このように、MetasequoiaMaterialクラスを利用する形に変える。
あと、importにMetasequoiaMaterialも追加しとく。

スポンサーサイト
- | 個別記事 | - | -
ドミノ・ピザでも食べながら、コメントをどうぞ。
from: rch850   2007/11/15 2:47 AM
ついにアルファ対応ですね。せっかくなんでlibsparkのほうにマージしてみませんか?
Metasequoiaのほうはpv3d 1.7対応と、オブジェクト別ロード機能を実装しておきましたので見てみてください。
from: 太郎(管理者)   2007/11/20 2:51 AM
>rch850 さん
マージするのもよさそうですね。
ちょっと手順を見てみます。でもすぐ挫折するかもorz
Metasequoiaクラスのほうは見させてもらいましたよ!
早速反転だけ直して使ってます。
コメントする









 
トラックバック
この記事のトラックバックURL(記事と無関係なトラックバックは削除される可能性があります)
※記事が投稿されてから30分の間、トラックバックを行うことが出来ません。
http://tarotaro.jugem.cc/trackback/1614
 

Copyright (C) 2004 paperboy&co. All Rights Reserved.

Powered by "JUGEM"