チェンジセット 100
- コミット日時:
- 2007/11/12 00:23:27 (5 年前)
- ファイル:
凡例:
- 変更無し
- 追加
- 削除
- 更新
- コピー
- 移動
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 26 package org.libspark.pv3d { 2 27 import flash.events.*; 3 28 import flash.net.URLLoader; … … 21 46 /** 22 47 * メタセコイアのファイル(.mqo)を読み込むためのクラス。 48 * 49 * var mqo = new Metasequoia(); 50 * mqo.addEventListener(...); 51 * mqo.load("hoge.mqo"); 23 52 */ 24 53 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 } 31 61 32 62 /** 33 63 * @param file 読み込むファイルの URL。絶対パスで指定してください。 34 64 * @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; 44 69 loadMetasequoia(); 45 70 } 46 71 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 47 88 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)); 55 96 } 56 97 57 98 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)); 60 101 dispatchEvent(evt.clone()); 61 102 } … … 113 154 } 114 155 ++l; 115 mMaterialNames = new Array();156 _materialNames = new Array(); 116 157 117 158 // } で閉じているところの行番号 … … 119 160 120 161 // mqo ファイルのあるディレクトリのパス 121 var path:String = mFilename.slice(0, mFilename.lastIndexOf("/") + 1);162 var path:String = _filename.slice(0, _filename.lastIndexOf("/") + 1); 122 163 123 164 for (; l < endLine; ++l) { … … 129 170 var nameEndIndex:int = line.indexOf("\"", nameBeginIndex + 1); 130 171 var name:String = line.substring(nameBeginIndex + 1, nameEndIndex); 131 mMaterialNames.push(name);172 _materialNames.push(name); 132 173 133 174 // テクスチャファイル名 … … 137 178 // テクスチャファイル名を取り囲む " " を取り除く 138 179 tex = tex.substr(1, tex.length - 2); 139 mMaterialsToLoad++;180 _materialsToLoad++; 140 181 // テクスチャの URL を絶対にして読み込む 141 182 material = new BitmapFileMaterial(path + tex); … … 160 201 } 161 202 162 material.doubleSided = t rue;203 material.doubleSided = this.doubleSided; 163 204 material.name = name; 164 205 … … 170 211 171 212 private function materialLoadCompleteHandler(evt:FileLoadEvent):void { 172 mMaterialsToLoad--;173 if( mMaterialsToLoad == 0){213 _materialsToLoad--; 214 if(_materialsToLoad == 0){ 174 215 //COLLADA のソースにあった謎の一行。不具合の元になるのでコメントアウト 175 216 //materials = new MaterialsList(); … … 179 220 180 221 private function materialLoadErrorHandler(evt:FileLoadEvent):void { 181 mMaterialsToLoad--;182 if( mMaterialsToLoad == 0){222 _materialsToLoad--; 223 if(_materialsToLoad == 0){ 183 224 dispatchEvent(new FileLoadEvent(FileLoadEvent.COLLADA_MATERIALS_DONE)); 184 225 } … … 244 285 line = lines[l]; 245 286 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; 249 290 vertices.push(new Vertex3D(x, y, z)); 250 291 } … … 283 324 var c:Vertex3D; 284 325 var d:Vertex3D; 285 var material Name:String;326 var material:MaterialObject3D; 286 327 var uvA:NumberUV; 287 328 var uvB:NumberUV; … … 296 337 297 338 if (mstr != null) { 298 material Name = mMaterialNames[parseInt(mstr)];339 material = materials.getMaterialByName(_materialNames[parseInt(mstr)]); 299 340 } 300 341 … … 303 344 uvB = new NumberUV(parseFloat(uv[2]), 1 - parseFloat(uv[3])); 304 345 uvC = new NumberUV(parseFloat(uv[4]), 1 - parseFloat(uv[5])); 305 face = new Face3D([a, b, c], material Name, [uvA, uvB, uvC]);346 face = new Face3D([a, b, c], material, [uvA, uvB, uvC]); 306 347 } else { 307 face = new Face3D([a, b, c], material Name,348 face = new Face3D([a, b, c], material, 308 349 [new NumberUV(0, 0), new NumberUV(1, 0), new NumberUV(0, 1)]); 309 350 } … … 319 360 vertices.push(b); 320 361 vertices.push(c); 321 face = new Face3D([a, b, c], face.materialName, face.uv);362 face = new Face3D([a, b, c], material, face.uv); 322 363 faces.push(face); 323 364 } … … 329 370 330 371 if (mstr != null) { 331 material Name = mMaterialNames[parseInt(mstr)];372 material = materials.getMaterialByName(_materialNames[parseInt(mstr)]); 332 373 } 333 374 … … 343 384 uvD = new NumberUV(1, 1); 344 385 } 345 face = new Face3D([a, b, c], material Name, [uvA, uvB, uvC]);386 face = new Face3D([a, b, c], material, [uvA, uvB, uvC]); 346 387 faces.push(face); 347 face = new Face3D([c, d, a], material Name, [uvC, uvD, uvA]);388 face = new Face3D([c, d, a], material, [uvC, uvD, uvA]); 348 389 faces.push(face); 349 390 … … 358 399 vertices.push(c); 359 400 vertices.push(d); 360 face = new Face3D([a, b, c], material Name, [uvA, uvB, uvC]);401 face = new Face3D([a, b, c], material, [uvA, uvB, uvC]); 361 402 faces.push(face); 362 face = new Face3D([c, d, a], material Name, [uvC, uvD, uvA]);403 face = new Face3D([c, d, a], material, [uvC, uvD, uvA]); 363 404 faces.push(face); 364 405 }

