チェンジセット 100

差分発生行の前後
無視リスト:
コミット日時:
2007/11/12 00:23:27 (5 年前)
コミッタ:
rch850
ログメッセージ:

・Papervision3D 1.7に対応させました
 ・1.5用のクラスは別名で保持しておきます
・コンストラクタで読み込まず、別途loadメソッドを用意しました
・モデル内のパーツ別に読み込むようにしました

ファイル:

凡例:

変更無し
追加
削除
更新
コピー
移動
  • rch850/as3/src/org/libspark/pv3d/Metasequoia.as

    r48 r100  
    1 package org.libspark.pv3d { 
     1/* 
     2 * Copyright 2006-2007 (c) rch850 
     3 * 
     4 * Permission is hereby granted, free of charge, to any person 
     5 * obtaining a copy of this software and associated documentation 
     6 * files (the "Software"), to deal in the Software without 
     7 * restriction, including without limitation the rights to use, 
     8 * copy, modify, merge, publish, distribute, sublicense, and/or sell 
     9 * copies of the Software, and to permit persons to whom the 
     10 * Software is furnished to do so, subject to the following 
     11 * conditions: 
     12 * 
     13 * The above copyright notice and this permission notice shall be 
     14 * included in all copies or substantial portions of the Software. 
     15 * 
     16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
     17 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 
     18 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
     19 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 
     20 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
     21 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
     22 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 
     23 * OTHER DEALINGS IN THE SOFTWARE. 
     24 */ 
     25 
     26package org.libspark.pv3d { 
    227        import flash.events.*; 
    328        import flash.net.URLLoader; 
     
    2146        /** 
    2247        * メタセコイアのファイル(.mqo)を読み込むためのクラス。 
     48        *  
     49        * var mqo = new Metasequoia(); 
     50        * mqo.addEventListener(...); 
     51        * mqo.load("hoge.mqo"); 
    2352        */ 
    2453        public class Metasequoia extends Mesh3D { 
    25                 private var mLoader:URLLoader; 
    26                 private var mFilename:String; 
    27                 private var mMaterialsToLoad:int =0; 
    28                 private var mMaterialNames:Array; 
    29                 private var mScale:Number = 1; 
    30                 private var mCharset:String = "shift_jis"; 
     54                /** 
     55                * コンストラクタ 
     56                */ 
     57                function Metasequoia() { 
     58                        this.materials = new MaterialsList(); 
     59                        super(null, new Array(), new Array(), null); 
     60                } 
    3161                 
    3262                /** 
    3363                * @param file 読み込むファイルの URL。絶対パスで指定してください。 
    3464                * @param scale 読み込むときの拡大率。1 が原寸大です。 
    35                 * @param charset ファイルの文字コード。よほどのことが無い限り shift_jis だと思います。 
    36                 */ 
    37                 function Metasequoia(file:String, scale:Number = 1, charset:String = "shift_jis") { 
    38                         this.materials = new MaterialsList(); 
    39                         this.mCharset = charset; 
    40                         super(null, new Array(), new Array(), null); 
    41                          
    42                         mFilename = file; 
    43                         mScale = scale; 
     65                */ 
     66                public function load(file:String, scale:Number = 1):void { 
     67                        _filename = file; 
     68                        _scale = scale; 
    4469                        loadMetasequoia(); 
    4570                } 
    4671                 
     72                /** 
     73                 * ファイルの文字コード。よほどのことが無い限り shift_jis だと思います。 
     74                 */ 
     75                public var charset:String = "shift_jis"; 
     76                 
     77                /** 
     78                 * 面の両側にマテリアルを貼るかどうかを指定します。 
     79                 */ 
     80                public var doubleSided:Boolean = false; 
     81                 
     82                private var _loader:URLLoader; 
     83                private var _filename:String; 
     84                private var _materialsToLoad:int =0; 
     85                private var _materialNames:Array; 
     86                private var _scale:Number = 1; 
     87                 
    4788                private function loadMetasequoia():void { 
    48                         mLoader = new URLLoader(); 
    49                         mLoader.dataFormat = URLLoaderDataFormat.BINARY; 
    50                         mLoader.addEventListener(Event.COMPLETE, completeHandler); 
    51                         mLoader.addEventListener(IOErrorEvent.IO_ERROR, defaultHandler); 
    52                         mLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, defaultHandler); 
    53                         mLoader.addEventListener(ProgressEvent.PROGRESS, defaultHandler); 
    54                         mLoader.load(new URLRequest(mFilename)); 
     89                        _loader = new URLLoader(); 
     90                        _loader.dataFormat = URLLoaderDataFormat.BINARY; 
     91                        _loader.addEventListener(Event.COMPLETE, completeHandler); 
     92                        _loader.addEventListener(IOErrorEvent.IO_ERROR, defaultHandler); 
     93                        _loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, defaultHandler); 
     94                        _loader.addEventListener(ProgressEvent.PROGRESS, defaultHandler); 
     95                        _loader.load(new URLRequest(_filename)); 
    5596                } 
    5697                 
    5798                private function completeHandler(evt:Event):void { 
    58                         var byteArray:ByteArray = ByteArray(mLoader.data); 
    59                         buildMetasequoia(byteArray.readMultiByte(byteArray.length, mCharset)); 
     99                        var byteArray:ByteArray = ByteArray(_loader.data); 
     100                        buildMetasequoia(byteArray.readMultiByte(byteArray.length, charset)); 
    60101                        dispatchEvent(evt.clone()); 
    61102                } 
     
    113154                        } 
    114155                        ++l; 
    115                         mMaterialNames = new Array(); 
     156                        _materialNames = new Array(); 
    116157                         
    117158                        // } で閉じているところの行番号 
     
    119160                         
    120161                        // mqo ファイルのあるディレクトリのパス 
    121                         var path:String = mFilename.slice(0, mFilename.lastIndexOf("/") + 1); 
     162                        var path:String = _filename.slice(0, _filename.lastIndexOf("/") + 1); 
    122163                         
    123164                        for (; l < endLine; ++l) { 
     
    129170                                var nameEndIndex:int = line.indexOf("\"", nameBeginIndex + 1); 
    130171                                var name:String = line.substring(nameBeginIndex + 1, nameEndIndex); 
    131                                 mMaterialNames.push(name); 
     172                                _materialNames.push(name); 
    132173                                 
    133174                                // テクスチャファイル名 
     
    137178                                        // テクスチャファイル名を取り囲む " " を取り除く 
    138179                                        tex = tex.substr(1, tex.length - 2); 
    139                                         mMaterialsToLoad++; 
     180                                        _materialsToLoad++; 
    140181                                        // テクスチャの URL を絶対にして読み込む 
    141182                                        material = new BitmapFileMaterial(path + tex); 
     
    160201                                } 
    161202                                 
    162                                 material.doubleSided = true
     203                                material.doubleSided = this.doubleSided
    163204                                material.name = name; 
    164205                                 
     
    170211                 
    171212                private function materialLoadCompleteHandler(evt:FileLoadEvent):void { 
    172                         mMaterialsToLoad--; 
    173                         if(mMaterialsToLoad == 0){ 
     213                        _materialsToLoad--; 
     214                        if(_materialsToLoad == 0){ 
    174215                                //COLLADA のソースにあった謎の一行。不具合の元になるのでコメントアウト 
    175216                                //materials = new MaterialsList(); 
     
    179220                 
    180221                private function materialLoadErrorHandler(evt:FileLoadEvent):void { 
    181                         mMaterialsToLoad--; 
    182                         if(mMaterialsToLoad == 0){ 
     222                        _materialsToLoad--; 
     223                        if(_materialsToLoad == 0){ 
    183224                                dispatchEvent(new FileLoadEvent(FileLoadEvent.COLLADA_MATERIALS_DONE)); 
    184225                        } 
     
    244285                                line = lines[l]; 
    245286                                var coords:Array = line.match(/(-?\d+\.\d+)/g); 
    246                                 var x:Number = parseFloat(coords[0]) * mScale; 
    247                                 var y:Number = parseFloat(coords[1]) * mScale; 
    248                                 var z:Number = parseFloat(coords[2]) * mScale; 
     287                                var x:Number = parseFloat(coords[0]) * _scale; 
     288                                var y:Number = parseFloat(coords[1]) * _scale; 
     289                                var z:Number = parseFloat(coords[2]) * _scale; 
    249290                                vertices.push(new Vertex3D(x, y, z)); 
    250291                        } 
     
    283324                        var c:Vertex3D; 
    284325                        var d:Vertex3D; 
    285                         var materialName:String
     326                        var material:MaterialObject3D
    286327                        var uvA:NumberUV; 
    287328                        var uvB:NumberUV; 
     
    296337                                 
    297338                                if (mstr != null) { 
    298                                         materialName = mMaterialNames[parseInt(mstr)]
     339                                        material = materials.getMaterialByName(_materialNames[parseInt(mstr)])
    299340                                } 
    300341                                 
     
    303344                                        uvB = new NumberUV(parseFloat(uv[2]), 1 - parseFloat(uv[3])); 
    304345                                        uvC = new NumberUV(parseFloat(uv[4]), 1 - parseFloat(uv[5])); 
    305                                         face = new Face3D([a, b, c], materialName, [uvA, uvB, uvC]); 
     346                                        face = new Face3D([a, b, c], material, [uvA, uvB, uvC]); 
    306347                                } else { 
    307                                         face = new Face3D([a, b, c], materialName
     348                                        face = new Face3D([a, b, c], material
    308349                                                [new NumberUV(0, 0), new NumberUV(1, 0), new NumberUV(0, 1)]); 
    309350                                } 
     
    319360                                        vertices.push(b); 
    320361                                        vertices.push(c); 
    321                                         face = new Face3D([a, b, c], face.materialName, face.uv); 
     362                                        face = new Face3D([a, b, c], material, face.uv); 
    322363                                        faces.push(face); 
    323364                                } 
     
    329370                                 
    330371                                if (mstr != null) { 
    331                                         materialName = mMaterialNames[parseInt(mstr)]
     372                                        material = materials.getMaterialByName(_materialNames[parseInt(mstr)])
    332373                                } 
    333374                                 
     
    343384                                        uvD = new NumberUV(1, 1); 
    344385                                } 
    345                                 face = new Face3D([a, b, c], materialName, [uvA, uvB, uvC]); 
     386                                face = new Face3D([a, b, c], material, [uvA, uvB, uvC]); 
    346387                                faces.push(face); 
    347                                 face = new Face3D([c, d, a], materialName, [uvC, uvD, uvA]); 
     388                                face = new Face3D([c, d, a], material, [uvC, uvD, uvA]); 
    348389                                faces.push(face); 
    349390                                 
     
    358399                                        vertices.push(c); 
    359400                                        vertices.push(d); 
    360                                         face = new Face3D([a, b, c], materialName, [uvA, uvB, uvC]); 
     401                                        face = new Face3D([a, b, c], material, [uvA, uvB, uvC]); 
    361402                                        faces.push(face); 
    362                                         face = new Face3D([c, d, a], materialName, [uvC, uvD, uvA]); 
     403                                        face = new Face3D([c, d, a], material, [uvC, uvD, uvA]); 
    363404                                        faces.push(face); 
    364405                                }